Назад Вернуться к оглавлению Дальше

Эту книгу

можно купить в Интернет-магазине
Bolero

4. Знакомство с файловой системой Linux

4.1. Файлы и их имена
4.2. Каталоги
4.3. Назначение основных системных каталогов
4.4. Типы файлов
4.5. Права доступа к файлам и каталогам
4.6. Команды для работы с файлами и каталогами
4.7. Создание и монтирование файловых систем

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

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

В настоящем разделе мы рассмотрим файловые системы только с той стороны, которая обращена к пользователям. Обратную, невидимую для пользователей, сторону файловой системы мы будем изучать в разделе 21 "Обратная сторона файловой системы". Надо еще, может быть, отметить, что речь пойдет конкретно о файловой системе типа ext2fs, основном на данный момент типе файловых систем для Линукс (существуют и другие типы файловых систем, об этом тоже будет сказано в разделе 21).

4.1. Файлы и их имена

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

Имена файлов в Linux могут иметь длину до 255 символов и состоять из любых символов, кроме символа с кодом 0 и слэша "/". Однако имеется еще ряд символов, которые имеют в оболочке shell специальное значение и которые поэтому не рекомендуется включать в имена. Это следующие символы:

! @ # $ & ~ % * (  ) [ ] { } ' " \ : ;  > < `  и пробел.
Если имя файла содержит один из этих символов (это не рекомендуется, но возможно), то Вы должны перед этим символом поставить символ обратного слэша "\" (в том числе и перед этим слэшем, то есть повторить его дважды).
[kos]$ mkdir \\my\&his
Можно также заключить имя файла или каталога с такими символами в двойные кавычки. Например, для создания каталога с именем "My old files" следует использовать команду:
[kos]$ mkdir "My old files"
так как команда
[kos]$ mkdir My old files
создаст каталог с именем "My".

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

Но к точке сказанное не относится и в Линукс часто ставят более одной точки в именах файлов, например, This_is.a.forth-chapter_of_my_book.about.Linux. При этом теряет смысл такое понятие (принятое в DOS), как расширение имени файла, хотя все же часто последние части имени, отделенные точками, используют для обозначения файлов каких-то особых типов (например, .tar.gz используется для обозначения сжатых архивов). Но исполняемые и неисполняемые файлы в Линукс распознаются не по расширениям имен файлов. Для этого существуют другие признаки, о которых мы скажем чуть позже. Точка имеет особое значение в именах файлов. если она является первым символом имени : такие файлы считаются скрытыми для некоторых команд, например, они не показываются при выполнении команды ls.

В Линукс различаются символы верхнего и нижнего регистра в именах файлов. Поэтому FILENAME.tar.gz и filename.tar.gz вполне могут существовать одновременно и являться именами разных файлов.

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

Каждому файлу в Линукс соответствует так называемый "индексный дескриптор" файла или "inode" (однозначного перевода этого термина на русский язык не существует, в разных книгах эту структуру называют по-разному). Именно индексный дескриптор содержит всю необходимую файловой системе информацию о файле, включая информацию о расположении частей файла на носителе, типе файла и многое другое. Индексные дескрипторы файлов содержатся в специальной таблице (inode table), которая создается при создании файловой системы на носителе. Каждый логический и физический диск имеет собственную таблицу индексных дескрипторов. Дескрипторы в этой таблицы пронумерованы последовательно и именно номер дескриптора файла является его истинным именем в системе (этот номер мы будем называть индексом файла). Однако для человека такая система имен неудобна (Вы сможете вспомнить, что сохранили в файле с номером 56734 ?), поэтому файлам даются еще "человеческие" имена и файлы группируются в каталоги.

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

Для того, чтобы дать файлу (или каталогу) дополнительное имя (создать жесткую ссылку), используется команда ln в следующем формате:

ln имя_существующего_файла новое_имя

Пример:

[kos]$ ln /home/kos/ve/howto/font-HOWTO-ru/Font-HOWTO.html ~/fonts.html
Теперь можно вместо длинного имени /home/kos/ve/howto/font-HOWTO-ru/Font-HOWTO.html использовать просто ~/fonts.html. Подробнее о команде ln Вы можете прочитать на странице интерактивного руководства man.

4.2. Каталоги

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

