排解 Linux Compute Engine 執行個體的開機問題

本文說明如何找出 Linux Compute Engine 執行個體無法啟動的原因,並修正常見問題。

如果運算執行個體無法啟動,通常會出現下列一或多項徵兆:

  • 運算執行個體處於 RUNNING 狀態,但您無法使用 SSH 連線至該執行個體。
  • 序列控制台輸出內容在啟動序列中途停止,或在緊急或救援提示中結束。
  • 序列控制台輸出內容包含 FAILED、error:、Kernel panic 或 emergency mode。

如要解決開機問題,請先找出原因,然後從運算執行個體內部修正 (如果仍可連線),或將開機磁碟掛接到其他運算執行個體,離線修正問題。

如果運算執行個體完成啟動,但您無法連線,請參閱「排解 SSH 錯誤」。

事前準備

  • 確認運算執行個體會寫入序列主控台輸出內容。運算執行個體運作期間,您可查看序列埠輸出內容。如要在運算執行個體停止後保留這些內容,請啟用序列埠記錄功能,將記錄傳送至 Cloud Logging。詳情請參閱「查看序列埠輸出內容」。
  • 如果尚未設定驗證,請先完成設定。 驗證程序會確認您的身分,以便授予 Google Cloud 服務和 API 的存取權。如要從本機開發環境執行程式碼或範例,您可以選取下列任一選項,向 Compute Engine 驗證身分:
    1. 安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:

      gcloud init

      如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

    2. 設定預設區域和可用區。

自動偵測原因

手動讀取序列埠控制台輸出內容前,請先使用下列其中一項工具。每個指令碼都會讀取運算執行個體最近一次啟動的輸出內容、回報最可能的原因,並連結至本文件中的相符章節。

控制台

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。

    前往 VM 執行個體

  2. 在運算執行個體的列中,按一下「SSH」SSH。

  3. 如果連線失敗,請在連線對話方塊中按一下「疑難排解」。疑難排解工具會執行連線檢查,包括分析序列埠控制台輸出的啟動檢查。

gcloud

如要檢查無法透過 SSH 連線的運算執行個體,請執行 gcloud CLI SSH 疑難排解工具,該工具會執行連線檢查和啟動檢查:

gcloud compute ssh INSTANCE_NAME --zone=ZONE --troubleshoot

如要直接檢查開機順序,請執行開機診斷指令:

如要使用這項指令,請務必安裝 alpha 指令元件。

gcloud alpha compute diagnose boot INSTANCE_NAME --zone=ZONE

更改下列內容:

  • INSTANCE_NAME:運算執行個體的名稱。
  • ZONE:包含運算執行個體的可用區。

如果偵測到啟動問題,輸出內容會列出原因,並提供修正方法的連結。如果沒有發現問題,請繼續執行手動步驟。

讀取序列控制台輸出內容

如果工具未偵測到問題,或您想確認原因,請自行讀取序列控制台輸出內容:

控制台

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。

    前往 VM 執行個體頁面

  2. 選取要查看序列埠輸出內容的運算執行個體。

  3. 在「記錄」下按一下 [序列埠 1 (主控台)]。

gcloud

gcloud compute instances get-serial-port-output INSTANCE_NAME --zone=ZONE

更改下列內容:

  • INSTANCE_NAME:運算執行個體的名稱。
  • ZONE:包含運算執行個體的可用區。

前往上次啟動。有用的行通常位於第一個 [FAILED] 行、Kernel panic 行或緊急提示之前。然後與後續章節中的簽章進行比較。

常見啟動問題

下列各節列出 Linux 運算執行個體常見的啟動失敗情形、其序列控制台輸出內容特徵,以及解決方法。大多數解決方案都需要您將開機磁碟連接至救援 VM,如「修正磁碟離線問題」一節所述。

無法掛接 /etc/fstab 個檔案項目

症狀:序列埠主控台輸出內容包含類似下列的行,後面接著 You are in emergency mode:

UUID=1234abcd-... does not exist
Timed out waiting for device /dev/sdb1
mount: special device /dev/sdb1 does not exist
[DEPEND] Dependency failed for /mnt/data.mount

