Init
Содержание:
Reference
Commands
All these commands exit 111 if they encounter a temporary error, and
100 if they encounter a permanent error — such as a misuse. They exit
127 if they’re trying to execute into a program and cannot find it, and
126 if they fail to execute into a program for another reason.
Short-lived commands exit 0 on success.
Supervision system
s6-svscan and s6-supervise
are the long-lived processes maintaining the supervision tree. Other programs are
a user interface to control those processes and monitor service states.
- The s6-svscan program
- The s6-svscanctl program
- The s6-supervise program
- The s6-svc program
- The s6-svok program
- The s6-svstat program
- The s6-svwait program
- The s6-svlisten1 program
- The s6-svlisten program
- The s6-notifyoncheck program
- The s6-svdt program
- The s6-svdt-clear program
- The s6-permafailon program
Daemontools-like utilities
These programs are a rewrite of the corresponding utilities from
daemontools, with
a few extras.
- The s6-envdir program
- The s6-envuidgid program
- The s6-fghack program
- The s6-setsid program
- The s6-setuidgid program
- The s6-applyuidgid program
- The s6-softlimit program
- The s6-tai64n program
- The s6-tai64nlocal program
Fifodir management, notification and subscription
These programs are a clean rewrite of the obsolete «pipe-tools» package; they
are now based on a properly designed notification library.
They provide a command-line interface to
.
- The s6-mkfifodir program
- The s6-cleanfifodir program
The s6-ftrig-notify program
- The s6-ftrig-wait program
- The s6-ftrig-listen1 program
- The s6-ftrig-listen program
The s6-ftrigrd internal program
Local service management and access control
- The s6-ipcclient program
- The s6-ipcserver program
- The s6-ipcserver-socketbinder program
- The s6-ipcserverd program
- The s6-ioconnect program
- The s6-ipcserver-access program
- The s6-connlimit program
- The s6-accessrules-cdb-from-fs program
- The s6-accessrules-fs-from-cdb program
fd-holding, a.k.a. the sensible part of socket activation
- The s6-fdholder-daemon program
- The s6-fdholderd program
- The s6-fdholder-store program
- The s6-fdholder-retrieve program
- The s6-fdholder-delete program
- The s6-fdholder-list program
- The s6-fdholder-getdump program
- The s6-fdholder-setdump program
- The s6-fdholder-transferdump program
Libraries
- s6/s6.h, the main entry point
- The ftrigw library interface
- The ftrigr library interface
- The s6lock library interface
- The accessrules library interface
- The s6-fdholder library interface
- What is a fifodir
- What is a service directory
- What is a scan directory
- What is a local service
- Why are the libftrigw and libftrigr needed
Однопользовательский режим
В отличие от таких операционных систем для ПК, как DOS или Windows, Linux по своей природе является многопользовательской системой. Однако в некоторых ситуациях это может оказаться проблемой, например, когда вам необходимо восстановить главную файловую систему или базу данных, или установить и протестировать новое оборудование. Решением этой проблемы является использование уровня выполнения 1, или однопользовательского режима. Фактическая реализация работы в этом режиме зависит от дистрибутива, но обычно происходит запуск командного интерпретатора с минимальной функциональностью. Как правило, при этом отсутствует поддержка сети и запущенные демоны (либо их очень мало). В одних системах для входа в однопользовательский режим необходимо пройти аутентификацию, а в других этого не требуется, и вы сразу начинаете работу в командной оболочке с привилегиями суперпользователя (root). Однопользовательский режим может оказаться вашим спасителем, но также может разрушить систему, поэтому всегда будьте очень осторожны, когда работаете с привилегиями суперпользователя. По завершении работы в однопользовательском режиме просто перезагрузитесь в обычный многопользовательский режим.
Так же, как и в случае с обычными многопользовательскими уровнями выполнения, вы можете переключиться в однопользовательский режим, набрав команду . Как было упомянуто в таблице 1, уровню выполнения 1 соответствуют псевдонимы ‘s’ и ‘S’, поэтому вместо предыдущей команды можно использовать, например, команду .
Init и Upstart
Как видите, в основе традиционного метода загрузки Linux-системы лежит процесс init операционной системы UNIX System V. В этом случае сначала загружается RAM-диск (initrd), а затем управление передается программе , которая обычно устанавливается в составе пакета sysvinit. Затем программа запускает в заранее определенном порядке ряд сценариев для загрузки системы. Если в процессе загрузки какие-то компоненты оказываются недоступными, то процесс init ждет, пока они станут доступными. Это корректно работает на компьютерах, в момент загрузки которых все устройства уже подключены и известны операционной системе. Однако при использовании современных компьютеров с поддержкой технологии «горячей замены», сетевых файловых систем и даже некоторых сетевых плат, которые могут быть недоступны в момент загрузки, могут возникнуть новые проблемы. Конечно же, ждать, пока система определит оборудование, которое может быть недоступным (относительно) долгое время, может оказаться не лучшим вариантом.
Альтернативный процесс инициализации под названием upstart был впервые представлен в 2006 году в дистрибутиве Ubuntu 6.10 (Edgy Eft). На сегодняшний день upstart вытеснил традиционный процесс init в Ubuntu и Fedora и прочих дистрибутивах Linux. Тем не менее, процесс init еще сохранился, а полная мощь upstart возможно, не реализована полностью.
В отличие от постоянных наборов сценариев инициализации, использовавшихся в более ранних дистрибутивах, подсистема upstart основана на событиях. События могут наступать при добавлении или удалении оборудования, запуске или остановке заданий, а также в результате работы других системных процессов. События используются для запуска задач или служб, вместе известных как задания. Так, например, подключение USB-накопителя может заставить службу udev послать системе событие block-device-added, которое приведет к запуску определенной задачи для проверки файла и монтирования файловой системы накопителя (если это возможно). Другим примером может являться Web-сервер Apache, запускающийся только в том случае, если доступны сетевое подключение и все файловые ресурсы.
Программа инициализации upstart замещает процесс /sbin/init. Задания upstart определены в директории /etc/init и ее поддиректориях. В настоящее время подсистема upstart обрабатывает файл /etc/inittab и сценарии инициализации System V. В таких дистрибутивах, как последние выпуски Fedora, файл /etc/inittab, вероятно, содержит только запись с идентификатором id для действия initdefault. В новейших дистрибутивах Ubuntu по умолчанию файл /etc/inittab отсутствует, хотя вы можете создать его, если захотите определить уровень выполнения по умолчанию.
Также в подсистеме upstart имеется команда initctl, которая позволяет взаимодействовать с демоном инициализации upstart. Это позволяет запускать или останавливать задания, выводить список заданий, получать их статусы, генерировать события, перезапускать процесс инициализации и так далее. В листинге 11 показано, как использовать для получения списка заданий upstart в операционной системе Fedora 13.
Листинг 11. Взаимодействие с демоном инициализации upstart с помощью initctl
$ initctl list rc stop/waiting tty (/dev/tty3) start/running, process 1486 tty (/dev/tty2) start/running, process 1484 tty (/dev/tty6) start/running, process 1492 tty (/dev/tty5) start/running, process 1490 tty (/dev/tty4) start/running, process 1488 plymouth-shutdown stop/waiting control-alt-delete stop/waiting system-setup-keyboard start/running, process 1000 readahead-collector stop/waiting vpnc-cleanup stop/waiting quit-plymouth stop/waiting rcS stop/waiting prefdm start/running, process 1479 init-system-dbus stop/waiting ck-log-system-restart stop/waiting readahead stop/waiting ck-log-system-start stop/waiting start-ttys stop/waiting readahead-disable-services stop/waiting ck-log-system-stop stop/waiting rcS-sulogin stop/waiting serial stop/waiting
Чтобы узнать больше о подсистеме upstart, обратитесь к разделу .
На этом наш обзор уровней выполнения, остановки и перезагрузки операционной системы Linux завершен.
Installation
Requirements
- A POSIX-compliant system with a standard C development environment
- GNU make, version 3.81 or later
- skalibs version
2.9.2.1 or later. It’s a build-time requirement. It’s also a run-time
requirement if you link against the shared version of the skalibs
library. - Optional: execline version
2.6.0.1 or later. When s6 is built with execline support (which is the default),
execline is a build-time requirement, and also a run-time requirement for
certain binaries that spawn scripts interpreted with
execlineb.
Download
- The current released version of s6 is 2.9.2.0.
- Alternatively, you can checkout a copy of the
s6
git repository:git clone git://git.skarnet.org/s6
- There’s also a
GitHub mirror
of the s6 git repository.
Как настроить сеть Netplan в Ubuntu
Сначала необходимо посмотреть, как называются сетевые интерфейсы в вашей системе. Для этого можно просто изучить содержимое папки /sys/class/net:

