我的虚拟机挂了!怎么把镜像里面的数据找回来?

以下内容已屏蔽图片优化访问速度
创建了一个虚拟机,不知道为什么挂了,重启也启动不了,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



[IMG]


查看内核模块是否加载lsmod | grep nbd


如果没有加载modprobe nbd,也可以指定最多的partition: modprobe nbd max_part=16


加载后出现16个NBD


[IMG]


查看哪个nbd device被使用:cat /proc/partitions


[IMG]


将image付给一个network block device


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


可以看到这个image里面有三个partition


[IMG]


Mount其中一个partition

[IMG]


可以看到里面的文件啦!!!!!


修改结束后


umount ubuntutestnbd0p1


qemu-nbd -d /dev/nbd0


[IMG]


2. 方法二:如果镜像里面是LVM


有LVM的情况相对复杂


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


[IMG]


发现里面有LVM,当然LVM不能作为整体访问,因为里面有Logic volume,都是单独成文件系统的


查看LVM的信息


[IMG]


Import这个volume group


vgimport VolGroup00


将这个volume group设为active


vgchange -ay VolGroup00


[IMG]


Mount其中一个LV


mount /dev/VolGroup00/LogVol00 ubuntutestnbd0p1/


可以拿到这个Logic Volume里面的文件啦!!!!!


修改结束后


umount ubuntutestnbd0p1/
vgchange -an VolGroup00
vgexport VolGroup00
qemu-nbd -d /dev/nbd0


[IMG]


3. 方法三:使用libguestfs


这个工具十分强大,Libguestfs可以在不启动虚拟机的情况下,编辑Image


安装:apt-get install libguestfs-tools


编辑一个Image:


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


接着运行run,则一个虚拟机启动了


[IMG]


查看所有的文件系统


list-filesystems


Mount这个文件系统


mount /dev/sda1 /


[IMG]


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


[IMG]


libguestfs是一个C的library,你可以写一个C的程序,将这个类库加载进去,调用它的API


文档[IMG]Libguestfs appliance的启动过程,更详细的了解它


如果我们想看这个appliance启动的详细过程,则需要export LIBGUESTFS_DEBUG=1


然后运行guestfish -a trusty-server-cloudimg-amd64-disk1.img


然后运行run,打印出很多的东西


(1) 启动guestfish


[IMG]


(2) 运行supermin


[IMG]


(3) 选择kernel


[IMG]


(4) 选择initrd, root images, 创建appliance


[IMG]


(5) 检测qemu


[IMG]


(6) 启动qemu appliance


[IMG]


(7)启动initrd


[IMG]


(8) load kernel modules


[IMG]


(9) mount sda, sdb


[IMG]


(10) 将sdb作为root device


[IMG]


(11) 运行init


[IMG]


(12) 启动guestfsd


[IMG]


(13) 开通一个端口,C类库会通过RPC连接这个端口


[IMG]


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


[IMG]


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等都支持


[IMG]


[IMG]


[IMG]


对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


[IMG]


[IMG]


对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


[IMG]


下载和上传文件,直接文件就能拷贝出来


guestfish -a ubuntutest.img


run


list-filesystems


mount /dev/sda1 /


download /home/openstack/.bash_history testdownload


upload instance01.xml /home/openstack/testupload


[IMG]


3.4 在Libvirt里面,Virt也提供了相应命令系列



一个命令完成操作,无需启动交互命令行


Guestmount


创建一个本地文件夹


mkdir testguestmount


将image里面的/dev/sda1 mount到这个文件夹里面
guestmount -a ubuntutest.img -m /dev/sda1 testguestmount


[IMG]


结束编辑后
guestunmount testguestmount


virt-builder


可以快速的创建虚拟机镜像


update-guestfs-appliance


查看所有的镜像类型


virt-builder –list
[IMG]


创建一个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


[IMG]


virt-ls -a myfedora.img /root/


[IMG]


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


[IMG]


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


[IMG]
virt-copy-out -a myfedora.img /root/.bash_profile ./
[IMG]


virt-df -a myfedora.img


[IMG]


virt-list-filesystems -a myfedora.img


virt-list-partitions myfedora.img


[IMG]
最让CMO睡不着觉的“流量焦虑症”,怎么治? 德国最大超市收入暴跌4300亿!“拒客”23年,终于认怂了! 为什么说游戏更应该用容器! 借1000元要还1377893461082元,这么狠的产品你敢用吗? 俞敏洪:成功都是熬出来的!不放弃,是我唯一的出路
好看吗?
总执行时间0.07341384887695312,文章查询时间0.046918630599975586,分类查询时间0.00993037223815918,其他脚本0.00035381317138671875,模板渲染0.01621103286743164