ko驱动模块的二种方式,Linux系统NBD驱动装置拓展篇

By admin in 美高梅手机版4858 on 2019年5月4日

前言

不久前在设置中标麒麟机器的时候,开采麒麟的操作系统找不到src.rpm包,且系统之中也未尝水源文件,导致健康艺术安装NBD驱动不恐怕实行。故这里找了另一种艺术援救此类型操作系统安装NBD驱动。

基本与内核模块:depmod,lsmod,modinfo,insmod,rmmod,mdprobe

假诺我们要增添的驱动程序模块名字为:demo.ko

linux模块insmod和modprobe介绍,insmodmodprobe

insmod 和 modprobe 都是载入 kernel module,不过貌似差异于 modprobe
能够处理 module 载入的相依难点。

即便你要载入 a module,但是 a module 必要系统先载入 b module 时,间接用
insmod 挂入日常都会出现谬误信息,但是 modprobe 倒是能够通晓先载入 b
module后才载入 a module,如此相依性就能满足。

但是 modprobe 并不是大神,不会决定到精通 module
之间的相依性为啥,该程式是读取 /lib/modules/二.陆.xx/modules.dep
档案得知相依性的。而该档案是通过 depmod 程式所创设。

modinfo ip_nat_ftp

壹、什么是水源;

基本英文用 kernel,笔者刚才翻了一下词典,kernel
中文意思是水源、主题、大旨、精髓的意思;也是果仁、果核的情致。从字面明白,kernel
是一事物的主干,植物的果实最要紧的也是果仁和果核;:)
因而大家能测度内核是操作系统的基本。

我们清楚Linus Torvalds 研究开发了Linux
,其实她研究开发的正是基础,按基本官方主页的驾驭,那一个基本正是Linux
;别的的扩展和利用都以环绕基本而张开的。全数LinuxAPP都会和基本发生径直或直接的接触;比如硬件须求内核协助,互联网的通讯也急需内核帮助;文件系统更亟待内核帮助…

直言本人的力量的卓殊,倘若您想询问和读书解操作系统,笔者写的科目只是中低等应用,理论性的东西不是一言两语能说的清晰的,更不是应用者能说的显明的。

贰、为何须要编译内核和管制基本

硬件是内需内核帮助才行,有个别硬件的帮衬未有被编入内核,那也供给大家重编内核;内核的含有的不仅仅是器材的驱动,更有别的的剧情,例如互联网协议的支持,防火墙的支撑…

比如iptables的落到实处,某个功用是急需内核帮忙的,假使基本和iptables相关的内容并未被编入,iptables
相关的效率就不能得以落成;

三、内核编写翻译方法

请参考:《编译内核操作流程 ──为菜鸟指南》

4、管理内核模块的有关命令

一、lsmod 列加以挂载的内核模块;

lsmod 是列出近来系统中已加载的模块的名目及大小等;别的大家还可以查看
/proc/modules ,大家同样能精晓系统已加载的模块;

[[email protected]
beinan]# lsmod

2、modinfo 查看模块消息;

modinfo 能查看模块的新闻,通过查阅模块音信来推断那么些模块的用处;

[[email protected]
beinan]# moinfo 模块名

举例:

[[email protected]
beinan]# modinfo ne2k-pci

filename: /lib/modules/2.6.11-1.1369_FC4/kernel/drivers/net/ne2k-pci.ko

ko驱动模块的二种方式,Linux系统NBD驱动装置拓展篇。author: Donald Becker / Paul Gortmaker

description: PCI NE2000 clone driver

license: GPL

parmtype: debug:int

parmtype: options:array of int

parmtype: full_duplex:array of int

parm: debug:debug level (1-2)

parm: options:Bit 5: full duplex

parm: full_duplex:full duplex setting(s) (1)

vermagic: 2.6.11-1.1369_FC4 686 REGPARM 4KSTACKS gcc-4.0

depends: 8390

alias: pci:v000010ECd00008029sv*sd*bc*sc*i*

alias: pci:v00001050d00000940sv*sd*bc*sc*i*

