我的虛擬機器掛了!怎麼把映象裡面的資料找回來?
建立了一個虛擬機器,不知道為什麼掛了,重啟也啟動不了,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
歡迎關注微信公眾號