В чем разница между этими командами для отключения сервера Linux?

65

Чтение "В чем разница между командами остановки и выключения?" Я обычно имею представление о том, что делает команда shutdown, с опциями -h / -r или без них.

Команда "halt" выполняет отключение системы до уровня 0 системы.

Команда «shutdown» выполняет выключение системы для запуска уровня 1 без команды -h или -r.

А как насчет команды "poweroff", которая входит в уровень выполнения 0 или 1? Это единственное основное различие между этими тремя командами?

Win.T
источник
Связанный askubuntu.com/q/578144/216503
Heemayl
Это некоторые вещи, которые значительно различаются, например, для Solaris и FreeBSD. (Там они обычно (почти) немедленно останавливают / выключают сервер, не изменяя уровни выполнения, чтобы сначала завершить работу)
Герт ван ден Берг

Ответы:

120

А теперь системный ответ.

В соответствии с тегом вашего вопроса вы используете Red Hat Enterprise Linux. Начиная с версии 7, он использовал systemd. Ни один из других ответов не верен для мира systemd; и даже не некоторые из предположений в вашем вопросе.

  • Забудьте об уровнях выполнения ; они существуют, но только как совместимость прокладок. Документация systemd гласит, что концепция «устарела». Если вы начинаете изучать этот материал в операционной системе systemd, не начинайте там.
  • Забудьте о странице руководства, которую цитировал Марсельм; это вовсе не из правильного набора инструментов, а описание команды другого набора инструментов, неправильное для systemd. Это для haltкоманды из Ван Смуренбурга утилиты "Система 5" init.
  • Игнорируйте утверждения, которые /sbin/haltявляются символической ссылкой на /sbin/reboot; это не так с systemd. Там нет отдельной rebootпрограммы вообще.
  • Игнорировать операторы, которые haltили rebootвызывают shutdownпрограмму с аргументами командной строки; они также не верны с systemd. Там нет отдельной shutdownпрограммы вообще.

Каждый набор инструментов для управления системой имеет свою версию этих утилит. Systemd, выскочка, перекус , ван Smoorenburg initи BSD initвсе имеют свои собственные halt, poweroffи так далее. На каждой их механика немного отличается. Как и их справочные страницы.

В Systemd набор инструментов halt, poweroff,reboot , telinit, и shutdownявляются все символические ссылки /bin/systemctl. Они все регулировочные шайбы с обратной совместимостью, которые просто сокращение для вызова интерфейса первичного командной строки Systemd в: systemctl. Они все на карте (и на самом деле являются) той же одной программе. (По соглашению оболочка сообщает ему, по какому имени она была вызвана.)

цели, а не уровни выполнения

Большинство из этих команд являются сокращениями для сообщения systemd, используя systemctlдля выделения конкретной цели . Изоляция объяснена на systemctlстранице руководства (см. В разделе qv), но для целей этого ответа ее можно рассматривать как начало цели и остановку любых других. Стандартные цели, используемые в systemd, перечислены на systemd.specialстранице руководства (8).

Диаграммы на bootupстранице руководства (7) в наборе инструментов systemd, в частности на последней, показывают, что здесь есть три «конечные» цели:

  • halt.target- Как только система достигнет состояния полной изоляции этой цели, она вызовет reboot(RB_HALT_SYSTEM)системный вызов. Ядро попытается войти в программу монитора ПЗУ или просто остановит ЦП (используя любой подходящий для этого механизм).
  • reboot.target- Как только система достигнет состояния полной изоляции этой цели, она вызовет reboot(RB_AUTOBOOT)системный вызов (или эквивалент магической командной строки). Ядро попытается запустить перезагрузку.
  • poweroff.target- Как только система достигнет состояния полной изоляции этой цели, она вызовет reboot(RB_POWER_OFF)системный вызов. Ядро будет пытаться отключить питание системы, если это возможно.

Это то , о чем вы должны думать, как о конечной системе, а не о прохождении уровней. Обратите внимание на диаграмму, что целевая система systemd сама кодирует вещи, которые в других системах являются неявными, а не явными: например, представление о том, что каждая из этих конечных целей охватывает shutdown.targetцель, так что описываются службы, которые должны быть остановлены перед выключением имея их в конфликт с к shutdown.targetцели.

systemctlпытается отправить запросы, systemd-logindкогда вызывающий пользователь не является суперпользователем. Он также передает отложенные отключения на systemd-shutdownd. И некоторые сокращения вызывают wallуведомления. Помимо тех сложностей, которые могут сделать этот ответ в несколько раз длиннее, если вы в данный момент являетесь суперпользователем и не запрашиваете запланированное действие:

  • systemctl isolate halt.target имеет короткие номера:
    • shutdown -H now
    • systemctl halt
    • просто без украшений halt
  • systemctl isolate reboot.target имеет короткие номера:
    • shutdown -r now
    • telinit 6
    • systemctl reboot
    • просто без украшений reboot
  • systemctl isolate poweroff.target имеет короткие номера:
    • shutdown -P now
    • telinit 0
    • shutdown now
    • systemctl poweroff
    • просто без украшений poweroff
  • systemctl isolate rescue.target имеет короткие номера:
    • telinit 1
    • systemctl rescue
  • systemctl isolate multi-user.target имеет короткие номера:
    • telinit 2
    • telinit 3
    • telinit 4
  • systemctl isolate graphical.target имеет стенографию:
    • telinit 5

