Использование файловой системы BTRFS
Форматирование разделов в Btrfs
mkfs.btrfs -n 32k -L arch ARCH_DEVICE
-n указываем размер узла дерева в котором хранятся данные. Чем он больше, тем лучше сжимается…
- Тут и далее вместо ARCH_DEVICEуказываем/dev/nvme0n1p1.
Btrfs ‒ это одна из самых продвинутых файловых систем в Linux. Многие считают ZFS достойной альтернативой, но она не включена в ядро. Btrfs поддерживает механизм CoW (copy-on-write), создание снапшотов и сжатие данных… Снапшоты — это снимки файловой системы, точки для восстановления. Сжатие данных позволяет экономить место на диске, отказаться от использования архивов, но различные форматы изображений и видео и так поддерживают сжатие, поэтому оно не всегда полезно. За 4 года использования Btrfs я не сталкивался с какими-то критическими багами, и она меня не раз спасали от утраты данных. Простой пример: sudo rm -rf /<тут закрался пробел>.
В Btrfs нет привычных разделов, есть только подтома, которые можно сравнить с обычными каталогами. У них нет фиксированного размера, однако его можно ограничить с помощью quota. Снапшоты, если упускать некоторые детали, являются теми же самыми подтомами, те их можно монтировать и выполнять аналогичные операции.
Монтируем RootFS:
mount ARCH_DEVICE /mnt
Возможные сабвольюмы:
| subvolume | mount | описание | 
|---|---|---|
| @ | / | Корневой каталог (системные файлы) | 
| @home | /home | Домашний каталог с пользовательскими данными. Нужен отдельный так как при откате системы к предыдущему состоянию очень важно сохранить существующий прогресс (куки браузера, конфиги, документы, файлы проектов и т.д.) | 
| @snapshots | /.snapshots | Содержит снапшоты корня, которые создает snapper | 
| @home.snapshots | /home/.snapshots | Содержит снапшоты хомяка, которые создает snapper | 
| @machines | /var/lib/machines | Если не существует, то создаст systemd | 
| @portables | /var/lib/portables | Если не существует, то создаст systemd | 
| @docker | /var/lib/docker | Рекомендации самого Docker с их сайта | 
| @docker_btrfs | /var/lib/docker/btrfs | Docker создает саьвольюмы по этому пути | 
| @var_lib | /var/lib | Вместо создания @machines,@portables,@dockerможно создать только этот, если в/var/libне будет храниться чего-то важного (предполагается, что будут делаться снапшоты только корня и/или хомяка) | 
| @var | /var | Аналогично выше описанному | 
| @var_logили просто@log | /var/log | Логи как правило не представляют интереса, но в снапшотах занимают дополнительное место | 
| @swap | /swapили/var/swap, или/var/lib/swap | Хранит файл подкачки. Должен монтироваться с nodatacow | 
Подтома @machines, @portables, @.snapshots, @home.snapshots и @docker (опционально при использовании docker) нужны чтобы не заморачиваться с переносом вложенных подтомов при замене старого подтома на снапшот. Однако, вся эта плоская структура подтомов скорее нужна на серверах. Чтобы не заморачиваться я словетую использовать Btrfs Asssistant.
Создаем нужные подтома:
btrfs sub create /mnt/@
btrfs sub create /mnt/@home
# Рекомендуется
btrfs sub create /mnt/@cache
btrfs sub create /mnt/@log
Отмонтируем RootFS:
umount /mnt
Монтируем подтома и загрузочный раздел:
mount -o compress=zstd:6,subvol=@ ARCH_DEVICE /mnt
# Примонтируем остальное
# x-mount.mkdir создает несуществующую директорию
# mount -o x-mount.mkdir /dev/nvme0n1p2 /mnt/boot
# Используем более закрытые права на каталог с
mkdir -m 700 /mnt/boot
mount BOOT_DEVICE /mnt/boot
mount -o x-mount.mkdir,compress=zstd:6,subvol=@home ARCH_DEVICE /mnt/home
# Монтируем остальные подтома
mount -o x-mount.mkdir,compress=zstd:6,subvol=@cache ARCH_DEVICE /mnt/var/cache
mount -o x-mount.mkdir,compress=zstd:6,subvol=@log ARCH_DEVICE /mnt/var/log
Через двоеточие указывается уровень сжатия. На примере ниже оптимальный уровень сжатия 6. При нем скорость записи падает до 100 MiB/s, но при скачивании файлов из сети у нас скорость ~12 MiB/s (100 MBit/s)… Нам важна только скорость чтения, а она не падает меньше 2 GiB/s, те примерно равна скорость записи SSD (и не должна быть меньше нее в идеале). Протестировать уровни сжатия можно так:
$ zstd -T0 -b1 -e19
 1#Synthetic 50%     :  10000000 ->   3152996 (x3.172),  908.5 MB/s, 2367.7 MB/s
 2#Synthetic 50%     :  10000000 ->   3129011 (x3.196),  423.8 MB/s, 2312.6 MB/s
 3#Synthetic 50%     :  10000000 ->   3230491 (x3.096),  198.8 MB/s, 1852.2 MB/s
 4#Synthetic 50%     :  10000000 ->   3339961 (x2.994),  180.2 MB/s, 1591.4 MB/s
 5#Synthetic 50%     :  10000000 ->   3290137 (x3.039),  133.4 MB/s, 1586.0 MB/s
 6#Synthetic 50%     :  10000000 ->   3278503 (x3.050),  127.3 MB/s, 1615.1 MB/s
 7#Synthetic 50%     :  10000000 ->   3321448 (x3.011),   92.9 MB/s, 1484.6 MB/s
 8#Synthetic 50%     :  10000000 ->   3315141 (x3.016),   84.7 MB/s, 1477.1 MB/s
 9#Synthetic 50%     :  10000000 ->   3355994 (x2.980),   55.0 MB/s, 1322.0 MB/s
