CentOS 7 內(nèi)核編譯
本文是參考CentOS官網(wǎng)說(shuō)明文件,詳細(xì)內(nèi)容請(qǐng)參考以下鏈接
https://wiki.centos.org/zh/HowTos/I_need_the_Kernel_Source 內(nèi)核源碼生成
https://wiki.centos.org/zh/HowTos/Custom_Kernel 內(nèi)核編譯
原理
內(nèi)核編譯需要正確版本的內(nèi)核源碼,以及正確的內(nèi)核選項(xiàng)。
- CentOS7的內(nèi)核源碼是通過(guò)rpm包生成的,如果需要內(nèi)核源碼來(lái)進(jìn)行編譯,直接安裝rpm是不行的,還得配置一下。
- 有了正確的內(nèi)核源碼后,需要通過(guò)正確生成內(nèi)核的.config文件,這樣才能正確編譯rpm包
- 對(duì)了,CentOS7是通過(guò)kernel*.rpm包來(lái)更新內(nèi)核的
生成可編譯的內(nèi)核源碼
- 需要安裝一些開(kāi)發(fā)庫(kù)
# yum install rpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-Embed pesign xmlto
# yum install audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel
# yum install ncurses-devel newt-devel numactl-devel pciutils-devel python-devel zlib-devel
- 切換用戶
后續(xù)操作,使用非root用戶進(jìn)行后續(xù)操作,切記
- 在用戶的home目錄下創(chuàng)建一些目錄,生成一些配置
$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
4.安裝源碼組件,kernel-xxxxxxxxx.src.rpm請(qǐng)?jiān)?http://vault.centos.org/7.N.YYMM/updates/Source/SPackages/
(請(qǐng)以相關(guān)的副版本編號(hào)、年度及月份取代 N.YYMM。)下載
$ rpm -i kernel-xxxxxxxxx.src.rpm 2>&1 | grep -v exist
- 解壓源碼并生成源碼
$ cd ~/rpmbuild/SPECS
$ rpmbuild -bp --target=$(uname -m) kernel.spec
- 現(xiàn)在內(nèi)核的源代碼目錄樹(shù)可以在 ~/rpmbuild/BUILD/kernel/linux/ 這個(gè)目錄內(nèi)找得到
編譯內(nèi)核
- 切換用戶
后續(xù)操作,使用非root用戶進(jìn)行后續(xù)操作,切記
- 生成內(nèi)核配置文件
進(jìn)到 ~/rpmbuild/BUILD/kernel-/linux-/ 目錄,然后選擇復(fù)制 configs/ 目錄內(nèi)的配置文件或 /boot/ 目錄內(nèi)的現(xiàn)有內(nèi)核配置文件,并命名為 .config。
這里選用了 /boot/目錄內(nèi)的配置,為了保持和現(xiàn)有的系統(tǒng)內(nèi)核一致
$ cd ~/rpmbuild/BUILD/kernel-*/linux-*/
$ cp /boot/config-`uname -r` .config
- 設(shè)置內(nèi)核
$ make oldconfig
$ make menuconfig 設(shè)置你所需要的選項(xiàng)
接著在.config文件的第一行加入uname -i的輸出,比如:x86_64,使文件第一行如下
# x86_64
注意 #號(hào)和文字之間有空格
修改完后更新config文件
$ cp .config configs/kernel-3.10.0-`uname -m`.config
$ cp configs/* ~/rpmbuild/SOURCES
- 更新spec文件,進(jìn)入rpmbuild/SPECS目錄,修改kernel.spec文件,替換如下行。
# % define buildid .local ----> %define buildid .xxxx
__注意__ 刪除#號(hào), %和define之間無(wú)空格,xxx自定義
5.編譯內(nèi)核
進(jìn)入~/rpmbuild/SPECS目錄
$ rpmbuild -bb --target=`uname -m` --without kabichk kernel.spec 2> build-err.log | tee build-out.log
漫長(zhǎng)的編譯后: ~/rpmbuild/RPMS/uname -m/ 目錄內(nèi)找到生成的rpm包們
安裝和啟動(dòng)
1.使用root賬戶: yum localinstall ~/rpmbuild/RPMS/uname -m/kernel*.rpm
- 重啟并加載新的內(nèi)核,大功告成