排解 VM 啟動問題

本文提供疑難排解資訊,說明如何解決因配額錯誤和開機磁碟而導致的 VM 啟動問題。

配額錯誤

如果在啟動 VM 時收到配額錯誤,表示您可能已達到專案中資源的配額值。如要瞭解錯誤訊息、找出超出配額的值,以及如何排解問題,請參閱「排解配額錯誤」頁面。

開機磁碟

如果執行個體未啟動,且您無法連線或透過互動式序列控制台登入,請找出開機磁碟未完成開機和啟動程序的原因。

找出開機磁碟無法開機的原因

  • 確認開機磁碟未滿。

    如果開機磁碟已完全用盡,且作業系統不支援自動調整大小,您就無法連線至執行個體。您必須建立新的執行個體並且重新建立開機磁碟。詳情請參閱「復原 VM 或完整開機磁碟」。

  • 檢查虛擬機器執行個體的序列埠輸出內容。

    執行個體的 BIOS、開機載入程式和核心會將偵錯訊息列印到執行個體的序列埠輸出中,提供執行個體發生任何錯誤或問題的寶貴資訊。如果啟用序列埠輸出記錄功能,將記錄傳送至 Cloud Logging,即使執行個體未執行,您也能存取這項資訊。

  • 啟用序列主控台的互動存取權。

    您可以啟用執行個體序列控制台的互動式存取權,這樣就能從執行個體內部登入並偵錯啟動問題,不必等到執行個體完全啟動。詳情請參閱「使用序列控制台排解問題」。

  • 確認開機磁碟複製作業未進行中

    如果開機磁碟正在複製,您就無法啟動 VM,且會看到類似下列的錯誤訊息。

    Failed to start example-vm: The instance resource 'projects/example-project/zones/us-central1-b/instances/example-vm' is already being used by 'projects/example-project/zones/us-central1-b/disks/clone'
    

    等待複製作業完成,然後啟動 VM。

  • 確認開機磁碟的快照作業未進行中

    如果開機磁碟的快照正在建立中,您就無法啟動 VM,且會看到類似下列的錯誤:

    The instance resource 'projects/example-project/zones/asia-east1-b/instances/example-vm' is already being used by 'projects/example-project/global/snapshots/example-vm-prod-asia-east1-b-abc'
    

    等待快照建立完成,然後啟動 VM。

  • 請確認磁碟具備有效的檔案系統。

    如果檔案系統損毀或無效,您就無法啟動執行個體。驗證磁碟的檔案系統:

    1. 如果磁碟已連接至執行個體,請將其卸離:

      gcloud compute instances delete old-instance --keep-disks boot
      
    2. 使用來自 Google 提供的最新映像檔啟動新的執行個體:

      gcloud compute instances create debug-instance
    3. 將磁碟連接為非開機磁碟,但不要掛接。將 DISK 替換為無法開機的磁碟名稱。記下用於識別執行個體磁碟的裝置名稱:

      gcloud compute instances attach-disk debug-instance \
          --disk DISK \
          --device-name debug-disk
      
    4. 連線至執行個體:

      gcloud compute ssh debug-instance
      
    5. 找出磁碟的根分割區,該分割區會以 part1 標記識別。在本例中,磁碟的根分割區位於 /dev/sdb1:

      ls -l /dev/disk/by-id
      total 0
      lrwxrwxrwx 1 root root  9 Jan 22 17:09 google-debug-disk -> ../../sdb
      lrwxrwxrwx 1 root root 10 Jan 22 17:09 google-debug-disk-part1 -> ../../sdb1
      lrwxrwxrwx 1 root root  9 Jan 22 17:02 google-persistent-disk-0 -> ../../sda
      lrwxrwxrwx 1 root root 10 Jan 22 17:02 google-persistent-disk-0-part1 -> ../../sda1
      lrwxrwxrwx 1 root root  9 Jan 22 17:09 scsi-0Google_PersistentDisk_debug-disk -> ../../sdb
      lrwxrwxrwx 1 root root 10 Jan 22 17:09 scsi-0Google_PersistentDisk_debug-disk-part1 -> ../../sdb1
      lrwxrwxrwx 1 root root  9 Jan 22 17:02 scsi-0Google_PersistentDisk_persistent-disk-0 -> ../../sda
      lrwxrwxrwx 1 root root 10 Jan 22 17:02 scsi-0Google_PersistentDisk_persistent-disk-0-part1 -> ../../sda1
      
    6. 請完成下列步驟,對根磁碟分割區執行檔案系統檢查:

      1. 執行 lsblk -f,找出磁碟分區的檔案系統類型:

        sudo lsblk -f

        輸出結果會與下列內容相似:

        NAME   FSTYPE LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINT
        sdb
        └─sdb1 xfs          2e4f7b4e-9b0a-4b7c-8b8a-9b0a4b7c8b8c
        sda
        └─sda1 ext4         0e4f7b4e-9b0a-4b7c-8b8a-9b0a4b7c8b8a
      2. 視檔案系統類型而定,執行下列其中一項指令,檢查檔案系統是否有錯誤:

        ext 或 vfat

        如果根分割區檔案系統是 ext2、ext3、ext4 或 vfat,請執行 fsck 指令,如下所示:

        sudo fsck DEVICE_NAME

        將 DEVICE_NAME 替換為根分區的裝置名稱,例如 /dev/sdb1。

        如果 fsck 傳回 Bad magic number in super-block 等錯誤,表示檔案系統已損毀。

        xfs

        如果根分區檔案系統為 xfs,請使用 xfs_repair 工具。

        1. xfs_repair 無法在掛接的檔案系統上運作。執行 xfs_repair 前,請務必先卸載分割區。如果已掛接分割區,請執行 umount 指令來卸載。將 DEVICE_NAME 替換為根分區的裝置名稱,例如 /dev/sdb1。

          sudo umount DEVICE_NAME
        2. 如要掃描檔案系統是否有錯誤,請使用 -n 選項,在模擬測試模式下執行 xfs_repair。

          sudo xfs_repair -n DEVICE_NAME
          
          • 如果沒有發現錯誤,或 xfs_repair -n 順利完成,表示沒有損毀。您應調查 VM 啟動失敗的其他原因。
          • 如果系統回報錯誤,或 xfs_repair -n 失敗並顯示類似 If you wish to clear the log, mount the file system with the norecovery option 的訊息,請繼續執行下一個步驟,嘗試修復。
        3. 如要修復檔案系統,請執行 xfs_repair 指令,但不要使用 -n 選項。

          sudo xfs_repair DEVICE_NAME
          

          如果 xfs_repair 失敗並建議使用 -L 選項,請執行 xfs_repair 並加上 -L 選項,清除記錄並重新嘗試修復檔案系統。

          sudo xfs_repair -L DEVICE_NAME
          
    7. 掛接檔案系統:

      sudo mkdir MOUNT_POINT
      
      sudo mount DEVICE_NAME MOUNT_POINT
      

      更改下列內容:

      • DEVICE_NAME:根分區的裝置名稱,例如 /dev/sdb1。
      • MOUNT_POINT:要掛接磁碟的目錄,例如 /mydisk。
    8. 確認磁碟具有核心檔案:

       ls MOUNT_POINT/boot/vmlinuz-*
       

      輸出結果會與下列內容相似:

       MOUNT_POINT/boot/vmlinuz-3.2.0-4-amd64
       

  • 確認磁碟具備有效的主開機記錄 (MBR)。

    在已連接永久開機磁碟的偵錯執行個體上,執行下列指令:

    sudo parted DISK_DEVICE print
    

    將 DISK_DEVICE 替換為要檢查的永久開機磁碟裝置名稱,例如 /dev/sdb1。

    如果 MBR 有效,會列出檔案系統的相關資訊:

    Disk DISK_DEVICE: 10.7GB
    Sector size (logical/physical): 512B/4096B
    Partition Table: msdos
    Disk Flags:
    Number  Start   End     Size    Type     File system  Flags
     1      2097kB  10.7GB  10.7GB  primary  ext4         boot
    

