2. Всё является файлом

Вы узнали о понятиях владельца файла и прав доступа к файлу, но для того, чтобы действительно понять файловую систему UNIX® (а это также касается и файловых систем Linux), необходимо, чтобы мы заново определили понятие «Что такое файл».

Здесь «все» действительно означает все. Жесткий диск, раздел на жестком диске, параллельный порт, подключение к веб-сайту, карта Ethernet - все это файлы. Даже каталоги являются файлами. Linux различает много типов файлов в дополнение к стандартным файлам и каталогам. Обратите внимание, что здесь под типом файла мы не подразумеваем содержимое файла: в GNU/Linux, как и в любой другой системе UNIX®, файл, будь то изображение PNG, двоичный файл или что-либо еще - это просто поток байтов. Разделение файлов согласно их содержимому предоставлено приложениям.

2.1. Различные типы файлов

Когда вы выполняете команду ls -l, символ перед правами доступа определяет тип файла. Мы уже видели два типа файлов: обычные файлы (-) и каталоги (d). Когда вы бродите по дереву файлов и просматриваете содержимое каталогов, вы можете также встретить и другие типы файлов:

  1. Файлы символьного режима: эти файлы являются либо специальными системными файлами (типа /dev/null, который мы уже рассматривали), либо периферийными устройствами (последовательные или параллельные порты), характерной особенностью которых является то, что их содержимое (если оно есть) не буферизуется (т.е. оно не хранится в памяти). Такие файлы обозначаются буквой c.

  2. Файлы блочного режима: эти файлы являются периферийными устройствами, и, в отличие от символьных файлов, их содержимое буферизуется. Файлами этой категории являются, например, жёсткие диски, разделы жёсткого диска, дисководы, приводы CD-ROM и другие устройства хранения данных. Примеры файлов блочного доступа: /dev/hda, /dev/sda5. Такие файлы обозначаются буквой b.

  3. Символические ссылки: эти файлы являются очень распространенными и широко используются в процедуре запуска системы Mandriva Linux (см. Глава 38, Загрузочные файлы: init sysv). Как следует из их имени, их цель - связывать файлы символическим способом. Это означает, что они являются файлами, содержащими путь к другому файлу. Они могут указывать на несуществующий файл. Очень часто их называют «мягкими ссылками», и обозначаются такие файлы буквой «l».

  4. Именованные каналы: если вас это удивило, то так оно и есть. Да, они очень похожи на каналы, используемые в командах shell'а, но с той разницей, что у этих каналов и в самом деле есть имена. Однако они очень редки и маловероятно, что вы встретите их во время своего путешествия по дереву файлов. Такие файлы обозначаются буквой p. Смотрите раздел Раздел 4, ««Анонимные» каналы и именованные каналы».

  5. Сокеты: это тип файла для всех сетевых подключений, но только некоторые из них имеют названия. А самое главное, что существует несколько типов сокетов, а связь может быть установлена только через один из этих типов, но это уже выходит за рамки данной книги. Такие файлы обозначаются буквой s.

Вот примеры для каждого из файлов:

$ ls -l /dev/null /dev/sda  /etc/rc.d/rc3.d/S20random /proc/554/maps \
/tmp/ssh-queen/ssh-510-agent
crw-rw-rw-    1 root     root       1,   3 May  5  1998 /dev/null
brw-rw----    1 root     disk       8,   0 May  5  1998 /dev/sda
lrwxrwxrwx    1 root     root           16 Dec  9 19:12 /etc/rc.d/rc3.d/
  S20random -> ../init.d/random*
pr--r--r--    1 queen  queen         0 Dec 10 20:23 /proc/554/maps|
srwx------    1 queen  queen         0 Dec 10 20:08 /tmp/ssh-queen/
  ssh-510-agent=
$

2.2. Inode'ы

Inode'ы - это фундаментальная часть любой файловой системы UNIX® наряду с парадигмой «Все является файлом». Слово «inode» - это сокращение от Information NODE (информационный узел).

Inode'ы хранятся на диске в таблице inode. Они существуют для всех типов файлов, которые могут храниться в файловой системе, включая каталоги, именованные каналы, файлы символьного режима и так далее. Отсюда вытекает другая известная фраза: «Inode - это файл». При помощи inode'ов UNIX® идентифицирует файл уникальным способом.

Да, вы все верно прочитали: UNIX® идентифицирует файл не по его имени, а по номеру его inode[55]. Причина этого заключается в том, что один и тот же файл может иметь несколько имен или вообще не иметь имени. В UNIX® имя файла - это просто пункт в каталоге inode. Такой пункт называется ссылкой. Давайте рассмотрим ссылки более подробно.



[55] Важно: обратите внимание, что номера inode уникальны в пределах одной файловой системы, т.е. inode с таким же номером может существовать в другой файловой системе. Это приводит к различению дисковых inode'ов и inode'ов "в памяти". В то время как два дисковых inode'а могут иметь одинаковые номера, если они находятся на двух различных файловых системах, inode'ы "в памяти" имеют номера, уникальные для всей системы. Например, одно из решений получения уникальности - хэш номера дискового inode'а против идентификатора блочного устройства.