ext4 - ext4

ext4
Разработчики) Мингмин Цао, Андреас Дилгер, Алекс Журавлев (Томас), Дэйв Клейкамп, Теодор Тсо , Эрик Сандин, Сэм Нагшинех и другие
ФИО Четвертая расширенная файловая система
Введено с Linux 2.6.28, 2.6.19
Идентификатор раздела 0x83 : MBR / EBR .

EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 : GPT Windows BDP .
0FC63DAF-8483-4772-8E79-3D69D8477DE4 : данные файловой системы Linux GPT .
933AC7E1-2EB4-4F13-B844-0E14E2AEF915 : GPT / домашний раздел.

3B8F8425-20E0-4F3B-907F-1A25A76F98E8 : раздел GPT / srv (данные сервера).
Структуры
Содержимое каталога Связанный список , хешированное B-дерево
Размещение файлов Экстенты / растровое изображение
Плохие блоки Таблица
Пределы
Максимум. размер тома 1 EiB (для блока размером 4 KiB)
Максимум. размер файла 16 ТиБ (для блока размером 4 КиБ)
Максимум. количество файлов 4 миллиарда (указано при создании файловой системы)
Максимум. длина имени файла 255 байт
Допустимые символы в именах файлов Все байты, кроме NUL ('\ 0') и '/' и специальных имен файлов "." и «..», которые не запрещены, но всегда используются для соответствующей специальной цели.
Функции
Даты записаны модификация (mtime), модификация атрибута (ctime), доступ (atime), удаление (dtime), создание (crtime)
Диапазон дат 14 декабря 1901 г. - 10 мая 2446 г.
Разрешение даты Наносекунда
Вилки Нет
Атрибуты acl, bh, bsddf, commit = nrsec, data = journal, data = orders, data = writeback, delalloc, extents, journal_dev, mballoc, minixdf, noacl, nobh, nodelalloc, noextents, nomballoc, nombcache, nouser_xattr, oldalloc, orlov , user_xattr
Разрешения файловой системы POSIX , POSIX ACL
Прозрачное сжатие Нет
Прозрачное шифрование да
Дедупликация данных Нет
Другой
Поддерживаемые операционные системы

Ext4 журнальной файловой системы или четвертой расширенной файловой системы является журнальной файловой системы для Linux , разработанный как преемник ext3 .

ext4 изначально была серией расширений с обратной совместимостью для ext3, многие из которых изначально были разработаны Cluster File Systems для файловой системы Lustre в период с 2003 по 2006 год, чтобы расширить пределы хранилища и добавить другие улучшения производительности. Однако другие разработчики ядра Linux выступили против принятия расширений ext3 по соображениям стабильности и предложили разветвить исходный код ext3, переименовать его в ext4 и выполнить всю разработку там, не затрагивая существующих пользователей ext3. Это предложение было принято, и 28 июня 2006 г. Теодор Ц'о , сопровождающий ext3, объявил о новом плане развития ext4.

Предварительная разрабатываемая версия ext4 была включена в ядро ​​Linux версии 2.6.19. 11 октября 2008 г. патчи, помечающие ext4 как стабильный код, были объединены в репозитории исходного кода Linux 2.6.28, обозначая конец фазы разработки и рекомендуя внедрение ext4. Ядро 2.6.28, содержащее файловую систему ext4, было наконец выпущено 25 декабря 2008 года. 15 января 2010 года Google объявил, что он обновит свою инфраструктуру хранения с ext2 до ext4. 14 декабря 2010 года Google также объявил, что будет использовать ext4 вместо YAFFS на Android 2.3 .

Принятие

ext4 - это файловая система по умолчанию для многих дистрибутивов Linux, включая Debian и Ubuntu .

Функции

