[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模块
期间会遇到错误,问题及解决办法如下:
- 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
错误:
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;