Использование UNIX: Часть 11. Устройство файловой системы UNIX

Часть, в которой объясняется, где в UNIX хранятся важные файлы

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

Мартин Стрейчер, главный редактор, Linux Magazine

Мартин Стрейчер (Martin Streicher) -- главный редактор журнала Linux Magazine. Он имеет степень магистра компьютерных наук Университета Пардью (Purdue University) и с 1982 занимается программированием на языках Pascal, C, Perl, Java и (с недавнего времени) Ruby в UNIX-подобных операционных системах.



21.03.2008

Я недавно приобрел GPS-навигатор и крайне доволен этой покупкой. Добраться из точки А в точку Б - больше не проблема: не нужно искать место на карте и определять, где восток, или останавливаться в захолустье, чтобы уточнить, куда ведет дорога. Я просто сажусь в машину, указываю пункт назначения и следую голосовым инструкциям. GPS-навигатор заменяет проводника и дает новый смысл афоризму "куда ты идешь, там ты и находишься".

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

Что означают названия каталогов?

Файлы в ОС UNIX организованы в иерархию. На самом верху иерархии расположен корневой каталог - /, иногда называемый "слеш" (косая).

Если сменить рабочий каталог на корневой каталог / и выполнить команду ls, то можно увидеть несколько подкаталогов с загадочными названиями, такими как etc, bin, var, home и tmp. Хотя теперь UNIX может поддерживать длинные названия файлов, названия большинства из этих каталогов сложились около 30 лет назад, когда UNIX только появился. Согласно устоявшимся традициям каждый из каталогов, находящихся в корневом каталоге, предназначен для определенной цели.

  • /bin - один из многих каталогов, содержащих приложения и утилиты. Однако /bin содержит важнейшие утилиты операционной системы. Например, в каталоге /bin оболочки содержатся команды для манипулирования файлами, такие как cp и chmod, утилиты для архивирования и диагностики.

    /sbin также содержит утилиты жизненно важные для функционирования и поддержки системы. Правда, программы, находящиеся в /sbin, могут быть выполнены только суперпользователями (/sbin. сокр. от superuser-bin).

  • /dev содержит все аппаратное обеспечение, установленное на компьютере, включая терминалы и USB-устройства и другую периферию, физически подключенную к компьютеру, псевдотерминалы, используемые для взаимодействия с X-терминалами, жесткие диски и т.д.
  • /etc используется для конфигурации системы. Этот каталог содержит конфигурационные файлы для системных демонов, сценариев инициализации, параметров системных и других компонентов.
  • /home содержит домашние каталоги пользователей. Например, если имя пользователя joe, то для хранения его личных файлов будет использоваться каталог /home/joe.
  • /lib - это хранилище важнейших системных библиотек. В современных версиях UNIX обычно используются подключаемые системные библиотеки. Это значит, что библиотеки не входят в состав исполняемой программы, что как минимум приводит к перерасходу дискового пространства, а загружаются по требованию и совместно используются различными программами. Поэтому базовые приложения и утилиты, входящие в состав UNIX, требуют для запуска библиотеки из каталога /lib, и для компиляции новых программ из исходного кода также требуются несколько библиотек. Все файлы в этом каталоге являются необходимыми, и случайное или намеренное повреждение или удаление даже одного файла может лишить систему работоспособности.
  • /mnt (сокр. от mount) используется для монтирования разделов жестких дисков и других устройств. Чтобы увидеть, какие устройства смонтированы и доступны в данный момент, нужно просто запустить команду mount.
  • /tmp (сокр. от temporary) используется системой для временного хранения информации. Web-сервер может хранить файлы с данными текущего сеанса пользователя, другие утилиты могут использовать /tmp для хранения промежуточных результатов. Файлы в этом каталоге подлежат уничтожению по истечению определенного периода времени. Обычно системные администраторы каждый вечер стирают все файлы с истекшим сроком годности.
  • /usr хранит огромное количество файлов. Здесь находятся пользовательские приложения, такие как текстовые редакторы, игры и интерфейсы к системным функциям, а также страницы библиотеки man и многое другое. Если файл используется пользователями, но не обязателен для функционирования системы, то, скорее всего, он находится в каталоге /usr.
  • /var (сокр. от variable) используется для хранения файлов, размер которых увеличивается со временем. В этом каталоге могут храниться почтовые ящики, журналы регистрации событий, очереди принтера и базы данных. Также в \var обычно хранятся и Web-сайты, так как количество информации в них со временем увеличивается.