Большая файловая система
Файловая система ext4 может поддерживать тома размером до 1 эксбибайта (EiB) и отдельные файлы размером до 16 tebibytes (TiB) со стандартным размером блока 4 KiB . Максимальный размер файла, каталога и файловой системы увеличивается, по крайней мере, пропорционально размеру блока файловой системы до максимального размера блока в 64 КиБ, доступного на процессорах ARM и PowerPC / Power ISA .
Экстенты
Экстенты заменяют традиционную схему блочного отображения , используемую ext2 и ext3. Экстент - это диапазон смежных физических блоков, повышающий производительность при работе с большими файлами и уменьшающий фрагментацию. Один экстент в ext4 может отображать до 128  Мбайт непрерывного пространства с размером блока 4 КиБ. Непосредственно в индексном дескрипторе может храниться четыре экстента . Если в файле более четырех экстентов, остальные экстенты индексируются в дереве .
Обратная совместимость
ext4 обратно совместима с ext3 и ext2 , что позволяет монтировать ext3 и ext2 как ext4. Это немного повысит производительность, поскольку некоторые новые функции реализации ext4 также могут использоваться с ext3 и ext2, например, новый алгоритм распределения блоков, не влияя на формат на диске.
ext3 частично совместима с ext4. Практически, ext4 не будет монтировать как ext3 , из коробки, если некоторые новые функции отключены при его создании, например ^extent , ^flex_bg , ^huge_file , ^uninit_bg , ^dir_nlink , и ^extra_isize .
Постоянное предварительное выделение
ext4 может предварительно выделить место на диске для файла. Для этого в большинстве файловых систем при создании файла в файл записываются нули. В ext4 (и некоторых других файловых системах, таких как XFS ) можно fallocate() использовать новый системный вызов в ядре Linux. Выделенное пространство будет гарантированным и, вероятно, непрерывным. В этой ситуации есть приложения для потоковой передачи мультимедиа и базы данных.
Отложенное распределение
ext4 использует технику повышения производительности, называемую распределением при сбросе , также известную как отложенное выделение . То есть ext4 задерживает выделение блоков до тех пор, пока данные не будут сброшены на диск; Напротив, некоторые файловые системы выделяют блоки немедленно, даже когда данные попадают в кэш записи. Отложенное выделение повышает производительность и снижает фрагментацию за счет эффективного распределения больших объемов данных за раз.
Неограниченное количество подкаталогов
ext4 не ограничивает количество подкаталогов в одном каталоге, за исключением внутреннего ограничения размера самого каталога. (В ext3 каталог может иметь не более 32000 подкаталогов.) Чтобы обеспечить более крупные каталоги и обеспечить непрерывную производительность, ext4 в Linux 2.6.23 и более поздних версиях по умолчанию включает индексы HTree (специализированная версия B-дерева ), что позволяет каталогам в двухуровневом индексе HTree может храниться до 10–12 миллионов записей и ограничение на размер каталога 2 ГБ для блока размером 4 КиБ, в зависимости от длины имени файла. В Linux 4.12 и более поздних версиях эта largedir функция включала трехуровневое HTree и каталог размером более 2 ГБ, что позволяет размещать около 6 миллиардов записей в одном каталоге.
Контрольные суммы журнала
ext4 использует контрольные суммы в журнале для повышения надежности, поскольку журнал является одним из наиболее часто используемых файлов на диске. У этой функции есть побочное преимущество: она позволяет безопасно избежать ожидания дискового ввода-вывода во время ведения журнала, немного улучшая производительность. Контрольная сумма журнала была основана на исследовательской статье Университета Висконсина под названием « Файловые системы IRON» (в частности, раздел 6, называемый «контрольные суммы транзакций»), с изменениями в реализации составных транзакций, выполняемых файловой системой IRON (первоначально предложенной Сэмом. Нагшин на вершине RedHat).
Контрольная сумма метаданных
Поскольку ядро ​​Linux 3.5 выпущено в 2012 году
Более быстрая проверка файловой системы
В ext4 нераспределенные группы блоков и разделы таблицы inode помечены как таковые. Это позволяет e2fsck полностью их пропускать и значительно сокращает время, необходимое для проверки файловой системы. Linux 2.6.24 реализует эту функцию.
Временная зависимость fsck от количества inode ( ext3 vs. ext4)
Многоблочный распределитель
Когда ext3 присоединяется к файлу, он вызывает распределитель блоков один раз для каждого блока. Следовательно, если существует несколько одновременных записывающих устройств, файлы на диске могут легко фрагментироваться . Однако ext4 использует отложенное выделение, что позволяет буферизовать данные и выделять группы блоков. Следовательно, многоблочный распределитель может сделать лучший выбор при размещении файлов на диске непрерывно . Многоблочный распределитель также может использоваться, когда файлы открываются в режиме O_DIRECT. Эта функция не влияет на формат диска.
Улучшенные временные метки
По мере того, как компьютеры в целом становятся быстрее и Linux все больше используется для критически важных приложений, детализация временных меток на основе секунд становится недостаточной. Чтобы решить эту проблему, ext4 предоставляет временные метки, измеряемые в наносекундах . Кроме того, 2 бита расширенного поля временной метки добавляются к наиболее значимым битам поля секунд временных меток, чтобы отложить проблему 2038 года еще на 408 лет.
ext4 также добавляет поддержку отметок времени создания. Но, как указывает Теодор Ц'о , хотя добавить дополнительное поле даты создания в индексный дескриптор (таким образом, технически обеспечивая поддержку этих меток времени в ext4) легко, сложнее изменить или добавить необходимые системные вызовы , например stat () (для которого, вероятно, потребуется новая версия) и различные библиотеки, которые от них зависят (например, glibc ). Эти изменения потребуют согласования многих проектов. Следовательно, дата создания, хранящаяся в ext4, в настоящее время доступна только для пользовательских программ в Linux через statx() API.
Квоты проекта
Поддержка квот проектов была добавлена ​​в ядро ​​Linux 4.4 8 января 2016 г. Эта функция позволяет назначать ограничения дисковой квоты для определенного идентификатора проекта. Идентификатор проекта файла - это 32-битное число, которое хранится в каждом файле и наследуется всеми файлами и подкаталогами, созданными в родительском каталоге с назначенным идентификатором проекта. Это позволяет назначать ограничения квот для определенного дерева подкаталогов независимо от прав доступа к файлу, например квот пользователей и проектов, которые зависят от UID и GID. Хотя это похоже на квоту каталога, основное отличие состоит в том, что один и тот же идентификатор проекта может быть назначен нескольким каталогам верхнего уровня и не является строго иерархическим.
Прозрачное шифрование
Поддержка прозрачного шифрования была добавлена ​​в ядро ​​Linux 4.1 в июне 2015 года.
Ленивая инициализация
Функция lazyinit позволяет очищать таблицы inode в фоновом режиме, ускоряя инициализацию при создании новой файловой системы ext4. Он доступен с 2010 года в версии ядра Linux 2.6.37.
Пишите барьеры
ext4 по умолчанию включает барьеры записи. Это гарантирует, что метаданные файловой системы правильно записаны и упорядочены на диске, даже когда кеши записи теряют мощность. Это связано со снижением производительности, особенно для приложений, которые активно используют fsync или создают и удаляют множество небольших файлов. Для дисков с кэшем записи с резервным питанием от батареи отключение барьеров (параметр «барьер = 0») может безопасно повысить производительность.