У меня есть только Wi-Fi-карта — wlp, у вас же может быть ещё и проводной интерфейс enp. Или устройства могут называться по старому — wlan и eth. Всё зависит от системы.
1. Настройка динамического IP в Netplan
Для настройки динамического IP- адреса для интерфейса enp3s0 создадим новый конфигурационный файл 02-networkd.yaml. Самая простая настройка Netplan для получения IP по DHCP будет выглядеть вот так:

В качестве программы для обработки конфигурации мы используем Networkd, далее мы указываем наш сетевой интерфейс и включаем получение IPv4 адреса по DHCP. Все остальные параметры тоже подтянутся по DHCP. Или мы можем вручную настроить DNS для этого интерфейса:

Теперь осталось проверить эту конфигурацию. Для этого выполните:

Если ошибок нет, программа ничего не выведет и запишет вашу конфигурацию на диск. Если есть ошибки, утилита о них сообщит.
2. Настройка статического IP в Netplan
Статический IP-адрес в Netplan настроить немного сложнее. Поскольку здесь нам нужно будет задать не только непосредственно сам адрес, но и кучу других параметров, которые система раньше получала по DHCP. Нам надо указать шлюз для доступа в интернет и DNS-серверы. Модифицируем тот же конфигурационный файл:

Рассмотрим подробнее, что за что отвечает в этом конфигурационном файле.
- dhcp4 — отключаем получение IP адреса по DHCP;
- addresses — параметр ожидает список IP-адресов, которые нужно присвоить нашей сетевой карте, у нас только один адрес, однако, передавать его надо тоже в формате списка, иначе будет ошибка. В конце адреса указывается префикс маски — /24, который отвечает маске сети 255.255.255.0. Вы можете указать и другую маску, но только с помощью префикса, отдельного параметра для этого нет.
- gateway4 — задаёт адрес роутера, через который наш компьютер сможет получить доступ в интернет;
Остальное вы знаете. Списки можно оформлять не только с помощью черточек, для каждого пункта с новой строки, но и с помощью квадратных скобок, тогда элементы записываются в одну строку через запятую.
3. Настройка Wi-Fi через Netplan на Ubuntu
Кроме проводного подключения, система конфигурации Netplan умеет управлять подключением к Wi-Fi. Это отличная новость, учитывая, насколько сложно всё это раньше настраивалось, если не было NetworkManager. Правда, для работы Wi-Fi через Networkd надо, чтобы в системе был установлен пакет wpasupplicant. Например, у нас есть точка доступа AccessPoint с паролем 12345678? и мы хотим к ней подключаться. Тогда настройка Netplan Ubuntu будет выглядеть так:

