本篇将详细讲述目标内核驱动无法支持当前网卡

作者: 操作系统  发布:2019-09-02

linux硬盘驱动更新

在内核未升级之前,系统能够正常启动和使用,而当升级系统内核后,系统却无法正常启动时,这可能是因为硬盘驱动不兼容造成的。现可通过进入旧系统按照以下步骤逐步排查相关原因:
①、查询硬盘控制芯片厂商和型号 #lspci -nn | grep "SAS" #lspci -nn | grep "SCSI"
如:SAS [1000 :0078]
②、查看老内核使用的硬盘控制芯片驱动 #uname -a #注: 可以查看到当前使用的内核名
cat /lib/modules/2.6.28-16-server/modules.pcimap #注:其中2.6.28-16-server为老内核

# pci module         vendor     device     subvendor  subdevice  class      class_mask driver_data
scx200               0x0000100b 0x00000500 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0
scx200               0x0000100b 0x00000510 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0
scx200               0x0000100b 0x00000505 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0
scx200               0x0000100b 0x00000515 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0
cpqphp               0xffffffff 0xffffffff 0xffffffff 0xffffffff 0x00080400 0xffffffff 0x0
ibmphp               0x00001014 0x00000246 0x00001014 0x00000247 0x00080400 0x00000000 0x0
cpcihp_zt5550        0x00001138 0x00005550 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0
shpchp               0xffffffff 0xffffffff 0xffffffff 0xffffffff 0x00060400 0xffffffff 0x0
gx1fb                0x00001078 0x00000104 0xffffffff 0xffffffff 0x00030000 0x00ff0000 0x0
gxfb                 0x0000100b 0x00000030 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0
lxfb                 0x00001022 0x00002081 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0
cyber2000fb          0x000010ea 0x00002000 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0
cyber2000fb          0x000010ea 0x00002010 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0
cyber2000fb          0x000010ea 0x00005000 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0

megaraid_sas 0x00001000 0x00000411 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0 megaraid_sas 0x00001000 0x00000060 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0 megaraid_sas 0x00001000 0x0000007c 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0 megaraid_sas 0x00001000 0x00000078 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0 megaraid_sas 0x00001000 0x00000079 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0 megaraid_sas 0x00001000 0x00000413 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0 megaraid_sas 0x00001028 0x00000015 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0 advansys 0x000010cd 0x00001100 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0 advansys 0x000010cd 0x00001200 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0

并根据①的过滤结果进行搜索[1000 : 0078],便可看到老内核所使用的硬盘芯片驱动名。如:megaradi_sas
③、查找硬盘控制芯片驱动对应的驱动模块文件*.ko 根据②的搜索结果查找硬盘芯片驱动对应的驱动文件*.ko #lsmod | grep "megaraid_sas"
megaraid_sas 74148 6
scsi_mod 141236 3 sg,sd_mod,megaraid_sas

④、查看新内核硬盘芯片驱动是否支持当前的芯片厂商和型号 #modinfo /lib/modules/2.6.33-88-server/kernel/drivers/scsi/megaraid/megaraid_sas.ko #注: 假设新内核为2.6.33-88-server
filename: /lib/modules/2.6.33-88-server/kernel/drivers/scsi/megaraid/megaraid_sas.ko
description: LSI MegaRAID SAS Driver
author: [email protected]
version: 00.00.05.40-rh2
license: GPL
srcversion: 6369B642440E1B1D4319D71
alias: pci:v00001000d0000005Bsv*sd*bc*sc*i*
alias: pci:v00001028d00000015sv*sd*bc*sc*i*
alias: pci:v00001000d00000413sv*sd*bc*sc*i*
alias: pci:v00001000d00000071sv*sd*bc*sc*i*
alias: pci:v00001000d00000073sv*sd*bc*sc*i*
alias: pci:v00001000d00000079sv*sd*bc*sc*i*
alias: pci:v00001000d00000078sv*sd*bc*sc*i*
alias: pci:v00001000d0000007Csv*sd*bc*sc*i*
alias: pci:v00001000d00000060sv*sd*bc*sc*i*
alias: pci:v00001000d00000411sv*sd*bc*sc*i*
depends: scsi_mod
vermagic: 2.6.33-dpdk.zznode SMP mod_unload modversions
parm: poll_mode_io:Complete cmds from IO path, (default=0) (int)
parm: max_sectors:Maximum number of sectors per IO command (int)
parm: msix_disable:Disable MSI-X interrupt handling. Default: 0 (int)

