Initng
Материал из Gentoo Linux Wiki
- Вернуться в раздел руководства
Содержание |
[править] Предисловие
В этой заметке будет рассказано про программу initng - замену стандартному sysvinit. Сначала расскажем что это за зверь такой - init.
[править] Внимание
Информация может быть устаревшей, рекомендуется смотреть на документ поддерживаемый разработчиком (на английском языке) http://www.initng.org/wiki/Install_Gentoo
[править] Что такое Init?
При загрузке системы сначала грузится ядро, потом оно монтирует файловую систему с раздела, указанного как корневой, и пытается запустить программу init. По-умолчанию исполняемый файл инита находится по адресу /sbin/init, но передав ядру загрузочный параметр init=/sbin/initng мы можем изменить его местоположение на /sbin/initng . Если ядро находит init, оно запускает его и успокаивается, а init производит дальнейшую процедуру загрузки. В случае sysvinit основную работу производят скрипты, в случае initng - сама программа.
[править] Службы InitNG
Содержимое файла /etc/initng/daemon/gpm.i:
daemon daemon/gpm {
need = system/initial system/mountfs;
exec daemon = /usr/sbin/gpm;
exec_args daemon = -m /dev/input/mice -t ps2 -Rraw;
pid_file = /var/run/gpm.pid;
}
Файл с описанием нужной службы состоит всего из шести строк ( по сравнению с 38 строками аналогичной службы для sysvinit в Gentoo ). Посмотрев файл gpm.i мы замечаем вот что:
- initng различает службы не по имени файла, а по ключевым словам стоящим после daemon (или service или virtual). Это позволяет задавать в одном файле несколько служб и создавать вещи вроде
daemon daemon/agetty/* {
need = system/mountfs system/consolefont;
env DEV_PRE=tty;
exec daemon = /sbin/agetty 38400 ${DEV_PRE}${NAME};
respawn;
}
чтобы запустить getty на новом терминале нужно запустить службу daemon/agetty/11 ( для tty11 )
- initng умеет распределять порядок запуска служб ( есть зависимости типа need, use и conflict)
- файлы в /etc/initng не являются скрипами, что существенно ускоряет загрузку
Также существует и другая форма записи для службы:
service system/numlock {
need = system/initial system/mountfs;
script start = {
echo "Enabling numlock on ttys ..."
exit 0
};
script stop = {
echo "Disabling numlock on ttys"
exit 0
};
}
Initng умеет грузить службы в асинхронном режиме ( опять же на уровне самой программы, а не скриптов ). Уровни запуска фактически являются пустыми службами в зависимости типа need от которых находятся другие службы список которых определен в файлах /etc/initng/*.runlevel
например файл /etc/initng/default.runlevel определяет что грузить при обычном режиме загрузки:
system daemon/fancontrol daemon/agetty/tty2 daemon/agetty/tty3 daemon/agetty/tty4 daemon/agetty/tty5 daemon/agetty/tty6 daemon/agetty/tty10 daemon/acpid daemon/gpm daemon/vixie-cron daemon/fetchmail daemon/agetty/tty1 daemon/kdm
Также initng дает возможность задавать псевдонимы для служб в файле /etc/initng/service_alias:
httpd=daemon/apache daemon/httpd=daemon/apache
что позволяет строить зависимости более гибко.
Запускаемые службы бывают трёх видов - демоны ( ключевое слово daemon ), сервисы ( service ) и виртуалы (virtual).
[править] Сервисы
Сервис - это вещь которая запускается initng, делает свою работу и завершается. После этого служба получает статус выполненной ( DONE ) и initng приступает к выполнению служб зависящих от нее. Примеры служб: загрузка модуля, монтирование файловых систем, установка шрифта.
[править] Демоны
Демон - процесс который должен работать постоянно и после запуска получает статус запущенного ( RUNNING ), а после завершения исчезает из таблицы или получает статус неудачно запущенного ( FAIL_STARTING ), а службы зависящие от него будут остановлены. Initng следит за запущеным демоном и при его завершении сразу отображает это в своей таблице ( ситуация, когда gpm упал, а скрипты sysvinit этого не заметили и считают его запущенным не возникает ). Чтобы отслеживать демона используется один из трех приемов:
- демон запускается таким образом, что не уходит в backgroung делая fork
- в файле запуска указывается (pid_file = ), в какой файл демон пишет свой pid и InitNG отслеживает этот процесс.
- в файле запуска указывается имя процесса ( pid_of = ). Когда первый процесс ( напрямую запускаемый InitNG ) завершается, InitNG ищет другой с таким же именем и в дальнейшем следит за ним.
Предпочтительнее всего первый вариант, в последнем же можно "поймать" левый процесс. Примеры демонов: gpm, kdm, dictd, hald, agetty.
[править] Виртуалы
Виртуал - пустая служба, которая ничего не делает, только зависит от других:
virtual daemon/agetty {
need = daemon/agetty/tty1 daemon/agetty/tty2 daemon/agetty/tty3 daemon/agetty/tty4 daemon/agetty/tty5 daemon/agetty/tty6;
use = system/mountfs system/netmount;
}
[править] Перезапуск служб
Initng умеет перезапускать упавшие службы ( respawn ) Если указать ключевое слово "respawn" в секции демона, InitNG заново запустит его в случае самопроизвольной остановки. Это сработает, если служба останавливается в режиме RUNNING, то есть InitNG не будет пытаться запустить незапускающийся демон миллион раз.
[править] Зависимости
InitNG умеет автоматически обрабатывать зависимости служб друг от друга
service system/foo {
need = system/initial system/mountfs;
use = system/alsasound;
conflict = daemon/some;
exec start = /sbin/foo;
exec_args start = bar baz;
}
[править] Need
Попытка запустить службу system/foo приведет к запуску system/initial и system/mountfs; Foo будет запущена только если они успешно запустятся.
[править] Use
Попытка запустить службу system/foo не приведет к запуску system/alsasound, но если system/alsasound всё равно запускается на этом уровне, то foo будет запущена после неё.
[править] Conflict
Служба system/foo будет запущена только если daemon/some не выполняется.
[править] Утилиты для управления
В поставку также входят утилиты ngc и ng-update
[править] Ngc
ngc - утилита для запуска и остановки служб, вывода таблици сервисов, их зависимостей, журнала запуска (
включая вывод запущенных программ ) и прочего.
ngc -u kdm - запуск демона kdm
ngc -d kdm - остановка kdm
ngc -z kdm - удаление kdm из таблицы служб ( нужно для кривых скриптов, которые не могут остановить службу. последнее время таковых не наблюдается )
ngc -s - таблица
ngc -h - справка
Подробнее в ngc(8)
[править] Ng-update
ng-update - утилита для добавления и удаления служб из уровней запуска. Ключи командной строки совпадают с таковыми для rc-update в Gentoo
ng-update add net/eth0 default - добавить службу net/eth0 в обычный уровень запуска
ng-update del net/eth2 system - удалить net/eth2 из уровня system
Подробнее в ng-update(8)
[править] Также смотрите
ngc(8), ng-update(8), gen_system_runlevel(8), install_service(8), system_off(8), initng(8)
[править] Прочее
страница проекта - http://www.initng.org
текущая версия - 0.6.10.2
присутствует в gentoo portage под именем sys-apps/initng ( иногда eбилды запаздывают, но те кто умеют делать Portage_Overlay намек поняли )
