Google-Compute-Engine

如何複製 GCP 虛擬機實例啟動磁碟,對其進行讀/寫,然後重新附加它

  • September 20, 2019

儘管我確信可以完成整體操作,例如參見分離和重新連接部分,但可能無法僅將其作為一個操作來完成,比如說,操作。

這裡的案例是,一個 RHEL 映像啟動到緊急模式並且 root 訪問被禁用,或者其他一些問題導致您現在無法進入機器,但是通過文件系統上的操作可以解決這個問題(編輯例如 fstab)。

instance0不會開機。我們需要第二個實例 ( instance1) 來附加和掛載instance0. 假設兩個實例都在同一個區域(相應地修改),讓我們設置一些變數:

project= #TODO fill
zone= #TODO fill
instance0= #TODO fill
instance1= #TODO fill
instance0_bootdisk=$(gcloud compute instances describe $instance0 --format "value(disks[0].deviceName)")
instance0_bootdisk_snapshot=$instance0_bootdisk"-snapshot"
instance0_bootdisk_clone=$instance0_bootdisk_snapshot"-disk"
instance1_mntdev="/dev/sdb1"
instance1_mntpath="/mnt/clone"

我們假設它instance1只有一個磁碟(引導磁碟),所以/dev/sdb1可以工作(相應地修改)。

為方便起見,發出:

gcloud config set project $project
gcloud config set compute/zone $zone

為了讓程序繼續進行,讓我們停止instance0,創建其啟動磁碟的快照,分離啟動磁碟並從提到的快照創建一個新磁碟:

gcloud compute instances stop $instance0

gcloud compute disks snapshot $instance0_bootdisk --snapshot-names $instance0_bootdisk_snapshot --zone $zone

gcloud compute instances detach-disk $instance0 --device-name $instance0_bootdisk

gcloud compute disks create $instance0_bootdisk_clone --source-snapshot $instance0_bootdisk_snapshot

現在,我們將新創建的磁碟作為數據磁碟附加到instance1, rw 掛載它,寫入它,解除安裝它,並可選擇分離它

gcloud compute instances attach-disk $instance1 --disk $instance0_bootdisk_clone --device-name $instance0_bootdisk_clone

gcloud compute ssh $instance1 --command "sudo mkdir -p $instance1_mntpath && sudo mount $instance1_mntdev $instance1_mntpath"

gcloud compute ssh $instance1  -- sudo vi $instance1_mntpath/etc/fstab" #for example
gcloud compute scp $instance1:/var/log/syslog . #for another example 

gcloud compute ssh $instance1 --command "sudo umount $instance1_mntpath"

gcloud compute instances detach-disk $instance1 --device-name $instance0_bootdisk_clone #not mandatory

最後我們附上修改後的創建磁碟作為啟動盤,instance0希望作業系統能夠啟動。


gcloud compute instances attach-disk $instance0 --disk $instance0_bootdisk_clone --device-name $instance0_bootdisk --boot

gcloud compute instances start $instance0 #wait for completion
gcloud compute ssh $instance0 --command "ps 1"

引用自:https://serverfault.com/questions/985022