#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, мне нужно скопировать путь к файлу где-нибудь в файле изображения. Можешь ты мне это сказать?