驱动升级好方法---源码包变rpm包

一、前绪

工作中我们经常要升级某系设备的驱动,例如网卡驱动,raid卡驱动等,尤其最近intel开始推售他们的新型CPU,新型网卡,所以驱动升级变得越来越频繁。
这种升级的操作给运维带来很多麻烦,所以在思考怎样把工作做的简单点。然后找到了一个方法,制作RPM包,然后更新到yum源中,这样我们使用yum install ** 就可以直接升级我们的驱动。会变得非常方便管理。再也不怕应用运维来找我麻烦了。

二、制作RPM包

这里我以新型网卡X710的网卡驱动i40e作为例子讲解

  1. 准备环境。
    查看现在的系统版本、加载驱动、i40e驱动的版本和下载相应的网卡驱动包。
[root@test01 ~]# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core) 
[root@test01 ~]# wget https://downloadmirror.intel.com/24411/eng/i40e-2.4.10.tar.gz
[root@test01 ~]# ls
bak  i40e-2.4.10.tar.gz
[root@test01 ~]# lsmod |grep i40e
[root@test01 ~]# modinfo i40e |grep version
version:        1.6.27-k
[root@test01 ~]# 
  1. 打包SRPM和RPM
    解压源码包,查找*.spec文件,然后打包。
[root@test01 ~]# tar -xvf i40e-2.4.10.tar.gz
[root@test01 ~]# cd i40e-2.4.10/
[root@test01 i40e-2.4.10]# ls
COPYING  i40e.7  i40e.spec  pci.updates  README  scripts  src  SUMS
[root@test01 i40e-2.4.10]# rpmbuild -ba i40e.spec 
-bash: rpmbuild: command not found
[root@test01 i40e-2.4.10]# yum install rpm-build
[root@test01 i40e-2.4.10]# rpmbuild -ba i40e.spec 
error: File /root/rpmbuild/SOURCES/i40e-2.4.10.tar.gz: No such file or directory
[root@test01 i40e-2.4.10]# cp ~/i40e-2.4.10.tar.gz /root/rpmbuild/SOURCES/
[root@test01 i40e-2.4.10]# cp ~/i40e-2.4.10/i40e.spec /root/rpmbuild/SPECS/
[root@test01 i40e-2.4.10]# cd

虽然有报错,但是会自动生成/root/rpmbuild。将相应的源码包和spec文件放到相应的目录中,最终结果如下:

[root@test01 ~]# tree /root/rpmbuild/
/root/rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
│   └── i40e-2.4.10.tar.gz
├── SPECS
│   └── i40e.spec
└── SRPMS

6 directories, 2 files
[root@test01 ~]#
  1. 编译成为RPM和SRPM
[root@test01 ~]# cd /root/rpmbuild/SPECS/
[root@test01 SPECS]# rpmbuild -ba i40e.spec
...
make: Entering directory `/root/rpmbuild/BUILD/i40e-2.4.10/src'
common.mk:101: *** Kernel header files not in any of the expected locations.
common.mk:102: *** Install the appropriate kernel development package, e.g.
common.mk:103: *** kernel-devel, for building kernel modules and try again.  Stop.
make: Leaving directory `/root/rpmbuild/BUILD/i40e-2.4.10/src'
error: Bad exit status from /var/tmp/rpm-tmp.ZM26sO (%build)

RPM build errors:
    Bad exit status from /var/tmp/rpm-tmp.ZM26sO (%build)
[root@test01 SPECS]# 

还是报错,这个因为我的系统没有安装相应的kernel-devel,而我要安装i40e驱动需要依赖这个。那么下面我们来进行安装,这里需要注意一点,kernel-devel要求的版本必须和当前的内核版本一致。

