8. Новые конфигурационные файлы

Одно из ключевых достоинств systemd — наличие полного набора программ, необходимых на ранних стадиях загрузки, причем эти программы написаны на простом, быстром, надежном и легко поддающемся распараллеливанию языке C. Теперь можно отказаться от «простыней» shell-скриптов, разработанных для этих задач различными дистрибутивами. Наш «Проект нулевой оболочки» увенчался полным успехом. Уже сейчас возможности предоставляемого нами инструментария покрывают практически все нужды настольных и встраиваемых систем, а также б´ольшую часть потребностей серверов:

* Проверка и монтирование всех файловых систем.
* Обновление и активация квот на всех файловых системах.
* Установка имени хоста.
* Настройка сетевого интерфейса обратной петли (lo).
* Подгрузка правил SELinux, обновление меток безопасности в динамических каталогах /run и /dev.
* Регистрация в ядре дополнительных бинарных форматов (например, Java, Mono, WINE) через API-файловую систему binfmt_misc.
* Установка системной локали.
* Настройка шрифта и раскладки клавиатуры в консоли.
* Создание, очистка, удаление временных файлов и каталогов.
* Применение предписанных в /etc/fstab опций к смонтированным ранее API-файловым системам.
* Применение настроек sysctl.
* Поддержка технологии упреждающего чтения (read ahead), включая автоматический сбор информации.
* Обновление записей в utmp при включении и выключении системы.
* Сохранение и восстановление затравки для генерации случайных чисел (random seed).
* Принудительная загрузка указанных модулей ядра.
* Поддержка шифрованных дисков и разделов.
* Автоматический запуск getty на serial-консолях.
* Взаимодействие с Plymouth.
* Создание уникального идентификатора системы.
* Настройка часового пояса.

В стандартной установке Fedora 15 запуск shell-скриптов требуется только для некоторых устаревших служб, а также для подсистемы хранения данных (поддержка LVM, RAID и multipath). Если они вам не нужны, вы легко можете отключить их, и наслаждаться загрузкой, полностью очищенной от shell-костылей (лично я это сделал уже давно). Такая загрузка является уникальной возможностью Linux-систем. Большинство перечисленных выше компонентов настраиваются через конфигурационные файлы в каталоге /etc. Некоторые из этих файлов стандартизированы для всех дистрибутивов, и поэтому реализация их поддержки в наших инструментах не представляла особого труда. Например, это относится к файлам /etc/fstab, /etc/crypttab, /etc/sysctl.conf. Однако множество других, нестандартно расположенных файлов и каталогов вынуждали нас добавлять в код огромное количество операторов #ifdef, чтобы обеспечить поддержку различных вариантов расположения конфигураций в разных дистрибутивах. Такое положение дел сильно усложняет жизнь нам всем, и при этом ничем не оправдано — все эти файлы решают одни и те же задачи, просто немного по-разному. Чтобы улучшить ситуацию и установить единый стандарт расположения базовых конфигурационных файлов во всех дистрибутивах, мы заставили systemd пользоваться дистрибутивно-специфическими конфигурациями только в качестве резервного варианта — основным источником информации становится определенный нами стандартный набор конфигурационных файлов. Разумеется, там, где это возможно, мы старались не придумывать чего-то принципиально нового, а брали лучшее из решений, предложенных существующими дистрибутивами. Ниже приводится небольшой обзор этого нового набора конфигурационных файлов, поддерживаемых systemd во всех дистрибутивах:

* /etc/hostname: имя хоста для данной системы. Одна из наиболее простых и важных системных настроек. В разных дистрибутивах оно настраивалось по-разному: Fedora использовала /etc/sysconfig/network, OpenSUSE — /etc/HOSTNAME, Debian — /etc/hostname. Мы остановились на варианте, предложенном Debian.
* /etc/vconsole.conf: конфигурация раскладки клавиатуры и шрифта для консоли.
* /etc/locale.conf: конфигурация общесистемной локали.
* /etc/modules-load.d/*.conf: каталог для перечисления модулей ядра, которые нужно принудительно подгрузить при загрузке (впрочем, необходимость в этом возникает достаточно редко).

Прим. перев.: Для описания этого и трех последующих каталогов автор пользуется термином «dropin directory». Данный термин означает каталог, в который можно поместить множество независимых файлов настроек, и при чтении конфигурации все эти файлы будут обработаны (впрочем, часто накладывается ограничение — обрабатываются только файлы с именами, соответствующими маске, обычно *.conf). Такой подход позволяет значительно упростить процесс как ручного, так и автоматического конфигурирования различных компонентов — для внесения изменений в настройки уже не нужно редактировать основной конфигурационный файл, достаточно лишь скопировать/переместить в нужный каталог небольшой файл с указанием специфичных параметров.

* /etc/sysctl.d/*.conf: каталог для задания параметров ядра (sysctl). Дополняет классический конфигурационный файл /etc/sysctl.conf.
* /etc/tmpfiles.d/*.conf: каталог для управления настройками временных файлов (systemd обеспечивает создание, очистку и удаление временных файлов и каталогов, как во время загрузки, так и во время работы системы).
* /etc/binfmt.d/*.conf: каталог для регистрации дополнительных бинарных форматов (например, форматов Java, Mono, WINE).
* /etc/os-release: стандарт для файла, обеспечивающего идентификацию дистрибутива и его версии. Сейчас различные дистрибутивы используют для этого разные файлы (например, /etc/fedora-release в Fedora), и поэтому для решения такой простой задачи, как вывод имени дистрибутива, необходимо использовать базу данных, содержащую перечень возможных названий файлов. Проект LSB попытался создать такой инструмент — lsb_release — однако реализация столь простой функции через скрипт на Python’е является не самым оптимальным решением. Чтобы исправить сложившуюся ситуацию, мы решили перейти к единому простому формату представления этой информации.
* /etc/machine-id: файл с идентификатором данного компьютера (перекрывает аналогичный идентификатор D-Bus). Гарантируется, что в любой системе, использующей systemd, этот файл будет существовать и содержать корректную информацию (если его нет, он автоматически создается при загрузке). Мы вынесли этот файл из-под эгиды D-Bus, чтобы упростить решение множества задач, требующих наличия уникального и постоянного идентификатора компьютера.
* /etc/machine-info: новый конфигурационный файл, хранящий информации о полном (описательном) имени хоста (например, «Компьютер Леннарта») и значке, которым он будет обозначаться в графических оболочках, работающих с сетью (раньше этот значок мог определяться, например, файлом /etc/favicon.png). Данный конфигурационный файл обслуживается демоном systemd-hostnamed.

Одна из важнейших для нас задач — убедить вас использовать эти новые конфигурационные файлы в ваших инструментах для настройки системы. Если ваши конфигурационные фронтенды будут использовать новые файлы, а не их старые аналоги, это значительно облегчит портирование таких фронтендов между дистрибутивами, и вы внесете свой вклад в стандартизацию Linux. В конечном счете это упростит жизнь и администраторам, и пользователям. Разумеется, на текущий момент эти файлы полностью поддерживаются только дистрибутивами, основанными на systemd, но уже сейчас в их число входят практически все ключевые дистрибутивы, за исключением одного.
(Прим. перев.: В конце 2010 года энтузиаст Andrew Edmunds добавил в systemd базовую поддержку Ubuntu и подготовил соответствующие пакеты, однако его инициатива не встретила поддержки среди менеджеров Canonical. На момент написания этих строк проект остается заброшенным с декабря 2010 г.)
В этом есть что-то от «проблемы курицы и яйца»: стандарт становится настоящим стандартом только тогда, когда ему начинают следовать. В будущем мы намерены аккуратно форсировать процесс перехода на новые конфигурационные файлы: поддержка старых файлов будет удалена из systemd. Разумеется, процесс будет идти медленно, шаг за шагом. Но конечной его целью является переход всех дистрибутивов на единый набор базовых конфигурационных файлов. Многие из этих файлов используются не только программами для настройки системы, но и апстримными проектами. Например, мы предлагаем проектам Mono, Java, WINE и другим помещать конфигурацию для регистрации своих бинарных форматов в /etc/binfmt.d/ средствами их собственной сборочной системы. Специфичные для дистрибутивов механизмы поддержки бинарных форматов больше не нужны, и ваш проект будет работать одинаково хорошо во всех дистрибутивах. Аналогичное предложение мы обращаем и ко всем разработчикам программ, которым требуется автоматическое создание/очистка временных файлов и каталогов, например, в каталоге /run (ранее известном как /var/run). Таким проектам достаточно просто поместить соответствующий конфигурационный файл в /etc/tmpfiles.d/, тоже средствами собственной сборочной системы. Помимо прочего, подобный подход позволит увеличить скорость загрузки, так как, в отличие от SysV, не требует множества shell-скриптов, выполняющих тривиальные задачи (регистрация бинарных форматов, удаление/создание временных файлов/каталогов и т.п.). И пример того случая, когда апстримная поддержка стандартной конфигурации дала бы огромные преимущества — X11 (и его аналоги) могли бы устанавливать раскладку клавиатуры на основании данных из /etc/vconsole.conf.
Разумеется, я понимаю, что отнюдь не всех полностью устроят выбранные нами имена и форматы конфигурационных файлов. Но нам все же нужно было что-то выбрать, и мы выбрали то, что должно устроить большинство людей. Форматы конфигурационных файлов максимально просты, и их можно легко читать и записывать даже из shell-скриптов. Да, /etc/bikeshed.conf могло бы быть неплохим именем для файла конфигурации!

Помогите нам стандартизировать Linux! Используйте новые конфигурационные файлы! Поддерживайте их в апстриме, поддерживайте их во всех дистрибутивах!

И если у вас возникнет такой вопрос: да, все эти файлы так или иначе обсуждались с разными разработчиками из различных дистрибутивов. И некоторые из разработчиков планируют обеспечить поддержку новой конфигурации даже в системах без systemd.

Содержание
Вперед - О судьбе /etc/sysconfig и /etc/default
Назад - Поиск виновных