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 вместо команды вы можете использовать команду .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *