ext4

Материал из Xgu.ru

Перейти к: навигация, поиск

Эта статья находится в процессе написания.
Если вы считаете, что её стоило бы доработать как можно быстрее, пожалуйста, скажите об этом.

ext4 ­— файловая система, основанная на ext3 и совместимая с ней (прямо и обратно). Отличается от ext3 поддержкой extent'ов, групп смежных физических блоков, управляемых как единое целое; повышенной скоростью проверки целостности и рядом других усовершенствований.

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

Содержание

[править] Новые возможности ext4

Новые возможности ext4 (в сравнении с ext3):

  1. Использование экстентов. В файловой системе ext3 адресация данных выполнялась традиционным образом, поблочно. Такой способ адресации становится менее эффективным с ростом размера файлов. Экстенты позволяют адресовать большое количество (до 128 MB) последовательно идущих блоков одним дескриптором. До 4х указателей на экстенты может размещаться непосредственно в inode, что достаточно для файлов маленького и среднего размера.
  2. 48-битные номера блоков. При размере блока 4K это позволяет адресовать до одного экзабайта (2^48*4KB = 2^50*1KB = 2^60 B = 1 EB).
  3. Выделение блоков группами (multiblock allocation). Файловая система хранит не только информацию о местоположении свободных блоков, но и количество свободных блоков, идущих друг за другом. При выделении места файловая система находит такой фрагмент, в который данные могут быть записаны без фрагментации. Это снижает уровень фрагментации файловой системы в целом.
  4. Отложенное выделение блоков (delayed allocation). Выделение блоков для хранения данных файла происходят непосредственно перед физической записью на диск (например, при вызове sync), а не при вызове write. В результате, операции выделения блоков можно делать не по одной, а группами, что в свою очередь минимизирует фрагментацию и ускоряет процесс выделения блоков[3]. С другой стороны, увеличивает риск потери данных в случае внезапного пропадения питания[4].
  5. Превышен лимит в 32000 каталогов. В ext3, если не использовать специальные патчи[5], в одном каталоге можно было создать не более 32000 подкаталогов (или, если быть совсем точным, до 65535 каталогов, но, только изменяя константы ядра[6]).
  6. Резервирование inode'ов при создании каталога (directory inodes reservation). При создании каталога резервируется несколько inode'ов. Впоследствии, при создании файлов в этом каталоге сначала используются зарезервированные inode'ы, и если таких не осталось, выполняется обычная процедура[7].
  7. Размер inode. Размер inode (по умолчанию) увеличен с 128 до 256 байтов. Это дало возможность реализовать те преимущества, которые перечислены ниже.
  8. Временные метки с наносекундной точностью (nanosecond timestamps). Более высокая точность времён, хранящихся в inode. Диапазон хранящихся времён тоже расширен: если раньше верхней границей хранимого времени было 18 января 2038 года, то теперь это 25 апреля 2514 года.
  9. Версия inode. В inode появился номер, который увеличивается при каждом изменении inode файла. Это будет использоваться, например, в NFSv4, для того чтобы узнавать, изменился ли файл.
  10. Хранение расширенных атрибутов в inode (EA in inode). Хранение расширенных атрибутов, таких как ACL, атрибутов SELinux и прочих, позволяет повысить производительность. Атрибуты, для которых недостаточно места в inode, хранятся в отдельном блоке размером 4KB. Предполагается снять это ограничение в будущем.
  11. Контрольное суммирование в журнале (Journal checksumming). Контрольные суммы журнальных транзакций. Позволяют лучше найти и (иногда) исправить ошибки при проверке целостности системы после сбоя.
  12. Предварительное выделение (persistent preallocation). Сейчас для того, чтобы приложению гарантированно занять место в файловой системе, оно заполняет его нулями. В ext4 появилась возможность зарезервировать множество блоков для записи и не тратить на инициализацию лишнее время. Если приложение попробует прочитать данные, оно получит сообщение о том, что они не проинициализированы. Таким образом, несанкционированно прочитать удалённые данные не получится.
  13. Дефрагментация без размонтирования (online Defragmentation). Пока не реализовано.
  14. Неинициализированные блоки (uninitialised groups). Пока не реализовано. Позволяет ускорить проверку файловой системы с помощью fsck. Блоки, отмеченные как неиспользуемые, проверяются группами, и детальная проверка производится только если проверка группы показала, что внутри есть повреждения. Предполагается, что эта возможность может очень сильно ускорить процесс проверки целостности файловой системы; в зависимости от способа размещения данных время проверки будет составлять от 1/2 до 1/10 от нынешнего.

[править] Дефрагментация

Отсутствие острой необходимости в дефрагментации файловых систем UNIX на фоне регулярной дефрагментации других популярных файловых систем укрепило системных администраторов UNIX во мнении, что фрагментации данных в их файловых системах не бывает в принципе. В действительности, она существует, хотя её влияние и не настолько существенно, как в файловых системах некоторых других архитектур. С ростом объёма файловых систем необходимость борьбы с фрагментацией становится более ощутимой.

Результаты экспериментов показали, что производительность файловых систем UNIX из-за фрагментации может снижаться достаточно сильно.

Например, в [4] был проведён следующий эксперимент: на чистую файловую систему было записано 32 файла размером 1GB каждый; сначала по очереди, потом (после пересоздания файловой систем) одновременно. За счёт параллельности процессов записи во втором случае файловая система получилась сильно фрагментированной. Различие в скорости чтения данных в первом и втором случае составило 14.8% для ext3 и 16.5% для XFS.

