ext4 (Fourth Extended File system)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 18:52, 6 декабря 2016.

ext4
Полное название Fourth extended file system
Содержимое каталога Linked list, hashed B-tree
Распределение файлов Extents/Bitmap
Сбойные блоки Table
Ограничения
Макс. размер тома

1 EiB

16 TiB (recommended)
Макс. количество файлов 4 billion (specified at filesystem creation time)
Макс. длина имени файла 255 bytes
Разрешенные символы
в именах файлов
All bytes except NUL ('\0') and '/' and the special file names "." and ".."
Особенности
Даты зарегистрирован modification (mtime), attribute modification (ctime), access (atime), delete (dtime), create (crtime)
Диапазон дат 14 December 1901 - 25 April 2514
Дата резолюции Nanosecond
Вилка No
Разрешения файловой системы [POSIX (Portable Operating System Interface for Unix)
Дедупликация данных No
Другие
Операционная система Linux
FreeBSD (read-only in kernel since version 10.1)
Mac OS X (read-only with ext4fuse, full with ExtFS)
Windows (Read/Write without journaling with ext2fsd)

ext4 (англ. Fourth Extended File system - четвёртая расширенная файловая система, сокр. ext4, или ext4fs) — журналируемая файловая система (ФС), используемая в операционных системах с ядром Linux. Основана на ФС ext3, ранее использовавшейся по умолчанию во многих дистрибутивах GNU/Linux. Отличается от ext3 поддержкой extent'ов, групп смежных физических блоков, управляемых как единое целое; повышенной скоростью проверки целостности и рядом других усовершенствований.

История создания

Ext4 — это результат эволюции Ext3, наиболее популярной файловой системы в Linux. Во многих аспектах Ext4 представляет собой больший шаг вперёд по сравнению с Ext3, чем Ext3 была по отношению к Ext2. Наиболее значительным усовершенствованием Ext3 по сравнению с Ext2 было журналирование, в то время как Ext4 предполагает изменения в важных структурах данных, таких как, например, предназначенных для хранения данных файлов. Это позволило создать файловую систему с более продвинутым дизайном, более производительную и стабильную и с обширным набором функций[1].

Первая экспериментальная реализация ext4 была написана Эндрю Мортоном и выпущена 10 октября 2006 года в виде патча к ядрам Linux версий 2.6.19-rc1-mm1 и 2.6.19-rc1-git8 .

В октябре 2008 была переименована из ext4dev в ext4, что символизирует то, что с точки зрения разработчиков она достаточно стабильна. В ядре 2.6.28 (вышедшем 25.12.2008) файловая система уже называется ext4 и считается стабильной. Файловая система ext4 рассматривается как промежуточный шаг на пути к файловой системе следующего поколения Btrfs, которая претендует на звание основной файловой системы Linux в будущем.

Характеристика

Основные изменения по сравнению с ext3:

  • увеличение максимального объёма одного раздела диска до 1 эксбибайта (260 байт) при размере блока 4 кибибайт;
  • увеличение размера одного файла до 16 тебибайт (244 байт);
  • введение механизма пространственной (extent) записи файлов, уменьшающего фрагментацию и повышающего производительность. Суть механизма заключается в том, что новая информация добавляется в конец области диска, выделенной заранее по соседству с областью, занятой содержимым файла.

Возможности ext4

  • Использование экстентов (англ. extent). В файловой системе ext3 адресация данных выполнялась традиционным образом, поблочно. Такой способ адресации становится менее эффективным с ростом размера файлов. Экстенты позволяют адресовать большое количество (до 128 MB) последовательно идущих блоков одним дескриптором. До 4х указателей на экстенты может размещаться непосредственно в inode, что достаточно для файлов маленького и среднего размера.
  • 48-и битные номера блоков. На сегодняшний день максимальный размер файловой системы Ext3 равен 16 терабайтам, а размер файла ограничен 2 терабайтами. В Ext4 добавлена 48-битная адресация блоков, что означает, что максимальный размер этой файловой системы равен одному экзабайту, и файлы могут быть размером до 16 терабайт. 1 EB (экзабайт) = 1,048,576 TB (терабайт), 1 EB = 1024 PB (петабайт), 1 PB = 1024 TB, 1 TB = 1024 GB.
  • Выделение блоков группами (англ. multiblock allocation). Файловая система хранит не только информацию о местоположении свободных блоков, но и количество свободных блоков, идущих друг за другом. При выделении места файловая система находит такой фрагмент, в который данные могут быть записаны без фрагментации. Это снижает уровень фрагментации ФС в целом.
  • Отложенное выделение блоков (англ. delayed allocation). Выделение блоков для хранения данных файла происходят непосредственно перед физической записью на диск (например, при вызове sync), а не при вызове write. В результате, операции выделения блоков можно делать не по одной, а группами, что в свою очередь минимизирует фрагментацию и ускоряет процесс выделения блоков. С другой стороны, увеличивает риск потери данных в случае внезапного пропадания питания.
  • Масштабируемость подкаталогов. В настоящий момент один каталог Ext3 не может содержать более, чем 32000 подкаталогов. Ext4 снимает это ограничение и позволяет создавать неограниченное количество подкаталогов.
  • Резервирование inode'ов при создании каталога (англ. directory inodes reservation). При создании каталога резервируется несколько inode'ов. Впоследствии, при создании файлов в этом каталоге сначала используются зарезервированные inode'ы, и если таких не осталось, выполняется обычная процедура.
  • Размер inode. Размер inode (по умолчанию) увеличен с 128 до 256 байтов. Это дало возможность реализовать те преимущества, которые перечислены ниже.
  • Временные метки с наносекундной точностью (англ. nanosecond timestamps). Точность временных меток, хранящихся в inode, повышена до наносекунд. Диапазон значений тоже расширен: у ext3 верхней границей хранимого времени было 18 января 2038 года, а у ext4 — 25 апреля 2514 года.
  • Версия inode. В inode появился номер, который увеличивается при каждом изменении inode файла. Это будет использоваться, например, в NFSv4, для того чтобы узнавать, изменился ли файл.
  • Хранение расширенных атрибутов в inode (англ. extended attributes (EA) in inode). Хранение расширенных атрибутов, таких как ACL, атрибутов SELinux и прочих, позволяет повысить производительность. Атрибуты, для которых недостаточно места в inode, хранятся в отдельном блоке размером 4KB. Предполагается снять это ограничение в будущем.
  • Контрольное суммирование в журнале (Journal checksumming). Контрольные суммы журнальных транзакций. Позволяют лучше найти и (иногда) исправить ошибки при проверке целостности системы после сбоя.
  • Режим без журналирования. Журналирование обеспечивает целостность файловой системы путём протоколирования всех происходящих на диске изменений. Но оно также вводит дополнительные накладные расходы на дисковые операции. В некоторых особых ситуациях журналирование и предоставляемые им преимущества могут оказаться излишними. Ext4 позволяет отключить журналирование, что приводит к небольшому приросту производительности.
  • Предварительное выделение (англ. persistent preallocation). Сейчас для того, чтобы приложению гарантированно занять место в файловой системе, оно заполняет его нулями. В ext4 появилась возможность зарезервировать множество блоков для записи и не тратить на инициализацию лишнее время. Если приложение попробует прочитать данные, оно получит сообщение о том, что они не проинициализированы. Таким образом, несанкционированно прочитать удалённые данные не получится.
  • Дефрагментация без размонтирования (англ. online defragmentation). Дефрагментация выполняется утилитой e4defrag, поставляемой в составе пакета e2fsprogs с 2011 года.
  • Неинициализированные блоки (англ. uninitialised groups). Возможность пока не реализована и предназначена для ускорения проверки целостности ФС утилитой fsck. Блоки, отмеченные как неиспользуемые, будут проверяться группами, и детальная проверка будет производится только если проверка группы показала наличие повреждений. Предполагается, что время проверки будет составлять от 1/2 до 1/10 от нынешнего в зависимости от способа размещения данных.
  • Прямая и обратная совместимость с ext2/ext3. Файловые системы ext2/ext3 можно монтировать как файловую систему ext4. Наоборот — монтировать файловую ext4 как ext3 — можно только в том случае, если на ext4 не используются экстенты[2].

Дефрагментация

Файловые системы в Linux изначально спроектированы так, чтобы фрагментация файлов была как можно меньше. Тем не менее, фрагментированность файлов имеет место быть, и в некоторых случаях может привести к заметному падению производительности дисковой подсистемы. Для Ext4 есть несколько дефрагментаторов:

  • e2fsprogs. Онлайн дефрагментатор из стандартного набора утилит.
  • Defrag. Дефрагментатор от Кона Коливаса. Случаются перерывы в разработке, но проект живой, в 2010 появился PPA-репозиторий: ppa:e2defrag/ppa.
  • Shake. Онлайн-дефрагментатор, PPA-репозиторий: ppa:un-brice/ppa.

e2fsprogs

  • Проверка необходимости дефрагментации:
    $ sudo e4defrag -c /dev/<xxx>
  • запуск дефрагментации:
    $ sudo e4defrag /dev/<xxx>
  • проверка результата (в последней строке вывода должно быть ⩽0.3% non-contiguous):
    $ sudo fsck -n /dev/<xxx>

Оптимизация дискового пространства

На свежесозданном разделе с Ext4 обычно выделяется заметно меньше свободного дискового пространства чем размер раздела. Это происходит потому, что используется порядка 1,8% на служебные нужды: заголовки групп блоков, бинарные поля для учета свободного места, индексные дискрипторы (i-node), основной и множество резервных копий суперблока. Также по умолчанию, дополнительно резервируется 5% от объема раздела для нужд учетной записи суперпользователя (root) и системных служб (daemons). Обычно это полезно для системного корневого раздела, но на пользовательских разделах необходимости в этом резерве нет, особенно на разделах большого размера, где 5% превращаются в очень приличные объемы (недоступные пользователю).

Изменение процента зарезервированных блоков для нужд суперпользователя

По умолчанию резервируется 5% от объема раздела или диска. Значение 0 отключает резервирование блоков, значение 5 - устанавливает резервирование на 5%.
$ sudo tune2fs -m 0 /dev/<xxx>

Изменение числа зарезервированных под служебные нужды блоков

Значение 0 отключает резервирование блоков, значение 5 - устанавливает резервирование 5-и блоков.
$ sudo tune2fs -r 0 /dev/<xxx>

Использование ext4

Для того чтобы использовать ext4, необходимо:

  • поддержка со стороны ядра
  • поддержка со стороны программ
  • при создании файловой системы с нуля используется mkfs.ext3 с ключом -E test_fs
    # mkfs.ext3 -E test_fs file.img<console> 
  • для подготовки существующей файловой системы ext3 к монтированию использовать debugfs
    # debugfs -w file.img 
debugfs 1.40 (29-Jun-2007) debugfs: set_super_value s_flags 4 debugfs: quit
  • при монтировании использовать тип файловой системы ext4dev
    # mount -t ext4dev -o loop file.img /mnt

Ниже во всех деталях описывается процесс создания файловой системы ext4.

Для примера в качестве носителя файловой системы используется обычный файл. Создание файловой системы не в файле, а на дисковом разделе происходит аналогично, с той разницей, что не нужно использовать модуль loop.

Для того чтобы использовать файловую систему ext4, необходимо чтобы в ядре

Linux была соответствующая поддержка в ядре.
# uname -a
Linux dhcp 2.6.25-2-xen-686 #1 SMP Tue May 27 17:30:39 UTC 2008 i686 GNU/Linux

# modinfo ext4dev
filename:       /lib/modules/2.6.25-2-xen-686/kernel/fs/ext4/ext4dev.ko
license:        GPL
description:    Fourth Extended Filesystem with extents
author:         Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others
depends:        mbcache,jbd2,crc16
vermagic:       2.6.25-2-xen-686 SMP mod_unload 686

Модуль ядра, который отвечает за поддержку ext4, называется ext4dev.

Создаём пустой файл размером 100MB,

который чуть позже будет форматироваться под ext4.
# dd if=/dev/zero of=file.img count=100 bs=1024k
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.43877 seconds, 239 MB/s
Создаём обычную файловую систему ext3:
# mkfs.ext3 file.img 
mke2fs 1.40 (29-Jun-2007)
file.img is not a block special device.
Proceed anyway? (y,n) y
...

После того как файловая система создана, можно попробовать её подмонтировать. Поскольку мы создавали файловую систему в файле, а не на блочном устройстве, для того чтобы смонтировать её, файл нужно связать с loopback-устройством.

Это можно сделать или при помощи команды losetup или просто, использовав опцию loop при монтировании.

# mount -t ext4dev -o loop file.img /mnt

Если при выполнении команды возникает ошибка, в которое сообщается о проблемах с устройством /dev/loop, возможно, у вас просто не загружен модуль loop или не установлен udev:

# mount -t ext4dev -o loop file.img /mnt
mount: could not find any device /dev/loop#

# modprobe loop
[   11.636764] loop: module loaded

# mount -t ext4dev -o loop file.img /mnt
mount: could not find any device /dev/loop#

# apt-get install udev

Может возникнуть и другая ошибка, которая имеет непосредственное отношение

к файловой системе ext4.
# mount -t ext4dev -o loop file.img /mnt
[   14.531109] EXT4-fs: loop0: not marked OK to use with test code.

Модуль файловой системы ext4 ядра Linux сообщает о том, что файловая система не помечена как ext4. Проверка добавлена скорее из психологических чем технических побуждений — чтобы файловые системы ext3 не смонтировали случайно как ext4.

Добавить пометку, извещающую систему о том, что файловую систему можно смело монтировать как ext4

можно так:
# debugfs -w file.img 
debugfs 1.40 (29-Jun-2007)
debugfs:  
debugfs:  set_super_value s_flags 4 
debugfs:  quit 

Вообще, можно было попросить ставить пометку ещё при создании файловой системы.

Для этого нужно было использовать ключ -E test_fs:
# mkfs.ext3 -E test_fs file.img 
Тип файловой системы, указываемый при монтировании: ext4dev.
# mount -t ext4dev -o loop file.img /mnt
[   16.769093] kjournald2 starting.  Commit interval 5 seconds
[   16.769093] EXT4 FS on loop0, internal journal
[   16.769093] EXT4-fs: mounted filesystem with ordered data mode.
[   16.769093] EXT4-fs: file extents enabled
[   16.769093] EXT4-fs: mballoc enabled
Файловая система успешно смонтирована:
# mount
/dev/xvda1 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
nfsd on /proc/fs/nfsd type nfsd (rw)
rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/root/file.img on /mnt type ext4dev (rw,loop=/dev/loop0)

После того как работа с файловой системой окончена,

её нужно размонтировать[2].
# umount /mnt
[   16.974054] EXT4-fs: mballoc: 0 blocks 0 reqs (0 success)
[   16.974070] EXT4-fs: mballoc: 0 extents scanned, 0 goal hits, 0 2^N hits, 0 breaks, 0 lost
[   16.974075] EXT4-fs: mballoc: 0 generated and it took 0
[   16.974085] EXT4-fs: mballoc: 0 preallocated, 0 discarded

Поддержка в операционных системах

  • coLinux — технология, позволяющая запустить ядро Linux под управлением ОС Windows. Возможен доступ к томам с ФС ext2/ext3/ext4.
  • Ext2read — программа, предоставляющая доступ к ФС ext2/ext3/ext4 и LVM2, но в режиме только для чтения, с интерфейсом, напоминающим проводник Windows.
  • Ext2Fsd — экспериментальный драйвер, добавляющий поддержку ФС ext2/ext3/ext4 для ОС Windows. Драйвер поддерживает не все возможности ФС.
  • Paragon ExtFS for Windows — бесплатное для личного пользования проприетарное ПО, предоставляющее доступ к ФС ext2/ext3/ext4 для чтения и записи.

Поддержка ext4 в дистрибутивах Linux

  • Ubuntu:
    • 9.04: ext4 доступна для выбора по желанию пользователя;
    • 9.10+: ext4 стала ФС по умолчанию.
  • Debian:
    • 6.0: ext4 доступна для выбора по желанию пользователя;
    • 7.0+: ext4 предлагается, как ФС по умолчанию.
  • Fedora:
    • >=9: ext4 доступна для выбора по желанию пользователя;
    • 11+: ext4 — ФС по умолчанию.
  • Sabayon Linux:
    • 3.5 Loop 3+: ext4 доступна.
  • ArchLinux.
  • Slackware.
  • OpenSUSE:
    • 11.2+: ext4 — ФС по умолчанию.
  • Mandriva Linux:
    • 2010+: ext4 — ФС по умолчанию.
  • Red Hat Enterprise Linux:
    • 6+: ext4 — ФС по умолчанию.
  • PCLinuxOS:
    • 2010+: ext4 — ФС по умолчанию.
  • Android:
    • 2.3+: ext4 доступна.
  • AgiliaLinux:
    • ext4 — ФС по умолчанию[3].

Примечания

  1. Хабрахабр [Электронный ресурс]: Особенности Ext4 / Дата обращения: 05.12.2016. — Режим доступа: https://habrahabr.ru/post/58183/.
  2. 2,0 2,1 Xgu [Электронный ресурс]: ext4 / Дата обращения: 05.12.2016. — Режим доступа: http://xgu.ru/wiki/ext4.
  3. Википедия [Электронный ресурс] : ext4 — Материал из Википедии — свободной энциклопедии: — Режим доступа: https://ru.wikipedia.org/wiki/Ext4#.D0.9F.D0.BE.D0.B4.D0.B4.D0.B5.D1.80.D0.B6.D0.BA.D0.B0_ext4_.D0.B2_.D0.B4.D0.B8.D1.81.D1.82.D1.80.D0.B8.D0.B1.D1.83.D1.82.D0.B8.D0.B2.D0.B0.D1.85_Linux.

Ссылки