2006 г.
Руководство по продвинутым файловым системам.
Презентация ext3
Дэниел Роббинс (Daniel Robbins), перевод Владимира Холманова, под редакцией Алексея Федорчука
Первоисточник : http://www-106.ibm.com/developerworks/library/l-fs7.html
Ноябрь 2001
Зачем оно нужно?
В прошлых статьях имелся обзор нетрадиционных файловых систем типа tmpfs.
Теперь пришло время вернуться к файловым системам на блочных устройствах (disk-based), и это делается на
примере ext3. Файловая система Ext3, разработанная доктором Стефеном Твиди (Dr. Stephen Tweedie), сформирована
на структурах существующей файловой системы ext2; фактически, ext3 очень похожа
на ext2 за исключением маленького (но важного) отличия - она поддерживает
journaling. После такого "маленького" добавления в ext3 появились некоторые
удивительные и интригующие возможности. В этой статье дается сравнение ext3 с
другими journaling filesystems, доступными для использования уже сегодня.
Планируется выход еще одной статьи об использовании ext3.
Пояснения к Ext3
Что собой представляет ext3 в сравнении с ReiserFS? В предыдущих
статьях отмечалось, насколько хорошо ReiserFS подходит для работы с маленькими
файлами (до 4КБ), и в отдельных случаях работа с такими файлами в ReiserFS
в десять - пятнадцать раз эффективней, чем в ext2 (и ext3). Однако, кроме
достоинств, ReiserFS имеет и свои слабости. В текущем релизе ReiserFS
(версия 3.6) некоторые виды доступа к файлу фактически приводят к заметному
снижению производительности в сравнении с ext2 и ext3 (особенно при чтении
больших почтовых каталогов). Кроме того, ReiserFS не имеет хорошей
совместимости с NFS и имеет проблемы с производительностью при дефиците
свободного дискового пространства. Напротив, ext3 с этими задачами справляется
великолепно. Она во многом подобна ext2; не ставит рекордов при обработке
маленьких файлов, но хорошо прогнозируемая и не боится работы при ограниченных
дисковых ресурсах.
Еще одно достоинство ext3 происходит из того, что она основана на коде ext2.
Дисковый формат ext2 и ext3 идентичен; из этого следует, что при необходимости файловую систему
ext3 можно монтировать как ext2 без каких либо проблем. И это
еще не все. Благодаря факту, что ext2 и ext3 используют идентичные метаданные,
имеется возможность оперативного обновления ext2 в ext3. Именно так.
Имеется ряд системных утилит, работающих с современными ядрами (например,
tune2fs
) позволяющих конвертировать имеющуюся ext2 в
журналируемую ext3. Удивительно, но сделать это можно даже на смонтированной файловой системе
ext2. Переход безопасен, обратим и сравнительно легок (в отличие
от конвертирования в XFS, JFS или ReiserFS - какого либо копирования данных
на другой раздел не требуется). Теперь представьте на мгновение тысячи
промышленных серверов с ext2 (уже работающих), для которых обновление до ext3
минутное дело; можно получить хорошее представление о перспективности ext3
в Linux семействе.
Если от меня потребуют дать характеристику ext3 в одном слове, я бы сказал -
удобная. Это действительно удобно как следствие насколько только возможной
совместимости ext3 с существующей ext2. После обновления вам не придется
сталкиваться с любыми неожиданностями. Есть еще одна характеристика,
положительно отличающая ext3 от остальных журналируемых файловых систем под Linux -
высокая надежность, но об этом ниже.
Надежность Ext3
В дополнение к ext2-compatible, ext3 наследует другие преимущества общего
формата метаданных. Пользователи ext3 имеют в своем распоряжении годами
проверенный инструментарий fsck. Конечно, основная причина перехода на журналируемую файловую систему - отказ от необходимости периодических и долгих проверок
непротиворечивости метаданных на диске. Однако "журналирование" не способно
защитить от сбоев ядра или повреждения поверхности диска (или кое-чего
подобного). В аварийной ситуации вы оцените факт преемственности ext3 от ext2
с ее fsck. Напротив, ReiserFS fsck еще находится в младенчестве и устранение
нарушений в метаданных может стать трудным и опасным процессом.
Журналирование только метаданных
Интересно то, что ext3 выполняет журналирование совсем иначе, чем ReiserFS и
другие журналируемые файловые системы. В ReiserFS, XFS и JFS журналируются
метаданные их и не предусмотрено какое либо журналирование самих
данных. При при журналировании метаданных (metadata-only journaling) метаданные хранятся
так надежно, что, скорее всего вам не придется пользоваться fsck. Однако,
неожиданные перезагрузки и сбои в электропитании могут приводить к утере
данных, которые в момент сбоя записывались на диск. Ext3 использует
несколько творческих решений для избежания таких проблем.
Сначала поясним ситуацию с журналированием только метаданных. Например,
вы редактировали файл /tmp/myfile.txt
в момент, когда машина неожиданно
блокировалась. В случае с журналируемыми системами, журналирующими только метаданные (например,
ReiserFS, XFS или JFS), метаданные вашей файловой системы утрачены не будут и запуска
fsck не потребуется.
Однако, в случае такого сбоя имеется высокая вероятность, что в файле
/tmp/myfile.txt
останется один мусор, а то и просто он станет
нечитабельным.
Причина в следующем. "Обычные" журналируемые файловые системы, подобные ReiserFS,
XFS и JFS опекают метаданные, но для повышения производительности заботу о
данных не проявляют. В нашем примере происходила модификация некоторых блоков и соответствующих им метаданных, но синхронизация была
неожиданно прервана. "Непротиворечивость" файловых блоков будет восстановлена,
чего нельзя сказать об их "наполнении".
Журнализация в ext3
Теперь, когда имеется общее понимание проблемы, посмотрим, как ext3
осуществляет журналирование. В коде журнализации для ext3 используется специальный
API, называемый Уровень журналирования блочного устройства (Journaling Block Device layer или JBD). JBD был разработан
для журнализации на любых блочных устройств. Ext3 привязана к JBD API. При этом код файловой системы ext3 сообщает JBD о необходимости проведения модификации и
запрашивает у JBD разрешение на ее проведение. Журналом управляет JBD от имени
драйвера файловой системы ext3. Такое соглашение очень удобно, так как JBD развивается
как отдельный, универсальный объект и может использоваться в будущем для
журналирования в других файловых систем.
Имеется два важных момента в управлении журналом ext3 через JBD, вытекающих из
хранения журнала в inode файле (в базовом варианте). Первое, в зависимости от
ключей монтирования файловой системы ext3, этот файл можно "видеть" или "не видеть"
(расположен в /.journal). Второе, такое хранение журнала делает возможным
переход к ext3 через простое добавление единственного файла (и замену драйвера)
без использования несовместимых расширений к метаданным ext2. Это ключ к
пониманию "обратной совместимости" файловой системы ext3 с ext2 метаданными и
"прямой совместимости" ext2 с ext3 драйвером.
Различные подходы к journaling
Нетрудно догадаться, что имеется несколько способов ведения журнала. Например,
разработчик файловой системы может спроектировать журнал, который хранит промежуточные
байты, подлежащие модификации в файловой системе. Преимущество такого подхода в
том, что журнал хранил бы большое число крошечных модификаций очень эффективным
способом, так как требуется запись только отдельных байтов и ничего больше.
JBD использует иной подход. Вместо регистрации промежуточных байтов
сохраняются полностью измененные блоки файловой системы. Драйвер Ext3,
аналогично, хранит полные точные копии модифицируемых блоков (1КБ, 2КБ или 4КБ)
в памяти до завершения операции ввода/вывода. Это может показаться расточительным.
Полные блоки содержат не только изменившиеся данные, но и
не модифицированные.
Подход, используемый JBD, называется "физическим журналированием",
что отражает использование JBD "физических блоков" как основную единицу ведения
журнала. Подход, когда хранятся только изменяемые байты, а не целые блоки,
называется "логическим журналированием" (используется XFS). Поскольку
ext3 использует "физическое журналирование", журнал в ext3 имеет размер больший,
чем в XFS. За счет использования в ext3 полных блоков, как драйвером, так и
подсистемой журналирования нет сложностей, которые возникают при "логическом
журналировании". Кроме того, использование полных блоков позволяет исполнение
некоторой дополнительной оптимизации, например объединение нескольких ожидающих
обработки операции ввода/вывода в пределах моноблока в одной структуре оперативной памяти.
Это позволяет ext3 записывать на диск несколько смежных модификаций одной
операцией. Как дополнение, при операциях записи существенно сокращается нагрузка
на CPU.
Защита данных в Ext3
Теперь можно поговорить о том, как файловая система ext3 обеспечивает журналирование и данных, и метаданных. Фактически в ext3 имеются два метода достижения гарантии непротиворечивости.
Первоначально ext3 разрабатывалась для журналирования и всех данных, и метаданных. В этом режиме (называется "data=journal" mode),
JBD журналирует все изменения в файловой системе, связанные как с данными, так и
с метаданными. При этом JBD может использовать журнал для отката и
восстановления метаданных и данных. Недостаток "полного" журналирования в
достаточно низкой производительности и расходе большого объема дискового
пространства под журнал.
Недавно для ext3 был добавлен новый режим журналирования, который сочетает
высокую производительность и гарантию непротиворечивости структуры файловой
системы после сбоя (как у "обычных" журналируемых файловых систем). Новый режим
работы обслуживает только метаданные. Однако драйвер файловой системы ext3 по-прежнему отслеживает обработку целых блоков данных (если они связаны с
модификацией метаданных), и группирует их в отдельный объект, называемый тразакцией (transaction). Транзакция будет завершена только после записи на диск всех
данных. "Побочный" эффект такой "грубой" методики (называемой
"data=ordered" mode) - ext3 обеспечивает более высокую вероятность
сохранности данных (по сравнению с "продвинутыми" журналируемыми файловыми
системами) при гарантии непротиворечивости метаданных. При этом происходит
журналирование изменений только структуры файловой системы. Ext3 использует
этот режим по умолчанию.
Заключение
В настоящее время многие пытаются определиться, какая из поддержанных в Linux
журналируемых файловых систем является "лучшей". По большому счету, все определяется
тем, для каких целей и каких приложений файловую систему планируется
использовать; каждая имеет свои достоинства и недостатки. Безусловное
преимущество пользователей Linux - возможность выбора между файловыми системами
нового поколения. Вместо приклеивания ярлыка "лучшей" файловой системы,
следует понять силу и слабость каждой и принять обоснованное решение.
Ext3 имеет множество преимуществ. Она разработана для максимальной простоты
развертывания. Она основана на годами проверенном коде ext2 и получила
"по наследству" замечательный инструментарий fsck. Ext3 в первую очередь предназначена
для приложений, не имеющих встроенных возможностей по гарантированию сохранности
данных. В целом, ext3 - замечательная файловая система и достойное продолжение
ext2. В моей следующей статье будет описана установка и работа с ext3.