alias: pci:v000011F6d00001401sv*sd*bc*sc*i*

alias: pci:v00008E2Ed00003000sv*sd*bc*sc*i*

alias: pci:v00004A14d00005000sv*sd*bc*sc*i*

alias: pci:v00001106d00000926sv*sd*bc*sc*i*

alias: pci:v000010BDd00000E34sv*sd*bc*sc*i*

alias: pci:v00001050d00005A5Asv*sd*bc*sc*i*

alias: pci:v000012C3d00000058sv*sd*bc*sc*i*

alias: pci:v000012C3d00005598sv*sd*bc*sc*i*

alias: pci:v00008C4Ad00001980sv*sd*bc*sc*i*

srcversion: 6ACE95F441CD26DF9DC31C2

上边的例子是我们查阅 ne2k-pci 这一个模块的音讯,通过查看,大家精晓ne2k-pci
模块是802九网卡(PCI NE两千 clone driver)的驱动;模块是位于
/lib/modules/二.陆.1一-一.136九_FC4/kernel/drivers/net/ 中ne2k-pci.ko

我们日前常用的网卡也有813九的,813玖网卡所用的驱动是 813玖too ;查查看?

[[email protected]
beinan]# modinfo 8139too

咱俩再检查vfat 和ntfs 的模块消息;

[[email protected]
beinan]# modinfo vfat

[[email protected]
beinan]# modinfo ntfs

自身尝尝一下;

留神: 模块名是不能够带有后缀的,大家透过modprobe -l
所看到的模块,都以带有.ko 或.o后缀;

3、modprobe 挂载新模块及新模块相依赖的模块

modprobe
我们常用的效劳正是挂载模块,在挂载某些内核模块的还要,这几个模块所依据的模块也被同时挂载;当然modprobe
也有列出基础全数模块,更有移除模块的效益;下在大家比方说1说我们常用的意义和参数;

modprobe [-v] [-V] [-C config-file] [-n] [-i] [-q] [-o ]
[parameters…]

modprobe -r [-n] [-i] [-v] …

modprobe -l -t [ -a …]

上面是modprobe 的用法,具体更为详细的救助,大家能查看 man modprobe ;

[[email protected]
beinan]# modprobe -c

modprobe -c 能查看modules 的安装文件,举个例子模块的小名是怎么等;

[[email protected]
beinan]# modprobe -l

modprobe -l 是列出基础中具有的模块,包涵已挂载和未挂载的;通过modprobe -l
,大家能查看到大家所须求的模块,然后依照我们的内需来挂载;其实modprobe -l
读取的模块列表就投身 /lib/modules/’uname -r’ 目录中;个中uname -r
是基础的版本;

[[email protected]
beinan]# uname -r

2.6.11-1.1369_FC4

[[email protected]
beinan]# ls /lib/modules/2.6.11-1.1369_FC4/

透过上边的指令,本人试试看?

[[email protected]
beinan]# modprobe 模块名 注:挂载3个模块;

举例:

[[email protected]
beinan]# modprobe ne2k-pci 注:挂载 ne2k-pci 模块;

[[email protected]
beinan]# modprobe vfat 注:挂载vfat 模块

[[email protected]
beinan]# modprobe ntfs 注:挂载ntfs 模块

[[email protected]
beinan]# lsmod 注:列出已挂载模块, 我们会看出ne2k-pci ,vfat
,ntfs的模块 ;

留神: 模块名是不能够带有后缀的,大家经过modprobe -l
所阅览的模块,都以带有.ko 或.o后缀;

[[email protected]
beinan]# modprobe -r 模块名 注:移除已加载的模块,和rmmod 成效雷同;

小心: 模块名是无法带有后缀的,大家通过modprobe -l
所看到的模块,都以带有.ko 或.o后缀;

[[email protected]
beinan]# modprobe -r 模块名

举例:

[[email protected]
beinan]# modprobe -r ne2k-pci

就说那样多呢,更为详细的仍然用 man modprobe 来查阅和品味;

