我的虛擬機掛了!怎么把鏡像里面的數據找回來?


創建了一個虛擬機,不知道為什么掛了,重啟也啟動不了,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

 

 

 

查看內核模塊是否加載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

 

 

歡迎關注微信公眾號

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM