# 04 — Файловая система (inode-based FS) ## 1. Суперблок (SEG0, первая строка) ``` SUPER|v1|4096|256|1|free_head ``` Поля: - `version` — строка формата. - `seg_size` — 4096. - `inode_count` — максимум inode. - `root_inode` — обычно 1 (`/`). - `free_head` — первый свободный блок (или 0 если нет). ## 2. Формат inode ``` INODE|ino|type|mode|uid|gid|size|mtime|block0,block1,...|next_ino ``` | Поле | Тип | Описание | |---|---|---| | `ino` | int | номер inode (1..inode_count) | | `type` | `f`/`d`/`l` | файл / каталог / симлинк | | `mode` | octal | 12-бит rwxrwxrwx + suid/sgid | | `uid`/`gid` | int | владелец и группа | | `size` | int | размер в байтах (несжатый) | | `mtime` | int | unix-time последнего изменения | | `block*` | list | список адресов блоков (см. 03) | | `next_ino` | int | цепочка свободных inode (0 = конец) | > inode сериализуется в одну строку; длина ограничена 4096. ## 3. Каталоги Каталог — inode типа `d`. Содержимое — пары `name→ino`, сериализуются как: ``` DIR|ino|name1→ino1|name2→ino2|... ``` - Имена не содержат `/` и `|`. - `.` и `..` хранятся явно. ## 4. Блоки и free list - Каждый блок адресуется как `(seg_idx<<16)|block_idx`. - Free list — односвязный список: `free_head → block → ... → 0`. - `free_head` хранится в суперблоке. - При выделении/освобождении MMC обновляет `next_block` указатель внутри строки блока (первые 8 символов — `"NEXT|xxxx"`). ## 5. Операции ФС (минимум) | Операция | Действие MMC | |---|---| | `STAT path` | найти inode, вернуть поля | | `READ path off len` | найти блоки, склеить, Base64-декодировать, LZ4-распаковать, вернуть фрагмент | | `WRITE path off data` | найти/выделить блоки, сжать, записать, обновить size/mtime | | `LS dir` | прочитать DIR-запись, вернуть список | | `CHDIR path` | проверить `x` право, обновить cwd сессии | ## 6. Ограничения и экономия - inode_count ≤ 256 (чтобы таблица влезала в SEG0). - BLOCK_SIZE = 512 → 8 блоков на сегмент. - Маленькие файлы (< 1 блока) упаковываются в один блок; остаток — slack. - Метаданные (inode, DIR, free list) — **только** в SEG0. См. `05-users-permissions.md` для формата passwd и проверок прав.