Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Иерархия каталогов и файловых систем в Linux

В.А.Костромин (http://rus-linux.net)

В статье рассказывается о разработанном в рамках проекта Open Source стандарте на структуру каталогов UNIX-подобных операционных систем (подразумеваются Linux и BSD-системы).

Одно из первых понятий, с которыми сталкивается любой пользователь компьютера – это, безусловно, понятие файловой системы. При этом пользователь видит только одну сторону файловой системы, а именно, иерархическую структуру (или дерево) каталогов и файлов. Фактически все каталоги тоже являются файлами, и с точки зрения механизма хранения файлов на диске все файлы, включая каталоги, организованы одинаково [1]. Но для человека работать с “линейным” списком, содержащим тысячи файлов, было бы крайне неудобно, поэтому и было изобретено понятие “каталога”, чисто логического образования, позволяющего дать каждому файлу понятное для человека “полное имя”, определяющее некий “путь” к файлу в единой структуре каталогов.

Поскольку структура каталогов – понятие чисто логическое и к реальным механизмам работы с файлами не имеет отношения, изначально никаких особых требований на вид логического дерева каталогов со стороны операционной системы не предъявляется. И в силу этого каждый конкретный вариант операционной системы, в частности, каждый из дистрибутивов Linux, мог бы строить это дерево по-своему. Легко понять, что это могло бы привести к возникновению больших проблем в работе программного обеспечения от различных разработчиков, к несовместимости и непереносимости программ, установка новых программ в систему и работа большинства приложений были бы очень затруднены, поскольку масса времени уходила бы на поиск нужных файлов. Подчинение же структуры каталогов определенным стандартам позволяет обеспечить совместимость программного обеспечения, разрабатываемого разными группами авторов и в рамках различных дистрибутивов. Поэтому группой энтузиастов (как все, что создается в рамках движения Open Source) был разработан стандарт на структуру каталогов для UNIX-подобных ОС, так называемый стандарт иерархии файловых систем (Filesystem Hierarchy Standart или кратко FHS).

Работа по созданию этого стандарта была начата в августе 1993 года с попытки упорядочить структуру файлов и каталогов операционной системы Linux. Вначале стандарт назывался проектом стандартов файловой системы - Filesystem Standarts project (FSSTND), и был ориентирован только на систему Linux. Его первая версия была выпущена 14 февраля 1994 года. Последующие редакции были выпущены 9 октября 1994 и 28 марта 1995 года. В разработке стандарта принимало участие большое количество добровольцев, но главным организатором был Дэниел Квинлан (Daniel Quinlan).

В начале 1995 года с участием сообщества разработчиков системы BSD была поставлена цель создания более общей версии FSSTND, предназначенной не только для Linux, но и для других UNIX-подобных операционных систем. В результате объединенных усилий разработка стандарта сосредоточилась на вопросах, которые являются общими для всех UNIX-подобных систем, включая операционные системы типа 4.4BSD. Учитывая расширение сферы действия стандарта, он был переименован в Filesystem Hierarchy Standard или, для краткости, FHS. Естественно, что «настоящие» UNIX-системы, созданные задолго до появления этого стандарта, ему не соответствуют. Однако FHS учитывает все положительные качества, присущие BSD и другим системам в части поддержки различных архитектур и учета требований работы в гетерогенных сетях. На момент написания этой статьи последней версией стандарта FHS является версия 2.2, которая была выпущена 24 мая 2001 года. Полный исходный текст этого стандарта можно найти в Интернет на сайте http://www.pathname.com/fhs/, а его русский перевод – по адресу http://rus-linux.net/MyLDP/file-sys/fhs-2.2-rus/index.html.

При разработке стандарта FHS его авторы стремились создать в первую очередь справочник, а не учебник по построению структуры каталогов. Стандарт создавался для использования системными интеграторами, разработчиками пакетов программного обеспечения и системными администраторами в процессе создания и поддержки UNIX-совместимых файловых систем.

В основу разработки стандарта были положены следующие соображения.

Во-первых, учитывалось, что в UNIX-подобных ОС структура каталогов представлена в виде единого дерева. Отдельные «ветви» этого дерева могут располагаться на разных носителях, или в разных файловых системах, причем эти файловые системы могут быть разными по своей внутренней организации – на одном носителе это файловая система ext2fs, на другом – vfat, и так далее. Разработчики стандарта стремились обеспечить оптимальное размещение файлов в разных файловых системах с тем, чтобы оптимизировать процессы загрузки, последующего функционирования и возможного обновления системы.

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

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

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

Таблица 1. Пример выделения классов файлов

Разделяемые

Неразделяемые

Статические

/usr
/opt

/etc
/boot

Изменяемые

/var/mail
/var/spool/news

/var/run
/var/lock

Выделение этих 4 классов файлов помогает понять те принципы, на которых строится стандартная структура каталогов, предлагаемая стандартом FHS. Ее описание начнем, естественно, в описания структуры корневого каталога, который имеет имя “/”.

Корневой каталог

Стандарт FHS предлагает создать в корневом каталоге следующие подкаталоги

Таблица 2. Основные подкаталоги корневого каталога

bin

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

boot

Неизменяемые файлы, необходимые для загрузки системы

dev

Файлы устройств

etc

Файлы конфигурации системы на данном компьютере

home

Домашние каталоги пользователей

lib

Основные разделяемые библиотеки и модули ядра

lib<alt>

Основные разделяемые библиотеки для альтернативных форматов исполняемых файлов

mnt

Точка монтирования для временно подключаемых файловых систем

root

Домашний каталог суперпользователя root

opt

Дополнительные пакеты программного обеспечения

sbin

Основные системные исполняемые файлы

tmp

Временные файлы

usr

Иерархия второго уровня

var

Переменные данные

Это не означает, что все содержимое перечисленных каталогов должно размещаться в корневой файловой системе. Указанные каталоги могут являться просто точками монтирования для других файловых систем или ссылками на такие системы. Более того, в стандарте явно рекомендуется размещать в каталогах /usr, /opt и /var такие файлы, которые могут располагаться в других разделах диска или в других файловых системах. Впрочем, давайте отложим рассмотрение вопроса о том, как разместить каталоги по разным файловым системам, до последнего раздела настоящей статьи, а пока вернемся к рассмотрению тех требований, которые стандарт FHS предъявляет к корневому каталогу.

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

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

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

А теперь последовательно рассмотрим назначение каждого из основных подкаталогов корневого каталога.

Каталог /bin

Каталог /bin содержит команды, которые могут использоваться как системным администратором, так и рядовыми пользователями, причем только те команды, которые необходимы, когда никакая другая файловая система, кроме корневой, еще не смонтирована (например, в однопользовательском режиме). В этом каталоге могут также содержаться команды, которые используются не напрямую пользователем, а включаются в сценарии оболочки (скрипты). Исполняемые файлы, которые не так важны, чтобы быть расположенными в каталоге /bin, должны размещаться в каталоге /usr/bin. Те утилиты, которые необходимы только рядовым пользователям (файлы системы X Window, chsh, и так далее) обычно не так необходимы, чтобы размещаться в корневой файловой системе (в корневом разделе диска).

В /bin должны иметься следующие команды или символические ссылки на соответствующие команды:

cat, chgrp, chmod, chown, cp, date, dd, df, dmesg, echo, false, hostname, kill, ln, login, ls, mkdir, mknod, more, mount, mv, ps, pwd, rm, rmdir, sed, sh, stty, su, sync, true, umount, uname.

Следующие программы или символические ссылки на программы должны находиться в каталоге /bin, если только соответствующие пакеты установлены в системе:

csh, ed, tar, cpio, gzip, gunzip, zcat, netstat, ping.

В каталоге /bin не должно быть подкаталогов.

Каталог /boot

Этот каталог содержит все, что необходимо в процессе загрузки, исключая конфигурационные файлы и установщик карты загрузки (the map installer). Таким образом, в /boot хранятся данные, которые используются до того, как ядро начинает исполнять программы пользователя. Здесь же находятся резервные сохраненные копии главной загрузочной записи (master boot sectors) и другие данные, которые не подлежат прямому редактированию.

Ядро операционной системы должно быть расположено либо в корневом каталоге /, либо в /boot . Программы, необходимые загрузчику для организации загрузки файлов, должны быть расположены в /sbin. Конфигурационные файлы загрузчика должны размещаться в /etc.

Каталог /dev

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

Каталог /etc

Каталог /etc содержит конфигурационные файлы и каталоги, специфичные для данной конкретной системы. В каталоге /etc не должно быть бинарных файлов. В соответствии со стандартом FHS этот каталог в обязательном порядке должен содержать подкаталог /opt, в котором должны размещаться подкаталоги с конфигурационными файлами отдельных пакетов и приложений. Для каждого установленного пакета <package> должен создаваться конфигурационный каталог /etc/opt/package. Надо отметить, что не все дистрибутивы следуют этому правилу: часто конфигурационные каталоги пакетов размещаются непосредственно в /etc.

Следующие каталоги и файлы либо символические ссылки на них должны быть расположены в /etc, если соответствующие пакеты установлены в системе:

Таблица 3. Подкаталоги и файлы в каталоге /etc

/X11

Конфигурационные файлы системы X Window

/sgml

Конфигурационные файлы для SGML и XML

csh.login

Общесистемный инициализационный файл для C shell logins

exports

Список контроля доступа для сетевой файловой системы NFS

fstab

Постоянная информация для монтирования файловых систем

ftpusers

Список контроля доступа для демона FTP

gateways

Файл, содержащий список шлюзов для демона routed

gettydefs

Установки терминала, используемые демоном getty

group

Файл, определяющий списки групп пользователей в системе

host.conf

Файл конфигурации для системы разрешения имен

hosts

Постоянная информация об именах хостов

hosts.allow

Список хостов, с которых разрешен доступ в систему

hosts.deny

Список хостов, с которых запрещен доступ в систему

hosts.equiv

Список доверенных (разрешенных) имен хостов для rlogin, rsh, rcp

hosts.lpd

Список доверенных (разрешенных) имен хостов для демона печати lpd

inetd.conf

Конфигурационный файл для демона inetd

inittab

Конфигурационный файл для демона init

issue

Сообщение, выдаваемое системой до регистрации пользователя

ld.so.conf

Список дополнительных каталогов для поиска разделяемых библиотек

motd

Сообщение, выдаваемое системой после регистрации пользователя

mtab

Динамически изменяющаяся информация о смонтированных файловых системах

mtools.conf

Конфигурационный файл для mtools

networks

Статическая информация о сетевых именах

passwd

Файл паролей пользователей

printcap

База данных с настройками принтеров для демона lpd

profile

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

protocols

Перечень IP-протоколов

resolv.conf

Конфигурационный файл для системы разрешения имен

rpc

Перечень протоколов удаленного вызова процедур

securetty

Файл со списком устройств, с которых может заходить пользователь root

services

Имена портов для сетевых сервисов

shells

Список путей доступа для имеющихся в системе оболочек

syslog.conf

Конфигурационный файл для демона syslogd

Файл mtab не соответствует неизменяемой природе файлов, размещенных в /etc; он помещен в данный каталог в виде исключения по историческим причинам. Впрочем, в некоторых системах он является символической ссылкой на /proc/mounts, в этом случае делать исключение не требуется.

Каталог /etc/X11 - это место размещения всех конфигурационных данных для X11, специфичных для данного хоста. Эта директория необходима для того, чтобы обеспечить локальное управление системой X Window в том случае, когда файловая система /usr монтируется только на чтение.

Следующие файлы или символические ссылки на соответствующие файлы должны находиться в /etc/X11:

  • Xconfig - Конфигурационный файл для ранних версий XFree86

  • XF86Config - Конфигурационный файл для XFree86 версий 3 и 4

  • Xmodmap - Глобальный файл модификации клавиатуры в X11

Среди подкаталогов в /etc/X11 могут находиться отдельные подкаталоги с конфигурационной информацией для xdm и других программ (например, для оконных менеджеров), которые в такой информации нуждаются.

Каталог /home

В небольших системах каждый домашний каталог пользователя является одним из непосредственных подкаталогов каталога /home, таких как /home/smith, /home/torvalds, /home/operator и так далее. В больших системах (особенно когда каталоги /home являются разделяемыми между многими хостами посредством NFS) полезно объединить домашние каталоги в группы, введя подкаталоги групп такие как /home/staff, /home/guests, /home/students и так далее. Но как бы то ни было, структура домашних каталогов различается от хоста к хосту. Следовательно, никакая программа не должна полагаться на какие-то предположения о структуре домашних каталогов.

Каталог /lib

Каталог /lib содержит те разделяемые библиотеки, которые необходимы для загрузки системы и запуска команд, расположенных в каталогах /bin и /sbin.

По крайней мере, один из файлов, соответствующих каждому из следующих шаблонов, должен найтись в данном каталоге (это могут быть либо реальные файлы, либо символические ссылки):

  • libc.so.* - Динамически подсоединяемые библиотеки C;

  • ld* - Загрузчик/линковщик времени выполнения.

По историческим причинам, если препроцессор языка Си установлен, файл /lib/cpp должен быть ссылкой на него.

Не должны располагаться в /lib разделяемые библиотеки, которые необходимы только исполняемым файлам, расположенным в /usr (таким, как бинарные файлы системы X Window). В частности, библиотека libm.so.* может быть расположена в /usr/lib, если она не требуется никаким программам из /bin или /sbin.

Более одного варианта каталога /lib может существовать в системах, поддерживающих более одного формата исполняемых файлов (например, 32-х и 64-х разрядные форматы), при этом для каждого формата требуется свой отдельный вариант разделяемых библиотек (которые могут называться /lib32 и /lib64).

Каталог /mnt

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

Этот каталог не должен использоваться программами инсталляции ПО; для создания и хранения временных файлов на этапе инсталляции должны использоваться временные каталоги, не используемые системой

Каталог /opt

Стандарт FHS резервирует каталог /opt для установки дополнительных пакетов программного обеспечения. Предполагается, что любой пакет, который устанавливается в каталог /opt, должен размещать свои статические файлы в отдельной каталоговой структуре /opt/<package>, где <package> - название соответствующего пакета программного обеспечения.

Как правило, все данные, необходимые для поддержки функционирования пакета, должны присутствовать в каталоге /opt/<package>, включая файлы, копируемые в каталоги /etc/opt/<package> и /var/opt/<package> а также специально создаваемые для пакета каталоги в /opt.

Каталоги /opt/bin, /opt/doc, /opt/include, /opt/info, /opt/lib и /opt/man зарезервированы для использования локальным системным администратором. Пакеты могут предоставлять "front-end" файлы, которые локальный системный администратор может разместить в этих зарезервированных каталогах (либо путем копирования, либо установив ссылку), но любой пакет должен нормально функционировать и в случае отсутствия этих зарезервированных директорий.

Программы, вызываемые на исполнение пользователем, должны располагаться в каталоге /opt/<package>/bin. Если пакет ПО содержит в своем составе страницы обычного в UNIX интерактивного руководства man, они должны устанавливаться в каталог /opt/<package>/man, который должен иметь такую же структуру, как и каталог /usr/share/man.

Файлы пакета, которые являются переменными (изменяемыми при выполнении стандартных операций), должны устанавливаться в /var/opt. Специфичные для хоста конфигурационные данные должны устанавливаться в /etc/opt.

Никакие файлы пакета не должны размещаться вне каталогов /opt, /var/opt и /etc/opt, кроме тех файлов, которые должны оказаться в других местах по той причине, что иначе пакет не сможет функционировать нормально. Например, файлы блокирования устройств должны располагаться в /var/lock, а файлы устройств должны располагаться в /dev.

Дистрибутивы могут устанавливать программное обеспечение в каталог /opt, но не должны модифицировать или удалять ПО, установленное местным системным администратором, без разрешения этого самого администратора.

Каталог /root

Каталог /root - это домашний каталог суперпользователя. Он может быть задан разработчиком или определен при инсталляции системы, но рекомендуемое место его расположения по умолчанию – корневая файловая система.

В стандарте FHS подчеркивается, что бюджет суперпользователя должен использоваться исключительно для системного администрирования и его не рекомендуется использовать для выполнения задач, которые могут быть выполнены непривилегированным пользователем. По этой причине не стоит размещать подкаталоги для почты и других приложений в домашнем каталоге пользователя root. Почта для таких администраторских ролей как root, postmaster и webmaster должна пересылаться соответствующему пользователю.

Каталог /sbin

Утилиты для выполнения задач системного администрирования (и другие команды, используемые только пользователем root) размещаются в /sbin, /usr/sbin и /usr/local/sbin. Каталог /sbin содержит исполняемые файлы, необходимые для загрузки системы и ее восстановления в различных ситуациях (restoring, recovering, and/or repairing the system), не попавшие в каталог /bin.

Единственная команда, которая обязательно должна присутствовать в /sbin, это команда shutdown - команда остановки системы.

Следующие команды или символические ссылки должны быть размещены в /sbin, если только соответствующие пакеты установлены в системе:

fastboot

Команда перезагрузки системы без проверки дисков

fasthalt

Команда остановки системы без проверки дисков

fdisk

Программа переразбиения диска

fsck

Утилита для проверки и восстановления файловых систем

fsck.*

Утилиты для проверки и восстановления отдельных типов файловых систем

getty

Программа getty

halt

Команда остановки системы

ifconfig

Утилита конфигурирования сетевых интерфейсов

init

Первоначальный процесс

mkfs

Команда создания файловой системы

mkfs.*

Команда создания файловой системы конкретного типа

mkswap

Команда создания файла или раздела подкачки (swap-раздела)

reboot

Команда перезагрузки системы

route

Утилита определения таблицы статической IP-маршрутизации

swapon

Утилита подключения механизма свопинга

swapoff

Утилита отключения свопинга

update

Демон периодической очистки системных буферов

Принять решение о том, какие программы разместить в каталогах "sbin", довольно просто: если обычный пользователь (не системный администратор) когда-либо запускает программу, она должна размещаться в одном из каталогов "bin". Обычные пользователи не должны указывать каталоги sbin в списке путей, просматриваемых по умолчанию (в своей переменной PATH).

Такие, к примеру, файлы, как chfn, которые пользователи запускают очень редко и только в особых случаях, должны, тем не менее, быть расположены в /usr/bin. Команда ping, хотя она абсолютно необходима суперпользователю для решения задач сетевой диагностики и восстановления сети, часто используется и рядовыми пользователями, и по этой причине должна размещаться в /bin.

Авторы стандарта рекомендуют предоставить всем пользователям право на чтение и выполнение для всех файлов, расположенных в /sbin, кроме, может быть тех программ, для которых установлены биты setuid и setgid. Разделение каталогов /bin и /sbin делается не из соображений безопасности и не для того, чтобы лишить пользователей возможности видеть системные утилиты. Целью такого деления является установление явного различия между исполняемыми файлами, которые используются всеми, и теми утилитами, которые в основном используются для решения административных задач. С точки зрения безопасности нет никаких преимуществ в том, чтобы сделать /sbin недоступным для пользователей.

Каталог /temp

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

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

Каталоговая структура /usr

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

Следующие каталоги или символические ссылки на каталоги должны присутствовать в /usr.

bin

Это основное место для размещения исполняемых файлов системы.

/usr/bin/X11 должен быть символической ссылкой на /usr/X11R6/bin если последний существует.

Следующие файлы или символические ссылки на файлы должны быть размещены в /usr/bin, если только соответствующие пакеты установлены в системе:

  • perl - Язык Perl (The Practical Extraction and Report Language)

  • python - Интерпретирующий язык Python

  • tclsh - Оболочка интерпретатора Tcl

  • wish - Оболочка Tcl/Tk

  • expect - Программа для организации интерактивного диалога

Поскольку интерпретаторы скриптов оболочки (вызываемые командой вида #!<path> в первой строке скрипта) не могут полностью полагаться на эту строку, имеет смысл стандартизовать их расположение. Размещение интерпретаторов оболочек Борна и C-shell уже зафиксировано в каталоге
/bin
, но интерпретаторы языков Perl, Python и Tcl часто размещаются в самых разных местах. В каталоге /usr/bin можно оставить только символические ссылки на действительное местоположение интерпретаторов.
include

Это место, где должны быть размещены все системные подключаемые файлы общего пользования для языка программирования C, в частности файлы заголовков (header files), включаемые в программы на языке C.

Символическая ссылка /usr/include/X11 должна указывать на /usr/X11R6/include/X11, если только последний существует.

lib

Каталог /usr/lib содержит объектные файлы, библиотеки и внутренние исполняемые файлы, которые не могут вызываться непосредственно пользователями из командной строки или скриптов оболочки. (Различные архитектурно-зависимые статические файлы и подкаталоги, специфичные для отдельных приложений, должны размещаться в /usr/share.)

Приложения могут использовать отдельные подкаталоги в /usr/lib. Если приложение использует подкаталог, все архитектурно-зависимые данные, используемые только этим приложением, должны размещаться внутри этого подкаталога. (Например, подкаталог perl5 для модулей и библиотек Perl 5.)

По историческим причинам /usr/lib/sendmail должен быть символической ссылкой на /usr/sbin/sendmail, если последний существует. (Некоторые исполняемые команды, такие как makewhatis и sendmail тоже по традиции размещаются в /usr/lib. makewhatis - это внутреннй исполняемый файл и должен размещаться в подкаталоге для бинарных файлов; пользователям предоставляется доступ только к catman. Исполняемые файлы последних версий sendmail теперь по умолчанию располагаются в /usr/sbin. Кроме того, системы, использующие sendmail-совместимые агенты передачи почты, должны делать /usr/sbin/sendmail символической ссылкой к соответствующему исполняемому файлу.)

Если /lib/X11 существует, /usr/lib/X11 должен быть символической ссылкой на /lib/X11, либо на тот каталог, на который ссылается /lib/X11. (Специфичные для каждого хоста данные для системы X Window не должны размещаться в /usr/lib/X11. Специфичные для хоста конфигурационные файлы, такие как Xconfig или XF86Config должны храниться в /etc/X11. Это требование относится и к таким фонфигурационным данным, как system.twmrc, даже если это только символическая ссылка на более общий конфигурационный файл, вероятно в /usr/X11R6/lib/X11 ).

local

Каталоговая структура для локально устанавливаемого программного обеспечения (пустая непосредственно после инсталляции системы)

sbin

Этот каталог содержит системные команды, используемые исключительно системным администратором, не являющиеся жизненно-важными для системы. Программы для выполнения задач системного администрирования, которые необходимы для восстановления системы, монтирования /usr, или для других самых важных системных задач, должны размещаться в /sbin. (Локально устанавливаемые программы для системного администрирования должны размещаться в /usr/local/sbin .)

share
Архитектурно-независимые данные
X11R6

Эта каталоговая структура зарезервирована для системы X Window System, version 11 release 6, и относящихся к ней файлов.

Для некоторого упрощения и сохранения совместимости XFree86 с системой X Window для других типов операционных систем должны быть созданы следующие символические ссылки, если только каталог /usr/X11R6 существует:
/usr/bin/X11 -> /usr/X11R6/bin
/usr/lib/X11 -> /usr/X11R6/lib/X11
/usr/include/X11 -> /usr/X11R6/include/X11

В общем случае программное обеспечение не должно использовать перечисленные символические ссылки при инсталляции или в целях управления. Они предназначены только для пользователей. Трудности связаны с версиями выпусков системы X Window -- в переходный период невозможно узнать, какая версия X11 используется.

Специфичные для каждого хоста данные в каталоге /usr/X11R6/lib/X11 должны использоваться только в демонстрационных целях. Приложения, которым необходима информация о текущей конфигурации хоста, должны искать ее в каталоге /etc/X11, куда могут быть сделаны ссылки из каталога /usr/X11R6/lib. (Примерами таких конфигурационных файлов могут служить Xconfig, XF86Config или system.twmrc.)

games

Игры и обучающие программы

lib<qual>

Библиотеки для альтернативных форматов

src

Исходные коды программного обеспечения.

Программные пакеты не должны создавать подкаталоги непосредственно в каталоге /usr. Исключение сделано для системы X Window в силу сложившихся традиций и широко распространенной практики.

Могут создаваться следующие символические ссылки на каталоги.
/usr/spool -> /var/spool
/usr/tmp -> /var/tmp
/usr/spool/locks -> /var/lock

Эта возможность обусловлена необходимостью сохранить совместимость со старыми системами до тех пор, пока все реализации не начнут использовать каталоги, размещенные непосредственно в /var. Если система уже не требует наличия указанных ссылок, они могут быть удалены.

/usr/local : Каталог для локального ПО

Каталоговая структура /usr/local используется системным администратором в тех случаях, когда он устанавливает программное обеспечение, которое будет использоваться локально в рамках данного хоста. Этот каталог не должен перезаписываться при обновлениях системного программного обеспечения. Он может использоваться для программ и данных, не попавших в каталог /usr, доступ к которым разрешен с других хостов.

Локально устанавливаемое программное обеспечение должно располагаться не в /usr, а в /usr/local, если только его установка производится не в целях замены или обновления ПО в /usr. (Программное обеспечение, расположенное в / или /usr может быть перезаписано при обновлениях системы (хотя мы рекомендуем, чтобы дистрибутивы не перезаписывали данные в /etc в таких обстоятельствах). По этой причине локально устанавливаемое программное обеспечение не должно размещаться за пределами каталога /usr/local без достаточных на то оснований. )

Следующие каталоги или символические ссылки на каталоги должны иметься в /usr/local :

  • bin - Локальные исполняемые файлы
  • games - Локально установленные игровые приложения
  • include - Локальные заголовочные файлы для C
  • lib - Локальные библиотеки
  • man - Локальные онлайновые руководства
  • sbin - Локальные системные исполняемые файлы
  • share - Архитектурно-независимые структура каталогов для локального ПО
  • src - Локально установленные исходные коды.

Никаких каталогов, кроме перечисленных выше, не должно быть в /usr/local после первой установки FHS-совместимой системы.

/usr/share : Архитектурно-независимые данные

Структура каталогов /usr/share предназначена для всех файлов, которые предназначены только для чтения и не зависят от архитектуры. Так, например, компьютеры на платформах i386, Alpha и PPC могут поддерживать один общий каталог /usr/share, который монтируется на остальных компьютерах. Заметим, однако, что /usr/share обычно рассчитан на одну версию ОС и не предназначен для того, чтобы быть разделяемым различными операционными системами или различными версиями одной и той же ОС. Примерами файлов, которые размещаются в этом каталоге, могут служить файлы документации (man, doc) или базы данных (dict, terminfo, zoneinfo). Любая программа или пакет, который содержит или требует данных, не подлежащих модификации, должны хранить эти данные в каталоге /usr/share (или /usr/local/share, если пакет установлен локально). Рекомендуется использовать для этих целей подкаталоги каталога /usr/share.

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

В каталоге /usr/share создаются следующие подкаталоги или символические ссылки

  • man – Он-лайновые руководства
  • misc - Различные архитектурно-независимые данные
  • dictСловари (optional)
  • doc - Различная документация (optional)
  • games - Файлы статических данных для /usr/games (optional)
  • info - Основная директория для системы GNU Info (optional)
  • locale - Локальная информация (optional)
  • nls - Каталоги сообщений для поддержки языков (optional)
  • sgml - Данные для SGML и XML (optional)
  • terminfo - Каталог базы данных для terminfo (optional)
  • tmac - Макросы для troff, не распространяемые с groff (optional)
  • zoneinfo - Конфигурационные файлы и информация о временной зоне (optional)

    Рекомендуется размещать здесь архитектурно-независимые каталоги, создаваемые приложениями. К такого рода каталогам относятся groff, perl, ghostscript, texmf и kbd (Linux) или syscons (BSD). Они могут, однако, из соображений обратной совместимости, по усмотрению разработчика располагаться в /usr/lib. Подобным же образом в дополнение к каталогу /usr/share/games может создаваться каталог /usr/lib/games, если разработчик желает разместить тут какие-то данные для своей игры.

    /usr/share/dict : Словари

    Каталог /usr/share/dict содержит списки слов (словари), используемые в системе; обычно в ней находится только файл words для английского языка, который используется утилитой look(1) и различными программами проверки правописания. Файл words может быть ориентирован либо на американский, либо на британский вариант языка. В системах, где необходим как американский, так и британский английский, можно сделать words ссылкой на /usr/share/dict/american-english или /usr/share/dict/british-english.

    Списки слов для других языков могут быть добавлены, используя английское название соответствующего языка, например, /usr/share/dict/french, /usr/share/dict/danish, и так далее. В названиях должен, по возможности, использоваться набор символов ISO 8859, соответствующий данному языку; если возможно, надо использовать набор символов Latin1 (ISO 8859-1).

    /usr/share/man : Страницы руководства man

    Исходной директорией (<mandir>) для интерактивного руководства man в UNIX-системах является каталог /usr/share/man. Этот каталог содержит информацию о командах и других данных, размещаемых в файловых системах / и /usr.

    Страницы интерактивного руководства man разбиты на следующие секции:

    • man1: Пользовательские программы.
      В этой секции содержатся описания общедоступных команд. Здесь расположена большая часть необходимой пользователям документации к программам.
    • man2: Системные вызовы.
      Эта секция описывает все системные вызовы (запросы к ядру на выполнение каких-то операций).
    • man3: Библиотеки функций и подпрограмм.
      В секции 3 описываются библиотеки программных процедур, которые не являются прямыми вызовами сервисов ядра. Эта секция, как и секция 2, представляет интерес только для программистов.
    • man4: Специальные файлы.
      Секция 4 описывает специальные файлы устройств, функции соответствующих драйверов и средства сетевой поддержки, предоставляемые системой. Обычно в эту секцию включается описание файлов устройств, находящихся в каталоге /dev, и интерфейса ядра для средств поддержки сетевых протоколов.
    • man5: Форматы файлов.
      Форматы многих файлов данных документированы в секции 5. Речь идет о различных подключаемых файлах, файлах вывода программ, системных файлах и так далее.
    • man6: Игры.
      В эту секцию включена документация к играм, демо и другим тривиальным программам. Разные люди могут иметь разные мнения о том, насколько важно то, что размещено здесь.
    • man7: Разное.
      Страницы руководства, которые трудно отнести к какому-то иному разделу, размещаются в секции 7. Здесь вы найдете, к примеру, описание troff и других средств для обработки текста.
    • man8: Системное администрирование.
      В этой секции документированы программы, используемые системным администратором для выполнения системных операций и поддержки работоспособности системы. Некоторые из этих программ бывают полезны иногда и обычным пользователям.

    Деление страниц руководства на секции и нумерация секций от "1" до "8" определено традициями. В общем случае имена файлов для страниц руководства, расположенных в определенной секции, оканчиваются расширением вида .<section>, совпадающим с номером секции. Для каждой секции создается отдельный каталог с именем <mandir>/<locale>/man<section>/<arch>, где компонент <section> задает секцию руководства, а разъяснения того, что имеется в виду под <locale> и <arch> даются ниже.

    Примечание: Если, например, /usr/local/man не содержит файлов руководства в секции 4 (Устройства), то каталог /usr/local/man/man4 может не создаваться.

    Для поддержки страниц руководства, написанных на разных (или нескольких) языках, вводятся отдельные подструктуры каталога /usr/share/man. Способ именования специфичных для языка подкаталогов /usr/share/man основан на Приложении E стандарта POSIX 1003.1, которое задает формат строки, идентифицирующей локаль, - это общепринятый метод определения особенностей, определяемых культурой той или иной страны. Строка <locale> имеет следующий формат:

    <language>[_<territory>][.<character-set>][,<version>]

    Поле <language> должно браться из стандарта ISO 639 (коды для представления названий языков). Оно должно состоять из двух символов и записываться только в нижнем регистре.

    Поле <territory> должно состоять из двух символов, записываемых только в верхнем регистре (заглавными буквами), и представляет собой, если это возможно, двухбуквенный код из спецификации ISO 3166.

    Поле <character-set> представляет собой стандартное описание кодировки. Если поле <character-set> представлено только цифрами, эти цифры представляют номер международного стандарта, описывающего набор символов. Рекомендуется, если это возможно, чтобы это было числовое представление (в особенности стандартов ISO), не включающее дополнительных символов пунктуации, и чтобы любые символы были в нижнем регистре.

    После поля <character-set> может располагаться параметр <version>, который отделяется запятой. Этот параметр может использоваться для выделения каких-то дополнительных версий кодировки. Но разработчики стандарта FHS не рекомендуют использовать поле <version>, если только это не является необходимым.

    Системы, которые используют только один язык и набор символов для всех страниц интерактивного руководства, могут опустить подстроку <locale>, и хранить все страницы руководства в <mandir>. Например, системы, в которых страницы руководства имеются только на английском языке, причем в кодировке ASCII, могут хранить все страницы документации (каталоги man<section>) прямо в /usr/share/man. (Фактически это традиционное их местоположение.)

    Страны, для которых есть общепринятый стандарт кодового набора символов, могут опустить поле <character-set>, но стандарт настоятельно рекомендует включить его, особенно для стран с несколькими конкурирующими стандартами.

    В тексте стандарта приведены следующие примеры формирования имен каталогов для различных стран и кодировок:

    Язык

    Территория

    Набор символов

    Каталог





    Английский

    --

    ASCII

    /usr/share/man/en

    Английский

    Великобритания

    ASCII

    /usr/share/man/en_GB

    Английский

    Соединенные Штаты

    ASCII

    /usr/share/man/en_US

    Французский

    Канада

    ISO 8859-1

    /usr/share/man/fr_CA

    Французский

    Франция

    ISO 8859-1

    /usr/share/man/fr_FR

    Немецкий

    Германия

    ISO 646

    /usr/share/man/de_DE.646

    Немецкий

    Германия

    ISO 6937

    /usr/share/man/de_DE.6937

    Немецкий

    Германия

    ISO 8859-1

    /usr/share/man/de_DE.88591

    Немецкий

    Швейцария

    ISO 646

    /usr/share/man/de_CH.646

    Японский

    Япония

    JIS

    /usr/share/man/ja_JP.jis

    Японский

    Япония

    SJIS

    /usr/share/man/ja_JP.sjis

    Японский

    Япония

    UJIS (или EUC-J)

    /usr/share/man/ja_JP.ujis

    Аналогичным образом вводятся специальные каталоги для страниц руководства, которые зависят от архитектуры, таких как описания драйверов устройств или низкоуровневых команд системного администрирования. Таковые должны быть размещены в подкаталогах <arch> в соответствующем каталоге man<section>; например, man-страница по команде ctrlaltdel(8) для архитектуры i386 может быть расположена в файле /usr/share/man/<locale>/man8/i386/ctrlaltdel.8.

    Кроме того, некоторые большие массивы страниц руководства, относящихся к определенным приложениям, могут иметь дополнительный суффикс, добавляемый к имени файла со страницей руководства. Например, для системы обработки почты MH файлы руководства должны иметь дополнительный суффикс mh в имени файла. Все страницы руководства для системы X Window System должны иметь дополнение x к имени файла.

    Требование размещения страниц интерактивного руководства для различных языков в соответствующих подкаталогах каталога /usr/share/man распространяется также на другие структуры каталогов с руководствами, такие как /usr/local/man и /usr/X11R6/man. (Это требование применяется также к каталоговой структуре /var/cache/man, рассматриваемой ниже.)

    /usr/share/misc : Различные архитектурно-независимые данные

    Этот каталог содержит различные архитектурно-независимые файлы, для которых не требуется отдельный подкаталог в /usr/share (но разработчики могут при желании разместить их также в /usr/lib). Вот некоторые из таких файлов: airport, birthtoken, eqnchar, getopt, gprof.callg, gprof.flat, inter.phone, ipfw.samp.filters, ipfw.samp.scripts, keycap.pcvt, mail.help, mail.tildehelp, man.template, map3270, mdoc.template, more.help, na.phone, nslookup.help, operator, scsi_modes, sendmail.hf, style, units.lib, vgrindefs, vgrindefs.db, zipcodes.

    Следующие файлы или символические ссылки на файлы должны иметься в /usr/share/misc, если соответствующие подсистемы установлены.

    • ascii - таблица набора символов ASCII (ASCII character set table),
    • magic - список магических чисел для команды file, используемый по умолчанию,
    • termcap - база данных с параметрами терминалов,
    • termcap.db - база данных с параметрами терминалов.

    Каталоговая структура /var

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

    Некоторые части каталоговой структуры /var не являются разделяемыми между разными системами. К ним относятся /var/log, /var/lock и /var/run. Другие части могут быть разделяемыми, например, /var/mail, /var/cache/man, /var/cache/fonts и /var/spool/news.

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

    Следующие каталоги или символические ссылки на каталоги должны обязательно присутствовать в /var.

    cache
    lib
    local
    lock
    log
    opt
    run
    spool
    tmp

    Данные кэшей приложений
    Переменная информация о состоянии приложений
    Переменные данные для /usr/local
    Файлы блокирования устройств и программ
    Каталоги и файлы протоколов
    Переменные данные для /opt
    Данные, относящиеся к запущенным процессам
    Данные очередей, создаваемых приложениями
    Временные файлы, сохраняемые между перезапусками системы

    Несколько каталогов "зарезервированы" в том смысле, что они не должны использоваться произвольным образом каким-либо из новых приложений, поскольку это противоречит исторической или локальной практике их использования. Это следующие каталоги:
    /var/backups
    /var/cron
    /var/msgs
    /var/preserve

    Наличие следующих подкаталогов в /var не является обязательным, но они (может быть как символические ссылки) должны иметься, если соответствующие системы установлены:

    account - протоколы работы процессов,
    crash - д
    ампы памяти при крахе системы,
    games -
    временные данные игровых приложений,
    mail -
    файлы почтовых ящиков пользователей,
    yp -
    файлы базы данных сетевой информационной службы (Network Information Service - NIS).

    Приложения в общем случае не должны добавлять каталоги непосредственно в /var. Такие каталоги должны создаваться в соответствующих подкаталогах.

    /var/cache : Данные кэша приложений

    Каталог /var/cache предназначен для кэширования данных приложениями. Необходимость такого кэширования возникает при выполнении медленных процессов ввода-вывода или для хранения промежуточных результатов вычислений. В отличие от /var/spool, кэшированные файлы могут быть удалены без потери данных. Но эти данные должны сохраняться между сеансами работы приложения и при перезагрузках системы.

    Файлы, расположенные в /var/cache, могут удаляться либо самим приложением, либо администратором. Приложение должно всегда иметь возможность продолжить работу, даже после удаления этих файлов вручную (например, при нехватке дискового пространства). Никаких других требований на формат данных в каталоге кэша не накладывается.

    Существование отдельной директории для кэшируемых данных позволяет системным администраторам устанавливать для этого каталога правила использования и резервного копирования, отличающиеся от правил, устанавливаемых для других каталогов в /var.

    Обычно в этом каталоге создаются подкаталоги

    fonts - локально сгенерированные шрифты,

    man - локально отформатированные страницы руководства,

    www - кэш данных для WWW proxy,

    <package> - кэшируемые данные пакета <package>.

    Каталог /var/cache/fonts должен использоваться для хранения динамически создаваемых шрифтов. В частности, все шрифты, автоматически генерируемые программой mktexpk, должны размещаться в соответствующим образом названных подкаталогах каталога /var/cache/fonts.

    Примечание: Стандарт FHS не предусматривает поглощение или замену the TeX Directory Structure (документ, который задает размещение файлов формата TeX и структуру соответствующих каталогов), так что этот документ полезно прочитать. Он размещается по адресу ftp://ctan.tug.org/tex/.

    Другие динамически создаваемые шрифты могут тоже размещаться в этом дереве, в соответствующим образом названных подкаталогах каталога /var/cache/fonts.

    Каталог /var/cache/man предусмотрен для сайтов, в которых файловая система /usr монтируется только на чтение, но в которых допускается создание страниц руководства, отформатированных локально. Сайты, в которых /usr монтируется с правом записи (например, когда у системы всего в один пользователь) могут не создавать каталога /var/cache/man, а использовать вместо него каталоги cat<section> непосредственно в /usr/share/man.

    Структура каталога /var/cache/man должна соответствовать наличию нескольких отдельных деревьев каталогов для страниц руководства и возможности наличия многоязыковой поддержки (смотри описание каталога /usr/share/man выше).

    /var/crash : Дампы памяти при крахе системы

    Этот каталог предназначен для записи в него содержимого оперативной памяти (дампа памяти) в случае краха системы. На момент выпуска данной версии настоящего стандарта дампы памяти не поддерживаются в системе Linux.

    /var/lock : Файлы блокирования

    Файлы блокирования устройств и других ресурсов, используемые многими приложениями, такие как файлы блокирования последовательных портов, должны храниться в каталоговой структуре /var/lock. Названия этих файлов должны формироваться в соответствии с соглашением, согласно которому используется префикс "LCK..", за которым следует базовое имя устройства. Например, для блокирования /dev/ttyS0 должен создаваться файл "LCK..ttyS0". Любое приложение, которое хочет использовать /dev/ttyS0, должно прочитать файл блокирования и действовать соответственно. Следовательно, все файлы блокирования в /var/lock должны быть доступны по чтению всем.

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

    /var/log : Каталоги и файлы протоколов

    Эта директория содержит разнообразные файлы протоколов. Большая часть протоколов должна записываться в этот каталог или соответствующий подкаталог.

    Следующие файлы или символические ссылки на файлы должны быть в /var/log, если соответствующая подсистема установлена:

    • lastlog - запись о последнем входе в систему каждого пользователя,
    • messages - системные сообщения от syslogd,
    • wtmp - записи о всех входах и выходах пользователей в систему.

    /var/mail : Почтовые ящики пользователей

    Область спулинга для почты должна размещаться в /var/mail, а имена файлов с сообщениями должны иметь вид <username>. (Заметим, что /var/mail может быть символической ссылкой на другой каталог.)

    Файлы почтовых ящиков в этих каталогах должны хранится в формате стандартных почтовых ящиков UNIX (UNIX mailbox format).

    Важно заметить, что нет требования физически переместить область спулинга в указанный каталог. Однако программы и заголовочные файлы должны быть изменены так, чтобы они использовали /var/mail.

    /var/opt : Переменные данные для /opt

    Переменные данные для пакетов, установленных в /opt, должны размещаться в /var/opt/<package>, где <package> - это название структуры каталогов в /opt, в которой хранятся статические данные дополнительного пакета ПО, исключая те случаи, когда размещение явно указано в каком-либо файле из /etc. На внутреннюю структуру каталога /var/opt/<package> никаких ограничений не накладывается.

    /var/run : Переменные данные времени выполнения

    Этот каталог содержит данные, описывающие состояние системы с того момента, как она была загружена Файлы в этом каталоге должны очищаться (удаляться или урезаться соответствующим образом) в начале процесса загрузки системы. Программы могут иметь подкаталоги в каталоге /var/run; это приветствуется для программ, которые используют более одного файла времени выполнения.

    Примечание: Непривилегированные пользователи должны быть лишены права записи в каталог /var/run; с точки зрения безопасности предоставление любому пользователю права записи в этот каталог представляет большую угрозу. Файлы с идентификаторами процессов (PID), которые раньше располагались в /etc, должны быть размещены в /var/run. Соглашение об именах этих файлов следующее: <program-name>.pid. Например, PID-файл для демона crond называется /var/run/crond.pid.

    Файл, в котором хранятся идентификаторы процесса (PID), должен состоять из идентификатора процесса в коде ASCII, записанном в десятичной нотации, за которым следует символ конца строки. Например, если crond запущен как процесс с номером 25, /var/run/crond.pid будет содержать три символа: два, пять и символ новой строки.

    Программы, которые читают PID-файлы, должны быть достаточно гибкими в отношении того, что они воспринимают: то есть они должны игнорировать лишние пробелы, предшествующие ноли, отсутствие завершающего символа новой строки или дополнительные строки в PID-файле. Программы, которые создают PID-файлы, должны использовать простые спецификации, изложенные в предыдущем параграфе.

    В этом каталоге расположен также файл utmp, в котором хранится информация о том, кто в данный момент использует систему.

    /var/spool : Очереди данных для приложений

    Каталог /var/spool содержит данные, которые ожидают какой-то последующей обработки (программой, пользователем или администратором); обычно после обработки эти данные удаляются.

    Обычно в /var/spool создаются следующие подкаталоги: lpd (каталог спулинга для принтера), mqueue (очередь исходящей почты), news (каталог спулинга новостей), rwho (файлы для программы Rwhod), uucp (каталог спулинга для UUCP).

    /var/tmp : Временные файлы, сохраняемые между перезапусками системы

    Каталог /var/tmp сделан доступным для программ, которым требуется временные файлы или каталоги, которые должны сохраняться между перезагрузками системы. Следовательно, данные, хранящиеся в /var/tmp, являются более постоянными, чем данные в /tmp.

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

    Дополнительные требования стандарта для ОС Linux

    Отдельный раздел стандарта FHS содержит требования и рекомендации, которые относятся только к операционной системе Linux. Вот их краткий перечень:

    • В Linux-системах, если ядро расположено в корневом каталоге («/»), рекомендуется использовать для него названия vmlinux или vmlinuz, которые используются в последних версиях исходных кодов ядра Linux.
    • Если в Linux-системе используется файл setserial, он должен размещаться в каталоге /bin.
    • Все устройства и специальные файлы в /dev должны соответствовать документу Linux Allocated Devices, который поставляется в составе исходных кодов ядра и поддерживается Питером Анвином (H. Peter Anvin). Символические ссылки в каталоге /dev должны устанавливаться в Linux-системах не иначе как в соответствии с документом Linux Allocated Devices.
    • Если в Linux-системе используется файл lilo.conf, он должен размещаться в каталоге /etc.
    • Поскольку файловая система proc является фактически стандартным для Linux методом обработки информации о системе и процессах, в отличие от других систем, использующих /dev/kmem и другие подобные методы, настоятельно рекомендуется использовать proc для хранения и получения информации о процессах, а также информации о ядре и памяти.
    • В Linux-системах следующие дополнительные файлы размещаются в /sbin (в тексте стандарта имеются пояснения, почему возникло это требование):
    • Команды для управления файловой системой ext2fs: badblocks, dumpe2fs, e2fsck, mke2fs, mklost+found, tune2fs;
    • Программа установки загрузчика системы lilo;
    • Неизменяемые исполняемые файлы ldconfig, sln, ssync.
    • Программы ctrlaltdel, kbdrate.
    • Если в системе установлены компиляторы языков C или C++, и система не основана на glibc, должны быть созданы следующие символические ссылки:
      /usr/include/asm -> /usr/src/linux/include/asm-<arch>
      /usr/include/linux -> /usr/src/linux/include/linux
    • Для систем, основанных на версиях библиотеки libc, предшествующих glibc, применяются следующие правила:

    Единственными исходными кодами, которые должны быть размещены в определенном месте, являются исходные коды ядра Linux. Они размещаются в /usr/src/linux.

    Если установлен компилятор C или C++, а полная версия исходных кодов ядра не установлена, то подключаемые файлы из исходных кодов ядра должны размещаться в следующих каталогах:

    /usr/src/linux/include/asm-<arch>

    /usr/src/linux/include/linux

    где <arch> - название архитектуры системы (например, i386).

    Замечание: /usr/src/linux может быть символической ссылкой на дерево каталогов с исходными кодами ядра.

    • Каталог /var/spool/cron содержит переменные данные для программ-демонов cron и at.

    Иерархия файловых систем

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

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

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

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

    • Здесь же должны быть расположены и те утилиты, которые необходимы для восстановления данных с резервных копий (с дискет, магнитных лент и т.п.).

    По нескольким причинам размер корневой файловой системы желательно сделать достаточно малым.

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

    В общем, из чтения текста стандарта можно сделать вывод о том, что в корневой файловой системе обязательно должны целиком (то есть со всем их содержимым) располагаться каталоги /bin, /dev, /etc, /lib, /sbin и, возможно, /root.

    Каталог /boot в силу аппаратных ограничений может оказаться необходимым разместить на отдельном разделе диска, расположенном целиком в пределах первых 1024 цилиндров загрузочного диска. Еще одной причиной размещения этого каталога в отдельной файловой системе может оказаться использование файловой системы ReiserFS: ядро не всегда может загружаться из раздела с такой файловой системой [2].

    Остальные подкаталоги корневого каталога (home, mnt, opt, tmp, usr, var) могут размещаться в других файловых системах (на других разделах или дисках). Более того, в стандарте явно постулируется, что в каталогах /usr, /opt и /var размещаются такие файлы, которые могут располагаться в других разделах диска или в других файловых системах. Разработчики стандарта советуют в том случае, когда /var не может быть размещен в отдельном разделе диска, переместить каталог /var из корневого раздела в раздел с каталогом /usr. (Иногда это делается с целью уменьшения размера корневого раздела или когда в корневом разделе остается слишком мало места). Однако, /var нельзя делать ссылкой на /usr потому что это затрудняет разделение /usr и /var и может привести к конфликту имен. Лучше уж сделать /var ссылкой на /usr/var.

    Что касается каталога /home, то его размещение в отдельном разделе диска в стандарте прямо не оговаривается, но как бы молча подразумевается. Впрочем, такое решение легко обосновать и без ссылок на стандарт. Причем оно не зависит от того, идет ли речь о персональном компьютере или о файловом, предположим, сервере. В обоснование этого вывода можно привести следующие доводы. Рано или поздно, но систему придется переустанавливать или обновлять. Если раздел с программным обеспечением при этом практически безболезненно можно отформатировать (поскольку дистрибутив Linux содержит, как правило, обновленные версии практически всех пакетов ПО и все будет заново поставлено), то домашние каталоги пользователей из дистрибутива не обновишь. Представьте, что ваш домашний каталог администратор почистит без вашего ведома. Так что уж лучше каталог /home не трогать. Поэтому стоит разместить домашние каталоги пользователей в отдельной файловой системе и после переустановки ОС заново смонтировать ее в каталог /home.

    Что касается каталога /usr, то, если исходить из приведенной в стандарте рекомендации минимизации корневого раздела, его, вслед за /home, надо выносить в отдельный раздел. Дело в том, что если исключить домашние каталоги пользователей, то именно этот каталог по объему составляет более 90% объема всех каталогов. Это и не удивительно – в нем установлено все программное обеспечение.

    Пожалуй, это все, что можно извлечь из текста стандарта относительно разнесения каталогов по разным файловым системам. А уж решение о том, как именно разбить диск на разделы принимает администратор каждой конкретной системы самостоятельно (можно еще учесть рекомендации статей [2,3]).

    В заключение хочется еще раз отметить, что речь в статье идет только о требованиях и рекомендациях стандарта FHS, причем стандарта, разработанного с ориентацией на операционные системы Linux и BSD. Даже конкретные дистрибутивы Linux далеко не во всем следуют этому стандарту. Например, в Red Hat Linux версий 7.3 и 8.0 каталог /etc/opt хотя и создан, но пуст, а конфигурационные каталоги пакетов размещаются непосредственно в /etc. Аналогичная ситуация с каталогом /opt - он тоже пуст, а все дополнительное ПО устанавливается, по-видимому, в /usr (по крайней мере то ПО, которое разворачивается из rpm-пакетов). Можно указать и другие отклонения от стандарта. Но все же в основном структура каталогов выдерживается в соответствии с FHS, и я надеюсь, что чем дальше, тем больше будет к нему приближаться. Так что знакомство с этим стандартом безусловно полезно всем пользователям Linux, а тем более разработчикам программного обеспечения для этой операционной системы.

    Литература

    1. В.Костромин, “Самоучитель Linux для пользователя”, изд. БХВ-Петербург, 2002 г.
    2. В.Холманов, «Разбиение дисков и инсталляция Linux на LVM”, http://www.softerra.ru/freeos/20792/print.html
    3. А.Федорчук, «Установка Linux в современных условиях: дисковые разделы», http://linuxshop.ru/unix4all/?cid=&id=12.