Ограничения

В 2008 году главный разработчик файловых систем ext3 и ext4, Теодор Ц'о , заявил, что, хотя ext4 имеет улучшенные функции, это не является большим достижением, он использует старую технологию и является временной мерой . Ц'о считает, что Btrfs - лучшее направление, потому что «предлагает улучшения в масштабируемости, надежности и простоте управления». У Btrfs также есть «ряд тех же дизайнерских идей, что и у reiser3 / 4 ». Однако ext4 продолжает получать новые функции, такие как шифрование файлов и контрольные суммы метаданных.

Файловая система ext4 не учитывает атрибут файла «безопасное удаление» , который должен вызывать перезапись файлов при удалении. Патч для реализации безопасного удаления был предложен в 2011 году, но не решил проблему попадания конфиденциальных данных в журнал файловой системы.

Отложенное распределение и потенциальная потеря данных

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

Типичный сценарий, в котором это может произойти, - программа, заменяющая содержимое файла без принудительной записи на диск с помощью fsync . Существует два распространенных способа замены содержимого файла в системах Unix:

  • fd=open("file", O_TRUNC); write(fd, data); close(fd);
В этом случае существующий файл обрезается во время открытия (из-за O_TRUNC флага), затем записываются новые данные. Поскольку запись может занять некоторое время, есть вероятность потери содержимого даже с ext3, но обычно очень небольшая. Однако, поскольку ext4 может задерживать запись файловых данных на долгое время, эта возможность намного больше.
Могут возникнуть несколько проблем:
  1. Если запись не удалась (что может быть связано с ошибочными условиями в программе записи или из-за внешних условий, таких как полный диск), то и исходная версия, и новая версия файла будут потеряны, а файл может быть поврежден, потому что была написана только его часть.
  2. Если другие процессы обращаются к файлу во время его записи, они видят поврежденную версию.
  3. Если другие процессы открывают файл и не ожидают изменения его содержимого, эти процессы могут аварийно завершить работу. Одним из ярких примеров является файл общей библиотеки, который отображается в запущенные программы.
