使用qemu-nbd修改qcow2格式的虚拟机镜像(一):内核编译nbd模块

6 篇文章 0 订阅
3 篇文章 0 订阅

1、环境介绍

环境的CentOS内核,先从7.7升级到了7.8
系统安装时,就自带了内核源代码
就不需要下载内核代码了

# ls /usr/src/kernels/
3.10.0-1127.10.1.el7.x86_64

2、编译

# 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

3、加载nbd.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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值