肆、rmmod 移除已挂载模块;

一声令下格式:

rmmod 模块名

注意: 模块名是不能够带有后缀的,我们经过modprobe -l
所阅览的模块,都以带有.ko 或.o后缀;

举例:

[[email protected]
beinan]# rmmod vfat 注:移除已挂载的模块vfat

伍、depmod 创设模块依赖关系的列表

其一模块管理工科具是创制模块重视关系的列表,有多少个参数大家注意一下就行了,近日的的Linux
发行版所用的根本是贰.6x本子,是机动消除重视关系,所以那些命令知道就行了;模块在此之前也有凭借关系,比方我们想驱动USB
移动硬盘,近期有三种驱动,一种是udev
,在基础中有,但目前不太平静;另一种格局是用usb-storage驱动,而usb-storage
看重的模块是scsi 模块,所以大家要用usb-storage 的模块,也得把scsi
编写翻译安装;

再举例:sata的硬盘,在Linux中的设备表示的是/dev/sd* ,举例/dev/sda,/dev/sdb 等… 系统要使得
sata硬盘,则必要把sata在根本中当选,或编写翻译成模块,或内放置内核之中,在此同时,还索要在基本中当选ide
,scsi 的支持等;

depmod 工具的洋文原意:depmod program to generate modules.dep and map
files.(作者译的:为modules.dep 文件或映射文件创设信赖关系)

[[email protected]
beinan]# depmod -a 注:为保有列在/etc/modprobe.conf
或/etc/modules.conf 中的全部模块创制注重关系,并且写入到modules.dep文件;

[[email protected]
beinan]# depmod -e 注:列出已挂载但不可用的模块;

[[email protected]
beinan]# depmod -n 注:列出全体模块的信赖关系,但惟独是出口出来 (Write
the dependency file on stdout only)

注:modules.dep 位于 /lib/modules/内核版本 目录

举个例子 Fedora Core 4.0 中,系统暗中认可的内核:

[[email protected]
beinan]# ls /lib/modules/2.6.11-1.1369_FC4/modules.dep

/lib/modules/2.6.11-1.1369_FC4/modules.dep

陆、insmod 挂载模块;

insmod 那个工具,和modprobe 有点类似,但效益上尚无modprobe 强,modprobe
在挂载模块是绝不钦点模块文件的门路,也不用带文件的后缀.o 或.ko ;而insmod
必要的是模块的四方目录的绝对路径,并且一定要包蕴模块文件名后缀的(modulefile.o
或modulesfile.ko );

对此那一个工具,大家只是介绍一下,
并不推荐使用。因为模块有依赖关系,对于菜鸟来讲,大概不明白那些模块信赖和哪些模块重视;

举例:

[[email protected]
beinan]# insmod
/lib/modules/2.6.11-1.1369_FC4/kernel/drivers/net/tg3.ko

小编们要到 /lib/modules/内核版本 uname -r 的一声令下输出/kernel/drivers
中找相对应的模块才行,要有相对路线,而且必供给用到文件名的齐全,无法把公文名的后缀省略;

伍、和内核模块加载相关的装置文件;

壹、模块的安装文件 modules.conf 或 modprobe.conf

内核模块的开机自动挂载模块一般是坐落三个安装文件,一般的Linux发行版本都有
/etc/modules.conf 或 /etc/modprobe.conf 。比如Fedora Core 4.0
内核模块开机自动加载文件是 /etc/modprobe.conf
;在那几个文件中,一般是写入模块的加载命令或模块的外号的定义等;例如大家在modules.conf
中或许会发行类似的一行 ;

alias eth0 8139too

///———————————————————————————————————————–

KERNELRELEASE 的定义,Linux $(KERNELRELEASE)

不久前用友善之臂的板子,发掘根本的名号是:Linux-2.六.29.四-FriendlyA汉兰达M.前边那些FriendlyA君越M死活去不掉。后来只可以看代码。

一、二.陆.29.四以此版本号是是uboot在做uimage的时候增多的,看arch/arm/boot/Makefile:

