Виды файлов в 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 и жёсткие ссылки: как имя связано с данными и почему файл может жить под несколькими именами.
Дрилл · вопросы как на собесе
Проверь себя без подсказок
Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.
Что такое inode?
LIN-004Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс