建立了一个虚拟机,不知道为何挂了,重启也启动不了,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
欢迎关注微信公众号