Problemumgehung für GMO VPS (CentOS8.1) kann nach dem yum-Update nicht gestartet werden

Ich war gesegnet, dass ich nicht neu starten konnte, wenn ich beim Erstellen eines Servers (CentOS8.1) mit GMO VPS "yum update" ausführte. Änderungen an /boot/grub2/grub.cfg wurden während des yum-Updates vorgenommen, was der Effekt zu sein scheint. Um dies zu vermeiden, speichern Sie /boot/grub2/grub.cfg zu Beginn der Serverkonstruktion und stellen Sie es nach dem yum-Update wieder her.

Was für ein Symptom

Starten Sie den für GMO VPS verfügbaren Server (CentOS8.1) im normalen Modus über das VPS-Portal. Wenn er sich im Status "EIN" befindet, stellen Sie eine Verbindung mit TeraTerm her und melden Sie sich als Root an. Gleiches gilt, wenn Sie sich über die VPS-Portalkonsole anmelden. Führen Sie dann yum update aus und starten Sie den Server neu.


login: root
Password: ***
$ yum update -y
$ reboot

Dann können Sie keine Verbindung über TeraTerm herstellen, und der GRUB-Auswahlbildschirm wird über die Konsole des VPS-Portals geöffnet, und Sie können nicht fortfahren.

Warum es passiert

GRUB ist ein Bootloader zum Auswählen, wo das Betriebssystem-Image geladen und gestartet werden soll. Es gibt einen alten GRUB (GRUB Legacy) und einen neuen GRUB2. GRUB2 ist von CentOS7 oder höher. Wählen Sie aus, ob GRUB Legacy oder GRUB2 verwendet werden soll, welches Betriebssystem-Image verwendet werden soll, laden Sie das OS-Image und starten Sie das Betriebssystem. Normalerweise merkt sich das zu verwendende Betriebssystem-Image die Standardeinstellungen und die vom Benutzer zum ersten Mal ausgewählte und führt automatisch eine Reihe von Vorgängen aus. Es scheint jedoch, dass das Betriebssystem-Image nicht automatisch ausgewählt werden kann, indem yum update ausgeführt wird. Daher tritt bei TeraTerm beim Herstellen einer Verbindung eine Zeitüberschreitung auf, und von der Konsole des VPS-Portals wird beim Auswahlbildschirm von GRUB Legacy und GRUB2 angehalten.

Auf der VPS-Portalkonsole können möglicherweise GRUB-Befehle über den GRUB-Auswahlbildschirm verarbeitet werden. Ich gab früh auf, weil sich die Schlüsselbindung vom Windows-PC unterschied, ich nicht kopieren und einfügen konnte und den GRUB-Befehl nicht kannte.

In CentOS8.1 wird GRUB2 verwendet. Die Steuerung beim Start kann in der Datei / etc / default / grub angegeben werden. Geben Sie die Timeout-Sekunden mit "GRUB_TIMEOUT" und das Betriebssystem-Image mit "GRUB_DEFAULT" an. Das angegebene Betriebssystem-Image wird nach Ablauf der Timeout-Sekunden automatisch gestartet. Um genau zu sein, führen Sie den Befehl grub2-mkconfig im Voraus aus, um die Datei / boot / grub2 / grub.cfg basierend auf der Beschreibung der grub-Datei und den Dateien unter/ etc / grub.d /zu erstellen. Es wird generiert. Die Datei grub.cfg wird beim Start ausgeführt, nicht die Datei grub wird beim Start interpretiert. Weitere Informationen zu GRUB2 finden Sie unter https://documentation.suse.com/ja-jp/sles/12-SP4/html/SLES-all/cha-grub2.html.

Mit anderen Worten, aufgrund eines yum-Updates wurde die Datei grub.cfg neu geschrieben oder die Datei grub.cfg kann nicht wie beschrieben ausgeführt werden (z. B. fehlt die erforderliche Datei).

Es bezieht sich auch auf "/ boot / grub2 / grubenv" beim Booten. Dies speichert die Einstellungen vom vorherigen Start und wird beim nächsten Start referenziert. Wird verwendet, wenn GRUB_DEFAULT = gespeichert angegeben ist. Sie können den nächsten Start steuern, indem Sie die grubenv-Datei nach dem Start ändern. Sie können beispielsweise "saved_entry" direkt ändern, ohne / etc / default / grub zu durchlaufen, indem Sie den Befehl "grub2-set-default" ausführen.

Schritte zu vermeiden

Wenn Sie die Datei grub.cfg nach dem ersten Login speichern und nach dem yum-Update wiederherstellen, scheint dies ganz so zu sein. Das Verfahren wird unten beschrieben.

