Как устроена UFS2
Суперблок
В начале UFS находится суперблок, в котором хранится основная информация: строение файловой системы, размер, конфигурация.
Рассмотрим создание файловой системы UFS2:
# newfs -L NameVolume -O2 -U -n /dev/ad1
/dev/ad1: 2014.0MB (4124736 sectors) block size 16384, fragment size 2048 using 11 cylinder groups of 183.77MB, 11761 blks, 23552 inodes. with soft updates super-block backups (for fsck -b #) at: 160, 376512, 752864, 1129216, 1505568, 1881920, 2258272, 2634624, 3010976, 3387328, 3763680
Объём созданного раздела составляет 2014.0 Мбайт и содержит 4124736 секторов, размер блока равен 16384 байта, а размер фрагмента 2048 байт. В созданном разделе будут использоваться 11 групп цилиндров и объём информации, хранящийся в каждой группе, не более 183.77 Мбайт. Каждая группа цилиндров (Возможно кроме последней группы) содержит 11761 блок и 23552 индексных узла.(По умолчанию размер блока равен 8 фрагментам, а значит, в 11761 блоке содержится 94088 фрагментов.)
Soft Updates включены.
Копии суперблока будут находиться в секторах 160, 376512, 752864, 1129216, 1505568, 1881920, 2258272, 2634624, 3010976, 3387328, 3763680.(В каждой группе по одной резервной копии суперблока)
Воспользуемся TSK (/usr/ports/sysutils/sleuthkit):
# fsstat -f ufs /dev/ad1 | head -n 30
FILE SYSTEM INFORMATION -------------------------------------------- File System Type: UFS 2 - Тип файловой системы Last Written: Thu Oct 18 23:13:23 2007 - Время последнего монтирования Last Mount Point: /mnt/target - Куда последний раз была смонтирована Volume Name: NameVolume - Имя тома System UID: 0 Flags: Soft Dependencies - Включён SoftUpdate
METADATA INFORMATION -------------------------------------------- Inode Range: 0 – 259071 - Общее количество индексных узлов. (диапазон) Root Directory: 2 - Где находится корневой каталог Num of Avail Inodes: 259069 - Количество свободных индексных узлов Num of Directories: 1 - Количество директорий на данный момент
CONTENT INFORMATION -------------------------------------------- Fragment Range: 0 - 1031183 - Общее количество фрагментов. (диапазон) Block Size: 16384 - Размер блока (Состоит из 8 фрагментов) Fragment Size: 2048 - Размер фрагмента (1/8 часть блока) Num of Avail Full Blocks: 124821 - Количество свободных блоков Num of Avail Fragments: 14 - Количество свободных фрагментов
CYLINDER GROUP INFORMATION -------------------------------------------- Number of Cylinder Groups: 11 - Количество групп цилиндров Inodes per group: 23552 - Количество индексных узлов в каждой группе Fragments per group: 94088 - Количество фрагментов в каждой группе
Исходя из названия — суперблок, можно предположить, что он занимает 1 блок. В данном примере он равен 16384 байта и состоит из 8 фрагментов или 32 секторов. В UFS2 суперблок всегда находится в секторе 128.
Группы цилиндров
Система UFS делится на секции, называемые группами цилиндров. Каждая группа цилиндров содержит более подробную информацию о своей группе.
Вот как выглядит нулевая группа:
# fsstat -f ufs /dev/ad1 | fgrep -A 22 "Group 0:"
Group 0: Last Written: Fri Oct 19 23:28:15 2007 - Время последней записи Inode Range: 0 – 23551 - Диапазон/количество индексных узлов. Fragment Range: 0 – 94087 - Диапазон/количество фрагментов Boot Block: 0 – 3 - Загрузочный код. Super Block: 4 – 11 - Резервная копия суперблока. Super Block: 40 – 47 - Резервная копия суперблока. Group Desc: 48 – 55 - Дескриптор группы. (диапазон) Inode Table: 56 – 2999 - Таблица индексных узлов. (диапазон) Data Fragments: 3000 – 94087 - Диапазон фрагментов для записи данных Global Summary (from the superblock summary area): Данные от суперблока: Num of Dirs: 1 - Количество директорий на данный момент Num of Avail Blocks: 11384 - Количество свободных блоков Num of Avail Inodes: 23549 - Количество свободных индексных узлов Num of Avail Frags: 14 - Количество свободных фрагментов Local Summary (from the group descriptor): Данные от дескриптора группы: Num of Dirs: 1 - Количество директорий на данный момент Num of Avail Blocks: 11384 - Количество свободных блоков Num of Avail Inodes: 23549 - Количество свободных индексных узлов Num of Avail Frags: 14 - Количество свободных фрагментов Last Block Allocated: 0 - Последний выделенный блок Last Fragment Allocated: 0 - Последний выделенный фрагмент Last Inode Allocated: 0 - Последний выделенный индексный узел
Дескрипторы групп цилиндров
Каждая группа цилиндров содержит специальную структуру - дескриптор группы, в котором хранится информация об использованных и свободных фрагментах, блоках, индексных узлах и многое другое. В дескрипторе группы находятся битовые карты индексных узлов, блоков и фрагментов группы. К примеру, состояние выделения блоков и фрагментов определяется по битовой карте блоков или фрагментов соответственно. В битовой карте индексных узлов хранятся метаданные, описывающие файлы и каталоги.
Примеры
1. Список файлов и директорий?
Корневой каталог всегда находится в индексном узле 2, посмотрим, что там:
# fls -f ufs -a /dev/ad1 2
d/d 2: . d/d 2: .. d/d 188416: dir1 r/r 3: foremost r/r 4: file1.pdf r/r 5: file2.pdf r/r 6: file3.pdf r/r 7: file4.pdf r/r 8: file5.pdf r/r 9: file6.pdf d/d 164864: dir2
2. Список файлов и директорий в dir1?
# fls -f ufs /dev/ad1 188416
d/d 188417: 22 r/r 188418: file2.pdf
3. Сколько блоков/фрагментов занимает file6.pdf?
# istat -f ufs /dev/ad1 9
inode: 9 Allocated Group: 0 uid / gid: 1001 / 1001 mode: -rw-r--r-- size: 2328268 num of links: 1
Inode Times: Accessed: Fri Oct 19 22:22:23 2007 File Modified: Mon Sep 18 23:29:07 2006 Inode Modified: Sat Oct 20 16:11:57 2007
Direct Blocks: 23824 23825 23826 23827 23828 23829 23830 23831 23832 23833 23834 23835 23836 23837 23838 23839 23840 23841 23842 23843 23844 23845 23846 23847 … [skip] …
Indirect Blocks: 3144 3145 3146 3147 3148 3149 3150 3151
Indirect Blocks — блоки косвенной адресации, т.е. содержат указатели на другие блоки (в нашем случае задействован только один).