centos7單獨編譯nbd內核模塊


前言

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 <hch@infradead.org>
# 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 

完成模塊的加載了


免責聲明!

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



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