修正啟動問題

找出開機和啟動程序失敗的原因後,請完成下列其中一項動作,修正問題:

建立獨立開機磁碟

將匯入的映像檔掛接至連接到臨時 VM 執行個體的次要磁碟。使用 Google Cloud 控制台或 gcloud CLI,從您上傳的映像檔建立獨立磁碟,並建立附加獨立磁碟的臨時 VM。您可以使用這個執行個體修改獨立磁碟上的檔案,並修正導致該映像檔無法啟動的問題。

控制台

您可以透過您匯入的開機磁碟映像檔建立獨立磁碟。或者,您也可以將開機磁碟從執行個體卸離,然後改用卸離的開機磁碟建立執行個體。

  1. 前往 Google Cloud 控制台的「Disks」(磁碟) 頁面。

    前往「Disks」(磁碟) 頁面

  2. 按一下 [Create Disk] (建立磁碟)。
  3. 在「建立磁碟」頁面中, 指定下列屬性:
    • 區域: Select a zone near you. You must use this same zone when you create your temporary instance.
    • 磁碟來源類型: 圖片
    • 來源映像檔: 指定您匯入的開機磁碟映像檔名稱。
  4. 如要建立磁碟,請按一下「建立」。

建立臨時執行個體,您可以在其中連結獨立磁碟,並設定開機載入程式,以便在 Google Cloud 控制台環境中運作。

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

    前往「Instances」(執行個體) 頁面

  2. 按一下 [Create instance] (建立執行個體) 按鈕。

  3. 在「建立執行個體」頁面中,指定執行個體名稱和執行個體所在的區域。這個區域必須與您建立獨立磁碟的區域相同。

  4. 展開 [Management, security, disks, networking, sole tenancy] (管理、安全性、磁碟、網路、單獨租用) 區段。

  5. 在「Additional disks」(其他磁碟) 區段的「Disks」(磁碟) 分頁底下,按一下 [Attach existing disk] (連接現有的磁碟)。系統隨即會顯示新的區段。

  6. 從「Disk」(磁碟) 區段的下拉式選單中選取您建立的獨立磁碟。這項操作會將獨立磁碟連接至執行個體,以便您之後掛接及修改磁碟內容。

  7. 按一下 [Done] (完成) 來完成磁碟連接程序。

  8. 按一下 [Create] (建立) 按鈕來建立執行個體。

