Файловая система
Типы файлов
| Символ | Тип |
|---|---|
- | Обычный файл |
d | Каталог |
l | Символьная (мягкая) ссылка |
p | Канал / FIFO файл |
c | Символьное (байт-ориентированное) устройство |
b | Блочное устройство |
s | Сокет |
Определить тип файла можно утилитами file или ls -l.
Индексный дескриптор (inode)
Вся информация о файле содержится в индексном дескрипторе (i-узле, inode). Это структура данных со следующими полями:
- Размер файла (в байтах)
- Права доступа
- Количество жёстких ссылок
- Идентификатор владельца (UID) и группы (GID)
- Время последнего доступа, модификации, изменения прав
- Системный номер inode
- Индекс файловой системы (присваивается при
mount) - Тип файла и тип организации (прямая / последовательная)
- Физический адрес на диске
- Диспозиция: постоянный / временный / рабочий
Блоки и хранение файлов
Перед использованием диск форматируется — разбивается на блоки. Обычный размер блока — 4096 байт. Файл занимает целое число блоков: файл размером 4098 байт займёт 2 блока (8192 байта).
Схемы хранения файлов: FAT, INODE, NTFS.
Таблица индексных дескрипторов
Всегда находится в оперативной памяти. В памяти держится информация только об открытых файлах — остальные хранятся на диске. Каждая запись идентифицируется по номеру inode и идентификатору файловой системы.
При создании нового файла ядро создаёт новую запись в таблице и добавляет имя файла и номер inode в соответствующий каталог.
Таблица открытых файлов ядра
Фиксирует все открытые в системе файлы. Каждая запись содержит:
- Ссылку на inode открытого файла
- Режим открытия файла
- Указатель текущей позиции в файле
- Количество пользовательских дескрипторов этого файла
Стандартные дескрипторы процесса
При создании любого процесса ОС автоматически открывает три файла:
| Дескриптор | Файл | Назначение |
|---|---|---|
| 0 | /dev/tty (чтение) | Стандартный ввод |
| 1 | /dev/tty (запись) | Стандартный вывод |
| 2 | /dev/tty (чтение/запись) | Стандартный поток ошибок |
Системные вызовы для работы с файлами
open()
int open(char *name, int flag);
Открывает существующий файл. Возвращает номер первой свободной записи в таблице дескрипторов или -1 при ошибке.
Макросы из fcntl.h: O_RDONLY, O_WRONLY, O_RDWR, O_CREAT.
close(1);
open("file.txt", O_WRONLY);
/* Теперь стандартный вывод идёт в file.txt */
creat()
int creat(char *name, int mode);
Создаёт файл и открывает его на запись. Если файл существует — очищает его.
lseek()
off_t lseek(int fd, off_t offset, int whence);
Перемещает указатель чтения/записи в файле.
Утилиты для работы с файлами
ls -l # список файлов с типами и правами stat file # подробная статистика файла file name # определить тип файла find . -name "*.c" # поиск файлов
Структура файловой системы Linux
/ ├── bin/ (ls, cat, cp, rm, ...) ├── usr/ │ ├── bin/ (who, wc, file, ...) │ ├── lib/ │ └── include/ ├── dev/ └── etc/