自定義配置編譯linux內核

1 編譯linux內核緣由
通常狀況下,咱們是不須要從新去編譯linux內核的,但若是你發現你須要修改內核的某個部分或者說你須要的某個模塊並無編譯進內核,那裏你能夠經過從新編譯內核來知足你的需求,好比當咱們須要用bcache時,但默認bcache是沒有編譯進內核的,咱們能夠經過修改編譯配置文件,將bcache編譯進內核,如下的編譯操做均是在Centos7.3平臺上進行的演示。java

2 編譯前準備工做
2.1 編譯用戶身份選擇
官方是強調編譯linux內核是強烈不建議以root身份來進行編譯的,由於這樣有可能在編譯過程當中改掉當前編譯系統的重要配置而影響當前系統,而應該建議使用普通用戶的身份來編譯內核,這樣該普通用戶若是在編譯過程當中要修改系統重要的配置文件也會由於沒有權限而報錯。python

2.2 構建編譯所需環境
(1)rpm編譯目錄建立linux

[user@host]$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
[user@host]$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros

 

(2)編譯所需的一些依賴包安裝centos

[root@host]# yum install rpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-Embed pesign xmlto -y
[root@host]# yum install audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel java-devel -y
[root@host]# yum install ncurses-devel newt-devel numactl-devel pciutils-devel python-devel zlib-devel -y
[root@host]# yum install make gcc bc openssl-devel -y
[root@host]#
yum groupinstall "Development Tools" -y

 

3 獲取源碼並進行編譯性能

這裏分兩種,一種是獲取src.rpm源文件來從新編譯成rpm,一種是獲取源碼文件來編譯成rpm。
3.1 獲取src.rpm源碼文件來編譯ui

3.1.1 獲取並安裝源碼
獲取內核RPM源碼包spa

[user@host]$ wget http://vault.centos.org/7.3.1611/updates/Source/SPackages/kernel-3.10.0-514.26.2.el7.src.rpm


安裝源碼包:debug

[user@host]$ rpm -i kernel-3.10.0-514.26.2.el7.src.rpm 2>&1 | grep -v exist

 

解壓並釋放出源文件code

[user@host]$ cd ~/rpmbuild/SPECS
[user@host SPECS]$ rpmbuild -bp --target=$(uname -m) kernel.spec

 

3.1.2 修改編譯配置文件
(1)拷貝源碼文件到rpm編譯目錄:xml

[user@host] $ cp ~/rpmbuild/BUILD/kernel-3.10.0-514.26.2.el7/linux-3.10.0-514.26.2.el7.x86_64/configs/* ~/rpmbuild/SOURCES/

 

(2)改變工做目錄:

[user@host]$ cd ~/rpmbuild/BUILD/kernel-3.10.0-514.26.2.el7/linux-3.10.0-514.26.2.el7.x86_64/

 

(3)拷貝內核的默認配置文件到當前工做目錄:

[user@host]$ cp configs/kernel-3.10.0-`uname -m`.config .config

 

(4)執行make oldconfig命令生成默認內核配置

[user@host]$ make oldconfig

 

(5)執行make menuconfig命令自定義編譯模塊

[user@host]$ make menuconfig


此時會彈出窗口,以下圖所示:

左側的[]裏面有三種可能的值:
[*]表示將編譯進內核;
[M]表示之內核模塊的形式編譯進行內核,這種形式能夠用modprobe xxx命令進行加載;
[]表示不對該模塊進行編譯
好比我本身的需求是須要將bcache模塊之內核模塊的形式編譯進行內核中,則個人選擇是:
Device Drivers -> Multiple devices driver support -> Block device as cache
找到Block device as cache這個選項,將其[]值改成[M],以下圖所示:

選擇完後進行save保存,其會生成到.config配置文件中,接着退出。

(6)編輯.config文件並拷貝到編譯配置文件目錄中
若是你的平臺是x86_64平臺則,在.config文件的第一行加上
# x86_64
是其它的則加上其它的,可使用uname -m命令查看你的平臺:

[user@host ~]$ uname -m
x86_64


拷貝.config文件到編譯配置文件目錄中:

[user@host]$ cp .config configs/kernel-3.10.0-`uname -m`.config
[user@host]$ cp configs/* ~/rpmbuild/SOURCES/

 

3.1.3 使用rpmbuild命令進行編譯

[user@host]$ cd ~/rpmbuild/SPECS
[user@host SPECS]$ rpmbuild -bb --target=`uname -m` kernel.spec 2> build-err.log | tee build-out.log


還能夠在編譯項里加上一些編譯選項:
--with baseonly
--without up
--without debug
--without debuginfo
--without fips
--without kabichk
好比,編譯基礎的則通常加上這些選項:
--with baseonly --without debug --without debuginfo --without kabichk
最後可使用以下命令編譯內核:

[user@host]$ rpmbuild -bb --target=`uname -m` kernel.spec --with baseonly --without debug --without debuginfo --without kabichk 2> build-err.log | tee build-out.log

 

編譯完成後即可以在 ~/rpmbuild/RPMS/`uname -m`/ 目錄下看到編譯生成的內核rpm包了

 

3.2 獲取源碼文件來編譯

3.2.1 獲取源碼文件

去linux kernel官網獲取源碼,官網地址:https://www.kernel.org

我這裏是下載4.14.95版本的內核源碼來編譯:

[user@host ~]# wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.14.95.tar.xz

 解壓源碼文件:

[user@host ~]# tar xvf linux-4.14.95.tar.xz

解壓完成後進入linux-4.14.95目錄:

[user@host ~]# cd linux-4.14.95

 

3.2.2 配置.config文件

(可選)將當前系統的配置做爲模板拷貝到當前目錄命名爲.config:

[user@host linux-4.14.95]# cp -v /boot/config-3.10.0-514.el7.x86_64 .config

若是提示權限不夠,則可以使用root用戶來拷貝到那個目錄:

[root@host ~]# cp -u user -v /boot/config-3.10.0-514.el7.x86_64 /home/lhx/.config

執行make menuconfig來選擇模塊,選擇方式如3.1.2所述

 

3.2.3 編譯rpm

[user@host linux-4.14.95]$ make rpm

注意點:這裏有個疑問,我用4.19.12版本執行make rpm的時候會報以下錯:

[user@host linux-4.19.12]$ make rpm
make: *** 沒有規則能夠建立目標「rpm」。 中止。

有些博客說執行make rpm-pkg,但這個編譯完後生成的rpm很是大,有500多M,這個疑問還需解決。

 

4 內核編譯註意點
編譯時間通常比較長,可能1小時到幾小時不等,看你的機器性能,但有一點是要注意的,就是存儲空間要夠,我以前用10G都不夠,最好預留20G的空間給內核編譯,不然編譯過程當中會報錯,報錯時用df命令看下空間是否佔滿了來排除下是不是這個錯誤。

 

成後便

相關文章
相關標籤/搜索