centos 內(nèi)核源碼build版本代碼獲取

在學(xué)習(xí)ebpf的過程中,需要下載linux的源碼,但是內(nèi)核版本帶有build版本號(cat /proc/version),如4.19.113-300,在github上只能找到4.19.113這個tag,并不能找到4.19.113-300這個tag,雖然知道這兩個的代碼相差可能非常小,保險起見,還是找到帶build版本號的源碼。

那么如何找到這個4.19.113-300對應(yīng)的內(nèi)核源碼呢?kernel-devel包下也有很多內(nèi)核源碼,他跟4.19.113-300的源碼的區(qū)別是什么呢?

kernel-devel rpm

從下面rpm的描述信息看,kernel-devel提供了編譯內(nèi)核模塊或者驅(qū)動需要的頭文件和Makefile。由此也可以看出devel應(yīng)該是development的縮寫了。
所以,如果只是編譯一個內(nèi)核模塊,那就不需要全部的內(nèi)核源碼,安裝kernel-devel的rpm包就足夠了。如果是其他用途,如編譯bpf,就需要想辦法獲取到該內(nèi)核版本對應(yīng)的源代碼了。

[root@localhost linux-4.19.113]# yum info kernel-devel
Installed Packages
Name        : kernel-devel
Arch        : x86_64
Version     : 4.19.113
Release     : 300.el7
Size        : 50 M
Repo        : installed
From repo   : /kernel-devel-4.19.113-300.el7.x86_64
Summary     : Development package for building kernel modules to match the kernel
URL         : https://www.kernel.org/
License     : GPLv2 and Redistributable, no modification permitted
Description : This package provides kernel headers and makefiles sufficient to build modules
            : against the kernel package.

通過直觀的對比內(nèi)核源碼和kernel-devel的目錄,也能看到文件大小相差很多,一個是900M,一個是78M。

[root@localhost linux-4.19.113]# du -h --max-depth=1
42M     ./Documentation
180K    ./LICENSES
126M    ./arch
1.9M    ./block
48K     ./certs
3.4M    ./crypto
530M    ./drivers
8.0K    ./firmware
39M     ./fs
41M     ./include
188K    ./init
256K    ./ipc
9.0M    ./kernel
4.5M    ./lib
3.8M    ./mm
30M     ./net
1.4M    ./samples
3.3M    ./scripts
2.8M    ./security
36M     ./sound
26M     ./tools
48K     ./usr
708K    ./virt
898M    .
[root@localhost linux-4.19.113]# du -h --max-depth=1 /usr/src/kernels/4.19.113-300.el7.x86_64/
7.3M    /usr/src/kernels/4.19.113-300.el7.x86_64/arch
32K     /usr/src/kernels/4.19.113-300.el7.x86_64/block
16K     /usr/src/kernels/4.19.113-300.el7.x86_64/certs
80K     /usr/src/kernels/4.19.113-300.el7.x86_64/crypto
11M     /usr/src/kernels/4.19.113-300.el7.x86_64/drivers
4.0K    /usr/src/kernels/4.19.113-300.el7.x86_64/firmware
668K    /usr/src/kernels/4.19.113-300.el7.x86_64/fs
42M     /usr/src/kernels/4.19.113-300.el7.x86_64/include
68K     /usr/src/kernels/4.19.113-300.el7.x86_64/init
4.0K    /usr/src/kernels/4.19.113-300.el7.x86_64/ipc
172K    /usr/src/kernels/4.19.113-300.el7.x86_64/kernel
176K    /usr/src/kernels/4.19.113-300.el7.x86_64/lib
40K     /usr/src/kernels/4.19.113-300.el7.x86_64/mm
832K    /usr/src/kernels/4.19.113-300.el7.x86_64/net
120K    /usr/src/kernels/4.19.113-300.el7.x86_64/samples
4.6M    /usr/src/kernels/4.19.113-300.el7.x86_64/scripts
112K    /usr/src/kernels/4.19.113-300.el7.x86_64/security
996K    /usr/src/kernels/4.19.113-300.el7.x86_64/sound
5.0M    /usr/src/kernels/4.19.113-300.el7.x86_64/tools
12K     /usr/src/kernels/4.19.113-300.el7.x86_64/usr
16K     /usr/src/kernels/4.19.113-300.el7.x86_64/virt
78M     /usr/src/kernels/4.19.113-300.el7.x86_64/
[root@localhost linux-4.19.113]# 