如果显示的结果中,包含了该硬盘控制芯片厂商和信号[1000 : 0078],则说明该mod支持当前硬盘;如果不包含,则说明新内核硬盘芯片控制驱动不支持当前驱动,此时需要下载合适的驱动源码放入新内核进行编译。
⑤、下载源代码的路径 ftp://ftp.redhat.org/redhat/linux/enterprise/6Server/en/os/SRPMS/
将源码加入内核进行编译的方法待续!

在内核未升级之前,系统能够正常启动和使用,而当升级系统内核后,系统却无法正常启动时,这可能是因为硬盘驱动不...

LINUX内核升级-更新网卡驱动

因项目需要,将当前内核(2.6.32-220.el6.x86_64)升级到目标内核(2.6.33-110.el6.x86_64),但是编译的目标内核(2.6.33-110.el6.x86_64)的对应驱动程序并不一定支持当前系统的对应设备。本篇将详细讲述目标内核驱动无法支持当前网卡设备的处理步骤。

01、编译目标内核
请参考内核编译相关文档(省略)

02、显示所有网卡
由于一个系统可以支持多张网卡,可通过如下命显示当前系统的所有网卡及其基本信息:
#ifconfig -a

em1 Link encap:Ethernet HWaddr EC:F4:BB:D0:0B:60
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

em2 Link encap:Ethernet HWaddr EC:F4:BB:D0:0B:62
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

em3 Link encap:Ethernet HWaddr EC:F4:BB:D0:0B:64
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Memory:dbe80000-dbf00000

03、查看网卡所需驱动

使用ethtool命令可以查看指定网卡所以来的网卡驱动信息:

#ethtool -i em3

driver: igb - 网卡em3依赖igb驱动
version: 3.0.6-k
firmware-version: 1.6-7
bus-info: 0000:08:00.0

注:igb 驱动程序支持所有基于 82575 、 82576 、 82580 和 I350 的千兆位网络连接。

 

 

04、查看网卡型号

通过③我们已经知道了网卡所依赖的驱动,但是还不知具体的网卡驱动型号,此时可通过如下命令查询:

# lspci -nn | grep "Eth"

01:00.0 Ethernet controller [0200]: Intel Corporation 82599EB 10-Gigabit SFI/SFP Network Connection [8086:10fb] (rev 01)
01:00.1 Ethernet controller [0200]: Intel Corporation 82599EB 10-Gigabit SFI/SFP Network Connection [8086:10fb] (rev 01)
03:00.0 Ethernet controller [0200]: Intel Corporation 82599EB 10-Gigabit SFP Network Connection [8086:154d] (rev 01)
03:00.1 Ethernet controller [0200]: Intel Corporation 82599EB 10-Gigabit SFP Network Connection [8086:154d] (rev 01)
08:00.0 Ethernet controller [0200]: Intel Corporation I350 Gigabit Network Connection [8086:1521] (rev 01)
08:00.1 Ethernet controller [0200]: Intel Corporation I350 Gigabit Network Connection [8086:1521] (rev 01)

注:Gigabit为千兆 10-Gigabit为万兆

 

由④的操作可知当前内核(2.6.32-220.el6.x86_9159金沙官网 ,64)千兆网络驱动igb支持网卡型号[8086:1521],因此必须要求目标内核(2.6.33-110.el6.x86_64)对该型号网卡[8086:1521]的支持。

05、查看目标内核的网卡驱动是否支持当前型号网卡

可以通过modinfo命令查看*.ko对哪种设备型号的支持,目标内核(2.6.33-110.el6.x86_64)的相关驱动可在/lib/modules/2.6.33-110.el6.x86_64的目录想找到,如下所示:

