Direkt zum Inhalt

Wie behebe ich den Fehler „Kernel panic − not sync“ in meiner EC2-Instance?

Lesedauer: 5 Minute
0

Ich möchte den Kernel aktualisieren oder meine Amazon Elastic Compute Cloud (Amazon EC2) Linux-Instance neu booten, weil die initramfs- oder Kernel-Module fehlen. Ich erhalte jedoch den Fehler „Kernel panic − not syncing“.

Kurzbeschreibung

Der Fehler „Kernel panic − not sync“ tritt auf, wenn das Gerät oder die Adresse nicht existiert. Um dieses Problem zu beheben, starte eine temporäre Instance und schließe dann den fehlerhaften Stammdatenträger als sekundäres Laufwerk an, um Diagnosen durchzuführen.

Wichtig: Bevor du die Instance stoppst und startest, gehe wie folgt vor:

Hinweis: Wenn du eine Instance stoppst und startest, ändert sich die öffentliche IP-Adresse der Instance. Es empfiehlt sich, beim Weiterleiten von externem Datenverkehr an die Instance eine Elastic-IP-Adresse anstelle einer öffentlichen IP-Adresse zu verwenden.

Weitere Informationen findest du unter Was passiert, wenn du eine Instance stoppst.

Lösung

Hinweis: Die folgenden Lösungsschritte gelten nur für Amazon Linux 2, Amazon Linux 2023, Fedora 16 und höher sowie Red Hat Enterprise Linux (RHEL) 7 und höher.

