Victor3D

Использование файловой системы 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