Блог им. KungFuxТонкая настройка автозагрузки в Ubuntu Server

Целью данной статьи является ознакомление с принципами автозагрузки в операционной системе Ubuntu на примере Ubuntu Server 10.04 LTS, а также демонстрация настройки автозагрузки виртуальной машины, работающей под управлением VirtualBox, и корректное завершение работы последней в автоматическом режиме при выключении Ubuntu Server.

Внимание! Описанный ниже пример не может быть применим к настройке автозагрузки графических приложений для конкретного пользователя системы в настольных версиях Ubuntu. Для этого используйте пункт «Запускаемые приложения» из главного меню Ubuntu.

Что такое автозагрузка?
В первую очередь, это автоматический запуск сервисов/приложений при старте операционной системы. Автозагрузка также может обеспечивать корректное завершение этих служб/приложений при выключении или перезагрузке системы.

Организация автозагрузки в Ubuntu Server.
Разумеется, для того, чтобы правильно запустить/остановить сервис, необходимо описать сценарий с командами для запуска/остановки. Взгляните на содержимое каталога /etc/init.d: он содержит скрипты, которые управляют загрузками/остановками сервисов на вашей машине. Итак, первый, но не последний пункт успешной настройки — это наличие скрипта в /etc/init.d. В скрипте не описывается, когда должен выполняться тот или иной сценарий. Он лишь может принимать параметры start, stop, restart и так далее. Откуда же Ubuntu знает, когда необходимо вызвать скрипт? Ответ кроется в каталогах /etc/rcN.d, где N – это цифра от 0 до 6. В этих каталогах хранятся символические ссылки на скрипты из /etc/init.d. Рассмотрим, что означает каждый каталог, и всё сразу станет понятно:
— rc0.d – выполнение скрипта при выключении системы;
— rc1.d – выполнение скрипта при запуске системы в однопользовательском режиме;
— rc2.d – выполнение скрипта при запуске системы в многопользовательском режиме;
— rc3.d – rc5.d – зарезервировано;
— rc6.d – выполнение скрипта при перезагрузке системы.

Например, если происходит перезагрузка, то будут выполнены все скрипты из каталога /etc/rc6.d, при выключении — из /etc/rc0.d и так далее. Цифра в названии каталога называется уровнем запуска. То есть каталог /etc/rc0.d будет называться нулевым уровнем запуска и так далее.
Есть еще один немаловажный момент, который необходимо знать — это очередность выполнения скриптов из каталогов rcN.d. Ведь для правильной организации запуска/остановки работы Ubuntu может потребоваться запускать/останавливать сервисы в определенном порядке. Этот момент решается специальным именованием файлов в каталогах уровней запуска. Файлы имеют следующие имена: [S|K]NN[имя], где [S|K] — это один символ («S» означает, что скрипт запускает сервис, «K» – останавливает), NN – порядковый номер, [имя] – имя файла. Символ «S» или «K» самостоятельно выбирать не придется, так как все скрипты в каталогах rc1.d-rc5.d должны начинаться с символа «S», а в каталогах rc0.d и rc6.d – с символа «K». Число «NN» определяет очередность запуска скриптов, который производится от меньшего к большему. Чем меньше число у скрипта для запуска, тем раньше он будет запущен при старте системы; чем больше число у скрипта остановки сервиса, тем позже он будет выполнен.

При необходимости запуска какой-либо службы или приложения до или после конкретного существующего сервиса просто подсмотрите его порядковый номер в соответствующей директории rcN.d и учитывайте при выборе порядкового номера для своего скрипта.

Ну что ж, где хранить скрипты и как их называть понятно, а вот как его написать?
В каталоге /etc/init.d находится пример скрипта для управления запуском/остановкой сервисов. Это файл /etc/init.d/skeleton, а в примере ниже он будет упрощен. Для создания нового скрипта необходимо сделать копию примера и отредактировать его под свои нужды. Воспользуемся следующей командой:
sudo cp /etc/init.d/skeleton /etc/init.d/myscript && vi /etc/init.d/myscript


При создании нового скрипта не забывайте давать ему права на выполнение. Чтобы добавить права на выполнение скрипту, используйте команду sudo chmod +x /etc/init.d/myscript

Скрипт готов. Что дальше?
В некоторых источниках встречаются рекомендации по созданию символических ссылок вручную при помощи команды ln, не смотря на существование специальных утилит. Перед добавлением скрипта утилита проверяет его на валидность, а команда ln создаст ссылку даже при наличие ошибок. Лучше отдать предпочтение специализированным утилитам, таким как update-rc.d, которая поставляется в комплекте с Ubuntu. С её помощью можно добавить новый скрипт в любой уровень загрузки, удалить существующий и так далее. Вот пример использования:
sudo update-rc.d myscript start 99 2 3 4 5 . stop 01 0 1 6 .


Эта команда добавит новый скрипт «myscript» во все уровни загрузки. Будет выполнен запуск сервиса на уровнях со 2 по 5 с приоритетом 99 (в последнюю очередь) и остановка сервиса на 0, 1 и 6 уровнях с приоритетом 01 (самым первым).
Чтобы удалить скрипт из автозагрузки, воспользуйтесь командой:
sudo update-rc.d -f myscript remove


