跳至內容

在更新阻止 EC2 執行個體重新啟動後,如何還原至已知的穩定核心?

4 分的閱讀內容
0

更新阻止了我的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體重新啟動。我想還原至穩定的核心。

簡短描述

如果您對 EC2 Linux 執行個體進行了核心更新,但核心現在已損壞,則該執行個體無法重新啟動。您也無法使用 SSH 連線到受影響的執行個體。

若要對此問題進行疑難排解,請使用 EC2 序列主控台存取您的根磁碟區。或者,建立一個臨時救援執行個體,然後在救援執行個體上重新掛載您的 Amazon Elastic Block Store (Amazon EBS) 磁碟區。設定您的 GNU GRUB 以使用先前的核心,然後重新啟動執行個體。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

存取執行個體的根磁碟區

若要存取根磁碟區,請使用 EC2 序列主控台或救援執行個體。

使用 EC2 序列主控台

**先決條件:**您必須已經設定了對 EC2 序列主控台的存取權。如果您的執行個體無法存取,且您尚未設定存取權,則必須使用救援執行個體來存取根磁碟區。此外,請確定您遵守序列主控台先決條件

如果您已啟動適用於 Linux 的 EC2 序列主控台,則可將其用於 Nitro 型執行個體類型,以對啟動、網路組態和 SSH 組態問題進行疑難排解。

您可以在沒有有效網路連線的情況下,使用序列主控台連線到您的執行個體

在使用序列主控台之前,請在 AWS 帳戶層級授予其存取權。然後,建立 AWS Identity and Access Management (IAM) 政策,以授予 IAM 使用者存取權。每個使用序列主控台的執行個體都必須包含至少一個密碼型使用者。

使用救援執行個體

**重要:**請勿在執行個體儲存體支援的執行個體上執行此程序。復原過程需要停止並啟動您的執行個體,因此您將遺失執行個體的資料。

若要使用救援執行個體存取根磁碟區,請完成下列步驟:

  1. 建立根磁碟區的 Amazon EBS 快照

  2. 停止受影響的執行個體

  3. 從受影響的執行個體中分離 Amazon EBS 根磁碟區 (/dev/xvda/dev/sda1)。記下根磁碟區的裝置名稱。
    **注意:**若要協助在後續步驟中辨識 EBS 磁碟區,請在分離磁碟區之前標記該磁碟區。根裝置會因 Amazon Machine Image (AMI) 而異。例如,Amazon Linux 2 (AL2) 和 Amazon Linux 2023 (AL2023) 使用 /dev/xvda。但是,Ubuntu 14、16、18、CentOS 7 和 Red Hat Enterprise Linux (RHEL) 7.5 使用 /dev/sda1

  4. 在與快照相同的可用區域中啟動救援 EC2 執行個體
    注意:檢查您的執行個體產品代碼。某些產品代碼要求您在相同的作業系統 (OS) 類型中啟動 EC2 執行個體。例如,如果受影響的執行個體是付費的 RHEL AMI,那麼您必須啟動具有相同產品代碼的 AMI。如果您有 AL2 執行個體,則必須建立 AL2 救援執行個體以避免錯誤。

  5. 將磁碟區作為次要裝置 (/dev/sdf) 附加到救援執行個體。

  6. 使用 SSH 連線到救援執行個體

  7. 若要查看可用的磁碟裝置,請執行以下命令:

    lsblk

    輸出範例:

    NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    xvda    202:0     0   15G  0 disk
    └─xvda1 202:1     0   15G  0 part /
    xvdf    202:0     0   15G  0 disk
        └─xvdf1 202:1 0   15G  0 part

    **注意:**Nitro 型執行個體將 EBS 磁碟區顯示為 NVMe 區塊型儲存設備,磁碟名稱為 nvme[0-26]n1。Nitro 型執行個體上的輸出範例:

    NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    nvme0n1        259:0    0    8G  0 disk
    └─nvme0n1p1    259:1    0    8G  0 part /
    └─nvme0n1p128  259:2    0    1M  0 part
    nvme1n1        259:3    0  100G  0 disk
    └─nvme1n1p1    259:4    0  100G  0 part /
  8. 若要成為根使用者,請執行以下命令:

    sudo -i
  9. 若要將已掛載磁碟區的根分區掛載到 /mnt,請執行下列命令:

    mount -o nouuid /dev/xvdf1 /mnt

    **注意:**將 /dev/xvdf1 替換為您磁碟區的根分區。如果您的組態中不存在 /mnt,請執行下列命令建立掛載目錄,然後將根分區掛載到新目錄:

    mkdir /mnt
    mount -o nouuid /dev/xvdf1 /mnt

    **注意:**如果您在執行上述 mount 命令時收到錯誤,請執行下列命令:

    mount /dev/xvdf1 /mnt

    接下來,使用掛載目錄存取受影響執行個體的資料。

  10. 若要將救援執行個體的 /dev/run/proc/sys 掛載到與已掛載磁碟區相同的路徑,請執行下列命令:

