Системы инициализации Linux
Системы инициализации (набор скриптов, которые выполняются при загрузке системы): init, systemd.
Система инициализации System V inittab, используется в OC: ASPLinux.
Система инициализации Upstart ранее использовалась в OC Ubuntu, Fedora.
Система инициализации systemd (system daemon) используется в современных дистрибутивах начиная с 2010 года.
Системы инициализации Linux: System V, BSD, systemd, Upstart.
Система инициализации Linux — это набор скриптов, выполняющихся при старте системы. Скрипты написаны на языке shell-script классического Boure Shell (Оболочка sh Bourne shell). Исторически сложилось так, что существует две системы инициализации:
Они отличаются друг от друга организацией стартовых скриптов: как они называются, в каких директориях располагаются, последовательность вызова и т.д.
Последовательность действий при старте компьютера:
BIOS -> загрузчик -> ядро -> init
При запуске PC совместимого компьютера происходит следующая последовательность действий:
выполняется BIOS компьютера;
запускается загрузчик операционной системы – LILO, Введение Grub2 или любой другой;
загружается ядро Linux.
Ядро стартует и кроме основных действий подключает корневую файловую систему в режиме только для чтения, а так же запускает самую первую программу в системе — init. То есть, в результате мы имеем:
подключённую в режиме только для чтения корневую файловую систему;
работающую программу init
Дальнейшие действия, которые будут выполняться при старте системы, во многом зависят от конфигурации программы init.
До этого момента ещё не важно какая система инициализации используется. Не зависимо от неё во всех Linux сначала запускается init. А вот какая система инициализации будет использоваться в дальнейшем зависит от того как сконфигурирован init.
init (initialization)
Сценарии инициализации системы «SysV init scripts» (/etc/init.d) отвечает за запуск системы (сервисов) и выключение сервисов и самой ОС. Этот стандарт берет свое начало от операционной системы AT&T UNIX System V, выпущенной в в 1989 г.
init — самая первая запускаемая программа в ОС Linux (PID 1). Файл inittab является конфигурационным файлом программы init.
Ниже, список программ (скриптов), которые предоставляют интерфейс для управления запускаемыми службами.
update-rc.d — install and remove System-V style init script links
sysv-rc-conf — SysV init runlevel configuration tool for the terminal
rcconf — Debian Runlevel configuration tool
Уровни нинциализации:
/etc/rc0.d | уровень исполнения 0 | выполняет скрипт при выключении системы /etc/rc1.d | уровень исполнения 1 | однопользовательский режим (single user mode) аналогичен Safe Mode в Windows. /etc/rc2.d | уровень исполнения 2 | многопользовательский режим (multiuser mode) /etc/rc3.d | уровень исполнения 3 | зарезервированно /etc/rc4.d | уровень исполнения 4 | зарезервированно /etc/rc5.d | уровень исполнения 5 | зарезервированно /etc/rc6.d | уровень исполнения 6 | выполнение при при перезагрузке
При запуске компьютера независимо от того какой уровень выполнения текущий — запускаются в обязательном порядке все символические ссылки из каталога
Какая система инициализации используется в данный момент?
Насколько я понял upstart, программа, запускающая все остальные программы в системе, использует скрипты в /etc/init . В то время как её аналог systemd использует для запуска программ скрипты из /etc/init.d . Но у меня есть две этих папки /etc/init и /etc/init.d . В каждой из них есть скрипт запуска nginx. Они отличаются содержимым. Так вряд ли было бы, будь у них одинаковый функционал. Как определить, какая служба используется для управления процессами: Upstart, systemd, стандартный init?
Отслеживать
67.9k 216 216 золотых знаков 77 77 серебряных знаков 219 219 бронзовых знаков
задан 29 янв 2016 в 7:28
Mikhail Politaev Mikhail Politaev
630 4 4 серебряных знака 20 20 бронзовых знаков
А что за Linux у Вас?
29 янв 2016 в 7:39
init.d — это вообще для старого sysvinit и используется для обратной совместимости и в upstart, и в systemd
29 янв 2016 в 8:05
@MishaPolitaev просто init, что то очень нестандартное. Видел где то такой каталог, но к загрузке системы он отношения не имел. Так что init.d лучше смотрите. И еще в rc.d (rc.3 и т.п.), если они есть лежат ссылки на все, что запускается.
29 янв 2016 в 8:27
29 янв 2016 в 8:45
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
sysvinit и прочие пришедшие ему на замену системы инициализации unix-подобных операционных систем могут присутствовать в отдельно взятой установке одновременно.
какой первый процесс запустит программа, выполняющая функции ядра операционной системы, после собственной загрузки и инициализации, «того и тапки».
если эти функции исполняет программа linux, то по умолчанию она запускает программу/скрипт, находящийся в файле /sbin/init . данное поведение можно переопределить, передав параметр загрузки init=/путь/к/файлу . узнать, передан ли такой параметр, несложно:
$ grep -o 'init=\w*' /proc/cmdline
лишь по одному «внешнему виду» файла /sbin/init определить, какой именно из систем инициализации он принадлежит, затруднительно. разве что он является символической ссылкой на файл с более «выразительным» именем. например:
$ ls -l /sbin/init lrwxrwxrwx 1 root root 20 Aug 29 18:45 /sbin/init -> /lib/systemd/systemd
но если в данной установке используется пакетный менеджер, то, скорее всего, этот файл принадлежит какому-нибудь пакету. примеры запросов к пакетным менеджерам:
$ dpkg -S /sbin/init $ rpm -qf /sbin/init $ equery belongs /sbin/init $ pacman -Qo /sbin/init .
3 варианта инициализации операционной системы
Итак, у нас загрузилось ядро операционной системы. Далее отрабатывают системы инициализации операционной системы. Три варианта: SysV, systemd, Upstart.
Init в стиле SysV
Init в стиле SysV данная процедура инициализации, самая старая она более классический Unix вариант инициализации операционной системы. Для того, чтобы понять, как происходит инициализация необходимо понять, что такое режимы загрузки (они же runlevel), разобраться как между ними переключатся, рассмотреть работу со службами.
Обычно есть 7 уровней выполнения по умолчанию:
- Выключение
- Однопользовательский режим (чаще всего используется для отладки и настройки операционной системы)
- DebianUbuntu по умолчанию
- RedHatSuse по умолчанию текстовый режим.
- WildCard (программируемый режим, можно сюда поставить любой)
- RedHatSuse GUI (Graphical User Interface)
- Перезагрузка.
Но существуют операционные системы, где 10 уровней по умолчанию. Конечно речь идет о самых распространенных ядрах и сборках *nix образных операционных системах.
Для дальнейших пояснений, как работает инициализация в стиле sysV нам необходим операционная система CentOS 5.4 или ниже, потому что в более новых операционных системах данный процесс давно уже заменен. Отроем файл настроек текстовым редактором vi или любым другим удобным для вас.
Мы можем увидеть содержание файла. Те самые уровни о которых шла речь выше. Плюс прописан уровень используемые при загрузке по умолчанию. Строчка id:3:initdefault:
Мы данный параметр можем отредактировать и например сказать, чтобы операционная система загружалась по умолчанию в Single Mode например.
Если мы посмотрим далее файл, мы можем увидеть настройку, которая описывает действия нажатия клавиш Ctrl+alt-delete. А также наглядно прописано, что запуск определенного уровня — это запуск определённого скрипта. Все скрипты запускаются из папки /etc/rc.d/
Все дальнейшие варианты инициализации растут, вот из этого варианта. И этой процедуры инициализации. Перейдем в директорию, где лежат все скрипты инициализации и выполняются данные скрипты при старте системы.
В данной папке куча скриптов, которые запускают определенные службы, например, ssh запускает демона ssh для подключения клиентом по 22 порту. Т.е здесь куча служб и запускаются они этими скриптами. Если мы например хотим остановить какую нибудь службу то набираем ./rsync stop , ну и соответственно ./rsync start для запуска данной службы. Аналогично мы можем управлять через команду service, например: service rsync restart . Поднимемся на уровень выше cd ..
Найдем все файлы, которые начинаются с rc. Для этого набираем: ls -l | grep rc . В результате мы увидим несколько скриптов.
Посмотрим rc3.d . А для этого перейдем в эту директорию. В ней можно увидеть кучу скриптов. В вариации Ubuntu современной и затем в вариации CentOS 5.4
Те скрипты, которые начинаются с буквы K, эти скрипты при старте убивают сервис, те скрипты, которые имеют первой букву S запускают сервис. Ну и соответственно порядковый номер исполнения скрипта в очереди. Для каждого runlevel свой набор скриптов.
- Init управление инициализацией с помощью нее можно перемещаться между runlevel.
- Telinit управление процессом init , в старых дистрибутива использовалась именно эта команда.
- Wall вывод сообщения пользователям системы
- Halt — выключение компьютера
- Reboot перезагрузка компьютера
- Shutdown — запланированное выключение
Service service_name start|stop|reload|restart
Для того, чтобы перемещаться по уровням загрузки, нам необходимо понять на каком уровне мы находимся сейчас. Набираем runlevel . Соответственно, если мы хотим переключится telinit 1 отрабатывают скипты мы попадаем в однопользовательский режим 1.
Для того, чтобы послать сообщение все пользователям на данной машине необходимо набрать с соблюдением регистра wall «Abrakadabra». У всех пользователей появится данное сообщение на экране.
Для выключения сейчас компьютера можно использовать shutdown h now .
Init в стиле Systemd
Init в стиле Systemd более современная система инициализации операционной системы Linux.
Необходимым элементом работы системы systemd , являются Unit. Unit- это модуль которыми оперирует systemd:
- .service службы
- .mount точки монтирования
- .device устройства
- .socket сокеты
Если при работе в консоли мы не указывает расширение юнита, то в принципе system может догадаться в каком случае, что используется. В операционной системе существуют 2 папки в которых хранятся Unit:
- /usr/lib/systemd директория с Units по умолчанию, в которой создаются units при установке какого либо программного обеспечения.
- /etc/systemd директория с управляемыми Units. Тут лежат те Unit которыми может управлять админ, добавлять , редактировать.
Посмотрим, что находится в данных директориях переходим в /usr/lib/system
Нам интересны 2 директории system и user.
Содержимое папки system выглядит вот так. В данной директории лежат все необходимые Units для системы в директории user для пользователя. Картинка будет примерно аналогичная.
Директория /etc/systemd.
Тут точно также есть две папки system и user, а также конфигурационные фалы. Данные конфигурационные файлы и отвечают за настройку systemd. Это те файлы которые пришли на замену /etc/inittab, предыдущей версии инициализации операционной системы. Файлы юнитов в директориях system и user мы можем редактировать для каких-то своих целей и даже писать targets.
Далее мы можем посмотреть запущенные Units. Для этого мы можем выполнить systemctl команду, она отвечает за все действия с systemd. Для примера команда systemctl list-units нам выведет все запущенные Units, сокеты ,устройства ,точки монтирования.
Можно посмотреть юниты, которые не стартанули systemd failed . А также мы можем управлять юнитами systemctl status|start|stop|restart crond .
Так же Systemd работает с Target (целями).
Есть target которые работают так же как runlevel в классической процедуре инициализации, они не пронумерованы в отличии от runlevel у них есть конкретные имена. В табличке можно посмотреть какие target соотносятся с какими runlevel. Их этих target может быть несколько, потому что target бывают не только загрузочные. Данная система использования target обратно совместимая с системой инициализации. Для переключения мы можем использовать команду telinit. Сами по себе target есть некая группировка юнитов, последовательность вызова юнитов. Это может быть target последовательного вызова нескольких служб и ниже стоящий target.
Текущий уровень мы можем посмотреть командой runlevel. По умолчанию это будет 3. Далее мы можем написать systemctl list-units —type=target
И можно увидеть, что находимся на 3-м уровне также т.к target соответствует. Так же мы можем переключатся между runlevel командой telinit. Например, для перехода в однопользовательский режим telinit 1. А так же мы можем использовать через синтаксис systemctl isolate reboot.target .
Для того чтобы поставить какой-то загрузочный target по умолчанию, необходимо отредактировать загрузчик, вставить параметры ядра, которые будут запускаться. Или сделать проще командой systemctl set-default f multi-user.target (использование например 3 runlevel по умолчанию).
Одной из особенностей system является интересная система журналирования journald. Демон журналов. Эта система уникальна тем, что собирает информацию из разных источников событий и привязывает их к конкретным юнитам и сервисам. Благодаря этому мы можем всю диагностическую информацию просматривать в одном месте. Соответственно находить неисправности и их устранять.
Работает следующим образом:
- Journalctl f — показывает события по мере их возникновения.
- Journalctl n 10 вывод последних 10 событий
Инициализация Init в стиле
Инициализация Init в стиле upstart это система инициализации, в том стиле которая задумывалась для Ubuntu, и заменила процедуру инициализации, которая пришла из Unix стандартную init процедуру. Процедура инициализации upstart контролирует инициализацию демонов и служб в течении загрузки системы и их остановку если у нас система выключается или нужно переключится в другой режим. Основное отличие от классической процедуры инициализации в том, что задачи и службы останавливаются по событиям и сами события могут генерироваться задачами и службами, могут приняты быть от любого процесса системы. Могут быть службы перезапущены в автоматическом режиме если они вдруг были завершены в аварийном режиме. Еще одно отличие в том, что у данного режима инициализации есть задачи (tasks). Основными понятиями являются службы и задачи. Основное отличие службы от задачи в том, что служба перезапускается если была аварийно завершена, а задача нет.
Процесс инициализации системы по upstart берет конфигурацию из файлов каталога /etc/init каталог файлов-заданий (jobs). Каждый файл отвечает за запуск каждого задания или службы и должен заканчиваться с расширением .conf . Уровни инициализации остались те же самые. Определение и переключение между уровнями выполняются теми же командами, описанными выше. Изменился файл, в котором мы описываем runlevel запуска по умолчанию. И для управления upstart используется утилита initctl.
Как мы видим в каталоге /etc/init находятся конфигурационные файлы Jobs. Каждый отвечает за запуск отдельной службы. Смотрим файл конфигурации простейшего файрвола операционной системы cat ufw.conf
Как мы видим ufw стартует при условии, описанном start on, выключается на определенных runlevel. Файл конфигурации с runlevel по умолчанию находится в файле cat /etc/init/rc-sysinit.conf
Управляются службы простыми командами status ufw start ufw stop ufw . В данной статье мы рассмотрели различные вариации инициализации. Думаю, информация будет очень полезной.
Как проверить, какая система инициализации ядра стоит на сервере?
Здравствуйте, у меня такой вопрос возник , как определить какая система инициализации стоит на сервере linux? Есть ли какая то команда чтобы показать это? Я конечно понимаю что сейчас последние дистрибутивы поставляются с systemd на борту, но все же хотелось бы как то наглядно это увидеть, так как в моей системе нету такой утилитки как systemctl, значит в ней не systemd стоит?
- Вопрос задан более трёх лет назад
- 4638 просмотров
4 комментария
Оценить 4 комментария