在更新阻止 EC2 執行個體重新啟動後,如何還原至已知的穩定核心?
更新阻止了我的 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 使用者存取權。每個使用序列主控台的執行個體都必須包含至少一個密碼型使用者。
使用救援執行個體
**重要:**請勿在執行個體儲存體支援的執行個體上執行此程序。復原過程需要停止並啟動您的執行個體,因此您將遺失執行個體的資料。
若要使用救援執行個體存取根磁碟區,請完成下列步驟:
-
從受影響的執行個體中分離 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。 -
在與快照相同的可用區域中啟動救援 EC2 執行個體。
注意:檢查您的執行個體產品代碼。某些產品代碼要求您在相同的作業系統 (OS) 類型中啟動 EC2 執行個體。例如,如果受影響的執行個體是付費的 RHEL AMI,那麼您必須啟動具有相同產品代碼的 AMI。如果您有 AL2 執行個體,則必須建立 AL2 救援執行個體以避免錯誤。 -
將磁碟區作為次要裝置 (/dev/sdf) 附加到救援執行個體。
-
若要查看可用的磁碟裝置,請執行以下命令:
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 / -
若要成為根使用者,請執行以下命令:
sudo -i -
若要將已掛載磁碟區的根分區掛載到 /mnt,請執行下列命令:
mount -o nouuid /dev/xvdf1 /mnt**注意:**將 /dev/xvdf1 替換為您磁碟區的根分區。如果您的組態中不存在 /mnt,請執行下列命令建立掛載目錄,然後將根分區掛載到新目錄:
mkdir /mnt mount -o nouuid /dev/xvdf1 /mnt**注意:**如果您在執行上述 mount 命令時收到錯誤,請執行下列命令:
mount /dev/xvdf1 /mnt接下來,使用掛載目錄存取受影響執行個體的資料。
-
若要將救援執行個體的 /dev、/run、/proc 和 /sys 掛載到與已掛載磁碟區相同的路徑,請執行下列命令:
for m in dev proc run sys; do mount -o bind {,/mnt}/$m; done
- 如果您有單獨的 /boot 分區,則將其掛載到 /mnt/boot。
- 若要切換到掛載目錄,請執行以下命令:
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
請完成下列步驟:
-
若要將 /etc/default/grub 檔案中損壞的 GRUB_DEFAULT=0 預設功能表項目替換為穩定的 GRUB_DEFAULT=saved 值,請執行下列命令:
sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=saved/g' /etc/default/grub -
若要確保 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 檔案,然後重新執行上述命令。
-
若要確保 Amazon EC2 在下次重新啟動時載入穩定核心,請執行以下命令:
grub-set-default 1
適用於 RHEL 7 和 AL2 的 GRUB2
請完成下列步驟:
-
若要將 /etc/default/grub 檔案中損壞的 GRUB_DEFAULT=0 預設功能表項目替換為穩定的 GRUB_DEFAULT-saved 值,請執行下列命令:
sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=saved/g' /etc/default/grub -
若要更新 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 檔案,然後重新執行上述命令。
-
若要確保 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 中的預設核心,請完成下列步驟:
-
若要查看目前預設核心,請執行以下命令:
grubby --default-kernel -
若要查看所有可用的核心及其索引,請執行以下命令:
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。
-
若要變更執行個體的預設核心,請執行以下命令:
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 替換為您核心的版本號碼。
-
若要確認您是否正確設定了預設核心,請執行以下命令:
grubby --default-kernel
重新啟動執行個體
如果您使用了 EC2 序列主控台,那麼 Amazon EC2 現在會載入穩定的核心。您可以重新啟動執行個體。
如果您使用救援執行個體存取根磁碟區,請完成以下步驟:
-
若要退出 chroot 並卸載 /dev、/run、/proc 和 /sys,請執行下列命令:
exit umount /mnt/{dev,proc,run,sys,} -
將根磁碟區附加到原始執行個體作為 /dev/xvda 或 /dev/sda1 根磁碟區
-
Amazon EC2 現在會載入穩定的核心。您可以重新啟動執行個體。
相關內容
- 已提問 2 年前
- 已提問 2 年前
- 已提問 1 年前
AWS 官方已更新 6 個月前
