Создание и монтирование файловых систем
Создание файловых систем на дисковых разделах (или, в терминах DOS/Windows, форматирование последних) и их монтирование (т. е. обеспечение доступа к ним со стороны ОС и пользователя) - второй этап подготовки диска к инсталляции Linux. Сами по себе эти действия не сложны, однако осознанное их выполнение требует некоторой подготовки.
Устройство файловой системы
Все файлы в Unix физически состоят из двух частей, реально локализованных в различных блоках дискового накопителя, но обязательно находящихся в одном дисковом разделе, первичном или логическом. Первая часть файла - метаданные, которые содержат файловый дескриптор (некое уникальное число), сведения о его атрибутах (принадлежности, правах доступа, времени модификации и т.д.), а также информацию о том, в каких блоках дискового раздела физически размещено содержимое файла. Метаданные каждого файла записаны в специальной области диска, называемой суперблоком, где образуют описатели inodes. Каждому существующему файлу соответствует свой inode, и именно он однозначно идентифицируется файловым дескриптором. Список inodes описателей, соответствующих существующим файлам и свободным блокам дискового раздела определяет границы файловой системы.
Суть процесса создания файловой системы на дисковом разделе состоит в создании на нем суперблока, списка inode и отведении дискового пространства под блоки данных - устройством этих дисковых областей и определяются различия между файловыми системами различных типов. В результате на новом разделе образуется единственный файл - каталог корневого (для данной файловой системы) раздела, впрочем, в некоторых случаях создается еще и каталог /lost+found, предназначенный для хранения нарушенных файлов.
Возникает вопрос, почему такой, казалось бы неотъемлемый, атрибут файла, как его имя, не обнаруживается ни в его метаданных, ни, тем более, среди его данных? В Unix имя являет собой атрибут не файла, но файловой системы. И для хранения имен файлов предназначены файлы особого типа - каталоги, которые представляют собой просто списки файловых дескрипторов идентификаторов и соответствующих им имен файлов.
Поэтому идущая от MacOS и активно используемая в Windows метафора каталога как папки с документами в Unix только затемняет суть - здесь это никакое не "вместилище документов", а скорее каталожный ящик в библиотеке.
Несмотря на столь простое устройство, роль каталогов в файловой системе Unix трудно переоценить. Имена файлов, через которые они включаются в файловую систему фигурируют только в составе каталога, к которому файл приписан. Удаление имени файла (или подкаталога) из списка, представляющего собой данные его родительского каталога равносильно тому, что метаданные файла становится недоступными, а приписанные к его inode блоки данных помечаются как свободные. Чтобы сделать файловую систему доступной она со всем ее содержимым (суперблоком, списком inode, блоками данных) должна быть включена в состав какого-либо из существующих каталогов, называемого точкой монтирования. Именно это и составляет суть процесса монтирования. Результат же для монтируемой файловой системы в том, что ее корневой каталог (до сих пор безымянный) получает имя каталога - точки монтирования (mount point), содержимое которого отныне составляет список имен ее файлов и подкаталогов. Обратный процесс - размонтирование, отсоединение от точки монтирования дерева смонтированной файловой системы. Кроме того, в inode ее корневого каталога устанавливается бит чистого размонтирования (clean bit).
Выбор файловой системы
О файловой системе ext2fs написано немало. Ее отличительная особенность - очень эффективный механизм кэширования дисковых операций, что обеспечивает замечательное быстродействие, едва ли не рекордное среди известных файловых систем. Оборотная сторона - относительно слабая устойчивость при аварийном завершении работы, поскольку отложенность записи изменений файлов делает весьма высокой вероятность нарушения связи между их inode и блоками данных. Конечно, времена, когда некорректный останов Linux-машины грозил разрушением файловой системы, остались в далеком прошлом. Однако останов системы без штатного размонтирования файловых систем приводит к тому, что не устанавливается бит чистого размонтирования и утилиты обслуживания диска при перезагрузке не воспринимают их как целостные и начинают проверку, которая при современных объемах дисков отнимает время.
Эта проблема решена в журналируемых файловых системах, в которых фиксируются не выполненные дисковые операции, а только предстоящие манипуляции с файлами, вследствие чего оказывается возможным самовосстановление целостности файловой системы после сбоя. Текущие версии ядра Linux поддерживают в качестве родных четыре журналируемые файловые системы: ReiserFS, ext3fs, XFS и JFS.
Файловая система ReiserFS оказалась для Linux исторически первой - она поддерживается каноническим ядром (), начиная с первых версий ветви 2.4.x и была единственной, разработанной "с нуля" специально для этой ОС Хансом Райзером. Как и в большинстве таких систем здесь осуществляется журналирование только операций над метаданными файлов. Кроме этого, ReiserFS обладает уникальной возможностью оптимизации дискового пространства, занимаемого мелкими файлами - они целиком хранятся в своих inode, без выделения блоков в области данных и вместе с экономией места это способствует и росту производительности, так как данные и метаданные хранятся в непосредственной близости и могут быть считаны одной операцией ввода/вывода. Другая особенность ReiserFS - та, что хвосты файлов меньше чем один блок могут быть подвергнуты упаковке (режим тайлинга). Это обеспечивает около 5% экономии дискового пространства.
ReiserFS не совместима с ext2fs на уровне утилит обслуживания файловой системы, однако соответствующий инструментарий, объединенный в пакет reiserfsprogs, уже давно включается в штатный комплект современных дистрибутивов. Более серьезная проблема - загрузчики Linux (Lilo и GRUB) часто не способны загрузить ядро Linux с раздела ReiserFS, оптимизированного в режиме тайлинга. А поскольку, будучи отключенным, этот режим обладает свойством самовосстановления, пользователь может столкнуться с тем, что после пересборки ядра система откажется загружаться. Именно поэтому может быть необходимым создание раздела под каталог /boot.
В отличие от ReiserFS, ext3fs - не более чем журналируемая надстройка над классической ext2fs, разработанная в компании Red Hat и поддерживаемая ядром Linux, начиная с 2.4.16.
Как следствие такого происхождения, она сохраняет со своей прародительницей полную совместимость, в том числе и на уровне утилит обслуживания (начиная с версии 1.21 объединяющего их пакета e2fsprogs). Другое преимущество - чуть ли не максимальная надежность: ext3fs является единственной системой из рассматриваемых, в которой возможно журналирование операций не только с метаданными, но и с данными.
В ext3fs предусмотрено три режима работы: полное журналирование (full data journaling), журналирование с обратной записью (writeback), а также задействуемое по умолчанию последовательное (ordered). В первом случае все новые данные сначала пишутся в файл журнала и только после этого фиксируются на диске. В случае аварийного отказа можно повторно перечитать журнал, приведя данные и метаданные в непротиворечивое состояние. Этот механизм практически гарантирует от потерь данных, однако является наиболее медленным. В режиме с обратной записью в файл журнала записываются только изменения метаданных и никакой гарантии сохранности данных он не предоставляет, однако обеспечивает наибольшее (в рамках ext3fs) быстродействие. В последовательном режиме также физически журналируются только метаданные файлов, однако, связанные с ними блоки данных логически группируются в единый модуль, называемый транзакцией. И эти блоки сохраняются перед записью на диск новых метаданных, что, хотя и не гарантирует полной сохранности но весьма способствует ей.
Файловая система XFS, в отличие от молодых ReiserFS и ext3fs, развивается на протяжении почти десяти лет - впервые она появилась для версии Irix 5.3 в 1994 г. XFS - единственная из рассмотренных 64-разрядная файловая система. Особенностями XFS являются:
- механизм allocation group - деление единого дискового раздела на несколько равных областей, имеющих собственные списки inodes и свободных блоков, для распараллеливания дисковых операций;
- логическое журналирование только изменений метаданных, но с частым сбросом их на диск для минимизации возможных потерь при сбоях;
- механизм delayed allocation - ассигнование дискового пространства при записи файлов не во время журналирования, а при фактическом сбросе их на диск, что, вместе с повышением производительности, предотвращает фрагментацию дискового раздела;
- списки контроля доступа (ACL, Access Control List) и расширенные атрибуты файлов (extended attributes), рассмотрение которых далеко выходит за рамки нынешней темы.
XFS очень сбалансированная файловая система - она почти столь же надежна, как ext3fs, и не уступает ReiserFS в быстродействии на большинстве файловых операций. А при манипуляциях с очень большими файлами XFS вне конкуренции. Не отмечалось для нее и проблем с совместимостью. Однако следует учесть, что в отличие от ReiserFS и ext2fs, поддержка которых является штатными опциями ядра Linux, XFS по сию пору (текущая версия - 2.4.19) не поддерживается каноническим ядром Линуса Торвальдса. Хотя недавнее включение такой поддержки в разрабатываемую ветвь ядра (версии 2.5.X) позволяют надеяться, что скоро эта функция станет штатной. Утилиты поддержки для XFS объединены в несколько пакетов, из которых абсолютно необходимым является xfsprogs. Хотя многие дистрибутивы Linux штатно комплектуются средствами поддержки XFS (из SB-дистрибутивов в настоящий момент это Gentoo и SMGL), обо всем этом следует помнить при предварительной разметке диска.
Практические следствия
Обычно создание файловых систем - компетенция инсталлятора, который осуществляет ее с некоторыми опциями по умолчанию, изменить которые впоследствии невозможно без переформатирования. Однако все SB-дистрибутивы допускают ручное вмешательство в этот процесс.
Если нет желания заниматься сравнительным анализом разных файловых систем нормальным выбором для всех разделов остается ext2fs. Она может быть создана любой из следующих команд - /sbin/mke2fs, /sbin/mkfs, /sbin/mkfs.ext2 с указанием файла устройства в качестве аргумента, например:
$ /sbin/mke2fs /dev/hd?#
Для создания файловой системы ext3fs можно применить ту же команду mke2fs с опцией -j, при этом она получит некоторые характеристики по умолчанию, определить которые вручную позволяет следующая форма этой команды:
$ /sbin/mke2fs -J опции_журналирования /dev/hd?#
Возможные значения опций журналирования - size=размер, задающее объем журнального файла в мегабайтах, и device=внешний_журнал подключения новой файловой системы к журналу, ранее созданному на другом дисковом разделе.
Можно использовать и специальную команду /sbin/mkfs.ext3 - возможности ее идентичны /sbin/mke2fs. Но самое интересное - преобразование существующей ext2fs в ext3fs простым добавлением журнала, не только без потери данных, но и без перезапуска системы (и даже без размонтирования). Делается это командой "$ tune2fs -j /dev/hd?#", которая просто добавляет файл журнала /.journal в корневом каталоге модифицируемой файловой системы (если последняя не была размонтирована), или задействует для журнала скрытый inode (если перед модификацией файловая система была размонтирована). Обратное преобразование еще проще и осуществляется командой монтирования.
Файловая система ReiserFS создается командой /sbin/mkreiserfs из пакета reiserfsprogs. Для нее доступны многочисленные опции (-s для задания размера журнала, -f для принудительного переформатирования ранее существовавшей файловой системы иного типа, и т.д.). Во избежание неожиданностей напомню: если корневой раздел форматируется как ReiserFS, не лишним будет предусмотреть небольшой раздел под каталог /boot для размещения на нем файловой системы ext2fs.
Для создания XFS также существует собственная команда mkfs.xfs (из пакета xfsprogs). Важнейшие опции: b - задание размера блока данных; d - определение параметров области данных файловой системы; l - описание параметров журнального файла. При использовании mkfs.xfs для достижения максимальной производительности рекомендуется в явном виде задать количество allocation groups иначе оно будет определяться автоматически, что приведет к непроизводительным расходам ресурсов (лучше определить его из расчета одна allocation group на 4 Гбайт дискового пространства). Далее, по тем же причинам можно установить размер файла журнала (здесь рекомендованное значение составляет 32 Мбайт). Для дискового раздела объемом в 20 Гбайт команда приобретет вид
$ mkfs.xfs -d agcount=5 -l size=32m /dev/hda1
Команда mkfs.xfs имеет опцию -f - принудительное создание файловой системы XFS поверх любой существующей.
Ее достаточно, если последняя была ext2fs. Если же XFS создается поверх ReiserFS то возможны ошибки при монтировании новой файловой системы. Впрочем, то же относится и к обратной процедуре (замене XFS на ReiserFS), а также, если любая из этих "продвинутых" файловых систем заменяется на разделе системой ext2fs. Они связаны с тем, что команда монтирования может распознать вновь созданную XFS как дефектную ReiserFS, и наоборот. Во избежание этого перед таким замещением приходится прибегать к шаманскому приему - обнулению начальных областей раздела (хранящего метаданные файловой системы) командой
$ dd if=/dev/zero of=/dev/hd?#
Ждать заполнения нулями всего устройства не обязательно - достаточно дать этой команде поработать секунд 10-20, после чего прервать ее комбинацией клавиш Control+D и перейти к созданию новых файловых систем.
И последнее, о чем следует сказать об области подкачки, созданной на этапе разбиения диска. Хотя файловой системы как таковой он не несет, но нуждается в определении, что достигается командой "$ mkswap имя_устройства", к которой следует подходить со вниманием - ее применение к обычному разделу уничтожит на нем все данные.