ext4

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

Перейти к: навигация, поиск
stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

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


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

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

Содержание

[править] Новые возможности 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). Реализовано в самой последней версии e2fsprogs. (~/misc/e4defrag)
  14. Неинициализированные блоки (uninitialised groups). Пока не реализовано. Позволяет ускорить проверку файловой системы с помощью fsck. Блоки, отмеченные как неиспользуемые, проверяются группами, и детальная проверка производится только если проверка группы показала, что внутри есть повреждения. Предполагается, что эта возможность может очень сильно ускорить процесс проверки целостности файловой системы; в зависимости от способа размещения данных время проверки будет составлять от 1/2 до 1/10 от нынешнего.
  15. Обратная совместимость с ext2/ext3. Файловые системы ext2/ext3 можно монтировать как файловую систему ext4. Наоборот — монтировать файловую ext4 как ext3 — можно только в том случае, если на ext4 не используются экстенты (учитывая, что это главная фича ext4, этого практически никогда не бывает).

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

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

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

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

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

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

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

Однако стоит понимать, что при использовании SSD вместо HDD фрагментация никак не влияет на производительность операций чтения/записи (для операций записи это корректно при достаточном количестве свободного пространства на разделе и поддержке накопителем опции TRIM).

См. также:

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

Файловая система 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.
.............................................................................

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

Cleanup.png

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


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

  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 (SATA hotplug) | SCSI | USB
RAID-массивы: Аппаратный RAID | Linux RAID | FreeBSD RAID
Дисковые разделы: Раздел | MBR | fdisk | parted | disklabel | GPT

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

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

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

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