Centos7.3 安裝編譯nbd模塊

未安裝nbd模塊

[zhaojq@localhost ~]$ modprobe nbd
modprobe: FATAL: Module nbd not found.

查看linux版本

[zhaojq@localhost ~]$ cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core)

[zhaojq@localhost ~]$ uname -r
3.10.0-514.26.2.el7.x86_64

安裝

[root@localhost tmp]# yum install kernel-devel kernel-headers

注意: wget的地址需要根據自身的系統版本設定
這裏寫圖片描述

[root@localhost tmp]# cd /tmp/
[root@localhost tmp]# wget http://vault.centos.org/7.3.1611/os/Source/SPackages/kernel-3.10.0-514.el7.src.rpm

在/root/rpmbuild/SOURCES下生成linux-3.10.0-514.el7.tar.xz

[root@localhost SOURCES]# rpm -ihv kernel-3.10.0-123.el7.src.rpm
[root@localhost SOURCES]# cd ~/rpmbuild/SOURCES
[root@localhost SOURCES]# tar Jxvf linux-3.10.0-123.el7.tar.xz -C /usr/src/kernels/
[root@localhost SOURCES]# cd /usr/src/kernels/

/usr/src/kernels/ 路徑下出現 3.10.0-514.26.2.el7.x86_64 和linux-3.10.0-514.el7兩個文件夾

[root@localhost kernels]# mv $(uname -r) $(uname -r)-old
[root@localhost kernels]# mv linux-3.10.0-123.el7 $(uname -r)
[root@localhost kernels]# cd $(uname -r)
[root@localhost 3.10.0-514.26.2.el7.x86_64]# make mrproper
[root@localhost 3.10.0-514.26.2.el7.x86_64]# cp ../$(uname -r)-old/Module.symvers ./
[root@localhost 3.10.0-514.26.2.el7.x86_64]# cp /boot/config-$(uname -r) ./.config
[root@localhost 3.10.0-514.26.2.el7.x86_64]# make oldconfig
[root@localhost 3.10.0-514.26.2.el7.x86_64]# make prepare
[root@localhost 3.10.0-514.26.2.el7.x86_64]# make scripts
[root@localhost 3.10.0-514.26.2.el7.x86_64]# make CONFIG_BLK_DEV_NBD=m M=drivers/block
[root@localhost 3.10.0-514.26.2.el7.x86_64]# cp drivers/block/nbd.ko /lib/modules/$(uname -r)/kernel/drivers/block/
[root@localhost 3.10.0-514.26.2.el7.x86_64]# depmod -a

錯誤處理

make scripts

  • 錯誤:
Makefile:901: "Cannot use CONFIG_STACK_VALIDATION, please install libelf-dev or elfutils-libelf-devel"
  • 解決辦法:
yum install elfutils-libelf-devel

make CONFIG_BLK_DEV_NBD=m M=drivers/block

  • 錯誤:
make[1]: *** 沒有規則可以創建“drivers/block/floppy.o”需要的目標“tools/objtool/objtool”。 停止。
  • 解決辦法:
首先查看make scripts時是否出錯,解決後,從make prepare命令開始重新執行
[root@localhost 3.10.0-514.26.2.el7.x86_64]# make prepare                     
scripts/kconfig/conf --silentoldconfig Kconfig
make[1]: 對“all”無需做任何事。
  ke[1]: 對“relocs”無需做任何事。
▽ CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
make[1]: “arch/x86/purgatory/kexec-purgatory.c”是最新的。
  CALL    scripts/checksyscalls.sh
  DESCEND  objtool
  CC       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/fixdep.o
  LD       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/fixdep-in.o
  LINK     /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/fixdep
  CC       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/exec-cmd.o
  CC       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/help.o
  CC       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/pager.o
  CC       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/parse-options.o
  CC       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/run-command.o
  CC       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/sigchain.o
  CC       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/subcmd-config.o
  LD       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/libsubcmd-in.o
  AR       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/libsubcmd.a
  GEN      /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/arch/x86/insn/inat-tables.c
  CC       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/arch/x86/decode.o
  LD       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/arch/x86/objtool-in.o
  CC       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/builtin-check.o
  CC       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/elf.o
  CC       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/special.o
  CC       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/objtool.o
  CC       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/libstring.o
  LD       /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/objtool-in.o
  LINK     /usr/src/kernels/3.10.0-514.26.2.el7.x86_64/tools/objtool/objtool

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,將sreq.cmd_type直接定義爲7

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

3、重新執行 make CONFIG_BLK_DEV_NBD=m M=drivers/block

運行

[zhaojq@localhost ~]$ modinfo nbd
filename:       /lib/modules/3.10.0-514.26.2.el7.x86_64/kernel/drivers/block/nbd.ko
license:        GPL
description:    Network Block Device
rhelversion:    7.3
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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章