搶救無法存取的 VM

如果 Linux VM 因任何原因無法存取,可以嘗試按照下列步驟救援 VM。

如要在救援運算執行個體前找出無法開機的原因,請參閱「排解 Linux Compute Engine 執行個體開機問題」。

必要的角色

如要取得救援 VM 所需的權限,請要求管理員授予您專案的下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這些預先定義的角色具備救援 VM 所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:

所需權限

必須具備下列權限,才能救援 VM:

  • compute.instances.create 專案
  • compute.disks.create 專案
  • compute.instances.get 專案
  • compute.disks.createSnapshot 磁碟
  • compute.instances.attachDisk 在新 VM 上
  • compute.disks.use 磁碟
  • compute.instances.start 新 VM 和無法存取的 VM
  • compute.instances.stop 新 VM 和無法存取的 VM

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

救援 VM

如果無法連線至 VM,或開機磁碟已滿,您必須建立臨時 VM,才能搶救無法存取的 VM。

  1. (選用) 停止無法存取的 VM。
  2. 從無法存取的 VM 開機磁碟建立快照。如果根檔案系統分散在多個磁碟,則必須為每個磁碟建立快照。
  3. 使用最接近無法存取 VM 作業系統的公開映像檔,建立臨時 VM。 在某些情況下,可信映像檔政策可能會限制您使用公開映像檔建立開機磁碟。在這種情況下,您必須要求管理員暫時解除這項限制,才能建立救援 VM。詳情請參閱「設定映像檔存取限制」。
  4. 針對先前建立的無法存取 VM 開機磁碟快照,請按照下列步驟,從快照建立新磁碟,並將其附加至救援 VM:

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

      前往 VM 執行個體

    2. 按一下您建立的暫時性 VM 名稱。

    3. 按一下「Edit」(編輯)。

    4. 在「Additional disks」(其他磁碟) 下方,按一下 「Add new disk」(新增磁碟),然後執行下列操作:

      1. 新增磁碟名稱,例如 my-recovery-disk
      2. 在「Source type」(來源類型) 部分,選取「Snapshot」(快照) 分頁標籤。
      3. 在「Source snapshot」(來源快照) 下拉式選單中,選取您在先前步驟中建立的來源 VM 快照。
      4. 按一下「完成」。
    5. 按一下 [儲存]。

  5. 使用 SSH 連線至臨時 VM。

  6. 執行下列指令,找出先前連結至 VM 的每個磁碟名稱:

    lsblk -d -o NAME,SERIAL

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

     NAME SERIAL
     sda  rescue-vm
     sdb  my-recovery-disk
     

    在本例中,rescue-vm 是救援 VM 的開機磁碟,my-recovery-disk 則是無法存取的 VM 快照開機磁碟。記下無法存取的 VM NAME,以便在下一個步驟中使用。

  7. 針對先前連接至 VM 的每個磁碟,執行下列操作:

    1. 執行下列指令,找出各個分區的檔案系統:

      fdisk -l /dev/NAME -o Device,Size,Type
      

      將 NAME 替換為上一個步驟中無法存取的 VM 開機磁碟名稱。在這個範例中,名稱為 sdb。

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

      Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
      Disk model: PersistentDisk
      Units: sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 4096 bytes
      I/O size (minimum/optimal): 4096 bytes / 4096 bytes
      Disklabel type: gpt
      Disk identifier: B31430F1-F041-4555-96B9-B2F43DC057AD
      
      Device     Size Type
      /dev/sdb1    2M BIOS boot
      /dev/sdb2   20M EFI System
      /dev/sdb3   10G Linux filesystem
      

      Type 欄會列出每個分區的檔案系統。如果任何磁碟分割區缺少檔案系統類型,請執行下列指令:

      file -sL /dev/PARTITION_NAME
      

      將 NAME 替換為分區名稱。

      輸出內容會因檔案系統類型而異:

      • 沒有檔案系統:如果輸出內容只顯示 data,表示分割區不含檔案系統。輸出內容範例:

        /dev/sdb1: data
        
      • EFI 檔案系統:如果輸出內容說明 DOS/MBR 開機磁區,則該分割區具有 EFI 檔案系統。輸出內容範例:

        dev/sdb2: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "mkfs.fat", sectors/cluster 4, reserved sectors
        4, root entries 512, sectors 40960 (volumes <=32 MB), Media descriptor 0xf8, sectors/FAT 40, sectors/
        track 32, heads 64, serial number 0xf2af2664, label: "EFI        ", FAT (16 bit)
        
      • Linux 檔案系統:如果輸出內容描述檔案系統資料,則分區為 Linux 檔案系統。輸出內容範例:

        /dev/sdb3: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)
        

      請記下 Linux 檔案系統的分區名稱。

    2. 在 /rescue 建立掛接點:

      sudo mkdir /rescue
    3. 將 Linux 檔案系統分區掛接至 /rescue:

      sudo mount PARTITION_NAME /rescue
      

      將 PARTITION_NAME 替換為先前記下的 Linux 檔案系統名稱。

    4. 掛接虛擬檔案系統和裝置,以便使用 chroot 指令修改檔案系統的根目錄:

      sudo mount -t proc /proc /rescue/proc
      sudo mount -t sysfs /sys /rescue/sys
      sudo mount -o bind /dev /rescue/dev
      sudo mount -o bind /dev/pts /rescue/dev/pts
      sudo mount -o bind /run /rescue/run
      
    5. 將根目錄變更為掛接的檔案系統:

      sudo chroot /rescue
      

    無法存取的開機磁碟檔案系統現在掛接在 /rescue,而殼層會在該檔案系統的 chroot 環境中執行。您可以瀏覽檔案系統、變更設定檔、修正問題或擷取資料。

還原變更並重新啟動無法存取的 VM

修正問題或擷取資料後,請按照下列步驟還原原始 VM:

  1. 完成疑難排解後,請結束 chroot 環境:

     exit
     

  2. 從暫時 VM 卸載無法存取的 VM 虛擬檔案系統、裝置和檔案系統:

     cd /
     sudo umount /rescue/run
     sudo umount /rescue/dev/pts
     sudo umount /rescue/dev
     sudo umount /rescue/sys
     sudo umount /rescue/proc
     sudo umount /rescue
     

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

    前往 VM 執行個體

    1. 選取您建立的暫時性 VM。

    2. 點選「Edit」(編輯)。

    3. 在 Additional disks (其他磁碟) 下方,點選先前步驟中建立的磁碟的 ,從臨時 VM 卸載其他磁碟。

    4. 按一下 [儲存]。

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

    前往 VM 執行個體

    1. 如果無法存取的 VM 仍在運作,請停止 VM。

    2. 按一下剛停止的 VM 名稱,然後點選「編輯」。

    3. 在「開機磁碟」下方,按一下「卸載開機磁碟」,從無法存取的 VM 卸載現有開機磁碟。

    4. 接著,按一下「 CONFIGURE BOOT DISK」(設定開機磁碟),附加您先前在本頁「Rescue a VM」(救援 VM) 中建立及修正的磁碟。

      1. 在「開機磁碟」部分,按一下「現有磁碟」分頁標籤。
      2. 在下拉式清單中,選取您在上一節建立的磁碟,例如 my-recovery-disk。
      3. 依序點選「選取」和「儲存」。
    5. 啟動 VM。

  5. 您現在應該可以使用 SSH 連線至 VM。