|
НАЗВАНИЕ
fs - формат тома, содержащего файловую систему
СИНТАКСИС
#include <sys/types.h> #include <sys/param.h> #include <sys/filsys.h>
ОПИСАНИЕ
На всех томах файловой системы хранится в стандартном
формате определенная жизненно важная информация. Каждый
том (блочное устройство) разделен на некоторое количество секторов, имеющих длину 1024 байт. Размер всех
файлов кратен, а внутренних буферов равен килобайту.
Рекомендуется пользоваться константой BUFSIZ, равной
размеру сектора. Она определена во включаемом файле
<stdio.h>. Необходимо помнить и о том, что утилиты
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) в Справочнике
администратора.
|