加载nbd模块失败 modprobe nbd Module nbd not found

摘要

解决加载 nbd 模块时报错的问题,modprobe nbd Module nbd not found。

前置

安装 elfutils-libelf-devel

这个模块后面在编译内核时会使用。先给装上。

1
yum install elfutils-libelf-devel

下载

查看操作系统版本和内核版本

1
2
3
4
5
[root@weilu_125 vctos7-1]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

[root@weilu_125 vctos7-1]# uname -r
3.10.0-862.el7.x86_64

查看 kernel-devel 和 kernel-headers 包,实际上已经安装了:

1
2
3
4
5
6
7
[root@weilu_125 vctos7-1]# yum list installed | grep kernel
abrt-addon-kerneloops.x86_64 2.1.11-50.el7.centos @anaconda
kernel.x86_64 3.10.0-862.el7 @anaconda
kernel-devel.x86_64 3.10.0-862.el7 @anaconda
kernel-headers.x86_64 3.10.0-862.el7 @anaconda
kernel-tools.x86_64 3.10.0-862.el7 @anaconda
kernel-tools-libs.x86_64 3.10.0-862.el7 @anaconda

根据操作系统和内核版本找到对应的源码,下载:

1
wget http://vault.centos.org/7.5.1804/os/Source/SPackages/kernel-3.10.0-862.el7.src.rpm

使用命令安装这个包:

1
rpm -ihv kernel-3.10.0-862.el7.src.rpm

这个包安装后,默认会在 /root/rpmbuild 目录下,同时还会在 /usr/src/kernel 下面生成一个目录,后面会用到。

解压其中的一个包:

1
tar Jxvf /root/rpmbuild/SOURCES/linux-3.10.0-862.el7.tar.xz -C /usr/src/kernels/

完成上述步骤之后,可以看到如下两个文件夹:

1
2
[root@weilu_125 kernels]# ls
3.10.0-862.el7.x86_64 linux-3.10.0-862.el7

备份内核

这里首先将内核移动到后缀增加了“-old”的目录下,然后将我们刚刚解压出来的内核目录拷贝过去,并进入内核目录

1
2
3
4
[root@weilu_125 kernels]# mv $(uname -r) $(uname -r)-old
[root@weilu_125 kernels]# mv linux-3.10.0-862.el7 $(uname -r)
[root@weilu_125 kernels]# cd $(uname -r)
[root@weilu_125 3.10.0-862.el7.x86_64]#

然后在这个目录下依次执行以下命令:

1
2
3
4
5
6
make mrproper
cp ../$(uname -r)-old/Module.symvers ./
cp /boot/config-$(uname -r) ./.config
make oldconfig
make prepare
make scripts

执行到这里暂停一下,修改文件:

1
/usr/src/kernels/3.10.0-862.el7.x86_64/drivers/block/nbd.c

修改如下配置:

1
2
// sreq.cmd_type = REQ_TYPE_SPECIAL;
sreq.cmd_type = 7;

将这个变量之间设置为7即可,然后继续执行以下命令

1
2
3
make CONFIG_BLK_DEV_NBD=m M=drivers/block
cp drivers/block/nbd.ko /lib/modules/$(uname -r)/kernel/drivers/block/
depmod -a

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@weilu_125 block]# modinfo nbd
filename: /lib/modules/3.10.0-862.el7.x86_64/kernel/drivers/block/nbd.ko
license: GPL
description: Network Block Device
retpoline: Y
rhelversion: 7.5
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)
[root@weilu_125 block]#