10#Synthetic 50%     :  10000000 ->   3363166 (x2.973),   37.2 MB/s, 1190.3 MB/s
11#Synthetic 50%     :  10000000 ->   3363170 (x2.973),   24.2 MB/s, 1150.9 MB/s
12#Synthetic 50%     :  10000000 ->   3362882 (x2.974),   23.1 MB/s, 1147.6 MB/s
13#Synthetic 50%     :  10000000 ->   3354692 (x2.981),   9.05 MB/s, 1195.2 MB/s
14#Synthetic 50%     :  10000000 ->   3354678 (x2.981),   9.70 MB/s, 1167.4 MB/s
15#Synthetic 50%     :  10000000 ->   3353801 (x2.982),   8.03 MB/s, 1157.6 MB/s
16#Synthetic 50%     :  10000000 ->   3080678 (x3.246),   6.68 MB/s, 2248.9 MB/s
17#Synthetic 50%     :  10000000 ->   3136878 (x3.188),   2.64 MB/s, 1908.5 MB/s
18#Synthetic 50%     :  10000000 ->   3145664 (x3.179),   2.54 MB/s, 1823.0 MB/s
19#Synthetic 50%     :  10000000 ->   3140424 (x3.184),   2.19 MB/s, 1843.2 MB/s
Форматирование внешнего usb диска в btrfs
sudo mkfs.btrfs -f -L Backup /dev/sdb
Для определения оптимальной силы сжатия запустить бенчмарк:
zstd -T0 -b1 -e19
Добавить запись в /etc/fstab:
UUID=<...>       /mnt/backup     btrfs	noauto,user,compress=zstd:6	0 2 
Создание снапшота:
sudo btrfs subvolume snapshot -r /mnt/backup /mnt/backup/.snapshots/test-snap
Удаление снапшота:
sudo btrfs subvolume delete  /mnt/backup/.snapshots/test-snap
Просмотр информации об использовании btrfs:
btrfs filesystem usage /mnt/backup