#modinfo /lib/modules/2.6.33-110.el6.x86_64/kernel/drivers/net/igb/igb.ko

filename: igb.ko
version: 2.1.0-k2
license: GPL
description: Intel(R) Gigabit Ethernet Network Driver
author: Intel Corporation, <[email protected]>
srcversion: 412D1CB4C85682CBF07976F
alias: pci:v00008086d000010D6sv*sd*bc*sc*i*
alias: pci:v00008086d000010A9sv*sd*bc*sc*i*
alias: pci:v00008086d000010A7sv*sd*bc*sc*i*
alias: pci:v00008086d000010E8sv*sd*bc*sc*i*
alias: pci:v00008086d0000150Dsv*sd*bc*sc*i*
alias: pci:v00008086d000010E7sv*sd*bc*sc*i*
alias: pci:v00008086d000010E6sv*sd*bc*sc*i*
alias: pci:v00008086d00001518sv*sd*bc*sc*i*
alias: pci:v00008086d0000150Asv*sd*bc*sc*i*
alias: pci:v00008086d000010C9sv*sd*bc*sc*i*
alias: pci:v00008086d00001516sv*sd*bc*sc*i*
alias: pci:v00008086d00001511sv*sd*bc*sc*i*
alias: pci:v00008086d00001510sv*sd*bc*sc*i*
alias: pci:v00008086d0000150Fsv*sd*bc*sc*i*
alias: pci:v00008086d0000150Esv*sd*bc*sc*i*
depends:
vermagic: 2.6.33-110.el6.x86_64 SMP mod_unload modversions

从以上信息中找不到[8086:1521]的信息,因此,目标内核(2.6.33-110.el6.x86_64)网卡驱动不支持当前网卡!

06、到官网下载网卡驱动
既然已经明确了目标内核的网卡驱动并不支持当前的网卡设备,也就是说一旦启用新的内核,将导致系统无法正常使用网络功能。如果是英特尔的网卡设备,则可到: 下载所需的驱动源码到本地。

07、编译网卡驱动
解压驱动源码后,按照以下命令格式编译驱动源码:
#make BUILD_KERNEL=2.6.33-110.el6.x86_64
以上命令将会生成网卡驱动igb.ko。其中BUILD_KERNEL指明需要为哪个内核编译驱动,默认是给当前正在运行的内核编译,在此我们设定为目标内核(2.6.33-110.el6.x86_64)。那么又该如何查看新生成的网卡驱动igb.ko是否支持当前的网卡设备呢?