Иерархическую структуру каталогов обычно иллюстрируют рисунком "дерева каталогов", в котором каждый каталог изображается узлом "дерева", а файлы - "листьями". В MS Windows или DOS каталоговая структура строится отдельно для каждого физического носителя (то есть, имеем не отдельное "дерево", а целый "лес") и корневой каталог каждой каталоговой структуры обозначается какой-нибудь буквой латинского алфавита (отсюда уже возникает некоторое ограничение). В Линукс (и UNIX вообще) строится единая каталоговая структура для всех носителей, и единственный корневой каталог этой структуры обозначается символом "/". В эту единую каталоговую структуру можно подключить любое число каталогов, физически расположенных на разных носителях (как говорят, "смонтировать файловую систему" или "смонтировать носитель").

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

Полным именем файла (или путем к файлу) называется список имен вложенных друг в друга подкаталогов, начинающийся с корневого каталога и оканчивающийся собственно именем файла. При этом имена подкаталогов в этом списке разделяются тем же символом "/", который служит для обозначения корневого каталога. Например, на моем компьютере /home/kos/ve/book/filesystem1.htm является полным именем того файла, который Вы сейчас читаете.

В каждый момент времени пользователь работает с одним экземпляром оболочки shell и эта оболочка хранит значение так называемого "текущего" каталога, то есть того каталога, в котором пользователь сейчас работает. Имеется специальная команда, которая сообщает Вам значение текущего каталога - pwd.
Примечание: если быть более точным, то следует сказать, что текущий каталог - это понятие, относящееся к каждому запущенному в системе процессу (в частности, shell-у); поэтому иногда запуск какой-то программы в shell может привести к тому, что после завершения работы этой программы текущий каталог сменится.

Кроме текущего каталога для каждого пользователя определен еще его "домашний каталог" - каталог, в котором пользователь имеет все права: может создавать и удалять файлы, менять права доступа к ним и т.д. В каталоговой структуре Линукс домашние каталоги пользователей обычно размещаются в каталоге /home и имеют имена, совпадающие с именем пользователя. Например, /home/kos. Каждый пользователь может обратиться к своему домашнему каталогу с помощью значка ~, то есть, например, к каталогу /home/kos/doc можно обратиться как к ~/doc. Когда пользователь логируется в системе, то текущим каталогом становится домашний каталог данного пользователя.

Для изменения текущего каталога служит команда cd. В качестве параметра этой команде надо указать полный или относительный путь к тому каталогу, который Вы хотите сделать текущим. Понятие полного пути уже было пояснено, а понятие относительного пути требует дополнительного пояснения. Относительным путем называется перечисление тех каталогов, которые нужно пройти в "дереве каталогов", чтобы перейти от текущего каталога к какому-то другому каталогу (мы будем называть его целевым). Если целевой каталог, то есть каталог, который Вы хотите сделать текущим, расположен ниже текущего в структуре каталогов, то сделать это просто: Вы указываете сначала подкаталог текущего каталога, затем подкаталог того каталога и так далее, вплоть до имени целевого каталога. Если же целевой каталог расположен выше в каталоговой структуре, или вообще на другой "ветви" дерева, то ситуация несколько сложнее. Конечно, можно было бы пользоваться полным путем, но тогда придется записывать очень длинные маршруты.

Эта трудность преодолевается следующим образом. Как известно, для каждого каталога (кроме корневого) в дереве каталогов однозначно определен "родительский каталог". В каждом каталоге имеются две особых записи. Одна из них обозначается просто точкой и является указанием на этот самый каталог, а вторая запись, обозначаемая двумя точками, - указатель на родительский каталог. Эти имена из двух точек и используются для записи относительных путей. Чтобы сделать текущим родительский каталог, достаточно дать команду

[kos]$ cd ..
А чтобы перейти по дереву каталогов на два "этажа" вверх, откуда спуститься в подкаталог kat1/kat2 надо дать команду
[kos]$ cd ../../kat1/kat2
Команда ls служит для вывода на экран списка имен файлов и подкаталогов текущего каталога. Нужно отметить, что фактически команда ls просто выводит содержимое файла, который описывает данный каталог, и не происходит никаких обращений к самим файлам. Любой каталог, как уже говорилось, - это обычный файл, в котором перечислены все файлы и подкаталоги этого каталога. Задумайтесь, кстати : нет никаких особых "ящиков с файлами", есть просто файлы-списки, которые причисляют данный файл к определенному каталогу.

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

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

[kos]$ ls -l

