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

创建了一个虚拟机,不知道为什么挂了,重启也启动不了,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

 

我的虚拟机挂了!怎么把镜像里面的数据找回来?_第1张图片 

 

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

 

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

 

加载后出现16个NBD

  

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

我的虚拟机挂了!怎么把镜像里面的数据找回来?_第2张图片 

 

将image付给一个network block device

 

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

 

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

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第3张图片

 

Mount其中一个partition

 

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

 

修改结束后

 

umount ubuntutestnbd0p1

 

qemu-nbd -d /dev/nbd0

 

 

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

 

有LVM的情况相对复杂

 

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

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第4张图片

 

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

 

查看LVM的信息

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第5张图片

 

Import这个volume group

 

vgimport VolGroup00

 

将这个volume group设为active

 

vgchange -ay VolGroup00

 

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第6张图片

 

Mount其中一个LV

 

mount /dev/VolGroup00/LogVol00 ubuntutestnbd0p1/

 

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

 

修改结束后

 

umount ubuntutestnbd0p1/

vgchange -an VolGroup00

vgexport VolGroup00

qemu-nbd -d /dev/nbd0

 

我的虚拟机挂了!怎么把镜像里面的数据找回来?_第7张图片

 

 

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 /

 

我的虚拟机挂了!怎么把镜像里面的数据找回来?_第8张图片

 

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

 

我的虚拟机挂了!怎么把镜像里面的数据找回来?_第9张图片

 

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

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第10张图片

 

(2) 运行supermin

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第11张图片

 

(3) 选择kernel

 

 

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

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第12张图片

 

(5) 检测qemu

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第13张图片

 

(6) 启动qemu appliance

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第14张图片

 

(7)启动initrd

  

(8) load kernel modules

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第15张图片

 

(9) mount sda, sdb

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第16张图片

 

(10) 将sdb作为root device

 

 

(11) 运行init

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第17张图片

 

(12) 启动guestfsd

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第18张图片

 

 

(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

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第19张图片

 

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

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第20张图片

我的虚拟机挂了!怎么把镜像里面的数据找回来?_第21张图片

我的虚拟机挂了!怎么把镜像里面的数据找回来?_第22张图片

 

 

  • 对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

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第23张图片

  

  • 对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

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第24张图片

 

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

 

guestfish -a ubuntutest.img

 

run

 

list-filesystems

 

mount /dev/sda1 /

 

download /home/openstack/.bash_history testdownload

 

upload instance01.xml /home/openstack/testupload

我的虚拟机挂了!怎么把镜像里面的数据找回来?_第25张图片 

 

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

我的虚拟机挂了!怎么把镜像里面的数据找回来?_第26张图片

 

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

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第27张图片

 

virt-ls -a myfedora.img /root/

 

 

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

 我的虚拟机挂了!怎么把镜像里面的数据找回来?_第28张图片

 

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

 

 

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

我的虚拟机挂了!怎么把镜像里面的数据找回来?_第29张图片

 

virt-df -a myfedora.img

 

 

virt-list-filesystems -a myfedora.img

 

virt-list-partitions myfedora.img

 

 

欢迎关注微信公众号

我的虚拟机挂了!怎么把镜像里面的数据找回来?_第30张图片

 

你可能感兴趣的:(我的虚拟机挂了!怎么把镜像里面的数据找回来?)