Глава из книги Сага о FreeBSD
Алексей Федорчук
2008-10-29
Предположим, однако, что тем или иным способом загрузка ядра и всего сопутствующего ему хозяйства успешно завершена. И тут в дело вступает главный калибр любой POSIX-системы — процесс init. Это первый (в прямом и переносном смысле — в BSD-системах его идентификатор равен единице) пользовательский (то есть работающий в пользовательском пространстве ядра, юзерланде), процесс, и запускается он исполнением одноименного файла /sbin/init.
В действительности это могут быть (и в разных системах действительно бывают) весьма разные программы. Более того, его можно подменить при интерактивном управлении процессом загрузки другой программой, например, командной оболочкой. Однако это сейчас не очень важно — рассмотрим только штатные задачи программы /sbin/init.
Первой из таких задач, как по времени исполнения, так и по значению, является проверка целостности наличных файловых систем. Для чего каждая из них проверяется на наличие бита "чистого размонтирования" (clean byte), который автоматически устанавливается в ходе правильного завершения предыдущего сеанса работы. Если такой бит обнаруживается на каждой файловой системе — все хорошо, дело движется дальше. Если нет — возможны варианты, о которых речь пойдет позднее.
Следует отметить, что сам по себе "бит чистого размонтирования" отнюдь не гарантирует сохранности файловой системы и, особенно, ее данных. Он лишь показывает, что файловая система была корректно размонтирована в предыдущем сеансе. В этом случае процесс init делает не лишенное резона допущение, что с метаданными и данными ее все в порядке, и переходит к выполнению следующей задачи.
А следующая задача процесса init — это вызов и отработка сценариев инициализации, или стартовых скриптов, собранных в каталоге /etc и (или) его подкаталогах. Это обычные сценарии оболочки, рассчитанные на исполнение стандартным POSIX-шеллом (/bin/sh) и включают в себя последовательности команд, призванные монтировать файловые системы, активизировать область своппинга, устанавливать системные часы, запускать те или иные службы и демоны.
Команды, образующие стартовые сценарии, получают свои опции, их значения и аргументы из специальных файлов конфигурации, также имеющих своим местопребыванием /etc и его подкаталоги. Конфигурационные файлы (или по простому конфиги) представляют собой либо простые базы данных опций и аргументов команд, либо списки имен переменных, (соответствующих опциям команд, используемых в скриптах) с присвоенными им значениями. Конфиги от скриптов легко отличимы при просмотре каталога /etc отсутствием у первых бита исполнения.
Наконец, третья непременная задача процесса init — так называемое получение терминала (запуск процесса getty), установку его свойств и подготовку к авторизации — вытеснение его процессом login. Выполнение этой процедуры также определяется параметрами из соответствующего конфигурационного файла.
Последовательное разделение стартовых сценариев и их конфигурационных файлов — один из краеугольных принципов общесистемного конфигурирования FreeBSD. В сущности, пользователю при нормальном ходе настройки практически нет необходимости ни знакомиться с содержимым скриптов (хотя это и не вредно), ни, тем паче, менять в них что-либо (последнее допустимо только в том случае, если этот самый пользователь точно знает, что делает, иначе систему легко довести до неработоспособного состояния). А вот вносить изменения в значения параметров конфигурационных файлов — не только можно, но и нужно. Хотя, разумеется, такое разрешение не избавляет пользователя от понимания смысла своих действий.
Понимание это, однако, затрудняется тем, что и сценарии инициализации, и их конфигурационные файлы реализованы в разных ОС и их дистрибутивах очень по-разному. Впрочем, это многообразие можно свести к двум стилям — BSD, все вариации на тему которого очень похожи друг на друга, и System V, каждый представитель которого оригинален по своему. Первый стиль инициации используется в операционках одноименного семейства. Стиль же System V преобладает в большинстве распространенных дистрибутивов Linux. Хотя последнее время и во многих из них (CRUX, Archlinux, Gentoo) все шире применяются BSD-подобные схемы инициации.