• CentOS 7.9 编译安装 nbd 模块


    [root@app_5_117 3.10.0-1160.53.1.el7.x86_64]# uname -a
    Linux app_5_117 3.10.0-1160.53.1.el7.x86_64 #1 SMP Fri Jan 14 13:59:45 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

    yum install kernel-devel kernel-headers

    cd /tmp/
    去这个网站下载自己内核版本
    https://vault.centos.org/
    wget https://vault.centos.org/7.9.2009/os/Source/SPackages/kernel-3.10.0-1160.el7.src.rpm
    rpm -ivh kernel-3.10.0-1160.el7.src.rpm
    cd ~/rpmbuild/SOURCES
    tar Jxvf linux-3.10.0-1160.el7.tar.xz -C /usr/src/kernels/
    cd /usr/src/kernels/

    mv $(uname -r) $(uname -r)-old
    [root@app_5_117 kernels]# mv linux-3.10.0-1160.el7/ $(uname -r)
    [root@app_5_117 kernels]# cd $(uname -r)
    [root@app_5_117 3.10.0-1160.53.1.el7.x86_64]#

    [root@app_5_117 3.10.0-1160.53.1.el7.x86_64]# make mrproper
    [root@app_5_117 3.10.0-1160.53.1.el7.x86_64]#
    [root@app_5_117 3.10.0-1160.53.1.el7.x86_64]# cp …/KaTeX parse error: Double subscript at position 45: … ./ [root@app_5_̲117 3.10.0-1160…(uname -r) ./.config
    [root@app_5_117 3.10.0-1160.53.1.el7.x86_64]#
    [root@app_5_117 3.10.0-1160.53.1.el7.x86_64]# make oldconfig
    HOSTCC scripts/basic/fixdep
    HOSTCC scripts/kconfig/conf.o
    SHIPPED scripts/kconfig/zconf.tab.c
    SHIPPED scripts/kconfig/zconf.lex.c
    SHIPPED scripts/kconfig/zconf.hash.c
    HOSTCC scripts/kconfig/zconf.tab.o
    HOSTLD scripts/kconfig/conf
    scripts/kconfig/conf --oldconfig Kconfig

    configuration written to .config

    [root@app_5_117 3.10.0-1160.53.1.el7.x86_64]#
    [root@app_5_117 3.10.0-1160.53.1.el7.x86_64]# make prepare
    scripts/kconfig/conf --silentoldconfig Kconfig
    Makefile:917: “Cannot use CONFIG_STACK_VALIDATION, please install libelf-dev or elfutils-libelf-devel”
    SYSHDR arch/x86/syscalls/…/include/generated/uapi/asm/unistd_32.h
    SYSHDR arch/x86/syscalls/…/include/generated/uapi/asm/unistd_64.h
    SYSHDR arch/x86/syscalls/…/include/generated/uapi/asm/unistd_x32.h
    SYSTBL arch/x86/syscalls/…/include/generated/asm/syscalls_32.h
    SYSHDR arch/x86/syscalls/…/include/generated/asm/unistd_32_ia32.h
    SYSHDR arch/x86/syscalls/…/include/generated/asm/unistd_64_x32.h
    SYSTBL arch/x86/syscalls/…/include/generated/asm/syscalls_64.h
    HOSTCC scripts/basic/bin2c
    HOSTCC arch/x86/tools/relocs_32.o
    HOSTCC arch/x86/tools/relocs_64.o
    HOSTCC arch/x86/tools/relocs_common.o
    HOSTLD arch/x86/tools/relocs
    WRAP arch/x86/include/generated/asm/clkdev.h
    WRAP arch/x86/include/generated/asm/mm-arch-hooks.h
    WRAP arch/x86/include/generated/uapi/asm/bpf_perf_event.h
    CHK include/generated/uapi/linux/version.h
    UPD include/generated/uapi/linux/version.h
    CHK include/generated/utsrelease.h
    UPD include/generated/utsrelease.h
    CC arch/x86/purgatory/purgatory.o
    AS arch/x86/purgatory/stack.o
    AS arch/x86/purgatory/setup-x86_64.o
    CC arch/x86/purgatory/sha256.o
    AS arch/x86/purgatory/entry64.o
    CC arch/x86/purgatory/string.o
    LD arch/x86/purgatory/purgatory.ro
    BIN2C arch/x86/purgatory/kexec-purgatory.c
    CHK include/generated/qrwlock.h
    UPD include/generated/qrwlock.h
    CHK include/generated/qrwlock_api_smp.h
    UPD include/generated/qrwlock_api_smp.h
    CHK include/generated/qrwlock_types.h
    UPD include/generated/qrwlock_types.h
    CHK kernel/qrwlock_gen.c
    UPD kernel/qrwlock_gen.c
    CHK lib/qrwlock_debug.c
    UPD lib/qrwlock_debug.c
    CC kernel/bounds.s
    GEN include/generated/bounds.h
    CC arch/x86/kernel/asm-offsets.s
    GEN include/generated/asm-offsets.h
    CALL scripts/checksyscalls.sh
    [root@app_5_117 3.10.0-1160.53.1.el7.x86_64]#
    [root@app_5_117 3.10.0-1160.53.1.el7.x86_64]# make scripts
    Makefile:917: “Cannot use CONFIG_STACK_VALIDATION, please install libelf-dev or elfutils-libelf-devel”
    CHK include/generated/uapi/linux/version.h
    HOSTCC scripts/genksyms/genksyms.o
    SHIPPED scripts/genksyms/lex.lex.c
    SHIPPED scripts/genksyms/keywords.hash.c
    SHIPPED scripts/genksyms/parse.tab.h
    HOSTCC scripts/genksyms/lex.lex.o
    SHIPPED scripts/genksyms/parse.tab.c
    HOSTCC scripts/genksyms/parse.tab.o
    HOSTLD scripts/genksyms/genksyms
    CC scripts/mod/empty.o
    HOSTCC scripts/mod/mk_elfconfig
    MKELF scripts/mod/elfconfig.h
    CC scripts/mod/devicetable-offsets.s
    GEN scripts/mod/devicetable-offsets.h
    HOSTCC scripts/mod/file2alias.o
    HOSTCC scripts/mod/modpost.o
    HOSTCC scripts/mod/sumversion.o
    HOSTLD scripts/mod/modpost
    HOSTCC scripts/selinux/genheaders/genheaders
    HOSTCC scripts/selinux/mdp/mdp
    HOSTCC scripts/kallsyms
    HOSTCC scripts/pnmtologo
    HOSTCC scripts/conmakehash
    HOSTCC scripts/recordmcount
    HOSTCC scripts/sortextable
    HOSTCC scripts/asn1_compiler
    [root@app_5_117 3.10.0-1160.53.1.el7.x86_64]# make CONFIG_BLK_DEV_NBD=m M=drivers/block

    LD drivers/block/built-in.o make[1]: ***
    没有规则可以创建“drivers/block/floppy.o”需要的目标“tools/objtool/objtool”。 停止。
    make: *** [_module_drivers/block] 错误 2

    vi /usr/src/kernels/3.10.0-1160.53.1.el7.x86_64/include/linux/blkdev.h
    [root@app_5_117 3.10.0-1160.53.1.el7.x86_64]# vi /usr/src/kernels/3.10.0-1160.53.1.el7.x86_64/drivers/block/nbd.c

    618 blk_rq_init(NULL, &sreq);
    619 sreq.cmd_type = 7; /#REQ_TYPE_SPECIAL;/
    620 nbd_cmd(&sreq) = NBD_CMD_DISC;

    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

    1. 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;
    -=------------
    [root@app_5_117 3.10.0-1160.53.1.el7.x86_64]# vi /usr/src/kernels/3.10.0-1160.53.1.el7.x86_64/drivers/block/nbd.c

    618 blk_rq_init(NULL, &sreq);
    619 sreq.cmd_type = 7; /#REQ_TYPE_SPECIAL;/
    620 nbd_cmd(&sreq) = NBD_CMD_DISC;

  • 相关阅读:
    天眼护航 安全无界:天通哨兵PS02—电力巡检保护的智能利器
    如何部署商城项目
    http协议浅分析
    阿里云不同设备,物模型如何同步
    05 程序流程控制
    详细说说什么是单元测试的边界
    几种常见的 MySQL/PolarDB-MySQL 回收表空间方法对比
    java程序中为什么经常使用tomcat
    聊聊MySql索引的类型以及失效场景
    全网唯一!Matlab王者荣耀配色包MHonor
  • 原文地址:https://blog.csdn.net/qq_41847721/article/details/126171885