Як systemd використовує /etc/init.d сценарії?


120

Я просто перейшов на debian Джессі, і більшість речей працює нормально, включаючи мій графічний менеджер дисплеїв wdm.

Справа в тому, що я просто не розумію, як це працює. Очевидно, мій /etc/init.d/wdmсценарій називається, тому що, коли я ставив там рано exit, wdm не запускається. Але коли я альтернативно перейменую каталог /etc/rc3.d (у мене за замовчуванням виконувався рівень 3), то wdm все ще запускається.

Я не міг дізнатися, як systemd знаходить цей скрипт, і не розумію, що він робить для всіх інших скриптів init.d.

  • Коли і як запускається системний скрипт init.d?
  • Чи з часом я повинен позбутися всіх сценаріїв init.d?

Відповіді:


166

Відповідь хаосу - це те, що говорить деяка документація. Але це не те, що systemd насправді робить. (Це не те, що робив rcі Ван Смооренбург . Фургон Smoorenburg,rc безумовно , не ігнорував заголовки LSB, які insservвикористовувались для обчислення статичних замовлень, для початківців.) Документація Freedesktop, така як сторінка "Несумісність", насправді помилкова, на ці та інші моменти. (The HOMEзмінна оточення насправді це часто встановлюється, наприклад. Це тривало повністю документовані в будь-якому місці в протягом тривалого часу. Це зараз описано в керівництві, по крайней мере, але Freedesktop WWW сторінки до сих пір не виправлена.)

Нативним форматом обслуговування для systemd є блок обслуговування . Правильне управління сервісом systemd функціонує виключно з огляду на ті, які він читає з одного з дев'яти каталогів, де .serviceможуть жити (загальносистемні) файли. /etc/systemd/system, /run/systemd/system, /usr/local/lib/systemd/system, І /usr/lib/systemd/systemчотири з цих каталогів.

Сумісність із rcсценаріями van Smoorenburg досягається програмою перетворення, названою systemd-sysv-generator. Ця програма вказана в /usr/lib/systemd/system-generators/каталозі і, таким чином, автоматично запускається системою на початку завантажувального процесу при кожному завантаженні, і знову кожного разу, коли системному інструктору буде надано повторно завантажити конфігурацію.

Ця програма є генератором , типом допоміжної утиліти, завданням якої є створення файлів службових блоків на льоту, в tmpfs, де розміщено ще три з цих дев'яти каталогів (які призначені для використання лише генераторами). systemd-sysv-generatorгенерує сервісні підрозділи, за допомогою яких виконуються rcсценарії van Smoorenburg /etc/init.d, якщо він не знайде нативного системного блоку обслуговування з таким ім'ям, який вже існує в інших шести місцях.

системне управління сервісом знає лише про сервісні підрозділи. Ці автоматично (повторно) створені сервісні блоки записуються для виклику rcсценаріїв van Smoorenburg . Серед них є:

[Одиниця]
SourcePath = / etc / init.d / wibble
[Сервіс]
ExecStart = / etc / init.d / wibble start
ExecStop = / etc / init.d / wibble stop

Мудрість полягає в тому, що rcсценарії van Smoorenburg повинні мати заголовок LSB і виконуються паралельно, не шануючи пріоритети, накладені /etc/rc?.d/системою. Це неправильно у всіх пунктах.

Насправді, вони не повинні мати LSB заголовка, і якщо вони не systemd-sysv-generatorможуть визнати більш обмежену стару RedHat коментар заголовки ( description:, pidfile:і так далі). Більше того, за відсутності заголовка LSB він повернеться до вмісту /etc/rc?.dсимволічних ферм посилань, зчитуючи пріоритети, закодовані у назви посилань, та будуючи до / після замовлення з них, серіалізуючи послуги. Мало того, що заголовки LSB не є вимогою, і вони не тільки кодують до / після замовлень, які серіалізують речі до певної міри, а резервна поведінка за їх повної відсутності насправді суттєво не паралельна операції.

