Jak wyłączyć, gdy nie ma systemd / init (np. Używając init = / bin / bash)?

9

poweroffnarzeka, że ​​nie może połączyć się z systemd przez DBus (oczywiście nie żyje). I nie syncnastępuje kill $$, myśląc, że będzie umierał PID 1 cue jądra do poweroff, ale to wywołało panikę jądra. Następnie przytrzymałem przycisk zasilania, aby wymusić wyłączenie zasilania.

Jaki jest najbardziej odpowiedni sposób na wyłączenie zasilania w tym scenariuszu?

JoL
źródło
Istnieje niejawna domniemana kwestia, czy zestaw narzędzi systemowych jest zainstalowany. Kiedy „nie ma systemd” oznacza w rzeczywistości, że nie jest zainstalowany zestaw narzędzi systemowych, tak też można odczytać tytuł, odpowiedzi są raczej różne; i to prawdopodobnie jest warte osobnego pytania.
JdeBP,
@JdeBP Masz rację, czytając tylko tytuł i ignorując init=/bin/bashwskazówkę / implikację, nie jest jednoznaczne, czy systemd jest zainstalowany, czy nie. Miałem na myśli, że nie ma uruchomionego systemu . W każdym razie, nie mając uruchomionego systemd, pomyślałem, że zestaw narzędzi systemd byłby bezużyteczny i że odpowiedzi wykorzystałyby inne środki, takie jak te dotyczące sysrq.
JoL,

Odpowiedzi:

10

Odmontuj zamontowane systemy plików. Główny system plików to szczególny przypadek; do tego możesz użyć mount / -o remount,ro. W Linuksie umount /również działa, ponieważ jest skutecznie konwertowany na poprzednie polecenie.


To powiedziawszy, nie musisz się martwić zbytnim odmontowaniem, chyba że

  1. Zainstalowałeś stary system plików, taki jak FAT - używany przez partycję systemową EFI - lub ext2, który nie implementuje kronikowania lub równoważnego. Przy nowoczesnym systemie plików syncma to wystarczyć, a system plików naprawi się bardzo szybko przy następnym uruchomieniu.
  2. Możliwe, że zostawiłeś działający proces, który zapisuje system plików, i zamierzałeś go całkowicie zamknąć. W takim przypadku warto spróbować odmontować systemy plików, ponieważ umount nie powiedzie się i wyświetli błąd zajętości, przypominający o pozostałym programie piszącym.

Powyższe jest ważną częścią. Następnie możesz wygodnie wyłączyć sprzęt za pomocą poweroff -f. Lub uruchom ponownie za pomocą reboot -f.

Jest systemd-specyficznych odpowiednik poweroff -f: systemctl poweroff -f -f. Jednak poweroff -frobi to samo i systemdobsługuje to polecenie, nawet jeśli zostało zbudowane bez kompatybilności z SysV.


Technicznie pamiętam, że mój dysk twardy USB został udokumentowany jako wymagający „bezpiecznego usunięcia” systemu Windows lub równoważnego. Ale to wymaganie nie jest bezpieczne dla PowerFail, a Linux i tak nie robi tego podczas normalnego zamykania. Lepiej jest to interpretowane jako oznaczające, że nie należy biegać po dysku twardym, gdy się obraca - w tym próbując go odłączyć. Całkowite wyłączenie zasilania powinno zatrzymać wirowanie napędu. Prawdopodobnie możesz usłyszeć, poczuć lub zobaczyć, czy to się nie skończy :-).

sourcejedi
źródło
Właśnie dlatego wiesz, że nie zapomnę zaakceptować. Po prostu widziałem radę, aby poczekać chwilę, zanim zaakceptuję odpowiedź, aby inni (być może w różnych strefach czasowych) mogli zobaczyć pytanie i mieć szansę na udzielenie własnych odpowiedzi.
JoL,
sync()wystarcza na ext2. Będzie narzekać na brudność, ale tak naprawdę nie zostanie uszkodzony, z wyjątkiem informacji podsumowujących. Generalnie uważam, że init = / bin / bash lub jakikolwiek lokalny ekwiwalent to sytuacja wyjątkowa.
Jozuego
@Joshua ext2 fsck jest niesamowity . Ale wydajność fsck na dużych systemach plików jest znacznie gorsza niż powtarzanie dziennika. W sytuacji awaryjnej nie chcesz opóźniać się z powodu nieczystego odmontowania.
sourcejedi
Wiesz o czym fsck.mode=skip?
Joshua,
3
@Joshua, co jest ważne, dlaczego? Jeśli zrobisz nieczystego odmontowania, w końcu będziesz musiał naprawić FS. Nie używaj fsck.mode=skipdo uruchamiania normalnie po nieczystym odmontowaniu!
sourcejedi
5