獲取精確匹配系統(tǒng)的內(nèi)核源碼

已4.19.113-300為例,可以直接在google搜索4.19.113-300 src rpm,找一下相關(guān)鏈接,就可以找到對應(yīng)的內(nèi)核代碼的源碼包。centos內(nèi)核源碼包官方鏈接

更為驚喜的是,這個源碼包提供了編譯內(nèi)核rpm(如modules,core,headers,devel,kernel等)所需要的的spec文件。接下來就涉及到一些rpm和rpmbuild的知識,不過也都不難。

按照下文中的描述和步驟安裝源碼rpm,即可獲得源碼文件。

官方推薦不要以root用戶做以下操作,如果清楚這些操作具體都做了什么,已root用戶也沒有關(guān)系。安裝過程可能會有一些問題,根據(jù)錯誤提示信息,稍微查一下基本都能解決,大部分都是缺少相應(yīng)的工具包。

// 提前創(chuàng)建rpmbuild所需要的目錄
mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
// 安裝源碼rpm包,如果以root用戶安裝,rpm中的文件會被安裝到root目錄下,目前沒有發(fā)現(xiàn)有參數(shù)可以更換安裝目錄。
rpm -ivh kernel-4.19.113-300.el7.src.rpm
// 進(jìn)入spec文件所在的目錄,rpmbuild -bp,簡單說就是解壓源碼后打上patch。
cd /root/rpmbuild/SPECS
rpmbuild  -bp kernel.spec  
ls /root/rpmbuild/BUILD/kernel-4.19.el7/linux-4.19.113-300.el7.x86_64/

完成上訴步驟后,就可以在/root/rpmbuild/BUILD/kernel-4.19.el7/linux-4.19.113-300.el7.x86_64/目錄下看到完整的內(nèi)核源碼。

這里有個建議可以參考下,在編譯內(nèi)核源碼時,可以復(fù)用boot目錄下config配置和kernel-devel中的Makefile文件。執(zhí)行make前,執(zhí)行一下make menuconfig,如果是不同的內(nèi)核版本,該命令會自動處理一些錯誤的配置項

下面是執(zhí)行rpmbuild -bp命令的具體執(zhí)行過程。

