一、前緒
工作中我們經(jīng)常要升級(jí)某系設(shè)備的驅(qū)動(dòng),例如網(wǎng)卡驅(qū)動(dòng),raid卡驅(qū)動(dòng)等,尤其最近intel開始推售他們的新型CPU,新型網(wǎng)卡,所以驅(qū)動(dòng)升級(jí)變得越來越頻繁。
這種升級(jí)的操作給運(yùn)維帶來很多麻煩,所以在思考怎樣把工作做的簡(jiǎn)單點(diǎn)。然后找到了一個(gè)方法,制作RPM包,然后更新到y(tǒng)um源中,這樣我們使用yum install ** 就可以直接升級(jí)我們的驅(qū)動(dòng)。會(huì)變得非常方便管理。再也不怕應(yīng)用運(yùn)維來找我麻煩了。
二、制作RPM包
這里我以新型網(wǎng)卡X710的網(wǎng)卡驅(qū)動(dòng)i40e作為例子講解
- 準(zhǔn)備環(huán)境。
查看現(xiàn)在的系統(tǒng)版本、加載驅(qū)動(dòng)、i40e驅(qū)動(dòng)的版本和下載相應(yīng)的網(wǎng)卡驅(qū)動(dòng)包。
[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
雖然有報(bào)錯(cuò),但是會(huì)自動(dòng)生成/root/rpmbuild。將相應(yīng)的源碼包和spec文件放到相應(yīng)的目錄中,最終結(jié)果如下:
[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]#
還是報(bào)錯(cuò),這個(gè)因?yàn)槲业南到y(tǒng)沒有安裝相應(yīng)的kernel-devel,而我要安裝i40e驅(qū)動(dòng)需要依賴這個(gè)。那么下面我們來進(jìn)行安裝,這里需要注意一點(diǎn),kernel-devel要求的版本必須和當(dāng)前的內(nèi)核版本一致。
[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包都已經(jīng)編譯安裝完成,分別放到了/root/rpmbuild/RPMS和/root/rpmbuild/SRPMS文件夾里。
SRPM包也非常有用,這里我不多講解了。
三、添加YUM容器
這里我偷懶了,只是搭建的是本地YUM源,實(shí)際工作中可以使用http服務(wù),大致過程是一樣的。
[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 ~]#
四、驗(yàn)證測(cè)試
[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 ~]#
五、問題
這種方法雖然使驅(qū)動(dòng)安裝變的方便,但是有一個(gè)比較麻煩的缺點(diǎn),就是內(nèi)核版本。因?yàn)檫@個(gè)RPM是基于3.10.0-693.el7.x86_64內(nèi)核版本生成的,所以只能安裝到相應(yīng)內(nèi)核版本的系統(tǒng)上。
在實(shí)際工作環(huán)境中,內(nèi)核版本可能會(huì)因?yàn)闃I(yè)務(wù)的需求進(jìn)行升級(jí),升級(jí)完之后再用YUM更新驅(qū)動(dòng)的話,很可能會(huì)安裝不上。能想到的就是給對(duì)應(yīng)每個(gè)內(nèi)核制作一個(gè)RPM包,雖然能一勞永逸,不過這也是工作量啊。