[LINUX] Grub2-Neustart, mit dem Sie den Kernel vorübergehend ändern können, ist praktisch. Immerhin habe ich verschiedene Dinge über GRUB2 recherchiert.

1. Zuallererst

Haben Sie jemals Linux verwendet und erfahren, dass "Ich habe ein neues Kernelmodul installiert und es nicht gestartet" oder "Ich habe die Startoptionen geändert, die ich an den Kernel übergeben habe und es nicht gestartet wurde"?

Der Befehl ** grub2-reboot **, der den Kernel erst beim nächsten Start ändert, ist in dieser Situation hilfreich. Dies ist besonders in der Cloud nützlich, in der der Konsolenzugriff eingeschränkt ist, da ein nachfolgender Neustart auf den ursprünglichen Kernel zurückgesetzt wird. Dies ist auch nützlich, wenn Sie zu Testzwecken zwischen mehreren Kerneln wechseln.

Es war ein Befehl, der unerwartet unbekannt war, also dachte ich darüber nach, ihn einzuführen, aber als ich ihn untersuchte, schrieb ich am Ende Folgendes.

1-1. Zielumgebung

2. Wann ist es bequem?

Ich habe es am Anfang erklärt, aber ich werde es etwas detaillierter erklären. Wenn ein Server, der bisher normalerweise gestartet wurde, plötzlich nicht mehr startet, sind die folgenden Ursachen / Auslöser möglich.

Wenn ein solches Problem auftritt, muss das folgende Verfahren behoben werden.

** Fehlerbehebung beim Nichtstart **

  1. Starten Sie den Server neu, um den Konsolenbildschirm anzuzeigen
  2. Wählen Sie im Startmenü einen Kernel aus, der gestartet wurde
  3. Ändern Sie nach erfolgreichem Start den Standardkernel

Es gibt kein Problem, wenn der Server selbst zur Hand ist, aber wenn er sich an einem entfernten Ort wie der Cloud oder dem Rechenzentrum befindet, kann der Konsolenbildschirm nicht angezeigt und der alte Kernel möglicherweise nicht ausgewählt werden.

** Public Cloud: ** Einige Anbieter bieten keine Konsolenanmeldefunktion an ** Rechenzentrum: ** Für Server ohne BMC / IPMI-Karte oder KVM-Gerät (PC-Switch) müssen Sie zum Rechenzentrum gehen.

Der Befehl grub2-reboot ändert den Boot-Kernel nur vorübergehend, sodass eine Wiederherstellung möglich ist, solange Sie einen Neustart durchführen können. Beachten Sie jedoch, dass der Standardkernel auch bei der Installation mit Yum / DNF aktualisiert wird.

  1. GRUB2

Die GRUB-Einstellungsdatei lautet im Grunde / etc / grub.conf oder / boot / grub / grub.conf für GRUB bis zu 6 Serien und / etc / grub2.cfg für GRUB2 nach 7 Serien. Es ist. Es unterscheidet sich jedoch zwischen dem BIOS-Modus und dem UEFI-Modus. Insbesondere bei physischen Servern werden die meisten von UEFI verwendet. Ich werde das erklären.

3-1. GRUB2-Einstellungsdatei

Es gibt viele Dateien in GRUB2, und die folgenden Dateien sind typisch.

Von diesen wird beim Ändern des Standardkernels auf / etc / grub2.cfg verwiesen. Das allgemeine Verfahren zum Ändern des Standardkernels in 7-Serien lautet wie folgt. 8er Serie verwendet schmuddelig.

  1. Zeigen Sie die Kernelliste an.

python


awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
  1. Legen Sie die Standard-Kernel-Eintragsnummer fest.
grub2-set-Standardeintragsnummer

3. / boot / grub2.cfg ist eine symbolische Verknüpfung. Um die Zuverlässigkeit zu gewährleisten, geben Sie die tatsächliche / boot / grub2 / grub.cfg an und erstellen Sie sie neu.

grub2-mkconfig -o /boot/grub2/grub.cfg

** Tipps </ font> ** 8-Serien erfordern den Betrieb mit Grubby, aber 7-Serien können auch Grubby verwenden. Ältere Versionen sind jedoch möglicherweise nicht verfügbar. </ font>