[root@test01 SPECS]# uname -r
3.10.0-693.el7.x86_64
[root@test01 SPECS]# rpm -ivh http://vault.centos.org/7.4.1708/os/x86_64/Packages/kernel-devel-3.10.0-693.el7.x86_64.rpm
Retrieving http://vault.centos.org/7.4.1708/os/x86_64/Packages/kernel-devel-3.10.0-693.el7.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:kernel-devel-3.10.0-693.el7      ################################# [100%]
[root@test01 SPECS]# rpmbuild -ba i40e.spec
...
+ rm -rf /root/rpmbuild/BUILDROOT/i40e-2.4.10-1.x86_64
+ exit 0
[root@test01 SPECS]# tree /root/rpmbuild/
/root/rpmbuild/
├── BUILD
│   └── i40e-2.4.10
│       ├── ...
├── BUILDROOT
├── RPMS
│   └── x86_64
│       └── i40e-2.4.10-1.x86_64.rpm
├── SOURCES
│   └── i40e-2.4.10.tar.gz
├── SPECS
│   └── i40e.spec
└── SRPMS
    └── i40e-2.4.10-1.src.rpm

10 directories, 77 files

至此,我们要的RPM和SRPM包都已经编译安装完成,分别放到了/root/rpmbuild/RPMS和/root/rpmbuild/SRPMS文件夹里。
SRPM包也非常有用,这里我不多讲解了。

三、添加YUM容器

这里我偷懒了,只是搭建的是本地YUM源,实际工作中可以使用http服务,大致过程是一样的。

[root@test01 ~]# cat /etc/yum.repos.d/CentOS-Test.repo 
[c7-Test]
name=CentOS-$releasever - Test
baseurl=file:///data/Test
gpgcheck=0
enabled=1
[root@test01 ~]# mkdir -p /data/Test
[root@test01 ~]# cp /root/rpmbuild/RPMS/x86_64/i40e-2.4.10-1.x86_64.rpm /data/Test/
[root@test01 ~]# createrepo /data/Test/
[root@test01 ~]# createrepo --update /data/Test/
[root@test01 ~]# yum clean all
[root@test01 ~]# yum repolist
Loaded plugins: fastestmirror, langpacks
c7-Test                                                                                                                                                                    
(1/1): c7-Test/primary_db                                                                                                                                                  
repo id                                                                                      repo name                                                                                       status
c7-Test                                                                                      CentOS-7 - Test                                                                                     1
repolist: 11,321
[root@test01 ~]#

四、验证测试

[root@test01 ~]# yum install i40e
...
Installed:
  i40e.x86_64 0:2.4.10-1                                                                                                                                                                           

Complete!
[root@test01 ~]# lsmod |grep i40e
[root@test01 ~]# modprobe i40e
[root@test01 ~]# lsmod |grep i40e
i40e                  365712  0 
ptp                    19231  1 i40e
[root@test01 ~]# modinfo i40e |grep version
version:        2.4.10
rhelversion:    7.4
srcversion:     3977C21019A3C4865FF253A
vermagic:       3.10.0-693.el7.x86_64 SMP mod_unload modversions 
[root@test01 ~]#

五、问题

这种方法虽然使驱动安装变的方便,但是有一个比较麻烦的缺点,就是内核版本。因为这个RPM是基于3.10.0-693.el7.x86_64内核版本生成的,所以只能安装到相应内核版本的系统上。
在实际工作环境中,内核版本可能会因为业务的需求进行升级,升级完之后再用YUM更新驱动的话,很可能会安装不上。能想到的就是给对应每个内核制作一个RPM包,虽然能一劳永逸,不过这也是工作量啊。

推荐阅读更多精彩内容

  • Linux程序包的管理需要依赖程序包管理工具,程序包管理工具可以实现程序的安装、升级、卸载、查询和校验,等等相关操...
    __豆约翰__阅读 191评论 0 0
  • http://blog.csdn.net/mathewsking/article/details/8211273 ...
    liuboxx1阅读 2,701评论 1 0
  • Linux程序包的管理需要依赖程序包管理工具,程序包管理工具可以实现程序的安装、升级、卸载、查询和校验,等等相关操...
    闫秦川阅读 115评论 0 1
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 1,433评论 0 1
  • 软件包基础 包管理器 二进制应用程序的组成部分:二进制文件,库文件,配置文件,帮助文件 程序包管理器 debian...
    毛利卷卷发阅读 254评论 0 2