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 намек поняли )

Источник — «http://ru.gentoo-wiki.com/Initng»
Личные инструменты