Centos7.4安裝編譯nbd模塊錯誤(modprobe: FATAL: Module nbd not found.)

查看centos版本

cat /etc/redhat-release

#-> CentOS Linux release 7.4.1708 (Core)

查看自己內核版本

uname -r       #-> 3.10.0-693.el7.x86_64

 

 開始安裝編譯模塊

yum install kernel-devel kernel-headers

cd /tmp

wget http://vault.centos.org/7.4.1708/os/Source/SPackages/kernel-3.10.0-693.el7.src.rpm

rpm -ihv kernel-3.10.0-693.el7.src.rpm  (這時會在/root/rpmbuild/SOURCES下生成tar.xz包)

cd ~/rpmbuild/SOURCES

tar Jxvf linux-3.10.0-693.el7.tar.xz -C/usr/src/kernels/

cd /usr/src/kernels/

mv $(uname -r) $(uname -r)-old

mv linux-3.10.0-693.el7 $(uname -r)

cd $(uname -r)

make mrproper

cp ../$(uname -r)-old/Module.symvers ./

cp /boot/config-$(uname -r) ./.config

make oldconfig

make prepare

make scripts

make CONFIG_BLK_DEV_NBD=m M=drivers/block

cp drivers/block/nbd.ko /lib/modules/$(uname -r)/kernel/drivers/block/

depmod -a

 

最後,modprobe nbd 啓用nbd模塊


期間會遇到錯誤,問題及解決辦法如下:

1.  make scripts

錯誤:

Makefile:901: "Cannot use CONFIG_STACK_VALIDATION, please install libelf-dev or elfutils-libelf-devel"

解決:

yum install elfutils-libelf-devel


2.  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

解決:

1、 REQ_TYPE_SPECIAL變量是在/usr/src/kernels/3.10.0-514.26.2.el7.x86_64/include/linux/blkdev.h文件中定義,由代碼可知 REQ_TYPE_SPECIAL = 7:
/*
 * request command types
 */
enum rq_cmd_type_bits {
    REQ_TYPE_FS             = 1,    /* fs request */
    REQ_TYPE_BLOCK_PC,              /* scsi command */
    REQ_TYPE_SENSE,                 /* sense request */
    REQ_TYPE_PM_SUSPEND,            /* suspend request */
    REQ_TYPE_PM_RESUME,             /* resume request */
    REQ_TYPE_PM_SHUTDOWN,           /* shutdown request */
#ifdef __GENKSYMS__
    REQ_TYPE_SPECIAL,               /* driver defined type */
#else
    REQ_TYPE_DRV_PRIV,              /* driver defined type */
#endif
    /*
     * for ATA/ATAPI devices. this really doesn't belong here, ide should
     * use REQ_TYPE_DRV_PRIV and use rq->cmd[0] with the range of driver
     * private REQ_LB opcodes to differentiate what type of request this is
     */
    REQ_TYPE_ATA_TASKFILE,
    REQ_TYPE_ATA_PC,
};
2、修改drivers/block/nbd.c,在619行將sreq.cmd_type直接定義爲7

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章