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
.
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
и сделать восстановления из снапшота. При этой операции будет сделан снапшот текущего подтома, подлежащего восстановлению, а потом он будет заменен на выбранный снимок/снапшот. Так же можно восстановить отдельные файлы.
Так же обратите внимание на вкладку 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
.
Данная команда всегда показывает место, занятое корневым подтомом, поэтому не обязательно указывать полный путь.