Файловая система Linux в подробностях
Unix-подобные операционные системы кардинально отличаются от своих "собратьев" по Windows-линейке. Чтобы разобраться в Linux, пользователь должен потратить не один день на изучение ОС. Но с чего начать? С фундаментальной основы - файловой системы.
Википедия популярно объясняет нам, что файловая система - это способ представления информации на носителе данных. Также ФС - это часть операционной системы, отвечающая за выполнение операций над файлами. Любая файловая система состоит, как минимум, из двух уровней - уровня представления данных и системных вызовов для работы с ними.
Любая операционная система должна уметь работать с несколькими файловыми системами. Примером этому может служить ФС обычного CD-диска - ISO 9660. Дабы программист не мучался с особенностями различных файловых систем, Linux использует системный вызов open(), который, в свою очередь, позволяет обращаться к файлам прозрачно, то бишь, на каком типе ФС расположен тот или иной файл, не важно.
Архитектура файловой системы в Linux не сложна для понимания: жёсткий диск разбит на несколько секторов, размер коих равен 512 байтам (рис. 1). Первый сектор корневого раздела (/) является загрузочным, именно с него происходит инициализация ОС при запуске. Остальные же секторы объединяются в так называемые логические блоки, размер коих равен 1-4 Кб. Логические блоки объединяются в группы, нумеруемые последовательно.
Рис. 1 |
На рисунке - схематичное представление журналируемой файловой системы ext3 (именно её использую я, предпочитая стабильность и "обкатанность" новомодным веяниям ext4). Любое приложение обращается к файлам по выбору программиста: либо через функцию glibs библиотеки GNU C, либо через стандартные системные вызовы (read(), open(), write(), close()), что значительно повышает общую производительность программы. Далее у нас идёт виртуальная файловая система (VFS), спасательный круг программиста - ведь если бы её не было, разработчик был бы вынужден ссылаться к различным системным вызовам, соответствующим той или иной файловой системе. Далее идёт тип ФС, к которой обращается пользователь, и, собственно, драйвер самого устройства хранения информации.
Linux-раздел с файловой системой ext3 в схематичном изображении выглядит примерно так: mbr (загрузочная запись), суперблок, за ним следует дескриптор группы блоков, битовая карта блоков, inode дескриптор, double indirect block, triple indirect block. Теперь рассмотрим всё по порядку. Суперблок есть начальная точка файловой системы, хранящий в себе всю информацию о её строении. Его размер равен 1024 байтам, и расположен он по смещению на 1024 байта от начала файловой системы. В каждой группе блоков суперблок дублируется для упрощения процесса восстановления в случае краха системы. В суперблоке также определяется размер файловой системы, максимальное количество файлов, объём незанятого пространства, а также информация, где искать свободные участки. При инициализации ОС суперблок считывается в память, а все изменения в файловой системе вначале обязательно записываются в суперблок.
Дескриптор группы блоков есть описание местоположения битовой карты блоков и индексных дескрипторов. Структура системного блока находится по адресу /usr/src/linux/include/linux/fs.h. Битовая карта блоков - это структура, каждый из битов которой показывает, отведён ли соответствующий по номеру блок какому-либо файлу. В случае записи файла на диск block bitmap ищет доступные блоки для записи. Битовая карта индексных дескрипторов выполняет аналогичные действия по отношению к таблице индексных дескрипторов.
Каждому файлу соответствует один единственный индексный дескриптор, индексируемый порядковым номером (индекс файла). В индексном дескрипторе хранятся все метаданные файла, исключая, впрочем, его имя. Также в нём хранится указатель на данные файла. Сам указатель есть массив из пятнадцати адресов блоков, первых двенадцать коего являют собой прямой указатель на место хранения файла. Следующий адрес в этом массиве представляет собой косвенную ссылку, в которой хранится адрес следующих блоков с данными отдельно взятого файла (рис. 2).
Рис. 2 |
Если файл превышает заданную длину, то он ссылается на блок двойной косвенной адресации. Блок хранит в себе список адресов блоков, в коих, соответственно, содержится информация об адресе последующих блоков данных. Последний адрес массива-указателя задаёт адрес блока тройной косвенной адресации, в котором хранятся адреса блоков двойной косвенной адресации.
Дабы мы могли получить доступ к файлам на жёстком диске, который принёс друг, мы должны примонтировать его к корневой файловой системе. Что значит примонтировать? Это значит, что мы должны помочь ядру системы "привязать" некоторый каталог в файловой системе с неким блочным устройством, в данном случае - с жёстким диском нашего друга. Для этого ядро передаст ссылку на запрашиваемую файловую систему драйверу, отвечающему за поддержку данного типа ФС, и, если инициализация прошла успешно, в таблицу монтирования заносится вся информация о блочном устройстве, а последнее, в свою очередь, становится доступным для чтения\записи обычному пользователю. В графической среде GNOME есть штатная утилита automount (по крайней мере, я встречал её во всех дистрибутивах, с которыми мне довелось работать), автоматически монтирующая новые подключённые жёсткие диски. Если же у вас такой программы не оказалось, то на помощь приходит команда mount. Общий формат вызова таков: сначала мы задаём тип файловой системы, потом координаты устройства и каталог, куда будем монтировать жёсткий диск. Рассмотрим это на следующем примере:
#sudo mkdir /media/windows //создаём каталог монтирования по адресу /media/windows
#sudo mount -t NTFS-3G /dev/sdaX /media/windows //монтируем NTFS раздел
Стоит сделать замечание, что в примере рассмотрено устройство sdaX, где Х - порядковый номер, заданный жёсткому диску. Полный список примонтированных устройств можно получить, введя в терминале команду mount -l (рис. 3).
Рис. 3 |
Ну вот, на сегодня и всё. Мы рассмотрели основные принципы управления файлами в Linux, научились монтировать жёсткие диски и готовы для дальнейшего обучения. Только помните, что самый лучший учитель - это вы, и только на практике вы сможете научиться всем премудростям ОС. Так что дерзайте, а я ненадолго с вами прощаюсь. Свои вопросы можете присылать на мой почтовый ящик, я постараюсь ответить всем. На сим, пожалуй, и откланяюсь. До новых встреч!
Кристиан КАРМАК