Структура файла является текстово-бинарной. Т.е. несмотря на то, что содержимое файла можно легко просмотреть простым текстовым редактором, его правка в нём представляет некоторую трудность из-за строгой фиксации размеров полей и наличия ссылок в виде чисел означающих сдвиг в байтах. Все числа внутри файла записаны в 16-ричной системе счисления.
Рассмотрим структуру файла более подробно. Файл состоит из 4-х разделов с фиксированными заголовками:
1) BLOCK_SIZE, через пробел после чего следует 32-х разрядное число (восемь 16-ричных знаков) -- размер блока файловой системы и перевод строки.
2) INODES, через пробел следует также 32-х разрядное число -- число инф.узлов в файловой системе и перевод строки.
3) INODE_TABLE, далее идёт перевод строки и ещё INODES строк описывающих каждый инф.узел.
4) DATA, перевод строки и переменное число строк описывающих структуру каталогов и символические ссылки.
Строка описания инф.узла раздела INODE_TABLE состоит из девяти чисел разделённых пробелами. Общая длина такой строки -- 72 + перевод строки (73-ий символ). Назначение девяти полей следующее:
1) 16-битное число (4 знака) -- режим доступа типа mode_t. Назначение битов этого поля описано в stat(2).
2) 16-битное число (4 знака) -- идентификатор пользователя владельца файла UID.
3) 16-битное число (4 знака) -- идентификатор группы-владельца файла GID.
4) 64-битное число (16 знаков) -- размер файла.
5) 32-битное число (8 знаков) -- время последнего доступа atime.
6) 32-битное число (8 знаков) -- время последней модификации mtime.
7) 32-битное число (8 знаков) -- время последнего изменения ctime.
8) 16-битное число (4 знака) -- количество жёстких ссылок.
9) 32-битное число (8 знаков) имеет два назначения:
а) в случае обычных файлов, символических ссылок и директорий, это ссылка на дополнительную информацию к этому инф.узлу в разделе
DATA.
Ссылка представляет собой смещение в байтах от начала раздела
DATA,
т.е. начиная от первой строки после заголовка
DATA.
б) в случае специальных файлов устройств это поле хранит тип устройства (значение типа
dev_t)
В разделе DATA хранится дополнительная информация для директорий, символических ссылок и обычных файлов:
а) для директорий описание начинается фиксированным заголовком
DIR,
затем идёт пробел и 32-битное число (8 знаков) -- число элементов в директории
(entries),
перевод строки, после чего идёт ещё
entries
строк -- описание каждого элемента.
Описание элемента директории состоит из 1) имени файла -- строки с нуль-завершением; 2) 32-битное число -- номер инф.узла.
б) описание символической ссылки начинается фиксированным заголовком LNK, затем идёт пробел и значение ссылки -- строка с нуль-завершением.
в) для обычных файлов описание начинается фиксированным заголовком REG, затем идёт пробел и 32-битное число (8 знаков) -- число фрагментов файла (frags), перевод строки, после чего идёт ещё frags строк с описанием каждого фрагмента. Описание каждого фрагмента состоит из двух 32-битных чисел разделённых пробелами: 1) номер блока устройства, в котором располагается первый блок фрагмента файла (при этом ноль должен восприниматься как фрагмент sparse-блоков); 2) число блоков в фрагменте -- все эти блоки располагаются на устройстве непрерывно следуя друг за другом