Learning Platform
Глоссарий Troubleshooting
Урок 10.05 · 24 мин
Начальный
Filesystemsext4xfsbtrfszfsLinux

ext4 vs xfs vs btrfs vs zfs — когда какую

«Какую файловую систему выбрать?» — вопрос, который встаёт перед каждым, кто настраивает новый сервер, создаёт хранилище под Docker, поднимает базу данных, или просто меняет диск. В Linux есть как минимум четыре серьёзных кандидата: ext4 (дефолт большинства дистрибуций), xfs (стандарт RHEL/CentOS), btrfs (modern features, нестабильность некоторых), zfs (enterprise-grade, но не в mainline kernel). Каждая решает разные задачи, и выбор не очевидный.

В этом уроке: сравнительная характеристика по ключевым параметрам — надёжность, производительность, snapshots, размер, deduplication, compression, дозревание. Когда какая правильна, и когда не стоит выбирать «модную» в ущерб надёжной.


Сравнительная таблица: одним взглядом

ext4 vs xfs vs btrfs vs zfs -- быстрое сравнение
ext4Наследник ext2/ext3. Самая зрелая (продакшен с 2008). Стабильна, понятна, поддерживается везде. Без snapshots, без CoW. Лимит размера файла 16 ТБ. Журналирование. Default в Ubuntu, Debian
xfs64-bit оригинально для SGI IRIX (1993), портирован в Linux в 2000-х. Лучшая параллельность благодаря allocation groups. Default в RHEL/CentOS/Oracle Linux 7+. Большие файлы, большие FS. Нельзя shrink (только grow)
btrfsB-tree FS, Linux mainline с 2.6.29 (2009). Copy-on-Write, snapshots, subvolumes, integrated RAID, compression. RAID5/6 всё ещё marked experimental. Используется в SUSE, Fedora Server, Synology
zfsSun Solaris ZFS (2005). NOT in Linux mainline (CDDL license incompatible с GPL). ZFS on Linux через DKMS. CoW, snapshots, replication, dedup, encryption. Industry standard для enterprise storage, FreeBSD
When ext4Когда: typical workloads, root FS, серверы где главное -- надёжность и предсказуемость. Не нужны snapshots или CoW features. 90% случаев
When xfsКогда: большие файлы (видео, БД), high parallelism (много CPU), большие тома (>16 ТБ), не нужны snapshots и shrink. RHEL-инфраструктура. Database workload
When btrfsКогда: нужны snapshots без VM/LVM, subvolumes (rollback на старую версию через grub), compression (zstd), simple RAID-0/1. Готовы к меньшей зрелости в RAID5/6
When zfsКогда: serious data storage (NAS, backup-сервер, big-data), нужны replication, dedup, encryption, ARC cache, готовы поставить DKMS module. Enterprise budget for tuning

ext4 — золотой стандарт

ext4 — самая распространённая Linux FS. Эволюция: ext (1992) -> ext2 (1993) -> ext3 (2001, добавлено журналирование) -> ext4 (2008, extents, большие файлы).

Сильные стороны:

  • Зрелость. 15+ лет в production. Все edge cases выявлены, все баги поправлены.
  • fsck. Хорошо работает с recovery. Понятные ошибки.
  • Поддержка везде. Любая дистрибуция, любой kernel, любая cloud platform.
  • Performance для типичных workloads — хорошая, иногда лучше xfs на metadata-heavy.

Слабости:

  • Нет snapshots. Если нужно — через LVM (LVM snapshots на уровне block).
  • Нет CoW. Каждая запись изменяет старые блоки — нет cheap snapshots.
  • Нет встроенной compression. Только sparse files.
  • Лимиты: file 16 ТБ (с extents), FS до 1 ЭБ — более чем достаточно для современных задач.
  • Inode-количество фиксировано при mkfs. Может закончиться.
# Создать ext4 FS:
sudo mkfs.ext4 /dev/sdb1

# С опциями для optimization:
sudo mkfs.ext4 -L mydata -m 1 -O ^huge_file /dev/sdb1
#               ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^^
#               label     reserved 1% (вместо 5%)   опция features