orootlocalhost SPECS]# rpmbuild  -bp kernel.spec 
<string>:1: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives
<string>:1: DeprecationWarning: The distutils.sysconfig module is deprecated, use sysconfig instead
<string>:1: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives
<string>:1: DeprecationWarning: The distutils.sysconfig module is deprecated, use sysconfig instead
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.OKrrUK
+ umask 022
+ cd /root/rpmbuild/BUILD
+ patch_command='patch -p1 -F1 -s'
++ find /root/rpmbuild/BUILD -maxdepth 1 -type d -name 'kernel-4.*'
++ grep -x -v /root/rpmbuild/BUILD/kernel-4.19.el7
+ sharedirs=
+ :
+ '[' -d kernel-4.19.el7 ']'
+ cd kernel-4.19.el7
+ for i in 'linux-*'
+ '[' -d linux-4.19.113-300.el7.x86_64 ']'
+ rm -rf deleteme.x86_64
+ mv linux-4.19.113-300.el7.x86_64 deleteme-linux-4.19.113-300.el7.x86_64
+ for i in 'linux-*'
+ '[' -d linux-4.19.113-300.tgz ']'
+ cd ..
+ rm -rf deleteme-linux-4.19.113-300.el7.x86_64
+ '[' '!' -d kernel-4.19.el7/vanilla-4.19 ']'
+ cd kernel-4.19.el7
+ cp -al vanilla-4.19 linux-4.19.113-300.el7.x86_64
+ cd linux-4.19.113-300.el7.x86_64
+ '[' '!' -d .git ']'
+ git init
Initialized empty Git repository in /root/rpmbuild/BUILD/kernel-4.19.el7/linux-4.19.113-300.el7.x86_64/.git/
+ git config user.email noreply@centos.org
+ git config user.name 'AltArch Kernel'
+ git config gc.auto 0
+ git add .
+ git commit -a -q -m baseline
+ xzcat /root/rpmbuild/SOURCES/patch-4.19.113.xz
+ patch -p1 -F1 -s
+ git commit -a -m 'Stable update'
....
Applying: drivers: ata: ahci_sunxi: Increased SATA/AHCI DMA TX/RX FIFOs
+ chmod +x scripts/checkpatch.pl
+ chmod +x tools/objtool/sync-check.sh
+ mv COPYING COPYING-4.19.113
+ touch .scmversion
+ mkdir configs
+ cd configs
+ cp /root/rpmbuild/SOURCES/kernel-aarch64-debug.config /root/rpmbuild/SOURCES/kernel-aarch64.config /root/rpmbuild/SOURCES/kernel-armv7hl-debug.config /root/rpmbuild/SOURCES/kernel-armv7hl-lpae-debug.config /root/rpmbuild/SOURCES/kernel-armv7hl-lpae.config /root/rpmbuild/SOURCES/kernel-armv7hl.config /root/rpmbuild/SOURCES/kernel-i686-debug.config /root/rpmbuild/SOURCES/kernel-i686.config /root/rpmbuild/SOURCES/kernel-ppc64le-debug.config /root/rpmbuild/SOURCES/kernel-ppc64le.config /root/rpmbuild/SOURCES/kernel-s390x-debug.config /root/rpmbuild/SOURCES/kernel-s390x.config /root/rpmbuild/SOURCES/kernel-x86_64-debug.config /root/rpmbuild/SOURCES/kernel-x86_64.config .
+ cp /root/rpmbuild/SOURCES/kernel-local .
+ cp /root/rpmbuild/SOURCES/merge.pl .
+ cp /root/rpmbuild/SOURCES/generate_all_configs.sh .
+ cp /root/rpmbuild/SOURCES/generate_debug_configs.sh .
+ cp /root/rpmbuild/SOURCES/generate_bls_conf.sh .
+ VERSION=4.19.113
+ ./generate_all_configs.sh
+ for i in 'kernel-4.19.113-x86_64*.config'
+ mv kernel-4.19.113-x86_64-debug.config kernel-4.19.113-x86_64-debug.config.tmp
+ ./merge.pl /root/rpmbuild/SOURCES/kernel-local kernel-4.19.113-x86_64-debug.config.tmp
+ rm kernel-4.19.113-x86_64-debug.config.tmp
+ for i in 'kernel-4.19.113-x86_64*.config'
+ mv kernel-4.19.113-x86_64.config kernel-4.19.113-x86_64.config.tmp
+ ./merge.pl /root/rpmbuild/SOURCES/kernel-local kernel-4.19.113-x86_64.config.tmp
+ rm kernel-4.19.113-x86_64.config.tmp
+ cp /root/rpmbuild/SOURCES/process_configs.sh .
+ OPTS=
+ OPTS=' -n'
+ OPTS=' -n -c'
+ ./process_configs.sh -n -c kernel 4.19.113
~/rpmbuild/BUILD/kernel-4.19.el7/linux-4.19.113-300.el7.x86_64 ~/rpmbuild/BUILD/kernel-4.19.el7/linux-4.19.113-300.el7.x86_64/configs

參考文檔

https://wiki.centos.org/HowTos/I_need_the_Kernel_Source

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容