排解 VM 啟動問題


本文提供 VM 啟動問題的疑難排解資訊,包括配額錯誤開機磁碟

配額錯誤

如果嘗試啟動執行個體時收到配額錯誤,請要求額外的 CPU 配額。詳情請參閱資源配額說明文件的「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. 對根分區進行檔案系統檢查:

      sudo fsck /dev/sdb1
      fsck from util-linux 2.20.1
      e2fsck 1.42.5 (29-Jul-2012)
      /dev/sdb1: clean, 19829/655360 files, 208111/2621184 blocks
      
    7. 掛接檔案系統:

       sudo mkdir /mydisk
      
       sudo mount /dev/sdb1 /mydisk
      
    8. 確認磁碟具有核心檔案:

       ls /mydisk/boot/vmlinuz-*
       /mydisk/boot/vmlinuz-3.2.0-4-amd64
       

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

    在連接永久開機磁碟 (如 /dev/sdb) 的偵錯執行個體上,執行以下指令:

    sudo parted /dev/sdb print
    

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

    Disk /dev/sdb: 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. In the Google Cloud console, go to the Disks page.

    Go to Disks

  2. Click Create disk.
  3. On the Create a disk page, specify the following attributes:
    • Zone: Select a zone near you. You must use this same zone when you create your temporary instance.
    • Disk source type: Image
    • Source image: Specify the name of the boot disk image that you imported.
  4. To create the disk, click Create.

建立臨時執行個體,以便在當中連接獨立磁碟及設定系統啟動載入程式,使其能在 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 控制台環境中正常運作。

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 /dev/sdb1 /tmp
    
  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」(開機磁碟) 區段中,按一下「Change」(變更) 開始設定開機磁碟。

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

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