1. 程式人生 > >我的虛擬機器掛了!怎麼把映象裡面的資料找回來?

我的虛擬機器掛了!怎麼把映象裡面的資料找回來?

建立了一個虛擬機器,不知道為什麼掛了,重啟也啟動不了,VNC也登不上去,強行關機後再也啟動不起來了,開機一大堆錯誤,可是裡面還有很重要的資料啊,怎麼辦,怎麼辦,誰能救救我!

下面分析幾個解救的方法。

方法零:誰讓你把重要資料放在系統盤裡面了,請使用雲盤,也即塊儲存,虛擬機器掛了,盤可以輕鬆的關聯到新的機器上,而且塊儲存系統如Ceph多是三備份,資料丟不了,下次請牢記。

您肯定會罵我,這次咋辦,下面分享真正解救的辦法。

1. 方法一:使用qemu的工具Network Block Device

網路塊裝置是通過NBD Server將虛擬塊裝置通過TCP/IP export出來,可以遠端訪問。

NBD Server通常是qemu-nbd

1.1 使用方法一:可以提供unix socket

qemu-nbd -t -k /home/openstack/images/ubuntutest-nbd ubuntutest.img

連線這個unix socket

qemu-system-x86_64 -enable-kvm -name ubuntutest -m 2048 -hda nbd:unix:/home/openstack/images/ubuntutest-nbd -vnc :19 -net nic,model=virtio -net tap,ifname=tap0,script=no,downscript=n -monitor stdio

1.2 使用方法二:普通的socket連線

qemu-nbd -t -p 1088 ubuntutest.qcow2

qemu-system-x86_64 -enable-kvm -name ubuntutest  -m 2048 -hda nbd:16.158.166.150:1088 -vnc :19 -net nic,model=virtio -net tap,ifname=tap0,script=no,downscript=n -monitor stdio

1.3 使用方法三:將映象 mount到一個network block device

竟然可以這樣做,咱們映象裡面的內容有救了。

檢視核心是否編譯進去NBD

#grep NBD /boot/config-XXXX-generic 

CONFIG_BLK_DEV_NBD=m

檢視核心模組資訊modinfo nbd

 

檢視核心模組是否載入lsmod | grep nbd

如果沒有載入modprobe nbd,也可以指定最多的partition: modprobe nbd max_part=16

載入後出現16個NBD

  

檢視哪個nbd device被使用:cat /proc/partitions

 

將image付給一個network block device

qemu-nbd -c /dev/nbd0 ubuntutest.img

可以看到這個image裡面有三個partition

 

Mount其中一個partition

可以看到裡面的檔案啦!!!!!

修改結束後

umount ubuntutestnbd0p1

qemu-nbd -d /dev/nbd0

 

2. 方法二:如果映象裡面是LVM

有LVM的情況相對複雜

qemu-nbd -c /dev/nbd0 centos-5.8.new.qcow2

 

發現裡面有LVM,當然LVM不能作為整體訪問,因為裡面有Logic volume,都是單獨成檔案系統的

檢視LVM的資訊

 

Import這個volume group

vgimport VolGroup00

將這個volume group設為active

vgchange -ay VolGroup00

 

Mount其中一個LV

mount /dev/VolGroup00/LogVol00 ubuntutestnbd0p1/

可以拿到這個Logic Volume裡面的檔案啦!!!!!

修改結束後

umount ubuntutestnbd0p1/

vgchange -an VolGroup00

vgexport VolGroup00

qemu-nbd -d /dev/nbd0

3. 方法三:使用libguestfs

這個工具十分強大,Libguestfs可以在不啟動虛擬機器的情況下,編輯Image

安裝:apt-get install libguestfs-tools

編輯一個Image:

guestfish -a trusty-server-cloudimg-amd64-disk1.img

接著執行run,則一個虛擬機器啟動了

 

檢視所有的檔案系統

list-filesystems

Mount這個檔案系統

mount /dev/sda1 /

3.1 libguestfs的架構和原理,知其然知其所以然

  • guestfish -a trusty-server-cloudimg-amd64-disk1.img啟動的程序,也即那個互動命令列是main program

  • 執行run的時候,會建立一個child process,在child process中,qemu執行一個稱為appliance的小的虛擬機器。建立子程序是由guestfs_launch函式完成的

  • 在appliance中,運行了linux kernel和一系列使用者空間的工具(LVM, ext2等),以及一個後臺程序guestfsd

  • main process中的libguestfs和這個guestfd通過RPC進行互動。

  • 由child process的kernel來操作disk image

libguestfs是一個C的library,你可以寫一個C的程式,將這個類庫載入進去,呼叫它的API

文件http://libguestfs.org/guestfs.3.html就描述了這些C的API

而guestfish是一個互動命令列,可以通過執行命令,他來呼叫C類庫的API,幫我們完成操作

