Найти тему

Linux. Типы файлов.

Оглавление

Многие пользователи ОС Windows знают, что тип файла определяется его расширением. В Unix-подобных системах дела обстоят немного по другому. Во первых, надо понимать, что в Linux все является файлом. Во вторых, ОС в основном наплевать на имя файла, а предназначение файла определяется по его внутренней структуре. На сколько это удобно или не удобно судить не мне, но со временем к этому привыкаешь.

В большинстве случаев, в файловой системе определены семь типов файлов. Даже разработчики при попытке добавить в систему что-нибудь новое и необычное, им приходится маскировать это под эти семь типов. Определить тип файла можно командой file. Эта команда не только определяет стандартный тип файла, но и распознает их форматы.

$file 1.tmp
1.tmp: ASCII text //обычный текстовый файл, содержащий текст в формате ASCII
$file /etc
/etc: directory // файл каталога.

Еще одним вариантом узнать тип файла, можно использовав команду
ls -ld.

$ls -ld 1.tmp
-rw-r--r-- 1 root root 61 May 14 00:38 1.tmp
$ls -ld /etc
drwxr-xr-x 90 root root 4096 Jun 18 07:50 /etc

В этом случае, на тип файла указывает первый символ в выводе. "-" - указывает на то что это просто файл. "d"- говорит нам, что /etс - это каталог.

Давайте, теперь рассмотрим каждый тип поподробнее.

Обычный файл

Обычный файл - это просто последовательность байтов. В Linux все равно текстовый или исполняемый файл перед ним, а может даже и картинка. Во всех этих случаях - это будет обычный файл, а остальные типы будут считаться специальными. В выводе ls обычные файлы обозначаются символом минус "-". Создать обычный файл можно командами touch, cp, >>, различными редакторами и т.д.. Удалить обычный файл можно командой rm.

Каталог

Каталоги - это особый тип файла, который хранит ссылки на другие файлы. Редактировать эти файлы напрямую невозможно. Записью данных в эти файлы занимается ядро системы на основе получаемых данных, в том числе и от пользователя. Например, когда вы отдаете команду на создание файла в каталоге, ядро создает связь между указанным именем создаваемого файла и их индексным дескриптором ( настоящее имя, которым оперирует ОС).

Распознать файл каталога можно по букве d. Создается каталог командой mkdir. Удалить каталог можно командой rmdir, при условии, что в нем не хранится файлов, либо командой rm -r.

Жесткие ссылки

Про жесткие ссылки писал ранее, можно прочитать в статье "Linux. Ссылки жесткие и не очень".

Действительное имя файла хранится в родительском каталоге, а не в самом файле. На файл можно ссылаться из нескольких каталогов одновременно и даже из нескольких элементов одного и того же каталога, при этом у всех этих ссылок могут быть разные имена. Непосредственно сам файл существует, пока на него ведет хотя бы одна жесткая ссылка.

Создается жесткая ссылка с помощью команды ln, синтаксис у нее один в один как у cp. Удаляется командой rm. По сути все файлы, которые мы видим в каталогах - это и есть жесткие ссылки. Количество существующих ссылок на файл можно увидеть в выводе команды ls -l.

$ls -l
-rw-r--r-- 2 root root 61 May 14 00:38 1.tmp
-rw-r--r-- 2 root root 61 May 14 00:38 2.tmp

В данном примере можем увидеть две жесткие ссылки на один и тот же файл. Цифра 2 перед именем владельца именно об этом и говорит.

Файлы символьных и блочных устройств.

Файлы устройств позволяют программам получать доступ к устройствам. Ядро включает специальные драйверы, которые во всех деталях знают, как работать с определенным устройством. Главное отличать файлы устройств и драйверы. Файлы устройств сами по себе не являются драйверами а служат "тоннелем" между драйвером и самим устройством.

Большой разницы между символьным и блочным устройством нет. В основном отличие заключается в том, что к символьным устройствам обращение происходит последовательно (символ за символом), например терминал, а к блочным устройствам в произвольном порядке, причем блоками разного размера, например жесткие диски.

Создаются такие файлы командой mknod, удаляются командой rm. Файлы символьных устройств обозначаются буквой "с", блочных - "b".

Локальные сокеты

Сокеты необходимы для соединения одних процессов с другими, не подвергаясь влиянию других процессов. Локальные сокеты создаются с помощью системного вызова socket. Когда соединение закрыто, его можно удалить командой rm или с помощью системного вызова unlink. Обозначается в выводе ls буквой "s".

Именованные каналы

По сути это те же самые сокеты, но в отличии от оных, каналы работают только в одну сторону. То есть через канал один процесс передает данные второму, но не наоборот. Такие каналы еще называют файлами FIFO (First In, First Out - первый пришел, первый обработан). Создаются каналы, командой mknod, удаляются rm, обозначаются "p".

Символические ссылки

Про символические ссылки можно почитать в статье "Linux . Ссылки жесткие и не очень."

Символическая ссылка позволяет указывать псевдоним вместо имени файла. Отличие от жесткой ссылки заключается в том, что символическая указывает на файл по имени, а жесткая указывает непосредственно на индексный дескриптор файла. Поэтому при удалении файла, ссылка не удаляется, а просто ведет в никуда. Про такие ссылки еще говорят, что они битые.

Создаются символические ссылки с помощью команды ln -s, удаляются командой rm. Обозначаются такие ссылки буквой "l".

Заключение

Вот такие типы файлов есть в системе Linux. На особенностях каждого типа остановимся в других статьях. Есть что добавить? - Добро пожаловать в комментарии ниже. Ну и не забывайте жамкать кнопку "подписаться" ниже 👇, вам пустяк, а мне приятно.