Последнее изменение файла: 2024.09.12
Скопировано с www.bog.pp.ru: 2024.09.13
Bog BOS: Загрузка Linux
В статье описывается процесс загрузки Linux (x86, GRUB, SysV init):
последовательность выполнения, настройка загрузчиков и /etc/inittab, systemctl.
- инициализация контроллера RAM
- декомпрессия BIOS из флеш в RAM
- защита от записи захваченного куска и передача туда управления
- POST (Power On Self Test) - процедура идентификации, тестирования и конфигурации оборудования
- процедура IPL - Initial Program Load (по мотивам BBS, PnP BIOS, PCI Local Bus, PXE Specification)
- BIOS отображает все найденные Option ROM на системную память
- BIOS включает в таблицу IPL (до 16 записей)
встроенные устройства загрузки (BAID - BIOS Aware IPL Device, не имеют своей Option ROM, код хранится на системной плате) и инициализирует их как умеет
- дополнительные устройства имеют в устройстве или на системной плате Option ROM (например, PCI Expansion ROM),
которые должны иметь стандартный формат заголовка (сигнатура 55AAh) с заголовком расширения "$PnP"
(один Option ROM может иметь несколько заголовков расширения, каждый имеет контрольную сумму), который позволяет отнести устройства
к BEV (Bootstrap Entry Vector - смещение программы загрузки, например, контроллер Ethernet)
или BCV (Boot Connection Vector - смещение программы подключения, например, контроллер RAID;
может захватывать прерывания 9h (ввод), 10h (вывод) и 13h (диск));
также содержит идентификатор устройства, имя изготовителя, название продукта
(серийного номера не предусмотрено, поэтому в меню загрузки будет 8 одинаковых названий моделей диска),
тип устройства, подтип устройства, флажки (это устройство ввода, это устройство вывода, включить в IPL, прочее)
- BIOS поочерёдно передаёт управление на вектор инициализации внутри заголовка
(переход, сегментная адресация - 16-bit Real Mode или 16-bit Protected Mode (16:16),
совместимый с адаптированными вызовами в 32-bit Protected Mode (16:32), совместимость с 0:32 Protected Mode (flat) не предполагалась)
каждого Option ROM (сначала видео, ввод и IPL);
инициализация не должна перехватывать прерывания 9h, 10h и 13h;
возвращает флажки: может обслуживать прерывания 9h (ввод), 10h (вывод) и 13h (диск), устройство готово к обслуживанию;
по ходу дела инициализируются требуемые шины и мосты;
программа инициализации BCV после включения устройства ищет подключённые устройства и для каждого добавляет заголовок BCV в памяти
и добавляет свой первый диск в список IPL
- BIOS просматривает все Option ROM (в памяти) и ведёт таблицу BCV контроллеров с приоритетами BCV,
передаёт управление на сегментный адрес программы подключения (перехватывает прерывания 9h, 10h или 13h)
- BIOS просматривает все Option ROM (в памяти) и определяет потенциальные загрузочные устройства из BEV и составляет таблицу IPL:
тип устройства, флажки (индекс последней загрузки в таблице, активное устройство, была ошибка, носитель готов),
сегментный адрес программы загрузки, строка описания ASCIIZ - имя продукта
- приоритет загрузки определяется оператором при настройке BIOS и хранится в NVRAM (по умолчанию, сначала BAID, затем BEV устройства)
- BIOS перебирает в соответствии с приоритетами загрузочные устройства из таблицы IPL и пытается с них загрузиться
(передаёт управление на сегментный адрес программы загрузки);
при неудаче программа загрузки должна выдать INT 18h (когда-то тут был BASIC)
- программе загрузки передаётся номер загрузочного устройства (80h для первого НЖМД)
- программа загрузки действует в зависимости от типа устройства:
- блочное устройство: загрузка загрузочного сектора (512 байт) в память по адресу 0000:7C00h и передача ему управления;
если загрузка с жёсткого диска, то загрузочный сектор лежит в MBR (Master Boot Record)
- CD-ROM: см. описание спецификации El Torito
- сетевой контроллер (BEV): PXE
- первоначальный загрузчик находит и загружает программу загрузки 2 этапа
(stage 2) и передаёт ей управление (GRUB, LILO, SYSLINUX);
используется BIOS API; обычное место загрузчика 2 этапа - /boot/
- загрузчик 2 этапа выбирает, находит и загружает ядро и RAM диск (initrd)
в память;
GRUB читает конфигурацию из /boot/grub/grub.conf;
конфигурация для LILO хранится в MBR;
GRUB и LILO позволяют вывести список возможных загружаемых систем
на экран и выбрать нужную с помощью клавиатуры;
GRUB позволяет изменить параметры загрузки (корневая файловая система,
ядро, RAM диск, параметры ядра) с помощью текстового редактора;
используется BIOS API;
RAM диск содержит образ файловой системы с модулями (драйверами)
устройств, необходимыми для монтирования корневой файловой системы;
в случае со встроенным Linux RAM диск содержит всю систему
- ядро повторно обходит и инициализирует периферийные устройства,
для которых есть встроенные драйвера
- ядро монтирует RAM диск (предварительно разжав) и загружает
с него необходимые модули,
инициализирует соответствующие устройства
- если необходимо, то ядро инициализирует LVM и программный RAID
- ядро размонтирует RAM диск и освобождает занимаемую им память
- ядро монтирует корневую файловую систему в режиме "только чтение";
в процессе дальнейшей работы ядро загружает дополнительные модули
с корневой файловой системы
- запускается процесс /sbin/init (далее описывается загрузка в стиле
System V)
- init разбирает конфигурационный файл /etc/inittab
для определения дальнейших действий;
если при загрузке указан уровень s (или S), то inittab не читается,
а система переходит в однопользовательский режим (shell на
/dev/console с правами root);
строка с действием initdefault определяет
"уровень выполнения" (run level) по умолчанию, т.е. режим работы системы
(однопользовательская, многопользовательская, с доступом в сеть,
с графическим окружением и т.д.);
строка с действием sysinit (/etc/rc.d/rc.sysinit) определяет
скрипт инициализации;
- init выполняет скрипт /etc/rc.d/rc.sysinit (проверка и монтирование
остальных файловых систем, swap и т.д.)
- в "нормальном" /etc/inittab при переходе на любой уровень запускается
скрипт /etc/rc.d/rc с указанием уровня в качестве параметра;
данный скрипт запускает скрипты /etc/rcуровень.d/K*
(в алфавитном порядке) с параметром stop и скрипты
/etc/rcуровень.d/S* с параметром start;
в конце запускается /etc/rc.d/rc.local;
по традиции скрипты являются символьными ссылками
на скрипты в директории /etc/init.d/;
вместо /etc/init.d/ может использоваться /etc/rc.d/init.d/;
вместо /etc/rcуровень.d/ может использоваться /etc/rc.d/rcуровень.d;
реальность несколько сложнее
- инициализация платформы UEFI
- менеджер загрузки UEFI выбирает драйверы и приложения из списка
- загрузка ядра и RAM диска;
RAM диск содержит образ файловой системы с модулями (драйверами)
устройств, необходимыми для монтирования корневой файловой системы;
в случае со встроенным Linux RAM диск содержит всю систему
- ядро повторно обходит и инициализирует периферийные устройства, для которых есть встроенные драйвера
- ядро монтирует RAM диск (предварительно разжав) и загружает с него необходимые модули,
инициализирует соответствующие устройства - dracut
- ядро размонтирует RAM диск и освобождает занимаемую им память
- ядро монтирует корневую файловую систему в режиме "только чтение";
в процессе дальнейшей работы ядро загружает дополнительные модули с корневой файловой системы
- запускается процесс /usr/lib/systemd/systemd
- тут будет длинный рассказ после того как systemd устоится
В различных дистрибутивах и различных ситуациях могут использоваться
следующие загрузчики:
LILO и GRUB работают через BIOS,
а большинство BIOS позволяют доступ только
к первым двум IDE-дискам (считая ATAPI CD-ROM) в пределах первых 1023 цилиндров.
Так что каталог (или раздел) /boot, в котором хранятся как файлы самого
загрузчика, так и загружаемые файлы (ядро, initrd) должен удовлетворять
данным ограничениям.
Формат файла /etc/inittab
(комментарии начинаются с символа '#'):
идентификатор:перечень-уровней-выполнения:действие:процесс
где
- идентификатор - уникальная последовательность от 1 до 4 символов
(в старых версиях до 2); для getty и ему подобных идентификатор
д.б. номером линии tty
- перечень-уровней-выполнения - перечисление (без пробела) уровней
выполнения, для которых выполняется указанное действие
(от 0 до 6 и от A до C, s, S); для sysinit, boot и bootwait
игнорируется; при смене уровня всем процессам, не специфицированным
для этого уровня, посылается сигнал SIGTERM, а через 5 секунд (интервал
задаётся при вызове telinit -t) сигнал SIGKILL
(init предполагает, что процесс не сменил группу процессов, в которой
он его запустил);
пустой список означает "для всех"
- действие (по-моему, тут перемешаны условия и действия)
- respawn (процесс по завершении запускается вновь и вновь;
после 10 перезапусков за 2 минуты делается пауза 5 минут)
- wait (процесс запускается один раз при переходе на уровень,
init ждёт его завершения)
- once (процесс запускается один раз при переходе на уровень)
- boot (процесс запускается при загрузке системы)
- bootwait (процесс запускается при загрузке системы,
init ждёт его завершения)
- off (ничего не делать)
- ondemand (процесс запускается при вызове данного уровня
выполнения (от A до C), но смены уровня не происходит)
- initdefault (на какой уровень выполнения переходить после загрузки;
если не указан, то будет спрашивать на консоли)
- sysinit (процесс запускается при загрузке до boot и bootwait)
- powerwait (вызывается при пропадании питания, например, программой
слежения за UPS,
SIGPWR (подробности в /etc/powerstatus: FAIL),
init ждёт его завершения)
- powerfail (вызывается при пропадании питания, например, программой
слежения за UPS,
SIGPWR (подробности в /etc/powerstatus: FAIL),
init не ждёт его завершения)
- powerokwait (вызывается при возобновлении питания,
SIGPWR (подробности в /etc/powerstatus: OK),
init ждёт его завершения)
- powerfailnow (вызывается непосредственно перед исчерпанием
аккумуляторов UPS, SIGPWR (подробности в /etc/powerstatus: LOW))
- ctrlaltdel (вызывается при получении сигнала SIGINT от ядра)
- kbrequest (ядро посылает SIGWINCH при нажатии определённой
комбинации клавиш)
- процесс - имя файла ('+' перед символом отменяет запись utmp и wtmp),
программа или скрипт
При запуске процесса устанавливаются переменные окружения:
PATH, INIT_VERSION, RUNLEVEL, PREVLEVEL, CONSOLE.
Уровни выполнения для Red Hat Linux:
- 0: halt (неинтереактивный уровень)
- 1: single user (одна виртуальная консоль)
- 2: multiuser (6 виртуальных консолей)
- 3: multiuser + NFS (6 виртуальных консолей)
- 4: не используется
- 5: X11 (6 виртуальных консолей и xdm, gdm или kdm
в зависимости от /etc/X11/prefdm)
- 6: reboot (неинтереактивный уровень)
Переход на другой уровень можно сделать с помощью
программы telinit или прямо через /dev/initctl.
telinit с указанием уровня q (Q) заставляет init
перечитать /etc/inittab. Использование SIGPWR и /etc/powerstatus признано
устаревшим.
Загрузчик может передать процессу init параметры
- -s, S, single (загрузка в однопользовательском режиме)
- от 1 до 5 (явное задание уровня выполнения)
- -b, emergency (однопользовательский режим без выполнения sysinit)
- -a, auto (устанавливается переменная AUTOBOOT)
systemd (LGPL) - управление системой и сервисама.
RHEL/CentOS 7.9 - версия 219. RHEL/RockyLinux 8.10 - версия 239.
Запускается как PID 1 вместо процесса init (initd, SysV init), UpStart, OpenRC, runit, dinitq.
Для совместимости поддерживает скрипты инициализации LSB (/etc/init.d).
Управляет запуском модулей (unit) и отслеживает зависимость между модулями (юнитами).
Предполагается, что в будущем заменит собой все системные сервисы Linux.
Уже имеются замены следующим сервисам:
- сервис журнализации (systemd-journal вместо syslog)
- управление сеансами пользователей (systemd-logind вместо ConsoleKit)
- временем и сетевым временем (timedated и systemd-timesyncd вместо ntpd/chronyd)
- именем хоста (вместо hostbame)
- именами DNS (systemd-resolved вместо библиотеки resolv и /etc/resolv.conf)
- локалью systemd-localed вместо ?
- контейнерами и виртуальными машинами (systemd-nspawn, machinectl, systemd-machined.service)
- учётными записями (systemd-sysusers вместо useradd)
- настройками
- сетевыми интерфейсами (systemd-networkd, networkctl, /lib/systemd/network/ вместо network-scripts и nmcli)
- монтированием (systemd-mount и systemd-umount вместо /etc/fstab и mount) и монтированием по требованию (вместо automount)
- замена chroot и UEFI загрузчику (systemd-boot)
- systemd-tmpfiles
- systemd-udevd
- юниты .timer (замена cron)
- управление питанием systemd-ac-power
Кстати, Gnome 3.8 и выше не работает без systemd (используется для управления сессиями).
Использует D-Bus и Unix-сокеты для общения между процессами.
Контролирует состояние юнитов и реагирует на их изменение, перезапускает юнит при аварийном завершении, собирает сообщения.
Позволяет активировать сервисы по зависимостям, обращению к портам и сокетам (замена inetd, xinetd.service), обращению D-Bus,
по расписанию (замена cron), по активации обрудования (udev), обращению к файлу или каталогу.
Сервисы наследуют окружение процесса 1, а не от оболочки, в которой запускается скрипт service.
Осуществляется проверка на зацикливание зависимостей с попыткой автоматического удаления желаемых (Wants), но не обязательных зависимостей.
Аналогично inetd слушает требуемые сервисами сокеты (сетевые порты) используя специальные юниты (.socket) для их создания
и передаёт их процессам юнитов при необходимости,
это также позволяет не терять сообщения при перезапуске сервисов - сообщения встают в очередь к незакрываемому на время перезапуска сокету.
Сервисы, зависимые от базовых сервисов (точнее от интерфейсных сокетов), могут быть запущены без ожидания завершения запуска базового сервиса.
Для ожидания монтирования файловой системы или доступа к конкретному файл используется механизм autofs (.mount, .automount и .path).
При запуске головного процесса юнита помещает его в отдельную контрольную группу (cgroup), в которую попадают все его потомки,
что позволяет аккуратно завершить все процессы юнита (в прошлой жизни использовались setsid, установление лидера группы процессов и т.д.).
Посмотреть имена групп можно командой "ps xawf -eo pid,user,cgroup:80,args" или systemd-cgls, которые выводят дерево процессов.
Типы юнитов (имя юнита определяется именем файла с его описанием):
- сервисы (.service) - набор процессов, изолируемых средствами cgroups
- работа с сокетами AF_INET, AF_INET6 и AF_UNIX (.socket) - первоначально сокет слушает сам systemd, а соответствующий сервис запускается при первом обращении
- подключение блочного или сетевого устройства (.device) с использованием systemd-udevd
- точка монтирования (.mount), могут динамически создаваться из /etc/fstab
- точка монтирования по запросу (.automount, systemd.automount(5)) имеет соответствующий модуль .mount
- цель, режим работы (.target) - группа сервисов (аналог уровня initd)
- раздел подкачки (.swap)
- запуск других модулей по расписанию (.timer)
- контейнер cgroups (.slice)
- управление иерархией файловой системы (.path), сервис запускается при изменении или первом обращении
- внутренний юнит .snapshot создаётся автоматически при выполнении "systemctl snapshot" и содержит текущий статус юнитов;
можно откатить командой "systemctl isolate"
- внутренний юнит .scope создаётся при запуске сервиса
- юнит контейнера .nspawn
Цели (.target, режим работы; цель по умолчанию задаётся командой "systemctl set-default ..."
или при загрузке ключом ядра systemd.default=):
Файлы настройки в /etc/systemd (пользовательские), /run/systemd/system/ (временные), /usr/lib/systemd/ (дистрибутивные).
Основной файл - /etc/systemd/system.conf, описание юнитов в подкаталогах system/.
Сервисы systemd:
- systemd - процесс 1
- journald - журнализация
- networkd - управление сетью
- systemd-logind - управление доступом пользователей
- systemd-udevd - управление устройствами
Подсистема systemd.generator позволяет преобразовать на ходу
посторонние файлы настройки в юниты при загрузке и перечтении (reload) настройки systemd.
Генераторы ищутся в /run/systemd/system-generators/, /etc/systemd/system-generators/,
/usr/local/lib/systemd/system-generators/, /usr/lib/systemd/system-generators/,
/run/systemd/user-generators/, /etc/systemd/user-generators/, /usr/local/lib/systemd/user-generators/ и /usr/lib/systemd/user-generators/.
Генераторы запускаются в самом начале загрузки до syslog, systemd и монтирования дополнительных файловых систем.
Получившийся юнит можно посмотреть в каталогах /run/systemd/generator{.early,,.late} и $XDG_RUNTIME_DIR/generator{early,,late}
или с помощью "systemctl show имя-скрипта|имя-файловой-системы".
Описание юнита в "родном" формате имеет приоритет над результатом работы генератора.
Генераторы:
- systemd-sysv-generator: скрипты LSB (LSB headers)
преобразуются на ходу в юниты с учётом ключей Required-Start из управляющих комментариев LSB, например (посмотреть командой "systemctl show имя-скрипта"):
тип forking, "After=remote-fs.target basic.target network-online.target sysinit.target systemd-journald.socket system.slice",
"Before=multi-user.target graphical.target shutdown.target"; учитываются runlevelУровень.target;
управляющие комментарии в скрипте LSB размещаются между строками "### BEGIN INIT INFO" и "### END INIT INFO";
ключи управляющих комментариев:
- Provides: имя-сервиса
- Required-Start: имена-сервисов-через-пробел # специальные имена:
- $network преобразуется в "After=network-online.target" и "Wants=network-online.target"
- $local_fs
- $remote_fs преобразуется в "After=remote-fs.target"
- $named преобразуется в After=nss-lookup.target
- $portmap преобразуется в After=rpcbind.target
- $syslog
- $time
- Required-Stop: имена-сервисов-через-пробел # специальные имена: $network $local_fs $remote_fs $named $portmap $syslog $time
- Default-Start: уровни-через-пробел # на каких уровнях запускать сервис по умолчанию
- Default-Stop: уровни-через-пробел # на каких уровнях останавливать сервис по умолчанию
- Short-Description: краткое описание
- Description: описание
- systemd-fstab-generator: /etc/fstab преобразуются на ходу в юниты типа .mount;
т.к. генератор запускается в самом начале, то сетевые имена в /etc/fstab не допустимы;
- x-systemd.automount - преобразование в юнит типа .automount в дополнение к .mount;
поиск: "grep auto /proc/mounts"; отсутствует автоматическое размонтирование
- nfs-server-generator
- rpc-pipefs-generator
- selinux-autorelabel-generator.sh
- systemd-cryptsetup-generator
- systemd-debug-generator
- kdump-dep-generator.sh
- lvm2-activation-generator
- systemd-getty-generator
- systemd-gpt-auto-generator
- systemd-hibernate-resume-generator
- systemd-rc-local-generator
- systemd-system-update-generator
- systemd-veritysetup-generator
- zfs-mount-generator
Сохранён интерфейс /dev/initctl для работы старых программ (shutdown, poweroff?)
- сервис транслирующий старые команды в обращение через D-Bus
(systemd-initctl.socket, systemd-initctl.socket(8), systemd-initctl.service, systemd-initctl.service(8)).
Сохранена совместимость с utmp/wtmp - systemd-update-utmp.service, ystemd-update-utmp-runlevel.service
(systemd-update-utmp.service(8), systemd-update-utmp-runlevel.service(8), systemd-update-utmp(8)).
Кроме инициализации (init.scope) и управления системой (system.slice) systemd используется для управления сессиями пользователей (user.slice)
Утилиты:
- systemctl - утилита управления
- systemd-nspawn - аналог chroot, но также создаёт отдельное пространство имён файловых систем (FSNS), номеров процессов (PID NS),
автоматически монтирует /proc и /sys и, возможно, приватную сеть; systemd внутри systemd-nspawn "не делает резких движений" типа reboot()
- systemd-analyze:
- blame - сортировка юнитов по затраченному на запуск времени
- plot - дерево запуска юнитов с указанием затраченного на запуск времени (в формате SVG)
- critical-chain - критический путь загрузки
- set-log-level notice - трассировка загрузки
systemctl - основная управляющая утилита systemd. Файл настройки - /etc/systemd/system.conf.
Получить список {активных | всех} юнитов: systemctl [--all] [--state={active|failed}] {list-units|list-unit-files} [режим-работы].
Повторное чтение описаний юнитов: systemctl daemon-reload. Необходимо, например, при добавлении сервиса.
Послать сигнал всем процессам сервиса: systemctl kill -s имя-сигнала [--kill-who=main] имя-юнита.
Управление работой сервисов: systemctl {is-active|status|start|stop|reload|restart|mask|unmask|show} имя-юнита
(show показывает все параметры юнита - 229 штук в версии 239!).
Управление запуском сервисов при загрузке, обращению к сокету и т.п.: systemctl {is-enabled|disable|enable|preset} имя-юнита.
Маскировка сервиса (сервис останавливается, запуск блокируется): systemctl {mask|unmak} имя-юнита (делается ссылка
/etc/systemd/system/имя-юнита на /dev/null и "systemctl daemon-reload").
Управление режимом работы (аналог уровня в inittab): systemctl set-default {graphical.target|multi-user.target|rescue.target}.
Ключ ядра systemd.unit=имя-режима. Сервис debug-shell обеспечивает оболочку во время загрузки (enable).
Состояние системы (дерево системных сервисов и их процессов, а также пользовательских сеансов): systemctl status.
Перезагрузка: systemctl {reboot|poweroff|suspend|hibernate} [--firmware-setup].
7 Ctrl-Alt-Del в течении 2 секунд - немедленная перезагрузка.
Создание снимка текущего состояния юнитов и откатка к снимку: systemctl {snapshot|isolate}.
Показать юниты, которые не удалось запустить: systemctl --failed.
Привычный /etc/rc.local лежит в /etc/rc.d/rc.local, настройки systemd сервиса rc-local расположены в /usr/lib/systemd/system/rc-local.service,
запускается в режиме multi-user.target после network.target, предварительно необходимо дать права на выполнение
chmod u+x /etc/rc.d/rc.local
Удалённое управление (ключ --hostname) производится через ssh
(зачем это? почему нельзя просто использовать ssh? эадел для замены в будущем ssh?).
Юнит имеет имя, зависимости, описание требуемых ресурсов и прочее.
Описание юнита содержится в файлах подкаталогов system/ каталогов настройки systemd:
/etc/systemd/{system,user}/ (локальные), /run/systemd/{system,user}/ (временные), /usr/lib/systemd/{system,user}/ (дистрибутивные).
Имя и тип юнита определяются именем файла с описанием.
Формат был выбран похожим на формат .ini файлов MS Windows, текстовый файл делится на секции, имя секции на отдельной строке в квадратных скобках,
имя параметра и значение разделены символом "=" на отдельной строке. Несколько значений разделяются пробелами.
Сервисы могут присутствовать в нескольких экземлярах - имя-сервиса@идентификатор-экземпляра.service,
например, getty@tty1.service. В этом случае systemd сначала пытается найти описание сервиса с таким именем,
а при неудаче отбрасывает идентификатор-экземпляра и использует найденный файл как шаблон описания юнита.
При этом в теле шаблона '%i' и '%I' заменяются на идентификатор-экземпляра (экранированную - \xAB - и неэкранированную версию соответственно).
Секция Unit описывает юнит, параметры:
- Description - описание юнита
- Documentation - где взять документацию по сервису (например, man:sshd(8))
- After - после каких юнитов запускать, запуск этих юнитов не инициализируется и не требуется
- Want - какие юниты желательно запускать до данного
- Requires - указанные юниты обязательно запустить до данного
Секция Service описывает поведение сервиса:
- Type - тип запуска юнита
- forking - сервис запускает дочерний процесс и завершает родительский, после чего служба считается запущенной, порождённый процесс считается основным
- simple - сервис состоит из основного процесса, который сразу считается готовым
- notify - сервис состоит из основного процесса, который извещает systemd о готовности
- idle - сервис состоит из основного процесса, который запускается при простое системы
- oneshot - запущенный процесс завершается
- dbus - сервис считается готовым при регистрации указанного в BusName имени в D-Bus, процесс не порождает дочерний и не завершается
- BusName - имя, например, com.redhat.abrt
- EnvironmentFile - откуда брать значения переменных окружения (/etc/sysconfig/...)
- WorkingDirectory - какой каталог сделать текущим
- ExecStart - имя файла, исполняемого при запуске сервиса, с параметрами (можно использовать переменные окружения)
- ExecStop - имя файла, исполняемого при останове сервиса, с параметрами (можно использовать переменные окружения)
- ExecReload - имя файла, исполняемого при повторной инициализации, с параметрами (можно использовать переменные окружения)
- PIDFile - где хранить номер процесса
- KillMode - как завершить процесс: process - основной процесс
- StandardOutput - куда направить stdout; можно syslog
- StandardError - куда направить stderr; можно syslog
- SyslogIdentifier
- SyslogFacility
- IOSchedulingClass - планировщик ввода/вывода: best-effort
- Restart - условие автоматического перезапуска: on-failure - при аварийном завершении сервиса
- RestartSec - время ожидание до перезапуска
- RootDirectory - куда делать chroot перед ExecStart, который задаётся относительно каталога chroot
- ExecStartPre - скрипт подготовки окружения chroot
- RootDirectoryStartOnly - делать chroot только перед ExecStart
- ReadOnlyDirectories -
- InaccessibleDirectories -
Секция Install описывает когда должен запуститься сервис:
- WantedBy - какие цели (.target) активируют этот юнит (управляется "systemctl enable|disable имя-сервиса")
Пример своего сервиса (/usr/lib/systemd/system/имя-сервиса.service):
[Unit]
Description=Confluence
After=network.target nss-lookup.target
[Service]
Type=forking
WorkingDirectory=/home/confluence/atlassian-confluence-5.9.7
ExecStart=/home/confluence/atlassian-confluence-5.9.7/bin/start-confluence.sh
PIDFile=/home/confluence/atlassian-confluence-5.9.7/work/catalina.pid
ExecStop=/home/confluence/atlassian-confluence-5.9.7/bin/stop-confluence.sh
ExecReload=/home/confluence/atlassian-confluence-5.9.7/bin/stop-confluence.sh | sleep 60 | /home/confluence/atlassian-confluence-5.9.7/bin/start-confluence.sh
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=Confluence
SyslogFacility=daemon
IOSchedulingClass=best-effort
Restart=on-failure
[Install]
WantedBy=multi-user.target
Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru