一, 前绪
工作中我们经常要升级某系设备的驱动, 例如网卡驱动, raid 卡驱动等, 尤其最近 intel 开始推售他们的新型 CPU, 新型网卡, 所以驱动升级变得越来越频繁.
这种升级的操作给运维带来很多麻烦, 所以在思考怎样把工作做的简单点. 然后找到了一个方法, 制作 RPM 包, 然后更新到 yum 源中, 这样我们使用 yum install ** 就可以直接升级我们的驱动. 会变得非常方便管理. 再也不怕应用运维来找我麻烦了.
二, 制作 RPM 包
这里我以新型网卡 X710 的网卡驱动 i40e 作为例子讲解
准备环境.
查看现在的系统版本, 加载驱动, 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 ~]#
打包 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 ~]#
编译成为 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 包, 虽然能一劳永逸, 不过这也是工作量啊.
来源: http://www.jianshu.com/p/5eab56b751be