# Tune later:
sudo tune2fs -l /dev/sdb1     # показать parameters
sudo tune2fs -m 1 /dev/sdb1   # изменить reserved % без размонтирования
sudo tune2fs -L newlabel /dev/sdb1

Используйте ext4, когда нет специфических требований к snapshots/CoW. 90% серверов, 99% рабочих машин. Дефолт от Canonical, Debian, основа Ubuntu cloud images.


xfs — параллельность и большие данные

xfs создавался Silicon Graphics в 90-е для high-end Unix workstations (IRIX) — нужны были большие файлы, большая параллельность. Открыт под GPL, портирован в Linux в начале 2000-х.

Сильные стороны:

  • Allocation groups. FS разделена на independent groups, каждая может работать параллельно. Идеально для multi-CPU NUMA серверов.
  • 64-bit на всё. Большие файлы (16 EB), много файлов в директории, большие FS.
  • Dynamic inodes. Нет фиксированного количества — inodes выделяются по мере необходимости. Никогда не упрётесь в IUsed 100%.
  • High metadata performance. Журналирование metadata быстрое.
  • Default в RHEL/CentOS 7+.

Слабости:

  • Нельзя shrink. Только grow. Если переоценили размер — бэкап + reformat.
  • Нет CoW, snapshots. Как ext4 — нужен LVM.
  • fsck реже нужен и тяжелее. Журналирование быстро восстанавливает после crash.
# Создать xfs:
sudo mkfs.xfs /dev/sdb1

# С опциями:
sudo mkfs.xfs -L data -b size=4096 -d agcount=16 /dev/sdb1
#              ^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
#              label   4 КБ блоки    16 allocation groups (под кол-во CPU)

# Расширить:
sudo xfs_growfs /mountpoint
# Online, без размонтирования

xfs побеждает ext4 на high-concurrency workloads и больших файлах. Базы данных (PostgreSQL, MySQL), видеостудии, аналитика. Default в RHEL family.


btrfs — modern features в mainline

btrfs (B-tree File System) — ответ Linux-сообщества на ZFS. Появился в 2007, mainline с 2.6.29 (2009). Цель — те же features (CoW, snapshots, RAID), но в kernel-tree.

Сильные стороны:

  • Copy-on-Write. Каждое изменение — новый блок, старый не трогается. Снапшоты дёшевы (просто захват CoW-моментa).
  • Snapshots and subvolumes. Snapshot за миллисекунды, не зависит от размера данных.
  • Built-in compression. zlib, lzo, zstd на уровне ФС. Заметная экономия места для логов, текстов.
  • Integrated RAID. RAID0, 1, 10 production-ready. RAID5/6 — experimental (write hole problem).
  • Checksumming. Каждый блок имеет CRC32C — silent corruption детектируется.
  • Online operations. Grow, shrink, balance, scrub без unmount.
  • Send/receive. Эффективная инкрементальная репликация снапшотов.

Слабости:

  • RAID5/6 не production-ready. До сих пор known data loss scenarios.
  • Performance менее предсказуем. Особенно с CoW и snapshots — write amplification.
  • Меньшая зрелость по сравнению с ext4/xfs. Хотя в 2025 многое решено.
  • fsck сложнее. btrfs-check не такой intuitive.
# Создать btrfs:
sudo mkfs.btrfs /dev/sdb1
# или несколько устройств сразу (RAID):
sudo mkfs.btrfs -m raid1 -d raid1 /dev/sdb1 /dev/sdc1

# Subvolumes:
sudo btrfs subvolume create /mnt/btrfs/data
sudo btrfs subvolume create /mnt/btrfs/snap_2026_05_18

# Снапшот:
sudo btrfs subvolume snapshot /mnt/btrfs/data /mnt/btrfs/data_snap

# Список снапшотов:
sudo btrfs subvolume list /mnt/btrfs

# Включить compression:
sudo mount -o compress=zstd /dev/sdb1 /mnt/btrfs

btrfs хорош, когда нужны snapshots и/или compression без VM/LVM. SUSE официально использует btrfs root для snapper rollback. Fedora Server переключилась на btrfs default. NAS типа Synology используют btrfs.


zfs — enterprise-grade

