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

#c #filesystems #storage #disk #inode

#c #файловые системы #Хранение #диск #индекс

Вопрос:

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

индекс структуры { blkcnt_t i_блоков; … loff_t i_size; }

Я предполагаю, что i_blocks хранит номера блоков. но как нумеруются номера блоков? его тип u64

итак, вопрос в том, содержит ли это поле все блоки [номера], то как они хранятся, u64 означает 64 бита, и если я представляю, что каждый 4-бит относится к номерам блоков, то на каждый индекс приходится 16 блоков. так, например, если поле 0b1111 1110.... i_blocks равно, то 1111-это номер блока 15, а 1110-номер блока 14 и так далее. поэтому я хотел бы знать, если количество бит для представления заблокировать номер 4 бита, то есть может быть только 15 блоков в inode таким образом, у меня есть количество блоков и количество блоков, но я все равно не смог области третье поле gt;gt;gt; что такое базовый адрес блока данных так, например, если inode число 1111 которые соответствуют some.txt текстовый файл с данными, Привет мир, где смещение hello world данных в запоминающее устройство. Этот массив полей смещения данных с соответствующими номерами индексов я не смог найти. Может ли кто-нибудь, пожалуйста, направить меня к ответу в том, где я могу найти байт смещения данных на носителе, и он должен быть в структуре индекса?

Комментарии:

1. Где вы нашли это сооружение? В какой книге или на каком сайте? Разве книга или сайт не содержат никакой документации о структуре или ее членах?

2. Что касается i_blocks элемента, имя типа blkcnt_t должно подсказывать, что i_blocks может быть: это количество блоков, которые занимает файл.

3. @Someprogrammerdude его исходный код ядра linux, содержащий структуру индексов в linnux/fs.h

4. Возможно, вы также захотите вложить средства в некоторые учебники об операционных системах и файловых системах. Как работают файловые системы на основе индексов старого стиля, хорошо задокументировано как в книгах, так и во всем Интернете. Обычно существует массив прямых и косвенных указателей на блоки, в которых перечислены все блоки, используемые файлом, часто с использованием «стандартной» схемы индексирования на основе нуля (где блок 0 является первым блоком на диске, обычно загрузочным блоком).

5. Предполагая размер блока 1 КБ и размер файла 72 байта. Затем i_size == 72 и i_blocks == 1 (потому что все эти 72 байта поместятся в один блок данных). Если размер файла вместо этого составляет 1254 байта, то i_size == 1254 в то время i_blocks == 2 как (потому что для хранения всех данных требуется два блока данных).

Ответ №1:

Краткий набросок для поиска индекса номер ii:

  • найдите блок индексов, в котором живет ii: ii/InodesPerBlock ; используйте это в качестве индекса для блоков inod.
  • найдите индекс в этом блоке : ii%InodesPerBlock
  • обработайте (приведите) это местоположение как индекс и используйте первую запись в массиве блоков[] в качестве номера первого блока данных.

Для поиска файла этой операции должна предшествовать аналогичная операция для поиска записи каталога и определения номера файла

ПРИМЕЧАНИЕ: существует множество констант манифеста, все они могут быть найдены в суперблоке

  • Размер блока
  • тип файловой системы
  • размер номера блока
  • количество блоков индексов (или: количество индексов)
  • размер индекса (или: InodesPerBlock)
  • Количество блоков данных
  • Расположение индекса, содержащего корневой каталог
  • Расположение свободного списка, содержащего неиспользуемые номера блоков
  • Состояние/резервное копирование/…
  • et cetera …

ПРИМЕЧАНИЕ 2: это упрощенная схема. Современные файловые системы могут содержать дополнительные структуры для повышения эффективности или избыточности. Также: файловая система может объединять более одного физического блока в один логический блок (например, 8*512 —gt;gt;gt; 4096)

ПРИМЕЧАНИЕ 3: суперблок расположен по номеру блока=0 (по крайней мере, в UFS), что означает, что 0 его можно использовать в качестве контрольного значения для номеров блоков, относящихся к фактическим (некорневым) блокам. Таким образом, массивы номеров блоков внутри индекса s могут быть инициализированы всеми нулями.

ПРИМЕЧАНИЕ 4: все эти структуры находятся на диске. Ядро может поддерживать (и будет поддерживать!) дополнительные аналогичные структуры в памяти. Эти структуры будут ссылаться как на самих себя (с помощью указателей, смещений или индексов), так и на дисковые блоки (числа).

Комментарии:

1. Итак, каков размер inodesPerBlock == количество индексов в этом блоке Множество индексов в блоке

2. Учитывая размер блока, размер анода можно вычислить, используя количество индексов на блок, или наоборот. И: размер блока является фиксированной константой.

3. итак, если, например, у меня есть 32 индекса, в которых будут храниться блоки данных? это первый индекс 32==смещение блоков данных?

4. Не путайте блоки и номера блоков.

5. Хорошо, также последний вопрос, если у меня есть образ файловой системы в формате ext2, то как сохранить путь к файлу. У меня есть только объект индекса и объект дескриптора группы блоков с bg_members и объектом суперблока. Вот над чем я работаю последние несколько дней. Пытаюсь понять. Так, например, если пользователь выполнил команду cp, мне нужно скопировать путь к файлу где-нибудь в файле изображения. Можешь ты мне это сказать?