Как клонировать загрузочный диск экземпляра виртуальной машины GCP, читать / записывать с него / на него и повторно подключать его

Хотя я уверен, что вся операция может быть выполнена, см., Например, отсоединение и повторное присоединение части , это может быть невозможно сделать как только одна, скажем, операция.

Пример использования здесь: образ RHEL загружается в аварийный режим и отключен root-доступ, или какая-то другая проблема, из-за которой вы не можете войти в машину сейчас, но с операции с файловой системой это можно исправить (например, отредактировать fstab).

0
задан 20 September 2019 в 17:16
1 ответ

Скажем, 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 , монтируем его, записываем в него, размонтируем и при желании отсоедините его

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"
0
ответ дан 5 December 2019 в 00:47

Теги

Похожие вопросы