Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

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

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

Особенности [ править ]

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

Ограничения [ править ]

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

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

Задержка выделения и потенциальная потеря данных [ править ]

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

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

  • 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». [31]

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

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

Реализация [ править ]

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

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

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

Совместимость с Windows и Macintosh [ править ]

По состоянию на 2012 год ext4 не имеет такой поддержки, как ext2 и ext3 в операционных системах, отличных от Linux. ext2 и ext3 имеют стабильные драйверы, такие как Ext2IFS , которые пока недоступны для ext4. Можно создать совместимые файловые системы ext4, отключив функцию экстентов, а иногда и указав размер inode . [35] Другой вариант использования ext4 в Windows - использовать Ext2Fsd , [36] драйвер с открытым исходным кодом, который поддерживает запись в разделы ext4 с ограниченным ведением журнала. Просмотр и копирование файлов из ext4 в Windows, даже с включенными экстентами , также возможно с помощью программного обеспечения Ext2Read . [37] Совсем недавно Paragonвыпустила свой коммерческий продукт ExtFS для Windows, который позволяет читать / писать для ext2 / 3/4.

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

См. Также [ править ]

  • Btrfs
  • Сравнение файловых систем
  • Расширенные атрибуты файла
  • e2fsprogs
  • Ext2Fsd
  • JFS
  • Список файловых систем
  • Reiser4
  • XFS
  • ZFS

Ссылки [ править ]

  1. ^ a b Ранее Linux использовал тот же GUID для разделов данных, что и Windows (раздел с базовыми данными: EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 ). В Linux никогда не было отдельного уникального GUID типа раздела, определенного для его разделов данных. Это создавало проблемы при двойной загрузке Linux и Windows в настройке UEFI-GPT. Новый GUID (данные файловой системы Linux: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 ) был определен совместно разработчиками GPT fdisk и GNU Parted. Он определяется как код типа 0x8300 в GPT fdisk. (См. Определения в gdisk parttypes.cc )
  2. ^ "DiscoverablePartitionsSpec" . freedesktop.org . Проверено 7 апреля 2018 .
  3. ^ a b "ext4: Исправить обработку расширенного tv_sec" . Linux-стабильное дерево ядра . Проверено 14 февраля 2017 года .
  4. ^ а б Матур, Авантика; Цао, Минмин; Бхаттачарья, Супарна; Дилгер, Андреас; Журавлев (Томас), Алексей; Вивье, Лоран (2007). «Новая файловая система ext4: текущее состояние и планы на будущее» (PDF) . Труды симпозиума по Linux . Оттава, Онтарио, Калифорния: Red Hat. Архивировано из оригинального (PDF) 6 июля 2010 года . Проверено 15 января 2008 года .
  5. Торвальдс, Линус (9 июня 2006 г.). "экстенты и 48-битный ext3" . Список рассылки ядра Linux .
  6. ^ Ts'o, Теодор (28 июня 2006). «Предложение и план дальнейших работ по развитию ext2 / 3» . Список рассылки ядра Linux .
  7. ^ Leemhuis, Торстен (23 декабря 2008). «Выше и дальше: нововведения Linux 2.6.28 (страница 2)» . Heise Online. Архивировано из оригинального 3 -го января 2009 года . Проверено 9 января 2010 года .
  8. ^ "ext4: переименовать ext4dev в ext4" . Дерево ядра Линуса. Архивировано из оригинального 29 мая 2012 года . Проверено 20 октября 2008 года .
  9. ^ Leemhuis, Торстен (23 декабря 2008). «Выше и дальше: нововведения Linux 2.6.28» . Heise Online.
  10. Пол, Райан (15 января 2010 г.). «Google переходит на Ext4, нанимает бывшего технического директора Linux Foundation» . Ars Technica .
  11. ^ «Android 2.3 Gingerbread для использования файловой системы Ext4» . The H Open . 14 декабря 2010 г.
  12. ^ "Файловая система в debian" . 14 сентября 2019.
  13. ^ «Переход на Ext4» . DeveloperWorks . IBM. Архивировано из оригинала на 1 декабря 2008 года . Проверено 14 декабря 2008 года .
  14. Hal Pomeranz (28 марта 2011 г.). «Понимание EXT4 (Часть 3): Деревья экстентов» . Блог по цифровой криминалистике и реагированию на инциденты SANS .
  15. ^ «Смонтировать ext4 (созданный без экстентов), поскольку ext3 не работает на RH6.2» . www.linuxquestions.org . Проверено 7 апреля 2018 .
  16. ^ «Ext4 - новички в ядре Linux» . kernelnewbies.org .
  17. ^ «Новые возможности ext4 - Ext4» . ext4.wiki.kernel.org .
  18. Прабхакаран, Виджаян; Байравасундарам, Лакшми Н .; Агравал, Нитин; Gunawi, Haryadi S .; Arpaci-Dusseau, Andrea C .; Арпачи-Дюссо, Ремзи Х. "Файловые системы IRON" (PDF) . Кафедра CS, Университет Висконсина. Cite journal requires |journal= (help)
  19. ^ «Контрольные суммы метаданных Ext4 - Ext4» . ext4.wiki.kernel.org .
  20. ^ "Linux_3.5 - новички в ядре Linux" . kernelnewbies.org .
  21. ^ Ts'o, Theodore (5 октября 2006). "Re: отметки времени создания для ext4?" .
  22. Edge, Джейк (31 марта 2017 г.). «Расширение statx ()» .
  23. Ли, Си (12 января 2016 г.). «Шифрование Ext4» .
  24. ^ Ts'o, Theodore (8 апреля 2015). «Шифрование Ext4» .
  25. ^ "Файловая система Ext4 - Thomas-Krenn-Wiki" . www.thomas-krenn.com .
  26. ^ "kernel / git / torvalds / linux.git - дерево исходных текстов ядра Linux" . git.kernel.org .
  27. ^ "Ext4 - ArchWiki" . wiki.archlinux.org .
  28. Пол, Райан (14 апреля 2009 г.). «Участники дискуссии обдумывают ядро ​​на саммите Linux Collaboration Summit» . Ars Technica . Проверено 22 августа 2009 года .
  29. ^ Теодор Ts'o (1 августа 2008). "Re: reiser4 для 2.6.27-rc1" . linux-kernel (список рассылки) . Проверено 31 декабря 2010 года .
  30. Корбет, Джонатан (11 октября 2011 г.). «Надежное удаление файлов из файловой системы ext4» .
  31. ^ a b «Документация по ext4 в исходных кодах ядра Linux» . 28 марта 2009 г.
  32. ^ Ошибка Ubuntu № 317781 Длительное обсуждение между разработчиками Ubuntu и Теодором Ц'о о потенциальной потере данных
  33. Мысли Теда, запись в блоге, 12 марта 2009 г. Запись в блоге Теодора Ц'о на эту тему.
  34. ^ Клейман
  35. ^ «Как читать Linux-раздел Ext3 / Ext4 из Windows 7 - Ubuntu Geek» . www.ubuntugeek.com . 24 сентября 2010 . Проверено 7 апреля 2018 .
  36. ^ «Проект Ext2Fsd» . Ext2fsd.com. Архивировано из оригинала 23 июля 2012 года . Проверено 15 января 2012 года .
  37. ^ «Описание совместимости Ext4 с Windows 7, 1 ноября 2009 г.» . Архивировано из оригинального 23 октября 2011 года.
  38. ^ «Доступ для записи / чтения к файлам Linux в macOS High Sierra - extFS от Paragon Software для Mac» . paragon-software.com . Проверено 7 апреля 2018 .

