Как ОС получает доступ к файлам, хранящимся на жестком диске?

Как ОС получает доступ к файлам, хранящимся на жестком диске?

Я знаю, что первое, к чему ОС обращается на жестком диске, — это суперблок.

Но что потом?

решение1

ОС полагается на ядро, которое в свою очередь использует драйверы для различных файловых систем для чтения/записи. Обработка файлов абстрагируется через драйверы и системные вызовы через интерфейсы, так что когда вы говорите, что open("file.txt")вам не нужно знать, как файл хранится на диске и т. д. Существует большой диапазон файловых систем, каждая из которых имеет свой собственный способ обработки вещей. Вот общий фрагмент по системе ext.


Пример от Ext.

  1. Блоки: Диск разделен наБлокисмежного пространства.
  2. Группы блоков: Блоки разделены на группы.
  3. Инод: Структурированный набор информации о записи, такой как файл, каталог и т. д.
  4. Каталог: Список инодов <–> имена

КаждыйГруппа блоковимеет таблицу структур инодов, принадлежащих группе.


Основная схема:

                     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

Связанный контент