MINIX file system

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 19:15, 16 мая 2016.
MINIX file system
Полное название MINIX file system version 3
Features
Даты зарегистрирован last metadata change, last file change, last file access
Дата резолюции 1s
Разрешения файловой системы POSIX
Прозрачное сжатие No
Транспорантное шифрование No (provided at the block device level)
Другие
Операционная система MINIX 3, Linux and HelenOS

Файловая система Minix— первая файловая система, которая использовалась в операционной системе Minix, ставшей прообразом ядра ОС Linux.

История

MINIX был написан с нуля Эндрю Таненбаумом в 1980-е годы, как Unix-подобную операционную систему, исходный код которой может свободно использоваться в образовании. Файловая система MINIX была разработана для использования с ОС MINIX.Она копирует основную структуру файловой системы Unix , но позволяет избежать каких - либо сложных функций в интересах сохранения исходного кода чистым, ясным и простым, чтобы удовлетворить общую цель MINIX быть полезным учебным пособием.

Когда Линус Торвальдс впервые начал писать ядро свое операционной системы Linux (1991), он работал на машине под управлением MINIX, и использовал его как шаблон файловой системы. Вскоре появились проблемы, так как длина имени файлов в файловой системе MINIX ограничивалась четырнадцатью символами (тридцатью в более поздних версиях), разделы были ограничены до 64 Мегабайт, и файловая система была разработана для учебных целей, а не настроена на производительность. Расширенная файловая система (ext; апрель 1992 года) была разработана для замены MINIX, но это получилось только во второй версии этой файловой системы(ext2) , когда Linux получил файловую систему коммерческого класса.

Устройство файловой системы MINIX

Файловая система MINIX

В начале диска первым блоком в любой файловой системе всегда идет загрузочный сектор размером в 512 байт. Дальше идет суперблок, в котором записана основная информация - размер блока, число нод и т.д. С помощью этих параметров, записываемых на диске, позже вычисляются размеры битовых карт и другие параметры. Например, при размере блока в 1 килобайт (это один из ранних стандартов для файловой системы MINIX) размер битмапа - или битовой нодовой карты - или просто таблицы битов, которая является хранилищем индексов нод - равен одному килобайту - или 8 килобитам - т.е. хранит информацию о 8192 нодах. Если например в файловой системе 10000 нод, то ей с избытком хватает всего двух блоков для размещения битмапа этих нод (на каждую ноду - по одному биту). Сама нода в MINIX имеет размер в 64 байта - это еще один стандарт MINIX. Соответственно в одном блоке может храниться 16 нод: 64 * 16 = 1024

Суперблок

Суперблок ФС MINIX

Суперблок файловой системы MINIX при записи на диск хранит следующие параметры:

  • число нод
  • число блоков, отведенных под битовую карту нод - node bit map
  • число блоков, отведенных под битовую карту блоков - block bit map
  • начальный адрес, с которого хранятся сами файлы
  • двоичный логарифм отношения block/zone
  • максимально возможный размер файла
  • магическое число
  • число блоков
 struct minix_super_block {
   __u16 s_ninodes;   /* число нод */
   __u16 s_nzones;    /* число зон */
   __u16 s_imap_blocks;  /* число блоков */
   __u16 s_zmap_blocks;	/* число блоков  */
   __u16 s_firstdatazone;	/* начало блоков с данными */	
   __u16 s_log_zone_size;	/* размер зоны с данными */
   __u32 s_max_size;	/* максимальный размер файла */
   __u16 s_magic;	/**/
   __u16 s_state;	/**/
   __u32 s_zones;	/**/
 };

После того, как суперблок считывается с диска в память, на основании этих параметров будут вычислены другие, которые на диске не хранятся:

  • указатель на корневую ноду
  • адрес первого свободного бита в карте нод
  • адрес первого свободного бита в карте блоков
  • устанавливается флаг на чтение/запись для всей файловой системы и т.д.

Битовые карты, работа с файлами

В файловой системе MINIX блоки могут быть объединены в зоны по 2, 4, 8, ... и т.д. блоков. Зона также может быть равна одному блоку. Битовая карта блоков ссылается только на блоки данных. В обоих битовых картах первый и второй биты не используются и соответственно равны 0 и 1. Битовые карты хранят информацию о свободных/занятых блоках и нодах. Когда файл удаляется, соответствующий бит вычисляется и затем проставляется в ноль как для карты нод, так и для карты блоков. При создании файла ищется первый свободный бит в карте нод, проставляется в единицу, затем выделяется нода для файла. Адрес первой свободной ноды не вычисляется, он постоянно хранится в версии суперблока, который загружен в память. Аналогично в суперблоке хранится указатель на первый свободный блок, он не вычисляется, а сразу используется при создании файла.

Каждый файл представлен нодой. Нода хранит мета-информацию о файле: тип файла, права доступа, владельца, время создания, размер, указатели на блоки данных. Также в ноде хранится родительская директория для файла. Указатели на блоки данных делятся на две части - на прямые и косвенные. Прямых указателей семь штук - они указывают непосредственно на первые семь блоков данных. Если размер данных в файле превышает семь блоков - или семь килобайт - тогда используются указатели из второй группы - косвенный указатель и двойной косвенный указатель, которые указывают не на сами данные, а на блоки, в которых хранятся указатели на блоки данных.

Когда файл открывается, выделяется память для его ноды, которая помещается в специальную таблицу вместе с другими открытыми нодами. Если этот же файл открывается еще раз каким-то другим процессом, вторая нода создаваться не будет. В уже открытой ноде будет увеличен на единицу специальный счетчик, при закрытии файла - уменьшен на единицу. Когда этот счетчик станет равен нулю, нода будет сохранена на диск и удалена из памяти.

Файл и директория

Адрес блока на диске имеет размер в 32 бита. Блок имеет размер в 1 килобайт. можно посчитать, сколько адресов блоков можно сохранить в одном блоке: 1024 : 4 = 256.Т.е. один косвенный указатель может указывать еще на 256 блоков. А вот косвенный указатель второго уровня может указывать:256 * 256 = 65536. Таким образом максимально возможный размер файла в данном случае, при наличии косвенных указателей первого и второго уровней - 64 мегабайта.
Вид 32-байтной ноды:

 struct minix_inode {
   __u16 i_mode;
   __u16 i_uid;
   __u32 i_size;
   __u32 i_time;
   __u8  i_gid;
   __u8  i_nlinks;
   __u16 i_zone[9];
 };

Директории в файловой системе MINIX организованы в классическое дерево. Каждая директории может включать другие директории и файлы. Директория - это файл, который имеет постоянный размер в 16 байт. Два первых байта хранят номер ноды, остальные хранят ее имя. Т.е. все как всегда в UNIX.

a) Корневая ФС b) Несмонтированная ФС с) Результат монтирования ФС b) в /user

Вид директории:

 struct minix_dir_entry {
   __u16 inode;
   char name[0];
 };

Когда пользователь вводит команду

 %mount/def/fd1/user

Это значит смонтировать файловую систему в вершину /user. При этом файловая система производит следующие действия:

  1. устанавливает флаг в /user, как индикатор успешного монтирования
  2. загружает суперблок и текущую ноду новой смонтированной файловой системы в карту блоков и нод
  3. устанавливает текущую ноду старой файловой системы, как корневую для новой смонтированной
  4. устанавливает ноду только что смонтированной файловой системы в точку ноды /user

На изображении представлена ФС (файловая система)

a) Корневая ФС
b) Несмонтированная ФС
с) Результат монтирования ФС b) в /user

Примечания