← Linux: файловая система вглубь
10 мин · просто · Урок 1 из 7

Виды файлов в Linux

Семь видов файлов в Linux и первый символ в ls -l.

Семь типов файлов

В Linux не один вид файлов, а семь. Обычный файл с текстом, каталог, ссылка, диск, терминал. Всё это разные типы, и система их различает. Тип файла — это категория объекта в файловой системе, которая говорит ядру, как с ним работать.

Тип виден по первому символу в выводе ls -l. Это одна буква перед правами доступа:

$ ls -l
-rw-r--r-- 1 deploy deploy  1240 Jul 11 10:14 notes.txt
drwxr-xr-x 2 deploy deploy  4096 Jul 11 10:12 projects
lrwxrwxrwx 1 deploy deploy    11 Jul 11 10:15 latest -> notes.txt

У notes.txt первым стоит дефис, это обычный файл. У projects там d, каталог. У latest стоит l, символическая ссылка.

Полный список первых символов:

СимволТипПример
-обычный файлтекст, картинка, бинарник
dкаталог (directory)/home, /etc
lсимволическая ссылкаlatest -> notes.txt
bблочное устройстводиск /dev/sda
cсимвольное устройствотерминал /dev/tty
sсокет (socket)/run/docker.sock
pименованный канал FIFOканал между процессами

Устройства, сокеты и каналы

Блочные и символьные устройства живут в каталоге /dev. Загляни туда с ls -l, и увидишь b и c в первой колонке:

$ ls -l /dev
brw-rw---- 1 root disk    8,  0 Jul 11 09:00 sda
crw-rw-rw- 1 root tty     5,  0 Jul 11 09:00 tty
srw-rw---- 1 root docker        Jul 11 09:00 docker.sock

Блочное устройство (b) читается и пишется блоками фиксированного размера, так работают диски. Символьное устройство (c) отдаёт данные потоком по одному символу, так работают терминалы и последовательные порты.

Сокет (s) и именованный канал FIFO (p) нужны для связи между процессами. Через сокет /run/docker.sock клиент docker разговаривает с демоном. FIFO создаётся командой mkfifo и передаёт данные от одного процесса другому как труба с именем в файловой системе:

$ mkfifo pipe
$ ls -l pipe
prw-r--r-- 1 deploy deploy 0 Jul 11 10:20 pipe

Что значит «в Linux всё файл»

Фраза «в Linux всё файл» описывает единый интерфейс. Диск, терминал, сокет и обычный текстовый файл открываются, читаются и пишутся одними и теми же системными вызовами: open, read, write, close. Программе не нужно знать устройство объекта, она работает с ним через файловые операции.

Это не значит, что все объекты одинаковы внутри. Записать байт в /dev/sda и записать байт в notes.txt — это разные действия по последствиям, но вызов write один и тот же. Единый интерфейс, разное поведение под ним.

Каждый открытый объект внутри процесса получает файловый дескриптор. Файловый дескриптор — это уникальное для процесса неотрицательное целое, которое ссылается на открытый файл. Три дескриптора зарезервированы: 0 — stdin (ввод), 1 — stdout (вывод), 2 — stderr (ошибки).

$ ls -l /proc/self/fd
lrwx------ 1 deploy deploy 0 -> /dev/pts/0
lrwx------ 1 deploy deploy 1 -> /dev/pts/0
lrwx------ 1 deploy deploy 2 -> /dev/pts/0

Каталог — это тоже файл

Частая ошибка новичка: думать, что каталог стоит особняком от файлов. Каталог — это файл особого типа, который хранит список имён и ссылки на inode. Inode — это структура с метаданными файла (права, владелец, размер, адреса блоков данных), у неё есть номер. Имя в каталоге лишь указывает на номер inode:

$ ls -li
1310721 -rw-r--r-- 1 deploy deploy 1240 Jul 11 10:14 notes.txt

Число 1310721 слева — номер inode. Каталог хранит пару «имя → 1310721», сами данные лежат отдельно.

Ещё одна виртуальная тема: /proc и /sys не лежат на диске. Это виртуальные файловые системы, которые генерирует kernel в памяти на лету. Файл /proc/cpuinfo не занимает места на диске, kernel собирает его содержимое в момент чтения:

$ df /proc
Filesystem     1K-blocks  Used Available Use% Mounted on
proc                   0     0         0    - /proc

Размер 0 не ошибка, у виртуальной ФС нет блоков на носителе.

Что важно запомнить

Типов файлов семь, тип виден по первому символу ls -l.

- обычный, d каталог, l ссылка, b диск, c терминал, s сокет, p FIFO.

«Всё файл» — это единый интерфейс open/read/write, а не одинаковое устройство объектов.

Файловый дескриптор уникален для процесса: 0 stdin, 1 stdout, 2 stderr.

Каталог — файл особого типа со списком «имя → inode»; /proc и /sys генерирует kernel, на диске их нет.

В следующем уроке — inode и жёсткие ссылки: как имя связано с данными и почему файл может жить под несколькими именами.

Дрилл · вопросы как на собесе

Проверь себя без подсказок

Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.

01

Что такое inode?

LIN-004

Прошли материал до конца? Отметьте урок пройденным.