本文說明如何找出 Linux Compute Engine 執行個體無法啟動的原因,並修正常見問題。
如果運算執行個體無法啟動,通常會出現下列一或多項徵兆:
- 運算執行個體處於
RUNNING狀態,但您無法使用 SSH 連線至該執行個體。 - 序列控制台輸出內容在啟動序列中途停止,或在緊急或救援提示中結束。
- 序列控制台輸出內容包含
FAILED、error:、Kernel panic或emergency mode。
如要解決開機問題,請先找出原因,然後從運算執行個體內部修正 (如果仍可連線),或將開機磁碟掛接到其他運算執行個體,離線修正問題。
如果運算執行個體完成啟動,但您無法連線,請參閱「排解 SSH 錯誤」。
事前準備
- 確認運算執行個體會寫入序列主控台輸出內容。運算執行個體運作期間,您可查看序列埠輸出內容。如要在運算執行個體停止後保留這些內容,請啟用序列埠記錄功能,將記錄傳送至 Cloud Logging。詳情請參閱「查看序列埠輸出內容」。
-
如果尚未設定驗證,請先完成設定。
驗證程序會確認您的身分,以便授予 Google Cloud 服務和 API 的存取權。如要從本機開發環境執行程式碼或範例,您可以選取下列任一選項,向 Compute Engine 驗證身分:
-
安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:
gcloud init如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
- 設定預設區域和可用區。
-
自動偵測原因
手動讀取序列埠控制台輸出內容前,請先使用下列其中一項工具。每個指令碼都會讀取運算執行個體最近一次啟動的輸出內容、回報最可能的原因,並連結至本文件中的相符章節。
控制台
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
在運算執行個體的列中,按一下「SSH」SSH。
如果連線失敗,請在連線對話方塊中按一下「疑難排解」。疑難排解工具會執行連線檢查,包括分析序列埠控制台輸出的啟動檢查。
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:包含運算執行個體的可用區。
如果偵測到啟動問題,輸出內容會列出原因,並提供修正方法的連結。如果沒有發現問題,請繼續執行手動步驟。
讀取序列控制台輸出內容
如果工具未偵測到問題,或您想確認原因,請自行讀取序列控制台輸出內容:
控制台
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
選取要查看序列埠輸出內容的運算執行個體。
在「記錄」下按一下 [序列埠 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 映像檔建立新的運算執行個體,然後將資料移至該執行個體。