Причина, яка /etc/rc3.dне мала значення, полягає в тому, що у вас, ймовірно, був включений цей скрипт через інший /etc/rc?.d/каталог. systemd-sysv-generatorперекладається, що перераховано в будь-якому з /etc/rc2.d/, /etc/rc3.d/і перебуває /etc/rc4.d/у рідних Wanted-Byстосунках до systemd multi-user.target. Рівні запуску "застаріли" у системному світі, і ви можете забути про них.

Подальше читання


2
В Debian каталог системи-генератори не живуть / USR / Lib, але / Lib packages.debian.org/sid/amd64/systemd/filelist
Braiam

5
Це прямо дивовижна відповідь. Молодці, сер.
пільман

1
Дякую, дякую, дякую за це! Співпраця з сумішшю систем Debian 8 та RH / CentOS 7 зробила управління залежністю від сервісу SysVInit проти управління системою Systemd трохи головним болем, але це пояснення того, що робить systemd, дуже допомогло мені зрозуміти.
Тобі

Цей генератор працює. Я також зазначу, що для підписників, якщо у вас є старіша версія systemdі /etc/init.d скрипт не встановлено "завантажуватися при запуску", він все одно буде працювати, як очікувалося, але не з'явиться в списки шоу-груп: unix.stackexchange.com/a/518894/8337
rogerdpack

Цей генератор працює. Я також зазначу, що для прихильників, якщо у вас є старіша версія systemd та сценарій /etc/init.d, який не встановлено на "завантажувати при запуску", він все одно запуститься / зупиниться, як очікувалося, використовуючи systemctl, але виграв не відображатись у списках шоу-одиниць: unix.stackexchange.com/questions/517872/… також зауважте, що ви в основному "не можете" керувати цією службою, запускаючи /etc/init.d/xx більше або запускаючи systemd ... плутати щодо того, що працює, а що ні: |
rogerdpack

17

Systemd є зворотним сумісним із сценаріями SysV init. Відповідно до LSB 3.1, сценарій init повинен мати інформаційні конвенції про коментарі , що визначають, коли сценарій повинен запускатися / зупинятися і що потрібно для запуску / зупинки сценарію. Це приклад:

### BEGIN INIT INFO
# Provides: my-service
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop service my-service
# Description: my-service blah blah ...
### END INIT INFO

Це коментований розділ, який SysV ігнорує. З іншого боку, systemd зчитує цю інформацію про залежність та запускає ці сценарії залежно від цього.

Але є один момент, коли systemd і SysV різняться за сценаріями init. SysV виконує сценарії в послідовному порядку, виходячи з їх кількості в імені файлу. Сидд не робить. Якщо залежності задовольняються, systemd запускає сценарії негайно, не вшановуючи нумерацію імен сценарію. Деякі з них, швидше за все, вийдуть з ладу через замовлення. Є багато інших несумісностей, які варто врахувати.


Якщо для однієї служби є скрипти init та .service-файли, systemd виконає обидва, як тільки будуть виконані залежності (у випадку сценарію init - тих, що визначені в заголовку LSB).


Гаразд, але у мене також є ціла купа файлів .service в / lib / systemd / system /. Що насправді виконує systemd? Що б вказано у службових файлах (у порядку залежності), сценаріях init.d чи обох?
Мартін Дройцбург

@MartinDrautzburg Я додав, що у відповідь
хаос

1
Як сторонне позначення, Debian щойно оголосив про скидання сумісності LSB: Article.gmane.org/gmane.linux.debian.devel.lsb/1103
січня

systemd - це все, але НЕ сумісне зі сценаріями SysV. Не тільки те, що це твердження є невірним, але і посилання, що посилається, дає зрозуміти, що воно лише "здебільшого сумісне", а кількість зусиль, необхідних для отримання тих же результатів, надзвичайно величезна.
Джулі в Остіні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.