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) в Справочнике
администратора.
|