(1) Starten Sie den Server im normalen Modus über das VPS-Portal und melden Sie sich über TeraTerm als root an. Überprüfen Sie dann die Version im Ausgangszustand. CentOS 8.1.


$ cat /etc/redhat-release	
CentOS Linux release 8.1.1911 (Core) 

(2) Speichern Sie die folgenden Dateien im Voraus, da Sie nach dem yum-Update nicht mehr booten können. Eigentlich ist die Datei grub.cfg alleine in Ordnung, aber es ist auch gut, andere Dateien zu speichern.


$ cp /etc/default/grub /etc/default/grub.original
$ cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.original
$ cp /boot/grub2/grubenv /boot/grub2/grubenv.original

Tatsächlich wurde die grub-Datei bereits als "grub.rpmsave" gesichert, und die grub.cfg-Datei wurde auch als "grub.cfg.rpmsave" gesichert. Diese Dateien mögen ausreichen, aber im obigen Verfahren habe ich es explizit gemacht. Übrigens lautet / etc / default / grub wie folgt.


$ cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto biosdevname=0 net.ifnames=0 rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true
GRUB_DISABLE_UUID=true
GRUB_DISABLE_LINUX_UUID=true

GRUB_TIMEOUT und GRUB_DEFAULT geben an, dass das zuletzt verwendete Betriebssystem-Image nach 5 Sekunden Wartezeit gestartet werden soll. GRUB_DEFAULT wird durch eine Zahl wie 0,1,2, ..., durch den Namen des Betriebssystemabbilds oder durch "gespeichert" angegeben. Im Fall von "gespeichert" identifiziert der gespeicherte Eintrag in der Datei / boot / grub2 / grubenv das zuletzt verwendete Betriebssystem-Image.


$ cat /boot/grub2/grubenv
saved_entry=20db05bac820110f5800ebe2e7262b58-4.18.0-193.28.1.el8_2.x86_64
kernelopts=root=/dev/vda1 ro crashkernel=auto biosdevname=0 net.ifnames=0 rhgb quiet
boot_success=1

(3) Führen Sie ein yum-Update durch. Ausführen des betreffenden yum-Updates. Etwa 200 Module werden aktualisiert.


$ yum update -y

(4) Überprüfen Sie die Version nach dem yum Update. Es wurde auf CentOS 8.2 aktualisiert.


$ cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)

(5) Stellen Sie so ein, dass der Kernel in Zukunft nicht mehr durch yum update aktualisiert wird.


$ vi /etc/yum.conf
exclude=kernel*

(6) Stellen Sie die gespeicherte Datei grub.cfg wieder her. / etc / default / grub ist unverändert, daher ist keine Wiederherstellung erforderlich. grubenv wird beim Start aktualisiert, aber normalerweise ist der Inhalt der gleiche wie beim letzten Mal. Wenn Sie den Befehl grub2-set-default verwenden, wird grubenv neu geschrieben. In diesem Fall stellen Sie die Wiederherstellung wieder her.


$ cp /boot/grub2/grub.cfg.original /boot/grub2/grub.cfg
$ cp /boot/grub2/grubenv.original /boot/grub2/grubenv

$ awk -F\' '$1=="menuentry " {print $2}' /boot/grub2/grub.cfg
CentOS Linux (4.18.0-147.5.1.el8_1.x86_64) 8 (Core)

(7) Starten Sie zu diesem Zeitpunkt neu und bestätigen Sie, dass Sie sich über TeraTerm anmelden können.

(8) Bearbeiten Sie die Grub-Datei und spiegeln Sie sie mit dem Befehl grub2-mkconfig wider. In der Grub-Datei wird nur GRUB_CMDLINE_LINUX geändert. Überprüfen Sie dann, ob der durch saved_entry in der grubenv-Datei identifizierte in der Nachricht "Found Linux" gefunden wurde. Sie können auch das Ergebnis von awk überprüfen. Es ist ersichtlich, dass der Anfang (0.) anwendbar ist.


#Bearbeiten Sie die Grub-Datei
$ vi /etc/default/grub
GRUB_TIMEOUT=3
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap 
 vconsole.font=latarcyrheb-sun16 vconsole.keymap=jp106 
 biosdevname=0 net.ifnames=0 rhgb quiet "
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true
GRUB_DISABLE_UUID=true
GRUB_DISABLE_LINUX_UUID=true

# grub.Reflektieren Sie in der CFG-Datei
$ grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.18.0-193.28.1.el8_2.x86_64
Found initrd image: /boot/initramfs-4.18.0-193.28.1.el8_2.x86_64.img
Found linux image: /boot/vmlinuz-4.18.0-147.5.1.el8_1.x86_64
Found initrd image: /boot/initramfs-4.18.0-147.5.1.el8_1.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-20db05bac820110f5800ebe2e7262b58
Found initrd image: /boot/initramfs-0-rescue-20db05bac820110f5800ebe2e7262b58.img
done

