Файловая система

Типы файлов

Символ Тип
-Обычный файл
dКаталог
lСимвольная (мягкая) ссылка
pКанал / FIFO файл
cСимвольное (байт-ориентированное) устройство
bБлочное устройство
sСокет

Определить тип файла можно утилитами file или ls -l.

Символьная ссылка — ссылка на сам файл, отображается в таблице файловых дескрипторов. Жёсткая ссылка — альтернативное имя файла.

Индексный дескриптор (inode)

Вся информация о файле содержится в индексном дескрипторе (i-узле, inode). Это структура данных со следующими полями:

  • Размер файла (в байтах)
  • Права доступа
  • Количество жёстких ссылок
  • Идентификатор владельца (UID) и группы (GID)
  • Время последнего доступа, модификации, изменения прав
  • Системный номер inode
  • Индекс файловой системы (присваивается при mount)
  • Тип файла и тип организации (прямая / последовательная)
  • Физический адрес на диске
  • Диспозиция: постоянный / временный / рабочий
Имени файла в inode нет — это позволяет делать на него несколько ссылок. Имена хранятся в каталогах.

Блоки и хранение файлов

Перед использованием диск форматируется — разбивается на блоки. Обычный размер блока — 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/
← Назад к списку тем