5. Система инициализации Linux Цель: изучение системы инициализации в ОС Linux. Задание: 1. Разработать скрипт инициализации к вашему демону резервного копирования файлов (см. 4. Резервное копирование файлов). Скрипт должен уметь запускать, останавливать демона, отправлять сигналы для создания и восстановления резервных копий. 2. Добавить скрипт в автозагрузку при старте системы (man chkconfig – для redhat/centos, man update-rc.d - ubuntu) Скрипт инициализации может быть написан для любой ОС семейства Linux. Системы инициализации Linux Существует несколько систем инициализации. Рассмотрим их: 1) Система инициализации init (в процессе запуска ядра монтируется корневая файловая система и запускается программа init, которая и выполняет дальнейшую инициализацию системы). 2) Система initng (позволяет существенно ускорить запуск Linux, но она пока еще экспериментальная, поэтому не устанавливается в дистрибутивах по умолчанию. Однако вы можете самостоятельно ее установить и попробовать использовать - удалить ее всегда можно, если она вас чем-то не устроит) 3) Система upstart была специально разработана для дистрибутива Ubuntu Linux, но ее при желании можно установить в любом дистрибутиве. И др. Начнем по порядку: 1) Система инициализации init Программа init читает конфигурационный файл /etc/inittab и запускает другие процессы, согласно инструкциям этого файла. Одна из главных инструкций файла /etc/inittab выглядит так: id: <число>: initdefault Эта инструкция задает уровень запуска по умолчанию. Уровень запуска определяет, какие действия будут выполнены программой init (какие процессы запущены). Всего предусмотрено шесть уровней запуска: 0 - остановка системы (ясно, что в качестве уровня по умолчанию этот Уровень быть не может); 1 - однопользовательский режим (в него можно перейти сразу при загрузке, передав ядру параметр single); 2 - многопользовательский режим без поддержки сети; 3 - многопользовательский режим с поддержкой сети; 4 - не используется; 5 - многопользовательский графический режим с загрузкой X11 и поддержкой сети; 6 - перезагрузка системы. В большинстве случаев в качестве уровня запуска по умолчанию устанавливается 3 или 5. Перейти на тот или иной уровень можно и после загрузки системы. Для этого используется команда: # /sbin/init 'уровень_эапуска' "Определив" уровень запуска, init поочередно запускает сценарии из каталога /etc/rc.d/rcX.d, где X - это номер уровня запуска. Если зайти в один из этих каталогов, например, в /etc/rc.d/rc3.d, то можно увидеть ссылки формата: S 'номер''имя' Параметр 'номер' определяет порядок запуска сценария (например, SlOnetwork запустится раньше, чем S11internet), а параметр 'имя' - задает имя сценария. Сами сценарии находятся в каталоге /etc/rc.d/init.d. Ссылки, начинающиеся на символ S, - это ссылки запуска (от S, start), при запуске соответствующих сценариев им будет передан аргумент start. Например, если init обнаружила в /etc/rc.d/rc3.d файл SlOnetwork, то она выполнит команду: /etc/rc.d/init.d/network start Если имя ссылки начинается на букву К (от kill), то это ссылка остановки сервиса, например, КО1service. Данная ссылка указывает на команду: /etc/rc.d/init.d/service stop 0н можете запустить любой сценарий из каталога init.d непосредственно, передав ему параметры start (запуск), stop (остановка) и другие (зависит от сервиса). А можете воспользоваться командой service: # service 'имя_сервиса' 'start|stop|..' Здесь 'имя сервиса' - это имя файла в каталоге /etc/rc.d/init.d. Например для запуска Apache можно использовать команду: # rcapache start Редактировать уровни запуска можно вручную, а можно и с помощью программ-конфигураторов: в Fedora - конфигуратор system-config-services; в Ubuntu до версии 9.04 применяется конфигуратор services-admin, а в версии 9.10 следует использовать конфигуратор bum, который нужно установить отдельно: sudo apt-get install bum 2) Система инициализации initng Initng - это система инициализации Linux следующего Поколения, позволяющая существенно ускорить запуск Linux. А за счет чего достигается ускорение запуска Linux? B почему нам в дальнейшем придется перейти на initng? В процессе загрузки Linux запускается ядро, оно монтирует корневую файловую систему и запускает программу init Именно init выполняет всю дальнейшую инициализацию системы. Первым делом init читает поле initdefauit в файле /etc/inittab - это уровень запуска по умолчанию. В зависимости от уровня запуска init запускает сценарии, находящиеся в одном из подкаталогов каталога /etc/rс.d. Initng работает иначе. Она не запускает сценарии, а сама выполняет действия указанные в файлах, играющих роль сценариев инициализации. В случае же с обычным init на самом деле инициализирует систему bash, a init только запускает нужные сценарии - то есть выполнение передается другой программе (bash), которая эти сценарии и выполняет. A initng сама, без посредников, выполняет инициализацию системы, за счет чего и достигается сокращение времени загрузки (к сожалению пока система initng не получила особого распространения - она не используется ни в одном современном дистрибутиве). 3) Система инициализации upstart Система инициализации upstart была разработана Скотом Джеймсом Ремнантом (Scott James Remnant) для дистрибутива Ubuntu, однако upstart можно с успехом использовать в других дистрибутивах. 3.1. Как работает upstart В upstart есть собственный процесс init, который запускается при запуске системы (аналогично прoграммам init и initng). При запуске генерируется событие startup, при завершении работы - shutdown, при нажатии на Ctrl+Alt+Del - событие ctrl-alt-delete. Вы можете создавать собственные события. Вот небольшой пример создания события my_event: on my_event eхес echo event received console output При получении этого события на консоль будет выведено сообщение: event received Файлы событий хранятся в каталоге /etc/event.d. Создайте в этом каталоге файл с именем my_event и поместите в него приведенный код. После этого вызвать событие можно командой: initctl emit my_event Более подробную информацию об этой команде можно прочитать на странице руководства: man initctl. 3.2. Конфигурационные файлы upstart Исследуйте содержимое каталога /etc/event.d. В нем вы найдете файлы событий перехода на определенный запуск. Самое интересное в upstart - уровни запуска здесь - виртуальные. В upstart, благодаря событийно-ориентированному режиму, вообще отпадает необходимость в уровнях запуска, подобных тем, которые использовались в init. Загрузка того или иного сервиса происходит при наличии нужного аппаратного обеспечения: нет устройства - не будет загружен и сервис, требующий его. Upstart можно использовать в режиме "горячей замены" - если вы в процессе работы системы подключите какое-то устройство, например, PCMCIA-карту или USB-устройство, будет сгенерировано соответствующее событие. После этого будут запущены все необходимые для обеспечения работы этого устройства процессы. Так, при подключении сетевой карты PCMCIA будет сгенерировано событие network-interface-added, которое запустит процесс настройки сетевой карты по DHCP, при этом будет сгенерировано новое событие - network-interface-up и т.д. Естественно, если нет сетевых устройств, то и соответствующие им события не будут генерироваться. Пример скрипта инициализации для CentOS/Red Hat Linux #!/bin/bash # # chkconfig: 35 90 12 # description: Foo server # # Get function from functions library . /etc/init.d/functions # Start the service FOO start() { initlog -c "echo -n Starting FOO server: " /path/to/FOO & ### Create the lock file ### touch /var/lock/subsys/FOO success $"FOO server startup" echo } # Stop the service FOO stop() { initlog -c "echo -n Stopping FOO server: " killproc FOO ### Now, delete the lock file ### rm -f /var/lock/subsys/FOO echo } # Backup backup() { killall -SIGUSR1 FOO } # Restore restore() { killall -SIGUSR2 FOO } ### main logic ### case "$1" in start) start ;; stop) stop ;; status) status FOO ;; restart|reload) stop start ;; backup) backup ;; restore) restore ;; *) echo $"Usage: $0 {start|stop|restart|reload|status|backup|restore}" exit 1 esac exit 0 Материалы: 1. http://ipmnet.ru/~sadilina/Fedora/28.html 2. http://ru.wikipedia.org/wiki/Init 3. Система инициализации в Gentoo (http://www.gentoo.org/doc/ru/handbook/handbookx86.xml?part=2&chap=4) 4. Система инициализации upstart (http://www.openlogic.com/wazi/bid/281586/How-to-writeCentOS-initialization-scripts-with-Upstart)