Яка різниця між цими командами для збиття сервера Linux?


65

Читання "Яка різниця між командами Halt і Shutdown?" , Я, як правило, маю уявлення про те, що робить відключення команди з параметрами -h / -r або без них.

Команда "зупинка" виконує відключення живлення системи до рівня 0 системи.

Команда "shutdown" виконує вимкнення системи для запуску рівня 1 без команди -h або -r.

Як щодо команди "poweroff" це переходить у рівень запуску 0 або 1? Це єдина основна відмінність цих трьох команд?



Це деякі речі, які суттєво відрізняються, наприклад, Solaris та FreeBSD. (Там вони, як правило, (майже) негайно зупиняють / вимикають сервер, не змінюючи робочих рівнів, щоб спочатку вимкнути речі)
Герт ван ден Берг

Відповіді:


120

А тепер системна відповідь.

Ви використовуєте, відповідно до тегу свого запитання, Red Hat Enterprise Linux. Починаючи з версії 7, що використовує systemd. Жодна з інших відповідей не є правильною для світу systemd; ні навіть деякі припущення у вашому питанні.

  • Забудьте про рівні пробігу ; вони існують, але лише у міру сумісності. У системній документації зазначено, що поняття "застаріло". Якщо ви починаєте вивчати цей матеріал у системній операційній системі, не починайте з цього.
  • Забудьте про сторінку керівництва, яку цитував marcelm; це зовсім не з потрібного набору інструментів і є описом іншої команди набору інструментів, неправильної для systemd. Це haltкоманда від initкомунальних служб van Smoorenburg "Система 5" .
  • Ігноруйте твердження, які /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)системний виклик. Ядро намагатиметься відключити живлення від системи, якщо це можливо.

Це те, про що ви повинні думати, як фінальна система констатує, а не запуску рівнів. З діаграми зауважте, що сама системна цільова система кодує речі, які в інших системах є неявними, а не явними: такі як поняття, що кожна з цих кінцевих цілей охоплює 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програми.

Примітки:

  • Традиційною поведінкою без опцій shutdown nowбуло перехід на режим одного користувача . Це не так з системою. 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програми, а не для systemctlпрограми. systemdПрограма не обов'язково скомпільовано з будь-сумісністю ван Smoorenburg на всіх, і на деяких операційних системах Systemd скаржиться на час виклику неправильно , якщо один спроб .init N

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


1
Це дуже загальне для більшості сучасних систем Linux, тому, наприклад, відповідає wiert.me/2012/12/30/… Після всіх цих років цікаво, я нарешті розумію, що відбувається і чому.
Jeroen 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інструкції, які зупиняють центральний процесор (CPU) до наступного зовнішнього переривання.

  • 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повинен бути таким же, як і зупинка системи, хоча конкретні кроки, що вживаються, залежатимуть від відповідної системи init, наприклад, System-V init , upstart або systemd . Якщо ви використовуєте RHEL, ви б використовували systemd.
Томас Найман

4
Зауваження для себе: щоразу, коли хтось скаржиться на запеклий виклик API Win32, показуйте їм перезавантаження (2).
користувач253751

@immibis Але перезавантаження цілеспрямовано є прихованою. Це вимагає чарівних прапорів, щоб це було дуже важко зробити випадково.
Кевін Кокс

4
@KevinCox Це аргумент для того, щоб вимагати магічних прапорів. Це не аргумент для прийняття 4 різних значень для magic2, ні для поведінки по-різному в просторі імен PID, ні для згуртування декількох ледь пов'язаних операцій (наприклад, встановлення перезавантаження на Ctrl-Alt-Delete поведінки) в одну функцію.
користувач253751

1

halt, poweroffі shutdown -hє абсолютно рівнозначними. Насправді, зупинка та потужність не роблять нічого, крім дзвінка shutdown -h. Від сторінки зупинки / потужності:

Якщо викликається зупинка або перезавантаження, коли система не знаходиться в рівні 0 або 6, іншими словами, коли вона працює нормально, замість неї буде викликано вимкнення (зі знаком -h або -r). Для отримання додаткової інформації див. Сторінку закриття (8).

Потім відключення переходить до вимкнення системи, перейшовши на рівень 0.

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


2
Яку версію RHEL ви використовуєте? Зазвичай існує різниця між зупинкою та потужністю (хоча деякий час це було не так у багатьох дистрибутивах, але це була помилка).
Бруно
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.