文件http://libguestfs.org/guestfish.1.html描述了這些命令,幾乎所有的API,都有對應的命令

3.2 Libguestfs appliance的啟動過程,更詳細的瞭解它

如果我們想看這個appliance啟動的詳細過程,則需要export LIBGUESTFS_DEBUG=1

然後執行guestfish -a trusty-server-cloudimg-amd64-disk1.img

然後執行run,打印出很多的東西

(1) 啟動guestfish

 

(2) 執行supermin

 

(3) 選擇kernel

 

(4) 選擇initrd, root images, 建立appliance

 

(5) 檢測qemu

 

(6) 啟動qemu appliance

 

(7)啟動initrd

  

(8) load kernel modules

 

(9) mount sda, sdb

 

(10) 將sdb作為root device

 

(11) 執行init

 

(12) 啟動guestfsd

 

(13) 開通一個埠,C類庫會通過RPC連線這個埠

 

3.3 Guestfish的有很多的命令

  • 新增一個drive

這個命令只有在run之前起作用

對應的API是guestfs_add_drive_opts

add-drive filename [readonly:true|false] [format:..] [iface:..] [name:..] [label:..] [protocol:..] [server:..]

guestfish -a trusty-server-cloudimg-amd64-disk1.img,這個Image是第一個drive

add-drive /home/openstack/images/ubuntutest.img format:qcow2,新增一個drive

執行run

檢視所有的device: list-devices

檢視所有的分割槽: list-partitions

檢視所有的檔案系統: list-filesystems

 

  • Mount檔案系統

對應的API是guestfs_mount

mount /dev/sda1 /

檔案系統操作

ls /

mkdir /mnt/sdb

mount /dev/sdb1 /mnt/sdb

ls /mnt/sdb

ls /mnt/sdb/home/openstack

cat /mnt/sdb/home/openstack/.bash_history

更多檔案系統命令chown,chmod,cp等都支援

 

  • 對partition的操作

part-list /dev/sdb

part-get-bootable /dev/sdb 1

有個partition的命令包括:

part-add,part-del,part-disk,part-get-bootable,part-get-gpt-type,part-get-mbr-id,part-get-name,part-get-parttype,part-init,part-list,part-set-bootable,part-set-gpt-type,part-set-mbr-id,part-set-name,part-to-dev,part-to-partnum

 

  • 對LVM的操作,哈哈不用害怕LVM了,也不用複雜做這麼多操作

guestfish -a trusty-server-cloudimg-amd64-disk1.img

add-drive ./centos-5.8.new.qcow2 format:qcow2

run

檢視所有的PV: pvs-full

檢視所有的VG: vgs-full

命令包含:lvcreate, lvcreate-free, lvm-canonical-lv-name, lvm-clear-filter, lvm-remove-all, lvm-set-filter, lvremove, lvrename, lvresize, lvresize-free, lvs, lvs-full, lvuuid, pvcreate, pvremove, pvresize, pvresize-size, pvs, pvs-full, pvuuid, vg-activate, vg-activate-all, vgchange-uuid, vgchange-uuid-all, vgcreate, vglvuuids, vgmeta, vgpvuuids, vgremove, vgrename, vgs, vgs-full, vgscan, vguuid

 

  • 下載和上傳檔案,直接檔案就能拷貝出來

guestfish -a ubuntutest.img

run

list-filesystems

mount /dev/sda1 /

download /home/openstack/.bash_history testdownload

upload instance01.xml /home/openstack/testupload

 

3.4 在Libvirt裡面,Virt也提供了相應命令系列

一個命令完成操作,無需啟動互動命令列

  • Guestmount

建立一個本地資料夾

mkdir testguestmount

將image裡面的/dev/sda1 mount到這個資料夾裡面

guestmount -a ubuntutest.img -m /dev/sda1 testguestmount

 

結束編輯後

guestunmount testguestmount

  • virt-builder

可以快速的建立虛擬機器映象

update-guestfs-appliance

檢視所有的映象型別

virt-builder –list

建立一個Image

virt-builder fedora-20 -o myfedora.img --format qcow2 --size 20G 

設定root password, 放在檔案裡面

virt-builder fedora-20 --root-password file:/tmp/rootpw

設定hostname

virt-builder fedora-20 --hostname virt.example.com

安裝軟體

virt-builder fedora-20 –install “apache2“

第一次啟動執行指令碼

virt-builder fedora-20 --firstboot /tmp/yum-update.sh

 

virt-ls -a myfedora.img /root/

 

virt-cat -a myfedora.img /root/.bash_profile

 

virt-copy-in -a myfedora.img desktop.xml /root/

 

virt-copy-out -a myfedora.img /root/.bash_profile ./

virt-df -a myfedora.img

 

virt-list-filesystems -a myfedora.img

virt-list-partitions myfedora.img

 

歡迎關注微信公眾號