Я знаю, что первое, к чему ОС обращается на жестком диске, — это суперблок.
Но что потом?
решение1
ОС полагается на ядро, которое в свою очередь использует драйверы для различных файловых систем для чтения/записи. Обработка файлов абстрагируется через драйверы и системные вызовы через интерфейсы, так что когда вы говорите, что open("file.txt")
вам не нужно знать, как файл хранится на диске и т. д. Существует большой диапазон файловых систем, каждая из которых имеет свой собственный способ обработки вещей. Вот общий фрагмент по системе ext.
Пример от Ext.
- Блоки: Диск разделен наБлокисмежного пространства.
- Группы блоков: Блоки разделены на группы.
- Инод: Структурированный набор информации о записи, такой как файл, каталог и т. д.
- Каталог: Список инодов <–> имена
КаждыйГруппа блоковимеет таблицу структур инодов, принадлежащих группе.
Основная схема:
Padding 1024 bytes
Super-Block 1 block *
Block Group Descriptor Table many blocks *
Reserved many blocks
Data Block Bitmap 1 block *
inode Bitmap 1 block *
inode Table many blocks *
Data Blocks many more blocks *
Супер-блоксодержит такую информацию, как:
- Общее количество инодов
- Общее количество блоков
- Количество блоков в группе
- Количество инодов в группе
Помимо хранения в группе блоков 0 избыточные копии хранятся в другом месте в качестве резервных копий (на случай повреждения).
Таблица дескрипторов групп блоковнаходится сразу послеСупер Блок. Среди прочего, в нем говорится:
- КоличествоГруппы блоковв разделе
- Дескриптор для каждогоГруппа блоков
Где каждый дескриптор содержит информацию о том, где находятся структуры данных для этогоГруппа блоковрасположен.
Группа блоковсреди прочего, постановляет:
- Адрес блока, где начинается таблица инодов
- Количество каталогов в группе
Растровые изображениясодержит информацию об использовании. 0
для неиспользованных и 1
для использованных.
Инод(Узел индекса)
Структура inode делаетнетдержать:
- имя
- файл-данные
Инод содержит такую информацию, как:
- Тип, Разрешения, Пользователь, Даты, … Указатели на ДАННЫЕ
ДАННЫЕ для файла сохраняются в блоках. Инод содержит информацию о том, какие блоки занимает файл. Это делается указателями в иноде. Существует более одноготипуказателей. Если мы назовем указатель на данные PTR так:
[PTR] Адрес для блокировки с помощью ДАННЫХ
- 12 - Прямые указатели:
- [PTR] Адрес для блокировки с помощью ДАННЫХ
- 1 - Одиночный косвенный указатель:
- [S_PTR] Адрес для блокировки со списком PTR
- 1 - Двойной косвенный указатель:
- [D_PTR] Адрес для блокировки со списком S_PTR
- 1 - Тройной косвенный указатель:
- [T_PTR] Адрес для блокировки со списком D_PTR
Количество указателей в одномблокироватьзависит отразмер блока.
Каталог — это inode. Его данные содержат информацию о файлах. Каждая запись связывает имя и inode. Каждый каталог также имеет .
, сам по себе, и ..
эффективно ссылается на родительский каталог. Их нельзя удалить.
Корневой каталог всегда имеет inode 2 на ext. Сделайте stat /
или cd /; stat .
для просмотра. Это ..
ссылки на.
При создании файла он автоматически добавляется в соответствующий каталог.
Номера инодов являются индексами. Они являются упорядоченными индексами в таблице инодов для структуры инодов. Поскольку структуры инодов имеют фиксированный размер, можно вычислить, где расположена структура инодов.
Так как суперблок имеетinodes_per_groupнайти группу блоков можно по:
block_group = (inode - 1) / inodes_per_group;
И после этого найдите индекс:
inode_index = (inode - 1) % inodes_per_group;
Прочитайте структуру и ссылки на данные. Прочитайте данные.
debugfs
Можно использовать debugfs
для извлечения различной информации о файловой системе.
-w
Если вам дороги данные, убедитесь, что вы не используете этот флаг.
При желании можно создать небольшой образец для экспериментов.
truncate -s 2M test
mkfs.ext4 -F test
mkdir x
sudo mount test x
sudo chown me x
cd x
echo "Hello Disk" >hello.txt
mkdir a b c
echo "Hello Bee" >b/hib.txt
sudo unount x
debugfs test
Введите ?
для просмотра списка команд.
debugfs: stats
(уменьшенный)
Inode count: 256
Block count: 2048
Reserved block count: 102
Free blocks: 953
Free inodes: 240
First block: 1
Block size: 1024
Fragment size: 1024
Group descriptor size: 64
Blocks per group: 8192
Inodes per group: 256
Inode blocks per group: 32
First inode: 11
Inode size: 128
Directories: 5
Group 0: block bitmap at 18, inode bitmap at 34, inode table at 50
953 free blocks, 240 free inodes, 5 used directories, 240 unused inodes
[Checksum 0x055a]
...
debugfs: imap hello.txt
Inode 12 is part of block group 0
located at block 51, offset 0x0180
Другие примеры: https://www.cs.montana.edu/courses/309/topics/4-disks/debugfs_example.html