如果您因任何原因無法存取 Linux 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 OS 的公開映像檔建立暫時性 VM。在某些情況下,信任的映像檔政策可能會限制您無法從公開映像檔建立開機磁碟。在這種情況下,您必須請管理員暫時解除這項限制,才能建立救援 VM。詳情請參閱「設定圖片存取限制」。
針對先前建立的無法存取 VM 開機磁碟的每個快照,請按照下列步驟操作,從快照建立新磁碟,然後將磁碟連結至救援 VM:
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
按一下您建立的臨時 VM 名稱。
按一下「Edit」(編輯)
。在「Additional disks」(其他磁碟) 下方,點選
「Add new disk」(增加新磁碟),然後執行下列操作:- 新增磁碟名稱,例如 my-recovery-disk
- 在「Source type」(來源類型) 部分,選取「Snapshot」(快照) 分頁。
- 在「Source snapshot」(來源快照) 下拉式選單中,選取先前在這些步驟中建立的來源虛擬機的快照。
- 按一下 [完成]。
按一下 [儲存]。
使用 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。