Использование размера частичного файла в качестве неявного маркера конца может быть ненадежным. Гораздо лучше было бы сначала отправить части, а затем отправить контрольный файл, в котором перечислены части (, возможно, с контрольными суммами sha256 для обнаружения проблем с передачей ), чтобы программа-получатель могла проверить, все ли части были переданы, и начать только повторную сборку. тогда.
ОС опирается на ядро, которое, в свою очередь, использует драйверы для различных файловых систем для чтения/записи. Обработка файлов абстрагируется через драйверы и системные вызовы через интерфейсы, поэтому, когда вы говорите open("file.txt")
, вам не нужно знать, как файл хранится на диске и т. д. Существует большое количество файловых систем, каждая из которых свой собственный способ обращения с вещами. Вот общий фрагмент системы 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 ненеимеет место:
Инод содержит такую информацию, как:
ДАННЫЕ для файла сохраняются блоками. Инод содержит информацию о том, какие блоки занимает файл. Это делается указателями в inode. Существует более одного типа указателей. Если мы вызовем указатель на данные PTR так, как:
[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