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