Здесь мы указываем, что надо получить IP и другие параметры по DHCP, устанавливаем DNS-сервер вручную, хотя это не обязательно, а затем добавляем точку доступа и пароль к ней.
4. Применение конфигурации netplan
Естественно, что после смены настроек в конфигурационном файле ничего не меняется. Сначала нужно проверить конфигурационный файл на ошибки и создать файлы конфигурации программы-обработчика. Для этого выполните:
Если вы хотите видеть более подробную информацию, используйте опцию —debug:

Если есть ошибки, их надо исправить, если нет, применяем конфигурацию с помощью команды:

Если вы меняли программу-обработчик, например с NetworkManager на networkd, то надо ещё перезапустить компьютер. После этого сеть будет работать на новой конфигурации.
Примеры Init скрипта
Приведу наглядный пример запуска томката.
Запуск TOMCAT с init
Создадим init скрипт для запуска:
# vim /etc/init.d/tomcat9
И приводим к виду:
#!/bin/bash -x
#
# Provides: tomcat9
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Should-Start: $named
# Should-Stop: $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start Tomcat.
# Description: Start the Tomcat servlet engine.
### END INIT INFO
export CATALINA_HOME=/usr/local/tomcat9
export JAVA_HOME=/usr/local/jdk1.8.0_131
export PATH=$JAVA_HOME/bin:$PATH
service_name="tomcat9"
start() {
echo "Starting Tomcat 9..."
/bin/su -s /bin/bash tomcat -c $CATALINA_HOME/bin/startup.sh
}
stop() {
echo "Stopping Tomcat 9..."
/bin/su -s /bin/bash tomcat -c $CATALINA_HOME/bin/shutdown.sh
}
status() {
if (( $(ps -ef | grep -v grep | grep $service_name | wc -l) > 0 )); then
echo "$service_name is running!!!"
else
echo "$service_name is down!!!"
fi
}
case $1 in
start|stop|status) $1;;
restart) stop; start;;
*) echo "Usage : $0 <start|stop|restart>"; exit 1;;
esac
exit 0
Даем права на запуск (на исполнение):
# chmod 755 /etc/init.d/tomcat9
ИЛИ:
# chmod +x /etc/init.d/tomcat9
Запускаем томкат:
# service tomcat9 start
Открываем браузер и смотрим что вышло!
Вот еще один скрипт:
#!/bin/bash -x
DAEMON_PATH="/home/wes/Development/projects/myapp"
DAEMON=myapp
DAEMONOPTS="-my opts"
NAME=myapp
DESC="My daemon description"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
case "$1" in
start)
printf "%-50s" "Starting $NAME..."
cd $DAEMON_PATH
PID=`$DAEMON $DAEMONOPTS > /dev/null 2>&1 & echo $!`
#echo "Saving PID" $PID " to " $PIDFILE
if ; then
printf "%s\n" "Fail"
else
echo $PID > $PIDFILE
printf "%s\n" "Ok"
fi
;;
status)
printf "%-50s" "Checking $NAME..."
if ; then
PID=`cat $PIDFILE`
if ; then
printf "%s\n" "Process dead but pidfile exists"
else
echo "Running"
fi
else
printf "%s\n" "Service not running"
fi
;;
stop)
printf "%-50s" "Stopping $NAME"
PID=`cat $PIDFILE`
cd $DAEMON_PATH
if ; then
kill -HUP $PID
printf "%s\n" "Ok"
rm -f $PIDFILE
else
printf "%s\n" "pidfile not found"
fi
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {status|start|stop|restart}"
exit 1
esac
Подойдет к большинству скриптов, а для остальных — можно отредактировать немного.
И, вот еще полезный довольно вариант:
#!/bin/sh
### BEGIN INIT INFO
# Provides:
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO
dir=""
cmd=""
user=""
name=`basename $0`
pid_file="/var/run/$name.pid"
stdout_log="/var/log/$name.log"
stderr_log="/var/log/$name.err"
get_pid() {
cat "$pid_file"
}
is_running() {
&& ps -p `get_pid` > /dev/null 2>&1
}
case "$1" in
start)
if is_running; then
echo "Already started"
else
echo "Starting $name"
cd "$dir"
if ; then
sudo $cmd >> "$stdout_log" 2>> "$stderr_log" &
else
sudo -u "$user" $cmd >> "$stdout_log" 2>> "$stderr_log" &
fi
echo $! > "$pid_file"
if ! is_running; then
echo "Unable to start, see $stdout_log and $stderr_log"
exit 1
fi
fi
;;
stop)
if is_running; then
echo -n "Stopping $name.."
kill `get_pid`
for i in 1 2 3 4 5 6 7 8 9 10
# for i in `seq 10`
do
if ! is_running; then
break
fi
echo -n "."
sleep 1
done
echo
if is_running; then
echo "Not stopped; may still be shutting down or shutdown may have failed"
exit 1
else
echo "Stopped"
if ; then
rm "$pid_file"
fi
fi
else
echo "Not running"
fi
;;
restart)
$0 stop
if is_running; then
echo "Unable to stop, will not attempt to start"
exit 1
fi
$0 start
;;
status)
if is_running; then
echo "Running"
else
echo "Stopped"
exit 1
fi
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac
exit 0
Вот и все, статья «Пишем Init скрипт» завершена.
Изменение уровня выполнения
Существует несколько способов изменения уровня выполнения. Чтобы выполнить постоянное изменение, можно отредактировать файл /etc/inittab, установив в нем уровень выполнения по умолчанию, как это было показано в предыдущем разделе.
Если необходимо загрузить систему с определенным уровнем выполнения один раз, то вы также можете сделать это. Например, предположим, что вы только что установили новое ядро и хотите добавить несколько модулей после загрузки системы с новым ядром, но до загрузки системы X Window. Для этого вы можете загрузить систему с уровнем выполнения 3. Это делается во время загрузки либо путем редактирования строки ядра (при использовании загрузчика GRUB), либо путем добавления параметра после имени выбранной системы (при использовании LILO). Для указания требуемого уровня выполнения используется одна цифра (в нашем случае 3). Мы приведем пример для системы, в которой используется менеджер загрузки GRUB. Предположим, что в вашем файле /boot/grub/menu.lst содержатся строки, показанные в листинге 2.
Листинг 2. Типовые строки загрузочного меню GRUB в системе Fedora 8
title Fedora (2.6.26.8-57.fc8)
root (hd0,5)
kernel /boot/vmlinuz-2.6.26.8-57.fc8 ro root=LABEL=FEDORA8 rhgb quiet
initrd /boot/initrd-2.6.26.8-57.fc8.img
Для перевода системы на уровень выполнения 3 дождитесь вывода на экран загрузочного меню, выберите нужную запись и нажмите ‘e’ для ее редактирования. В зависимости от настроек GRUB вам может потребоваться нажать клавишу для вывода загрузочного меню, а также набрать ‘p’ и ввести пароль для получения прав на редактирование. Загрузочное меню GRUB в нашей системе Fedora 8 выглядит так, как показано на рисунке 1.
Рисунок 1. Выбор варианта загрузки в меню GRUB