原因:/etc/fstab 中的項目參照未連結至運算執行個體的裝置或 UUID,或無法掛接檔案系統。systemd 服務會停止啟動,並切換至緊急模式。

解決方法:在救援 VM 上,修正已掛接磁碟中的 /etc/fstab 項目,或將其移除。如需相關程序,請參閱「Troubleshoot Linux VM boot issues due to fstab errors」。如需可避免遺失裝置阻礙開機的掛接選項,請參閱「掛接磁碟」。

GRUB 無法載入設定或核心

症狀:開機程序在 GRUB 提示字元處停止,且序列控制台輸出內容包含下列幾行:

error: file '/boot/grub/grub.cfg' not found
error: file '/vmlinuz-6.1.0-18-amd64' not found
error: no such partition
error: no such device
error: unknown filesystem
error: you need to load the kernel first
grub rescue>
Minimal BASH-like line editing is supported

原因:GRUB 系統啟動載入程式找不到設定檔、模組,或是設定檔參照的核心和初始 RAM 磁碟。如果套件升級失敗、分割區版面配置變更、/boot 分割區重新格式化或損毀,或是複製磁碟後檔案系統 UUID 變更,就會發生這個問題。

解決方法:在救援 VM 上掛接開機磁碟,並按照「救援 VM」一文所述,進入 chroot 環境,然後按照「設定開機載入程式」一文所述,重新產生 GRUB 設定檔。如果無法修復開機載入器,請從快照還原磁碟。

初始 RAM 磁碟無法掛接根檔案系統

症狀:序列埠控制台輸出內容包含類似下列的行:

dracut-initqueue[452]: Warning: dracut-initqueue timeout - starting timeout scripts
dracut: FATAL: ...
Failed to mount /sysroot
ALERT! UUID=1234abcd-... does not exist. Dropping to a shell!
Gave up waiting for root file system device
VFS: Unable to mount root fs on unknown-block(0,0)

原因:初始 RAM 磁碟 (initramfs) 已啟動,但找不到或無法掛接根檔案系統。常見原因包括:root= 核心參數或 UUID 不再與磁碟相符、initramfs 映像檔缺少磁碟的驅動程式,或是 initramfs 映像檔已損毀。在採用 NVMe 磁碟介面的機器系列中,以裝置路徑 (例如 /dev/sda) 命名磁碟的開機設定不再相符,請改用 UUID。

解決方法:確認初始 RAM 磁碟要尋找的根檔案系統位於已掛接的磁碟上,然後為作業系統重建初始 RAM 磁碟。如需相關程序,請參閱「Troubleshoot Linux VM boot issues due to 核心錯誤」和「Fix the disk offline」。

檔案系統毀損

症狀:序列埠控制台輸出內容包含類似下列的行:

Bad magic number in super-block
EXT4-fs error (device sda1): ...
XFS (sda1): Metadata corruption detected
XFS (sda1): log mount/recovery failed
BTRFS error (device sda1): ...
UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.

原因:開機磁碟上的檔案系統損毀,通常是在非正常關機、磁碟空間已滿或發生 I/O 錯誤後發生。

解決方法:建立磁碟快照。接著,在救援 VM 上,檢查並修復卸載磁碟的檔案系統,詳情請參閱「找出開機磁碟無法開機的原因」。如果檢查無法修復檔案系統,請改用快照還原磁碟。

核心錯誤

症狀:序列控制台輸出內容包含 Kernel panic - not syncing:,後面接著原因,例如 Attempted to kill init!、Fatal exception、hung_task: blocked tasks、Out of memory、Fatal Machine check 或 NMI: Not continuing。損毀的核心映像檔會提早停止,並顯示 -- System halted。

原因:核心發生無法復原的錯誤。冒號後方的理由會指出類別:init 異常終止、硬體機器檢查、記憶體耗盡恐慌,或核心映像檔損毀。

解決方法:重設運算執行個體。如果核心錯誤再次發生,請參閱「排解因核心錯誤導致 Linux VM 無法啟動的問題」。