После анализа различных синтаксисов командной строки все они в конечном итоге оказываются в одних и тех же путях кода внутри systemctlпрограммы.

Примечания:

  • Традиционное поведение параметра option-less shutdown nowзаключается в переключении в однопользовательский режим . Это не так с systemd. rescue.target- однопользовательский режим переименовывается в режим восстановления в systemd - недоступен с помощью shutdownкоманды.
  • telinit действительно полностью игнорирует все те и символические ссылки в файловой системе, которые описаны на страницах руководства. Вышеуказанные отображения встроены в программу в виде таблицы.runlevelN.targetdefault.targetsystemctl
  • systemd не имеет представления о текущем уровне выполнения . Работа этих команд не зависит от любого "если вы находитесь на уровне выполнения N ".
  • --forceВариант к halt, rebootи poweroffкоманды так же , как говорят --force --forceв systemctl halt, systemctl rebootи systemctl poweroffкоманду. Это заставляет systemctlпытаться позвонить reboot()напрямую. Обычно он просто пытается изолировать цели.
  • telinitэто не то же самое, что init. Это разные программы в мире systemd, последнее - другое название systemdпрограммы, а не systemctlпрограммы. systemdПрограмма не обязательно скомпилирован с любой совместимостью ван Smoorenburg на всех, и на некоторых операционных системах Systemd жалуется на время вызова неправильно , если один попыток .init N

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

JdeBP
источник
1
Это очень универсально для большинства современных систем Linux, так что, например, ответы wiert.me/2012/12/30/… После всех этих лет, когда я задаюсь вопросом, я наконец понимаю, что происходит и почему.
Йерун Wiert Pluimers
systemctl rebootдолжны быть эквивалентны systemctl start reboot.target --job-mode=replace-irreversible. Использование любого другого режима работы менее надежно. unix.stackexchange.com/questions/381739/…
sourcejedi
1
Я прочитал весь ваш ответ и впитал все, что мог. Остается один вопрос, тот самый systemctl reboot, к init 6которому я пришел, - это «безопасный» способ перезагрузки, например, каким способом мы могли бы в противном случае перезагрузить систему?
Брайан Томас
25
  • haltдает команду оборудованию остановить все функции процессора , но оставляет его включенным. Обычно это означает, что кто-то должен перезагрузить или выключить машину вручную, нажав кнопку питания впоследствии. Конкретный способ достижения этого зависит от архитектуры, но, например, набор команд x86 предоставляет HLTинструкции, которые останавливают центральный процессор (ЦП), пока не сработает следующее внешнее прерывание.

  • poweroffНапример halt, останавливает процессор, но также посылает аппаратный сигнал ACPI, который дает команду системе начать полное и немедленное отключение. Это примерно эквивалентно нажатию кнопки питания на обычном настольном компьютере.

Как haltи poweroffобычно символические ссылки на rebootисполняемый файл, который, как правило , ссылаться на shutdownинструменте с соответствующими аргументами ( -h, -Pили r) в зависимости от того, если halt, poweroffили rebootиспользуются для вызова инструмента. Однако при --forceпередаче этой опции rebootили при уровне выполнения 0 или 6 системный вызов rebootбудет вызван reboot()соответствующим кодом самой команды.

Томас Найман
источник
Томас, большое спасибо за объяснение. Мне интересно знать, что делать с #init 0, не так много различий, верно?
Win.T
@ Win.T Переключение на уровень запуска 0 с использованием, например, /sbin/init 0или /sbin/telinit 0должно совпадать с остановкой системы, хотя конкретные шаги будут зависеть от рассматриваемой системы инициализации, такой как System-V init , upstart или systemd . Если вы используете RHEL, вы будете использовать systemd.
Томас Найман
4
Примечание для себя: каждый раз, когда кто-то жалуется на непонятный вызов Win32 API, покажите им перезагрузку (2).
user253751
@immibis Но перезагрузка намеренно загадочна. Это требует волшебных флагов, так что это очень трудно сделать случайно.
Кевин Кокс
4
@KevinCox Это аргумент в пользу наличия магических флагов. Это не аргумент для принятия 4 разных значений для magic2, ни для поведения по-разному в пространстве имен PID, ни для объединения нескольких едва связанных операций (таких как установка поведения reboot-on-Ctrl-Alt-Delete) в одну функцию.
user253751
1

halt, poweroffИ shutdown -hполностью эквивалентны. На самом деле остановка и отключение питания делают только колл shutdown -h. Из справочной страницы:

Если остановка или перезагрузка вызывается, когда система не находится на уровне выполнения 0 или 6, другими словами, когда она работает нормально, вместо этого будет вызываться завершение работы (с флагом -h или -r). Для получения дополнительной информации см. Справочную страницу shutdown (8).

Выключение затем завершает работу системы, переключаясь на уровень выполнения 0.

Останов и отключение питания (и перезагрузка) выполняют двойную роль; при выполнении в процессе выключения (т. е. на уровне выполнения 0 или 6) они выполняют низкоуровневые операции, необходимые для физической остановки, выключения или перезагрузки машины, как описано в другом ответе.

marcelm
источник
2
Какую версию RHEL вы используете? Обычно между halt и poweroff есть разница (хотя какое-то время это было не так во многих дистрибутивах, но это было ошибкой).
Бруно