centos7單獨編譯nbd核心模組
阿新 • • 發佈:2020-10-09
前言
centos7預設核心沒有帶nbd的模組,可以通過下載跟當前版本匹配的核心原始碼,編譯原始碼指定的模組,然後載入到系統
步驟
判斷版本
[root@lab201 linux-3.10.0-957.el7]# uname -a Linux lab201 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux [root@lab201 linux-3.10.0-957.el7]# lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch Distributor ID: CentOS Description: CentOS Linux release 7.6.1810 (Core) Release: 7.6.1810 Codename: Core
沒更新過核心的話,就是centos7.6的3.10.0-957版本的核心
獲取原始碼
wget https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.6.1810/os/Source/SPackages/kernel-3.10.0-957.el7.src.rpm
清華的源支援vault的庫,比centos自帶的vault要快,用這個下載
安裝匹配版本的devel包
這個編譯模組的時候需要
wget https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.6.1810/os/x86_64/Packages/kernel-devel-3.10.0-957.el7.x86_64.rpm rpm -ivh kernel-devel-3.10.0-957.el7.x86_64.rpm
安裝完了檢查下,下面的目錄應該不為空
ls /lib/modules/3.10.0-957.el7.x86_64/build
解壓原始碼
rpm2cpio kernel-3.10.0-957.el7.src.rpm |cpio -div
xz -d linux-3.10.0-957.el7.tar.xz
cd linux-3.10.0-957.el7/drivers/block/
預設編譯不會通過
報錯如下
[root@lab201 block]# make CONFIG_BLK_DEV_NBD=m -C /lib/modules/3.10.0-957.el7.x86_64/build M=`pwd` modules make: Entering directory `/usr/src/kernels/3.10.0-957.el7.x86_64' CC [M] /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/floppy.o CC [M] /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/brd.o CC [M] /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/loop.o CC [M] /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/pktcdvd.o CC [M] /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/osdblk.o CC [M] /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/nbd.o /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/nbd.c: In function ‘__nbd_ioctl’: /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/nbd.c:619:19: error: ‘REQ_TYPE_SPECIAL’ undeclared (first use in this function) sreq.cmd_type = REQ_TYPE_SPECIAL; ^ /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/nbd.c:619:19: note: each undeclared identifier is reported only once for each function it appears in make[1]: *** [/root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/nbd.o] Error 1 make: *** [_module_/root/rbd/kernel/linux-3.10.0-957.el7/drivers/block] Error 2 make: Leaving directory `/usr/src/kernels/3.10.0-957.el7.x86_64'
修改程式碼
增加下面內容
這個是從../../include/linux/blkdev.h裡面提取的
mutex_lock(&nbd->tx_lock);
blk_rq_init(NULL, &sreq);
#ifdef __GENKSYMS__
REQ_TYPE_SPECIAL, /* driver defined type */
#else
REQ_TYPE_DRV_PRIV, /* driver defined type */
#endif
sreq.cmd_type = REQ_TYPE_SPECIAL;
nbd_cmd(&sreq) = NBD_CMD_DISC;
修改makefile
[root@lab201 block]# cat Makefile
#
# Makefile for the kernel block device drivers.
#
# 12 June 2000, Christoph Hellwig <[email protected]>
# Rewritten to use lists instead of if-statements.
#
obj-$(CONFIG_BLK_DEV_NBD) += nbd.o
只保留一個需要的
再次編譯
[root@lab201 block]# make CONFIG_BLK_DEV_NBD=m -C /lib/modules/3.10.0-957.el7.x86_64/build M=`pwd` modules
make: Entering directory `/usr/src/kernels/3.10.0-957.el7.x86_64'
Building modules, stage 2.
MODPOST 1 modules
CC /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/nbd.mod.o
LD [M] /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/nbd.ko
make: Leaving directory `/usr/src/kernels/3.10.0-957.el7.x86_64'
拷貝模組到當前的核心
[root@lab201 block]# cp -ra nbd.ko /lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/block/
[root@lab201 block]# depmod -a
[root@lab201 block]# modprobe nbd
[root@lab201 block]# modinfo nbd
filename: /lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/block/nbd.ko
···
[root@lab201 block]# lsmod |grep nbd
nbd 17554 0
完成模組的載入了