quiet_cmd_uimage = UIMAGE
[email protected]

cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel /

-C none -a $(LOADADDR) -e $(LOADADDR) /

-n ‘Linux-$(KERNELRELEASE)’ -d $<
[email protected]

2、相比,可见二.陆.2九.四-FriendlyA中华VM正是 =
$(KE瑞虎NELRELEASE),因而大家供给找到$(KEBMWX5NELRELEASE)怎么定义的。

三、找出能够领略$(KEPAJERONELRELEASE)在include/config/kernel.release定义,可是改了后来再也make又还有FriendlyALX570M。

四、看内核顶层的makefile,约87贰行有证实:

# Build the kernel release string

。。。

# $(localver-auto) (only if CONFIG_LOCALVERSION_AUTO is set)

# ./scripts/setlocalversion (SCM tag, if one exists)

# $(LOCALVERSION) (from make command line if provided)

有心人相比较,原来那么些FriendlyAMuranoM是$(LOCALVECR-VSION)!,找寻下,开掘autoconf.h有,哈哈,那便是水源图形配置出来的呗

5、登时make menuconfig,搜索$(LOCALVE大切诺基SION),乖乖,原来在Gernel
Setup。。。,马上去掉,重新编写翻译。这下没了!

insmod 和 modprobe 都以载入 kernel module,可是貌似差异于 modprobe
能够管理 module 载入的相依难题。 例如…

一、 中标麒麟系统项目及基础音信

 

系统镜像名称

内核版本

Kylin-4.0-1E-desktop_20160401-final-x86_64-2016-04-01 3.16.0-23-generic
NeoKylin-Linux-Advanced-Server-6.7 2.6.32-573.el6.x86_64
NeoKylin-sws-3.2(64) 2.6.32-220.2.1.2.ky3.2.x86_64
YHKylin-4.2-5-x86_64-server 2.6.32-431.29.2.3.ky3.1.x86_64

对于上述五个水源版本的机械,当中三.16.0-二3-generic和ubuntu(ubuntu-1肆.十-desktop-amd64)内核版本壹模一样,而且/lib/modules/叁.1六.0-贰叁-generic/kernel/drivers/block文件夹下已经有编写翻译好的nbd.ko文件,测试开掘能够插入到目的机器麒麟系统中。

  首先,大家得明白根本与内核模块放在哪个地方。

加载驱动模块

方法一:
进入demo.ko驱动模块文件所在的目录,然后直接terminal推行:

insmod demo.ko

即可。

方法二:
将demo.ko文件拷贝到 /lib/module/`uname -r`/目录下,这里,`uname
-r`
情趣为在极限中输入此命令试行的结果后显得的水源版本及称谓,举例exynos
441第22中学浮现的为3.5.0-FriendlyARM

接下来命令行中输入如下命令:

depmod
(会在/lib/modules/`uname
-r`/目录下生成modules.dep和modules.dep.bb文件,注脚 模块的注重关系)

终极试行:

modprobe demo(注意:这里不用输入.ko后缀)

贰、查找同样内核的其余Linux系统:

譬如红帽系统:

美高梅手机版4858 1

内核:/boot/vmlinuz或/boot/vmlinuz-version;

二种方法的区分:

  1. modprobe和insmod类似,都以用来动态加载驱动模块的,分裂在于modprobe能够缓和load
    module的信赖关系,它是经过 /lib/modules/`uname
    -r`/modules.dep和modules.deo.bb文件来搜索依赖关系的;而insmod不可能一蹴而就依赖关系。
  2. 也正是说,假使您鲜明你要加载的驱动模块不依赖其余驱动模块的话,既能够insmod也能够modprobe;可是insmod能够在其余目录下推行,更有利一些,而只要采用的加载的驱动模块还借助别的.ko驱动模块的话,将模块拷贝到上述的一定目录相比较便宜,depmod之后再modprobe
    xxx.ko就可以。也足以二个三个运用insmod命令插入模块。

3、常规安装NBD驱动

在同一内核的系列(该种类能够经过正规办法安装NBD)上安装NBD驱动

