ext4 и XFS — две файловые системы, которые чаще всего встречаются на серверах и десктопах Linux. Первая выросла из ext3 и остаётся выбором по умолчанию в большинстве дистрибутивов. Вторая пришла из мира SGI, стала стандартом в RHEL и хорошо работает с большими объёмами и параллельной нагрузкой. Спор «что быстрее» без контекста бессмысленен, поэтому разберём различия по задачам и проверим их командами.
Архитектурные отличия
ext4 использует журналирование метаданных, extent-ы вместо косвенных блоков и задержанное выделение места. Она умеет уменьшаться, поддерживает онлайн-расширение и предсказуема при нехватке места. XFS основана на B-деревьях, агрессивно использует отложенное выделение и параллелит операции с метаданными. Последнее даёт преимущество на многоядерных машинах с большим числом одновременных операций.
findmnt -no FSTYPE,SOURCE,SIZE,USED /
lsblk -f
tune2fs -l /dev/sda2 | grep -E 'Block count|Block size|Filesystem features'
xfs_info /mnt/data
У XFS нет режима уменьшения: вырастить файловую систему можно, сжать — нет. Для ext4 доступны оба направления, но уменьшение выполняется только на размонтированной файловой системе и требует проверки. Если вы часто перекраиваете разделы, ext4 даёт больше свободы.
Производительность на практике
На последовательных операциях с крупными файлами обе системы близки, и разница чаще определяется диском, а не файловой системой. XFS обычно лучше держит параллельную запись в несколько потоков и работу с большим числом файлов в каталоге. ext4 выигрывает на мелких операциях и на десктопной нагрузке, где важна задержка отклика, а не пропускная способность.
Отложенное выделение (delayed allocation) есть в обеих, но ведёт себя по-разному. Оно уменьшает фрагментацию и ускоряет запись, однако при нехватке места и внезапном отключении питания возможна потеря последних данных. Для баз данных это компенсируется собственным журналом СУБД и fsync, для обычных файлов — приложением.
fio --name=randwrite --ioengine=libaio --direct=1 --bs=4k \
--iodepth=32 --numjobs=4 --size=2G --runtime=60 --group_reporting
iostat -x 1 5
dstat -d --disk-util 1 5
df -h /mnt/data
Синтетические тесты полезны только как отправная точка. Прогоняйте их на своём профиле: размер блока, глубина очереди, число потоков и тип носителя меняют результат сильнее, чем выбор файловой системы. И не тестируйте на боевом разделе — fio с direct=1 пишет реальные данные.
При создании стоит явно задать метку и проверить выравнивание. Для SSD полезны noatime и discard, но discard на некоторых контроллерах добавляет задержки, поэтому чаще используют fstrim.timer. Опция noatime убирает запись времени доступа и снижает износ; relatime включена по умолчанию и обычно достаточна. Для XFS число allocation groups задаётся при создании, хотя mkfs выбирает разумное значение по размеру тома.
Масштабы и ограничения
ext4 рассчитана на файловые системы до 1 ЭиБ и файлы до 16 ТиБ при блоке 4 КиБ. XFS заявляет предел в 8 ЭиБ как для тома, так и для отдельного файла, но практический потолок определяется оборудованием и версией ядра. Для типичного сервера обе цифры избыточны.
Количество inode в ext4 задаётся при создании и потом не меняется. Если на разделе много мелких файлов, inode могут закончиться раньше места — типичная проблема почтовых и кэширующих серверов. XFS выделяет inode динамически, что удобнее для таких нагрузок, но требует следить за фрагментацией и свободным местом под метаданные.
df -i /mnt/data
xfs_repair -n /dev/sdb1
e2fsck -fn /dev/sda2
xfs_growfs /mnt/data
Надёжность и восстановление
Обе системы журналируют метаданные и после сбоя восстанавливаются быстро. ext4 при монтировании проигрывает журнал и при необходимости запускает проверку. XFS использует журнал и утилиту xfs_repair; для серьёзных повреждений есть xfs_repair -L, но она уничтожает журнал и может привести к потере данных. Применять её стоит только когда другие варианты исчерпаны и есть копия.
Для проверки ext4 на размонтированном разделе используйте e2fsck -f, для XFS — xfs_repair без ключей. Никогда не запускайте fsck для XFS: утилита от другой файловой системы может испортить структуру. Это одна из самых дорогих ошибок администрирования.
umount /mnt/data
xfs_repair /dev/sdb1
e2fsck -f /dev/sda2
mount -a
Снапшоты, квоты и дополнительные возможности
Ни ext4, ни XFS не умеют снапшоты на уровне файловой системы в том смысле, в каком их понимает ZFS или btrfs. Для обеих снапшоты делаются средствами LVM, и здесь важно оставлять место в volume group. XFS поддерживает reflink: копирование файла через cp --reflink=always создаёт CoW-экземпляр, что удобно для клонов виртуальных машин и тестовых баз. ext4 такой возможности не даёт.
Квоты в ext4 работают через usrquota и grpquota, в XFS — через project quotas, которые удобно привязывать к каталогам, а не к пользователям. Для контейнеров и хостинга это заметное преимущество XFS. Обе системы поддерживают ACL и xattr, необходимые для SELinux и прав доступа.
mkfs.ext4 -L data /dev/sdb1
mkfs.xfs -L data /dev/sdb1
mount -o noatime,quota /dev/sdb1 /mnt/data
cp --reflink=always /mnt/data/base.img /mnt/data/clone.img
Что выбрать
Для домашнего компьютера, ноутбука и небольшого сервера ext4 — разумный выбор по умолчанию: она предсказуема, хорошо документирована, поддерживает уменьшение и не требует дополнительных пакетов. Для сервера с большими массивами, параллельной записью, множеством контейнеров и project-квотами XFS часто удобнее. В RHEL-совместимых дистрибутивах XFS и так является стандартом, и менять её без причины не стоит.
Отдельно про базы данных: и ext4, и XFS работают с MySQL и PostgreSQL, но для XFS рекомендуется заранее выставить выравнивание и не экономить на журнале. Для PostgreSQL часто советуют ext4 из-за предсказуемого поведения при fsync, но решающим остаётся тест на конкретном оборудовании. Для виртуальных машин с тонким провижинингом и клонированием XFS с reflink экономит место.
- Десктоп, ноутбук, домашний сервер — ext4.
- Крупные массивы и параллельная запись — XFS.
- Нужно уменьшать раздел — ext4.
- Нужны project-квоты и reflink — XFS.
- RHEL и производные — XFS по умолчанию.
- Базы данных — тест на своём профиле нагрузки.
Итог
Выбор между ext4 и XFS — это выбор под сценарий, а не поиск абсолютного победителя. ext4 проще, гибче в изменении размера и привычнее для десктопа. XFS лучше масштабируется по параллелизму, поддерживает project-квоты и reflink, но не уменьшается и требует аккуратности при восстановлении. Проверьте профиль нагрузки, наличие LVM и требования к обслуживанию — и решение станет очевидным без синтетических споров.