Внешние ссылки [ править ]

  • Документация ext4 в исходниках ядра Linux
  • Обсуждение Теодора Тсо на ext4 , 29 июня 2006 г.
  • "Интерактивная дефрагментация ext4" (материалы Оттавского Linux Symposium 2007)
  • «Новая файловая система ext4: текущее состояние и планы на будущее» (материалы Оттавского Linux Symposium 2007)
  • Журнал ядра: Ext4 завершает фазу разработки в качестве промежуточного шага к btrfs , 17 октября 2008 г.
  • «Улучшения в распределителе блоков и inode в Ext4» (материалы Оттавского Linux Symposium 2008)
  • «Ext4: следующее поколение файловой системы Ext2 / 3»
  • Ext4 (и Ext2 / Ext3) вики
  • Ext4 wiki на kernelnewbies.org
  • Родной Windows-порт Ext4 и других ФС в CROSSMETA
  • Ext2read Приложение Windows для чтения / копирования файлов ext2 / ext3 / ext4 с поддержкой экстентов и LVM2.
  • Ext2Fsd Драйвер файловой системы чтения / записи ext2 / ext3 / ext4 с открытым исходным кодом для Windows. ext4 поддерживается начиная с версии 0.50
  • Ext4fuse Драйвер ext4 с открытым исходным кодом только для чтения для FUSE . (Поддерживает Mac OS X 10.5 и новее, используя MacFuse )