Делаем машину времени с Btrfs

Posted on Пн 27 января 2025 in misc

Источник

Btrfs -- это файловая система с легковесными снапшотами, которая позволяет создать самую настоящую машину времени, делая снимки состояния файловой системы (снапшоты) и монтировать их на лету. Этой файловой системе скоро стукнет 16, а значит уже можно ее попробовать.

ПРЕДУПРЕЖДЕНИЕ: лучше не использовать Btrfs на HDD особенно с SMR. Из-за низкой скорости произвольного доступа на устаревших типах носителей Btrfs может очень сильно разочаровать (как и ZFS).

Btrfs -- файловая система, по возможностям сравнимая с ZFS, но в отличии от последней включена в ядро Linux, что несомненно является преимуществом. Потенциальный же убийца Btrfs -- Cachefs -- пока в зачаточной стадии разработки и с новыми версиями лишь показывает регресс производительности, что останавливает автора сиих строк от знакомства с последней. Btrfs используют такие компании как Facebook и Google, так что с доводами про миллиард мух -- сразу мимо.

Btrfs является файловой системой по умолчанию в дистрибутивах Fedora, OpenSUSE, Garuda Linux и тд. Сия статья не будет обзорной на возможности ФС, я расскажу лишь как правильно ее готовить. И начнем мы с переезда на нее.

Btrfs требует наличия пакета btrfs-progs. В арче и, упаси господи, убунте он называется одинаково. Ставим.

Для начала нам нужно создать новый раздел с Btrfs. Для этого можно воспользоваться Gparted. Для ручного разбиения исп. cfdisk и info mkfs.btrfs.

В Btrfs существуют подтома (subvolumes). Изначально на разделе один корневой подтом с id=5. Если при монтировании в опциях не указать подтом, то будет примонтирован корневой. На нем мы можем создать неограниченное число вложенных в друг друга подтомов. Подтома можно монтировать в отдельные точки монтирования, при этом применяя к ним различные методы сжатия и т.п. Снапшоты -- это такие же подтома, за исключением некоторых деталей...

Для наших целей нужно три подтома:

Подтом Точка монтирования
@ /
@home /home
@var_log /var/log

Далее мы монтируем корневую файловую систему:

mount /dev/sda3 /mnt

И создаем подтома:

cd /mnt
btrfs su cr @
btrfs su cr @home
btrfs su cr @var_log

Для чего нужно именно три подтома, я объясню позже. Сейчас смонтируем их и перенесем на них файлы:

mount -o noatime,compress=zstd:3,subvol=@ /dev/sda3 /mnt
mount -o x-mount.mkdir,noatime,compress=zstd:3,subvol=@home /dev/sda3 /mnt/home
mount -o x-mount.mkdir,noatime,compress=zstd:3,subvol=@var_log /dev/sda3 /mnt/var/log

rsync -avh\
   --exclude "/boot/*"\
   --exclude "/efi/*"\
   --exclude "/media/*"\
   --exclude "/dev/*"\
   --exclude "/proc/*"\
   --exclude "/sys/*"\
   --exclude "/tmp/*"\
   --exclude "/run/*"\
   --exclude "/mnt/*"\
   --exclude "/lost+found/*"\
   / /mnt

Не забудьте отредактировать /mnt/etc/fstab:

# нужно указать точки монтирования для @, @home, @var_log
UUID=<UUID>  /           btrfs  rw,noatime,compress=zstd:3,commit=120,subvol=@
...

ID раздела с Btrfs можно подсмотреть в том же Gparted.


Небольшое лирическое отступление.

Btrfs желательно монтировать с noatime (не сохранять время доступа к файлу) для минимизации операций записи для этих же целей увеличено время коммита изменений файловой системы (переодичности записи данных на диск, по умолчанию она - 30 секунд). Можно так же попробовать lazytime --- время доступа к файлу хранится в RAM и сохраняется при выключении (?).

