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

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

c2ddfee470dd136927b918111f5f519f.png

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

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

加载后出现16个NBD

197f37b46ce574e4a7a1cd3fdf5cf6f5.png

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

a4625e93f0c2133b9e2f07bb76db4aec.png

将image付给一个network block device

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

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

edb6fffe532aea61851a8cdd44d2b891.png

Mount其中一个partition

39d5392922053d23e3f0b253ad8363ee.png

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

修改结束后

umount ubuntutestnbd0p1

qemu-nbd -d /dev/nbd0

89edfbdeaad9f21387625cb535ce8f7f.png

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

有LVM的情况相对复杂

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

804b253755be67adda06a2807814f843.png

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

查看LVM的信息

52d1f7182f59bd55e07d35e9d8ba30f9.png

Import这个volume group

vgimport VolGroup00

将这个volume group设为active

vgchange -ay VolGroup00

ce67766936a45e00a7acd3ec98c98f65.png

Mount其中一个LV

mount /dev/VolGroup00/LogVol00 ubuntutestnbd0p1/

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

修改结束后

umount ubuntutestnbd0p1/

vgchange -an VolGroup00

vgexport VolGroup00

qemu-nbd -d /dev/nbd0

141a7218daaab9f298916c4c34c4f225.png

3. 方法三:使用libguestfs

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

安装:apt-get install libguestfs-tools

编辑一个Image:

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

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

b20d734d44493ae0bee32d0b810a1b73.png

查看所有的文件系统

list-filesystems

Mount这个文件系统

mount /dev/sda1 /

da968b6a6a87415453398305c8b284fa.png

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

1a5020f350550fc54a503a9a1c83c226.png

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

a70281931b46f9f34c9b9df68f0984a3.png

(2) 运行supermin

78ec46f699b36ff1c4128fa3908e5806.png

(3) 选择kernel

1b7075b4f0bcd10bad9d6dc16dca304a.png

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

0a83c1553cd5bb297e113d2c44bb6425.png

(5) 检测qemu

ae7682c8c31b7eca305a84ee76b20784.png

(6) 启动qemu appliance

02591195c18c2cc71b1b19cfb31d1002.png

(7)启动initrd

c4140ccf21a588ef540efa1c372475ef.png

(8) load kernel modules

85bedd4e23176ee76d0244a3eeb6edde.png

(9) mount sda, sdb

e21ed84830316e8fb7eb2ca10194c43a.png

(10) 将sdb作为root device

05198ef6386268a66fabd32b48f0d013.png

(11) 运行init

6547b24376bafeefb1a8f99a18182f06.png

(12) 启动guestfsd

ff801aa2b39c6259a5c9cd530cbbf806.png

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

8f4abde5c3b8c04297070c29e1d3f571.png

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

f9bc1cb701514fa304c3c97e42a8ac34.png

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

385ab988f496727b9e95946b683fcc5e.png

c8ce0205dc7505e42e19c841d92a7a01.png

d65cba1964970e33f549fb1d8355a204.png

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

3dcf54cc7261d92356a51458af6af8fd.png

b3edd84d6820df737566c5f71f7b0f6a.png

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

1762451d639b6a4009f1c43ec03a6d5d.png

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

guestfish -a ubuntutest.img

run

list-filesystems

mount /dev/sda1 /

download /home/openstack/.bash_history testdownload

upload instance01.xml /home/openstack/testupload

47565e70567ed304377adb9b9631d563.png

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

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

  • Guestmount

创建一个本地文件夹

mkdir testguestmount

将image里面的/dev/sda1 mount到这个文件夹里面

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

c52b2421c3449c752f6455f51d306213.png

结束编辑后

guestunmount testguestmount

  • virt-builder

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

update-guestfs-appliance

查看所有的镜像类型

virt-builder –list

641738aab3b2ee4a67a80fdf238443ff.png

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

e3f380fe3dfdac8f67045162083c770a.png

virt-ls -a myfedora.img /root/

a41139a38795d53a506b55175ffacedc.png

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

d0d81dd6a6e5648a9312c4679f0cbc6a.png

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

384be2ac8f6a046a4bab0eb640cc657f.png

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

ed9a9bb7985176bd42cf8c874ac202b1.png

virt-df -a myfedora.img

1077925a88d7dab2cf2cc9eef5fe37ff.png

virt-list-filesystems -a myfedora.img

virt-list-partitions myfedora.img

9cf2866638ff8269fc3072bd6a0b92be.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

popsuper1982

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值