** Achtung </ font> ** Für GRUB bis zu 6 Serien wurde /boot/grub/grub.conf mit einem Editor geändert, um den Standardkernel zu ändern. Ändern Sie in GRUB2 /boot/grub2/grub.cfg jedoch nicht manuell. Stellen Sie sicher, dass Sie es mit Befehlen wie grub2-mkconfig und grubby ändern.

3-2 Achten Sie auf den UEFI-Modus

Im BIOS-Modus ist die bisherige Erklärung in Ordnung, im UEFI-Modus jedoch anders. Im Allgemeinen wird es wie folgt erklärt, aber die symbolische Verbindung unterscheidet sich zusätzlich zur Substanz. erkläre im Detail.

** BIOS-Start **: /boot/grub2/grub.cfg ** UEFI-Boot **: /boot/efi/EFI/*/grub.cfg

3-2-1. Bestimmen Sie den UEFI-Modus

Mit dem folgenden Befehl können Sie feststellen, ob sich der aktuell verwendete Server oder die virtuelle Maschine im UEFI-Modus befindet. Als ich die Cloud untersuchte, befanden sich AWS und Azure im BIOS-Modus und Oracle Cloud im UEFI-Modus. Ich habe nicht alle Instanztypen überprüft, daher dient dies nur als Referenz.

Im UEFI-Modus


$ ls -l /sys/firmware/efi
total 0
-r--r--r--.  1 root root 4096 Aug 13 10:00 config_table
drwxr-xr-x.  2 root root    0 Aug 13 09:06 efivars
-r--r--r--.  1 root root 4096 Aug 13 10:00 fw_platform_size
-r--r--r--.  1 root root 4096 Aug 13 10:00 fw_vendor
-r--r--r--.  1 root root 4096 Aug 13 10:00 runtime
drwxr-xr-x.  9 root root    0 Aug 13 10:00 runtime-map
-r--------.  1 root root 4096 Aug 13 10:00 systab
drwxr-xr-x. 29 root root    0 Aug 13 10:00 vars

Im BIOS-Modus


$ ls -l /sys/firmware/efi
ls: cannot access /sys/firmware/efi: No such file or directory

3-2-2. Aktuelle Datei im UEFI-Modus

Die Konfigurationsdatei im UEFI-Modus wurde als "/ boot / efi / EFI / * / grub.cfg" eingeführt. Der Sternchen-Teil hängt von der Verteilung ab.

Verteilung Dateiname
RHEL /boot/efi/EFI/redhat/grub.cfg
CentOS /boot/efi/EFI/centos/grub.cfg
Oracle Linux /boot/efi/EFI/redhat/grub.cfg
Amazon Linux /boot/efi/EFI/amzn/grub.cfg
Ubuntu /boot/grub/grub.cfg(UEFI/Gemeinsam im BIOS)

3-2-3. Beziehung zwischen symbolischen Verknüpfungen und Entitäten

Vielleicht ist derjenige, der verwirrt wird, die symbolische Verbindung. Im UEFI-Modus wurde / etc / grub2-efi.cfg hinzugefügt.

BIOS-Modus


$ ls -l /etc/grub2*
lrwxrwxrwx. 1 root root 22 Sep  3 13:31 /etc/grub2.cfg -> ../boot/grub2/grub.cfg

UEFI-Modus


$ ls -l /etc/grub2*
lrwxrwxrwx. 1 root root 22 Sep  3 13:31 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
lrwxrwxrwx. 1 root root 31 Sep  3 13:31 /etc/grub2-efi.cfg -> ../boot/efi/EFI/
centos/grub.cfg

Wenn Sie einen symbolischen Link verwenden, tun Sie dies wahrscheinlich. "/ Etc / grub2.cfg" bezieht sich jedoch auf "/ boot / grub2 / grub.cfg", aber der Stoff existiert nicht.

$ ls -l /boot/efi/EFI/centos/grub.cfg
-rwx------. 1 root root 10223 Sep  3 13:35 /boot/efi/EFI/centos/grub.cfg
$ ls -l /boot/grub2/grub.cfg ★ existiert nicht
ls: cannot access /boot/grub2/grub.cfg: No such file or directory

Daher schlägt der folgende Befehl im UEFI-Modus fehl.

python


awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

Es muss erkannt werden, dass es sich um UEFI handelt, und "/ etc / grub2-efi.cfg" oder "/ boot / efi / EFI / * / grub.cfg" angegeben werden.

python


awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2-efi.cfg

3-3 Andere Dateien

Die folgenden Dateien, die bisher nicht erklärt wurden, werden erklärt. Dieses Mal wird der Inhalt von CentOS 8 angezeigt, für 7er-Serien ist er jedoch fast identisch.

  • /etc/default/grub
  • /boot/grub2/grubenv
  • /etc/sysconfig/kernel

3-3-1. /etc/default/grub Diese Datei enthält die Einstellungen für GRUB2 als Ganzes. Bezogen auf den Standardkernel ist die Direktive ** GRUB_DEFAULT . Der Schlüssel ist " gespeichert **".

GRUB_TIMEOUT=5 ★ Anzeigezeit des Kernelauswahlmenüs beim Start
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=gespeichert ★ Der Name der Direktive, die vom Standardkernel verwendet wird
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true

3-3-2. /boot/grub2/grubenv Diese Datei enthält die Standard-Kerneleinstellungen. Da es früher "** gespeichert **" war, wird der in der Direktive ** saved_entry ** angegebene Kernel zum Standardkernel.

In der RHEL7-Serie ist "Menünummer" oder "Menüname" festgelegt, in der RHEL8-Serie ist "ID + Kernel-Version" festgelegt.

7er Serie


# GRUB Environment Block
saved_entry=CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core)

8er Serie


# GRUB Environment Block
saved_entry=0aa24a7da6284581821b2215d0757580-4.18.0-147.el8.x86_64
kernelopts=root=/dev/mapper/cl-root ro resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet
boot_success=0
boot_indeterminate=0

In der RHEL8-Serie ist hier die passende Einstellungsdatei vorhanden. Dies ist eine Spezifikation namens BootLoaderSpecByDefault (BLS).

Nur RHEL8-Serie


# ls /boot/loader/entries/
0aa24a7da6284581821b2215d0757580-0-rescue.conf
0aa24a7da6284581821b2215d0757580-4.18.0-147.el8.x86_64.conf
0aa24a7da6284581821b2215d0757580-4.18.0-193.14.2.el8_2.x86_64.conf

3-3-3. /etc/sysconfig/kernel Diese Datei enthält Anweisungen zum Aktualisieren des Kernels.

# UPDATEDEFAULT specifies if new-kernel-pkg should make
# new kernels the default
UPDATEDEFAULT=yes

# DEFAULTKERNEL specifies the default kernel package type
DEFAULTKERNEL=kernel-core

** UPDATEDEFAULT ** gibt an, ob der Standardkernel erstellt werden soll, wenn der Kernel aktualisiert wird. Wenn ja, ist dies der Standardkernel. Wenn nein, ist dies nicht der Standardkernel.

Geben Sie beispielsweise no an, wenn Sie keinen neuen Kernel verwenden möchten, auch wenn Sie einen zusätzlichen Kernel mit "yum update" installieren.

Wenn Sie die Installation des Kernels selbst unterdrücken möchten, sollten Sie ihn zunächst wie folgt in der Yum / DNF-Einstellungsdatei ausschließen.

shell-session:/etc/yum.conf(/etc/dnf/dnf.conf)


exclude=kernel

Legen Sie den Standard-Kerneltyp in ** DEFAULTKERNEL ** fest. Der normale Kernel ist Kernel und Kernel-Core, aber der Debug-Kernel ist Kernel-Debug. In UEK von Oracle Linux ist es Kernel-uek.

4. Ändern Sie den Boot-Kernel

Ich werde erklären, wie man grub2-reboot benutzt, aber ich habe einen Umweg gemacht. Die Methode zum Ändern des Standardkernels ist fast dieselbe, daher werde ich sie gemeinsam erläutern. Das Hauptverfahren ist wie folgt.

  1. Untersuchen Sie den Standardkernel
  2. Zeigen Sie die Liste der Kernel an
  3. Legen Sie den nächsten Boot-Kernel fest (permanent oder temporär).
  4. Starten Sie neu

Die Befehle zum Ändern des Kernels unterscheiden sich je nach Version, daher werden die einzelnen Befehle erläutert. Wenn Sie Grubby auch in 7er-Serien verwenden möchten, lesen Sie bitte die Erläuterungen zu 8er-Serien.

** 7 Serie: ** grub2-mkconfig / grub2-set-default oder schmuddelig ** 8er Serie: ** schmuddelig

4-1. RHEL7-Serie (nicht schmuddelig)

4-1-1. Überprüfen Sie den Standardkernel

Die aktuelle Standardeinstellung kann mit dem Befehl grub2-editenv angezeigt werden. Der Wert der Anweisung saved_entry ist der Standardkernel.

# grub2-editenv list
saved_entry=CentOS Linux (3.10.0-1127.19.1.el7.x86_64) 7 (Core)
# uname -a
Linux hostname 3.10.0-1127.19.1.el7.x86_64 #1 SMP Tue Mar 17 23:49:17 UTC 2020
 x86_64 x86_64 x86_64 GNU/Linux

4-1-2. Zeigen Sie die Liste der Kernel an

Zeigen Sie eine Liste der installierten Kernel an. In Kombination mit den vorherigen Ergebnissen ist die Indexnummer 0 der Standardkernel.

** BIOS-Modus **

# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

** UEFI-Modus **

# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2-efi.cfg

Ausgabebeispiel


0 : CentOS Linux (3.10.0-1127.19.1.el7.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1062.18.1.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-b5a029229fd6464ca40d2e93351d5c5f) 7 (Core)

4-1-3. Ändern Sie den Standardkernel

Im folgenden Beispiel gibt eine Version einen älteren Kernel mit Eintrag Nummer 1 an.

  1. Ändern Sie den Standardkernel in Eintrag Nummer 1.
# grub2-set-default 1
  1. Sie können sehen, dass sich der Standardkernel geändert hat.
# grub2-editenv list
saved_entry=1

4-1-4. Neustart

Starten Sie den geänderten Kernel neu, damit er wirksam wird. Das ist es.

# systemctl reboot

4-2. Serie RHEL7 / RHEL8 (schmuddelig)

4-2-1. Überprüfen Sie den Standardkernel

grubby kann Kerneldateinamen und -indizes anzeigen.

# grubby --default-kernel
/boot/vmlinuz-4.18.0-193.14.2.el8_2.x86_64
# grubby --default-index
0

4-2-2. Zeigen Sie die Liste der Kernel an

Zeigen Sie eine Liste der installierten Kernel an. Dieses Beispiel zeigt auch die nächste Zeile, die grep mit der Option -A 2 übereinstimmt.

# grubby --info=ALL | grep -A 2 index
index=0
kernel="/boot/vmlinuz-4.18.0-193.14.2.el8_2.x86_64"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet $tuned_params"
--
index=1
kernel="/boot/vmlinuz-4.18.0-147.el8.x86_64"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet $tuned_params"
--
index=2
kernel="/boot/vmlinuz-0-rescue-0aa24a7da6284581821b2215d0757580"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"

4-2-3. Ändern Sie den Standardkernel

Verwenden Sie den Befehl grubby wie folgt, um den Standardkernel dauerhaft zu ändern: In diesem Beispiel wird zwischen der Option "--set-default" und dem Wert ein gleiches (=) angegeben, es kann jedoch ein Leerzeichen verwendet werden.

# grubby --set-default=/boot/vmlinuz-4.18.0-147.el8.x86_64

Sie können die Indexnummer auch wie folgt angeben.

# grubby --set-default-index=1

Bestätigen Sie, dass es geändert wurde.

# grubby --default-kernel
/boot/vmlinuz-4.18.0-147.el8.x86_64

Mit --info können Sie den gesamten Eintrag für den angegebenen Kernel anzeigen. In diesem Beispiel wird der Name der Kerneldatei angegeben, der Index kann jedoch auch angegeben werden.

# grubby --info=/boot/vmlinuz-4.18.0-147.el8.x86_64
index=1
kernel="/boot/vmlinuz-4.18.0-147.el8.x86_64"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv
=cl/swap rhgb quiet $tuned_params"
root="/dev/mapper/cl-root"
initrd="/boot/initramfs-4.18.0-147.el8.x86_64.img $tuned_initrd"
title="CentOS Linux (4.18.0-147.el8.x86_64) 8 (Core)"
id="0aa24a7da6284581821b2215d0757580-4.18.0-147.el8.x86_64"

4-2-4. Neustart

Starten Sie den geänderten Kernel neu, damit er wirksam wird. Das ist es.

# systemctl reboot

4-3 Ändern Sie den Kernel vorübergehend

Ich habe den Kernel früher dauerhaft geändert, aber Sie können den Kernel erst beim nächsten Start ändern. Durch einen erneuten Neustart wird der ursprüngliche Kernel wiederhergestellt, was für die folgenden Zwecke nützlich ist.

  • Ich möchte zu Testzwecken zu einem anderen Kernel wechseln
  • Ich möchte einen Debug-Kernel verwenden
  • Ich möchte die an den Kernel übergebenen Startoptionen testen

Verwenden Sie ** grub2-reboot ** zum Ändern. Geben Sie die Menüeintragsnummer (Indexnummer) wie folgt an.

grub2-reboot 1

Um den Vorgang zu bestätigen, werden eine Reihe von Schritten beschrieben.

  1. Die aktuelle Kernelversion ist "4.18.0-147".
# uname -r
4.18.0-147.el8.x86_64
  1. Der Standardkernel ist natürlich der gleiche.
# grubby --default-kernel
/boot/vmlinuz-4.18.0-147.el8.x86_64

# grubby --default-index
1
  1. Verwenden Sie grub2-reboot, um den Index erst beim nächsten Neustart auf "0" zu ändern.
# grub2-reboot 0
  1. Der Index hat sich nicht geändert, da sich der Standardkernel nicht geändert hat.
# grubby --default-index
1
  1. Starten Sie neu.
# systemctl reboot
  1. Wenn ich mich nach dem Neustart anmelde, ändert sich der Kernel in den Index "0".
# uname -r
4.18.0-193.14.2.el8_2.x86_64

# grubby --info=/boot/vmlinuz-4.18.0-193.14.2.el8_2.x86_64
index=0
kernel="/boot/vmlinuz-4.18.0-193.14.2.el8_2.x86_64"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet $tuned_params"
root="/dev/mapper/cl-root"
initrd="/boot/initramfs-4.18.0-193.14.2.el8_2.x86_64.img $tuned_initrd"
title="CentOS Linux (4.18.0-193.14.2.el8_2.x86_64) 8 (Core)"
id="0aa24a7da6284581821b2215d0757580-4.18.0-193.14.2.el8_2.x86_64"
  1. Starten Sie erneut.
# systemctl reboot
  1. Zurücksetzen auf den Standardkernel. Es wurde bestätigt, dass der Neustart von grub2 erst beim nächsten Neustart wirksam wird.
# uname -r
4.18.0-147.el8.x86_64

5. Zusammenfassung

  • ** Verwenden Sie in GRUB2 nach RHEL7 einen Befehl, um den Standardkernel zu ändern. Ändern Sie die Datei nicht von Hand. ** **.
  • ** Der Name der GRUB-Einstellungsdatei unterscheidet sich zwischen dem BIOS-Modus und dem UEFI-Modus. ** **.
  • ** Um den Standardkernel zu ändern, verwenden Sie grub2-mkconfig / grub2-set-default oder grubby für die RHEL7-Serie. Grubby wird für die RHEL8-Serie verwendet. ** **.
  • ** Mit dem Befehl grub2-reboot können Sie den Kernel nur beim nächsten Start vorübergehend ändern. Diese Eigenschaften sind in der Cloud und beim Testen nützlich, wenn der Konsolenzugriff schwierig ist. ** **.

6. Referenz