ext4 изначально была серией обратно совместимых расширений для ext3, многие из которых изначально были разработаны Cluster File Systems для файловой системы Lustre между 2003 и 2006 годами, чтобы расширить пределы хранения и добавить другие улучшения производительности. [4] Однако другие разработчики ядра Linux выступили против принятия расширений для ext3 по соображениям стабильности, [5] и предложили разветвить исходный код ext3, переименовать его в ext4 и выполнять всю разработку там, не затрагивая существующих пользователей ext3. Это предложение было принято, и 28 июня 2006 года Теодор Цо , сопровождающий ext3, объявил о новом плане разработки для ext4. [6]
Предварительная версия разработки ext4 была включена в версию 2.6.19 [7] ядра Linux. 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 может поддерживать тома размером в теории до 64 зебибайт (ЗиБ) и отдельные файлы размером до 16 тебибайт (ТиБ) со стандартным размером блока 4 КиБ , а также тома размером до 1 йобибайта (ЙиБ) с кластерами 64 КиБ , хотя ограничение в формате экстента делает практическим пределом 1 эксбибайт (ЭиБ) . [13] Максимальные ограничения на размер файла, каталога и файловой системы растут как минимум пропорционально размеру блока файловой системы вплоть до максимального размера блока 64 КиБ, доступного на процессорах ARM и PowerPC / Power ISA .
Экстенты
Экстенты заменяют традиционную схему отображения блоков , используемую ext2 и ext3. Экстент — это ряд смежных физических блоков, что повышает производительность больших файлов и снижает фрагментацию. Один экстент в ext4 может отображать до 128 МиБ непрерывного пространства с размером блока 4 КиБ. [4] Непосредственно в inode может храниться четыре экстента . Если в файле больше четырех экстентов, остальные экстенты индексируются в дереве . [ 14]
Обратная совместимость
ext4 обратно совместима с ext3 и ext2 , что позволяет монтировать ext3 и ext2 как ext4. Это немного улучшит производительность, поскольку некоторые новые функции реализации ext4 также могут использоваться с ext3 и ext2, например, новый алгоритм распределения блоков, не влияя на формат на диске. [15]
ext3 частично совместима с ext4. Фактически, ext4 не будет монтироваться как файловая система ext3 из коробки, если только при ее создании не будут отключены некоторые новые функции, такие как ^extent, ^flex_bg, ^huge_file, ^uninit_bg, ^dir_nlink, и ^extra_isize. [16]
Постоянное предварительное распределение
ext4 может предварительно выделять дисковое пространство для файла. Чтобы сделать это в большинстве файловых систем, при создании файла в него будут записаны нули. В ext4 (и некоторых других файловых системах, таких как XFS ) fallocate()можно использовать новый системный вызов в ядре Linux. Выделенное пространство будет гарантированным и, скорее всего, непрерывным. Такая ситуация имеет приложения для потоковой передачи мультимедиа и баз данных. [ необходима цитата ]
Отсроченное распределение
ext4 использует технологию производительности, называемую allocate-on-flush , также известную как отложенное распределение . То есть ext4 откладывает распределение блоков до тех пор, пока данные не будут сброшены на диск; напротив, некоторые файловые системы выделяют блоки немедленно, даже когда данные попадают в кэш записи. Отложенное распределение повышает производительность и снижает фрагментацию за счет эффективного выделения больших объемов данных за раз. [ необходима цитата ]
Неограниченное количество подкаталогов
ext4 не ограничивает количество подкаталогов в одном каталоге, за исключением внутреннего ограничения размера самого каталога. (В ext3 каталог может иметь не более 32 000 подкаталогов.) [17] [ устаревший источник ] Чтобы обеспечить более крупные каталоги и постоянную производительность, ext4 в Linux 2.6.23 и более поздних версиях по умолчанию включает индексы HTree (специализированную версию B-дерева ), что позволяет хранить каталоги примерно до 10–12 миллионов записей в 2-уровневом индексе HTree и ограничение размера каталога 2 ГБ для размера блока 4 КиБ, в зависимости от длины имени файла. В Linux 4.12 и более поздних версиях эта функция включала 3-уровневый HTree и размеры каталогов более 2 ГБ, что позволяло хранить примерно 6 миллиардов записей в одном каталоге.large_dir
Контрольные суммы журнала
ext4 использует контрольные суммы [18] в журнале для повышения надежности, поскольку журнал является одним из наиболее используемых файлов на диске. Эта функция имеет побочное преимущество: она может безопасно избегать ожидания ввода-вывода на диске во время журналирования, немного повышая производительность. Контрольные суммы журнала были вдохновлены исследовательской статьей из Университета Висконсина под названием IRON File Systems [ 19] с изменениями в реализации составных транзакций, выполняемых файловой системой IRON (первоначально предложенной Сэмом Нагшинехом на саммите RedHat).
Контрольная сумма метаданных
С момента выхода ядра Linux 3.5 в 2012 году. [20] [21]
Более быстрая проверка файловой системы
В ext4 нераспределенные группы блоков и разделы таблицы инодов помечаются как таковые. Это позволяет e2fsck полностью их пропускать и значительно сокращает время проверки файловой системы. Linux 2.6.24 реализует эту функцию. [ необходима цитата ]
Многоблочный распределитель
Когда ext3 добавляет файл, он вызывает распределитель блоков, один раз для каждого блока. Следовательно, если есть несколько параллельных записывающих устройств, файлы могут легко стать фрагментированными на диске. Однако ext4 использует отложенное распределение, что позволяет ему буферизировать данные и выделять группы блоков. Следовательно, многоблочный распределитель может делать лучший выбор при выделении файлов последовательно на диске. Многоблочный распределитель также может использоваться, когда файлы открываются в режиме O_DIRECT. Эта функция не влияет на формат диска.
Улучшенные временные метки
По мере того, как компьютеры в целом становятся быстрее, а Linux все больше используется для критически важных приложений, гранулярность секундных меток времени становится недостаточной. Чтобы решить эту проблему, ext4 предоставляет временные метки, измеряемые в наносекундах . Кроме того, 2 бита расширенного поля временной метки добавляются к наиболее значимым битам поля секунд временных меток, чтобы отложить проблему 2038 года еще на 408 лет. [3]
ext4 также добавляет поддержку временных меток времени создания. Но, как отмечает Теодор Цо , хотя легко добавить дополнительное поле даты создания в inode (тем самым технически включив поддержку этих временных меток в ext4), сложнее изменить или добавить необходимые системные вызовы , такие как stat() (что, вероятно, потребует новой версии) и различные библиотеки , которые зависят от них (например, glibc ). Эти изменения потребуют координации многих проектов. [22] Поэтому дата создания, сохраненная ext4, в настоящее время доступна только пользовательским программам в Linux через statx()API. [23]
Проектные квоты
Поддержка проектных квот была добавлена в ядро Linux 4.4 8 января 2016 года. Эта функция позволяет назначать ограничения дисковых квот для конкретного идентификатора проекта. Идентификатор проекта файла представляет собой 32-битное число, хранящееся в каждом файле, и наследуется всеми файлами и подкаталогами, созданными в родительском каталоге с назначенным идентификатором проекта. Это позволяет назначать ограничения квот для конкретного дерева подкаталогов независимо от прав доступа к файлу, таких как квоты пользователя и проекта, которые зависят от UID и GID. Хотя это похоже на квоту каталога, основное отличие заключается в том, что один и тот же идентификатор проекта может быть назначен нескольким каталогам верхнего уровня и не является строго иерархическим. [24]
Прозрачное шифрование
Поддержка прозрачного шифрования была добавлена в ядро Linux 4.1 в июне 2015 года. [25]
Ленивая инициализация
Функция lazyinit позволяет очищать таблицы inode в фоновом режиме, ускоряя инициализацию при создании новой файловой системы ext4. [26] Она доступна с 2010 года в ядре Linux версии 2.6.37. [27]
Написать барьеры
ext4 включает барьеры записи по умолчанию. Это гарантирует, что метаданные файловой системы правильно записаны и упорядочены на диске, даже когда кэши записи теряют питание. Это идет со стоимостью производительности, особенно для приложений, которые интенсивно используют fsync или создают и удаляют много мелких файлов. Для дисков с кэшем записи с резервным питанием от батареи отключение барьеров (опция 'barrier=0') может безопасно повысить производительность. [28]
Ограничения
В 2008 году главный разработчик файловых систем ext3 и ext4 Теодор Цо заявил, что хотя ext4 и имеет улучшенные функции, это не является крупным шагом вперед, она использует старую технологию и является временной мерой. Цо считает, что Btrfs — лучшее направление, поскольку «она предлагает улучшения в масштабируемости, надежности и простоте управления». [29] Btrfs также имеет «ряд тех же идей дизайна, что и reiser3 / 4 ». [30] Однако ext4 продолжает получать новые функции, такие как шифрование файлов и контрольные суммы метаданных.
Файловая система ext4 не учитывает атрибут файла "безопасное удаление" , который должен вызывать перезапись файлов при удалении. Патч для реализации безопасного удаления был предложен в 2011 году, но не решил проблему попадания конфиденциальных данных в журнал файловой системы. [31]
Задержка распределения и потенциальная потеря данных
Поскольку отложенное распределение изменяет поведение, на которое программисты полагались в ext3, эта функция создает некоторый дополнительный риск потери данных в случаях, когда система выходит из строя или теряет питание до того, как все данные будут записаны на диск. Из-за этого ext4 в версиях ядра 2.6.30 и более поздних автоматически обрабатывает эти случаи, как это делает ext3.
Типичный сценарий, в котором это может произойти, — это программа, заменяющая содержимое файла без принудительной записи на диск с помощью fsync . Существует два распространенных способа замены содержимого файла в системах Unix: [32]
В этом случае существующий файл обрезается в момент открытия (из-за O_TRUNCфлага), затем записываются новые данные. Поскольку запись может занять некоторое время, есть вероятность потери содержимого даже с ext3, но обычно очень малая. Однако, поскольку ext4 может задерживать запись данных файла на длительное время, эта вероятность намного больше.
Может возникнуть несколько проблем:
Если запись не удалась (что может быть вызвано ошибками в программе записи или внешними условиями, такими как переполненный диск), то и исходная , и новая версии файла будут утеряны, а файл может быть поврежден, поскольку была записана только его часть.
Если другие процессы обращаются к файлу во время его записи, они видят поврежденную версию.
Если другие процессы открывают файл и не ожидают изменения его содержимого, эти процессы могут выйти из строя. Одним из примечательных примеров является файл общей библиотеки, который отображается в запущенных программах.
Из-за этих проблем часто предпочтение отдается следующей идиоме, а не приведенной выше:
Создается новый временный файл ("file.new"), который изначально содержит новое содержимое. Затем новый файл переименовывается поверх старого. Замена файлов вызовом rename()гарантированно является атомарной по стандартам POSIX , т. е. либо старый файл остается, либо он перезаписывается новым. Поскольку режим журналирования ext3 по умолчанию "упорядоченный" гарантирует, что данные файла записываются на диск до метаданных, этот метод гарантирует, что либо старое, либо новое содержимое файла сохранится на диске. Отложенное выделение ext4 нарушает это ожидание, поскольку запись файла может быть отложена на длительное время, а переименование обычно выполняется до того, как новое содержимое файла попадет на диск.
Более частое использование fsync()для снижения риска для ext4 может привести к снижению производительности на файловых системах ext3, смонтированных с этим data=orderedфлагом (по умолчанию в большинстве дистрибутивов Linux). Учитывая, что обе файловые системы будут использоваться в течение некоторого времени, это усложняет задачу для разработчиков приложений для конечных пользователей. В ответ ext4 в ядрах Linux 2.6.30 и более поздних версиях обнаруживает возникновение этих распространенных случаев и принудительно выделяет файлы немедленно. За небольшую цену производительности это обеспечивает семантику, похожую на упорядоченный режим ext3, и увеличивает вероятность того, что любая версия файла переживет сбой. Это новое поведение включено по умолчанию, но его можно отключить с помощью параметра монтирования "noauto_da_alloc". [32]
Новые исправления стали частью основного ядра 2.6.30, но различные дистрибутивы решили перенести их в 2.6.28 или 2.6.29. [33]
Эти исправления не полностью предотвращают потенциальную потерю данных и не помогают с новыми файлами. Единственный способ обезопасить себя — писать и использовать программное обеспечение, которое делает это, fsync()когда это необходимо. Проблемы с производительностью можно свести к минимуму, ограничив критические записи на диск, которые должны fsync()происходить реже. [34]
Выполнение
Виртуальная файловая система ядра Linux — это подсистема или слой внутри ядра Linux. Это результат попытки интегрировать несколько файловых систем в упорядоченную единую структуру. Основная идея, которая восходит к пионерской работе, проделанной сотрудниками Sun Microsystems в 1986 году, [35] заключается в том, чтобы абстрагировать ту часть файловой системы, которая является общей для всех файловых систем, и поместить этот код в отдельный слой, который вызывает базовые конкретные файловые системы для фактического управления данными.
Все системные вызовы, связанные с файлами (или псевдофайлами), направляются в виртуальную файловую систему ядра Linux для первоначальной обработки. Эти вызовы, поступающие от пользовательских процессов, являются стандартными вызовами POSIX, такими как open, read, write, lseek, и т. д.
Взаимодействие
Хотя файловая система ext4 разработана и в первую очередь используется для Linux, доступ к ней можно получить и из других операционных систем с помощью инструментов взаимодействия.
Windows предоставляет доступ через свою технологию Windows Subsystem for Linux (WSL). В частности, вторая основная версия, WSL 2, является первой версией с поддержкой ext4. Впервые она была выпущена в Windows 10 Insider Preview Build 20211. [ 36] [37] [38] [39] WSL 2 требует Windows 10 версии 1903 или выше, со сборкой 18362 или выше, для систем x64, и версии 2004 или выше, со сборкой 19041 или выше, для систем ARM64. [40]
Paragon Software предлагает коммерческие продукты, которые обеспечивают полный доступ на чтение/запись для ext2/3/4 – файловых систем Linux для Windows [41] и extFS для Mac . [42]
Бесплатное программное обеспечение ext4fuse обеспечивает ограниченную (только чтение) поддержку.
^ ab Ранее 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. (См. определения в parttypes.cc gdisk)
^ "DiscoverablePartitionsSpec". freedesktop.org . Получено 7 апреля 2018 г. .
^ ab "ext4: Fix processing of extended tv_sec". Дерево ядра Linux-stable . Получено 14 февраля 2017 г.
^ ab Mathur, Avantika; Cao, MingMing; Bhattacharya, Suparna ; Dilger, Andreas; Zhuravlev (Tomas), Alex; Vivier, Laurent (2007). "Новая файловая система ext4: текущий статус и планы на будущее" (PDF) . Труды симпозиума Linux . Оттава, Онтарио, Калифорния: Red Hat. Архивировано из оригинала (PDF) 6 июля 2010 г. . Получено 15 января 2008 г. .
^ Leemhuis, Thorsten (23 декабря 2008 г.). "Выше и дальше: инновации Linux 2.6.28 (страница 2)". Heise Online. Архивировано из оригинала 3 января 2009 г. Получено 9 января 2010 г.
^ "ext4: Переименовать ext4dev в ext4". Дерево ядра Линуса. Архивировано из оригинала 29 мая 2012 г. Получено 20 октября 2008 г.
^ Leemhuis, Thorsten (23 декабря 2008 г.). «Выше и дальше: нововведения Linux 2.6.28». Heise Online.
^ Пол, Райан (15 января 2010 г.). «Google обновляется до Ext4, нанимает бывшего технического директора Linux Foundation». Ars Technica .
^ "Android 2.3 Gingerbread использует файловую систему Ext4". The H Open . 14 декабря 2010 г.
^ "FileSystem в Debian". 14 сентября 2019 г.
^ "ext4 - High Level Design". kernel.org . Получено 8 декабря 2023 г. .
^ Pomeranz, Hal (28 марта 2011 г.). «Понимание EXT4 (часть 3): деревья экстентов». Блог SANS Digital Forensics and Incident Response . Архивировано из оригинала 18 августа 2019 г.
^ "Анатомия ext4". Разработчик IMB . Получено 27 мая 2024 г.
^ "Монтирование ext4 (созданной без экстентов) как ext3 не удается на RH6.2". www.linuxquestions.org . Архивировано из оригинала 5 августа 2023 г. . Получено 8 декабря 2023 г. .
^ "Ext4 - Новички в ядре Linux". kernelnewbies.org .
^ "Новые функции ext4 - Ext4". ext4.wiki.kernel.org . Архивировано из оригинала 23 сентября 2023 г. Получено 8 декабря 2023 г.
^ Prabhakaran, Vijayan; Bairavasundaram, Lakshmi N.; Agrawal, Nitin; Gunawi, Haryadi S.; Arpaci-Dusseau, Andrea C.; Arpaci-Dusseau, Remzi H. (октябрь 2005 г.). Файловые системы IRON (PDF) . Симпозиум по принципам операционных систем (SOSP '05). Брайтон, Соединенное Королевство: кафедра CS, Университет Висконсина. Раздел 6.1, параграф 5 «Контрольные суммы транзакций» . Получено 8 декабря 2023 г.
^ "Ext4 Metadata Checksums - Ext4". ext4.wiki.kernel.org . Архивировано из оригинала 6 ноября 2023 г. . Получено 8 декабря 2023 г. .
^ "Linux_3.5 - Новички в ядре Linux". kernelnewbies.org .
^ Ts'o, Theodore (5 октября 2006 г.). «Re: временные метки создания для ext4 ?».
↑ Edge, Jake (31 марта 2017 г.). «Расширение statx()». Архивировано из оригинала 20 сентября 2023 г. Получено 8 декабря 2023 г.
^ Ли, Си (12 января 2016 г.). "ext4: add project quota support" (список рассылки). Архивировано из оригинала 20 сентября 2023 г. Получено 8 декабря 2023 г.
^ Ts'o, Theodore (8 апреля 2015 г.). "Ext4-шифрование". Архивировано из оригинала 12 октября 2023 г. Получено 8 декабря 2023 г.
^ "Ext4 Filesystem". Thomas-Krenn-Wiki . Архивировано из оригинала 14 февраля 2022 . Получено 8 декабря 2023 .
^ "kernel/git/torvalds/linux.git - Исходное дерево ядра Linux". git.kernel.org .
^ "Ext4 -". ArchWiki .
↑ Пол, Райан (14 апреля 2009 г.). «Участники дискуссии обсуждают ядро на саммите Linux Collaboration Summit». Ars Technica . Получено 22 августа 2009 г.
^ Теодор Цо (1 августа 2008 г.). "Re: reiser4 для 2.6.27-rc1". linux-kernel (список рассылки) . Получено 31 декабря 2010 г.
^ Корбет, Джонатан (11 октября 2011 г.). «Безопасное удаление файлов из файловых систем ext4».
^ ab "документация ext4 в исходном коде ядра Linux". 28 марта 2009 г.
↑ Ошибка Ubuntu № 317781 Длительная дискуссия между разработчиками Ubuntu и Теодором Цо о возможной потере данных.
↑ Размышления Теда, запись в блоге, 12 марта 2009 г. Запись в блоге Теодора Цо на эту тему
^ Клейман
^ Брэндон Леблан (10 сентября 2020 г.). «Анонс Windows 10 Insider Preview Build 20211». Блоги Windows . Получено 25 мая 2021 г.
^ Пьер Буле (10 сентября 2020 г.). «Доступ к файловым системам Linux в Windows и WSL 2». Командная строка Windows . Получено 25 мая 2021 г.
^ "Начните монтировать диск Linux в WSL 2". Microsoft Docs . Получено 25 мая 2021 г.
^ Крейг Лоуэн (12 июня 2019 г.). «WSL 2 теперь доступен в программе Windows Insiders». Командная строка Windows . Получено 25 мая 2021 г.
^ "Руководство по установке подсистемы Windows для Linux для Windows 10". Документация Windows . Получено 25 мая 2021 г.
^ "Файловые системы Linux для Windows". Paragon Software . Получено 25 мая 2021 г.
^ "extFS for Mac". Paragon Software . Получено 25 мая 2021 г. .
Внешние ссылки
Документация по ext4 в исходном коде ядра Linux
Обсуждение Теодора Цо по ext4, 29 июня 2006 г.
"ext4 online Defragmentation" Архивировано 30 декабря 2019 г. на Wayback Machine (материалы симпозиума Ottawa Linux Symposium 2007)
«Новая файловая система ext4: текущее состояние и планы на будущее» (материалы симпозиума Ottawa Linux Symposium 2007)
Журнал ядра: Ext4 завершает фазу разработки в качестве промежуточного шага к btrfs, 17 октября 2008 г.
"Улучшения распределителя блоков и инодов в Ext4" Архивировано 31 марта 2010 г. на Wayback Machine (материалы симпозиума Ottawa Linux Symposium 2008)
«Ext4: следующее поколение файловой системы Ext2/3»
Ext4 (и Ext2/Ext3) Wiki
Ext4 wiki на kernelnewbies.org
Собственный порт Windows Ext4 и других ФС в CROSSMETA
Ext2read — приложение Windows для чтения/копирования файлов ext2/ext3/ext4 с поддержкой Extent и LVM2.
Ext2Fsd Драйвер файловой системы ext2/ext3/ext4 с открытым исходным кодом для чтения/записи для Windows. ext4 поддерживается с версии 0.50 и выше.
Ext4fuse Драйвер ext4 с открытым исходным кодом, доступный только для чтения, для FUSE . (Поддерживает Mac OS X 10.5 и более поздние версии с использованием MacFuse)