Systemd все еще знает об уровнях запуска?

17

Есть ли в systemd концепция уровней запуска? Например бессмысленно ли пользоваться telinit <number>?

drpaneas
источник
2
Возможный дубликат изменения уровня запуска с помощью systemd
Стивен Харрис
я не знаю об ответах ниже, но в RHEL / Centos 7.6 init 1или init 3или init 5или init 6или init 0или runlevelвсе еще веду себя так, как они всегда, и это все, что меня волнует. Гораздо проще синтаксис, тоsystemctl blabla blabla.blabla
Рон

Ответы:

14

SystemD Run-Level Low-Down

В SystemD (aemon) уровни выполнения выставляются как «цели». Концепция все еще там, но рабочий процесс для получения желаемого результата для вашего требования отличается.

Прилагаемый должен прояснить этот вопрос.

Как мне изменить текущий уровень выполнения?

$ systemctl isolate runlevelX.target

Как изменить уровень запуска по умолчанию для следующей загрузки?

# Create a symlink
$ ln -sf /usr/lib/systemd/system/multi-user.target /etc/systemd/system/default.target
  • ln -sf TARGET DESTINATION
  • -s создает символическую ссылку
  • -f удаляет существующий файл назначения

ИЛИ (как предложено @centimane) просто используйте команду "blessed" systemd:

systemctl set-default [target name].target

Как определить текущий уровень выполнения?

$ systemctl list-units --type=target
Тайлер Магиннис
источник
Могу ли я использовать команду init для переключения между уровнями выполнения?
drpaneas
2
Если ваш пакет systemd собран с поддержкой SysV compat, он будет включать символическую ссылку telinit на двоичный файл systemd, который, когда он называется telinit, отобразит уровни выполнения 0-6 на цели systemd - проверьте telinit (8) для получения списка этих отображений ,
Виланд
2
Чтобы изменить цель по умолчанию, вы должны использовать, systemctl set-default [target name].targetа не создавать ссылку вручную.
Сентимане
13

Нет. Поскольку сами системные пользователи писали дважды, один раз в своем telinitруководстве и один раз в своем runlevelруководстве, уровни выполнения «устарели». Вы можете забыть об уровнях запуска.

Эти вещи на самом деле вообще не существуют в systemd, за исключением нескольких совместимостей.

  • Есть несколько символических ссылок для имен целей, но эти цели фактически никогда не используются собственно systemd.
    • Скорее, процесс начальной загрузки использует default.target(и, следовательно, один или оба из a graphical.targetи a multi-user.target), a rescue.targetили an emergency.target. И процесс выключения включает в себя shutdown.target, а reboot.target, а halt.targetили а poweroff.target. Цели на уровне выполнения не задействованы ни в начальной загрузке, ни в завершении работы.
    • Команда telinit, которая, как можно подумать, использует символические ссылки совместимости для сопоставления аргументов командной строки, также не делает этого. Там в проводному таблицы в исходном коде telinitпрограммы, а числа 2, 3, 4и , 5как аргументы команды являются жестко сопоставить multi-user.targetи graphical.target.
    • systemd-update-utmp также имеет внутренний проводной стол.
  • Не существует "таблицы инициализации" вещей уровня запуска. systemd совместим только с van Smoorenburg rc, но не с van Smoorenburg init.
  • Не существует значения «текущий уровень запуска», поддерживаемого самой systemd. Скорее, почти полностью недокументированная systemd-update-utmpкоманда работает внутри с точки зрения состояний активации rescue.target, multi-user.targetи graphical.target.
  • systemd-sysv-generatorГенератор сервисных модулей обратной совместимости systemd объединяет /etc/rc[234].dкаталоги только в одно Wanted-Byотношение multi-user.targetсгенерированных сервисных модулей. Нет фактической ссылки на уровни выполнения в сгенерированных единицах обслуживания. (Это было много лет назад, но системные люди обнаружили, что это пошло не так, потому что на них больше не ссылались.)

Если вы являетесь пользователем системы, которая собирает systemd, как это делал Arch Linux для спрашивающего в разделе «Почему` init 0` приводит к «Избыточным аргументам» при установке Arch? », То вы даже не получаете совместимые прокладки и команды такого типа. как init 0результат "родного" поведения systemd, которое должно жаловаться, что команда была вызвана неправильно.

дальнейшее чтение

JdeBP
источник
4

Огромное спасибо. Итак, если я правильно понял:

Например:

ls -ll /usr/lib/systemd/system/runlevel*.target

Выход:

/usr/lib/systemd/system/runlevel0.target -> poweroff.target
/usr/lib/systemd/system/runlevel1.target -> rescue.target
/usr/lib/systemd/system/runlevel2.target -> multi-user.target
/usr/lib/systemd/system/runlevel3.target -> multi-user.target
/usr/lib/systemd/system/runlevel4.target -> multi-user.target
/usr/lib/systemd/system/runlevel5.target -> graphical.target
/usr/lib/systemd/system/runlevel6.target -> reboot.target

Итак, как вы можете видеть, концепция уровней запуска действительно существует, но она довольно устарела из-за того, что файлы runlevel.target на самом деле не являются «настоящими» файлами, а представляют собой программные ссылки на новую, современную схему файлов с лучшими именами, которая systemd любит называть их «целями».

Итак, если вы хотите сделать telinit 5что-то вроде этого, это будет выглядеть так: systemctl isolate runlevel5.target что совпадает с: systemctl isolate graphical.target(рекомендуется на мой взгляд).

На всякий случай вам интересно узнать все возможные цели:

ls /usr/lib/systemd/system/*.target
drpaneas
источник
Да, я считаю, что вы все правильно поняли. Я буду поздним последователем SystemD, поскольку процедурная, пошаговая, INIT.D система - это то, с чем я больше всего знаком ... Я приветствую, что вы изучаете SystemD. Лучшая часть SystemD - это параллельная многопоточность, которая обеспечивает более быструю загрузку. Многопоточная загрузка может быть выполнена с INIT.D, но требует сильного сценария BASH.
Тайлер Магиннис,
Кстати, ls -llэквивалентно ls -l. Возможно, вы захотите привыкнуть к использованию ls -ld.
G-Man говорит «Восстановить Монику»
telinit 0/ telinit 6еще работаю. Поскольку это помогает с миграцией, и я думаю, что большинство дистрибутивов до сих пор не видят причины для отказа от поддержки. isolateясно стремился подражать, как работают уровни выполнения, но есть различные случаи злого края. Я настоятельно рекомендую игнорировать все инструкции isolate runlevel5.targetили даже isolate graphical.target. Пример
крайнего
0

systemd представил цели в качестве аналога уровней запуска в системе инициализации sysV. Разработчики sytemd сделали его практически совместимым с большинством сценариев sysV. То же самое происходит для telinit <runlevel>. Это переводится в системный эквивалент.

Например, telinit 0выключает машину. systemd имеет poweroff.target, чтобы сделать то же, что и уровень запуска 0 . Так telinit 0переводится systemd для активации poweroff.target .

Но есть некоторые проблемы совместимости с системами инициализации sytemd и sysV-> https://www.freedesktop.org/wiki/Software/systemd/Incompatibilities .

принц
источник