for m in dev proc run sys; do mount -o bind {,/mnt}/$m; done
  1. 如果您有單獨的 /boot 分區,則將其掛載到 /mnt/boot
  2. 若要切換到掛載目錄,請執行以下命令:
chroot /mnt

更新 GRUB 引導程式中的預設核心

您可以在清單中的位置 0 找到損壞的核心,在位置 1 找到最後一個穩定的核心。若要用穩定核心替換損壞的核心,請根據您的發行版完成以下步驟。

適用於 Red Hat 6 的 GRUB1 (舊版 GRUB)

若要將 /boot/grub/grub.conf 檔案中的損壞核心替換為穩定核心,請執行以下命令:

sed -i '/^default/ s/0/1/' /boot/grub/grub.conf

適用於 Ubuntu 14 LTS、16.04 和 18.04 的 GRUB2

請完成下列步驟:

  1. 若要將 /etc/default/grub 檔案中損壞的 GRUB_DEFAULT=0 預設功能表項目替換為穩定的 GRUB_DEFAULT=saved 值,請執行下列命令:

    sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=saved/g' /etc/default/grub
  2. 若要確保 GRUB 識別變更,請執行下列命令:

    update-grub

    **注意:**重建 grub 組態檔案時,您可能會收到「device-mapper: reload ioctl on osprober-linux-xvdaX failed: Device or resource busy Command failed」(device-mapper:在 osprober-linux-xvdaX 上重新載入 ioctl 失敗:裝置或資源繁忙命令失敗) 錯誤。若要解決此問題,請將 GRUB_DISABLE_OS_PROBER=true 參數新增至 /etc/default/grub 檔案,然後重新執行上述命令。

  3. 若要確保 Amazon EC2 在下次重新啟動時載入穩定核心,請執行以下命令:

    grub-set-default 1

適用於 RHEL 7 和 AL2 的 GRUB2

請完成下列步驟:

  1. 若要將 /etc/default/grub 檔案中損壞的 GRUB_DEFAULT=0 預設功能表項目替換為穩定的 GRUB_DEFAULT-saved 值,請執行下列命令:

    sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=saved/g' /etc/default/grub
  2. 若要更新 GRUB 以重新產生 /boot/grub2/grub.cfg 檔案,請執行以下命令:

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

    **注意:**重建 grub 組態檔案時,您可能會收到「device-mapper: reload ioctl on osprober-linux-xvdaX failed: Device or resource busy Command failed」(device-mapper:在 osprober-linux-xvdaX 上重新載入 ioctl 失敗:裝置或資源繁忙命令失敗) 錯誤。若要解決此問題,請將 GRUB_DISABLE_OS_PROBER=true 參數新增至 /etc/default/grub 檔案,然後重新執行上述命令。

  3. 若要確保 Amazon EC2 在下次重新啟動時載入穩定核心,請執行以下命令:

    grub2-set-default 1

