ОП.05Файловая система Linuxзанятие 3Материалы

Часть 2 из 8

Назначение каталогов и стандарт FHS

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

  1. 2.1 Стандарт FHS
  2. 2.2 Каталог настроек /etc
  3. 2.3 Учётные записи пользователей
  4. 2.4 Пример: файлы службы печати CUPS

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данные, которые отдают сетевые службы
В терминалеОсновные каталоги в системе
  1. ls -d /boot /etc /home /opt /srv /usr /var /mnt /media# вывести сами каталоги
    что делает

    Что делает команда. Проверяет, что основные каталоги стандарта FHS существуют: печатает их имена, не заходя внутрь.

    По частям:

    ls
    вывести содержимое каталога
    -d
    показать сам каталог, а не его содержимое
    /boot
    что показать (абсолютный путь)
    /etc
    что показать (абсолютный путь)
    /home
    что показать (абсолютный путь)
    /opt
    что показать (абсолютный путь)
    /srv
    что показать (абсолютный путь)
    /usr
    что показать (абсолютный путь)
    /var
    что показать (абсолютный путь)
    /mnt
    что показать (абсолютный путь)
    /media
    что показать (абсолютный путь)
  2. ls -ld /root# каталог /root
    что делает

    Что делает команда. Показывает сведения о самом каталоге /root: права, владельца и дату, но не его содержимое.

    По частям:

    ls
    вывести содержимое каталога
    -l
    подробный список: права, владелец, размер, дата
    -d
    показать сам каталог, а не его содержимое
    /root
    что показать (абсолютный путь)
  3. ls -la /opt /srv# содержимое /opt и /srv
    что делает

    Что делает команда. Показывает полное содержимое каталогов /opt и /srv, чтобы убедиться, что они пусты.

    По частям:

    ls
    вывести содержимое каталога
    -l
    подробный список: права, владелец, размер, дата
    -a
    показать и скрытые файлы, имена которых начинаются с точки
    /opt
    что показать (абсолютный путь)
    /srv
    что показать (абсолютный путь)
Результат

все каталоги присутствуют; /opt и /srv пусты.

Снимок 2.1Ubuntu 24.04
  1. 1все каталоги на месте
  2. 2в /opt и /srv нет файлов
Каталоги из стандарта присутствуют в Ubuntu. Пустые /opt и /srv означают, что в них ещё ничего не устанавливали.Весь снимок ↗

Каталоги из стандарта присутствуют в Ubuntu. Пустые /opt и /srv означают, что в них ещё ничего не устанавливали.

Что показывает снимок. Все каталоги из стандарта FHS есть в системе; /opt и /srv пока пусты.

Где это пригодится. Стандарт один для большинства дистрибутивов Linux. Зная его, в Ubuntu, Debian или Fedora вы будете искать настройки, программы и журналы в одних и тех же каталогах.

Назначение каталогов можно проверить прямо в системе, без интернета. В Linux есть встроенная справка — команда man (от английского manual, «руководство»). Для каждой команды и многих понятий в ней есть отдельная страница. Страница hier (от hierarchy, «иерархия») описывает те же каталоги, что и таблица выше: слева указан каталог, справа — его назначение.

Справка написана на английском языке. Перелистывать её можно стрелками, выйти — клавишей q.

В терминалеСправка об иерархии каталогов
  1. man hier# открыть страницу справки hier
    что делает

    Что делает команда. Открывает встроенную справку с описанием каталогов Linux. Выход — клавиша q.

    По частям:

    man
    открыть страницу встроенной справки
    hier
    название страницы: описание иерархии каталогов
Результат

открывается страница hier(7) со списком каталогов и их назначением.

Снимок 2.2Ubuntu 24.04
  1. 1hier — описание иерархии файловой системы
  2. 2/ — корневой каталог, с него начинается всё дерево
  3. 3/bin — программы, нужные для запуска и восстановления системы
  4. 4/boot — файлы загрузчика, в том числе ядро
  5. 5/dev — файлы устройств
  6. 6/etc — настройки, относящиеся к этому компьютеру
