Файловая система: как найти блок файла, представленный inode?

Я пишу файловую систему для своей операционной системы и занимаюсь исследованиями существующих файловых систем, прежде чем приступать к разработке собственных. Я столкнулся с некоторыми слайдами о Системной Системе System 5 и довольно смущен тем, как найдены блоки файлов.

Например, если бы я хотел найти блок 5 файла, представленный inode 12 … как бы я это сделал?

Может кто-нибудь объяснить (на высоком уровне), как найти блок файла, представленный inode?

One Solution collect form web for “Файловая система: как найти блок файла, представленный inode?”

Структуры, извлеченные из Ultrix 3.0 v7 restor могут произойти изменения:

ftp://ftp.uvsq.fr/pub/tuhs/PDP-11/Distributions/dec/Ultrix-3.0/v7restor/include/sys/

S5fs довольно архаичен, но …:

Разметка диска может быть примерно такой:

 [B][S][Inode List][ Data Blocks ] | | | +-- Super Block +----- Boot Area 

В Super Block хранятся данные для файловой системы. Список Inode представляет собой массив inodes, содержащий данные для файлов (включая каталоги) и указатели на данные, находящиеся в блоках данных .

Список Inode имеет фиксированный размер.

Структура суперблока на диске:

 struct filsys { unsigned short s_isize; /* size in blocks of i-list */ daddr_t s_fsize; /* size in blocks of entire volume */ short s_nfree; /* number of addresses in s_free */ daddr_t s_free[NICFREE]; /* free block list */ short s_ninode; /* number of i-nodes in s_inode */ ino_t s_inode[NICINOD];/* free i-node list */ char s_flock; /* lock during free list manipulation */ char s_ilock; /* lock during i-list manipulation */ char s_fmod; /* super block modified flag */ char s_ronly; /* mounted read-only flag */ time_t s_time; /* last super block update */ daddr_t s_tfree; /* total free blocks*/ ino_t s_tinode; /* total free inodes */ short s_m; /* interleave factor */ short s_n; char s_fname[6]; /* file system name */ char s_fpack[6]; /* file system pack name */ long s_unique; /* saved unique number (sys unique) */ }; 

Структура Инода на диске:

 struct dinode { unsigned short di_mode; /* mode and type of file */ short di_nlink; /* number of links to file */ short di_uid; /* owner's user id */ short di_gid; /* access control file (was gid) */ off_t di_size; /* number of bytes in file */ char di_addr[40]; /* disk block addresses */ time_t di_atime; /* time last accessed */ time_t di_mtime; /* time last modified */ time_t di_ctime; /* time created */ }; 

di_mode сообщит вам, является ли он обычным файлом, каталогом, именованным каналом и т. д. и какие разрешения он поддерживает.

Вы спрашиваете о di_addr . Это содержит 13 трехбайтовых адресов, всего 39 байт. Последний байт используется некоторыми системами в качестве маски для создания файлов для каталогов.

Файл lib.c в корневом restor источника restor (см. restor ) содержит функции для преобразования longs в и из 3-байтных адресов диска.

Первые 10 – прямые указатели, 11-13 – косвенные указатели.

Когда вы запрашиваете блок номер 5, это будет прямой указатель. Прочтите его значение и прочитайте данные из этого блока.

Другой ref: http://erdos.csie.ncnu.edu.tw/~ccyang/Os2/Slides/chapter9.ppt

  • Все мои суперблоки повреждены!
  • Как определить тип файловой системы / раздела
  • Короткое чтение при попытке открыть / dev / sda2
  • Структура блока Ext2: размер зарезервированных блоков GDT
  • mdadm - Случайно вывел «mdadm --create» на существующий рейд-1. Суперблок теперь поврежден, и я не могу восстановить данные. Я развеял данные?
  • fsck часто возникает (после каждых 3-4 ботинок)
  • Создание дискового устройства в файле
  • Interesting Posts

    Как объединить разные строки файлов?

    Когда используется сетевой менеджер, OpenSuSe застревает во время загрузки в течение 10 минут

    Извлеките список .zip-файлов в один новый каталог каждый, имя каталога, которое будет взято из имени zip-файла

    Сценарий, вызывающий ifconfig и службу openvpn, не будет работать, но если интерфейс уже работает, он работает

    извлечь url между 2 строками в файле

    Местоположение Fedora / usr / share / v86d / initramfs

    Autoconfig / Automake не может генерировать AM_CFLAGS & AM_LDFLAGS для зависимой библиотеки D-BUS. Зачем?

    Как добавить символ в конец строки с помощью SED?

    Как выполнить ping GW в подсети?

    Разный цвет для диапазона KiB в `ls -l`

    Исправить слишком длинную цепочку хеш-маршрутов без перезагрузки

    Обновление ядра 2.6.18 до 2.6.32 на CentOS 5.10

    Xrandr показывает экран без текущего / активного разрешения

    Можно ли использовать systemd для запуска и остановки службы на основе наличия файла?

    Добавить 'install selected .deb files' как команду в действиях Nautilus

    Linux и Unix - лучшая ОС в мире.