前言

centos7默认内核没有带nbd的模块,可以通过下载跟当前版本匹配的内核源码,编译源码指定的模块,然后加载到系统

步骤

判断版本

[root@lab201 linux-3.10.0-957.el7]# uname -a
Linux lab201 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@lab201 linux-3.10.0-957.el7]# lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.6.1810 (Core)
Release: 7.6.1810
Codename: Core

没更新过内核的话,就是centos7.6的3.10.0-957版本的内核

获取源码

wget https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.6.1810/os/Source/SPackages/kernel-3.10.0-957.el7.src.rpm

清华的源支持vault的库,比centos自带的vault要快,用这个下载

安装匹配版本的devel包

这个编译模块的时候需要

wget https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.6.1810/os/x86_64/Packages/kernel-devel-3.10.0-957.el7.x86_64.rpm
rpm -ivh kernel-devel-3.10.0-957.el7.x86_64.rpm

安装完了检查下,下面的目录应该不为空

ls /lib/modules/3.10.0-957.el7.x86_64/build

解压源码

rpm2cpio kernel-3.10.0-957.el7.src.rpm |cpio -div
xz -d linux-3.10.0-957.el7.tar.xz
cd linux-3.10.0-957.el7/drivers/block/

默认编译不会通过

报错如下

[root@lab201 block]# make CONFIG_BLK_DEV_NBD=m -C /lib/modules/3.10.0-957.el7.x86_64/build M=`pwd` modules
make: Entering directory `/usr/src/kernels/3.10.0-957.el7.x86_64'
CC [M] /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/floppy.o
CC [M] /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/brd.o
CC [M] /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/loop.o
CC [M] /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/pktcdvd.o
CC [M] /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/osdblk.o
CC [M] /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/nbd.o
/root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/nbd.c: In function ‘__nbd_ioctl’:
/root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/nbd.c:619:19: error: ‘REQ_TYPE_SPECIAL’ undeclared (first use in this function)
sreq.cmd_type = REQ_TYPE_SPECIAL;
^
/root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/nbd.c:619:19: note: each undeclared identifier is reported only once for each function it appears in
make[1]: *** [/root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/nbd.o] Error 1
make: *** [_module_/root/rbd/kernel/linux-3.10.0-957.el7/drivers/block] Error 2
make: Leaving directory `/usr/src/kernels/3.10.0-957.el7.x86_64'

修改代码

增加下面内容

这个是从../../include/linux/blkdev.h里面提取的

                mutex_lock(&nbd->tx_lock);
blk_rq_init(NULL, &sreq);
#ifdef __GENKSYMS__
REQ_TYPE_SPECIAL, /* driver defined type */
#else
REQ_TYPE_DRV_PRIV, /* driver defined type */
#endif
sreq.cmd_type = REQ_TYPE_SPECIAL;
nbd_cmd(&sreq) = NBD_CMD_DISC;

修改makefile

[root@lab201 block]# cat Makefile
#
# Makefile for the kernel block device drivers.
#
# 12 June 2000, Christoph Hellwig <hch@infradead.org>
# Rewritten to use lists instead of if-statements.
#
obj-$(CONFIG_BLK_DEV_NBD) += nbd.o

只保留一个需要的

再次编译

[root@lab201 block]# make CONFIG_BLK_DEV_NBD=m -C /lib/modules/3.10.0-957.el7.x86_64/build M=`pwd` modules
make: Entering directory `/usr/src/kernels/3.10.0-957.el7.x86_64'
Building modules, stage 2.
MODPOST 1 modules
CC /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/nbd.mod.o
LD [M] /root/rbd/kernel/linux-3.10.0-957.el7/drivers/block/nbd.ko
make: Leaving directory `/usr/src/kernels/3.10.0-957.el7.x86_64'

拷贝模块到当前的内核

[root@lab201 block]# cp -ra nbd.ko /lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/block/
[root@lab201 block]# depmod -a
[root@lab201 block]# modprobe nbd
[root@lab201 block]# modinfo nbd
filename: /lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/block/nbd.ko
···
[root@lab201 block]# lsmod |grep nbd
nbd 17554 0

完成模块的加载了

