当前位置: 首页 > news >正文

一个linux 驱动升级的小问题记录

重复踩了两次坑,所以简单记录下。

内核 3.10.

在修改了驱动的gro实现之后,进行驱动版本的升级,make && make install 之后,发现tg3的驱动,没有生效。

相同功能的代码在i40e下的驱动能生效,仔细对比install的过程,发现i40e的makefile中会默认调用

cmd_initrd := $(shell \
                if which dracut > /dev/null 2>&1 ; then \
                    echo "dracut --force"; \
                elif which update-initramfs > /dev/null 2>&1 ; then \
                    echo "update-initramfs -u"; \
                fi )

也就是会默认更新initramfs,

而在tg3中的makefile中,进行install,只是:

ifneq ($(BCM_KVER), 2.4)
install: default tg3.4.gz
else
install: $(BCM_DRV) tg3.4.gz
endif
        mkdir -p $(PREFIX)/$(BCMMODDIR);
        install -m 444 $(BCM_DRV) $(PREFIX)/$(BCMMODDIR);
        @if [ "$(PREFIX)" = "" ]; then /sbin/depmod -a ;\
        else echo " *** Run '/sbin/depmod -a' to update the module database.";\
        fi
        install -m 444 tg3.4.gz $(PREFIX)/usr/share/man/man4;\

这样的话,initramfs没有更新,驱动加载的还是老的。这个是第一个小坑。

第二个小坑是,i40e的驱动也不是每台设备都升级成功了,后来才发现,那台没有升级成功的设备的内核,是我之前修改过的,在编译内核之后,我将对应的img进行了改名,

即如下操作:

mv /boot/vmlinuz-3.10.0 /boot/vmlinuz-3.10.0-327
mv /boot/initramfs-3.10.0.img /boot/initramfs-3.10.0-327.img

这个操作,导致了在i40e模块升级的时候,更新的initramfs名字为initramfs-3.10.0.img,而不是对应的 /boot/initramfs-3.10.0-327.img,从而也失败了。

 

那么问题来了,initfamfs里,究竟哪些驱动升级后必须加进去,哪些不必须呢?比如网卡驱动,其实可以不加进去,在systemd中将原来的网卡驱动卸载,然后加载新的驱动就行。

initramfs里面,一开始要查看里面的数据,还按照文件格式各种解压,后来发现前辈已经帮我们做好了,就是lsinitrd命令,

lsinitrd /boot/initramfs-3.10.0.img |grep -i i40e
drwxr-xr-x   2 root     root            0 Mar 22 14:16 usr/lib/modules/3.10.0/updates/drivers/net/ethernet/intel/i40e
-rw-r--r--   1 root     root      8160823 Mar 22 14:16 usr/lib/modules/3.10.0/updates/drivers/net/ethernet/intel/i40e/i40e.ko

这个lsinitrd就是一个脚本。而制作initramfs文件,一般使用 mkinitrd,或者直接调用 dracut。

 

转载于:https://www.cnblogs.com/10087622blog/p/10577094.html

相关文章:

  • Electron Cash钱包如何离线转BCH
  • Redux小结
  • 2017年360最后一道编程题
  • 翻译:CREATE PROCEDURE语句(已提交到MariaDB官方手册)
  • 智能手机拍照进化论:从传感器到算法摄影
  • 如何使用qperf来衡量网络带宽和延迟性能?
  • 织梦dedecms是什么?
  • 图片的缩放处理
  • CSS: The resize Property
  • vue中引入element ui中的css报错
  • MySQL学习【第九篇存储引擎】
  • 分布式监控-open-falcon
  • PV PVC - 每天5分钟玩转 Docker 容器技术(150)
  • 阿里九年架构师教你如何学会阅读源码
  • Viewpager+FragmentStatePagerAdapter动态添加,删除,移动位置,(局部)更新页面(Fragment)不闪屏,不错位解决方案...
  • 345-反转字符串中的元音字母
  • angular学习第一篇-----环境搭建
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CentOS 7 修改主机名
  • Fabric架构演变之路
  • gitlab-ci配置详解(一)
  • k个最大的数及变种小结
  • Laravel 中的一个后期静态绑定
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Tornado学习笔记(1)
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 初识MongoDB分片
  • 从tcpdump抓包看TCP/IP协议
  • 回流、重绘及其优化
  • 批量截取pdf文件
  • 悄悄地说一个bug
  • 少走弯路,给Java 1~5 年程序员的建议
  • 使用Gradle第一次构建Java程序
  • 使用SAX解析XML
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 详解移动APP与web APP的区别
  • 携程小程序初体验
  • ​Linux·i2c驱动架构​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # 达梦数据库知识点
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #QT(串口助手-界面)
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (145)光线追踪距离场柔和阴影
  • (C++)八皇后问题
  • (LeetCode) T14. Longest Common Prefix
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二)fiber的基本认识
  • (二)学习JVM —— 垃圾回收机制
  • (分布式缓存)Redis哨兵
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357