Из-за этих проблем часто следующая идиома предпочтительнее приведенной выше:
  • fd=open("file.new"); write(fd, data); close(fd); rename("file.new", "file");
Создается новый временный файл («file.new»), который изначально содержит новое содержимое. Затем новый файл переименовывается поверх старого. Замена файлов rename() вызовом гарантированно атомарна по стандартам POSIX - то есть либо остается старый файл, либо он перезаписывается новым. Поскольку режим «упорядоченного» журналирования ext3 по умолчанию гарантирует, что данные файла записываются на диск до метаданных, этот метод гарантирует, что на диске будет сохраняться либо старое, либо новое содержимое файла. Отложенное выделение ext4 нарушает это ожидание, потому что запись файла может быть отложена на долгое время, а переименование обычно выполняется до того, как новое содержимое файла достигнет диска.

Использование fsync() более часто , чтобы уменьшить риск для ext4 может привести к потере производительности на ext3 файловых систем смонтировано с data=ordered флагом (по умолчанию в большинстве дистрибутивов Linux). Учитывая, что обе файловые системы будут использоваться в течение некоторого времени, это усложняет задачу разработчикам приложений для конечных пользователей. В ответ ext4 в ядрах Linux 2.6.30 и новее обнаруживает возникновение этих общих случаев и принудительно распределяет файлы немедленно. За небольшую плату в производительности это обеспечивает семантику, аналогичную упорядоченному режиму ext3, и увеличивает вероятность того, что любая версия файла переживет сбой. Это новое поведение включено по умолчанию, но его можно отключить с помощью параметра монтирования «noauto_da_alloc».

Новые патчи стали частью основной ветки ядра 2.6.30, но различные дистрибутивы решили перенести их на 2.6.28 или 2.6.29.

Эти патчи не предотвращают полностью потенциальную потерю данных или вообще не помогают с новыми файлами. Единственный способ обезопасить себя - это написать и использовать программное обеспечение, которое работает fsync() тогда, когда это необходимо. Проблемы с производительностью можно свести к минимуму, ограничив критически важные записи на диск, которые должны fsync() выполняться реже.

Выполнение

Упрощенная структура ядра Linux: ext4 реализована между виртуальной файловой системой ядра Linux и общим блочным слоем.

Виртуальная файловая система ядра Linux - это подсистема или уровень внутри ядра Linux. Это результат очень серьезной попытки объединить несколько файловых систем в единую упорядоченную структуру. Ключевая идея, восходящая к новаторской работе, проделанной сотрудниками Sun Microsystems в 1986 году, состоит в том, чтобы абстрагироваться от той части файловой системы, которая является общей для всех файловых систем, и поместить этот код на отдельный уровень, который вызывает лежащий в основе конкретный файл. системы для фактического управления данными.

Все системные вызовы, относящиеся к файлам (или псевдофайлам), направляются в виртуальную файловую систему ядра Linux для начальной обработки. Эти вызовы, исходя из пользовательских процессов, стандартные вызовы POSIX, такие как open , read , write , lseek и т.д.

Совместимость с Windows и Macintosh

В настоящее время ext4 полностью поддерживает операционные системы, отличные от Linux.

Windows может получить доступ к ext4, так как Windows 10 Insider Preview Build 20211. Это возможно благодаря подсистеме Windows для Linux (WSL), которая была представлена ​​в юбилейном обновлении Windows 10 (версия 1607) 2 августа 2016 года. WSL доступен только в 64-разрядных версиях. Windows 10 версии 1607. Он также доступен в Windows Server 2019. Большие изменения в архитектуре WSL произошли с выпуском WSL 2 12 июня 2019 года. WSL 2 требует Windows 10 версии 1903 или выше, со сборкой 18362 или выше, для систем x64 и версии 2004 или выше, со сборкой 19041 или выше, для систем ARM64.

Paragon предлагает свой коммерческий продукт Linux File Systems для Windows, который позволяет читать / писать для ext2 / 3/4 в Windows 7 SP1 / 8 / 8.1 / 10 и Windows Server 2008 R2 SP1 / 2012/2016.

macOS имеет полную возможность чтения-записи ext2 / 3/4 через extFS для Mac от Paragon Software, который является коммерческим продуктом. Бесплатное программное обеспечение, такое как ext4fuse, имеет поддержку только для чтения с ограниченной функциональностью.

Смотрите также

Рекомендации

Внешние ссылки