08、检查网卡驱动是否支持当前网卡
步骤⑦将会生成网卡驱动igb.ko,这时可通过modinfo命令验证该驱动是否支持网卡设备[8086:1521],如下所示:
#modinfo igb.ko
filename: igb.ko
version: 5.2.9.4
license: GPL
description: Intel(R) Gigabit Ethernet Network Driver
author: Intel Corporation, <[email protected]>
srcversion: E377200391EBF74638FEDA2
alias: pci:v00008086d000010D6sv*sd*bc*sc*i*
alias: pci:v00008086d000010A9sv*sd*bc*sc*i*
alias: pci:v00008086d000010A7sv*sd*bc*sc*i*
alias: pci:v00008086d000010E8sv*sd*bc*sc*i*
alias: pci:v00008086d00001526sv*sd*bc*sc*i*
alias: pci:v00008086d0000150Dsv*sd*bc*sc*i*
alias: pci:v00008086d000010E7sv*sd*bc*sc*i*
alias: pci:v00008086d000010E6sv*sd*bc*sc*i*
alias: pci:v00008086d00001518sv*sd*bc*sc*i*
alias: pci:v00008086d0000150Asv*sd*bc*sc*i*
alias: pci:v00008086d000010C9sv*sd*bc*sc*i*
alias: pci:v00008086d00000440sv*sd*bc*sc*i*
alias: pci:v00008086d0000043Csv*sd*bc*sc*i*
alias: pci:v00008086d0000043Asv*sd*bc*sc*i*
alias: pci:v00008086d00000438sv*sd*bc*sc*i*
alias: pci:v00008086d00001516sv*sd*bc*sc*i*
alias: pci:v00008086d00001511sv*sd*bc*sc*i*
alias: pci:v00008086d00001510sv*sd*bc*sc*i*
alias: pci:v00008086d00001527sv*sd*bc*sc*i*
alias: pci:v00008086d0000150Fsv*sd*bc*sc*i*
alias: pci:v00008086d0000150Esv*sd*bc*sc*i*
alias: pci:v00008086d00001524sv*sd*bc*sc*i*
alias: pci:v00008086d00001523sv*sd*bc*sc*i*
alias: pci:v00008086d00001522sv*sd*bc*sc*i*
alias: pci:v00008086d00001521sv*sd*bc*sc*i*
alias: pci:v00008086d00001539sv*sd*bc*sc*i*
alias: pci:v00008086d0000157Csv*sd*bc*sc*i*
alias: pci:v00008086d0000157Bsv*sd*bc*sc*i*
alias: pci:v00008086d00001538sv*sd*bc*sc*i*
alias: pci:v00008086d00001537sv*sd*bc*sc*i*
alias: pci:v00008086d00001536sv*sd*bc*sc*i*
alias: pci:v00008086d00001533sv*sd*bc*sc*i*
alias: pci:v00008086d00001F45sv*sd*bc*sc*i*
alias: pci:v00008086d00001F41sv*sd*bc*sc*i*
alias: pci:v00008086d00001F40sv*sd*bc*sc*i*
depends: hwmon
vermagic: 2.6.33-110.el6.x86_64 SMP mod_unload modversions
parm: InterruptThrottleRate:Maximum interrupts per second, per vector, (max 100000), default 3=adaptive (array of int)
parm: IntMode:Change Interrupt Mode (0=Legacy, 1=MSI, 2=MSI-X), default 2 (array of int)
parm: Node:set the starting node to allocate memory on, default -1 (array of int)
parm: LLIPort:Low Latency Interrupt TCP Port (0-65535), default 0=off (array of int)
parm: LLIPush:Low Latency Interrupt on TCP Push flag (0,1), default 0=off (array of int)
parm: LLISize:Low Latency Interrupt on Packet Size (0-1500), default 0=off (array of int)
parm: RSS:Number of Receive-Side Scaling Descriptor Queues (0-8), default 1, 0=number of cpus (array of int)
parm: VMDQ:Number of Virtual Machine Device Queues: 0-1 = disable, 2-8 enable, default 0 (array of int)
parm: max_vfs:Number of Virtual Functions: 0 = disable, 1-7 enable, default 0 (array of int)
parm: MDD:Malicious Driver Detection (0/1), default 1 = enabled. Only available when max_vfs is greater than 0 (array of int)
parm: QueuePairs:Enable Tx/Rx queue pairs for interrupt handling (0,1), default 1=on (array of int)
parm: EEE:Enable/disable on parts that support the feature (array of int)
parm: DMAC:Disable or set latency for DMA Coalescing ((0=off, 1000-10000(msec), 250, 500 (usec)) (array of int)
parm: LRO:Large Receive Offload (0,1), default 0=off (array of int)
parm: debug:Debug level (0=none, ..., 16=all) (int)
终于在显示的信息中找到了[8086:1521]信息,说明新生成的驱动文件能够支持当前网卡型号。那么如何让目标内核(2.6.33-110.el6.x86_64)能够载入新驱动呢?

09、更新目标内核驱动
首先,将新驱动igb.ko拷贝到目标内核/lib/modules/2.6.33-110.el6.x86_64下的指定目录
#cp igb.ko /lib/modules/2.6.33-110.el6.x86_64/kernel/drivers/net/igb/
其次,使用depmod更新目标内核(2.6.33-110.el6.x86_64)模块的依赖关系
#depmod -a 2.6.33-110.el6.x86_64

10、以上工作完成后,可以重启系统了!

因项目需要,将当前内核(2.6.32-220.el6.x86_64)升级到目标内核(2.6.33-110.el6.x86_64),但是编译的目标内核(2.6.33-110.e...

#gzip -9 initrd.img

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/2.6.xx/modules.dep 档案得知相依性的。而该档案是透过 depmod 程式所建立。

modinfo ip_nat_ftp

一、什么是内核;

内核英文用 kernel,我刚才翻了一下词典,kernel 中文意思是内核、核心、中心、精髓的意思;也是果仁、果核的意思。从字面理解,kernel 是一事物的中心,植物的果实最重要的也是果仁和果核;:) 由此我们能推断内核是操作系统的中心。

我们知道Linus Torvalds 研发了Linux ,其实他研发的就是内核,按内核官方主页的理解,这个内核就是Linux ;其他的扩展和应用都是围绕内核而展开的。所有Linux应用程式都会和内核发生直接或间接的接触;比如硬件需要内核支持,网络的通信也需要内核支持;文件系统更需要内核支持... ...

直言我的能力的不行,如果你想了解和学习解操作系统,我写的教程只是初级应用,理论性的东西不是一言两语能说的清晰的,更不是应用者能说的清晰的。

二、为什么需要编译内核和管理内核

硬件是需要内核支持才行,有些硬件的支持没有被编入内核,这也需要我们重编内核;内核的包含的不仅仅是设备的驱动,更有其他的内容,比如网络协议的支持,防火墙的支持... ... 比如iptables的实现,有些功能是需要内核支持的,如果内核和iptables相关的内容没有被编入,iptables 相关的功能就无法实现;

三、内核编译方法

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

四、管理内核模块的相关命令

1、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

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 模块是8029网卡(PCI NE2000 clone driver)的驱动;模块是位于 /lib/modules/2.6.11-1.1369_FC4/kernel/drivers/net/ 中ne2k-pci.ko

我们目前常用的网卡也有8139的,8139网卡所用的驱动是 8139too ;查查看?

[[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 也有列出内核所有模块,更有移除模块的功能;下在我们举个例子说一说咱们常用的功能和参数;

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 模块名 注:挂载一个模块;

举例:

[[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 来查看和尝试;

4、rmmod 移除已挂载模块;

命令格式:

rmmod 模块名

注意: 模块名是不能带有后缀的,我们通过modprobe -l 所看到的模块,都是带有.ko 或.o后缀;

举例:

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

5、depmod 创建模块依赖关系的列表

这个模块管理工具是创建模块依赖关系的列表,有几个参数我们注意一下就行了,目前的的Linux 发行版所用的内核是2.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

6、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 中找相对应的模块才行,要有绝对路径,而且必须要用到文件名的全称,不能把文件名的后缀省略;

五、和内核模块加载相关的设置文件;

1、模块的设置文件 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.6.29.4-FriendlyARM.后面那个FriendlyARM死活去不掉。后来只好看代码。

1、2.6.29.4这个版本号是是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.6.29.4-FriendlyARM就是 = $(KERNELRELEASE),因此我们需要找到$(KERNELRELEASE)怎么定义的。

3、搜索可以知道$(KERNELRELEASE)在include/config/kernel.release定义,但是改了以后重新make又还有FriendlyARM。

4、看内核顶层的makefile,约872行有说明:

# 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)

仔细对比,原来这个FriendlyARM是$(LOCALVERSION)!,搜索下,发现autoconf.h有,哈哈,这就是内核图形配置出来的嘛

5、马上make menuconfig,搜索$(LOCALVERSION),乖乖,原来在Gernel Setup。。。,马上去掉,重新编译。这下没了!

insmod 和 modprobe 都是载入 kernel module,不过一般差别于 modprobe 能够处理 module 载入的相依问题。 比方...

9159金沙官网 1

4.###zip initrd.img####

主板驱动:LAN(linux-v1.0.0.7)可以看readme文档进行安装。

[root@localhost modules]# modinfo atl1e

#### cp $cdrom(rhel5.3) /tftpboot/images/rhel/i386/5.3/###

epic100: mii

#mv initrd.img initrd.img.gz

   ……

#mkdir initrd

   其中:depends 是和模块相依赖的包。

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

主板:P5QL-VM-EPU

一.测试环境:

atl1e.ko:       (添加的内容。)

arcmsr: scsi_mod

#cp initrd.img ../

如何添加新的模块到initrd.img中:

保存退出。

parm:           MediaType:MediaType Select (array of int)

        1026 Atl1e -100 Fast Ethernet Adapter

depends:       

module-info modules.alias modules.cgz modules.dep pci.ids

description:    Atheros 1000M Ethernet Network Driver

atl1e

4)vi pci.ids

#zcat modules.cgz | cpio -idm

#mv initrd.img.gz initrd.img

#find

添加:

(安装后生成atl1e.ko)

#mv newmodules.gz modules.cgz

filename:       /lib/modules/2.6.18-128.el5xen/kernel/drivers/net/atl1e/atl1e.ko

parm:           TxRingSz:Transmit Ring Sizen (array of int)

1969 atl1e Ethernet Franck.chen

libiscsi: scsi_transport_iscsi scsi_mod

alias pci:v000017D3d00001681sv*sd*bc*sc*i* arcmsr

#cpio -iv < initrd.img

      “ATL1E NIC driver”

parm:           RxfMemSize:memory size of rx buffer(KB) (array of int)

parm:           IntModTimer:Interrupt Moderator Timer (array of int)

#find ./ -print |cpio -ov > initrd.img

3)#vi modules.dep (可以从modinfo atl1e中看出没有依赖的包。)

保存退出。

license:        GPL

(由于linux版本的升级,原网上已经没有一篇文档适合现在的2.6.18-128.el5的核心了,原张超文档提供的initrd-util已经无法完成initrd.img文件的解压了。有关新版本initrd.img分解见下面测试.)

#cp /lib/modules/2.6.18-128el5xen(uname-r)/kernel/drivers/net/atl1e/atl1e.ko .

#gunzip initrd.img.gz

alias pci:v00001969d00001026sv*sd*bc*sc*i* atl1e

(拷贝atl1e.ko 到当前目录。)

#gzip -n -9 newmodules

2.###unzip modules.cgz###

# ls

author:         Atheros Corporation, <xiong.huang@atheros.com>

#cd /tftpboot/images/rhel/i386/5.3/initrd/modules

其中: 1969 制造商编号

添加:

#cp initrd.img initrd.img.old

1.#### unzip initrd.img####

qla4xxx: scsi_transport_iscsi scsi_mod

#find 2.6.18-128.el5/ | cpio -o -H crc > newmodules

bin dev etc init modules proc sbin selinux sys tmp var

#/tftpboot/images/rhel/i386/5.3/initrd

#cp ../initrd.img .

保存退出。

1)#vi module-info

alias pci:v00001022d00007462sv*sd*bc*sc*i* amd8111e

      eth

4.###edit the module-info modules.alias modules.dep pci.ids….####

   iscsi_tcp: libiscsi scsi_transport_iscsi scsi_mod

2)#vi modules.alias

注:例如:alias pci:v00008086d00007190sv000015ADsd00001976bc06sc00i00
      表示该设备的设备编号是 0x7190,制造商编号是 0x8086,模块子系统提供商编号 0x15ad 等等,v即是代表 vendor,sv代表 subsystem-vendor,sd代表 subsystem-device

#cd /tftpboot/images/rhel/i386/5.3

#rm -rf modules.cgz

srcversion:     D7C9E6C2BF57DCDD60364C3

#ls

……

        1026 设备编号。

#cd ./initrd

version:        1.0.0.7

二、解压initrd.img文件,重新封装网卡驱动。

我们可以直接从系统里得到(因为已经手动安装过了)。通过 modinfo .

alias pcmcia:m015Fc000Af*fn*pfn*pa*pb*pc*pd* airo_cs

#cd 2.6.18-128.el5/i686

vermagic:       2.6.18-128.el5xen SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1

软件:CentOS5.3 核心版本:2.6.18.128.e15xen

#ls

3.###zip modules.cgz###

本文由9159.com发布于操作系统,转载请注明出处:本篇将详细讲述目标内核驱动无法支持当前网卡

关键词: 9159.com 9159金沙官网