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

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

Виктор Костромин

Структура каталогов понятие чисто логическое и к реальным механизмам работы с файлами отношения не имеет. Каждая конкретная операционная система могла бы строить ее по-своему, что привело бы к несовместимости и непереносимости программ. Группой энтузиастов был разработан стандарт 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.

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

/sbin содержит утилиты для выполнения задач системного администрирования (и другие команды, используемые только пользователем root). Этот каталог содержит исполняемые файлы, необходимые для загрузки системы и ее восстановления в различных ситуациях (restoring, recovering, and/or repairing the system), не попавшие в каталог /bin. Единственная команда, которая обязательно должна присутствовать в /sbin, — shutdown. К примеру, команда ping, хотя она абсолютно необходима суперпользователю, часто используется и рядовыми пользователями, и по этой причине должна размещаться в /bin. Авторы стандарта рекомендуют предоставить всем пользователям право на чтение и выполнение для всех файлов, расположенных в /sbin, кроме, может быть тех программ, для которых установлены биты setuid и setgid. Разделение каталогов /bin и /sbin делается с целью установления явного различия между исполняемыми файлами, которые используются всеми, и теми утилитами, которые в основном используются для решения административных задач. С точки зрения безопасности нет никаких преимуществ в том, чтобы сделать /sbin недоступным для пользователей.

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

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

/usr/spool -> /var/spool

/usr/tmp -> /var/tmp

/usr/spool/locks -> /var/lock

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

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

man — интерактивные руководства; 

misc — различные архитектурно-независимые данные, для которых не требуется отдельный подкаталог в /usr/share; 

dict — словари (факультативно), обычно здесь находится только файл words для английского языка, который используется утилитой look и различными программами проверки правописания; списки слов для других языков могут быть добавлены, используя английское название соответствующего языка, например, /usr/share/dict/french, /usr/share/ dict/danish и т.д.; 

doc - различная документация (факультативно); 

games - файлы статических данных для /usr/games (факультативно); 

info - основной каталог для системы GNU Info (факультативно); 

locale - локальная информация (факультативно); 

nls - каталоги сообщений для поддержки языков (факультативно); 

sgml - данные для SGML и XML (факультативно); 

terminfo - каталог базы данных для terminfo (факультативно); 

tmac - макросы для troff (факультативно); 

zoneinfo - конфигурационные файлы и информация о временной зоне (факультативно). 

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

Как известно, страницы интерактивного руководства man традиционно разбиты на секции. Для каждой секции создается отдельный каталог с именем <mandir>/<locale>/manN/<arch>, где <arch> — указание на архитектуру (например, i386), а строка <locale> определяет язык, страну и кодировку и имеет следующий формат:

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

Каталог /var содержит файлы с изменяющимися данными: каталоги и файлы очередей, данные об администрировании, временные файлы. Некоторые части каталоговой структуры /var не являются разделяемыми между разными системами. К ним относятся /var/log, /var/lock и /var/run. Другие части могут быть разделяемыми, например, /var/mail, /var/cache/man, /var/cache/fonts и /var/spool/news. Структура каталогов /var определяется в стандарте FHS с той целью, чтобы сделать возможным монтирование каталога /usr в режиме только для чтения. Все, что записывается на диск в процессе выполнения системных операций (в противоположность процессам установки и поддержки программ), должно размещаться в каталоге /var. Несколько подкаталогов «зарезервированы» — они не должны использоваться произвольным образом, поскольку это противоречит сложившейся практике: /var/backups, /var/cron, /var/msgs, 

/var/preserve.

Приложения в общем случае не должны добавлять каталоги непосредственно в /var. Такие каталоги должны создаваться в соответствующих подкаталогах. Каталог /var/cache предназначен для кэширования данных приложениями. В отличие от /var/spool, кэшированные файлы могут быть удалены без потери данных. Но эти данные должны сохраняться между сеансами работы приложения и при перезагрузках системы. Приложение должно всегда иметь возможность продолжить работу, даже после удаления этих файлов администратором (например, при нехватке дискового пространства). Существование отдельного каталога для кэшируемых данных позволяет системным администраторам устанавливать для этого каталога правила использования и резервного копирования, отличающиеся от правил, устанавливаемых для других каталогов в /var. Обычно в этом каталоге создаются подкаталоги fonts (локально сгенерированные шрифты), man (локально отформатированные страницы руководства), www (кэш данных для WWW-прокси), <package> (кэшируемые данные пакета <package>). /var/cache/man предусмотрен для сайтов, в которых файловая система /usr монтируется только на чтение, но в них допускается создание страниц руководства, отформатированных локально. Сайты, в которых /usr монтируется с правом записи (например, когда у системы всего один пользователь) могут не создавать каталога /var/cache/man, а использовать вместо него каталоги cat<section> непосредственно в /usr/share/man.

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

Каталог /var/log содержит разнообразные файлы протоколов: lastlog (запись о последнем входе в систему каждого пользователя); messages (системные сообщения от syslogd); wtmp (записи о всех входах и выходах пользователей в систему).

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

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

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

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

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

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

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

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

Иногда приходится монтировать корневую файловую систему с носителя малого объема.

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

Маленькая корневая файловая система менее подвержена разрушению в случае сбоев.

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

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

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

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