Часть 2 из 8
Назначение каталогов и стандарт FHS
В этой части рассмотрим, по какому принципу файлы распределяются по каталогам, какие каталоги описаны стандартом FHS и что хранится в каталоге настроек /etc.
2.1 Стандарт FHS
Расположение файлов в Linux не случайно. Оно описано стандартом FHS (Filesystem Hierarchy Standard), который поддерживает Linux Foundation. Стандарт определяет, для каких данных предназначен каждый основной каталог. Благодаря ему администратор знает, где искать настройки, журналы или исполняемые файлы любой установленной программы.
Основной принцип FHS: файлы распределяются не по программам, а по типу данных. У одной программы исполняемый файл, настройки и журналы окажутся в разных каталогах. Такое разделение позволяет обновлять программы, не затрагивая настройки, и делать резервные копии только тех данных, которые меняются.
Для сравнения: в квартире вещи раскладывают не по тому, кто их купил, а по назначению — продукты на кухне, одежда в шкафу, инструменты в кладовке. Поэтому даже в чужой квартире понятно, где искать чашку. Так же и в Linux: настройки любой программы администратор ищет в /etc, а её журналы — в /var/log.
| Каталог | Назначение |
|---|---|
/etc | настройки системы и программ |
/usr | программы, библиотеки, документация |
/var | данные, которые изменяются во время работы: журналы, очереди, базы |
/home | домашние каталоги пользователей |
/tmp | временные файлы |
/boot | файлы загрузки системы |
/dev | файлы устройств |
/proc, /sys | сведения о процессах и устройствах, которые предоставляет ядро |
/mnt, /media | точки подключения дисков и съёмных носителей |
/opt | сторонние программы, устанавливаемые целиком в один каталог |
/srv | данные, которые отдают сетевые службы |
ls -d /boot /etc /home /opt /srv /usr /var /mnt /media# вывести сами каталогичто делает
Что делает команда. Проверяет, что основные каталоги стандарта FHS существуют: печатает их имена, не заходя внутрь.
По частям:
ls- вывести содержимое каталога
-d- показать сам каталог, а не его содержимое
/boot- что показать (абсолютный путь)
/etc- что показать (абсолютный путь)
/home- что показать (абсолютный путь)
/opt- что показать (абсолютный путь)
/srv- что показать (абсолютный путь)
/usr- что показать (абсолютный путь)
/var- что показать (абсолютный путь)
/mnt- что показать (абсолютный путь)
/media- что показать (абсолютный путь)
ls -ld /root# каталог /rootчто делает
Что делает команда. Показывает сведения о самом каталоге /root: права, владельца и дату, но не его содержимое.
По частям:
ls- вывести содержимое каталога
-l- подробный список: права, владелец, размер, дата
-d- показать сам каталог, а не его содержимое
/root- что показать (абсолютный путь)
ls -la /opt /srv# содержимое /opt и /srvчто делает
Что делает команда. Показывает полное содержимое каталогов /opt и /srv, чтобы убедиться, что они пусты.
По частям:
ls- вывести содержимое каталога
-l- подробный список: права, владелец, размер, дата
-a- показать и скрытые файлы, имена которых начинаются с точки
/opt- что показать (абсолютный путь)
/srv- что показать (абсолютный путь)
- 1все каталоги на месте
- 2в /opt и /srv нет файлов
Весь снимок ↗Каталоги из стандарта присутствуют в Ubuntu. Пустые /opt и /srv означают, что в них ещё ничего не устанавливали.
Что показывает снимок. Все каталоги из стандарта FHS есть в системе; /opt и /srv пока пусты.
Где это пригодится. Стандарт один для большинства дистрибутивов Linux. Зная его, в Ubuntu, Debian или Fedora вы будете искать настройки, программы и журналы в одних и тех же каталогах.
Назначение каталогов можно проверить прямо в системе, без интернета. В Linux есть встроенная справка — команда man (от английского manual, «руководство»). Для каждой команды и многих понятий в ней есть отдельная страница. Страница hier (от hierarchy, «иерархия») описывает те же каталоги, что и таблица выше: слева указан каталог, справа — его назначение.
Справка написана на английском языке. Перелистывать её можно стрелками, выйти — клавишей q.
man hier# открыть страницу справки hierчто делает
Что делает команда. Открывает встроенную справку с описанием каталогов Linux. Выход — клавиша q.
По частям:
man- открыть страницу встроенной справки
hier- название страницы: описание иерархии каталогов
- 1hier — описание иерархии файловой системы
- 2/ — корневой каталог, с него начинается всё дерево
- 3/bin — программы, нужные для запуска и восстановления системы
- 4/boot — файлы загрузчика, в том числе ядро
- 5/dev — файлы устройств
- 6/etc — настройки, относящиеся к этому компьютеру
Весь снимок ↗Начало страницы справки hier с переводом первых описаний.
Что показывает снимок. Встроенная справка описывает назначение каталогов прямо в системе, без доступа к интернету.
Где это пригодится. Команда man работает и для команд: man ls, man find. Это первый источник, когда нужно вспомнить ключ команды или назначение файла.
2.2 Каталог настроек /etc
В /etc находятся конфигурационные файлы — текстовые файлы, в которых задаются параметры системы и служб. Программы читают их при запуске. Исполняемых файлов в /etc нет. Когда пакет обновляется, менеджер пакетов заменяет файлы программы, но не перезаписывает изменённые администратором настройки.
Пример. Чтобы изменить имя компьютера, администратор правит одну строку в файле /etc/hostname. Чтобы настроить службу, он открывает файл в её подкаталоге внутри /etc. Переустанавливать программу для этого не нужно.
Для примера рассмотрим три файла. /etc/os-release содержит название и версию дистрибутива, /etc/hostname — имя компьютера, /etc/hosts — таблицу соответствия имён и IP-адресов, которую система использует до обращения к DNS.
Конфигурационные файлы обычно устроены просто. Каждая строка задаёт один параметр в виде параметр=значение, а строки, которые начинаются с #, — комментарии: программа их пропускает. Например, в /etc/os-release строка NAME="Ubuntu" означает, что параметр NAME имеет значение Ubuntu. У некоторых программ формат другой, но принцип тот же: это текст, который можно открыть и изменить в любом редакторе.
cat /etc/os-releaseчто делает
Что делает команда. Выводит на экран файл со сведениями о дистрибутиве: название, версию, идентификатор.
По частям:
cat- вывести содержимое файла на экран
/etc/os-release- какой файл вывести (абсолютный путь)
cat /etc/hostnameчто делает
Что делает команда. Выводит имя компьютера, записанное в /etc/hostname.
По частям:
cat- вывести содержимое файла на экран
/etc/hostname- какой файл вывести (абсолютный путь)
cat /etc/hostsчто делает
Что делает команда. Выводит локальную таблицу соответствия имён и IP-адресов.
По частям:
cat- вывести содержимое файла на экран
/etc/hosts- какой файл вывести (абсолютный путь)
- 1название и версия дистрибутива
- 2идентификатор для скриптов
- 3имя компьютера
- 4адрес 127.0.0.1 обозначает сам компьютер
Весь снимок ↗Три конфигурационных файла из /etc.
Что показывает снимок. Файлы в /etc — обычные текстовые файлы: сведения о версии системы, имя компьютера и таблица адресов.
Где это пригодится. Версию системы проверяют перед установкой программ и указывают в сообщениях об ошибках. Файл /etc/hosts правят, чтобы сервер в локальной сети открывался по имени.
2.3 Учётные записи пользователей
Сведения о пользователях тоже относятся к настройкам системы, поэтому хранятся в /etc — в файле /etc/passwd. Каждая строка этого файла описывает одну учётную запись. Строка состоит из семи полей, разделённых двоеточием. Сами пароли в этом файле не хранятся: они записаны в зашифрованном виде в отдельном файле /etc/shadow, прочитать который может только администратор.
Выполним три команды. Первая выводит строку учётной записи текущего пользователя. Команда id -un печатает имя пользователя, а конструкция $( ) подставляет результат одной команды внутрь другой. Команда getent passwd ищет в базе учётных записей строку с этим именем.
Вторая и третья команды показывают, что лежит в самом каталоге /etc. Команда find ищет объекты в указанном каталоге. Ключ -maxdepth 1 ограничивает поиск только каталогом /etc, без вложенных каталогов. Ключ -type f отбирает обычные файлы, -type d — каталоги. Ключ -mindepth 1 убирает из результата сам /etc. Знак | передаёт вывод команде head -8, которая оставляет первые восемь строк, иначе список занял бы несколько экранов.
getent passwd "$(id -un)"# строка учётной записи текущего пользователячто делает
Что делает команда. Выводит строку учётной записи текущего пользователя из базы учётных записей.
По частям:
getent- получить запись из системной базы данных
passwd- база учётных записей пользователей
"$(id -un)"- имя текущего пользователя: $( ) подставляет результат команды id -un
find /etc -maxdepth 1 -type f | head -8# первые восемь файлов в /etcчто делает
Что делает команда. Находит обычные файлы прямо в /etc и показывает первые восемь из них.
По частям:
find- найти файлы и каталоги
/etc- где искать (абсолютный путь)
-maxdepth 1- искать только в самом каталоге, без вложенных
-type f- отбирать только обычные файлы
|- передать вывод левой команды на вход следующей
head- оставить только первые строки
-8- сколько первых строк оставить: 8
find /etc -mindepth 1 -maxdepth 1 -type d | head -8# первые восемь подкаталогов /etcчто делает
Что делает команда. Находит подкаталоги прямо в /etc (без самого /etc) и показывает первые восемь.
По частям:
find- найти файлы и каталоги
/etc- где искать (абсолютный путь)
-mindepth 1- не выводить сам начальный каталог
-maxdepth 1- искать только в самом каталоге, без вложенных
-type d- отбирать только каталоги
|- передать вывод левой команды на вход следующей
head- оставить только первые строки
-8- сколько первых строк оставить: 8
Разберём строку учётной записи по полям.
- 1имя пользователя, с которым выполняется вход
- 2
xозначает, что пароль хранится в /etc/shadow - 3UID — номер пользователя; по номеру, а не по имени, система проверяет права доступа. У root UID равен 0
- 4GID — номер основной группы пользователя
- 5описание: полное имя или комментарий
- 6домашний каталог
- 7оболочка, которая запускается при входе в систему
Весь снимок ↗Строка учётной записи пользователя ubuntu.
Что показывает снимок. Строка из базы учётных записей: семь полей пользователя ubuntu, разделённых двоеточием.
Где это пригодится. По этой строке администратор узнаёт домашний каталог и оболочку пользователя. Номер UID важен при настройке прав доступа: владельца файла система определяет именно по номеру.
В выводе find видно, что в /etc лежат и отдельные файлы, и подкаталоги. Небольшие программы хранят настройки в одном файле прямо в /etc. У крупных программ и служб настроек много, поэтому для них создаётся собственный подкаталог.
- 1скрытый служебный файл: блокирует одновременное изменение учётных записей
- 2adduser.conf — настройки команды adduser, которая создаёт пользователей
- 3bash.bashrc — общие настройки оболочки Bash для всех пользователей
- 4NetworkManager — каталог настроек службы управления сетью
- 5X11 — каталог настроек графической подсистемы
Весь снимок ↗Файлы и подкаталоги в /etc.
Что показывает снимок. В /etc лежат и отдельные файлы настроек, и подкаталоги крупных программ.
Где это пригодится. Когда нужно изменить настройки программы, сначала ищут файл или подкаталог с её названием в /etc.
2.4 Пример: файлы службы печати CUPS
Посмотрим, как правила FHS выполняются для настоящей программы. Возьмём CUPS — службу печати, которая по умолчанию установлена в Ubuntu. Когда в любой программе вы нажимаете «Печать», документ отправляется в CUPS. Служба ставит задание в очередь, передаёт его принтеру и записывает результат в журнал. Принтер для этого примера не нужен: нас интересует только, где лежат файлы службы.
CUPS удобна как пример, потому что у неё есть всё, что бывает у типичной службы: программа, настройки, журналы, очередь заданий и кэш. Программы в Ubuntu устанавливаются пакетами, и менеджер пакетов dpkg хранит список файлов каждого пакета. Команда dpkg -S показывает, какому пакету принадлежит файл, а dpkg -L выводит все файлы пакета. Из длинного списка отобраны основные строки.
cd ~что делает
Что делает команда. Возвращает в домашний каталог пользователя, у ubuntu это /home/ubuntu.
По частям:
cd- сменить текущий каталог
~- куда перейти (домашний каталог)
dpkg -S /usr/sbin/cupsd# пакет, которому принадлежит программа cupsdчто делает
Что делает команда. Определяет, из какого установленного пакета появился файл /usr/sbin/cupsd.
По частям:
dpkg- менеджер пакетов Ubuntu: сведения об установленных пакетах
-S- найти, какому пакету принадлежит файл
/usr/sbin/cupsd- что искать (абсолютный путь)
dpkg -L cups-daemon | grep --color=never -xE '/(etc/cups|usr/sbin/cupsd|var/(log|spool|cache)/cups|lib/systemd/system/cups.service)'# основные файлы пакетачто делает
Что делает команда. Берёт полный список файлов пакета cups-daemon и оставляет из него только шесть основных путей.
По частям:
dpkg- менеджер пакетов Ubuntu: сведения об установленных пакетах
-L- вывести список файлов пакета
cups-daemon- название пакета службы печати
|- передать вывод левой команды на вход следующей
grep- отобрать строки, подходящие под образец
--color=never- не подсвечивать совпадения цветом
-x- строка должна совпадать с образцом целиком
-E- образец записан расширенным регулярным выражением
'/(etc/cups|usr/sbin/cupsd|var/(log|spool|cache)/cups|lib/systemd/system/cups.service)'- образец: шесть путей, разделённых знаком | («или»)
ls -ld /run/cups# каталог работающей службычто делает
Что делает команда. Показывает сведения о каталоге /run/cups, который служба печати создаёт при запуске.
По частям:
ls- вывести содержимое каталога
-l- подробный список: права, владелец, размер, дата
-d- показать сам каталог, а не его содержимое
/run/cups- что показать (абсолютный путь)
systemctl is-active cups# состояние службычто делает
Что делает команда. Проверяет, запущена ли служба печати CUPS; ответ active означает, что работает.
По частям:
systemctl- управлять службами и узнавать их состояние
is-active- действие: проверить, работает ли служба
cups- имя службы печати CUPS
- 1настройки печати
- 2программа и описание службы
- 3кэш, журналы и очередь заданий печати
Весь снимок ↗Файлы одного пакета распределены по назначению.
Что показывает снимок. Файлы одного пакета cups-daemon разложены по каталогам /etc, /usr и /var, а сама служба работает.
Где это пригодится. Команды dpkg -S и dpkg -L помогают найти, где лежат настройки или журналы установленной программы, и выяснить, из какого пакета появился незнакомый файл.
Итак, файлы одной службы лежат в четырёх ветках дерева: программа — в /usr, настройки — в /etc, журналы, очередь и кэш — в /var, файлы работающей службы — в /run. К CUPS мы вернёмся в части 4, когда будем разбирать, сколько хранятся эти данные.
Итоги части 2
- Стандарт FHS определяет назначение основных каталогов Linux.
- Файлы распределяются по типу данных: настройки —
/etc, программы —/usr, изменяемые данные —/var. - Конфигурационные файлы — текстовые, программы читают их при запуске.
- Учётные записи описаны в
/etc/passwd, пароли хранятся в/etc/shadow.
В отчётСнимок с cat /etc/os-release и строкой своей учётной записи.