Файловая система журналирования - Journaling file system

А файловая система журналирования это файловая система который отслеживает изменения, еще не зафиксированные в основной части файловой системы, записывая намерения таких изменений в структуру данных, известную как "журнал ", который обычно круговой журнал. В случае сбоя системы или сбоя питания такие файловые системы можно вернуть в оперативный режим быстрее с меньшей вероятностью повреждения.[1][2]

В зависимости от фактической реализации файловая система журналирования может отслеживать только сохраненные метаданные, что приводит к повышению производительности за счет увеличения вероятности повреждения данных. В качестве альтернативы, журналируемая файловая система может отслеживать как сохраненные данные, так и связанные с ними метаданные, в то время как некоторые реализации позволяют выбирать поведение в этом отношении.[3]

История

В 1990 году IBM JFS, представленный с AIX 3.1, была одной из первых коммерческих файловых систем UNIX, в которой реализовано журналирование. Впоследствии это было реализовано в Microsoft Windows NT с NTFS файловая система в 1993 году и в Linux с ext3 файловая система в 2001 году.[4]

Обоснование

Обновление файловых систем для отражения изменений файлов и каталогов обычно требует множества отдельных операций записи. Это делает возможным прерывание (например, сбой питания или крушение ) между записями, чтобы оставить структуры данных в недопустимом промежуточном состоянии.[1]

Например, удаление файла в файловой системе Unix включает три шага:[5]

  1. Удаление записи в каталоге.
  2. Освобождение индекс в пул свободных inodes.
  3. Возврат всех дисковых блоков в пул свободных дисковых блоков.

Если сбой происходит после шага 1 и до шага 2, будет потерянный inode и, следовательно, утечка из хранилища; если между шагами 2 и 3 происходит сбой, то блоки, ранее использовавшиеся файлом, нельзя использовать для новых файлов, что эффективно снижает емкость хранилища файловой системы. Не помогает и перестановка ступеней. Если шаг 3 предшествует шагу 1, сбой между ними может позволить повторно использовать блоки файла для нового файла, что означает, что частично удаленный файл будет содержать часть содержимого другого файла, и изменения любого файла будут отображаться в обоих. С другой стороны, если шаг 2 предшествует шагу 1, сбой между ними приведет к тому, что файл станет недоступным, несмотря на то, что кажется, что он существует.

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

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

Методы

Некоторые файловые системы позволяют журналу увеличиваться, уменьшаться и перераспределяться как обычный файл, в то время как другие помещают журнал в непрерывную область или в скрытый файл, который гарантированно не перемещается или не меняет размер во время монтирования файловой системы. Некоторые файловые системы также могут разрешать внешние журналы на отдельном устройстве, таком как твердотельный накопитель или энергонезависимое ОЗУ с резервным питанием от батареи. Сами изменения в журнале могут регистрироваться для дополнительной избыточности, или журнал может быть распределен по нескольким физическим томам для защиты от сбоя устройства.

Внутренний формат журнала должен защищать от сбоев во время записи в сам журнал. Многие реализации журнала (например, уровень JBD2 в ext4 ) заключают в скобки каждое зарегистрированное изменение с контрольной суммой, понимая, что сбой оставит частично записанное изменение с отсутствующей (или несовпадающей) контрольной суммой, которую можно просто проигнорировать при воспроизведении журнала при следующем повторном подключении.

Физические журналы

А физический журнал регистрирует предварительную копию каждого блока, которая позже будет записана в основную файловую систему. Если происходит сбой при записи в основную файловую систему, запись может быть просто воспроизведена до завершения при следующем монтировании файловой системы. Если во время записи в журнал происходит сбой, то при частичной записи будет отсутствовать или не совпадать контрольная сумма, и ее можно будет проигнорировать при следующем монтировании.

Физические журналы значительно снижают производительность, потому что каждый измененный блок должен быть зафиксирован. дважды для хранения, но может быть приемлемым, когда требуется абсолютная защита от сбоев.[6]

Логические журналы

А логический журнал сохраняет только изменения в файле метаданные в журнале и обменивает отказоустойчивость на существенно лучшую производительность записи.[7] Файловая система с логическим журналом по-прежнему быстро восстанавливается после сбоя, но может привести к рассинхронизации незарегистрированных файловых данных и записываемых в журнал метаданных, что приведет к повреждению данных.

Например, добавление к файлу может включать три отдельных записи:

  1. Файлы индекс, чтобы отметить в метаданных файла, что его размер увеличился.
  2. Карта свободного пространства, чтобы отметить выделение пространства для добавляемых данных.
  3. Вновь выделенное пространство для записи добавленных данных.

В журнале, содержащем только метаданные, шаг 3 не регистрировался. Если шаг 3 не был выполнен, но шаги 1 и 2 воспроизводятся во время восстановления, файл будет добавлен с мусором.

Написание опасностей

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

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

Альтернативы

Мягкие обновления

Немного УФС реализации избегают журналирования и вместо этого реализуют мягкие обновления: они упорядочивают свои записи таким образом, чтобы файловая система на диске никогда не была противоречивой, или чтобы единственная несогласованность, которая могла возникнуть в случае сбоя, - это утечка памяти. Чтобы исправить эти утечки, карта свободного пространства сверяется с полным обходом файловой системы при следующем монтировании. Этот вывоз мусора обычно выполняется в фоновом режиме.[9]

Файловые системы с лог-структурой

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

Файловые системы копирования при записи

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

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

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

  1. ^ а б Джонс, М. Тим (4 июня 2008 г.), Анатомия журналируемых файловых систем Linux, IBM DeveloperWorks, в архиве из оригинала 21 февраля 2009 г., получено 13 апреля, 2009
  2. ^ а б Arpaci-Dusseau, Remzi H .; Арпачи-Дюссо, Андреа К. (21 января 2014 г.), Согласованность сбоев: FSCK и ведение журнала (PDF), Книги Арпачи-Дюссо, в архиве (PDF) из оригинала 24 января 2014 г., получено 22 января, 2014
  3. ^ "tune2fs (8) - страница руководства Linux". linux.die.net. В архиве с оригинала 25 февраля 2015 г.. Получено 20 февраля, 2015.
  4. ^ "'2.4.15-финал '- МАРК ". marc.info. Получено 24 марта, 2018.
  5. ^ Файловые системы от Tanenbaum, A.S. (2008). Современные операционные системы (3-е изд., С. 287). Река Аппер Сэдл, Нью-Джерси: Prentice Hall.
  6. ^ Твиди, Стивен (2000), «Ext3, журналируемая файловая система», Труды Оттавского симпозиума по Linux: 24–29
  7. ^ Прабхакаран, Виджаян; Арпачи-Дюссо, Андреа К. Арпачи-Дюссо, Ремзи Х, «Анализ и развитие журнальных файловых систем» (PDF), Ежегодная техническая конференция USENIX 2005 г., Ассоциация USENIX, в архиве (PDF) из оригинала 26 сентября 2007 г., получено 27 июля, 2007.
  8. ^ Корбет, Джонатан (21 мая 2008 г.), Барьеры и журнальные файловые системы, в архиве из оригинала 14 марта 2010 г., получено 6 марта, 2010
  9. ^ Зельцер, Марго I; Гангер, Грегори Р.; МакКьюзик, М. Кирк, «Ведение журнала и мягкие обновления: асинхронная защита метаданных в файловых системах», Ежегодная техническая конференция USENIX 2000 г., Ассоциация USENIX, в архиве из оригинала 26 октября 2007 г., получено 27 июля, 2007.