一、前绪
工作中我们经常要升级某系设备的驱动,例如网卡驱动,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包,虽然能一劳永逸,不过这也是工作量啊。