ZFS и Btrfs часто противопоставляют друг другу, хотя решают они похожие задачи разными способами. Обе файловые системы поддерживают контрольные суммы, снапшоты, сжатие и отправку изменений на резервный сервер. Разница в философии: ZFS — цельный стек с пулами, ARC и строгими правилами, Btrfs — встроенная в ядро файловая система с гибким управлением устройствами. Для домашнего сервера выбор зависит не от популярности, а от того, готовы ли вы обслуживать модуль ядра и сколько дисков планируете добавить через год.
Термины, которые путают
- Пул ZFS — группа устройств с общим пространством; датасет — файловая система внутри пула со своими свойствами.
- В Btrfs аналог пула — файловая система на одном или нескольких устройствах, аналог датасета — сабтом (subvolume).
- Снапшот в ZFS всегда привязан к датасету и создаётся мгновенно; в Btrfs это отдельный сабтом, доступный только для чтения или для записи.
Проверка на практике без реальных дисков
Прежде чем форматировать накопители, соберите стенд на файлах-образах. ZFS принимает файл как vdev, Btrfs — как блочное устройство через loop.
sudo apt install zfsutils-linux btrfs-progs
truncate -s 8G /var/tmp/zfs.img
sudo zpool create tank /var/tmp/zfs.img
sudo zfs create tank/data
sudo zfs set compression=lz4 tank/data
sudo zfs set atime=off tank/data
Для Btrfs последовательность другая: сначала файловая система, затем точка монтирования и сабтомы.
truncate -s 8G /var/tmp/btrfs.img
sudo mkfs.btrfs -L data /var/tmp/btrfs.img
sudo mkdir -p /mnt/btrfs
sudo mount -o loop,compress=zstd:3,noatime /var/tmp/btrfs.img /mnt/btrfs
sudo btrfs subvolume create /mnt/btrfs/data
Обратите внимание: в ZFS сжатие включается свойством датасета и действует на новые данные, в Btrfs — опцией монтирования. Уже записанное обе системы не пережимают.
Память и ARC
ZFS использует ARC — кэш в оперативной памяти, который по умолчанию может занимать до половины RAM. Это не утечка: под давлением память освобождается, но на машине с 8 ГБ лимит лучше задать явно. Btrfs полагается на страничный кэш ядра.
awk '/^size/ {print $3/1024/1024/1024 " GiB"}' /proc/spl/kstat/zfs/arcstats
cat /sys/module/zfs/parameters/zfs_arc_max
zfs get compressratio tank/data
Лимит ARC задаётся параметром модуля zfs_arc_max в байтах; на постоянной основе его прописывают в /etc/modprobe.d/zfs.conf и перезагружаются. Для домашнего сервера с 16 ГБ ARC стоит ограничить явно. ECC не обязательна, но снижает риск повреждения данных в RAM.
Снапшоты и откат
Снапшоты — главный аргумент обеих систем. В ZFS имя включает датасет и метку, откат возвращает датасет целиком. В Btrfs снапшот — это сабтом, и его можно смонтировать отдельно, что удобно для проверки старой версии данных.
sudo zfs snapshot tank/data@before-upgrade
sudo zfs list -t snapshot -o name,used,refer
sudo zfs rollback tank/data@before-upgrade
sudo btrfs subvolume snapshot -r /mnt/btrfs/data /mnt/btrfs/data-2026-11-05
sudo btrfs subvolume list /mnt/btrfs
Важное отличие: zfs rollback с -r уничтожает снапшоты новее выбранного, а без -r откажется работать. В Btrfs откат — это переключение на другой сабтом; автоматического возврата нет. Регулярные снапшоты делают через snapper или systemd-таймеры. Сами снапшоты не заменяют резервную копию: они лежат на тех же дисках.
Отправка на резервный сервер
Обе системы умеют инкрементальную передачу: ZFS через send и ssh, Btrfs через btrfs send и receive. Для Btrfs отправляйте только снапшоты, созданные с -r.
sudo zfs send -i tank/data@before tank/data@after | ssh backup zfs receive backup/data
sudo btrfs send -p /mnt/btrfs/data-1 /mnt/btrfs/data-2 | ssh backup btrfs receive /backup
У ZFS есть преимущество для шифрованных датасетов: raw-поток (ключ -w) передаёт данные без расшифровки на источнике. Btrfs собственного шифрования не имеет, поэтому шифровать нужно уровень ниже — LUKS.
Целостность и scrub
sudo zpool scrub tank
sudo zpool status -v
sudo btrfs scrub start -B /mnt/btrfs
sudo btrfs device stats /mnt/btrfs
sudo btrfs filesystem usage -T /mnt/btrfs
Scrub нужно запускать регулярно через systemd-таймер. ZFS показывает ошибки чтения и записи по устройствам, Btrfs — счётчики в device stats. Если избыточности нет, обе системы обнаружат повреждение, но не смогут его исправить.
RAID, расширение и замена дисков
sudo zpool create tank mirror /dev/sdb /dev/sdc
sudo zpool add tank mirror /dev/sdd /dev/sde
sudo zpool replace tank /dev/sdb /dev/sdf
sudo btrfs device add /dev/sdc /mnt/btrfs
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/btrfs
В ZFS зеркала расширяются добавлением пары, а RAIDZ долгое время нельзя было расширить без пересоздания пула; современные версии OpenZFS поддерживают расширение RAIDZ, но операция долгая. Btrfs проще относится к устройствам: add, remove и balance позволяют менять схему на лету, но RAID5/6 исторически имеет проблему write hole и не рекомендуется для важных данных. Зеркало переживает потерю одного диска без простоя.
Шифрование, загрузка и совместимость
ZFS умеет нативное шифрование на уровне датасета: ключ можно хранить в файле, вводить при загрузке или получать из TPM. Btrfs нативного шифрования не имеет, поэтому используется LUKS поверх раздела. Для корневой системы ZFS требует модуля ядра: в Ubuntu он собирается через DKMS, что иногда конфликтует с Secure Boot и обновлениями ядра. Btrfs встроен в ядро, поэтому загрузка с него проще, а Fedora и openSUSE используют его по умолчанию.
Что выбрать для домашнего сервера
- Один-два диска, важна простота и снапшоты корня — Btrfs: встроен в ядро, есть snapper.
- Четыре и более диска, нужны RAIDZ, надёжный scrub и отправка на бэкап — ZFS: предсказуемая целостность и удобный send/receive.
- Нужно менять состав дисков на лету — Btrfs с raid1 и balance.
- Критичен Secure Boot и не хочется подписывать модули — Btrfs.
Проверьте производительность через fio и не включайте дедупликацию ZFS без необходимости: она требует много памяти. Для Btrfs не запускайте balance без необходимости и следите за свободным местом: заполнение выше 90% заметно замедляет работу.
Итог
ZFS выигрывает там, где важны целостность, зеркала и дисциплина резервного копирования, а цена — модуль ядра, память под ARC и более сложное расширение. Btrfs выигрывает на простых домашних конфигурациях: она в ядре, легко расширяется и дружит со снапшотами загрузчика, но требует осторожности с RAID5/6 и балансировкой. Для домашнего сервера из двух дисков я бы начал с Btrfs и raid1, а для массива на четыре и более дисков выбрал ZFS с mirror или RAIDZ. Решение стоит принимать по числу дисков и готовности обслуживать систему, а не по синтетическим тестам.