一个linux 驱动升级的小问题记录
重复踩了两次坑,所以简单记录下。
内核 3.10.
在修改了驱动的gro实现之后,进行驱动版本的升级,make && make install 之后,发现tg3的驱动,没有生效。
相同功能的代码在i40e下的驱动能生效,仔细对比install的过程,发现i40e的makefile中会默认调用
cmd_initrd := $(shell \
if which dracut > /dev/null >& ; then \
echo "dracut --force"; \
elif which update-initramfs > /dev/null >& ; then \
echo "update-initramfs -u"; \
fi )
也就是会默认更新initramfs,
而在tg3中的makefile中,进行install,只是:
ifneq ($(BCM_KVER), 2.4)
install: default tg3..gz
else
install: $(BCM_DRV) tg3..gz
endif
mkdir -p $(PREFIX)/$(BCMMODDIR);
install -m $(BCM_DRV) $(PREFIX)/$(BCMMODDIR);
@if [ "$(PREFIX)" = "" ]; then /sbin/depmod -a ;\
else echo " *** Run '/sbin/depmod -a' to update the module database.";\
fi
install -m tg3..gz $(PREFIX)/usr/share/man/man4;\
这样的话,initramfs没有更新,驱动加载的还是老的。这个是第一个小坑。
第二个小坑是,i40e的驱动也不是每台设备都升级成功了,后来才发现,那台没有升级成功的设备的内核,是我之前修改过的,在编译内核之后,我将对应的img进行了改名,
即如下操作:
mv /boot/vmlinuz-3.10. /boot/vmlinuz-3.10.-
mv /boot/initramfs-3.10..img /boot/initramfs-3.10.-.img
这个操作,导致了在i40e模块升级的时候,更新的initramfs名字为initramfs-3.10.0.img,而不是对应的 /boot/initramfs-3.10.0-327.img,从而也失败了。
那么问题来了,initfamfs里,究竟哪些驱动升级后必须加进去,哪些不必须呢?比如网卡驱动,其实可以不加进去,在systemd中将原来的网卡驱动卸载,然后加载新的驱动就行。
initramfs里面,一开始要查看里面的数据,还按照文件格式各种解压,后来发现前辈已经帮我们做好了,就是lsinitrd命令,
lsinitrd /boot/initramfs-3.10..img |grep -i i40e
drwxr-xr-x root root Mar : usr/lib/modules/3.10./updates/drivers/net/ethernet/intel/i40e
-rw-r--r-- root root Mar : usr/lib/modules/3.10./updates/drivers/net/ethernet/intel/i40e/i40e.ko
这个lsinitrd就是一个脚本。而制作initramfs文件,一般使用 mkinitrd,或者直接调用 dracut。
一个linux 驱动升级的小问题记录的更多相关文章
- 初学Python-搞了一个linux用户登录监测小工具
这几天突发奇想,想学习一下Python.看了点基础,觉得有点枯燥,所以想搞点什么.想了想,就随便弄个检测Linux用户登录的小工具吧~ 首先,明确一下功能: 1.能够捕获 linux 用户登录的信息. ...
- 第一个Linux驱动-流水灯【转】
转自:http://www.xuebuyuan.com/1856562.html 水平有限,描述不当之处请指出,转载请注明出处http://blog.csdn.net/vanbreaker/artic ...
- 【从零开始,从内核驱动驱动到用户空间调用】编写第一个linux驱动,通过端口访问I/O寄存器。
目的: 通过I/O端口方式访问RTC的秒寄存器: 由于本人从来没看过linux方面的书籍,也只是会在终端用些常用的命令而已,这次老大叫我学着通过I/O端口方式直接去读写寄存器.于是我在google中搜 ...
- 如何成为一个Linux内核开发者
你想知道如何成为一个Linux内核开发者么?或者你的老板告诉你,“去为这个设备写一个Linux驱动.“这篇文档的目的,就是通过描述你需要 经历的过程和提示你如何和社区一起工作,来教给你为达到这些目的所 ...
- linux驱动面试题2
1.什么是GPIO? general purpose input/output GPIO是相对于芯片本身而言的,如某个管脚是芯片的GPIO脚,则该脚可作为输入或输出高或低电平使用,当然某个脚具有复用的 ...
- linux驱动面试题整理
1.字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件? 答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件. 评:这只是其中一种方式,也 ...
- LINUX驱动、系统底层
就业模拟测试题-LINUX驱动.系统底层工程师职位 本试卷从考试酷examcoo网站导出,文件格式为mht,请用WORD/WPS打开,并另存为doc/docx格式后再使用 试卷编号:143921试卷录 ...
- Linux代码的重用与强行卸载Linux驱动
(一)Linux代码的重用 重用=静态重用(将要重用的代码放到其他的文件的头文件中声明)+动态重用(使用另外一个Linux驱动中的资源,例如函数.变量.宏等) 1.编译是由多个文件组成的Linux驱动 ...
- 超简单易用的 “在 pcduino 开发板上写 Linux 驱动控制板载 LED 的闪烁”
版权声明:本文为博主原创文章,未经博主同意不得转载.转载联系 QQ 30952589,加好友请注明来意. https://blog.csdn.net/sleks/article/details/251 ...
随机推荐
- gcc and g++ 常用参数解释
程序编译运行的过程 预处理.处理一些#include,#define命令,生成.i或者.ii文件: 编译.编译器进行语法分析,语义分析,中间代码生成,目标代码生成,优化,生成.s文件 汇编.汇编器把汇 ...
- Java技术学习之影响MySQL性能的配置参数
本文将介绍MySQL参数的五大类设置,平时我们一般都很少碰它们,在进行MySQL性能调优和故障诊断时这些参数还是非常有用的. (一)连接连接通常来自Web服务器,下面列出了一些与连接有关的参数,以及该 ...
- servlet中的request和response
request对象 1.什么是请求 a.浏览器向服务器发送数据就是请求. 一.request功能1--获取数据 1.获取浏览器相关的信息 getRequestURL方法 -- 返回客户端发出请求完整U ...
- neo4j通过LOAD CSV导入结点和关系
1.neo4j默认的导入入口是:安装路径/import,所以要将csv文件放在import目录下,像下面这样: 2.导入后中文乱码: 因为neo4j是utf-8的,而CSV默认保存是ANSI的,需要用 ...
- Devexpress gridview cell增加控件
1.根据上图次序,先添加三类控件类型: 2.根据上图次序设置columnEdit 3.点开ColumnEdit , 设置 check 和 uncheck的 value
- JavaScript 版本的 RSA加密库文件
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- MySQL误操作删除后,怎么恢复数据?
MySQL误操作删除后,怎么恢复数据?登陆查数据库mysql> select * from abc.stad;+----+-----------+| id | name |+----+----- ...
- rocketmq (一)运行原理以及使用问题
使用消息中间件可以解决高并发,那是因为消息中间件可以将消息缓存到队列之中. 但是 当消息 过多的时候,几万,几十万...消息中间件也可能会宕机,所以我们可以对消息中间件进行集群,在之前的activem ...
- Spring事件通知机制
在上图中,调用 getApplicationEventMulticaster()方法,该方法返回的ApplicationEventMulticaster类型的对象applicationEventMul ...
- Java可视化日历(Date类、DATe Format类、Calendar类综合运用),开发可视化日历小程序
Java时间日期类综合运用,开发可视化日历小程序 由键盘输入指定格式的日期,打印这个月的日历 1.代码 import java.text.DateFormat; import java.text.Pa ...