Обычно имена каталогов, указанные выше, используются чаще всего, хотя некоторые версии UNIX немного отличаются. Например, в Mac OS X, основанной на FreeBSD®, каталог для хранения домашних каталогов пользователей называется /Users, а не /home.

Сохраняя традиции

На самом дел, названия etc, bin, lib и man настолько прочно вошли в UNIX-культуру, что большинство каталогов подобного назначения, где бы они ни находились, стали называться именно так. Например, если посмотреть в домашний каталог опытного пользователя UNIX, то там можно найти каталоги bin и lib для хранения персональных приложений и сценариев с библиотеками.

Чтобы узнать больше о правилах наименования в UNIX, изучите Приложение А. Выберите стандарт, любой стандарт.

Следуя правилам, каталог /usr/local часто содержит etc, bin, lib и man. По традиции, каталог /usr/local используется для хранения приложений, которые были разработаны или используются только вами. В каталоге /usr/local/bin хранятся добавленные вами новые программы или измененные версии стандартных системных утилит. Например, системный администратор предпочтет использовать новую и более функциональную версию Perl в каталоге /usr/local/bin/perl, сохранив каталог /usr/bin/perl без изменений в качестве эталона и для других важных утилит, зависящих от него. Каталог /usr/local/lib дополняет каталог /usr/local/bin.

Каталог /usr/local даже может быть расположен на отдельном разделе. Например, на разделе, смонтированном с сетевого накопителя NAS (network attached storage) при помощи сетевой файловой системы NFS для упрощения восстановления системы. Если что-нибудь произойдет с системой, то администратор сможет переустановить файлы операционной системы, не беспокоясь о повреждении локальных данных.

Программные продукты тоже отражают структуру корневого каталога. Например, MySQL при конфигурации с опцией --prefix=/usr/local/mysql создает свой собственный корневой каталог /usr/local/mysql в каталоге /usr/local и создает подкаталоги /usr/local/mysql/bin, /usr/local/mysql/lib и т.д.

$ ls -1 /usr/local/mysql
bin/
configure*
data/
docs/
include/
lib/
man/
...

Если нужно установить компоненты MySQL в каталоги /usr/local/bin, /usr/local/lib и т.д., то следует использовать опцию --prefix=/usr/local.

Другие важные каталоги

Давайте познакомимся с другими важными каталогами ОС UNIX.

/etc

Каталог /etc служит для хранения конфигурационных файлов, которые обычно имеют расширение .conf. Большой по размерам программный продукт может иметь свой собственный подкаталог для хранения собственных конфигурационных файлов. Web-сервер Apache как раз является таким примером, в особенности начиная с версии 2.2, его конфигурационные файлы были реорганизованы из монолитных в файлы из отдельных модулей.

Другим нововведением является каталог /etc/init.d, в котором содержится множество сценариев инициализации, выполняемых при загрузке системы. Если нужно аккуратно перезапустить какой-либо демон, например, после изменения его конфигурации, то надо в каталоге /etc/init.d найти соответствующий сценарий. Например, перезапуск почтового транспортного агента Postfix выполняется с помощью следующего сценария:

$ /etc/init.d/postfix restart

Каталог /etc/init.d также содержит сценарии для отключения однопользовательского режима, перезагрузки и выключения компьютера и запрета входа в систему.

