個人虛擬機掛了!怎麼把鏡像裏面的數據找回來?

建立了一個虛擬機,不知道爲何掛了,重啓也啓動不了,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

 

 

歡迎關注微信公衆號

相關文章
相關標籤/搜索