итого 1171
drwxrwxr-x   2 kos      kos          1024 Jun 20 22:42 NotR
drwx------   2 kos      kos          1024 Jun 27 21:02 Star
-rw-rw-r--   1 kos      kos         17351 Nov  2 23:59 arch.htm
-rw-rw-r--   1 kos      kos         19847 Dec 11 20:23 contents.htm
-rw-rw-r--   1 kos      kos         48866 Nov  2 23:59 edit.htm
-rw-rw-r--   1 kos      kos         38867 Dec 12 20:58 filesystem1.htm
-rw-rw-r--   1 kos      kos         29545 Dec 11 20:23 first_start.htm
-rw-rw-r--   1 kos      kos         26394 Sep 26 14:09 hard.htm
drwxr-xr-x   3 kos      kos          2048 Sep 24 21:33 img
-rw-rw-r--   1 kos      kos         21590 Dec 11 19:42 init.htm
-rw-r--r--   1 kos      kos         21291 Nov  2 23:59 install.htm
-rw-rw-r--   1 kos      kos         22179 Nov  3 00:00 intro.htm
drwxrwxr-x   2 kos      kos          1024 Sep 27 22:35 pic
-rw-rw-r--   1 kos      kos         11084 Nov  8 21:26 preface.htm
-rw-rw-r--   1 kos      kos         61108 Sep 29 14:48 russ.htm
Если дополнительно задать параметр -i, то в первой колонке будут отображены индексы файлов (номера соответствующих inode). При задании параметра -t сортировка файлов будет производиться не по именам, а по времени модификации файла. Задание параметра -u приводит к тому, что вместо времени модификации файла будет выводиться время последнего доступа к файлу. Параметр -r меняет порядок сортировки на обратный (используется вместе с параметрами -l и -t). Заметим еще, что параметры можно перечислять как отдельно:
[kos]$ ls -l -i - r
так и объединять:
[kos]$ ls -lir
На этом мы закончим краткое описание команды ls (подробнее смотрите соответствующую man или info-страницу) и перейдем к рассмотрению основных каталогов в каталоговой структуре Линукс.

4.3. Назначение основных системных каталогов

Если Вы работали с Windows 95, например, то Вы представляете, что хотя пользователь имеет полную свободу в организации структуры каталогов, но некоторые "обычаи" все же сохраняются. Так системные файлы располагаются обычно в подкаталоге C:\Windows, вновь устанавливаемые программы по-умолчанию размещаются в каталоге C:\Program Files и так далее. В Линукс типовая структура каталогов выдерживается, пожалуй, даже более строго. Более того, существует даже стандарт на структуру каталогов для UNIX-подобных ОС, так называемый Filesystem Hierarchy Standart (FHS), полный текст которого можно найти по адресу http://www.pathname.com/fhs/. Дистрибутив Red Hat в основном придерживается стандарта FHS (о других дистрибутивах я не могу сказать ничего определенного, поскольку не имею опыта их установки).

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

В левом столбце перечислены подкаталоги корневого каталога, во втором столбце - некоторые основные (далеко не все!) подкаталоги второго уровня, а в третьем столбце даны краткие пояснения о назначении всех этих каталогов. Пояснения по необходимости очень краткие, более подробно с основными каталогами Вы можете познакомится по тексту стандарта FHS.

Каталог Подкаталоги
Назначение
/bin    Этот каталог содержит в основном готовые к исполнению программы, большинство из которых необходимы во время старта системы (или в однопользовательском системном режиме, используемом для отладки). Здесь хранится значительное количество общеупотребительных команд Линукс.
/boot   Содержит основные постоянные файлы для загрузки системы, в частности загружаемое ядро. Файлы из этого каталога нужны только во время загрузки системы.
/dev   Каталог специальных файлов или файлов устройств. О них мы поговорим чуть подробнее в одном из следующих подразделов. Можете также заглянуть в man mknod(1).
/etc   Этот каталог и его подкаталоги содержат большинство данных, необходимых для начальной загрузки системы и основные конфигурационные файлы. В /etc находятся, например, файл inittab, определяющий загружаемую конфигурацию и файл паролей пользователей passwd. Часть конфигурационных файлов может находится и в /usr/etc.
Каталог /etc не должен содержать двоичных файлов (их следует перенести в /bin или /sbin). Ниже приводится назначение основных (но далеко не всех!) подкаталогов каталога /etc.
  /etc/rc.d Этот подкаталог содержит файлы, которые используются в процессе начальной загрузки системы. Подробнее о них и вообще о процессе загрузки будет рассказано в разделе Процесс загрузки ОС.
  /etc/skel Когда создается новый пользователь и account для него, то файлы из этого каталога копируются во вновь созданный домашний каталог пользователя.
  /etc/sysconfig Каталог, содержащий некоторые (но не все) конфигурационные файлы системы.
  /etc/X11 Каталог для конфигурационных файлов подсистемы X11 (например, XF86Config).