Gehe wie folgt vor, um den Stammdatenträger an eine temporäre Instance anzufügen:

  1. Rufe die Volume-ID und den Gerätenamen für das Root-Volume der ursprünglichen Instance ab.

  2. Stoppe die ursprüngliche Instance.

  3. Starte eine temporäre Instance von einem Amazon Machine Image (AMI) mit derselben Linux-Betriebssystemversion (OS) in derselben Availability Zone.

  4. Trenne das Root-Volume von der ursprünglichen Instance und füge es als sekundäres Volume an die temporäre Instance an. Notiere dir den Volume-Gerätenamen.

  5. Verwende das SSH-Schlüsselpaar, um eine Verbindung zur temporären Instance herzustellen.

  6. Führe den folgenden Befehl aus, um zum Root-Benutzer zu wechseln:

    sudo su
  7. Führe den folgenden Befehl von der temporären Instance aus, um den Namen und die Partition des Blockgeräts zu identifizieren:

    lsblk

    Beispielausgabe:

    NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    xvda    202:0    0    8G  0 disk
    └─xvda1 202:1    0    8G  0 part /
    xvdf    202:80   0  101G  0 disk
    └─xvdf1 202:81   0  101G  0 part
    xvdg    202:80   0   10G  0 disk

    In diesem Beispiel wird eine XEN-Instance mit Blkfront-Treibern verwendet.

  8. Wenn du ein partitioniertes Volume verwendest, führe den folgenden Befehl aus, um die /dev/xvdf1-Partition anstelle des /dev/xvdf-Geräts einzulegen:

    mount -o nouuid  /dev/xvdf1 /mnt

    Hinweis: Sowohl /dev/xvda als auch /dev/xvdf sind partitionierte Volumes, /dev/xvdg jedoch nicht.
    Wenn du eine auf dem AWS Nitro System erstellte Instance verwendest, ähnelt der Name des Volume-Geräts /dev/nvme[0-26]n1. Führe den folgenden Befehl aus, um die Partition im Verzeichnis /mnt einzulegen:

    mount -o nouuid  /dev/nvme1n1p1 /mnt

    Hinweis: Ersetze nvme1n1p1 durch den Blockgerätenamen, den du in Schritt 7 ermittelt hast. Weitere Informationen findest du unter Gerätenamen für Volumes auf Amazon EC2-Instances.

  9. Um eine Chroot-Umgebung im Verzeichnis /mnt zu erstellen, führe den folgenden Befehl aus:

    for i in dev proc sys run; do mount -o bind /$i /mnt/$i; done; chroot /mnt

    Dieses Beispiel führt ein Bind-Mount der Verzeichnisse /dev, /proc, /sys und /run aus dem ursprünglichen Root-Dateisystem aus. Diese Konfiguration ermöglicht Prozessen, die in der Chroot-Umgebung ausgeführt werden, den Zugriff auf die Systemverzeichnisse.

  10. Um eine Sicherungskopie der initramfs im Verzeichnis**/** zu erstellen, führe den folgenden Befehl aus:

for file in /boot/initramfs-*.img; do cp "${file}" "/$(basename "$file")_$(date +%Y%m%d)"; done
  1. Führe den folgenden Befehl aus, um den Standard-Kernel aufzulisten:
grubby --default-kernel

Beispielausgabe:

/boot/vmlinuz-5.15.156-102.160.amzn2.x86_64

Die vorhergehende Ausgabe listet die Kernels auf, die beim Startup booten. Führe den folgenden Befehl aus, um die Kernels und initramfs im Boot-Verzeichnis aufzulisten:

 ls -lh /boot/vmlinuz* && ls -lh /boot/initr*

Beispielausgabe:

-rwxr-xr-x. 1 root root 9.7M Apr 23 20:37 /boot/vmlinuz-5.10.215-203.850.amzn2.x86_64-rwxr-xr-x. 1 root root 9.9M Apr 23 17:00 /boot/vmlinuz-5.15.156-102.160.amzn2.x86_64
-rw-------. 1 root root 12M May 3 23:45 /boot/initramfs-5.10.215-203.850.amzn2.x86_64.img
-rw-------. 1 root root 9.8M May 14 08:03 /boot/initramfs-5.15.156-102.160.amzn2.x86_64.img

Beachte die vmlinuz-Kerneldateien, die entsprechende initramfs-Dateien enthalten. Führe den folgenden Befehl aus, um die initramfs neu zu erstellen:

dracut --force --verbose /boot/initramfs-kernelVersion.img kernelVersion

Hinweis: Ersetze kernelVersion durch die neueste Kernelversion. Führe den folgenden Befehl aus, um festzustellen, ob die Instance über UEFI oder BIOS gebootet wird:

boot_mode=$(ls /sys/firmware/efi/efivars >/dev/null 2>&1 && echo "EFI" || echo "BIOS"); echo "Boot mode detected: $boot_mode"
  1. Aktualisiere die Grub-Konfiguration. Wenn die Instance im BIOS gebootet wird, führe den folgenden Befehl aus:
grub2-mkconfig -o /boot/grub2/grub.cfg

Hinweis: Wenn du den vorherigen Befehl ausführst, erhältst du möglicherweise die Fehlermeldung „device-mapper: reload ioctl on osprober-linux-xvda2 (253:0) failed: Device or resource busy Command failed“. Um dieses Problem zu beheben, füge der Datei /etc/default/grub den Parameter GRUB_DISABLE_OS_PROBER=true hinzu und führe den Befehl erneut aus.
Wenn die Instance auf UEFI gebootet wird, führe die folgenden Befehle je nach Betriebssystem aus.
UEFI:
Amazon Linux 2 und Amazon Linux 2023:

grub2-mkconfig -o /boot/efi/EFI/amzn/grub.cfg

Fedora 16+:

grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg

Red Hat 7+:

grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
  1. Führe den folgenden Befehl aus, um das Volume zu beenden und zu trennen:
exit; umount -fl /mnt
  1. Trenne das sekundäre Volume von der temporären Instance und füge es als Stammgerät an die ursprüngliche Instance an. Verwende den Gerätenamen, den du in Schritt 4 notiert hast.
  2. Stelle eine Verbindung zur ursprünglichen Instance her.
AWS OFFICIALAktualisiert vor 7 Monaten