Начало страницы справки hier с переводом первых описаний.Весь снимок ↗

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

В терминалеЧтение конфигурационных файлов
  1. cat /etc/os-release
    что делает

    Что делает команда. Выводит на экран файл со сведениями о дистрибутиве: название, версию, идентификатор.

    По частям:

    cat
    вывести содержимое файла на экран
    /etc/os-release
    какой файл вывести (абсолютный путь)
  2. cat /etc/hostname
    что делает

    Что делает команда. Выводит имя компьютера, записанное в /etc/hostname.

    По частям:

    cat
    вывести содержимое файла на экран
    /etc/hostname
    какой файл вывести (абсолютный путь)
  3. cat /etc/hosts
    что делает

    Что делает команда. Выводит локальную таблицу соответствия имён и IP-адресов.

    По частям:

    cat
    вывести содержимое файла на экран
    /etc/hosts
    какой файл вывести (абсолютный путь)
Результат

выводятся версия Ubuntu, имя компьютера и строка 127.0.0.1 localhost.

Снимок 2.3Ubuntu 24.04
  1. 1название и версия дистрибутива
  2. 2идентификатор для скриптов
  3. 3имя компьютера
  4. 4адрес 127.0.0.1 обозначает сам компьютер
Три конфигурационных файла из /etc.Весь снимок ↗

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

В терминалеУчётная запись и содержимое /etc
  1. getent passwd "$(id -un)"# строка учётной записи текущего пользователя
    что делает

    Что делает команда. Выводит строку учётной записи текущего пользователя из базы учётных записей.

    По частям:

    getent
    получить запись из системной базы данных
    passwd
    база учётных записей пользователей
    "$(id -un)"
    имя текущего пользователя: $( ) подставляет результат команды id -un
  2. find /etc -maxdepth 1 -type f | head -8# первые восемь файлов в /etc
    что делает

    Что делает команда. Находит обычные файлы прямо в /etc и показывает первые восемь из них.

    По частям:

    find
    найти файлы и каталоги
    /etc
    где искать (абсолютный путь)
    -maxdepth 1
    искать только в самом каталоге, без вложенных
    -type f
    отбирать только обычные файлы
    |
    передать вывод левой команды на вход следующей
    head
    оставить только первые строки
    -8
    сколько первых строк оставить: 8
  3. find /etc -mindepth 1 -maxdepth 1 -type d | head -8# первые восемь подкаталогов /etc
    что делает

    Что делает команда. Находит подкаталоги прямо в /etc (без самого /etc) и показывает первые восемь.

    По частям:

    find
    найти файлы и каталоги
    /etc
    где искать (абсолютный путь)
    -mindepth 1
    не выводить сам начальный каталог
    -maxdepth 1
    искать только в самом каталоге, без вложенных
    -type d
    отбирать только каталоги
    |
    передать вывод левой команды на вход следующей
    head
    оставить только первые строки
    -8
    сколько первых строк оставить: 8
Результат

первая команда выводит строку учётной записи, вторая — список файлов, третья — список каталогов.

Разберём строку учётной записи по полям.

Снимок 2.4Ubuntu 24.04
  1. 1имя пользователя, с которым выполняется вход
  2. 2x означает, что пароль хранится в /etc/shadow
  3. 3UID — номер пользователя; по номеру, а не по имени, система проверяет права доступа. У root UID равен 0
  4. 4GID — номер основной группы пользователя
  5. 5описание: полное имя или комментарий
  6. 6домашний каталог
  7. 7оболочка, которая запускается при входе в систему
Строка учётной записи пользователя ubuntu.Весь снимок ↗

Строка учётной записи пользователя ubuntu.

