FS(4) FS(4) НАЗВАНИЕ fs - формат тома, содержащего файловую систему СИНТАКСИС |#include |#include |#include ОПИСАНИЕ На всех томах файловой системы хранится в стандартном формате определенная жизненно важная информация. Каждый том (блочное устройство) разделен на некоторое коли- чество секторов, имеющих длину 1024 байт. Размер всех файлов кратен, а внутренних буферов равен килобайту. Рекомендуется пользоваться константой BUFSIZ, равной размеру сектора. Она определена во включаемом файле . Необходимо помнить и о том, что утилиты cpio(1), fsdb(1M) в целях совместимости работают с 512- байтными блоками. Еще большей осторожности требует бесструктурный ввод/вывод. Драйверы диска не поддержи- вают 512-байтные блоки, так что при использовании ко- манды dd(1) надо указывать размер буфера кратным кило- байту. Правда, при нумерации блоков драйверы ввода/вы- вода по-прежнему считают их 512-байтными. Первые 512 байт сектора 0 могут содержать информацию об альтернативных дорожках. Вторая половина сектора 0 на- зывается суперблоком. Сектор 1 не используется. В секторах, начиная со второ- го, располагаются описатели файлов и собственно файлы. Системный том не содержит программы начальной загрузки. Суперблок имеет следующий формат: |struct filsys { | ushort s_isize; /* Размер списка описателей | файлов в блоках */ | daddr_t s_fsize; /* Размер всего тома в | блоках */ | short s_nfree; /* Количество адресов в | массиве s_free */ | daddr_t s_free[NICFREE]; /* Список свободных блоков | */ | short s_ninode; /* Кол-во описателей фай- | лов в масс. s_inode */ | ino_t s_inode[NICINOD]; /* Список свободных описа- | телей файлов */ | char s_flock; /* Блокир. при опер. со | списком своб. блоков */ | char s_ilock; /* Блокир. при опер. со | списком опис. файлов */ | char s_fmod; /* Флаг модификации супер- | блока */ | char s_ronly; /* Флаг монтирования только | на чтение */ | time_t s_time; /* Время последнего обнов- | ления суперблока */ | short s_dinfo[4]; /* Информация об устройстве | */ | daddr_t s_tfree; /* Кол-во свободных блоков | */ | ino_t s_tinode; /* Кол-во свободных описа- | телей файлов */ | char s_fname[6]; /* Имя файловой системы */ | char s_fpack[6]; /* Имя тома */ | long s_fill[14]; /* Заполнитель, чтобы | sizeof(filsys)==512 */ | long s_state; /* Состояние файловой сис- | темы */ | long s_magic; /* Маг. число новой (вер- | сии V.3) файл. сист. */ | long s_type; /* Тип новой файловой сис- | темы */ |}; |#define FsMAGIC 0xfd187e20 /* Значение s_magic */ | |#define Fs1b 1 /* Блок по 512 байт */ |#define Fs2b 2 /* Блок по 1024 байта */ | |#define FsOKAY 0x7c269d38 /* s_state: нормальная */ |#define FsACTIVE 0x5e72d81a /* s_state: активная */ |#define FsBAD 0xcb096f43 /* s_state: плох.корень */ |#define FsBADBLK 0xbadbc14b /* s_state: есть плохие | блоки */ Поле s_type определяет тип файловой системы. В настоя- щее время поддерживаются два типа файловых систем: ста- рая, с 512-байтными логическими блоками и новая, улуч- шенная, с 1024-байтными блоками. Поле s_magic использу- ется для того, чтобы отличить старую 512-байтную систе- му от новой. Если значение этого поля не совпадает с магическим числом FsMAGIC, то тип файловой системы при- нимается равным Fs1b, то есть система считается старой; в противном случае используется значение s_type. Опера- ционная система заботится о корректности преобразования номеров логических блоков в номера физических секторов. Поле s_state определяет состояние файловой системы. Для успешно размонтированной, неповрежденной файловой сис- темы s_state имеет значение FsOKAY. После того, как система была смонтирована с целью внесения изменений, состояние изменяется на FsACTIVE. По-особому обрабаты- вается корневая файловая система. Если во время загруз- ки ОС обнаруживается, что корневая файловая система повреждена, она монтируется, но отмечается признаком FsBAD. Позже, после того, как она будет размонтирована, будет установлено состояние FsOKAY. Поле s_isize задает адрес первого блока данных после списка описателей файлов; сам список описателей начина ется со второго блока. Таким образом, список описателей файлов имеет длину s_isize-2 блока. Значение s_fsize есть первый блок, который потенциально недоступен для размещения файлов. Эти два числа используются системой для выявления плохих номеров блоков; если неверный но- мер блока получается из списка свободных блоков или, наоборот, освобождается, то на системную консоль выво- дится диагностическое сообщение. Более того, список свободных блоков очищается, чтобы предотвратить даль- нейшее получение номеров блоков из возможно поврежден- ного списка. Список свободного пространства для каждого тома устроен следующим образом. Массив s_free содержит до 50 номеров свободных блоков s_free [0], ..., s_free [s_nfree - 1]. Блок с номером s_free [0] является следующим элементом списка свободного пространства. Нулевое слово (длинное целое) в этом блоке содержит количество (до 50) номеров свободных блоков, указанных в последующих 50 словах, причем первое слово одновременно служит ссылкой на сле- дующий элемент списка свободного пространства с анало- гичной структурой. Иными словами, каждый элемент списка свободного пространства располагается в начале свобод- ного блока и устроен так же, как пара полей s_nfree и s_free, играющая роль заголовка списка. Чтобы занять свободный блок, надо уменьшить значение s_nfree и выделить блок с номером s_free [s_nfree]. Ес- ли номер выделенного блока равен 0, это означает, что на томе нет свободных блоков, то есть имеет место ошиб- ка. Если значение s_nfree стало нулевым, нужно прочи тать выделенный блок, поместить его нулевое слово в по- ле s_nfree, а последующие 50 слов - в массив s_free. При освобождении блока, если значение s_nfree равно 50, следует скопировать пару полей s_nfree и s_free в нача- ло этого блока, записать блок и установить s_nfree рав- ным 0. В любом случае, номер освобождаемого блока поме- щается в элемент массива s_free [s_nfree], после чего поле s_nfree увеличивается на 1. Поле s_tfree хранит общее количество свободных блоков, доступных файловой системе. Поле s_ninode хранит количество номеров свободных опи сателей файлов в массиве s_inode. Чтобы занять свобод- ный описатель файла в случае, когда s_ninode больше 0, это поле следует уменьшить на 1 и выделить описатель с номером s_inode [s_ninode]. Если же значение s_ninode равно 0, нужно перебрать описатели файлов и номера сво- бодных (не более 100) поместить в массив s_inode, посл чего снова попытаться выделить описатель. При освобождении описателя, если значение s_ninode меньше 100, номер описателя следует поместить в элемент массива s_inode [s_ninode] и увеличить поле s_ninode на 1. Если же значение s_ninode равно 100, не стоит забо- титься о регистрации факта освобождения. Дело в том, что таблица номеров свободных описателей предназначена только для ускорения их поиска; В самом описателе есть признак, свободен он или занят. Значение s_tinode есть общее количество свободных опи- сателей файлов, доступных файловой системе. Флаги s_flock и s_ilock поддерживаются только в копии файловой системы в оперативной памяти; их значения на диске не определены. Значение флага s_fmod на диске также не поддерживается; этот флаг показывает, что су перблок был изменен и должен быть записан на диск во время очередного обновления информации в файловой сис- теме. Флаг s_ronly означает защиту от записи. Поле s_time есть время последней модификации суперблока файловой системы. Оно измеряется количеством секунд, прошедших с 00:00:00 1 января 1970г. (по Гринвичу). Поле s_fname есть имя файловой системы, а s_fpack - имя тома. Номера описателей файлов начинаются с 1. Длина описате- ля составляет 64 байта. Описатель номер 1 в настоящее время не используется. Описатель номер 2 зарезервирован для корневого каталога файловой системы. Другие описа- тели не имеют предопределенного назначения. Каждый сатель соответствует одному файлу. Формат описателя файла см. в inode(4). ФАЙЛЫ /usr/include/sys/fs/* СМ. ТАКЖЕ mount(2), inode(4). finito(1M), fsck(1M), fsdb(1M), mkfs(1M) в Справочнике администратора.