В этом примере вы должны увидеть строки root, kernel и initrd. Переместите курсор на строку, начинающуюся на «kernel» и нажмите ‘e’ для ее редактирования. Меню GRUB в нашей системе Fedora 8 должно принять вид в соответствии с рисунком 2.
Рисунок 2. Выбор записи ядра для изменения параметров

Теперь переместите курсор в конец строки и добавьте пробел и цифру ‘3’. При желании вы можете убрать параметр ‘quiet’ или изменить любые другие параметры. Меню GRUB в нашей системе Fedora 8 должно принять вид в соответствии с рисунком 3.
Рисунок 3. Установка уровня выполнения (уровень 3) во время загрузки

Наконец, нажмите Enter для сохранения изменений и ‘b’ для загрузки операционной системы.
Примечание. Если вместо GRUB вы используете LILO или GRUB2, то хотя данная процедура будет немного отличаться, основные принципы (редактирование параметров загрузки ядра) будут теми же самыми. Изображенные на наших рисунках экраны GRUB также могут выглядеть немного иначе в других дистрибутивах или на других компьютерах. Как правило, вам всегда доступны подсказки в виде приглашений.
После того, как вы закончите работы по настройке ядра на уровне выполнения 3, вероятно, вы захотите переключиться на уровень 5. К счастью, для этого нет необходимости перезагружать компьютер. Для переключения на другой уровень можно использовать команду . Чтобы проверить предыдущий и текущий уровни выполнения, используйте команду . Если первым символом вывода этой команды будет ‘N’, то это означает, что с момента загрузки системы уровень выполнения не изменялся. В листинге 3 приведены примеры проверки и изменения уровня выполнения.
Листинг 3. Проверка и изменение уровня выполнения
# runlevel N 3 # telinit 5
После ввода команды вы увидите несколько быстро сменяющихся сообщений, после чего появится графический экран входа в систему. Откройте окно терминала и убедитесь, что уровень выполнения был изменен, как показано в листинге 4.
Листинг 4. Проверка нового уровня выполнения
# runlevel 3 5
Если с помощью команды вы отобразите подробные сведения о команде , то увидите, что на самом деле она является символической ссылкой на команду , как показано в листинге 5.
Листинг 5. На самом деле telinit является символической ссылкой на init
# ls -l $(which telinit) lrwxrwxrwx 1 root root 4 2008-04-01 07:50 /sbin/telinit -> init
Программа знает о том, каким образом она была вызвана (как или как ), и ведет себя соответственно. Поскольку во время загрузки команда имеет идентификатор PID 1, то если впоследствии вы обратитесь к ней через вызов , а не , она также будет знать об этом. В этом случае она будет предполагать, что вы хотите, чтобы она вела себя так, как если бы вы осуществили вызов программы . Например, для переключения на уровень выполнения 5 вместо команды вы можете использовать команду .