Что показывает снимок. Строка из базы учётных записей: семь полей пользователя ubuntu, разделённых двоеточием.

Где это пригодится. По этой строке администратор узнаёт домашний каталог и оболочку пользователя. Номер UID важен при настройке прав доступа: владельца файла система определяет именно по номеру.

В выводе find видно, что в /etc лежат и отдельные файлы, и подкаталоги. Небольшие программы хранят настройки в одном файле прямо в /etc. У крупных программ и служб настроек много, поэтому для них создаётся собственный подкаталог.

Снимок 2.5Ubuntu 24.04
  1. 1скрытый служебный файл: блокирует одновременное изменение учётных записей
  2. 2adduser.conf — настройки команды adduser, которая создаёт пользователей
  3. 3bash.bashrc — общие настройки оболочки Bash для всех пользователей
  4. 4NetworkManager — каталог настроек службы управления сетью
  5. 5X11 — каталог настроек графической подсистемы
Файлы и подкаталоги в /etc.Весь снимок ↗

Файлы и подкаталоги в /etc.

Что показывает снимок. В /etc лежат и отдельные файлы настроек, и подкаталоги крупных программ.

Где это пригодится. Когда нужно изменить настройки программы, сначала ищут файл или подкаталог с её названием в /etc.

2.4 Пример: файлы службы печати CUPS

Посмотрим, как правила FHS выполняются для настоящей программы. Возьмём CUPS — службу печати, которая по умолчанию установлена в Ubuntu. Когда в любой программе вы нажимаете «Печать», документ отправляется в CUPS. Служба ставит задание в очередь, передаёт его принтеру и записывает результат в журнал. Принтер для этого примера не нужен: нас интересует только, где лежат файлы службы.

CUPS удобна как пример, потому что у неё есть всё, что бывает у типичной службы: программа, настройки, журналы, очередь заданий и кэш. Программы в Ubuntu устанавливаются пакетами, и менеджер пакетов dpkg хранит список файлов каждого пакета. Команда dpkg -S показывает, какому пакету принадлежит файл, а dpkg -L выводит все файлы пакета. Из длинного списка отобраны основные строки.

В терминалеФайлы пакета cups-daemon
  1. cd ~
    что делает

    Что делает команда. Возвращает в домашний каталог пользователя, у ubuntu это /home/ubuntu.

    По частям:

    cd
    сменить текущий каталог
    ~
    куда перейти (домашний каталог)
  2. dpkg -S /usr/sbin/cupsd# пакет, которому принадлежит программа cupsd
    что делает

    Что делает команда. Определяет, из какого установленного пакета появился файл /usr/sbin/cupsd.

    По частям:

    dpkg
    менеджер пакетов Ubuntu: сведения об установленных пакетах
    -S
    найти, какому пакету принадлежит файл
    /usr/sbin/cupsd
    что искать (абсолютный путь)
  3. 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)'
    образец: шесть путей, разделённых знаком | («или»)
  4. ls -ld /run/cups# каталог работающей службы
    что делает

    Что делает команда. Показывает сведения о каталоге /run/cups, который служба печати создаёт при запуске.

    По частям:

    ls
    вывести содержимое каталога
    -l
    подробный список: права, владелец, размер, дата
    -d
    показать сам каталог, а не его содержимое
    /run/cups
    что показать (абсолютный путь)
  5. systemctl is-active cups# состояние службы
    что делает

    Что делает команда. Проверяет, запущена ли служба печати CUPS; ответ active означает, что работает.

    По частям:

    systemctl
    управлять службами и узнавать их состояние
    is-active
    действие: проверить, работает ли служба
    cups
    имя службы печати CUPS
Результат

файлы находятся в /etc, /usr (через /lib) и /var.

Снимок 2.6Ubuntu 24.04
  1. 1настройки печати
  2. 2программа и описание службы
  3. 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 и строкой своей учётной записи.

Открыть в отдельной вкладке ↗