centos7单独编译nbd内核模块的更多相关文章

  1. 单独编译使用WebRTC的音频处理模块

    块,每块个点,(12*64=768采样)即AEC-PC仅能处理48ms的单声道16kHz延迟的数据,而 - 加载编译好的NS模块动态库 接下来只需要按照 此文 的描述在 android 的JAVA代码 ...

  2. 烂泥:centos单独编译安装gd库

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 这几天一直在弄一个商城系统,该系统的源码及数据库都已经上传并创建完毕.但是在安装该系统时,却提示缺少gd库.如下: 使用php探针查看,发现php确实没 ...

  3. 安卓系统源码编译系列(六)——单独编译内置浏览器WebView教程

    原文                   http://blog.csdn.net/zhaoxy_thu/article/details/18883015                 本文主要对从 ...

  4. android 单独编译某个模块

    第一次下载好Android源代码工程后,我们通常是在Android源代码工程目录下执行make命令,经过漫长的等待之后,就可以得到Android系统镜像system.img了.以后如果我们修改了And ...

  5. SystemTap----将SystemTap脚本编译成内核模块

      当运行SystemTap脚本时,会根据脚本生成一个内核模块,然后插入到系统中执行后退出.这个过程总共分为5个阶段:parse, elaborate, translate, compile, run ...

  6. Ubuntu为已经安装的PHP7单独编译mysqli

    编译安装PHP7后没有在ext中没有生成mysqli.so等文件,现在单独编译安装mysqli php7安装的位置:/usr/local/php7/ 我的扩展目录:/usr/local/php7/li ...

  7. centos7.6编译安装php7.2.11及redis/memcached/rabbitmq/openssl/curl等常见扩展

    centos7.6编译安装php7..11及redis/memcached/rabbitmq/openssl/curl等常见扩展 获取Php的编译参数方法: [root@eus-api-cms-bac ...

  8. delphi中单独编译pas生成dcu文件

    delphi中单独编译pas生成dcu文件 在网上下载了一个带源码的组件,结果碰到提示说缺少xxx.dcu.一看它的目录下确实没有,那能不能生成一个呢? 当然可以! 方法是使用delphi的安装目录\ ...

  9. centos7下编译安装php-7.0.15(PHP-FPM)

    centos7下编译安装php-7.0.15(PHP-FPM) 一.下载php7源码包 http://php.net/downloads.php 如:php-7.0.15.tar.gz 二.安装所需依 ...

随机推荐

  1. centos7搭建docker环境

    Docker简介 Docker是一种虚拟化技术,用来将你的应用程序及其依赖的环境一起打包成一个镜像发布,使得在任何地方都能获得相同的运行环境. Docker 是一个开源项目,诞生于 2013 年初,最 ...

  2. 分布式锁结合SpringCache

    1.高并发缓存失效问题: 缓存穿透: 指查询一个一定不存在的数据,由于缓存不命中导致去查询数据库,但数据库也无此记录,我们没有将此次查询的null写入缓存,导致这个不存在的数据每次请求都要到存储层进行 ...

  3. package wang/test is not in GOROOT (/usr/local/go/src/wang/test)

    如果要用 gopath模式 引入包 从src目录下开始引入 需要关闭 go mod 模式 export GO111MODULE=off 如果使用go mod 模式 export GO111MODULE ...

  4. centos8安装zookeeper(单机方式)

    一,下载zookeeper: 1,官网地址 http://zookeeper.apache.org/ 找到这个地址: https://mirrors.tuna.tsinghua.edu.cn/apac ...

  5. Redis Hashes 数据类型简述

    Redis Hashes 是我们日常使用中比较高频的 Redis 数据类型,内部使用 Redis 字典结构存储,底层基于哈希表结构实现. 下面从哈希表节点,哈下表结构,Redis 字典,Redis 字 ...

  6. Helium文档10-WebUI自动化-Text识别网页上的任何文本或标签

    前言 Text关键字的作用是识别网页上的文字,在一般UI查找中使用率非常高,但是需要注意,如果网页上有相同的文字,那么只能识别到第一个 入参介绍 以下是Text的源码 有5个如参:后面4个参数是上下左 ...

  7. C#中string类的几个方法(indexof、lastindexof、substring)(转)

    String.IndexOf String.IndexOf 方法 (Char, Int32, Int32) 报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检查指定数量的字符位置 ...

  8. 如何将vscode代码快速同步到github/gitee上

    用git实现源代码管理几乎是程序员的必备操作,下面是简单实现流程: 在vscode打开代码所在文件夹 在左侧栏点击源代码管理 初始化存储库 添加远程存储库 输入远程仓库地址(没有仓库的要先建个仓) 输 ...

  9. sql左连接查询+右表带有条件的实现

    select * from A表 a left join B表 b on a.id=b.a_id and b.字段='/*条件*/' ; 可查出左表所有数据 select * from A表 a le ...

  10. this.getResolve is not a function VUE中使用sass

    1. 安装以下依赖 npm install node-sass --save-dev //安装node-sass npm install sass-loader --save-dev //安装sass ...