Po prostu wykonam poniżej dwóch poleceń:

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

Zakładając, że magiczny klucz jest włączony w jądrze

SHW
źródło
4

Ok, więc przyszło mi do głowy, że mam taką opcję exec init. Stamtąd prawdopodobnie byłbym w stanie później poweroff. Zastanawiam się jednak, czy są lepsze alternatywy.

JoL
źródło
@ G-Man, czy nie rozpocznie normalnego procesu rozruchu i nie da ci normalnej powłoki?
muru
2
@muru Możesz zrobić exec init 0. To nie zadziała ze wszystkimi systemami init, ale te same przejdą sekwencję zamykania.
Austin Hemmelgarn,
1
Myślę, że to naprawdę dobra odpowiedź z innych powodów; tym bardziej, że większość przypadków wyłączania zasilania nie jest tak pożądana jak ponowne uruchomienie, co pozwala uniknąć ponownego uruchomienia komputera po naprawieniu uszkodzenia.
Jozuego
1
@Joshua Jest to wygodne, ale jeśli chcesz być najbezpieczniejszy, często dobrym pomysłem jest sprawdzenie pełnego procesu uruchamiania :-).
sourcejedi
3

W efekcie tou chce wywołać syscall reboot (2) .

Możesz to zrobić na dwa sposoby:

  1. Uruchom reboot -flub poweroff -f, to powinno zadzwonić reboot(2)bezpośrednio.

  2. Jeśli korzystasz z wirtualnego terminala Linux (nie emulatora terminala GUI), naciśnij Ctrl+ Alt+ Delete.

Zauważ, że skrót klawiaturowy może zostać wyłączony przez jakiś program użytkownika (zwykle init), kiedy wyłączony skrót wyśle ​​sygnał do init zamiast tego.

Wszystkie powyższe polecenia należy wykonać po zamontowaniu wszystkich dysków lub ponownym zamontowaniu jako tylko do odczytu i uruchomieniu synchronizacji, w przeciwnym razie możesz utracić niepisane dane. Jeśli twoja powłoka jest jedynym uruchomionym procesem, synchronizacja może wystarczyć.

Lie Ryan
źródło
1

Możesz użyć klawiszy Magic SysRq ( https://en.wikipedia.org/wiki/Magic_SysRq_key ), aby wyłączyć komputer.

Aby poprawnie zamknąć, możesz użyć następujących (cytat z Wikipedii):

Powszechnym zastosowaniem magicznego klucza SysRq jest bezpieczne ponowne uruchomienie komputera z systemem Linux, który w innym przypadku został zablokowany (skrót REISUB ). Może to zapobiec fsckkonieczności ponownego uruchamiania komputera i daje niektórym programom szansę na zapisanie awaryjnych kopii zapasowych niezapisanej pracy. [5]   QWERTY (lub AZERTY) mnemoniki " R aising e lephants I s S O U tterly B sumowaniem", " R eboot e ven I f S ystem U tterly Broken ”lub po prostu słowo„ BIZNES ”odczytywane wstecz, są często używane do zapamiętania następującej sekwencji klawiszy SysRq:

  • un Raw (przejmij kontrolę nad klawiaturą z X),
  • t Erminate (wyślij SIGTERM do wszystkich procesów, pozwalając im zakończyć się płynnie),
  • k Ill (wyślij SIGKILL do wszystkich procesów, zmuszając ich do natychmiastowego wypowiedzenia),
  • Sync (opróżnij dane na dysk),
  • Unmount (zamontuj wszystkie systemy plików tylko do odczytu),
  • re Boot.

Ale podstawienie ostatniego B przez O (dla azerty / qwerty) zamiast „power O ff”

breversa
źródło