排解 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

        如果根分區檔案系統是 ext2ext3ext4vfat,請執行 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 控制台 Google Cloud 環境中正常運作。

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

    前往「Instances」(執行個體)

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

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

  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 控制台 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 執行個體) 頁面

    前往「Instances」(執行個體)

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

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

  4. 在「Additional disks」(其他磁碟) 底下,按一下獨立磁碟旁邊的「X」,表示您要從臨時執行個體卸離獨立磁碟。

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

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

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

    前往「Instances」(執行個體)

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

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

  4. 在「Boot disk」(開機磁碟) 區段中,按一下「變更」開始設定開機磁碟。

  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:您透過匯入的開機磁碟映像檔建立的獨立磁碟名稱

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