如果 Linux VM 因任何原因無法存取,請嘗試按照下列步驟救援 VM。
必要的角色
如要取得救援 VM 所需的權限,請要求管理員授予您專案的下列 IAM 角色:
-
Compute 執行個體管理員 (v1) (
roles/compute.instanceAdmin.v1
) -
使用服務帳戶的 VM:
服務帳戶使用者 (
roles/iam.serviceAccountUser
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這些預先定義的角色具備救援 VM 所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
如要搶救 VM,必須具備下列權限:
-
compute.instances.create
專案 -
compute.disks.create
專案 -
compute.instances.get
專案 -
compute.disks.createSnapshot
磁碟 -
compute.instances.attachDisk
在新 VM 上 -
compute.disks.use
磁碟 -
compute.instances.start
在新的 VM 上,但無法存取 -
compute.instances.stop
在新的 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 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 的快照開機磁碟。記下無法存取 VM 的NAME
,以便在下一個步驟中使用。針對先前連結至 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
無法存取的開機磁碟檔案系統現在已掛接至
/rescue
。 您可以瀏覽檔案系統、變更設定檔、修正問題或擷取資料。
還原變更並重新啟動無法存取的 VM
修正問題或擷取資料後,您需要還原實際的 VM。請按照下列步驟還原原始 VM:
在臨時 VM 中,卸載掛接在
/rescue
的額外磁碟:cd ~ sudo umount /rescue
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
選取您建立的暫時性 VM。
按一下「編輯」
。在「Additional disks」(其他磁碟) 底下,按一下先前步驟中建立的磁碟的
,從臨時 VM 卸離其他磁碟。按一下 [儲存]。
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
現在您應該可以使用 SSH 連線至 VM。