/home   Обычно в этом каталоге находятся каталоги пользователей.
/lib   Этот каталог содержит разделяемые библиотеки функций, необходимых компилятору языка C и модули (драйверы устройств).
Даже если система не имеет языка C, разделяемые библиотеки необходимы, поскольку они используются многими прикладными программами. Они загружаются в память по мере необходимости выполнения каких-то функций, что позволяет уменьшить обьем кода программ - в противном случае один и тот же код многократно повторялся бы в различных программах.
/lost+found   Этот каталог используется при восстановлении файловой системы командой fsck. Если fsck обнаруживает файл, родительский каталог которого определить невозможно, она помещает таой файл в каталог /lost+found. Поскольку родительский каталог потерян, то таким файлам присваиваются имена, совпадающие с номерами их индексных дескрипторов.  
/mnt   Это точка монтирования для временно монтируемых файловых систем.
Если на компьютере запускается поочередно Linux и MS DOS, то этот каталог обычно используется, чтобы монтировать файловую систему MS DOS. Если Вы имеете привычку монтировать несколько дополнительных носителей, например, дискеты, CD-ROM, дополнительный жесткий диск и т.д., то можно создать в нем соответственно дополнительные подкаталоги для каждого носителя.
/proc   Это точка монтирования для файловой системы proc, которая обеспечивает информацию о выполняющихся процессах, ядре, оборудовании вычислительной установки и т.д. Это псевдо-файловая система, подробности о которой можно найти в proc(5). Специальные файлы из этого каталога используются для получения и передачи данных ядру.
/root   Это домашний каталог суперпользователя. Обратите внимание на то, что он расположен не там, где располагаются личные каталоги остальных пользователей (в /home).  
/sbin   Подобно каталогу /bin содержит в основном исполняемые файлы - программы и утилиты ОС, используемые в процессе загрузки и запускаемые системным администратором. В стандарте FHS говорится, что в этот каталог надо помещать те исполняемые файлы, которые используются после успешного подключения файловой системы /usr. Минимальное содержимое этого каталога включает программы clock, getty, init, update, mkswap, swapon, swapoff, halt, reboot, shutdown, fdisk, fsck.*, mkfs.*, lilo, arp, ifconfig, route.
/tmp   Каталог для временных файлов. В любой момент суперпользователь может удалить файлы из этого каталога без большого ущерба для остальных пользователей. Однако, не стоит удалять файлы из этого каталога, если вам не стало ясно, что конкретный файл или группа файлов мешает продолжению продуктивной работе на машине. Система сама периодически очищает этот каталог, поэтому не следует хранить тут файлы, которые Вам могут понадобиться в дальнейшем.
/usr   Этот каталог огромен и его структура в основном повторяет структуру корневого каталога. В его подкаталогах находятся все основные приложения. В соответствии со стандартом FHS рекомендуется выделять для этого каталога отдельный раздел диска или вообще располагать его на сетевом диске, общем для всех компьютеров в сети. Такой раздел или диск монтируют только для чтения и располагают в нем общие конфигурационные и исполняемые файлы, документацию, системные утилиты и библиотеки, а также включаемые файлы (файлы типа include).
  /usr/bin Готовые к исполнению программы - утилиты и приложения, которые часто вызывают обычные пользователи.
/usr/bin/X11 - Обычное место для расположения готовых к исполнению программ из X-Window в Linux. Часто это символический линк к /usr/X11R6/bin.
  /usr/dict Этот каталог содержит файлы со словарным запасом для программ проверки корректности написания слов.
  /usr/etc Здесь содержатся конфигурационные файлы для группы машин или для всей организации. Однако, команды и программы должны смотреть в каталог /etc, в котором должны быть линки к файлам в каталоге /usr/etc.
  /usr/include Этот каталог содержит исходный код стандартных библиотек языка C, подставляемый в программы директивой препроцессора include. Поэтому пользователю надо иметь, по крайней мере, право на чтение из этого каталога. Ни в коем случае не следует модифицировать файлы в этом каталоге, потому что они тщательно отлажены разработчиком системы (разве что Вы знаете систему лучше разработчика).  
  /usr/lib В данном каталоге содержится объектные библиотеки подпрограмм, динамические библиотеки, некоторые готовые к исполнению программы, которые не вызываются непосредственно. Сложные программные системы могут иметь свои подкаталоги в этом каталоге.
