Файловая система устанавливается при помощи команды mkfs. Для каждого типа файловой системы существует своя версия этой программы. Команда mkfs запускает требуемую программу в зависимости от типа файловой системы.
Параметры командной строки, передаваемые mkfs, слегка различаются для разных типов файловых систем. Полное описание параметров командной строки mkfs можно найти в соответствующем разделе man (справочной системы программы). С помощью параметров командной строки можно задать тип создаваемой файловой системы, произвести верификацию диска и маркировку сбойных блоков или получить список сбойных блоков из текстового файла.
Для нормальной работы операционной системы ядро каким-то образом должно получить параметры файловых систем, используемых во время работы, и определенным образом настроить специальные таблицы. Для этого существует, по крайней мере, два способа:
1. Каким-то образом один раз получить тип и параметры файловой системы и использовать их все время.
2. Получать их каждый раз при обращении к файловой системе.
У обоих вариантов имеются свои плюсы и минусы. Плюсы первого варианта – уменьшаются затраты времени на определение файловой системы и инициализацию таблиц ядра операционной системы. Минусы – невозможно "на ходу" заменить одно устройство (носитель информации) на другое (к примеру, диск Zip 100 на Zip250), поскольку в таблицах ядра зафиксированы емкость носителя, емкость кластеров, используемые блоки и тому подобная информация. Плюсы и минусы второго варианта прямо противоположны первому – возможно "на ходу" заменить устройство (носитель информации), большие затраты времени на определение файловой системы и инициализацию таблиц ядра операционной системы. К тому же, во втором варианте намного труднее достичь надежности хранения данных.
Поэтому большинство операционных систем (не только UNIX) в явной или неявной форме используют первый вариант взаимодействия с файловой системой. Для этого в Linux используются операция «монтирования» и обратная ей «демонтирования» файловой системы. Подробную информацию см. в гл. 5.
Поскольку в операционной системе Linux используется единое связанное дерево каталогов, то, в отличие от DOS/Windows, не существует такого понятия файловой системы, как диск. Все дисковые устройства (файловые системы) интегрируются в дереве каталогов в так называемые точки монтирования, в качестве которых выступают обычные каталоги. Причем, если до монтирования в этом каталоге содержались какие-то файлы, то они становятся недоступны до тех пор, пока вы не смонтируете эту файловую систему. Для операции монтирования/демонтирования используются две команды mount и umount.
Команда mount принимает несколько параметров, из которых обязательными являются всего два. Первый их них – файл устройства, соответствующий диску или разделу, на котором расположена файловая система, или его псевдоним (к примеру – CD-ROM, floppy). Вторым параметром является имя каталога, к которому будет монтироваться система. Например, mount /dev/hda1 /mnt.
Помимо обязательных параметров можно задавать тип монтируемой файловой системы (при отсутствии этого параметра команда пытается самостоятельно определить ее тип), режим доступа, используемую в именах файлов кодировку и некоторые другие параметры.
Существует специальный файл /etc/fstab, содержащий список файловых систем и их параметры монтирования. Этот файл используется ядром операционной системы при ее старте. Ядро пытается смонтировать файловые системы, описанные в этом файле, с соответствующими параметрами монтирования.
После того как отпала необходимость в использовании файловой системы, ее можно демонтировать. Чаще всего это необходимо при работе с дискетами или дисками CD-ROM (один диск необходимо заменить на другой). Для демонтирования используется команда umount. В качестве параметра указывается файл устройства или точка монтирования. Например, umount /dev/hda1 или umount /mnt/floppy.
По окончании работы со сменным носителем информации его обязательно необходимо отмонтировать. Поскольку ядро Linux осуществляет «отложенную» запись на диск, то к тому моменту, когда вы извлечете из дисковода дискету без отмонтирования, информация еще может быть не записана на диск из системного буфера.
Для выполнения операций монтирования и демонтирования требуется наличие прав доступа root. Но при работе на своем персональном компьютере это усложняет процедуру. Есть несколько вариантов решения такой проблемы:
• в KDE или GNOME обычному пользователю можно монтировать CD-ROM и дисковод;
• осуществить временный вход в систему пользователем root, монтировать/демонтировать диск и немедленно выйти;
• применить программу sudo, позволяющую пользователям, для которых это разрешено, использовать команду mount;
• применить пакет mtools, используемый для работы с файловой системой MS-DOS;
• поместить список файлов устройств, используемых при работе с гибкими дисками, и доступных узлов монтирования вместе с нужными опциями (разрешением монтирования пользователем) в файл /etc/fstab.
Даже самая надежная файловая система не обладает стопроцентной надежностью. Рано или поздно целостность файловой системы нарушается. Это может произойти от некорректного завершения работы системы (нажата кнопка Reset, перебои в электропитании) или повреждения носителя информации. Для проверки и восстановления целостности файловой системы используется команда fsck. Она при загрузке системы запускается автоматически, поэтому возможные неполадки будут обнаружены (и может быть исправлены) перед использованием файловой системы.
Полная проверка файловой системы на современных жестких дисках может занять достаточно большое время, поэтому существуют некоторые способы избежать таких проверок. В файловой системе Ext2 существует специальный флаг, расположенный в суперблоке, который используется для выявления корректности демонтирования файловой системы при последнем выключении системы. Так же можно принудительно отключить проверку файловой системы, создав файл /etc/fastboot.
Автоматическая проверка используется только для файловых систем, монтируемых во время загрузки. Для проверки других систем команда fsck должна выполняться вручную.
Если fsck находит неисправность, которую не может исправить, то для восстановления структуры файловой системы или потерянной информации могут потребоваться глубокие знания и понимание работы файловых систем и их типов.
Команда fsck должна использоваться только для демонтированных систем (за исключением корневой файловой системы, которая проверяется смонтированной в режиме read-only), т. к. при ее работе используется прямой доступ к диску, и информация о внесении каких-либо изменений в файловую систему может быть недоступна операционной системе, что, обычно, приводит к нарушению ее работы.
Так же рекомендуется использовать утилиту badblocks. При ее выполнении выводится список номеров найденных на диске поврежденных блоков. Этот список может быть использован программой fsck для внесения изменений в структуру файловой системы.
База, на которой основывается использование всего многообразия поддерживаемых файловых систем.
Ядро системы Linux содержит в себе программный код-посредник, выполняющий функции виртуальной файловой системы. Этот код обрабатывает запросы к файлам и вызывает необходимые функции соответствующей файловой системы для выполнения операции ввода/вывода. Такой механизм работы с файлами используется для упрощения объединения и использования нескольких типов файловых систем.
Пусть программа записывает информацию в файл (или считывает ее, не суть важно). Программой вызывается библиотечная функция, отвечающая за запись (или чтение) информации в файл. Эта функция определенным образом подготавливает информацию, которая затем передается в ядро системы. Ядро, в свою очередь, вызывает соответствующую функцию виртуальной файловой системы. Эта функция определяет, с каким типом файловой системы будут производиться манипуляции, подготавливает данные и вызывает необходимую функцию соответствующей файловой системы, с которой производится операция. Такая многоуровневая структура позволяет максимально абстрагироваться от особенностей операционной системы и, в случае необходимости, безболезненно эмулировать недостающие атрибуты файла.
Виртуальная файловая система содержит набор функций, которые должна поддерживать любая файловая система (создание, удаление, модификация файла, каталога и тому подобные действия). Этот интерфейс состоит из функций, которые оперируют тремя типами объектов: файловые системы, индексные дескрипторы и открытые файлы.
Виртуальная файловая система использует таблицу, в которой во время компиляции ядра сохраняется информация о всех типах поддерживаемых файловых систем. Запись в таблице содержит тип файловой системы и указатель на соответствующую функцию монтирования файловой системы. При монтировании файловой системы эта функция возвращает виртуальной файловой системе дескриптор, который используется в дальнейшем в операциях ввода/вывода.
Дескриптор смонтированной файловой системы содержит определенный набор информации: указатели на функции, служащие для выполнения операций данной файловой системы, и данные, используемые этой системой. Указатели на функции, расположенные в дескрипторе файловой системы, позволяют виртуальной файловой системе получить доступ к функциям, специфичным для данной файловой системы.
В виртуальной файловой системе применяются еще два типа дескрипторов: индексный дескриптор и дескриптор открытого файла. Каждый из них содержит информацию, связанную с обрабатываемыми файлами и набором операций, используемых файловой системой. Индексный дескриптор содержит указатели к функциям, применяемым к любому файлу, а дескриптор открытого файла содержит указатели к функциям, оперирующим только с открытыми файлами.
Файловая система Ext2 (The Second Extended File System, вторая расширенная файловая система) была разработана с целью устранения ошибок, обнаруженных в предыдущей системе Ext (Extended File System), и снятия некоторых ее ограничений.
Файловая система Ext2 поддерживает стандартные типы файлов UNIX:
• файлы;
• каталоги;
• файлы устройств;
• символические ссылки.
Ext2 может управлять файловыми системами, установленными на очень больших дисковых разделах. Система поддерживает имена файлов большой длины – до 255 символов. Ext2 резервирует некоторое количество блоков для пользователя root, что позволяет системному администратору избежать нехватки объема жесткого диска при его заполнении другими пользователями.
В файловой системе Ext2 может использоваться синхронная модификация данных. Она применяется для достижения высокой плотности записи информации, но одновременно приводит к ухудшению производительности.
Ext2 позволяет при создании файловой системы выбрать размер логического блока. Он может быть определен в 1024, 2048 или 4096 байтов. Организация блоков большого объема приводит к ускорению операций чтения/записи, но при этом дисковое пространство используется нерационально.
Ext2 позволяет применять ускоренные символические ссылки. В этом случае блоки данных файловой системы не используются. Имя файла назначения хранится не в блоке данных, а в самом индексном дескрипторе. Такая структура позволяет сохранить дисковое пространство и ускорить обработку символических ссылок. Максимальная длина имени файла в ускоренной ссылке равна 60 символам.
Ext2 использует отдельное поле в суперблоке для индикации состояния файловой системы. Если файловая система смонтирована в режиме read/write, то ее состояние устанавливается как Not Clean. Если же она демонтирована или смонтирована заново в режиме read-only, то ее состояние устанавливается в Clean. Во время загрузки операционной системы и проверки состояния файловой системы эта информация используется для определения необходимости такой проверки. Ядро также помещает в это поле некоторые ошибки. При определении ядром какого-либо несоответствия файловая система помечается как Erroneous.
Длительное отсутствие проверки может привести к проблемам функционирования файловой системы, поэтому Ext2 включает в себя два метода для организации принудительной проверки. В суперблоке содержится счетчик монтирования системы. Этот счетчик увеличивается каждый раз, когда система монтируется в режиме read/write. Если его значение достигает максимального значения (оно также хранится в суперблоке), то запускается программа проверки файловой системы, даже если ее состояние является Clean. В суперблоке также хранится последнее время проверки, и максимальный интервал между проверками. При превышении этого интервала также запускается программа проверки файловой системы.
В системе Ext2 имеются утилиты для ее настройки. Так, программа tune2fs используется для определения порядка действий при обнаружении ошибки. Может быть выполнено одно из трех следующих действий:
• продолжение выполнения;
• монтирование файловой системы заново в режиме read-only;
• перезагрузка системы для проверки файловой системы.
Кроме того, эта программа позволяет задать:
• максимальное значение числа монтирований файловой системы;
• максимальный интервал между проверками файловой системы;
• количество логических блоков, зарезервированных для пользователя root.
Как и во многих файловых системах, в Ext2 существует загрузочная область. На первичном разделе (primary, в терминологии программы Fdisk фирмы Microsoft) она содержит загрузочную запись – фрагмент кода, который инициирует процесс загрузки операционной системы при запуске. Все остальное пространство раздела делится на блоки стандартного размера. Блок может иметь размер 1, 2 или 4 Кбайт. Блок является минимальной логической единицей дискового пространства (в других операционных системах такой блок называют кластером). Выделение места файлам осуществляется целыми блоками.
Блоки, в свою очередь, объединяются в группы блоков. Каждая группа блоков имеет одинаковое строение. Рассмотрим подробнее их структуру (рис. 4.1).
Рис. 4.1. Структура группы блоков
Суперблок (Superblock) Описание группы блоков (Group Descriptors) Битовая карта блока (Block Bitmap) Битовая карта индексного дескриптора (Inode Bitmap) Таблица индексных дескрипторов (Inode Table) Блоки данных
Суперблок одинаков для всех групп, все же остальные поля индивидуальны для каждой группы. Суперблок хранится в первом блоке каждой группы блоков, является начальной точкой файловой системы, имеет размер 1024 байта и располагается по смещению 1024 байта от начала файловой системы. Копии суперблока используются при восстановлении файловой системы после сбоев.
Информация в суперблоке служит для доступа к остальным данным на диске. В суперблоке определяется размер файловой системы, максимальное число файлов в разделе, объем свободного пространства. При старте операционной системы суперблок считывается в память, и все изменения файловой системы сначала записываются в копию суперблока, находящуюся в оперативной памяти, и только затем сохраняются на диске. При описании структуры суперблока используются следующие значения:
• SHORT – короткое целое – 1 байт;
• USHORT – беззнаковое короткое целое – 1 байт;
• LONG – длинное целое – 4 байта;
• ULONG – беззнаковое длинное целое – 4 байта.
Структура суперблока приведена в приложении I (табл. П1.1).
После суперблока следует являющееся массивом описание группы блоков (Group Descriptors). Структура описания группы блоков приведена в приложении I (табл. П1.2).
Битовая карта блоков (Block Bitmap) – это структура, каждый бит которой показывает, отведен ли соответствующий ему блок какому-либо файлу. Если бит равен 1, то блок занят. Эта карта служит для поиска свободных блоков в тех случаях, когда надо выделить место под файл.
Битовая карта индексных дескрипторов (Inode Bitmap) выполняет аналогичную функцию по отношению к таблице индексных дескрипторов – показывает, какие дескрипторы заняты.
Индексные дескрипторы файлов
Индексные дескрипторы файлов содержат информацию о файлах группы блоков. Каждому файлу на диске соответствует один и только один индексный дескриптор файла, который идентифицируется своим порядковым номером – индексом файла. Отсюда следует, что число файлов, которые могут быть созданы в файловой системе, ограничено числом индексных дескрипторов. Структура индексного дескриптора файла приведена в приложении 1 (табл. П1.3).
Поле типа и прав доступа к файлу (i_mode) представляет собой слово, каждый бит которого служит флагом. Список флагов, описывающих тип и права доступа к файлу, приведен в приложении 1 (табл. П1.4).
Некоторые индексные дескрипторы используются файловой системой в специальных целях. Описание специальных индексных дескрипторов приведено в приложении 1 (табл. П1.5).
Каталог, по сути, является специальным файлом, содержимое которого состоит из записей определенной структуры. Структура записи в файле каталога приведена в приложении 1 (табл. П1.6).
Система адресации данных
Система адресации данных позволяет находить нужный файл среди блоков на диске. В Ext2 система адресации реализуется полем i_block индексного дескриптора файла.
Поле i_block в индексном дескрипторе файла представляет собой массив из 15 адресов блоков. Первые 12 адресов в этом массиве (EXT2 NDIR BLOCKS [12]) представляют собой прямые ссылки на номера блоков, в которых хранятся данные из файла. Следующий адрес в этом массиве является косвенной ссылкой (адресом блока), в котором хранится список адресов следующих блоков с данными из этого файла. Следующий адрес в поле i_block индексного дескриптора указывает на блок двойной косвенной адресации (double indirect block). Этот блок содержит список адресов блоков, которые, в свою очередь, содержат списки адресов следующих блоков данных того файла, который задается индексным дескриптором.
Последний адрес в поле i_block индексного дескриптора задает адрес блока тройной косвенной адресации, т. е. блока со списком адресов блоков, которые являются блоками двойной косвенной адресации.
Файловая система Ext2 при операциях ввода/вывода использует буферизацию данных. При считывании блока информации ядро выдает запрос операции ввода/вывода на несколько расположенных рядом блоков. Такие oneрации сильно ускоряют извлечение данных при последовательном считывании файлов.
При занесении данных в файл файловая система Ext2, записывая новый блок, заранее размещает рядом до 8 смежных блоков. Такой метод позволяет размещать файлы в смежных блоках, что ускоряет их чтение и дает возможность достичь высокой производительности системы.
Средства управления файловой системы служат для создания, модификации и коррекции любых искажений файловой структуры:
• mke2fs – применяется для установки дискового раздела, содержащего пустую файловую систему Ext2;
• tune2fs – используется для настройки параметров файловой системы;
• e2fsck – предназначена для устранения несоответствий в файловой системе;
• ext2ed – применяется для правки файловой системы;
• debugfs – предназначена для определения и установки состояния файловой системы.
Программа e2fsck спроектирована таким образом, что выполняет проверку с максимально возможной скоростью. В первом проходе e2fsck просматривает все индексные дескрипторы файловой системы и проверяет их как отдельные элементы системы. Также проверяются карты битов, указывающие использование блоков и дескрипторов.
Если e2fsck находит блоки данных, номера которых содержатся более чем в одном дескрипторе, то запускаются проходы с IB по 1D для устранения несоответствия: либо путем увеличения разделяемых блоков, либо удалением одного или более дескрипторов.
Во втором проходе производится проверка каталогов как отдельных элементов файловой системы. Блок каждого каталога проверяется отдельно, без ссылки на другие блоки каталогов. Для первого блока каталога в каждом дескрипторе каталога, проверяется существование записей "." (ссылка на себя) и ".." (ссылка на родительский каталог), и соответствие номера дескриптора для записи "." текущему каталогу.
В третьем проходе проверяются связи каталогов. Программа e2fsck проверяет пути каждого каталога по направлению к корневому. В этом же проходе проверяется запись ".." для каждого каталога. Все каталоги, не имеющие связи с корневым каталогом, помещаются в каталог /lost+found.
В четвертом проходе e2fsck проверяет счетчики ссылок для каждого индексного дескриптора. Все неудаленные файлы с нулевым счетчиком ссылок также помещаются в каталог /lost+found.
В пятом проходе e2fsck проверяет соответствие всей информации о файловой системе. В этом проходе сравниваются карты битов блоков и дескрипторов, записанных на носителе информации, со значениями, полученными во время проверки файловой системы и, при необходимости, информация на диске корректируется.