Ext4 (Русский)
Ext4 — это усовершенствованная версия самой популярной файловой системы Linux, Ext3. Во многих отношениях Ext4 — это более глубокая переработка Ext3, чем Ext3 была переработкой Ext2. Ext3 в основном представляла собой добавление журналирования в Ext2, но в Ext4 были изменены важные структуры данных файловой системы, в том числе те, которые предназначены для хранения данных. В результате появилась файловая система с улучшенной архитектурой, более высокой производительностью, надёжностью и функциональностью.
Создание файловой системы
Чтобы отформатировать раздел, выполните:
# mkfs.ext4 /dev/раздел
Дополнительные возможности см. в разделе mke2fs(8).
/etc/mke2fs.conf.Соотношение байт на инод
Из mke2fs(8):
- mke2fs mke2fs создает иноду для каждого байта пространства на диске, соответствующего байтам на иноду. Чем больше соотношение байтов на иноду, тем меньше будет создано инод.
Для создания нового файла, каталога, символической ссылки и т.д. требуется хотя бы один свободный инод (индексный дескриптор). Если количество инодов слишком мало, в файловой системе нельзя будет создать ни одного файла, даже если на ней еще есть свободное место.
Поскольку после создания файловой системы изменить объем данных, приходящихся на инод, или количество инодов невозможно, mkfs.ext4 по умолчанию использует довольно низкое соотношение — один инод на каждые 16 384 байта (16 КиБ), чтобы избежать подобных ситуаций.
Однако для разделов размером в сотни или тысячи гигабайт и со средним размером файлов в несколько мегабайт это обычно приводит к слишком большому количеству инодов, поскольку количество создаваемых файлов никогда не достигает количества инодов.
Это приводит к нерациональному использованию дискового пространства, поскольку каждый из этих неиспользуемых инодов занимает 256 байт в файловой системе (это значение также задается в /etc/mke2fs.conf, но его не следует менять). 256 * несколько миллионов = несколько гигабайт неиспользуемых индексных дескрипторов.
Эту ситуацию можно оценить, сравнив показатели Use% и IUse%, предоставляемые командами df и df -i:
$ df -h /home
Filesystem Size Used Avail Use% Mounted on /dev/mapper/lvm-home 115G 56G 59G 49% /home
$ df -hi /home
Filesystem Inodes IUsed IFree IUse% Mounted on /dev/mapper/lvm-home 1.8M 1.1K 1.8M 1% /home
Чтобы задать другое значение объема, приходящегося на инод, используйте параметр -T тип использования, который указывает на ожидаемое использование файловой системы с помощью типов, определенных в /etc/mke2fs.conf. Среди этих типов есть более крупные largefile и largefile4, которые предлагают более подходящие значения — один инод на 1 МБ и 4 МБ соответственно. Его можно использовать следующим образом:
# mkfs.ext4 -T largefile /dev/раздел
news (один индекс на каждые 4096 байт) или small (то же самое, плюс меньший индекс и размер блока).Соотношение также может быть задано напрямую с помощью опции -i: например используйте -i 2097152 для соотношения 2 МБ и -i 6291456 для соотношения 6 Мб.
Зарезервированные блоки
Из mke2fs(8)
- По умолчанию 5% блоков файловой системы будут зарезервированы для суперпользователя, чтобы избежать фрагментации и «позволить демонам, принадлежащим root, продолжать работать корректно после того, как непривилегированные процессы будут лишены возможности записывать в файловую систему».
Для современных дисков большой емкости это больше, чем необходимо, если раздел используется в качестве долгосрочного архива или не имеет решающего значения для работы системы (например, /home). См. это письмо для ознакомления с мнением разработчика ext4 Теда Цо о зарезервированных блоках и этот ответ для получения общей информации по этой теме.
Как правило, безопасно уменьшать процент зарезервированных блоков для освобождения дискового пространства, если раздел:
- очень большой (например, > 50 ГБ)
- используется в качестве долгосрочного архива, т. е. файлы не будут удаляться и создаваться очень часто
Ключ -m позволяет указать процент зарезервированных блоков.
Чтобы полностью предотвратить резервирование блоков при создании, используйте:
# mkfs.ext4 -m 0 /dev/раздел
Чтобы изменить его на 1%, используйте:
# tune2fs -m 1 /dev/раздел
Чтобы установить количество зарезервированного пространства блока в гигабайтах, используйте -r:
# tune2fs -r $((ngigs * 1024**3 / размер блока)) /dev/раздел
blocksize — размер блока файловой системы в байтах. Практически всегда равен 4096; для уверенности проверьте:
# tune2fs -l /dev/раздел | grep 'Block size:'
Block size: 4096
Синтаксис $(()) предназначен для математического расширения. Этот синтаксис работает в bash и zsh, но не работает в fish. Для „'fish“' синтаксис выглядит следующим образом:
# tune2fs -r (math 'ngigs * 1024^3 / размер блока) /dev/раздел
Эти команды могут быть применены к текущим смонтированным файловым системам, и изменения вступят в силу немедленно. Используйте findmnt(8), чтобы найти имя устройства:
# tune2fs -m 1 "$(findmnt -no SOURCE /точка/монтирования)"
Чтобы запросить текущее количество зарезервированных блоков:
# tune2fs -l /dev/mapper/proxima-root | grep 'Reserved block count:'
Reserved block count: 2975334
Это количество блоков, поэтому его необходимо умножить на размер блока файловой системы, чтобы получить количество байтов или гигабайт: 2975334 * 4096 / 1024**3 = 11.34 GiB.
Переход с ext2/ext3 на ext4
Монтирование разделов ext2/ext3 как ext4 без преобразования
Обоснование
Компромиссным решением между полным переходом на ext4 и простым сохранением ext2/ext3 является монтирование разделов в формате ext4.
Плюсы:
- Совместимость (файловая система может по-прежнему монтироваться как ext3) — это позволяет пользователям по-прежнему читать файловую систему из других операционных систем без поддержки ext4 (например, Windows с драйверами ext2/ext3).
- Улучшенная производительность (хотя и не такая высокая, как у преобразованного раздела ext4).[1][2]
Минусы:
- Используется меньше функций ext4 (только те, которые не изменяют формат диска, такие как многоблочное выделение и отложенное выделение).)
Процесс
- Отредактируйте
/etc/fstabи измените «тип» с ext2/ext3 на ext4 для всех разделов, которые необходимо смонтировать как ext4. - Заново смонтируйте соответствующие разделы.
Преобразование разделов ext2/ext3 в ext4
Обоснование
Чтобы воспользоваться всеми преимуществами ext4, необходимо выполнить необратимый процесс преобразования.
Плюсы:
Минусы:
- Разделы, которые содержат в основном статические файлы, такие как раздел
/boot, могут не получить преимуществ от новых функций. Кроме того, добавление журнала (что подразумевается при преобразовании раздела) всегда влечет за собой снижение производительности. - Разделы ext4 не могут быть «понижены» до ext2/ext3. Однако они обратно совместимы, пока не включены расширения и другие уникальные опции.
Процесс
Эти инструкции были адаптированы из [5] [6].
- При конвертации корневой файловой системы системы убедитесь, что при перезагрузке доступна «резервная» initramfs. В качестве альтернативы добавьте
ext4в соответствии с Mkinitcpio_(Русский)#MODULES и сгенерируйте initramfs заново перед запуском. - При конвертации отдельного раздела
/bootубедитесь, что загрузчик поддерживает загрузку из ext4.
В следующих шагах /dev/sdxX обозначает путь к разделу, который необходимо преобразовать, например /dev/sda1.
- Сделайте резервную копию всех данных на всех разделах ext3, которые будут преобразованы в ext4. Полезным пакетом, особенно для корневых разделов, является clonezilla.
- Отредактируйте
/etc/fstabи измените «тип» с ext3 на ext4 для всех разделов, которые необходимо преобразовать в ext4. - Загрузите live-носитель (при необходимости). Процесс преобразования с помощью e2fsprogs необходимо выполнять, когда диск не смонтирован. При преобразовании корневого раздела проще всего загрузиться с другого live-носителя.
- Убедитесь, что раздел не смонтирован.
- При конвертации раздела ext2 первым шагом конвертации является добавление журнала путем запуска
tune2fs -j /dev/sdxXот root; в результате раздел становится ext3. - Запустите
tune2fs -O extent,uninit_bg,dir_index /dev/sdxXот root. Эта команда преобразует файловую систему ext3 в ext4 (безвозвратно). - Запустите
fsck -f /dev/sdxXот root.- Этот шаг необходим, иначе файловая система будет нечитаемой. Запуск fsck необходим для возвращения файловой системы в состояние согласованности. Он найдет ошибки контрольной суммы в дескрипторах групп — это ожидаемо. Опция
-fзаставляет fsck принудительно выполнять проверку, даже если файловая система кажется чистой. Опция-pможет быть использована сверху для «автоматического восстановления».
- Этот шаг необходим, иначе файловая система будет нечитаемой. Запуск fsck необходим для возвращения файловой системы в состояние согласованности. Он найдет ошибки контрольной суммы в дескрипторах групп — это ожидаемо. Опция
- Рекомендуется: смонтировать раздел и запустить
e4defrag -c -v /dev/sdxXот root.- Несмотря на то, что файловая система теперь преобразована в ext4, все файлы, которые были записаны до преобразования, еще не используют преимущества опции ext4, которая улучшает производительность больших файлов, уменьшает фрагментацию и время проверки файловой системы. Чтобы в полной мере воспользоваться преимуществами ext4, все файлы должны быть перезаписаны на диск. Используйте e4defrag для решения этой проблемы.
- Перезагрузитесь
Повышение производительности
Отключение обновления времени доступа
Файловая система ext4 записывает информацию о том, когда файл был открыт в последний раз, и эта запись требует определенных затрат.
См. Fstab_(Русский)#Параметры_atime для noatime и связанных опций.
Увеличение интервала фиксации
Интервал синхронизации данных и метаданных можно увеличить, указав более длительную задержку в опции commit.
По умолчанию значение 5 секунд означает, что в случае потери питания будет потеряно не более 5 секунд последней работы. Это принудительно выполняет полную синхронизацию всех данных/журнала на физический носитель каждые 5 секунд. Однако благодаря ведению журнала файловая система не будет повреждена.
Следующий fstab (Русский) в качестве примера будет выполнять фиксацию раз в 60 секунд:
/etc/fstab
/dev/sda5 / ext4 defaults,commit=60 0 1
Отключение барьеров
Ext4 по умолчанию включает барьеры записи. Это гарантирует, что метаданные файловой системы правильно записываются и упорядочиваются на диске, даже когда кэш записи теряет питание. Это сопровождается снижением производительности, особенно для приложений, которые интенсивно используют fsync или создают и удаляют много небольших файлов. Для дисков, которые имеют кэш записи, который так или иначе имеет резервное питание, отключение барьеров может безопасно повысить производительность.
Чтобы отключить барьеры, добавьте опцию barrier=0 в нужную файловую систему.
Пример:
/etc/fstab
/dev/sda5 / ext4 defaults,barrier=0 0 1
Отключение журнала
Отключить ведение журнала можно с помощью следующей команды на отключенном диске:
# tune2fs -O "^has_journal" /dev/sdXn
Use the journal to optimize performance
Статья Fast commits for ext4 кратко объясняет, почему и как параметры монтирования data=journal или data=writeback ускоряют общую производительность ext4 по сравнению с режимом работы по умолчанию data=ordered. Кроме того, саму журналировку можно ускорить, добавив параметр монтирования journal_async_commit.
journal_async_commit не работает с параметром монтирования по умолчанию data=ordered, поэтому явно смонтируйте „'ext4_device“' с другим режимом; см. ext4(5) § data=.Еще один вариант — использовать более новый формат журнала, см. #Включение fast_commit.
Журнал на внешнем устройстве
При использовании нестандартных опций data= в некоторых случаях использование отдельного устройства для журнала также может ускорить работу с файлами. Например, когда для хранения данных используется относительно медленное устройство, а для журнала — другое (более быстрое, но меньшее по размеру) устройство. Чтобы настроить отдельное устройство для журнала:
# mke2fs -O journal_dev /dev/устройство_журнал
Чтобы назначить устройство_журнал в качестве журнала для устройства_ext4, используйте:
# tune2fs -J device=/dev/устройство_журнал /dev/устройство_ext4
Замените tune2fs на mkfs.ext4, если хотите создать новую файловую систему на ext4_device.
Добавьте устройство_журнал в качестве зависимости устройство_ext4 с помощью параметра монтирования x-systemd.requires в /etc/fstab:
/etc/fstab
/dev/устройство_ext4 / ext4 defaults,x-systemd.requires=/dev/устройство_журнал 0 1
Это предотвращает проблемы, если устройство_журнал требует настройки (например, он зашифрован).
UUID, так и devnum устройства журнала сохраняются в файловой системе ext4. При загрузке устройства журнала используется только devnum, что вызывает проблемы, поскольку devnum изменяется при перестановке дисков. Linux откажется монтировать файловую систему, если devnum указывает на неправильное устройство, но приведенные ниже обходные пути могут быть полезны:
Игнорируйте сохраненный devnum и принудительно загрузите журнал по пути, используя опцию монтирования journal_path:
/etc/fstab
/dev/ext4_device / ext4 defaults,x-systemd.requires=/dev/устройство_журнал,journal_path=/dev/устройство_журнал 0 1
e2fsck будет искать устройство журнала используя UUID и исправлять сохраненный devnum, если он выходит из синхронизации. Однако он будет считать это повреждением и запускать ненужное полное сканирование файловой системы [7]. Это можно отключить в файле конфигурации e2fsck:
/etc/e2fsck.conf
[problems]
# PR_0_EXTERNAL_JOURNAL_HINT: Superblock hint for external superblock should be xxxx
0x000033 = {
# Tell e2fsck that if this problem is encountered, it can be fixed but should
# not be considered corruption, the filesystem should still be marked clean.
not_a_fix = true
}
Советы и рекомендации
Использование шифрования
Начиная с Linux 4.1, ext4 изначально поддерживает шифрование файлов, см. статью fscrypt. Шифрование применяется на уровне каталогов, и разные каталоги могут использовать разные ключи шифрования. Это отличается как от dm-crypt (Русский), который представляет собой шифрование на уровне блочных устройств, так и от eCryptfs (Русский), который является многоуровневой криптографической файловой системой.
Включение контрольных сумм метаданных в существующих файловых системах
Когда файловая система была создана с помощью e2fsprogs 1.43 (2016) или более поздней версии, контрольные суммы метаданных включены по умолчанию. Существующие файловые системы могут быть преобразованы для включения поддержки контрольных сумм метаданных.
Для получения дополнительной информации о контрольных суммах метаданных см. ext4 wiki.
dumpe2fs, чтобы проверить функции, которые включены в файловой системе.:
# dumpe2fs -h /dev/путь/к/диску
Сначала необходимо проверить и оптимизировать раздел с помощью e2fsck:
# e2fsck -Df /dev/путь/к/диску
Преобразовать файловую систему в 64-разрядную:
# resize2fs -b /dev/путь/к/диску
Включаем поддержку контрольных сумм:
# tune2fs -O metadata_csum /dev/путь/к/диску
Для проверки:
# dumpe2fs -h /dev/путь/к/диску | grep features:
Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
Обслуживание при использовании LVM
Утилита e2scrub проверяет метаданные файловой системы ext4, если она используется в логических томах LVM. Для этой проверки, группа томов должна иметь 256 МБ нераспределенного пространства, поскольку утилита создает снимок для проверки. Как отмечено в руководстве e2scrub(8), инструмент не исправляет ошибки, а сообщает о них и помечает файловую систему как требующую запуска e2fsck (см. e2fsck(8)) перед следующим монтированием.
Проверку можно автоматизировать, например, включив встроенный модуль e2scrub_all.timer.
Если недостаточно минимального нераспределенного пространства в 256 МБ, см. LVM#Resizing the logical volume and file system in one go.
Включение fast_commit
Функция fast_commit в ext4 представляет собой новый, более легкий метод ведения журнала. Ожидается, что она значительно повысит производительность файловой системы ext4.
Чтобы включить эту функцию в новой файловой системе, добавьте fast_commit в аргумент -O опций файловой системы.
Чтобы включить эту функцию в существующей файловой системе, выполните:
# tune2fs -O fast_commit /dev/раздел
Чтобы запросить текущую конфигурацию:
# tune2fs -l /dev/раздел | grep features
Чтобы отключить эту функцию в существующей файловой системе, выполните:
# tune2fs -O '^fast_commit' /dev/раздел
Включение режима без учета регистра
- Если функция
casefoldбыла включена, ее нельзя надежно отключить (из-за потенциальной ошибки вtune2fs). Перед включением этой функции обратите внимание на приведенные ниже ограничения! - GRUB в настоящее время не поддерживает функцию
casefoldext4; см. GRUB bug #56897. Ее включение для файловых систем, которые GRUB должен читать, приведет к тому, что система не сможет загрузиться с ошибкойunknown filesystem, даже если ни один каталог на самом деле не использует эту функцию. - Функция
casefoldнесовместима сoverlayfs, что может помешать работе контейнерного программного обеспечения, такого как Docker (Русский) или Podman, в этой файловой системе. Расширенные функции systemd (Русский), такие как образы расширений systemd-sysext(8), также могут стать недоступными.
Casefold может повысить производительность приложений и игр, запущенных в Wine (Русский). Эта функция не влияет на всю файловую систему, а только на каталоги, для которых включен атрибут нечувствительности к регистру.
Сначала включите эту функцию в файловой системе.:
# tune2fs -O casefold /dev/раздел
Включите атрибут нечувствительности к регистру, в любом каталоге:
$ chattr +F /mnt/раздел/каталог
Изменение размера файловой системы
Программа resize2fs(8) может изменять размер файловых систем ext2, ext3 или ext4. Ее можно использовать для увеличения или уменьшения размера несмонтированной файловой системы, расположенной на устройстве. Чтобы изменить размер файловой системы ext4 до определенного размера:
# resize2fs /dev/раздел размер
Если размер не указан, по умолчанию будет использоваться весь доступный на разделе.
Обязательно заранее подготовьте необходимый размер раздела (в случае увеличения) с помощью инструмента для разбиения на разделы.
Смотрите также
- Ext4 документация ядра
- Официальная вики ext4 (архив)
- Ext4 Encryption Статья LWN
- Коммиты ядра для шифрования ext4 [8] [9]
- e2fsprogs Changelog
- Ext4 Metadata Checksums
- Ext4 fast commits