gcloud

您可以透過您匯入的開機磁碟映像檔建立獨立磁碟。或者,您也可以將開機磁碟從執行個體卸離,然後改用卸離的開機磁碟建立執行個體。

gcloud compute disks create DISK_NAME \
    --zone=ZONE \
    --image=IMAGE_NAME

更改下列內容:

  • DISK_NAME:新獨立磁碟的名稱。

  • ZONE:你附近的區域。建立臨時執行個體時,必須使用這個可用區。

  • IMAGE_NAME:您匯入的開機磁碟映像檔名稱。

建立臨時執行個體,您可以在其中連結獨立磁碟,並設定開機載入程式,以便在 Google Cloud 控制台環境中運作。

gcloud compute instances create INSTANCE_NAME \
    --zone=ZONE \
    --disk name=DISK_NAME

更改下列內容:

  • INSTANCE_NAME:執行個體的專屬名稱

  • ZONE:您建立獨立磁碟的可用區

  • DISK_NAME:您從匯入的開機磁碟映像檔建立的獨立磁碟名稱

當您建立連結獨立磁碟的執行個體後,系統會為您建立虛擬環境,可讓您透過原始開機磁碟映像檔修改系統啟動載入程式。

設定開機磁碟

連線至執行個體,掛接獨立磁碟,然後設定系統啟動載入程式,讓執行個體在 Compute Engine 正常啟動。

  1. 使用瀏覽器中的 SSH 或 gcloud compute ssh 指令連線至臨時執行個體。
  2. 使用 blkid 指令找到您要修改的磁碟以及您要掛接的磁碟分區。在以下範例中,/dev/sdb 是您匯入的磁碟。

    lsblk
    
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   10G  0 disk
    └─sda1   8:1    0   10G  0 part /
    sdb      8:16   0  100G  0 disk
    ├─sdb1   8:17   0   96G  0 part
    ├─sdb2   8:18   0    1K  0 part
    └─sdb5   8:21   0    4G  0 part
    
  3. 將獨立磁碟的根磁碟分區掛接至 /tmp 目錄。在以下範例中,/dev/sdb1 是根磁碟分區,且您不必對其他磁碟分區進行任何修改。視您的磁碟分區配置而定,您可能得掛接多個磁碟分區,才能存取所有您必須變更的檔案。

    sudo mount DEVICE_NAME /tmp
    

    將 DEVICE_NAME 替換為要掛接的根分區裝置名稱,例如 /dev/sdb1。

  4. 編輯可能導致磁碟啟動程序失敗的檔案。詳情請參閱系統啟動載入程式設定操作說明。

  5. 從臨時執行個體卸載開機磁碟。

    sudo umount /tmp
    

使用開機磁碟

設定完這個磁碟後,請將其卸離,並做為新執行個體的開機磁碟使用。

控制台

從臨時執行個體卸離獨立磁碟。

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

    前往「執行個體」

  2. 在執行個體清單中,按一下您修改獨立開機磁碟的臨時執行個體名稱。執行個體詳細資料頁面隨即會開啟。

  3. 在執行個體詳細資料頁面的頂端,按一下 [Edit] (編輯)。

  4. 在「Additional disks」(其他磁碟) 下方,點選獨立磁碟旁的「X」,表示要將磁碟從暫時執行個體卸離。

  5. 按一下 [儲存] 以儲存變更。

使用已卸載的獨立磁碟建立執行個體。

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

    前往「執行個體」

  2. 按一下 [Create instance] (建立執行個體) 按鈕。

  3. 在「建立執行個體」頁面中,指定執行個體名稱和執行個體所在的區域。這個區域必須與您建立獨立磁碟的區域相同。

  4. 在「開機磁碟」下方,按一下「變更」,開始設定開機磁碟。

  5. 在「Existing disks」(現有磁碟) 分頁中,選擇要用做這個新執行個體開機磁碟的獨立開機磁碟。

  6. 按一下 [Create] (建立) 按鈕來建立執行個體。

gcloud

從臨時執行個體卸離獨立磁碟。

gcloud compute instances detach-disk INSTANCE_NAME \
    --disk name=DISK_NAME

更改下列內容:

  • INSTANCE_NAME:執行個體的專屬名稱。
  • DISK_NAME:新獨立磁碟的名稱。

使用已卸離的獨立磁碟建立執行個體。

gcloud compute instances create INSTANCE_NAME \
    --zone ZONE \
    --disk name=DISK_NAME,boot=yes

更改下列內容:

  • INSTANCE_NAME:執行個體的專屬名稱
  • ZONE:獨立磁碟所在的可用區
  • DISK_NAME:從匯入的開機磁碟映像檔建立的獨立磁碟名稱

測試您使用已修改的開機磁碟建立的執行個體。如果還是無法連線至執行個體,請再次查看序列埠輸出內容,找出啟動程序失敗的位置。重複執行疑難排解程序,直到修正開機磁碟映像檔的問題為止。