無法載入 SELinux 政策

症狀:序列控制台輸出內容包含下列其中一項,且啟動作業停止:

Failed to load SELinux policy
Unable to load SELinux policy

您可能也會看到 Warning -- SELinux targeted policy relabel is required,這不是錯誤:運算執行個體會重新標記檔案系統,然後自行重新啟動。

原因:磁碟上的 SELinux 政策存放區遺失或損毀,或者還原或離線變更後,檔案標籤不一致。

解決方法:在救援虛擬機器上,標記已掛接的磁碟,以便在下次啟動時重新標記 SELinux,或在政策儲存庫損毀時,重新安裝作業系統的 SELinux 政策套件。在 RHEL 型 OS 映像檔中,您可以將 SELinux 設為寬鬆模式,讓運算執行個體在您修復政策時啟動,詳情請參閱「將 SELinux 變更為寬鬆模式」。

系統無法啟動 init 程序

症狀:序列埠控制台輸出內容包含類似下列的行:

Failed to switch root
Target filesystem doesn't have requested /sbin/init
No working init found
run-init: /sbin/init: No such file or directory
/sbin/init: error while loading shared libraries: ...

原因:已掛接根檔案系統,但缺少 init 程式 (例如 systemd),或該程式無法執行,或依附於缺少的共用程式庫。這個問題通常發生在套件升級中斷或還原不完整之後。

解決方法:在救援 VM 上,按照「救援 VM」一文所述進入 chroot 環境,確認 init 程式存在且程式庫完好無損。如果程式庫不完整,請使用發行版本的套件管理工具重新安裝 init 系統套件。

緊急模式和鎖定的根帳戶

症狀:序列埠控制台輸出內容結尾會顯示下列其中一項:

You are in emergency mode. After logging in, type "journalctl -xb" to view system logs
Give root password for maintenance (or press Control-D to continue):
Cannot open access to console, the root account is locked.

原因:開機時發生錯誤,systemd停止運作並進入緊急目標。在 Google 提供的 OS 映像檔中,根帳戶沒有密碼,因此無法從序列控制台使用緊急殼層。

解決方法:緊急提示名稱前的幾行會指出失敗的單元。失敗通常是由下列其中一個問題所致:

如「修正離線磁碟」一文所述,請離線修正原因,不要嘗試使用緊急 Shell。

韌體找不到可啟動的磁碟

症狀:序列控制台輸出內容在任何核心訊息之前,包含下列其中一項:

No bootable device.
BdsDxe: failed to load Boot0001
Invalid partition table!
Verification failed: (0x1A) Security Violation

原因:開機磁碟未連接為開機裝置、分割區表格或開機記錄已損毀,或者在啟用安全啟動的 Shielded VM 執行個體上,開機載入器或核心未正確簽署。

解決方法:確認磁碟已連接為運算執行個體的開機磁碟,詳情請參閱「卸離和重新連接磁碟」。如果分割區表或開機記錄損壞,請按照「GRUB 無法載入設定或核心」一文的說明修復開機載入程式。編輯磁碟無法修正安全啟動違規問題:請還原已簽署的核心和開機載入程式,或按照「在 VM 執行個體上修改 Shielded VM 選項」一文所述,在運算執行個體上停用安全啟動。

離線修正磁碟問題

大多數啟動問題都無法從運算執行個體內部修正,因為運算執行個體永遠不會顯示登入提示。請改為將開機磁碟連接至暫時救援 VM、掛接磁碟、進行變更,然後將磁碟移回。如需相關程序,請參閱「救援無法存取的 VM」。

本文中的解決方法假設原始開機磁碟已連結至救援 VM 並掛接。變更磁碟前,請先建立快照,以便在修復失敗時還原。如需相關程序,請參閱「建立封存和標準磁碟快照」。

如果無法修復磁碟,請還原運算執行個體

如果上述解決方法都無法解決問題,或是檔案系統無法修復,請從快照還原開機磁碟,或從快照或自訂 OS 映像檔建立新的運算執行個體,然後將資料移至該執行個體。

後續步驟