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.
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 **
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.
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.
Es gibt viele Dateien in GRUB2, und die folgenden Dateien sind typisch.
/etc/grub2.cfg
/boot/grub2/grub.cfg
/boot/loader/entries/*
/boot/grub2/grubenv
/etc/default/grub
/etc/sysconfig/kernel
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.
python
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
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.
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
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
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) |
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
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.
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.
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.
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
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
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)
Im folgenden Beispiel gibt eine Version einen älteren Kernel mit Eintrag Nummer 1 an.
# grub2-set-default 1
# grub2-editenv list
saved_entry=1
Starten Sie den geänderten Kernel neu, damit er wirksam wird. Das ist es.
# systemctl reboot
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
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"
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"
Starten Sie den geänderten Kernel neu, damit er wirksam wird. Das ist es.
# systemctl reboot
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.
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.
# uname -r
4.18.0-147.el8.x86_64
# grubby --default-kernel
/boot/vmlinuz-4.18.0-147.el8.x86_64
# grubby --default-index
1
# grub2-reboot 0
# grubby --default-index
1
# systemctl reboot
# 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"
# systemctl reboot
# uname -r
4.18.0-147.el8.x86_64
Recommended Posts