Виды фрагментации:

  • фрагментация отдельных файлов -- большой файл занимает блоки, разбросанные по файловой системе;
  • фрагментация связанных файлов -- файлы, читающиеся вместе, разбросаны по файловой системе;
  • фрагментация свободного места -- свободные блоки разбросаны по файловой системе.

Фрагментация может быть снижена при помощи отложенного выделения блоков, резервирования блоков и многоблочного выделения.

См. также:

[править] Существующие ограничения

Файловая система ext4 находится в состоянии развития. Её уже можно использовать для экспериментов, но пока что не рекомендуется хранить на ней ценные данные.

Основные возможности ext4, поддержка которых на сегодняшний день не включена в основной код[8]:

  • отложенное выделение блоков;
  • online-дефрагментация;
  • контрольное суммирование журнала;
  • восстановление удалённых файлов.

Среди ограничения в программах (userlevel tools), необходимых для работы с ext4, существующих на сегодняшний день [9] самая большая это — максимальный размер файловой системы не может превышать 16TB; это связано с тем, что существующая mkfs не умеет пока что работать в 64-битном режиме (но поддержка со стороны ядра есть)[10].

[править] Использование ext4

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

  • поддержка со стороны ядра
  • поддержка со стороны программ
  • при создании файловой системы с нуля используется mkfs.ext3 с ключом -E test_fs
%# mkfs.ext3 -E test_fs file.img 
  • для подготовки существующей файловой системы 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)

После того как работа с файловой системой окончена, её нужно размонтировать.

%# 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

[править] Настройка через /proc

Настройки для смонтированных файловых систем Ext4 находятся в каталоге /proc/fs/ext4/DEVICE, где DEVICE --- имя смонтированного устройства. Например, для sda5 настройки будут в каталоге /proc/fs/ext4/sda5.

Почти все настройки касаются выделения блоков группам (multiblock allocation). Файлы, которые есть в этом каталоге:

..............................................................................
mb_groups       details of multiblock allocator buddy cache of free blocks
mb_history      multiblock allocation history
stats           controls whether the multiblock allocator should start
                collecting statistics, which are shown during the unmount
group_prealloc  the multiblock allocator will round up allocation
                requests to a multiple of this tuning parameter if the
                stripe size is not set in the ext4 superblock
max_to_scan     The maximum number of extents the multiblock allocator
                will search to find the best extent
min_to_scan     The minimum number of extents the multiblock allocator
                will search to find the best extent
order2_req      Tuning parameter which controls the minimum size for 
                requests (as a power of 2) where the buddy cache is
                used
stream_req      Files which have fewer blocks than this tunable
                parameter will have their blocks allocated out of a
                block group specific preallocation pool, so that small
                files are packed closely together.  Each large file
                will have its blocks allocated out of its own unique
                preallocation pool.
.............................................................................

[править] Дополнительная информация

Нужно подчистить ссылки


[править] Примечания

  1. http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=03010a3350301baac2154fa66de925ae2981b7e3
  2. в том числе её создателем и ключевым разработчиком [1]
  3. Подробно о выделении блоков группами и отложенном выделении блоков можно почитать в [2]
  4. «Стоит ли переходить на Ext4?» — задаётся вопросом уважаемый автор означенной заметки, мотивируя свои сомнения тем, что в ext4 используется отложенное выделение блоков. В то же время аналогичные фичи есть в большинстве современных файловых систем, в частности, в ZFS и в Btrfs. С другой стороны, отключить отложенное выделение можно опцией nodelalloc
  5. Пример патча, позволяющего обойти лимит в 32000 каталогов в ext3: [3]
  6. http://starnixhacks.blogspot.com/2008/02/ext3.html
  7. Подробнее о резервировании inode'ов при создании каталога: http://lwn.net/Articles/258310/
  8. http://ext4.wiki.kernel.org/index.php/New_ext4_features
  9. http://fedoraproject.org/wiki/FedoraExt4
  10. В общем-то жить можно
Xentaur
Дисковая подсистема
Linux | FreeBSD

Диски и разделы
Файлы устройств: Блочное устройство | Символьное устройство | Raw-устройство | loop-устройство
Диски: IDE | SATA | SCSI | USB
RAID-массивы: Аппаратный RAID | Linux RAID | FreeBSD RAID
Дисковые разделы: Раздел | MBR | fdisk | parted | disklabel

Управление томами
Логический том | Физический том | Группа томов | Снимок | Клон
device-mapper | dm-ioband | dm-crypt | dm-userspace | multipath
Системы управления томами: LVM | CLVM | EVMS | Btrfs* | ZFS* | AdvFS* | Zumastor

Сетевые хранилища и репликация
Отказоустойчивость: DRBD | Xen + DRBD | ggate + gmirror
Сетевые хранилища: AoE | iSCSI | GNBD

Файловые системы
Монтирование | Проверка целостности | Дефрагментация | Суперблок | inode | Журнал | Кэш | VFS | UUID | FUSE
Локальные: ext3 | ext3cow | ext4 | JFS | Reiser4 | XFS | ZFS | Btrfs | AdvFS | ISO
Сетевые: NFS | CIFS | AFS | POHMELFS
Кластерные: GFS | OCFS2 | Lustre | VMFS

* Btrfs, ZFS и AdvFS — это файловые системы с возможностями управления томами
Источник — «http://xgu.ru/wiki/ext4»