$ awk -F\' '$1=="menuentry " {print $2}' /boot/grub2/grub.cfg
CentOS Linux (4.18.0-193.28.1.el8_2.x86_64) 8 (Core)
CentOS Linux (4.18.0-147.5.1.el8_1.x86_64) 8 (Core)
CentOS Linux (0-rescue-20db05bac820110f5800ebe2e7262b58) 8 (Core)

#Überprüfen Sie die grubenv-Datei
$ cat /boot/grub2/grubenv
saved_entry=20db05bac820110f5800ebe2e7262b58-4.18.0-193.28.1.el8_2.x86_64
kernelopts=root=/dev/vda1 ro crashkernel=auto biosdevname=0 net.ifnames=0 rhgb quiet
boot_success=1

(9) Es ist kein Problem, wenn Sie von TeraTerm aus neu starten und sich anmelden können.

Ergänzung 1: Befehl grub2-mkconfig

Ich habe versucht, grub.cfg zu generieren, indem ich den Befehl grub2-mkconfig unmittelbar nach dem yum-Update in der obigen Prozedur ausgeführt habe. Das Ergebnis war NG. Ich kann mich nicht mehr über TeraTerm anmelden und muss über die Konsole des VPS-Portals am GRUB2-Bildschirm anhalten. Die Beschreibung von menuentry in grub.cfg fehlt. Ich kenne die Ursache nicht. Es scheint zu funktionieren, wenn Sie grub2-mkconfig nach dem Neustart ausführen, wie in den obigen Schritten (8) und (9).

Ergänzung 2: Befehl grub2-set-default

Unter / boot / grub2 / grubenv enthält saved_entry den Namen 20db05bac820110f5800ebe2e7262b58-4.18.0-193.28.1.el8_2.x86_64 anstelle der Nummer (0,1,2, ...). Es scheint im letzten Teil "4.18.0-193.28.1.el8_2.x86_64" übereinzustimmen.


$ cat /boot/grub2/grubenv
saved_entry=20db05bac820110f5800ebe2e7262b58-4.18.0-193.28.1.el8_2.x86_64
kernelopts=root=/dev/vda1 ro crashkernel=auto biosdevname=0 net.ifnames=0 rhgb quiet
boot_success=1

Durch Ausführen von grub2-set-default kann saved_entry übrigens direkt geändert werden, ohne / etc / default / grub zu durchlaufen.


$ grub2-set-default 0
$ cat /boot/grub2/grubenv
saved_entry=0
kernelopts=root=/dev/vda1 ro crashkernel=auto biosdevname=0 net.ifnames=0 rhgb quiet
boot_success=1

Ergänzung 3: Reparatur aus dem Wiederherstellungsmodus

Wenn Sie es nicht starten können, starten Sie den Server im Wiederherstellungsmodus über das VPS-Portal, melden Sie sich über TeraTerm als root an und führen Sie die folgenden Schritte aus, um ihn zu reparieren. Das Passwort ist das ursprüngliche Passwort, nicht die "Wiederherstellung". Die Nachricht auf dem VPS-Portal scheint falsch zu sein. Das Verfahren besteht darin, die Hauptfestplatte vor dem Betrieb zu identifizieren und zu mounten.


$ fdisk -l | more
  /dev/vda1
$ mount /dev/vda1 /mnt
$ cp /mnt/boot/grub2/grub.cfg.original /mnt/boot/grub2/grub.cfg

Ich habe es nicht ausprobiert, aber da grub.cfg.rpmsave bereits vorhanden war, konnte ich es möglicherweise mit dieser Datei wiederherstellen. Wenn Sie es wie folgt kopieren und den Server neu starten, konnten Sie möglicherweise eine Wiederherstellung durchführen, indem Sie die obigen Schritte (8) und (9) ausführen.


$ cp /mnt/boot/grub2/grub.cfg.rpmsave /mnt/boot/grub2/grub.cfg

das ist alles

Recommended Posts

Problemumgehung für GMO VPS (CentOS8.1) kann nach dem yum-Update nicht gestartet werden
Lösung für die Nichtaktualisierung von CentOS 8 (yum update / dnf update) aufgrund vorhandener centos-gpg-Schlüssel
Lösung für Apache Tomcat 8 startet nicht nach dem Wechsel zu OpenJDK 11
[Grobe Erklärung] Ursachen und Abhilfemaßnahmen dafür, dass der Name nicht aus dem ActiveHash-Modell abgerufen werden kann