建立了一個虛擬機,不知道爲何掛了,重啓也啓動不了,VNC也登不上去,強行關機後再也啓動不起來了,開機一大堆錯誤,但是裏面還有很重要的數據啊,怎麼辦,怎麼辦,誰能救救我!html
下面分析幾個解救的方法。linux
方法零:誰讓你把重要數據放在系統盤裏面了,請使用雲盤,也即塊存儲,虛擬機掛了,盤能夠輕鬆的關聯到新的機器上,並且塊存儲系統如Ceph可能是三備份,數據丟不了,下次請牢記。apache
您確定會罵我,此次咋辦,下面分享真正解救的辦法。ubuntu
1. 方法一:使用qemu的工具Network Block Devicecentos
網絡塊設備是經過NBD Server將虛擬塊設備經過TCP/IP export出來,能夠遠程訪問。bash
NBD Server一般是qemu-nbd微信
1.1 使用方法一:能夠提供unix socket網絡
qemu-nbd -t -k /home/openstack/images/ubuntutest-nbd ubuntutest.img架構
鏈接這個unix socketapp
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
歡迎關注微信公衆號