以下是大约步骤:

  1 uname -r #-> 3.10.0-123.el7.x86_64
  2 yum install kernel-devel kernel-headers
  3 cd /tmp
  4 wget kernel-3.10.0-64.el7.x86_64.rpm
  5 rpm -ivh kernel-3.10.0-64.el7.x86_64.rpm (这时会在/root/rpmbuild/SOURCES下生成tar包)
  6 cd ~/rpmbuild/SOURCES
  7 tar jxf kernel-3.10.0-64.el7.x86_64.tar -C /usr/src/kernels/
  8 cd /usr/src/kernels
  9 mv $(uname -r) $(uname -r)-old
 10 mv linux-2.6.32-220.4.2.el6 $(uname -r)
 11 cd $(uname -r)
 12 make mrproper
 13 cp ../$(uname -r)-old/Module.symvers .
 14 cp /boot/config-$(uname -r) ./.config
 15 make oldconfig
 16 make prepare
 17 make scripts
 18 make CONFIG_BLK_DEV_NBD=m M=drivers/block
 19 cp drivers/block/nbd.ko /lib/modules/$(uname -r)/kernel/drivers/block/
 20 depmod -a
 21 
 22 modprobe nbd 启用nbd模块

内核解压缩所需昂Cora速龙isk:/boot/initrd(/boot/initrd-version);

查看已加载的驱动模块列表

在此外目录下输入如下命令就可以:

lsmod

4、拷贝nbd驱动到对象主机

经过在redhat机器中,成功编写翻译安装NBD,然后将/lib/modules/$(uname
-r)/kernel/drivers/block/目录下的nbd.ko文件拷贝到目的机/lib/modules/$(uname
-r)/kernel/drivers/block/目录下。

内核模块:/lib/modules/version/kernel或/lib/modules/$(uname -r)/kernel;

卸载驱动模块

在其余目录下推行如下命令就能够:
1. rmmod

rmmod <module_name>

2. modprobe

modprobe <module_name>
(会活动化解注重关系,也会活动卸载相应的依赖模块)

(注意个中module_name是lsmod中突显的模块名称,而不是对应的.ko文件名)

5、加载驱动模块

方法一:
美高梅手机版4858,跻身SHT21.ko驱动模块文件所在的目录,然后直接
insmod SHT21.ko
即可

方法二:
将SHT二一.ko文件拷贝到/lib/modules/$(uname
-r)/kernel/drivers/block/目录下,这里,#uname
-r#意思是,在极端中输入
uname -r后显得的基石版本及称号,举个例子mini2440中#uname
-r#就是2.6.32.2-FriendlyARM。

然后
depmod(会在/lib/modules/#uname
-r#/目录下生成modules.dep和modules.dep.bb文件,申明模块的信赖关系)
最后
modprobe SHT21(注意这里不供给输入.ko后缀)
即可

二种方法的差别:

modprobe和insmod类似,都是用来动态加载驱动模块的,差别在于modprobe能够消除load
module时的信赖关系,它是透过/lib/modules/#uname
-r/modules.dep(.bb)文件来找寻依赖关系的;而insmod不能够消除注重难点。

也正是说,如果您分明你要加载的驱动模块不依据别的驱动模块的话,既可以insmod也能够modprobe,当然insmod可以在任何目录下推行,更便宜一些。而只要您要加载的驱动模块还借助其余ko驱动模块的话,就只可以将模块拷贝到上述的一定目录,depmod后再modprobe。

查阅已加载的驱动模块列表

在此外目录下,
lsmod
即可

卸载驱动模块

在别的目录下,
rmmod <module_name>
即可
留神个中”module_name”是lsmod展现的模块名称,而不是对应的ko文件名

基本源码:/usr/src/linux 或 /usr/src/kernels;

六、总结

一) 常规安装NBD进程从前,首先查看/usr/src/kernels/目录下是或不是带有$(uname
-r)文件夹,若是未有则须求手动下载kernel-devel-二.6.3贰-220.el六.x捌陆_6肆.rpm文本下载头文件手动安装。