/usr/lib/X11 - Обычное место для помещения файлов связанных с X-Window, а также конфигурационных файлов самой системы X-Window. В Linux это обычно символический линк к каталогу /usr/X11R6/lib/X11.
/usr/lib/gcc-lib - Содержит готовые к исполнению программы и файлы типа include для компилятора GNU C (gcc).
/usr/lib/groff - Файлы для системы форматирования текстов groff.
/usr/lib/uucp - Файлы для UUCP.
/usr/lib/zoneinfo - Файлы для определения временной зоны. Смотрите также страницы руководств named-xfer (8), tzfile (5), tzselect (8), zdump (8), zic (8).
  /usr/local Обычно здесь помещают программы и подкаталоги, которые являются локальными (уникальными) для данной машины.
/usr/local/bin - Обычно здесь помещают готовые к исполнению программы, которые являются локальными (уникальными) для данной машины.
/usr/local/doc - Здесь располагается документация ко всем установленным на Вашем компьютере пакетам прикладного ПО.
/usr/local/etc - Конфигурационные файлы для локально установленных программ.
/usr/local/lib - Библиотеки и файлы для локально установленных программ и систем.
/usr/local/info - Страницы описаний, которые просматриваются посредством программы info, для локально установленных программ.
/usr/local/man - Страницы описаний, которые просматриваются посредством программы man, для локально установленных программ.
/usr/local/sbin - Локальные программы системного администратора.
/usr/local/src - Исходные тексты программ, установленных на данной машине.
  /usr/man Страницы интерактивного руководства man в исходном формате (не подготовленные для просмотра.
/usr/man/<locale>/man[1-9] - Эти каталоги содержат страницы руководств на различных языках (в зависимости от значения locale). Системы, которые используют один язык и один кодовый набор могут не использовать подстроку <locale>.
  /usr/sbin Этот каталог содержит готовые к исполнению программы для системного администрирования, которые не используются во время загрузки.
  /usr/src Исходные тексты для различных частей Linux.
/usr/src/linux - Исходные тексты для ядра Linux.
  /usr/tmp Еще одно место для хранения временных файлов. Это символический линк к каталогу /var/tmp. Не рекомендуется использовать.  
  /usr/X11R6 Файлы относящиеся к системе X-Window (версии 11, релиз 6).
/usr/X11R6/bin - Готовые к исполнению программы системы X-Window.
/usr/X11R6/lib - Файлы и библиотеки связанные с системой X-Window.
/var   Этот каталог содержит файлы, в которых сохраняются различные переменные данные, определяющие конфигурацию некоторых программ при следующем запуске или временно сохраняемую информацию, которая будет использоваться позже в ходе текущего сеанса. Объем данных в этом каталоге может сильно изменяться, поскольку он содержит, например, файлы протоколов (логи), файлы спулинга и блокировки (locking), временные файлы и т.д.
  /var/adm Содержит учетную и диагностическую информацию, необходимую системному администратору.
  /var/backups Этот каталог используется, чтобы сохранить резервную копию важных системных файлов.
  /var/catman/cat[1-9] Этот каталог используется чтобы хранить уже сформированные страницы руководств в соответствии с номером главы.
  /var/lock Здесь содержатся управляющие файлы системы, которые используются для резервирования использования тех или иных ресурсов системы.
  /var/log Различные файлы протоколов (логи).
  /var/run Переменные файлы времени выполнения различных программ. Они содержат идентификаторы процессов (PIDs) и записывают текущую информацию (utmp). Файлы в этом каталоге обычно очищаются во время загрузки системы.
  /var/spool Файлы различных программ поставленные в очередь на обслуживание.
/var/spool/at Файлы заданий, запущенных посредством команды at.
/var/spool/cron Файлы системы cron.
/var/spool/lpd Файлы ожидающие вывода на печать.
/var/spool/mail Пользовательские почтовые ящики.
/var/spool/news Файлы системы news.
/var/spool/uucp Файлы системы uucp.
  /var/tmp Временные файлы.

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

В предыдущих подразделах мы рассмотрели два типа файлов: обычные файлы и каталоги. Но в Линукс существует еще несколько типов файлов. С ними мы познакомимся в этом разделе.

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

Файлы физических устройств

Как уже говорилось, с точки зрения ОС Линукс, все подключаемые к компьютеру устройства (жесткие и съемные диски, терминал, принтер, модем и так далее), представляются файлами. Если, например, надо вывести на экран какую-то информацию, то система как бы производит запись в файл /dev/tty01.

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

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

Если Вы заглянете в каталог /dev, то увидите там огромное количество файлов физических устройств. ("Заглянуть в каталог" означает выполнить последовательно две команды cd и ls.) В следующей табличке приведена небольшая справка по именам наиболее часто используемых специальных файлов.

/dev/console Системная консоль, то есть монитор, физически подключенный в компьютеру.
/dev/hd Жесткие диски с IDE-интерфейсом. Устройство /dev/hda1 соответствует первому разделу на первом жестком диске (/dev/hda), то есть на диске, подключенном как Primary Master.
/dev/sd Жесткие диски со SCSI-интерфейсом.
/dev/fd Файлы дисководов для гибких дисков. Первому дисководу соответствует /dev/fd0, второму /dev/fd1.
/dev/tty Файлы поддержки пользовательских консолей. Название сохранилось с тех пор, когда к системе UNIX подключались телетайпы в качестве терминалов. В Линукс эти файлы устройств обеспечивают работу виртуальных консолей (переключаться между которыми можно с помощью [Alt-F1] - [Alt-F6]).
/dev/pty Файлы поддержки псевдо-терминалов. Применяются для удаленных рабочих сессий с использованием telnet.
/dev/ttyS Файлы, обеспечивающие работу с последовательными портами. /dev/ttyS0 соответствует COM1 в MS-DOS, /dev/ttyS1 - COM2. Если Ваша мышь подключается через последовательный порт, то /dev/mouse является символической ссылкой на соответствующий /dev/ttySN.
/dev/cua Специальные устройства для работы с модемами.
/dev/null Это устройство - просто черная дыра. Все, что записывается в /dev/null, навсегда потеряно. На это устройство можно перенаправить вывод ненужных сообщений. Если /dev/null используется как устройство ввода, то оно ведет себя как файл нулевой длины.

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

Для файлов устройств команда ls -l вместо размера файла выдает старший и младший номера данного устройства.

Именованные каналы (pipes)

Еще один тип специальных файлов - именованные каналы или буферы FIFO (First In - First Out). Файлы этого типа служат в основном для того, чтобы организовать обмен данными между разными приложениями (pipe переводится с английского как труба).

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

Доменные гнезда (sockets)

Гнезда - это соединения между процессами, которые позволяют им взаимодействовать, не подвергаясь влиянию других процессов. Вообще гнезда (и взаимодействие программ при помощи гнезд) играют очень важную роль во всех Unix-системах, включая и Linux: они являются ключевым понятием TCP/IP и соответственно на них целиком строится Internet. Однако c точки зрения файловой системы гнезда практически неотличимы от именованных каналов: это просто метки, позволяющие связать несколько программ. После того как связь установлена, общение программ происходит без участия файла гнезда: данные передаются ядром ОС непосредственно от одной программы к другой.

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

Символические ссылки (еще раз об именах файлов)

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

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

Для того, чтобы создать символическую ссылку, используется уже упоминавшаяся команда ls с дополнительной опцией -s:

ln -s имя_файла_или_каталога имя_ссылки

Пример:

[kos]$ ln -s /home/kos/ve/HOWTO/font-HOWTO-ru/ ~/FONTS
После выполнения такой команды в моем домашнем каталоге появился подкаталог FONTS. Если теперь мы просмотрим список файлов в каталоге /home/kos с помощью команды ls -l, то среди прочих увидим такую строку:
lrwxrwxrwx   1 kos   kos    31 Dec 13 21:13 FONTS -> /home/kos/ve/HOWTO/font-HOWTO-ru/
Обратите внимание на самый первый символ в этой строке: он показывает, что данная запись соответствует символической ссылке. Впрочем, это видно и в поле имени, где после нового имени и стрелки указано исходное имя файла (в данном случае - каталога).

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

Если Вы создали в каталоге kat1 символическую ссылку, которая указывает на какой-то другой каталог, то Вы можете переместить каталог kat1 куда угодно, символическая ссылка при этом будет оставаться корректной. Точно так же можно перемещать сами символические ссылки. Но остерегайтесь использовать .. (то есть ссылку на родительский каталог) в полных именах файлов, включающих символические ссылки, поскольку по символической ссылке нельзя проследовать в обратном направлении, а .. всегда означает истинный родительский каталог данного каталога.


Назад Вернуться к оглавлению Дальше

В.А.Костромин
Последние изменения в содержание файла внесены 2 января 2001 г.
TopList Aport Ranker