zfs создан Sun Microsystems для Solaris в 2005. После приобретения Oracle переведён на CDDL, что несовместимо с GPL Linux kernel. Поэтому zfs не в mainline — но есть OpenZFS (zfs on Linux), который ставится как DKMS module или через packaged kernel modules.

Сильные стороны:

  • Pool-based storage. Не разделы, а pools (vdevs), которые можно расширять, добавлять зеркала.
  • Snapshots and clones. Бесплатные снапшоты, дёшевые клоны (writable snapshot).
  • Send/receive. Replication между серверами на блоковом уровне.
  • Compression. lz4 default, zstd, gzip.
  • Deduplication. Block-level dedup (cost: memory).
  • ARC cache. Aggressive RAM-based caching, очень эффективен.
  • Encryption. Per-dataset native encryption (с 0.8).
  • Self-healing. На RAID-Z массивах автоматически чинит bit-rot из mirror.
  • Checksumming. SHA256/Fletcher4 per block.

Слабости:

  • NOT in Linux mainline. Установка через DKMS или packaged module. Может сломаться при обновлении kernel.
  • License (CDDL vs GPL). Не distributed Canonically Ubuntu (хотя они shipping zfs-utils).
  • Memory hungry. ARC любит RAM, dedup требует много RAM. Рекомендуют 1 ГБ RAM на 1 ТБ data с dedup.
  • Сложность. Многие knobs, легко настроить плохо для своего workload.
# Установка на Ubuntu:
sudo apt install zfsutils-linux

# Создать pool:
sudo zpool create mypool /dev/sdb /dev/sdc
sudo zpool status

# Mirror (RAID1):
sudo zpool create mymirror mirror /dev/sdb /dev/sdc

# RAID-Z (как RAID5, но без write hole):
sudo zpool create mypool raidz /dev/sdb /dev/sdc /dev/sdd /dev/sde

# Создать dataset (~подмножество):
sudo zfs create mypool/data

# Snapshot:
sudo zfs snapshot mypool/data@2026-05-18
sudo zfs list -t snapshot

# Send/receive (replication):
sudo zfs send mypool/data@snap1 | ssh backup-host zfs receive backup/data

# Compression на уровне dataset:
sudo zfs set compression=zstd mypool/data

zfs — стандарт для serious storage: NAS, backup-серверы, ZFS storage appliances (TrueNAS, FreeNAS). На FreeBSD это default.


Реальные сценарии выбора

Несколько конкретных кейсов:

Сервер с PostgreSQL/MySQL:

  • ext4 или xfs. xfs выигрывает на больших БД (>1 ТБ) и многоядерных серверах. ext4 — безопасный default.
  • Не btrfs CoW — write amplification может убить DB performance.
  • Не zfs root, но zfs для отдельного data volume — OK (нативный snapshot + send/receive для бэкапов).

Docker host:

  • ext4 или xfs для root. Не btrfs root (некоторые docker storage драйверы конфликтуют).
  • Docker может использовать overlay2 поверх любой ФС — работает на ext4.
  • btrfs storage driver для Docker — работает, но менее распространён.
Docker volumes: как хранить данные между перезапусками

Backup server:

  • zfs или btrfs идеален — snapshots, compression, dedup, send/receive.
  • Если только Linux — btrfs. Если рассматриваете FreeBSD — zfs.

Видеосервер (большие файлы):

  • xfs — именно его use case. Большие файлы, sequential I/O.

Workstation / desktop:

  • ext4 — default Ubuntu, работает out of box.
  • btrfs (Fedora default) — если хочется snapshots для system rollback.

Embedded / IoT:

  • ext4 с journalling или f2f s (Flash-Friendly File System) для SSD/SD card wear leveling.

Кэширование и журналирование

Все рассмотренные FS используют различные стратегии для надёжности и скорости:

