如果 Linux VM 因任何原因無法存取,可以嘗試按照下列步驟救援 VM。
如要在救援運算執行個體前找出無法開機的原因,請參閱「排解 Linux Compute Engine 執行個體開機問題」。
必要的角色
如要取得救援 VM 所需的權限,請要求管理員授予您專案的下列 IAM 角色:
- Compute 執行個體管理員 (v1) (
roles/compute.instanceAdmin.v1) -
使用服務帳戶的 VM:服務帳戶使用者 (
roles/iam.serviceAccountUser)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
這些預先定義的角色具備救援 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。
- (選用) 停止無法存取的 VM。
- 從無法存取的 VM 開機磁碟建立快照。如果根檔案系統分散在多個磁碟,則必須為每個磁碟建立快照。
- 使用最接近無法存取 VM 作業系統的公開映像檔,建立臨時 VM。 在某些情況下,可信映像檔政策可能會限制您使用公開映像檔建立開機磁碟。在這種情況下,您必須要求管理員暫時解除這項限制,才能建立救援 VM。詳情請參閱「設定映像檔存取限制」。
針對先前建立的無法存取 VM 開機磁碟快照,請按照下列步驟,從快照建立新磁碟,並將其附加至救援 VM:
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
按一下您建立的暫時性 VM 名稱。
按一下「Edit」(編輯)。
在「Additional disks」(其他磁碟) 下方,按一下 「Add new disk」(新增磁碟),然後執行下列操作:
- 新增磁碟名稱,例如 my-recovery-disk
- 在「Source type」(來源類型) 部分,選取「Snapshot」(快照) 分頁標籤。
- 在「Source snapshot」(來源快照) 下拉式選單中,選取您在先前步驟中建立的來源 VM 快照。
- 按一下「完成」。
按一下 [儲存]。
使用 SSH 連線至臨時 VM。
執行下列指令,找出先前連結至 VM 的每個磁碟名稱:
lsblk -d -o NAME,SERIAL
輸出結果會與下列內容相似:
NAME SERIAL sda rescue-vm sdb my-recovery-disk
在本例中,
rescue-vm是救援 VM 的開機磁碟,my-recovery-disk則是無法存取的 VM 快照開機磁碟。記下無法存取的 VMNAME,以便在下一個步驟中使用。針對先前連接至 VM 的每個磁碟,執行下列操作:
執行下列指令,找出各個分區的檔案系統:
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 檔案系統的分區名稱。
在
/rescue建立掛接點:sudo mkdir /rescue
將 Linux 檔案系統分區掛接至
/rescue:sudo mount PARTITION_NAME /rescue
將 PARTITION_NAME 替換為先前記下的 Linux 檔案系統名稱。
掛接虛擬檔案系統和裝置,以便使用
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
將根目錄變更為掛接的檔案系統:
sudo chroot /rescue
無法存取的開機磁碟檔案系統現在掛接在
/rescue,而殼層會在該檔案系統的chroot環境中執行。您可以瀏覽檔案系統、變更設定檔、修正問題或擷取資料。
還原變更並重新啟動無法存取的 VM
修正問題或擷取資料後,請按照下列步驟還原原始 VM:
完成疑難排解後,請結束
chroot環境:exit
從暫時 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
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
選取您建立的暫時性 VM。
點選「Edit」(編輯)。
在 Additional disks (其他磁碟) 下方,點選先前步驟中建立的磁碟的 ,從臨時 VM 卸載其他磁碟。
按一下 [儲存]。
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
如果無法存取的 VM 仍在運作,請停止 VM。
按一下剛停止的 VM 名稱,然後點選「編輯」。
在「開機磁碟」下方,按一下「卸載開機磁碟」,從無法存取的 VM 卸載現有開機磁碟。
接著,按一下「 CONFIGURE BOOT DISK」(設定開機磁碟),附加您先前在本頁「Rescue a VM」(救援 VM) 中建立及修正的磁碟。
- 在「開機磁碟」部分,按一下「現有磁碟」分頁標籤。
- 在下拉式清單中,選取您在上一節建立的磁碟,例如
my-recovery-disk。 - 依序點選「選取」和「儲存」。
您現在應該可以使用 SSH 連線至 VM。