Виктор Костромин
Структура каталогов понятие чисто логическое и к реальным механизмам работы с файлами отношения не имеет. Каждая конкретная операционная система могла бы строить ее по-своему, что привело бы к несовместимости и непереносимости программ. Группой энтузиастов был разработан стандарт FHS иерархии файловых систем для Unix-подобных операционных систем.
Любой пользователь знаком сегодня с понятиями файла и каталога (с точки зрения Unix каталог тот же файл) [1-3]. Группой энтузиастов из сообщества разработчиков программ с открытым кодом была предложена спецификация структуры каталогов для Unix-подобных систем, так называемый стандарт иерархии файловых систем (Filesystem Hierarchy Standard, FHS).
Работа над FHS началась в августе 1993 года с попытки упорядочить структуру файлов и каталогов Linux. Вначале его называли проектом стандартов файловой системы Filesystem Standards Project (FSSTND), а первая версия была выпущена 14 февраля 1994 года. В начале 1995 года была поставлена задача по созданию более общей версии FSSTND, предназначенной не только для Linux, но и для других Unix-подобных систем, в первую очередь BSD 4.4. Учитывая расширение сферы действия стандарта, его переименовали в FHS (www.pathname.com/fhs). Стандарт вобрал положительные качества, присущие BSD и другим системам в части поддержки различных архитектур и учета требований работы в гетерогенных сетях.
Во-первых, учитывалось, что, хотя в Unix-подобных системах структура каталогов представлена в виде единого дерева, отдельные его «ветви» могут располагаться на разных носителях или в разных файловых системах. Размещение файлов на разных носителях позволяет оптимизировать процессы загрузки, последующего функционирования и возможного обновления системы. При этом файловые системы могут физически располагаться на разных компьютерах и быть различными по своей внутренней организации (ext2fs, vfat и т.д.). Во-вторых, любая Unix-система — система сетевая. Поэтому при размещении отдельных файлов в различных частях файловой структуры учитывалось, что некоторые файлы должны быть доступны с других компьютеров в сети, а к другим файлам доступ по сети необходимо ограничить. Группа неразделяемых файлов вычленяется как по соображениям безопасности, так и просто потому, что эти файлы определяют локальную конфигурацию системы и поэтому нужны только на данном компьютере. Выделение группы разделяемых файлов позволяет также экономить общее дисковое пространство. В третьих, существуют файлы, изменять которые может только администратор, и те, которые любой пользователь может менять самостоятельно. К числу статических относятся исполняемые файлы, библиотеки, документация и др. Для рядовых пользователей эти файлы должны быть доступны только на чтение. Знание этих предпосылок помогает понять логику размещения отдельных файлов и каталогов в структуре каталогов, предлагаемой стандартом FHS.
Корневой каталог
Стандарт FHS предлагает создать в корневом каталоге следующие подкаталоги:
bin - файлы основных команд (утилит), которые необходимы, когда никакая другая файловая система еще не смонтирована (например, в однопользовательском режиме);
boot - неизменяемые файлы, необходимые для загрузки системы;
dev - файлы устройств;
etc - файлы конфигурации системы на данном компьютере;
home - домашние каталоги пользователей (факультативно);
lib - основные разделяемые библиотеки и модули ядра;
lib<alt> - основные разделяемые библиотеки для альтернативных форматов (факультативно);
mnt - точку монтирования для временно подключаемых файловых систем;
root - домашний каталог пользователя root (факультативно);
opt - дополнительные пакеты программного обеспечения;
sbin - основные системные исполняемые файлы;
tmp - временные файлы;
usr - иерархию второго уровня;
var - переменные данные.
В соответствии с требованиями стандарта приложения не должны создавать файлы и каталоги или требовать наличия каких-то специальных файлов и каталогов (помимо перечисленных) в корневом каталоге. Во-первых, размер корневой файловой системы желательно сохранять по возможности малым, а во-вторых, стандарт FHS обеспечивает достаточную гибкость и удобство размещения файлов, не попавших в корневую систему, в других файловых системах и подкаталогах. Некоторые подкаталоги корневого каталога факультативны. Но уж если они существуют, то должны размещаться в корневом каталоге, но не обязательно в корневой файловой системе.
Каталог /bin содержит команды, которые могут использоваться как администратором, так и рядовыми пользователями, причем только те команды, которые необходимы, когда никакая другая файловая система, кроме корневой, еще не смонтирована (например, в однопользовательском режиме). Те утилиты, которые не так важны, чтобы размещаться в корневой файловой системе, должны размещаться в каталоге /usr/bin. В /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, csh, ed, tar, cpio, gzip, gunzip, zcat, netstat, ping. В каталоге /bin не должно быть подкаталогов.
Каталог /boot содержит все, что необходимо в процессе загрузки, исключая конфигурационные файлы и установщика карты загрузки. Ядро операционной системы должно располагаться либо в корневом каталоге /, либо в /boot; программы, необходимые загрузчику для организации загрузки файлов, должны размещаться в /sbin, а конфигурационные файлы загрузчика — в /etc.
/dev — место расположения специальных файлов устройств. На случай, если потребуется создавать файлы устройств вручную, каталог /dev должен содержать команду MAKEDEV, которая может создать файл устройства в случае необходимости.
Каталог /etc содержит конфигурационные файлы и каталоги, специфичные для данной конкретной системы, но в нем не должно быть двоичных файлов. В соответствии со стандартом FHS каталог в обязательном порядке должен содержать подкаталог /opt, в котором должны размещаться подкаталоги с конфигурационными файлами отдельных пакетов и приложений. Для каждого установленного пакета <package> должен создаваться конфигурационный каталог /etc/opt/package. В каталоге /etc должны содержаться следующие каталоги и файлы:
/X11 - конфигурационные файлы X Window;
/sgml - конфигурационные файлы для SGML и XML;
csh.login - общесистемный инициализационный файл для csh;
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, и помещен в данный каталог в виде исключения, по историческим причинам.
В небольших системах каждый домашний каталог пользователя является одним из непосредственных подкаталогов каталога /home, таких как /home/smith, /home/operator и т.д. В больших системах (особенно когда каталоги /home являются разделяемыми между многими хостами) полезно объединить домашние каталоги в группы, введя подкаталоги групп, такие как /home/staff, /home/students. Поскольку структура домашних каталогов различается от хоста к хосту, никаких требований на нее не налагается.
/lib содержит разделяемые библиотеки, необходимые для загрузки системы и запуска команд из каталогов /bin и /sbin. По крайней мере, один из файлов, соответствующих каждому из следующих шаблонов, должен найтись в данном каталоге (это могут быть либо реальные файлы, либо символические ссылки): libc.so.*, динамически подсоединяемые библиотеки Cи; ld*, загрузчик/ времени выполнения. Не должны располагаться в /lib разделяемые библиотеки, которые необходимы только исполняемым файлам, расположенным в /usr (таким, как двоичные файлы X Window). В частности, библиотека libm.so.* может быть расположена в /usr/lib, если она не требуется никаким программам из /bin или /sbin. Может существовать более одного варианта каталога /lib в системах, поддерживающих более одного формата исполняемых файлов (например, 32–разрядные и 64-разрядные форматы), при этом для каждого формата требуется свой отдельный вариант разделяемых библиотек (которые могут называться /lib32 и /lib64).
/mnt предназначен для временного монтирования файловых систем по мере необходимости. Содержимое этого каталога индивидуально для каждой системы и не должно никаким образом влиять на работу запускаемых программ.
/opt резервируется стандартом FHS для установки дополнительных программных пакетов. Предполагается, что любой такой пакет должен размещать свои статические файлы в отдельной структуре /opt/<package>, где <package> — название пакета. Исполняемые программы располагаются в каталоге /opt/<package>/bin, а в /opt/<package>/man размещаются страницы обычного для Unix интерактивного руководства man. Файлы пакета, которые являются переменными (изменяемыми при выполнении стандартных операций), должны устанавливаться в /var/opt, а специфичные для хоста конфигурационные данные должны устанавливаться в /etc/opt. Никакие файлы пакета не должны размещаться вне каталогов /opt, /var/opt и /etc/opt, кроме тех файлов, которые должны оказаться в других местах по той причине, что иначе пакет не сможет функционировать нормально. Например, файлы блокирования устройств должны располагаться в /var/lock, а файлы устройств должны располагаться в /dev.