整個Linux內(nèi)核編譯的過程非常簡單,但是內(nèi)核編譯需要花費很長的時間。因為Linux內(nèi)核的代碼非常多。當(dāng)然,如果你的計算機性能強勁,時間會短很多。當(dāng)你準備好性能強勁的計算機后,讓小編帶你一步一步的編譯Linux內(nèi)核。
一、下載源代碼
1、登錄官網(wǎng)
進入Linux 內(nèi)核的官網(wǎng),下載最新版本,或者其它版本的內(nèi)核代碼。這里是源代碼的壓縮包。
在kernel.org上你能看到幾種類型的內(nèi)核存在:
- mainline
最新版本的linux內(nèi)核,發(fā)布新版本后會打開一個合并窗口,接受下一版本要做出的合并,窗口關(guān)閉后,就會發(fā)布新的rc(即release candidate,發(fā)布候選)版內(nèi)核
- stable
這是一個主要針對過去發(fā)布的內(nèi)核進行bug修復(fù)的樹,它更加的穩(wěn)定
- linux-next
為發(fā)布將來的版本而累積新代碼并進行測試的源碼樹
- longterm
Long Term Support,長期維護的意思
2. 命令行下載
在官網(wǎng)上查看內(nèi)核tarball鏈接地址,在一個Linux操作系統(tǒng)中,使用wget命令行下載內(nèi)核tarball代碼。
在下載的過程中可以看到下載進度,下載完成后信息大致如下所示。
Linux內(nèi)核壓縮包如下:
[root@localhost~]# ls -l | grep linux-6.3.tar.xz
-rw-r--r-- 1 root root 136891752 Apr 24 12:59 linux-6.3.tar.xz
二、解壓源代碼
壓縮包下載完成后,可以通過tar命令解壓。
tar -xvf linux-6.3.tar.xz
在解壓的時候可以看到文件列表,內(nèi)容較多,需要解壓一會兒。
三、安裝需要的軟件包
安裝全套必備工具。下面步驟 全部在管理員狀態(tài)下進行 。
yum install ncurses-devel gcc make rpmdevtools openssl-devel bison flex rpm-build rpm-devel rpmlint python3 coreutils diffutils patch
四、配置內(nèi)核代碼
在編譯內(nèi)核之前,我們可以對內(nèi)核源代碼進行配置。配置的目的主要是確定哪些模塊會編譯到內(nèi)核當(dāng)中。
step 1) 進入源代碼目錄
cd linux-6.3/
step 2) 拷貝當(dāng)前主機系統(tǒng)內(nèi)核使用的config文件
從當(dāng)前機器的啟動目錄拷貝config文件到內(nèi)核源代碼目錄。目標是使編譯內(nèi)核的config采用與當(dāng)前環(huán)境一致的配置。這個文件保存了在安裝系統(tǒng)時內(nèi)核所安裝的模塊配置信息,否則需要重新手動指定每一個模塊的編譯配置。
cp -v /boot/config-$(uname -r) .config
或者
make oldconfig
make oldconfig
命令的作用是檢查已有的.config文件和Kconfig文件的規(guī)則是否一致,如果一致,就什么都不做,否則提示用戶哪些源代碼中有的選項在.config文件沒有。一般情況下一直執(zhí)行回車即可。
執(zhí)行后,內(nèi)核源碼目錄下會生成.config文件
[root@localhost linux-6.3]# ls -al | grep -w "config"
-rw-r--r-- 1 root root 232033 May 6 13:39 .config
.config
中保存的就是內(nèi)核編譯的相關(guān)設(shè)置。它的內(nèi)容大致是這樣的:
# General setup
#
CONFIG_INIT_ENV_ARG_LIMIT=32
# CONFIG_COMPILE_TEST is not set
# CONFIG_WERROR is not set
CONFIG_LOCALVERSION="_20230506"
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_BUILD_SALT=""
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_BZIP2=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_HAVE_KERNEL_LZO=y
CONFIG_HAVE_KERNEL_LZ4=y
CONFIG_HAVE_KERNEL_ZSTD=y
CONFIG_KERNEL_GZIP=y
注 :以
#
開頭的行就是注釋行,這些CONFIG_*
就是設(shè)置項,這些設(shè)置項與Linux內(nèi)核的各功能相對應(yīng),它的值有三種分別表示編譯時的三種操作:
- CONFIG_*=y
表示該項目所對應(yīng)的功能會被靜態(tài)地添加到內(nèi)核中
- CONFIG_*=m
表示該項目對應(yīng)的功能會被編譯成模塊,在內(nèi)核需要時再加載入內(nèi)核
- CONFIG_* is not set
表示不編譯該項目對應(yīng)的功能
注意:由于內(nèi)核間功能的相互依賴十分復(fù)雜,因此不要嘗試手工編輯
.config
文件,否則可能出現(xiàn)編譯失敗,或者編譯后內(nèi)核無法執(zhí)行的情況!
step 3) 啟動配置界面(可選)
make menuconfig
該命令會運行一些腳本,然后打開一個配置界面
step 4) 打開配置界面(依賴上一步操作)。
可以看出里面包含所有的內(nèi)核組件,包括文件系統(tǒng),網(wǎng)絡(luò),IO棧,虛擬化和設(shè)備驅(qū)動等等。
可以通過該圖形界面對內(nèi)核加載的模塊編譯選項進行調(diào)整,如修改編譯后的內(nèi)核名稱、新添加之前系統(tǒng)缺少的模塊等。
如果你不熟悉,可以不做任何修改。
step 5) 確認config文件中Local version功能是否配置成功
vi .config
打開.config文件,搜索CONFIG_LOCALVERSION,發(fā)現(xiàn)已含有剛剛修改的版本附加信息。
五、編譯內(nèi)核
1、編譯內(nèi)核
使用如下命令編譯內(nèi)核
make -j $(nproc --all)
nproc命令來自英文詞組“number of processing units available”的縮寫,其功能是用于顯示當(dāng)前進程可用的CPU數(shù)量。--all 表示顯示所有擁有的CPU數(shù)量
參考示例:
顯示當(dāng)前進程可用的CPU數(shù)量:
[root@localhost linux-6.3]# nproc
72
顯示所有CPU數(shù)量:
[root@localhost linux-6.3]# nproc --all
80
輸出結(jié)果很多,截取部分如下:
編譯前內(nèi)核源碼內(nèi)容如下:
編譯后內(nèi)核源碼內(nèi)容如下:
2、安裝模塊
將模塊安裝到指定的路徑。使用如下命令安裝內(nèi)核模塊
make modules_install
默認安裝的路徑(/lib/modules/kernel-version/)
make modules_install #kernel-version是所編譯的內(nèi)核的版本
指定安裝路徑
make modules_install INSTALL_MOD_PATH=~/rootfs #指定到開發(fā)板的文件系統(tǒng)中或者打包放到文件系統(tǒng)中。
執(zhí)行過程如下:
[root@localhost linux-6.3]# make modules_install
INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/events/amd/power.ko
SIGN /lib/modules/6.3.0_20230506/kernel/arch/x86/events/amd/power.ko
INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/events/intel/intel-uncore.ko
SIGN /lib/modules/6.3.0_20230506/kernel/arch/x86/events/intel/intel-uncore.ko
INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/events/intel/intel-cstate.ko
SIGN /lib/modules/6.3.0_20230506/kernel/arch/x86/events/intel/intel-cstate.ko
INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/events/rapl.ko
SIGN /lib/modules/6.3.0_20230506/kernel/arch/x86/events/rapl.ko
INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/kernel/cpu/mce/mce-inject.ko
SIGN /lib/modules/6.3.0_20230506/kernel/arch/x86/kernel/cpu/mce/mce-inject.ko
INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/twofish-x86_64.ko
SIGN /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/twofish-x86_64.ko
INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/twofish-x86_64-3way.ko
SIGN /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/twofish-x86_64-3way.ko
INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/twofish-avx-x86_64.ko
SIGN /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/twofish-avx-x86_64.ko
INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/serpent-sse2-x86_64.ko
SIGN /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/serpent-sse2-x86_64.ko
INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/serpent-avx-x86_64.ko
SIGN /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/serpent-avx-x86_64.ko
INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/serpent-avx2.ko
SIGN /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/serpent-avx2.ko
...
INSTALL /lib/modules/6.3.0_20230506/kernel/net/vmw_vsock/vmw_vsock_virtio_transport.ko
SIGN /lib/modules/6.3.0_20230506/kernel/net/vmw_vsock/vmw_vsock_virtio_transport.ko
INSTALL /lib/modules/6.3.0_20230506/kernel/net/vmw_vsock/vmw_vsock_virtio_transport_common.ko
SIGN /lib/modules/6.3.0_20230506/kernel/net/vmw_vsock/vmw_vsock_virtio_transport_common.ko
INSTALL /lib/modules/6.3.0_20230506/kernel/net/vmw_vsock/hv_sock.ko
SIGN /lib/modules/6.3.0_20230506/kernel/net/vmw_vsock/hv_sock.ko
INSTALL /lib/modules/6.3.0_20230506/kernel/net/vmw_vsock/vsock_loopback.ko
SIGN /lib/modules/6.3.0_20230506/kernel/net/vmw_vsock/vsock_loopback.ko
INSTALL /lib/modules/6.3.0_20230506/kernel