Хотя я уверен, что всю операцию можно выполнить, см. отсоединить и снова прикрепить деталь например, это может быть невозможно сделать всего за одну, скажем, операцию.
Пример использования здесь: образ 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"