环境的CentOS内核,先从7.7升级到了7.8
系统安装时,就自带了内核源代码
就不需要下载内核代码了
# ls /usr/src/kernels/
3.10.0-1127.10.1.el7.x86_64
# uname -r
3.10.0-1127.10.1.el7.x86_64
# cd /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64
# make mrproper
# 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
#
# make prepare
scripts/kconfig/conf --silentoldconfig Kconfig
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
DESCEND objtool
HOSTCC /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/fixdep.o
HOSTLD /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/fixdep-in.o
LINK /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/fixdep
CC /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/exec-cmd.o
CC /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/help.o
CC /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/pager.o
CC /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/parse-options.o
CC /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/run-command.o
CC /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/sigchain.o
CC /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/subcmd-config.o
LD /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/libsubcmd-in.o
AR /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/libsubcmd.a
GEN /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/arch/x86/insn/inat-tables.c
CC /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/arch/x86/decode.o
LD /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/arch/x86/objtool-in.o
CC /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/builtin-check.o
CC /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/elf.o
CC /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/special.o
CC /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/objtool.o
CC /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/libstring.o
CC /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/str_error_r.o
LD /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/objtool-in.o
LINK /usr/src/kernels/3.10.0-1127.10.1.el7.x86_64/tools/objtool/objtool
# make scripts
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
这一步编译出错了
# make CONFIG_BLK_DEV_NBD=m M=drivers/block
LD drivers/block/built-in.o
CC [M] drivers/block/floppy.o
CC [M] drivers/block/brd.o
CC [M] drivers/block/loop.o
CC [M] drivers/block/pktcdvd.o
CC [M] drivers/block/osdblk.o
CC [M] drivers/block/nbd.o
drivers/block/nbd.c: In function ‘__nbd_ioctl’:
drivers/block/nbd.c:619:19: error: ‘REQ_TYPE_SPECIAL’ undeclared (first use in this function)
sreq.cmd_type = REQ_TYPE_SPECIAL;
^
drivers/block/nbd.c:619:19: note: each undeclared identifier is reported only once for each function it appears in
make[1]: *** [drivers/block/nbd.o] Error 1
make: *** [_module_drivers/block] Error 2
编译错误临时解决方案
# cat include/linux/blkdev.h
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,
};
REQ_TYPE_SPECIAL值为7,将代码中使用该值的地方直接改为7
# vi drivers/block/nbd.c
# cat drivers/block/nbd.c |grep sreq.cmd_type
//sreq.cmd_type = REQ_TYPE_SPECIAL;
sreq.cmd_type = 7;
可以正常编译
# make CONFIG_BLK_DEV_NBD=m M=drivers/block
CC [M] drivers/block/nbd.o
CC [M] drivers/block/virtio_blk.o
CC [M] drivers/block/sx8.o
CC [M] drivers/block/xen-blkfront.o
CC [M] drivers/block/rbd.o
CC [M] drivers/block/null_blk.o
LD drivers/block/mtip32xx/built-in.o
CC [M] drivers/block/mtip32xx/mtip32xx.o
LD drivers/block/zram/built-in.o
CC [M] drivers/block/zram/zcomp_lzo.o
CC [M] drivers/block/zram/zcomp.o
CC [M] drivers/block/zram/zram_drv.o
LD [M] drivers/block/zram/zram.o
Building modules, stage 2.
MODPOST 13 modules
CC drivers/block/brd.mod.o
LD [M] drivers/block/brd.ko
CC drivers/block/floppy.mod.o
LD [M] drivers/block/floppy.ko
CC drivers/block/loop.mod.o
LD [M] drivers/block/loop.ko
CC drivers/block/mtip32xx/mtip32xx.mod.o
LD [M] drivers/block/mtip32xx/mtip32xx.ko
CC drivers/block/nbd.mod.o
LD [M] drivers/block/nbd.ko
CC drivers/block/null_blk.mod.o
LD [M] drivers/block/null_blk.ko
CC drivers/block/osdblk.mod.o
LD [M] drivers/block/osdblk.ko
CC drivers/block/pktcdvd.mod.o
LD [M] drivers/block/pktcdvd.ko
CC drivers/block/rbd.mod.o
LD [M] drivers/block/rbd.ko
CC drivers/block/sx8.mod.o
LD [M] drivers/block/sx8.ko
CC drivers/block/virtio_blk.mod.o
LD [M] drivers/block/virtio_blk.ko
CC drivers/block/xen-blkfront.mod.o
LD [M] drivers/block/xen-blkfront.ko
CC drivers/block/zram/zram.mod.o
LD [M] drivers/block/zram/zram.ko
# cp drivers/block/nbd.ko /lib/modules/3.10.0-1127.10.1.el7.x86_64/kernel/drivers/block/
# depmod -a
可以看到nbd空设备列表
# ls /dev/nbd*
/dev/nbd0 /dev/nbd10 /dev/nbd12 /dev/nbd14 /dev/nbd2 /dev/nbd4 /dev/nbd6 /dev/nbd8
/dev/nbd1 /dev/nbd11 /dev/nbd13 /dev/nbd15 /dev/nbd3 /dev/nbd5 /dev/nbd7 /dev/nbd9