Btrfs Snapper Гайд
Виталий Тимцурак 于 3 月之前 修改了此页面

ПРОДВИНУТАЯ НАСТРОЙКА ARCH LINUX: BTRFS, SNAPPER И GRUB

Этот гайд — дополнение к официальному руководству по установке Arch Linux. Мы пропустим совсем базовые вещи, но подробно остановимся на создании отказоустойчивой системы с использованием файловой системы Btrfs, автоматических снимков Snapper и их интеграции в меню загрузки GRUB.

ЧАСТЬ 1: ФИЛОСОФИЯ И СТРУКТУРА

BTRFS: "ВСЁ В ОДНОМ"

В отличие от ext4, Btrfs оперирует подтомами (subvolumes). Вместо жесткого разбиения диска на разделы для /, /home и т.д., мы создаем один раздел, а внутри него — логические подтома.

  • Гибкость: / и /home делят общее свободное место.
  • Снимки (Snapshots): Мгновенное сохранение состояния системы.

/EFI ИЛИ /BOOT?

Мы используем подход с монтированием ESP (EFI System Partition) в /efi.

  • Суть: Каталог /boot остается обычной папкой на корневом подтоме Btrfs.
  • Зачем: Когда Snapper делает снимок корня, он захватывает и /boot. Это значит, что ядро (vmlinuz) и initramfs тоже попадают в снимок.
  • Результат: Если обновление ядра сломает систему, откат снимка вернет и файлы, и рабочее ядро. Это гарантирует полную отказоустойчивость.

СХЕМА ПОДТОМОВ

Мы будем использовать "плоскую" разметку (flat layout), чтобы упростить откаты:

  • @ — Корень системы (/). Снимки включены.
  • @home — Данные пользователя (/home). Снимки отключены (чтобы не потерять личные файлы при откате системы).
  • @snapshots — Хранилище снимков (/.snapshots).
  • @logs, @cache — Журналы и кэш (/var/log, /var/cache). Исключены из снимков, чтобы не засорять их и не терять логи ошибок при откате.
  • @swap — Для файла подкачки.
  • @srv — Для данных серверов (опционально).

ЧАСТЬ 2: ПОДГОТОВКА (LIVE ENVIRONMENT)

1. КЛАВИАТУРА И ШРИФТ

Настройка кириллицы в консоли установщика (опционально, но удобно):

loadkeys ru
setfont cyr-sun16
# Для экранов HiDPI (4k):
# setfont ter-c32b

Переключение раскладки: Ctrl+Shift.

2. ПРОВЕРКА РЕЖИМА ЗАГРУЗКИ

Убедитесь, что загружены в UEFI (вывод должен быть 64):

cat /sys/firmware/efi/fw_platform_size

3. ИНТЕРНЕТ И ВРЕМЯ

# Проверка интерфейсов
ip a

# Wi-Fi (если нужно)
iwctl

# Проверка соединения
ping archlinux.org

# Синхронизация времени (важно для HTTPS)
timedatectl set-ntp true
timedatectl status

4. РАЗМЕТКА ДИСКОВ (МИНИ-ГАЙД ПО FDISK)

Определим диск (например, /dev/nvme0n1 или /dev/sda):

lsblk

Допустим, наш диск — /dev/sda. Запускаем утилиту:

fdisk /dev/sda

Последовательность команд внутри fdisk для чистой установки:

  1. g — Создать новую таблицу разделов GPT.
  2. Раздел 1 (EFI):
    • n (новый раздел) -> Enter (номер 1) -> Enter (первый сектор) -> +512M (размер).
    • t (тип) -> 1 (EFI System).
  3. Раздел 2 (Система):
    • n -> Enter (номер 2) -> Enter (первый сектор) -> Enter (всё оставшееся место).
    • t -> 23 (Linux Filesystem).
  4. w — Записать изменения и выйти.

В итоге имеем:

  • /dev/sda1 — EFI (512 МБ)
  • /dev/sda2 — Linux Root (всё остальное)

ЧАСТЬ 3: НАСТРОЙКА BTRFS

ШАГ 1. ФОРМАТИРОВАНИЕ

# EFI раздел в FAT32
mkfs.fat -F 32 /dev/sda1

# Корневой раздел в Btrfs (Force для перезаписи)
mkfs.btrfs -f /dev/sda2

ШАГ 2. СОЗДАНИЕ ПОДТОМОВ

Сначала монтируем корень во временную папку:

mount -o compress=zstd:1 /dev/sda2 /mnt

# Создаем структуру
btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
btrfs subvolume create /mnt/@srv
btrfs subvolume create /mnt/@logs
btrfs subvolume create /mnt/@cache
btrfs subvolume create /mnt/@snapshots
btrfs subvolume create /mnt/@swap

# Размонтируем для чистовой сборки
umount /mnt

ШАГ 3. МОНТИРОВАНИЕ ДЛЯ УСТАНОВКИ

Монтируем подтома с оптимальными опциями (noatime, compress=zstd:3).

# 1. Монтируем корень (@)
mount -o defaults,noatime,compress=zstd:3,subvol=@ /dev/sda2 /mnt

# 2. Создаем точки монтирования
mkdir -p /mnt/{home,srv,var/log,var/cache,.snapshots,efi,swap}

# 3. Монтируем подтома данных
mount -o defaults,noatime,compress=zstd:3,subvol=@home /dev/sda2 /mnt/home
mount -o defaults,noatime,compress=zstd:3,subvol=@srv /dev/sda2 /mnt/srv
mount -o defaults,noatime,compress=zstd:3,subvol=@snapshots /dev/sda2 /mnt/.snapshots

