Ist es möglich, ein Linux-Betriebssystem neu zu starten, ohne die Hardware neu zu starten?

89

Gibt es eine Möglichkeit, ein Linux-System (insbesondere Debian) neu zu starten, ohne die Hardware neu zu starten?

Ich besitze einen RAID-Controller, dessen Start vor dem Start des Betriebssystems einige Zeit in Anspruch nimmt, und ich würde es begrüßen, wenn es eine Möglichkeit gäbe, das Linux-Betriebssystem schnell neu zu starten, ohne den gesamten Neustart des RAID-Controllers durchführen zu müssen. usw.

lacrosse1991
quelle
6
Alle UEFI-basierten Systeme können das Betriebssystem ohne Neustart wechseln. Du hast auch kexec()was ähnliches exec(), aber für Unix-Kernel.
user2284570

Antworten:

98

Ich verwende kexec-reboot auf fast allen meinen Produktionssystemen.

Es funktioniert unglaublich gut und ermöglicht mir, die lange POST-Zeit auf HP ProLiant Servern zu umgehen und den Startzyklus von 5 Minuten auf ~ 45 Sekunden zu verkürzen.

Siehe: https://github.com/error10/kexec-reboot

Die einzige Einschränkung ist, dass es auf RHEL / CentOS 6.x-Systemen, die UEFI booten, anscheinend nicht funktioniert. Die meisten vernünftigen OS / Hardware-Kombinationen funktionieren jedoch.

ewwhite
quelle
62
Ich habe das geschrieben! Aber es funktioniert immer noch ziemlich gut ...
Michael Hampton
1
Faszinierend. Wie sieht der eigentliche Prozess aus? In einem Artikel von Hariprasad Nellitheertha (auf der Wikipedia-Seite von Kexec verlinkt) heißt es: "Im Gegensatz zum normalen Neustart führt Kexec vor dem Neustart kein sauberes Herunterfahren des Systems durch. Sie müssen alle Anwendungen beenden und die Bereitstellung der Dateisysteme aufheben bevor Sie einen Kexec-Neustart versuchen. " Ich stelle einige fragwürdige Dinge fest, zum Beispiel, sagt Wim Coekaerts, dass "sync; umount -a; kexec -e" einen sehr schnellen Neustart durchführen wird. Ein ausgelastetes Dateisystem kann jedoch nicht entladen werden. Beim Durchsuchen des Webs scheinen viele den Teil "Alle Anwendungen beenden" zu ignorieren.
Mike S
2
@MikeS Das ist nicht kexec. Es ist das kexec-rebootDienstprogramm. Die Github-Beschreibung beschreibt den Unterschied und was das Dienstprogramm dem Prozess hinzufügt.
Ewwhite
4
@MikeS Nachdem Sie kexec bereitgestellt haben, führen Sie einfach einen shutdown -r. Ihre Systemskripte werden feststellen, dass kexec bereitgestellt wurde und das Richtige tun. Wie sieht es aus? Drei oder vier oder fünfzehn Minuten kürzer. Ich habe ein sehr schreckliches Qualitätsvideo, das ich von der iDRAC-Konsole genommen habe, aber Sie möchten wirklich nicht darunter leiden ... Das kexec-rebootSkript soll den Prozess automatisieren, die richtigen Befehlszeilenargumente an kexec zu senden, was schwierig sein kann .
Michael Hampton
1
@ MichaelHampton - cool. Ich sehe , dass auf CentOS 6.5 am Ende /etc/rc3d/rc6.d/S01reboot gibt es: [ -n "$kexec_command" ] && $kexec_command -e -x >& /dev/null. Wenn also ein Kernel von kexec -l geladen wird, wird das System neu gestartet, ohne dass / sbin / reboot abgeschlossen ist ... kexec ist eingebettet! Das wusste ich nicht, danke. Ich nehme an, dass modernere Distributionen dies ebenfalls behandeln. Übrigens, wenn kexec zuvor nicht mit -l ausgeführt wurde, wird im Neustart-Skript "Nothing has been loaded!" Angezeigt. Aus diesem Grund wird die Ausgabe an / dev / null gesendet, und ich habe diese Funktion nie bemerkt.
Mike S
17

Ja, es ist möglich. Mit kexec kann ein Linux-Kernel direkt von Linux aus gestartet werden, ohne dass der BIOS-Startvorgang ausgeführt werden muss.

Kasperd
quelle
Außerdem ermöglicht die UEFI das Umschalten des Betriebssystems ohne Neustart.
user2284570
1
@ user2284570 Soweit mir bekannt ist, bietet UEFI keinen solchen Mechanismus an.
Jonathon Reinhart
15

Ja. Sie müssen Kexec-Tools verwenden. Um das Leben einfacher zu machen, benutze ich Kexec-Neustart .

$sudo apt-get install kexec-tools
$wget https://raw.githubusercontent.com/vadmium/kexec-reboot/master/kexec-reboot
$chmod +x kexec-reboot
$sudo mv kexec-reboot /usr/local/sbin/kexec-reboot
$sudo /usr/local/sbin/kexec-reboot
Jose Raul Barreras
quelle
13
Damit es keine Verwirrung gibt, habe ich dies nicht geschrieben.
Michael Hampton
Dies ist wahrscheinlich nur Ubuntu / Debian, oder?
Ewwhite
1
@ewwhite Es würde wahrscheinlich auf RHEL / CentOS funktionieren, aber beim Lesen des Codes habe ich mehrere Problemstellen gefunden, an denen Edge-Cases dazu führen könnten, dass es fehlschlägt. Und die Quelle scheint dies mit einem Kommentar zu bestätigen:# The error checking is very basic.
Michael Hampton