5. Система инициализации Linux - xn--e1aajkdk8c.xn--p1ai

advertisement
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)
Download