# 4. Монтируем тома, где сжатие не нужно (логи, кэш, swap)
mount -o defaults,noatime,subvol=@logs /dev/sda2 /mnt/var/log
mount -o defaults,noatime,subvol=@cache /dev/sda2 /mnt/var/cache
mount -o defaults,noatime,subvol=@swap /dev/sda2 /mnt/swap

# 5. Монтируем EFI раздел
mount /dev/sda1 /mnt/efi

ШАГ 4. СОЗДАНИЕ SWAP-ФАЙЛА

В Btrfs для этого есть нативная команда (избегайте dd):

btrfs filesystem mkswapfile --size 4g --uuid clear /mnt/swap/swapfile
swapon /mnt/swap/swapfile

ЧАСТЬ 4: УСТАНОВКА СИСТЕМЫ

ШАГ 5. PACSTRAP

Устанавливаем базовую систему и необходимые инструменты для Btrfs и сети. > Не забудьте добавить intel-ucode или amd-ucode в зависимости от процессора.

pacstrap -K /mnt base linux linux-firmware btrfs-progs grub efibootmgr snapper grub-btrfs snap-pac inotify-tools vim networkmanager iwd openssh

ШАГ 6. FSTAB

Генерируем файл монтирования.

genfstab -U /mnt >> /mnt/etc/fstab

# Добавляем swap (genfstab может его пропустить)
echo "/swap/swapfile none swap defaults 0 0" >> /mnt/etc/fstab

Важно: Проверьте файл /mnt/etc/fstab. Убедитесь, что у всех Btrfs разделов (кроме EFI и swap) прописаны subvol=@… и compress=zstd:3 (там, где это нужно).

ЧАСТЬ 5: НАСТРОЙКА ВНУТРИ CHROOT

Входим в новую систему:

arch-chroot /mnt

(Здесь вы выполняете стандартные настройки: Timezone, Locale, Hostname, Passwd, User. Мы их пропускаем согласно задаче).

ШАГ 7. НАСТРОЙКА GRUB И GRUB-BTRFS

Настраиваем загрузчик так, чтобы он видел снимки.

  1. Установка GRUB:

    grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=Arch
    
  2. Настройка конфига: Откройте /etc/default/grub и раскомментируйте/добавьте строку, чтобы включить загрузку со снимков:

    GRUB_BTRFS_SNAPSHOT_BOOT=true
    

Совет: Если у вас шифрование (LUKS), здесь также нужно добавить параметры ядра в GRUB_CMDLINE_LINUX.

  1. Генерация меню:

    grub-mkconfig -o /boot/grub/grub.cfg
    

Вывод должен содержать строку: Found linux image… и Found initrd image…

ШАГ 8. ВКЛЮЧЕНИЕ СЛУЖБ АВТОМАТИЗАЦИИ

Включаем сервисы, которые будут создавать снимки при установке пакетов и обновлять GRUB.

systemctl enable NetworkManager
systemctl enable sshd
# Автоматическое обновление меню GRUB при появлении новых снимков
systemctl enable grub-btrfsd.service
# Таймеры очистки старых снимков
systemctl enable snapper-timeline.timer
systemctl enable snapper-cleanup.timer

Выходим из chroot и перезагружаемся:

exit
umount -R /mnt
reboot

ЧАСТЬ 6: НАСТРОЙКА SNAPPER (ПОСЛЕ ПЕРЕЗАГРУЗКИ)

Почему после перезагрузки? Команда создания конфига Snapper конфликтует с уже существующей и смонтированной папкой .snapshots. Проще всего решить это в рабочей системе.

Войдите под root.

  1. Отмонтируем .snapshots:

    umount /.snapshots
    
  2. Удаляем папку (она должна быть пустой):

    rm -rf /.snapshots
    
  3. Создаем конфигурацию Snapper для корня:

    snapper -c root create-config /
    

Эта команда создает новую папку /.snapshots и подтом внутри неё, но нам нужно вернуть наш подтом @snapshots.

  1. Удаляем подтом, созданный Snapper-ом, и возвращаем наш:

    # Удаляем подтом, созданный автоматически
    btrfs subvolume delete /.snapshots
    
    # Создаем папку заново
    mkdir /.snapshots
    
    # Монтируем наш "правильный" подтом (он подтянется из fstab)
    mount -a
    
    # Исправляем права доступа (важно!)
    chmod 750 /.snapshots
    
  2. Настройка политики хранения: По умолчанию Snapper делает снимки каждый час, что может быстро забить диск. Откройте конфиг:

    vim /etc/snapper/configs/root
    

Рекомендуемые изменения:

  • ALLOW_GROUPS="wheel" — разрешить пользователям группы wheel управлять снимками.
  • TIMELINE_CREATE="no" — отключить почасовые снимки (если хотите делать их только при обновлении pacman).
  • Либо настройте лимиты TIMELINE_LIMIT_…, уменьшив их (например, хранить только 5 последних часовых снимков).

ЗАКЛЮЧЕНИЕ

Теперь ваша система полностью настроена:

  1. Pacman автоматически создает снимки до и после установки любого пакета (благодаря snap-pac).
  2. Grub-btrfs автоматически добавляет эти снимки в меню загрузки.
  3. Если система не грузится, вы выбираете в GRUB пункт "Arch Linux Snapshots", загружаете вчерашнее состояние и делаете snapper rollback.