参照链接()(不相同操作系统安装不一样基础的头文件)。

贰) yum install kernel-devel
kernel-headers只会下载最新的内核头文件,轻松导致系统所正在周转的基业与kernel-header版本不等同,编写翻译NBD退步;

建议采用(一)中的方法,找到同样版本内核heards & devel
rpm文件包,手动安装。

  倘使基本顺遂被加载了,会有以下多少个新闻记录:

基础版本:/proc/version

系统基本功用:/proc/sys/kernel

  若是笔者有个新硬件,偏偏笔者的种类不辅助,要这么做:

再次编写翻译内核,并投入最新的硬件驱动程序源码;

将该硬件的驱动程序编写翻译成为模块,在运行时加载该模块。

 

  上面大家根本讲一下内核模块

壹、内核模块与依据

  基本上,内核模块放置处是在 /lib/modules/$(uname
-r)/kernel个中,里面包车型客车多少个目录重要为:

arch 与硬件平台有关的抉择

crypto 内核所支撑的加密的本领

drivers 一些硬件的驱动程序

fs 内核所支撑的文件系统

lib 一些函数库

net
与网络有关的各种协议数据,还有防火墙模块等

sound 与音响效果有关的各样模块

  还有文件/lib/modules/$(uname -r)/modules.dep
,记录了基础扶助的模块的借助。那么什么样创造该公文呢?如下:

#depmod [-Ane]

 
-A:不加任何参数时,depmod会主动去分析当前基础的模块,并且重新写入/lib/modules/$(uname
-r)/

modules.dep个中。如若加-A参数,则会找出比modules.dep内还要新的模块,借使真找到,才会更新。

  -n:不写入modules.dep,而是将结果输出到显示屏上。

  -e:展现出当下已加载的不可施行的模块名称。

 

 
例子:作者做好3个网卡驱动程序a.ko(内核模块名以.ko结尾),该怎么翻新内核的依赖性?

#cp a.ko /lib/modules/$(uname
-r)/kernel/drivers/net

#depmod

 

 

二、内核模块的查看

  查看近来模块加载了不怎么的模块。

#lsmod

美高梅手机版4858 2

模块名称     模块的高低
 此模块是或不是被其余模块使用

 

翻开每一种模块音信

#modinfo [-adln]
[module_name|filename]

  -a:仅列出作者名

  -d:仅列出该modules的印证

  -l:仅列出授权

  -n:仅列出该模块的事无巨细路线

 

  例子:#modinfo mii

美高梅手机版4858 3

 

 

三、内核模块的加载与删除

 
最佳使用modprobe那些命令加载模块,因为modprobe会主动寻觅modules.dep的始末,消除了借助后,才决定供给加载的模块有怎么着。

 
insmod则完全由用户自动加载2个完好无缺文件名的模块,并不会积极性剖析模块依赖性。

#insmod [/full/path/module_name]
[parameters]

 

  例子:尝试载入cifs.ko这些文件系统模块

#insmod /lib/modules/$(uname
-r)/kernel/fs/cifs/cifs.ko

  记住,一定假设一体化的文件名。

 

#rmmod [-fw] module_name

  -f:强制将该模块删除掉,不论是不是正在被采纳

  -w:若该模块正在被使用,则等待该模块被应用实现后再删除

 

 
insmod与rmmod的标题时,你不能够不自行找到模块的欧洲经济共同体文件名才行。所以,大家一般采取modprobe.

#modprobe [-lcfr] module_name

  -c:列出近期系统方面装有的模块

  -l:列出近日在/lib/modules/`uname -r`/kernel在这之中的保有模块完整文件名

  -f:强制加载该模块

  -r:删除有些模块

 

  例子:加载cifs模块

   #modprobe cifs

 
很便利,因为大家一直无须知道完全的模块文件名

 

内核模块的附加参数配置:/etc/modprobe.conf

  如若你想修改有些模块的额外参数设置,就在这么些文件内。

  #vi /etc/modprobe.conf

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有