赞
踩
nbd(网络块设备: Network Block Device),利用qemu-nbd将qemu虚拟机镜像挂载到Linux上。
展开来讲,nbd可以将一个远程主机的磁盘空间,当作一个块设备来使用,就像一块硬盘一样。使用它,你可以很方便的将另一台服务器的硬盘空间,增加到本地服务器上。
NBD与NFS有所不同:NFS只是提供一个挂载点供客户端使用,客户端无法改变这个挂载点的分区格式;而NBD提供的是一个块设备,客户端可以把这个块设备格式化成各种类型的分区,更便于用户的使用。
NBD是一个内核模块,大部分Linux发行版都已包含它。
在centos中, 编译成模块NBD, 保存在 /lib/modules/$version/kernel/driver/block/
远程服务器是一段轻量级的守护进程代码,它提供对远程设备的访问,而且该守护进程并不需要运行在linux平台之上。本地操作系统必须是linux,而且要支持Linux内核NBD驱动,并且能够运行本地客户端进程。
图1.NBD在本地客户端代表远程资源
文件系统能被挂载到NBD上(上图),而且NBD设备也能够用来组成冗余磁盘阵列(RAID)。在本地Linux上挂载一个EXT2文件系统到NBD,其传输率要比在同样的远程机器上挂载一个NFS快。
某些版本的 Linux 不加 max_part 参数会导致没有设备节点 /dev/nbd0p{1,2,3,4…} 等。用 kpartx 也不行。
查看有没有加载nbd模块 sudo lsmod |grep nbd
加载nbd模块 sudo modprobe nbd max_part=16
备注信息:查看Linux 模块信息(modinfo),例如查看nbd模块的参数【执行命令modinfo nbd
】 。 加载后,在/dev/目录下,根据参数创建nbdxx块设备文件。
qemu-nbd -c nbd设备路径 虚拟机镜像路径 [$ sudo qemu-nbd -c /dev/nbd0 centos.qcow2
]
这里注意查看分区: sudo fdisk -l nbd设备[sudo fdisk -l /dev/nbd0
],可能虚拟机不止一个分区(一般还会有一个boot分区)
sudo mount nbd分区 挂载路径 [$ sudo mount /dev/nbd0p1 /mnt/test1
]
sudo qemu-nbd -d nbd分区[$ sudo qemu-nbd -d /dev/nbd0p1
]
#查看加载的nbd模块
lsmod |grep nbd
#加载nbd模块
modprobe nbd max_part=16
云课堂中,从日志查看镜像路径 vi /var/log/qemu/vmmagent.log
#连接命令qemu-nbd -f qcow2 -c /dev/your/nbddev /image/path
qemu-nbd -f qcow2 -c /dev/nbd9 /opt/lessons/images/local_img.qcow2
#更新lvm分区
目的更新 这样之后的lv pv 就可以看到数据了 [root@git qcow2]# pvscan --cache pvscan[4100284] PV /dev/sda2 online. pvscan[4100284] PV /dev/nbd0p2 online. pvscan[4100284] PV /dev/sdb online. pvscan[4100284] PV /dev/sdc1 online.
[root@git qcow2]# lvscan ACTIVE '/dev/vg500/lv500' [999.99 GiB] inherit ACTIVE '/dev/centos/swap' [<3.88 GiB] inherit ACTIVE '/dev/centos/home' [<45.12 GiB] inherit ACTIVE '/dev/centos/root' [50.00 GiB] inherit ACTIVE '/dev/cl/root' [<91.10 GiB] inherit ACTIVE '/dev/cl/swap' [7.89 GiB] inherit
[root@git qcow2]# vgscan Found volume group "vg500" using metadata type lvm2 Found volume group "centos" using metadata type lvm2 Found volume group "cl" using metadata type lvm2
[root@git qcow2]# vgchange -a y 1 logical volume(s) in volume group "vg500" now active 3 logical volume(s) in volume group "centos" now active 2 logical volume(s) in volume group "cl" now active
#查看新增文件系统结构
[root@git qcow2]# lsblk -f NAME FSTYPE LABEL UUID MOUNTPOINT sda ├─sda1 ext4 87145844-8dd1-4316-8389-2cc035e406ef /boot └─sda2 LVM2_member KfNUVk-UyRL-IewQ-w1oa-LT8d-l7Fa-pg3J54 ├─cl-root xfs 8d0db36b-b9ef-4ca9-92e1-9c8c2f17c4ac / └─cl-swap swap 4c5b215c-33c1-47bc-9ebc-04627cf1116f [SWAP] sdb LVM2_member akE5ZB-G2Py-GjfU-8DEU-QEFM-ElW4-On8PKP └─vg500-lv500 xfs 1a213e4a-90ce-4d04-940d-bf059f2b92dd /service sdc └─sdc1 LVM2_member Uq6lAF-nIRc-joym-byQk-KHeJ-dNiA-gw7oW9 └─vg500-lv500 xfs 1a213e4a-90ce-4d04-940d-bf059f2b92dd /service sr0 iso9660 CentOS-8-1-1911-x86_64-dvd 2020-01-03-21-42-40-00 nbd0 ├─nbd0p1 xfs 2785a74c-1893-47c4-adde-59a746f71c24 /service/qcow2/boot └─nbd0p2 LVM2_member XKIwmd-DUL5-BsSQ-dH1o-DDJh-PFhg-zF8aGG ├─centos-swap swap db9cfc96-3893-4e27-a777-5b33f73ba5ff ├─centos-home xfs 50ffc57a-0986-4fd5-9ca2-b2869fe60aad └─centos-root xfs 4cb93a60-5ff5-4ea0-bf1c-dbcc90d6acbd
#挂载分区mount /dev/vgname/lvname /your/mount/point
[root@git qcow2]# mount /dev/centos/home sys/home/
[root@git qcow2]# mount /dev/centos/root sys/root
#取消挂载
umount sys/home/umount sys/root
vgchange -an
#断开NBD连接qemu-nbd -d /dev/your/nbddev
qemu-nbd -d /dev/nbd9
pvscan --cache
#连接镜像
qemu-nbd -f qcow2 -c /dev/your/nbddev /image/path
#查看新增文件系统结构
lsblk -f
#挂载分区
mount /dev/[yournbddev][pn] /your/mount/point # 其中pn代表你要挂载的时镜像里的分区n
#卸载分区
umount /your/mount/point
#断开nbd连接
qemu-nbd -d /dev/your/nbddev
#连接镜像
qemu-nbd -f qcow2 -c /dev/your/nbddev /image/path
lsblk -f #查看新增文件系统结构#挂载分区
mount -t ntfs-3g /dev/[yournbddev][pn] /your/mount/point # 其中pn代表你要挂载的时镜像里的分区n#卸载分区
umount /your/mount/point#断开nbd连接
qemu-nbd -d /dev/your/nbddev
注意
挂载qcow2文件,qcow2里边还有个lvm
linux nbd & qemu-nbd
QEMU-NBD
通过qemu-nbd方式挂载qcow2镜像格式
基于LVM和NBD实现网络远程LVM镜像方法
How to Mount Guest Qcow2 Virtual disk Image containing LVM on KVM Host Machine
[root@localhost linux-3.10.63]# cat ../../../readme
https://blog.51cto.com/mshxuyi/5857760
https://blog.csdn.net/weixin_42097108/article/details/111414501 错误解决
1、nbd 模块未安装
登录后复制
[root@localhost ~]# modprobe nbd
modprobe: FATAL: Module nbd not found.
2、查看 linux 版本
登录后复制
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core) #查看系统版本
[root@localhost ~]# uname -r #查看linux的内核信息
3.10.0-957.el7.x86_64
3、安装相关包
yum install kernel-devel kernel-headers elfutils-libelf-devel gcc+ gcc-c++
4、下载内核包
登录后复制
http://vault.centos.org/7.6.1810/os/Source/SPackages/kernel-3.10.0-957.el7.src.rpm
#根据自己的系统版本去下载
#7.6.1810 为redhat-release 系统版本
#3.10.0-957.el7 为uname -r 内核信息
5、编译
登录后复制
rpm -ivh kernel-3.10.0-957.el7.src.rpm
cd rpmbuild/SOURCES/
#解压 -C 指定目录 /usr/src/kernels
tar jxvf linux-3.10.0-957.el7.tar.xz -C /usr/src/kernels/
#解压后生成两个文件
ll /usr/src/kernels/
drwxr-xr-x. 22 root root 4096 9月 6 08:07 3.10.0-957.27.2.el7.x86_64
drwxrwxr-x. 24 root root 4096 9月 6 08:17 linux-3.10.0-957.el7
编译
登录后复制
cd /usr/src/kernels/linux-3.10.0-957.el7
#删除所有编译生成文件,内核配置文件
make mrproper
cp /usr/src/kernels/3.10.0-957.27.2.el7.x86_64/Module.symvers ./
cp /boot/config-3.10.0-957.el7.x86_64 ./.config
#备份当前.config文件为.config.old
make oldconfig
make prepare
make scripts
6、编译
登录后复制
make CONFIG_BLK_DEV_NBD=m M=drivers/block
错误:
登录后复制
drivers/block/nbd.c: 在函数‘__nbd_ioctl’中:
drivers/block/nbd.c:619:19: 错误:‘REQ_TYPE_SPECIAL’未声明(在此函数内第一次使用)
sreq.cmd_type = REQ_TYPE_SPECIAL;
^
drivers/block/nbd.c:619:19: 附注:每个未声明的标识符在其出现的函数内只报告一次
make[1]: *** [drivers/block/nbd.o] 错误 1
make: *** [_module_drivers/block] 错误 2
解决:
vi drivers/block/nbd.c
//sreq.cmd_type = REQ_TYPE_SPECIAL;
sreq.cmd_type = 7; #修改为7
#重新执行一次
make CONFIG_BLK_DEV_NBD=m M=drivers/block
7、复制文件
cp drivers/block/nbd.ko /lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/block/
depmod -a
8、查看模块
登录后复制
[root@localhost linux-3.10.0-957.el7]# modinfo nbd
filename: /lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/block/nbd.ko
license: GPL
description: Network Block Device
retpoline: Y
rhelversion: 7.6
srcversion: EDE909A294AC5FE08E81957
depends:
vermagic: 3.10.0 SMP mod_unload modversions
parm: nbds_max:number of network block devices to initialize (default: 16) (int)
parm: max_part:number of partitions per device (default: 0) (int)
parm: debugflags:flags for controlling debug output (int)
1.cc1: error: code model kernel does not support PIC mode
2
include/linux/compiler-gcc.h:106:1: fatal error: linux/compiler-gcc7.h: 没有那个文件或目录
直接将gcc4重命名为gcc7
mv include/linux/compiler-gcc4.h include/linux/compiler-gcc7.h
3.li@li-vir:~/dq/drivers/hello3$ insmod hello.ko
insmod: ERROR: could not insert module hello.ko: Operation not permitted
4.
insmod: ERROR: could not insert module hello.ko: Invalid module format
这里是引用
版本不对,
使用uname -r查看一下
make时要确保一致
方法1 挂在qcow2
1. 加载 nbd 驱动
某些版本的 linux 不加 max_part 参数会导致没有没有设备节点 /dev/nbd0p{1,2,3,4…} 等. 用 kpartx 也不行.
$ sudo modprobe nbd max_part=8
备注信息:查看Linux 模块信息(modinfo),例如查看nbd模块的参数
$ modinfo nbd
filename: /lib/modules/3.14.12/kernel/drivers/block/nbd.ko
license: GPL
description: Network Block Device
srcversion: 910DE7DFCE8A0AE76D3D428
depends:
intree: Y
vermagic: 3.14.12 SMP mod_unload modversions
parm: nbds_max:number of network block devices to initialize (default: 16) (int)
parm: max_part:number of partitions per device (default: 0) (int)
parm: debugflags:flags for controlling debug output (int)
$ sudo qemu-nbd -c /dev/nbd0 centos.qcow2
查看分区:
$ sudo fdisk -l /dev/nbd0
Disk /dev/nbd0: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0005d1fdDevice Boot Start End Blocks Id System
/dev/nbd0p1 * 2048 1026047 512000 83 Linux
/dev/nbd0p2 1026048 20971519 9972736 8e Linux LVM
vgdisplay
$ sudo lvdisplay
--- Logical volume ---
LV Name /dev/VolGroup/lv_root
VG Name VolGroup
LV UUID v60jyE-1lDm-7dMW-hkVf-YWBH-OKXI-ySHDkb
LV Write Access read/write
LV Status NOT available
LV Size 8.51 GiB
Current LE 2178
Segments 1
Allocation inherit
Read ahead sectors auto
--- Logical volume ---
LV Name /dev/VolGroup/lv_swap
VG Name VolGroup
LV UUID b1BctN-vPtc-8n6F-tokb-75pN-w34N-HXG1cB
LV Write Access read/write
LV Status NOT available
LV Size 1.00 GiB
Current LE 256
Segments 1
Allocation inherit
Read ahead sectors auto
Active VolGroup
$ sudo vgchange -a y VolGroup
mount vg
$ sudo mount /dev/VolGroup/lv_root /mnt/test2
$ sudo mount /dev/nbd0p1 /mnt/test1
- $ sudo mount /dev/nbd0p1 /mnt/test1
- $ sudo qemu-nbd -d /dev/nbd0p1
方法2 挂在qcow2
$ sudo apt install libguestfs-tools
语法:guestmount -a 镜像文件 -m 镜像文件内包含的某个分区 [选项] 挂载点
$ sudo mkdir /mnt/a #创建挂载点目录
sudo guestmount -a /XXX/XXX/imgname.qcow2 -m /dev/sda1 /mnt/a #尝试挂载/dev/sda分区,将提示有两个有效的分区/dev/sda1(/boot)和/dev/sda2(/root),
libguestfs: error: mount_options: mount exited with status 32: mount: /sysroot: wrong fs type, bad option, bad superblock on /dev/sda, missing codepage or helper program, or other error.
guestmount: ‘/dev/sda’ could not be mounted.
guestmount: Did you mean to mount one of these filesystems?
guestmount: /dev/sda1 (vfat)
guestmount: /dev/sda2 (ext4)
$ sudo guestmount -a /XXX/XXX/imgname.qcow2 -m /dev/sda2 /mnt/a #将磁盘镜像中包含的/dev/sda2分区挂载到/mnt/a目录
sudo ls /mnt/a
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
也可以通过-i参数替代-m来实现自动挂载有效分区
$ sudo mkdir /mnt/a #创建挂载点目录
$ sudo guestmount -a /XXX/XXX/imgname.qcow2 -i /mnt/a #将自动将磁盘镜像中最有效的/dev/sda2分区挂载到/mnt/a目录
sudo ls /mnt/a
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
$ sudo guestunmount /mnt/a
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。