Рассмотрим пример настройки автозагрузки.
Задача: настроить автоматический запуск виртуальной машины, работающей под управлением VirtualBox, которая должна запускаться спустя две минуты после запуска операционной системы Ubuntu Server. При выключении или перезагрузке Ubuntu Server виртуальная машина должна корректно завершать свою работу.
Предположим, что на Ubuntu Server установлен VirtualBox и существует виртуальная машина с именем «Slave», операционная система которой поддерживает возможность корректного завершения работы при нажатии кнопки выключения компьютера (поддержка ACPI).

Для начала напишем скрипт, который будет располагаться в каталоге /etc/init.d:
sudo cp /etc/init.d/skeleton /etc/init.d/slave && sudo vi /etc/init.d/slave


Отредактировав скрипт и оставив лишь минимально необходимое, получаем файл со следующим содержимым:
#!/bin/sh
### BEGIN INIT INFO
# Provides: slave
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: ability for starting and saving execution state of VBox virtual machines
# Description: This script is used for starting and saving execution state of VBox virtual machines by using System-V on Ubuntu Server. This file should be placed in /etc/init.d
### END INIT INFO
# Author: Fuks Alexander

. /lib/lsb/init-functions

# Perform start of Slave's virtual machine with delay 2 minutes
perform_start()
{
        log_daemon_msg «Starting Vbox Slave machine»
        sleep 120 && su -l -c «VboxHeadless –startvm Slave &» kungfux
        log_end_msg 0
        return 0
}

# Send POWEROFF ACPI signal for Slave's virtual machine
perform_save()
{
        log_daemon_msg «Sending ACPI POWER OFF signal for Vbox Slave machine»
        su -l -c «VboxManage controlvm Slave acpipowerbutton» kungfux
        log_end_msg 0
        return 0
}

case “$1” in
  start)
    perform_start
    ;;
  stop)
    perform_save
    ;;  
  *)
    echo “Usage: /etc/init.d/slave {start|stop}”
    exit 3
    ;;
esac

:


Добавим скрипт во все уровни запуска:

kungfux@itworks:~$ sudo update-rc.d slave start 99 2 3 4 5 . stop 01 0 1 6 .
Adding system startup for /etc/init.d/slave ...
/etc/rc0.d/K01slave -> ../init.d/slave
/etc/rc1.d/K01slave -> ../init.d/slave
/etc/rc6.d/K01slave -> ../init.d/slave
/etc/rc2.d/S99slave -> ../init.d/slave
/etc/rc3.d/S99slave -> ../init.d/slave
/etc/rc4.d/S99slave -> ../init.d/slave
/etc/rc5.d/S99slave -> ../init.d/slave


Перегрузившись, можно проверить, что команда запуска виртуальной машины была выполнена. Посмотрим отчет о запуске:

kungfux@itworks:~$ cat /var/log/boot.log 
fsck from util-linux-ng 2.17.2 
/dev/sda1: clean, 92526/4751360 files, 2565789/18975488 blocks 
 * Starting Jenkins Continuous Integration Server jenkins 
 * Starting No-IP.com dynamic address update noip2 
 * Not starting internet superserver: no services enabled 
 * Starting Postfix Mail Transport Agent postfix 
 * Starting bittorrent daemon transmission-daemon 
 * Starting VirtualBox kernel modules 
 * Starting NTP server ntpd 
 * Starting ftp server proftpd 
 * Starting web server apache2 
 * Starting Vbox Slave machine


В последней строке присутствует текст, который был выведен скриптом «slave».
Более того, написанными скриптами для init.d можно пользоваться из терминала в любой момент времени. Например, для запуска виртуальной машины выполним команду:
kungfux@itworks:~$ /etc/init.d/slave start


Как видно из примера, операционная система Ubuntu предоставляет богатые возможности для управления запуском/остановкой сервисов/программ. В скриптах автозагрузки можно описывать зависимости запускаемых/останавливаемых служб от других служб с помощью секций «Required-Start/Required-Stop», да и сам скрипт может быть любой сложности, что позволяет организовать даже самую «тонкую» автозагрузку.

Данный материал написан для «Первого конкурса русскоязычных статей для ОС Ubuntu 2011 года» (konkurs.ubuntu.ru).
  • +7
  • KungFux
  • 30 августа 2011, 22:43

Комментарии (5)

не срача ради, просто раньше было 3 режим многопользовательский консольный режим (rc3.d), а 5 графический многополоьзовательский (rc5.d)- в убунту и это поменяли?
Как было раньше, я, увы, не знаю, но особых отличий не вижу) Можно взглянуть на таблицу 3.4 «Список уровней запуска и описания их использования» из Debian Reference Manual по адресу www.debian.org/doc/manuals/debian-reference/debian-reference.en.html
хм- да…
статья хороша, подробна. но есть одно но… разве в ubuntu не upstart используют сейчас?
Не совсем в курсе, но upstart.ubuntu.com говорит, что используется в
Ubuntu 6.10 and later
Однако похоже System-V init никто не отменял, раз она присутствует в Ubuntu 10.04.3 LTS.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.