Как отключить питание при отсутствии systemd / init (например, используя init = / bin / bash)?


9

poweroffжалуется, что не может подключиться к systemd через DBus (конечно, он не жив). syncЗатем я решил kill $$, что умирание pid 1 вызовет выключение ядра, но это вызвало панику ядра. Затем я удерживал кнопку питания, чтобы выключить питание.

Какой самый правильный способ отключения питания в этом сценарии?


Существует негласная неявная предпосылка вопроса, что установлен набор инструментов systemd. Когда «нет systemd» на самом деле означает, что не установлен ни один набор инструментов systemd, поэтому заголовок также можно прочитать, ответы довольно разные; и это, вероятно, стоит отдельный вопрос сам по себе.
JdeBP

@JdeBP Вы правы в том, что, читая только заголовок и игнорируя init=/bin/bashподсказку / подтекст, двусмысленно, установлен systemd или нет. Я имел в виду, что systemd не работает . В любом случае, не запустив systemd, я думал, что набор инструментов systemd будет бесполезен, и что в ответах будут использоваться другие средства, такие как в sysrq.
JoL

Ответы:


10

Размонтируйте файловые системы, которые вы смонтировали. Корневая файловая система - это особый случай; для этого вы можете использовать mount / -o remount,ro. В Linux umount /тоже бывает работать, потому что он эффективно преобразуется в предыдущую команду.


Тем не менее, вам не нужно беспокоиться о размонтировании слишком много, если

  1. Вы смонтировали старую файловую систему, такую ​​как FAT, которая используется системным разделом EFI, или ext2, которая не поддерживает журналирование или эквивалент. С современной файловой системой, syncдолжно быть, достаточно, и файловая система будет восстанавливаться очень быстро при следующей загрузке.
  2. Возможно, вы оставили запущенный процесс, который пишет в файловую систему, и вы намеревались завершить его полностью. В этом случае полезно попытаться размонтировать файловые системы, потому что размонтирование завершится с ошибкой и покажет ошибку занятости, чтобы напомнить вам об оставшемся модуле записи.

Выше это важная часть. После этого вы также можете удобно отключить аппаратное обеспечение с помощью poweroff -f. Или перезагрузите с reboot -f.

Существует systemd-специфический эквивалент poweroff -f: systemctl poweroff -f -f. Однако poweroff -fделает то же самое и systemdподдерживает эту команду, даже если она была собрана без совместимости с SysV.


Технически я помню, что мой жесткий диск USB был задокументирован как требующий «безопасного удаления» Windows или аналогичного. Но это требование небезопасно, и в любом случае Linux не делает этого во время обычного выключения. Это лучше интерпретировать как означающее, что вы не должны бегать по жесткому диску во время его вращения, в том числе пытаясь отключить его от сети. Полное отключение должно остановить вращение привода. Вы можете услышать, почувствовать или посмотреть, не остановится ли это :-).


Просто чтобы ты знал, я не забываю принять. Просто я видел совет подождать некоторое время, прежде чем принять ответ, чтобы другие (возможно, в разных часовых поясах) увидели вопрос и имели возможность предоставить свои собственные ответы.
JoL

sync()достаточно для ext2. Он будет жаловаться на то, что он грязный, но на самом деле не будет поврежден, за исключением сводной информации. Обычно я считаю init = / bin / bash или любой другой локальный эквивалент аварийной ситуацией.
Джошуа

@ Joshua ext2 fsck потрясающе . Но производительность fsck на больших файловых системах намного хуже, чем при воспроизведении журнала. В чрезвычайной ситуации вы не хотите, чтобы вас задерживали из-за нечистого демонтажа.
sourcejedi

Вы знаете о fsck.mode=skipправе?
Джошуа

3
@ Джошуа, который имеет отношение, почему? Если вы выполните нечистое демонтирование, вам, в конечном счете, нужно будет восстановить ФС. Не используйте fsck.mode=skipдля нормальной загрузки после нечистого размонтирования!
sourcejedi

5

Я просто выполню ниже две команды:

echo s > /proc/sysrq-trigger    <= For sync
echo o > /proc/sysrq-trigger    <= For shutdown the system

Предполагая, что магический ключ включен в ядре


4

Хорошо, так что мне пришло в голову, что у меня была возможность exec init. Оттуда я, вероятно, смогу позже poweroff. Интересно, есть ли лучшие альтернативы, хотя?


@ G-Man не запустит нормальный процесс загрузки и не даст ли вам нормальную оболочку?
Муру

2
@muru Ты можешь сделать exec init 0. Это не будет работать со всеми системами инициализации, но те же самые будут проходить последовательность выключения.
Остин Хеммельгарн

1
Я думаю, что это действительно хороший ответ по другим причинам; особенно потому, что в большинстве случаев отключение питания нежелательно, так как перезагрузка, и это позволяет избежать перезагрузки после устранения ущерба.
Джошуа

1
@Joshua Это удобно, но если вы хотите быть максимально безопасным, часто неплохо проверить, работает ли процесс полной загрузки :-).
sourcejedi

3

По сути, вы хотите вызвать системный вызов reboot (2) .

Это можно сделать двумя способами:

  1. Запустите reboot -fили poweroff -f, это должно позвонить reboot(2)напрямую.

  2. Если вы используете настоящий виртуальный терминал Linux (не эмулятор терминала с графическим интерфейсом пользователя), нажмите Ctrl+ Alt+ Delete.

Обратите внимание, что сочетание клавиш может быть отключено какой-либо программой пользовательского пространства (обычно init), когда эта опция отключена, она отправит сигнал init.

Все вышеперечисленные команды должны быть выполнены после размонтирования всех дисков или перемонтирования в режиме «только чтение» и выполнения синхронизации, в противном случае вы можете потерять неписанные данные. Если ваша оболочка - единственный запущенный процесс, синхронизации может быть достаточно.


1

Вы можете использовать ключи Magic SysRq ( https://en.wikipedia.org/wiki/Magic_SysRq_key ), чтобы выключить компьютер.

Чтобы правильно завершить работу, вы можете использовать следующее (цитата из Википедии):

Обычное использование волшебного ключа SysRq - безопасная перезагрузка компьютера с Linux, который в противном случае заблокирован ( сокращенно REISUB ). Это может предотвратить fsckнеобходимость перезагрузки и дает некоторым программам возможность сохранять аварийные резервные копии несохраненной работы. [5]   QWERTY - (или AZERTY) Мнемоника: " R aising Е lephants Я с S о U tterly В ORing", " R Eboot Е VEN Я F S ystem U tterly Бroken "или просто слово" BUSIER ", читаемое в обратном направлении, часто используется для запоминания следующей последовательности ключей SysRq:

  • un Raw (вернуть контроль над клавиатурой из X),
  • t Erminate (отправьте SIGTERM всем процессам, позволяя им завершить работу корректно),
  • k Ill (отправить SIGKILL всем процессам, заставив их немедленно прекратить работу),
  • Sync (сбросить данные на диск),
  • Unmount (перемонтировать все файловые системы только для чтения),
  • повторно BОКТ.

Но заменив последний B на O (для azerty / qwerty) на «power O ff»


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.