- 論壇徽章:
- 18
|
在使用虛擬化的過(guò)程中,難免會(huì)遇到虛擬機(jī)異常導(dǎo)致無(wú)法啟動(dòng)等故障,這時(shí)候如何從虛擬機(jī)的img中將重要文件或數(shù)據(jù)拷貝出來(lái)顯得尤為重要,今天介紹一下利用qemu-nbd的方式將img文件掛載到宿主機(jī)。
需要注意的是,目前僅針對(duì)于img文件類型為qcow2的做過(guò)測(cè)試。
1. 檢測(cè)img文件的類型:
file test.img
test.img: Qemu Image, Format: Qcow , Version: 2
qemu-nbd方式依賴于內(nèi)核級(jí)別的nbd模塊,簡(jiǎn)單介紹一下nbd。
NBD(Network Block Device)
簡(jiǎn)介:Tools for the Linux Kernel's network block device, allowing you to use remote block devices over a TCP/IP network,也就是說(shuō)可以實(shí)現(xiàn)IP-SAN的功能數(shù)據(jù)共享。
相關(guān)網(wǎng)站:http://nbd.sourceforge.net/
2. 由于CentOS里面默認(rèn)沒(méi)有編譯nbd到內(nèi)核里,需要重新編譯kernel的源碼,具體步驟如下:
yum install kernel-devel kernel-headers
cd /tmp
#下載符合當(dāng)前版本的kernel src 6.2或者6.4的切換一下目錄即可
wget http://vault.centos.org/6.3/upda ... 79.22.1.el6.src.rpm
rpm -ivh kernel-2.6.32-279.22.1.el6.src.rpm
cd ~/rpmbuild/SOURCES
#解壓tar包到kernel源碼的位置
tar jxf linux-2.6.32-279.22.1.el6.tar.bz2 -C /usr/src/kernels/
cd /usr/src/kernels
#備份原有的kernel source
mv $(uname -r) $(uname -r)-old
#有時(shí)候不排除內(nèi)核的版本與實(shí)際的source包不一致,所以應(yīng)以實(shí)際為準(zhǔn)
mv 2.6.32-431.3.1.el6.x86_64 2.6.32-431.3.1.el6.x86_64-old
#將新下載的kernel重命名
mv linux-2.6.32-279.22.1.el6 2.6.32-431.3.1.el6.x86_64
chown -R root:root 2.6.32-431.3.1.el6.x86_64
#開(kāi)始進(jìn)入編譯階段
cd /usr/src/kernels/2.6.32-431.3.1.el6.x86_64
#make mrproper去先刪除之前編譯所生成的文件和配置文件等
make mrproper
cd /usr/src/kernels/2.6.32-431.3.1.el6.x86_64-old
#Module.symvers文件用于:1.列出vmlinux和所有模塊的導(dǎo)出函數(shù) 2.列出所有符號(hào)的CRC校驗(yàn)值
cp Module.symvers /usr/src/kernels/2.6.32-431.3.1.el6.x86_64
cd /usr/src/2.6.32-431.3.1.el6.x86_64
cp /boot/config-2.6.32-358.el6.x86_64 ./.config
#所有問(wèn)題都基于已有的.config文件,只對(duì)新特性和新設(shè)定提出詢問(wèn),避免需要重新設(shè)定整個(gè)內(nèi)核的配置
make oldconfig
make prepare
make scripts
make CONFIG_BLK_DEV_NBD=m M=drivers/block
#在 /usr/src/kernels/2.6.32-431.3.1.el6.x86_64目錄下
cp drivers/block/nbd.ko /lib/modules/$(uname -r)/kernel/drivers/block/
#Probe all modules
depmod -a
#加載模塊,默認(rèn)nbd的增加分區(qū)的功能是關(guān)閉的,需要指定max_part這個(gè)參數(shù)。這個(gè)參數(shù)指定了一個(gè)nbd設(shè)備可以有多少個(gè)分區(qū)。
modprobe nbd max_part=63
#是否加載可以用 lsmod 命令查看
3.利用qemu-nbd實(shí)現(xiàn)虛擬機(jī)鏡像的掛載
#需要安裝以下軟件
rpm -ivh --replacefiles --nodeps seabios-bin-0.6.2-3.el6.noarch.rpm
rpm -ivh --replacefiles --nodeps seabios-0.6.2-3.el6.x86_64.rpm
rpm -ivh --replacefiles --nodeps qemu-common-0.12.3-8.el6.x86_64.rpm
rpm -ivh --replacefiles --nodeps qemu-img-0.12.3-8.el6.x86_64.rpm
rpm -ivh --replacefiles --nodeps qemu-kvm-0.12.3-8.el6.x86_64.rpm
rpm -ivh --replacefiles --nodeps qemu-system-x86-0.12.3-8.el6.x86_64.rpm
#查看當(dāng)前與nbd相關(guān)的設(shè)備
ls /dev/ | grep nbd
#將文件鏈接到本地的NBD設(shè)備上
qemu-nbd -c /dev/nbd0 test01.img
#再次查看與nbd相關(guān)的設(shè)備,會(huì)發(fā)現(xiàn)在/nbd0 下多了三個(gè)分區(qū)nbd0p1 nbd0p2 nbd0p3,這是虛擬機(jī)img文件中的分區(qū)
ls /dev/ | grep nbd
#掛載到宿主機(jī),就可以訪問(wèn)img的內(nèi)部了,其中會(huì)有一個(gè)swapspace是不能掛載的
mount nbd0p1 /mnt/test
|
|