/var/spool

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

  • В каталоге /var/spool/mail содержится входящая почта пользователей. Почтовый ящик представляет собой неструктурированный, непрерывный и неиндексированный файл, если только системный администратор не использует формат почтового каталога. Входящая почта просто добавляется в конец этого файла. Сообщения, которые пользователь пометил к удалению, просто удаляются из файла, а когда он читает новое сообщение, то значение статуса этого сообщения изменяется и перезаписывается в соответствующее поле. Можно читать и писать в собственный почтовый ящик, но права доступа не позволяют получать доступ к ящикам других пользователей. Не рекомендуется работать с почтовым ящиком напрямую.
  • Каталог /var/log хранит набор журнальны файлов, в которые записываются действия, выполняемые системой. В журнальные файлы попадает все - от пересылки почты до неудачных попыток входа в систему. У каждого демона обычно есть свой журнальный файл, который поможет разобраться в причинах сбоя службы. Так как в действиях системы может содержаться конфиденциальная информация, то доступ к журнальным файлам обычно запрещен для всех, кроме суперпользователей, например, root.

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

/usr/man

Основные страницы справочника man для ОС UNIX находятся в каталоге /usr/man. Дополнительные наборы страниц можно найти в каталоге /usr/local/man и в каталоге man конкретного продукта, например /usr/local/mysql5/man.

Так как страницы man могут находиться в разных каталогах, программа man поддерживает переменную окружения MANPATH, работающую аналогично PATH. Чтобы искать страницу man более чем в одном каталоге, задайте с помощью MANPATH список каталогов, содержащих страницы man.

MANPATH="/usr/man"
MANPATH="/usr/local/man:$MANPATH"
MANPATH="/usr/local/mysql/man:$MANPATH
MANPATH="$HOME/man:$MANPATH"
export MANPATH

В этом примере первым будет просматриваться каталог $HOME/man (крайний слева), за ним будет просматриваться каталог /usr/local/mysql/man и т.д. Кстати, четыре команды, приведенные выше, можно свести в одну:

MANPATH="/usr/man:/usr/local/man:\
/usr/local/mysql/man:$HOME/man"

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

Подключаемые файлы

Подключаемые (include files) или заголовочные (header files) файлы хранят константы, макрокоманды и другие структуры, используемые операционной системой или определенной библиотекой. Вместо того чтобы переопределять конкретную структуру, можно просто подключить заголовочный файл к исходному коду (самая простая форма повторного использования) и программировать в соответствии со спецификацией заголовочного файла. (Секции 2 и 3 man предназначены для подобных спецификаций, например, попробуйте такую команду man 2 signal).

include - такое же стандартное название каталога, как bin и lib. Если с программой поставляется комплект разработчика и для программы создан свой корневой каталог, то в подкаталоге include можно найти ее заголовочные файлы.

Или если программа установлена в общий каталог /usr/local/{bin,lib,include}, то заголовочные файлы можно найти в подкаталоге с именем программы в каталоге /usr/local/include. Чем вызвано такое исключение из общего правила хранить все в общем каталоге? Заголовочные файлы обычно имеют стандартные названия, так что при установке всех файлов в один каталог могут возникнуть коллизии, когда одна программа перезапишет заголовочные файлы другой программы.

При сборке приложений из исходного кода (например, если нужно изучить новую версию), когда заголовочные файлы находятся в нестандартном каталоге, может потребоваться добавить опцию -I в команды компилятора. Например, если заголовочные файлы ImageMagick находятся в каталоге /opt/include/magick, нужно добавить -I/opt/include/magick в строку запуска компилятора.

Заключение

На этом сегодняшнее путешествие по каталогам UNIX завершено. Теперь читатель сможет с легкостью перемещаться по дереву каталогов UNIX, а если он потеряется, то вернуться в исходный каталог сможет с помощью cd. Также можно использовать команды find и locate, чтобы найти объекты практически любого типа: исполняемые файлы, библиотеки и заголовочные файлы.

Приложение А. Выберите стандарт, любой стандарт.

Программное обеспечение, поставляемое вместе с операционной системой, всегда устанавливается в определенные каталоги /bin или /lib файловой системы, в то время как локально устанавливаемое программное обеспечение можно обнаружить в любом месте. Некоторые системные администраторы устанавливают дополнительное программное обеспечение в каталоги /usr/local, другие используют каталог /opt (англ. optional), так как эти программы не обязательны для функционирования системы. Кроме того, некоторые администраторы размещают все исполняемые файлы в каталоге /usr/local/bin или /opt/bin, все библиотеки в каталоге /usr/local/lib или /opt/lib и т.д.

Другой подход, которого я придерживаюсь, предполагает создание корневого каталога для каждого устанавливаемого приложения, особенно для больших приложений. Например, я установил MySQL в каталог /usr/local/mysql5.0 и Apache в каталог /usr/local/apache2.2. При установке каждого приложения для него создается отдельный каталог bin, lib и man внутри корневого каталога приложения.

Недостаток такого подхода заключается в том, что каждый пользователь должен добавлять множество каталогов bin в переменную окружения PATH. И хотя это ограничение не слишком обременительно, его можно смягчить установкой для переменной PATH значения по умолчанию в сценарии, выполняющемся в системе при запуске оболочки. Например, сценарий /etc/profile, выполняющийся при запуске оболочки Bash, может содержать в себе:

PATH="/bin:/usr/bin:/usr/local/bin"

PATH="$PATH:/usr/local/mysql5.0/bin"
PATH="$PATH:/usr/local/perl6/bin"
PATH="$PATH:/usr/local/Zend/bin"

export PATH

Тем не менее хранение программы в своей собственной "папке-контейнере" имеет определенные преимущества:

  • Благодаря этому становится ясно, каким программным продуктом обеспечивается работа определенного приложения. Следуя такому принципу классификации можно узнать название программы, используя команды which:
    $ which mysql
    /usr/local/mysql5.0/bin/mysql
  • Можно параллельно иметь несколько версий одного продукта.

    Например, если нужно использовать Perl версии 5.6 и Perl версии 5.8, установите основную версию в каталог /usr/local/perl5.6 и последнюю версию в каталог /usr/local/perl5.8. Каждый пользователь сможет выбрать, какую версию Perl использовать, изменив переменную PATH.

  • Можно параллельно держать на компьютере несколько версий, но определить версию по умолчанию при помощи символической ссылки. Нужно только создать символическую ссылку на версию программного продукта, которая должна использоваться по умолчанию.

    Например, предположим, что есть две версии Perl, упоминавшиеся выше. Если нужно чтобы по умолчанию использовалась версия Perl 5.8, надо создать символическую ссылку на каталог /usr/local/perl5.8 и назвать ее perl:

    $ ls -1 /usr/local/perl*
    perl5.6
    perl5.8
    
    $ sudo ln -s /usr/local/perl5.8 \
      /usr/local/perl
    
    $ ls -1 -F /usr/local/perl*
    perl5.6/
    perl5.8/
    perl@

    Тогда пользователь сможет добавить путь /usr/local/perl/bin к переменной PATH для запуска команды perl. И если потребуется переключиться на более новую или старую версию Perl, то достаточно будет просто удалить символическую ссылку и создать ее заново, но уже указывающую на другой каталог.

    Символические ссылки оказываются незаменимыми для решения подобных задач обслуживания, например, поддержки нескольких версий, перенаправления путей и построения коллекций для удобного доступа. Например, можно добавить в традиционный каталог /usr/local/bin ссылки на команды из других программных продуктов, например, ln -s /usr/local/perl/bin/perl /usr/local/bin/perl. Можно создать символическую ссылку на основе другой символической ссылки.

Ресурсы

Научиться

Получить продукты и технологии

  • IBM trial software: ознакомительные версии программного обеспечения для разработчиков, которые можно загрузить прямо со страницы сообщества developerWorks.(EN)

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=296051
ArticleTitle=Использование UNIX: Часть 11. Устройство файловой системы UNIX
publish-date=03212008