Типы файлов в UNIX/Linux

В большинстве реализаций файловых систем определены семь типов файлов:

  • обычные файлы;
  • каталоги;
  • файлы байт-ориентированных (символьных) устройств;
  • файлы блочно-ориентированных (блочных) устройств;
  • локальные сокеты;
  • именованные каналы (реализующие принцип обслуживания FIFO (First in First Out, т.е. "первым поступил — первым обслужен");
  • символические ссылки.

Даже если разработчики добавляют в файловую систему что-нибудь новое и необычное (например, информацию о процессах в каталог /ргос), им приходится маскировать это под файлы стандартных типов.

Определить тип существующего файла можно с помощью команды ls -Id. Первый символ в строке вывода обозначает тип объекта. В следующем примере выдается информация о каталоге /usr/include.

$ Is -Id /usr/include

drwxr-xr-x     27 root     root      4096      Jul 15 20:57      /usr/include

 

Команда rm является универсальным средством удаления файлов. Но как удалить файл, имя которого, скажем, -f? В большинстве файловых систем это абсолютно корректное имя, но команда rm -f не сделает то, что нужно, поскольку выражение -f будет воспринято как флаг команды. Выйти из положения можно, либо указав более полное имя (например,. /-£), либо воспользовавшись специальным аргументом —, который сообщит команде rm о том, что остальная часть командной строки представляет собой имя файла, а не список аргументов: rm —   -f.

Похожая проблема возникает с файлами, в именах которых присутствуют управляющие символы, поскольку такие имена трудно или вообще невозможно воспроизвести с помощью клавиатуры. В подобной ситуации нужно воспользоваться метасимволами интерпретатора команд, чтобы задавать не имя целиком, а лишь его шаблон. Указывайте также опцию -i, чтобы команда rm требовала подтвердить удаление каждого файла. Это позволит не удалить нужные файлы, соответствующие шаблону. Вот как, к примеру, можно удалить файл с оригинальным именем foo<Ctrl+D>bar.

$ ls

foo?bar foose kde-root $ rm -i foo*

rm: remove 'foo\004bar'? у rm: remove 'foose1? n

Команда Is отображает вместо управляющего символа знак вопроса, что иногда сбивает с толку. Если забыть, что символ "?" тоже является подстановочным знаком интерпретатора, и попытаться выполнить команду rm too?bar, можно удалить более одного файла (правда, не в данном примере). Ценность флага -i очень велика!

Если имена файлов совсем уж сложно набирать, прибегните к последнему средству.

rm -i *

Еще одна возможность удаления файлов с причудливыми именами — использование другого интерфейса файловой системы, такого как режим представления каталогов интерпретатора emacs или визуального средства, подобного Nautilus.

 

Обычные файлы

Обычный файл — это просто последовательность байтов. Файловые системы не налагают ограничения на его структуру. Текстовые документы, файлы данных, программные файлы, библиотеки функций и многое другое — все это хранится в обычных файлах. К их содержимому возможен как последовательный, так и прямой доступ.

 

Каталоги

Каталог хранит именованные ссылки на другие файлы. Он создается командой mkdir и удаляется (при условии, что он пуст) командой rmdir. Непустые каталоги можно удалить командой rm -г.

Специальные ссылки "." и ".." обозначают сам катает и его родительский каталог соответственно. Такие ссылки нельзя удалить. Поскольку корневой каталог находится на вершине иерархии, ссылка ".." в нем эквивалентна ссылке ".".

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

Эти дополнительные "жесткие" (фиксированные) ссылки (которые следует отличать от символических, или "мягких") можно считать синонимами для исходных файлов, и с точки зрения файловой системы все ссылки на файл эквивалентны. Файловая система подсчитывает количество ссылок на каждый файл и при удалении файла не освобождает блоки данных до тех пор, пока не будет удалена последняя ссылка на него. Ссылки не могут указывать на файл, находящийся в другой файловой системе.

Жесткие ссылки создаются командой In и удаляются командой rm. Синтаксис команды In легко запомнить, поскольку она является "зеркальным отражением" команды ср. Команда ср oldf ile newf ile создает копию файла oldf ile с именем newf ile, а команда In newf ile oldf ile преобразует имя newf ile в дополнительную ссылку на файл oldfile. Жесткие ссылки можно создавать не только на файлы, но и на каталоги, но это делается довольно редко. Для того чтобы узнать, сколько ссылок существует на данный файл, используйте команду Is -1.

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

 

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

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

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

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

Файлы устройств характеризуются двумя номерами: старшим и младшим. Старший номер устройства позволяет ядру определить, к какому драйверу относится файл, а младший номер, как правило, идентифицирует конкретное физическое устройство. Например, старший номер устройства в Linux соответствует драйверу последовательного порта. Таким образом, первый последовательный порт (/dev/ttyO) будет иметь старший номер 4 и младший номер 0.

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

В далеком прошлом /dev играл роль общего каталога, а файлы устройств, которые в нем хранились, создавались с помощью команды mknod и удалялись командой rm. Стандартизировать работу по созданию файлов устройств помогал сценарий с именем MAKEDEV.

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

В наши дни в большинстве систем реализована некоторая форма автоматического управления файлами устройств, которая позволяет системе играть более активную роль в конфигурировании собственных файлов устройств. Например, в Solaris каталоги /dev и /devices полностью виртуализированы. В дистрибутивах Linux каталог /dev является стандартным, но управлением файлами внутри него занимается демон udevd. (Демон udevd создает и удаляет файлы устройств в ответ на изменения в оборудовании, о которых сообщает ядро.

 

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

Установленные посредством сокетов соединения позволяют процессам взаимодействовать, не подвергаясь влиянию других процессов. В системе UNIX поддерживается несколько видов сокетов, использование которых, как правило, предполагает наличие сети. Локальные сокеты доступны только на локальном компьютере, и обращение к ним осуществляется через специальные объекты файловой системы, а не через сетевые порты. Иногда такие сокеты называют UNIX-сокетами.

Несмотря на то что другие процессы распознают файлы сокетов как элементы каталога, только процессы, между которыми установлено соответствующее соединение, могут осуществлять над файлом сокета операции чтения и записи. В качестве примеров стандартных средств, использующих локальные сокеты, можно назвать системы X Window и Syslog.

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

 

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

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

Как и в случае локальных сокетов, реальные экземпляры именованных каналов весьма немногочисленны и нечасто встречаются. Они редко требуют административного вмешательства5.

Именованные каналы и локальные сокеты имеют практически одинаковое назначение, а их обоюдное существование сложилось исторически. Если бы системы UNIX и Linux разрабатывались в наши дни, то об этих средствах взаимодействия вопрос бы не стоял; сейчас их заменили бы сетевые сокеты.

 

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

Символическая, или "мягкая", ссылка позволяет вместо имени файла указывать его псевдоним. Столкнувшись при поиске файла с символической ссылкой, ядро извлекает хранящееся в ней имя. Разница между жесткими и символическими ссылками состоит в том, что жесткая ссылка является прямой, т.е. указывает непосредственно на индексный Дескриптор файла, тогда как символическая ссылка указывает на файл по имени. Файл, адресуемый символической ссылкой, и сама ссылка представляют собой разные объекты файловой системы. Символические ссылки создаются командой In -s и удаляются командой rm. Они могут содержать произвольное имя, т.е. разрешается указывать на файлы, хранящиеся в других файловых системах, и даже на несуществующие файлы. Иногда несколько символических ссылок образуют петлю.

Символическая ссылка может хранить как полное, так и сокращенное имя файла.

Например, команда

$ sudo In -s archived/secure /var/log/secure

посредством относительного пути связывает имя /var/log/secure с именем /var /log/archived/secure. Как видно из следующего результата выполнения команды Is, полученная символическая ссылка будет содержать строку "archived/secure".

$ ls -1 /var/log/secure

lrwxrwxrwx 1 root root 18 2009-07-05 12:54 /var/log/secure -> archived/secure6

Каталог /var/ log можно переместить куда угодно, но символическая ссылка останется корректной.

Часто ошибочно думают, будто первый аргумент команды In -s должен преобразовываться с учетом текущего каталога. На самом деле он не раскрывается командой In (как имя файла), а просто записывается в виде литеральной строки, которая становится объектом символической ссылки.

 

Комментарии (0)

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.