Ext4 (Русский)

Ссылки по теме
Файловые системы
Ext3
Ext4
— это усовершенствованная версия самой популярной файловой системы Linux, Ext3. Во многих отношениях Ext4 — это более глубокая переработка Ext3, чем Ext3 была переработкой Ext2. Ext3 в основном представляла собой добавление журналирования в Ext2, но в Ext4 были изменены важные структуры данных файловой системы, в том числе те, которые предназначены для хранения данных. В результате появилась файловая система с улучшенной архитектурой, более высокой производительностью, надёжностью и функциональностью.
Создание файловой системы
Установите
e2fsprogs
.
Чтобы отформатировать раздел, выполните:
# mkfs.ext4 /dev/
раздел
Дополнительные возможности см. в разделе
mke2fs(8)
.
Совет
Чтобы просмотреть/настроить параметры mke2fs по умолчанию, отредактируйте
/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 (только те, которые не изменяют формат диска, такие как многоблочное выделение и отложенное выделение).)
Примечание
За исключением относительной новизны ext4 (что можно рассматривать как риск), в этой технологии нет существенных недостатков.
Процесс
Отредактируйте
/etc/fstab
и измените «тип» с ext2/ext3 на ext4 для всех разделов, которые необходимо смонтировать как ext4.
Заново смонтируйте соответствующие разделы.
Преобразование разделов ext2/ext3 в ext4
Обоснование
Чтобы воспользоваться всеми преимуществами ext4, необходимо выполнить необратимый процесс преобразования.
Плюсы:
Улучшенная производительность и новые функции.
[3]
[4]
Минусы:
Разделы, которые содержат в основном статические файлы, такие как раздел
/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
может быть использована сверху для «автоматического восстановления».
Рекомендуется: смонтировать раздел и запустить
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/sd
Xn
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 в настоящее время не поддерживает функцию
casefold
ext4; см.
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