適用於 RHEL 8 和 CentOS 8 的 GRUB2 以及 AL2023

GRUB2 使用 blscfg 檔案和 /boot/loader 中的項目進行啟動組態,而不是先前的 grub.cfg 格式。最佳做法是使用 grubby 工具來管理 blscfg 檔案,並從 /boot/loader/entries/ 中檢索資訊。如果 blscfg 檔案遺失或損壞,則 grubby 不會顯示任何結果。您必須重新產生檔案才能復原功能

若要更新 GRUB2 中的預設核心,請完成下列步驟:

  1. 若要查看目前預設核心,請執行以下命令:

    grubby --default-kernel
  2. 若要查看所有可用的核心及其索引,請執行以下命令:

    grubby --info=ALL

    輸出範例:

    root@ip-172-31-29-221 /]# grubby --info=ALLindex=0
    kernel="/boot/vmlinuz-4.18.0-305.el8.x86_64"
    args="ro console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto $tuned_params"
    root="UUID=d35fe619-1d06-4ace-9fe3-169baad3e421"
    initrd="/boot/initramfs-4.18.0-305.el8.x86_64.img $tuned_initrd"
    title="Red Hat Enterprise Linux (4.18.0-305.el8.x86_64) 8.4 (Ootpa)"
    id="0c75beb2b6ca4d78b335e92f0002b619-4.18.0-305.el8.x86_64"
    index=1
    kernel="/boot/vmlinuz-0-rescue-0c75beb2b6ca4d78b335e92f0002b619"
    args="ro console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto"
    root="UUID=d35fe619-1d06-4ace-9fe3-169baad3e421"
    initrd="/boot/initramfs-0-rescue-0c75beb2b6ca4d78b335e92f0002b619.img"
    title="Red Hat Enterprise Linux (0-rescue-0c75beb2b6ca4d78b335e92f0002b619) 8.4 (Ootpa)"
    id="0c75beb2b6ca4d78b335e92f0002b619-0-rescue"
    index=2
    kernel="/boot/vmlinuz-4.18.0-305.3.1.el8_4.x86_64"
    args="ro console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto $tuned_params"
    root="UUID=d35fe619-1d06-4ace-9fe3-169baad3e421"
    initrd="/boot/initramfs-4.18.0-305.3.1.el8_4.x86_64.img $tuned_initrd"
    title="Red Hat Enterprise Linux (4.18.0-305.3.1.el8_4.x86_64) 8.4 (Ootpa)"
    id="ec2fa869f66b627b3c98f33dfa6bc44d-4.18.0-305.3.1.el8_4.x86_64"

    請注意您為執行個體設定的預設核心路徑。在上述範例中,索引 2 處的核心路徑是 /boot/vmlinuz- 0-4.18.0-80.4.2.el8_1.x86_64

  3. 若要變更執行個體的預設核心,請執行以下命令:

    grubby --set-default=/boot/vmlinuz-4.18.0-305.3.1.el8_4.x86_64

    **注意:**將 4.18.0-305.3.1.el8_4.x86_64 替換為您核心的版本號碼。

  4. 若要確認您是否正確設定了預設核心,請執行以下命令:

    grubby --default-kernel

重新啟動執行個體

如果您使用了 EC2 序列主控台,那麼 Amazon EC2 現在會載入穩定的核心。您可以重新啟動執行個體

如果您使用救援執行個體存取根磁碟區,請完成以下步驟:

  1. 若要退出 chroot 並卸載 /dev/run/proc/sys,請執行下列命令:

    exit
    umount /mnt/{dev,proc,run,sys,}
  2. 停止救援執行個體

  3. 將根磁碟區與救援執行個體分離

  4. 將根磁碟區附加到原始執行個體作為 /dev/xvda/dev/sda1 根磁碟區

  5. 啟動原始執行個體

  6. Amazon EC2 現在會載入穩定的核心。您可以重新啟動執行個體

AWS 官方已更新 6 個月前