Каждая ФС -- свой подход к надёжности и performance
ext4: journalingМетаданные сначала пишутся в журнал, потом в final location. После crash журнал воспроизводится. data=ordered (default) -- данные пишутся перед метаданными, безопаснее но медленнее
xfs: journalingMetadata journaling. Может включать data journaling. Высокая параллельность журнала -- per allocation group
btrfs: CoWНикогда не перезаписывает существующие блоки. Новые данные -- новые блоки. Метаданные обновляются атомарно через переключение b-tree root. Crash-safe by design
zfs: CoW + ZILCoW для основных данных. ZIL (ZFS Intent Log) для синхронных операций -- ускоряет fsync. ARC -- агрессивный read-cache в RAM

CoW (Copy-on-Write) более elegant и безопасен — никогда нет состояния «частично записанного блока». Но он создаёт write amplification и фрагментацию для random writes (актуально для DB).


Попробуй сам

Попробуйте создать разные ФС на test-image:

# Создать 200 МБ image:
dd if=/dev/zero of=/tmp/test.img bs=1M count=200

# Попробовать ext4:
sudo mkfs.ext4 /tmp/test.img
sudo mkdir -p /mnt/test
sudo mount -o loop /tmp/test.img /mnt/test
df -h /mnt/test
df -i /mnt/test   # Видно фиксированное количество inodes

# Размонтировать, форматировать xfs:
sudo umount /mnt/test
sudo mkfs.xfs -f /tmp/test.img
sudo mount -o loop /tmp/test.img /mnt/test
df -i /mnt/test   # Для xfs IUsed=N/A или растёт по мере создания

# Создать btrfs:
sudo umount /mnt/test
sudo mkfs.btrfs -f /tmp/test.img
sudo mount -o loop /tmp/test.img /mnt/test
sudo btrfs filesystem df /mnt/test   # btrfs-специфичная команда

# Сделать snapshot:
sudo btrfs subvolume create /mnt/test/sv
echo "data" | sudo tee /mnt/test/sv/file
sudo btrfs subvolume snapshot /mnt/test/sv /mnt/test/snap1
ls /mnt/test/snap1   # видим файл

# Cleanup:
sudo umount /mnt/test
rm /tmp/test.img

Проверка знанийKnowledge check
Команде нужно настроить storage для нового проекта: 1) PostgreSQL primary database (~5 ТБ, OLTP workload), 2) backup server для всех других сервисов (~50 ТБ), 3) Docker host для микросервисов, 4) ML team хочет быстрый scratch storage для датасетов. Какие ФС для каждого и почему?
ОтветAnswer
Разные ФС для разных задач: 1) PostgreSQL: xfs идеально -- большие файлы (БД-файлы), high-concurrency (много backend processes), zero shrink (БД не сжимаются), отличный journaling без CoW overhead (важно для OLTP с random writes). Альтернатива -- ext4, но xfs выигрывает на больших БД. НЕ btrfs (CoW + random writes = write amplification, фрагментация, deg performance). Volume не нужен LVM -- xfs grow online умеет. 2) Backup server: zfs идеален или btrfs как достойная альтернатива. zfs: snapshot+send/receive (incremental replication из других серверов), compression (zstd, экономит ~50% на типичных данных), deduplication (опционально, при много RAM), self-healing на RAID-Z. На 50 ТБ это серьёзная экономия места. Если zfs нельзя по licensing -- btrfs с raid1, send/receive, compression. Чёткое no для ext4/xfs здесь -- нет snapshots. 3) Docker host: ext4 для root + storage. Простота, стабильность, любой docker storage driver (overlay2) работает. Не нужен CoW на уровне ФС -- overlay2 сам делает CoW. xfs тоже OK. Btrfs root -- возможен но создаёт сложности с docker (некоторые versions конфликтуют). 4) ML scratch storage: xfs выигрывает -- большие файлы (датасеты, models в GB), parallel access от multiple workers, sequential I/O, no snapshots нужно (scratch же). Опционально: tmpfs partition в RAM для hot datasets, или nvme-only setup для maximum throughput. zfs тут overkill. Дополнительно: на каждом отдельные volumes -- не один большой root. ext4 root + xfs/zfs/btrfs для data позволяет менять стратегию data partition без переустановки.

Проверьте понимание

Результат: 0 из 0
Прикладной
Вопрос 1 из 5. Какую FS лучше выбрать для PostgreSQL primary database на 5 ТБ с OLTP workload?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 5