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

Использование размера частичного файла в качестве неявного маркера конца может быть ненадежным. Гораздо лучше было бы сначала отправить части, а затем отправить контрольный файл, в котором перечислены части (, возможно, с контрольными суммами sha256 для обнаружения проблем с передачей ), чтобы программа-получатель могла проверить, все ли части были переданы, и начать только повторную сборку. тогда.

1
01.06.2021, 16:20
1 ответ

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


Пример по доб.

  1. Блоки:Диск разделен на Блоки непрерывного пространства.
  2. Группы блоков:Блоки делятся на группы.
  3. Inode:Структурированный набор информации о записи, такой как файл, каталог и т. д.
  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 избыточные копии хранятся в другом месте в качестве резервных копий (на случай повреждения ).


Таблица дескрипторов группы блоков находится непосредственно после суперблока . Это справедливо, среди прочего:

  • Количество групп блоков в разделе
  • Дескриптор для каждой группы блоков

Где каждый дескриптор содержит информацию о расположении структур данных для этой группы блоков .


Группа блоков сохраняется,между прочим:

  • Адрес блока, с которого начинается таблица inode
  • Количество каталогов в группе

Растровые изображения содержат информацию об использовании. 0для неиспользуемых и 1для использованных.


Индексный узел(Индексный узел)

Структура inode ненеимеет место:

  • имя
  • файл -данные

Инод содержит такую ​​информацию, как:

  • Тип, Разрешения, Пользователь, Даты, … Указатели на ДАННЫЕ

ДАННЫЕ для файла сохраняются блоками. Инод содержит информацию о том, какие блоки занимает файл. Это делается указателями в inode. Существует более одного типа указателей. Если мы вызовем указатель на данные PTR так, как:

[PTR] Адрес для блокировки данных

  • 12 -Прямые указатели :
    • [PTR] Адрес для блокировки данных
  • 1 -Простой косвенный указатель :
    • [S _PTR] Адрес для блокировки со списком PTR
  • 1 -Двойной косвенный указатель :
    • [D _PTR] Адрес для блокировки со списком S _PTR
  • 1 -Тройной косвенный указатель :
    • [T _PTR] Адрес для блокировки со списком D _PTR

Количество указателей в одном блоке зависит от размера блока -.


Каталог

Каталог — это индексный узел. Его данные содержат информацию о файлах. Каждая запись связывает имя и индексный дескриптор. Каждый каталог также имеет .для себя и ..для эффективной связи с родительским каталогом. Их нельзя удалить.

Корневой каталог всегда имеет индекс 2 на доб. Сделайте stat /или cd /; stat., чтобы увидеть. Это ..ссылки на.

Когда файл создается, он автоматически добавляется в соответствующий каталог.


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

Поскольку суперблок имеет инодов _на _группу , можно найти группу блоков по:

block_group = (inode - 1) / inodes_per_group;

И после этого найти индекс:

inode_index = (inode - 1) % inodes_per_group;

Ознакомьтесь со структурой и ссылками на данные. Прочитайте данные.

отладки

Можно использовать 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

4
28.07.2021, 11:28

Теги

Похожие вопросы