Касательно, сжатия данных -- лучшим методом сжатия на домашней пекарне является zstd. Его преимущество в сравнении с другими алгоритмами заключается в высокой скорости распаковки, что на живой системе важнее уровня сжатия. На слабых компьютерах используется zstd:1 или даже lzo:1, а вот на более мощных -- уровни от 3 до 9. Для проверки скорости zstd на различных уровнях сжатия:

zstd -T0 -b3 -e15

Сами решайте какой уровень вам подходит. Комфортно можно жить со скоростью записи вплоть до 12 MiB/s (это максимальная скорость скачки файлов в мегабайтах при канале 100 MBit/s). Те на каком-нибудь бекап-сервере можно и zstd:9 использовать. В Btrfs 15-ый уровень ранее и вероятно сейчас является максимальным, хотя сама zstd поддерживает уровни вплоть до 29-го (?).


Для того чтобы система грузилась, chroot-имся в /mnt и переустанавливаем grub (или редактируем конфиги -- кому как нравится), либо переписываем конфиг для systemd-boot.

Конфиг для systemd-boot будет выглядеть так:

[skipped]
options root=UUID=<UUID> rootflags=subvol=@ rw quiet

Тут из непривычного -- тут нужно передать subvol через rootflags.

После сделанного перегружаемся...

Для автоматического снятия снапшотов применяется утилита snapper, о которой я узнал от гентушников. Так вот три подтома нам нужны чтобы снимать снапшоты с них с разной периодичностью. Какую-то ценность представляют данные в хомяке, поэтому снапшоты хомяка будут делаться чаще всего; снапшоты корня будут делаться при старте системы и обновлении, а вот логи -- это часто мусор, утрата которого не имеет значения.

Snapper, конечно, хорош, но он не дает такого положительного опыта, как тыкание мышкой по интерфейсу. В качестве GUI для Snapper я использую Btrfs Assistant. О нем я узнал в чате пользователей Garuda Linux. О нем я выше упоминал. Пользователи дистрибутивов на основе Arch Linux могут установить все, используя yay/paru:

yay -S snapper btrfs-assistant btrfsmaintenance

Запускаем Btrfs Assistant, заходим в Snapper Settings.

Screenshot_20240523_154553

Snapper каждый час делает снапшоты. Через его конфиг мы можем указать сколько оставлять последних ежечасных снапшотов, первых за сутки, неделю, месяц и год...

  • Для @ ставим 2 дневных, остальные в 0. Общее количество снапшотов не трогаем (вместо 50 можно даже больше поставить).
  • Для @home - 5 часовых, 10 дневных, остальное по 0.
  • Обязательно отмечаем: Snapper timeline enabled, Snapper cleanup enabled, Snapper boot enabled.

Для того чтобы делались снапшоты при обновлении системы, ставим хук для pacman:

yay -S snap-pac

Теперь поговорим про восстановление системы. Тут все просто. В случае удаления чего-то важного, неудачного обновления, можно перейти во вкладку Snapper, далее ниже Browse/Restore и сделать восстановления из снапшота. При этой операции будет сделан снапшот текущего подтома, подлежащего восстановлению, а потом он будет заменен на выбранный снимок/снапшот. Так же можно восстановить отдельные файлы.

Screenshot_20240523_154755

Так же обратите внимание на вкладку Btrfs maintance. Там вас могут заинтересовать такие операции как scrub и balance. Первая проверяет контрольные суммы блоков и исправляет ошибки, вызванные, например, неожиданным отключением электричества (такое происходит редко, частые ошибки чексум свидетельствую о скорой смерти SSD); вторая -- позволяет вернуть место занятое заголовками.

Ручной вызов команд:

sudo btrfs scrub start -Bd /

sudo btrfs balance start -dusage=10 -musage=10 /

Чтобы посмотреть сколько места занимает файловая система:

sudo btrfs fi us /

Команда btrfs позволяет вместо filesystem писать fi и f, те сокращать слова вплоть до одной буквы. Выше уже был пример с su вместо subvolume и cr -- create.

Данная команда всегда показывает место, занятое корневым подтомом, поэтому не обязательно указывать полный путь.