實驗內容:在系統中下載統一發行版本的版本號較高的內核,編譯之后運行自己編譯的內核,并使用uname-r命令查看是否運行成功。
實驗步驟:
1.查看實驗環境和內核版本
圖1 實驗環境
VMware中虛擬機Ubuntu(24.04)、內存8G、CPU(8核)、磁盤128G(下載Ubuntu虛擬機的時候一定要注意分配足夠的磁盤空間,建議100G)。
圖2 查看內核版本
初始內核版本是6.11.0。
為了提升下載速度,換源:
我打算換清華源,從清華大學開源軟件鏡像站得知:從 Ubuntu 24.04 開始,Ubuntu 的軟件源配置文件變更為 DEB822 格式,路徑為 /etc/apt/sources.list.d/ubuntu.sources
換源思路:將系統自帶的對應文件做個備份,然后根據格式的選擇做網頁中(ubuntu | 鏡像站使用幫助 | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror)對應的內容替換,即可使用選擇的軟件源鏡像。
圖3 查看Ubuntu版本
執行了lsb_release -a 命令,獲取到系統信息:這是 Ubuntu 24.04.2 LTS 版本 ,代號為noble 。接下來換清華源,步驟如下:
備份源文件:
圖4 備份源文件
執行sudo cp /etc/apt/sources.list.d/ubuntu.sources備份當前軟件源配置文件。這樣就能正確找到源文件并將其備份到用戶主目錄下,文件名是ubuntu.sources.bak 。
圖5 Ubuntu上沒有安裝vim
圖5告訴我們Ubuntu上還沒有vim,并且提供了安裝不同版本vim的命令。
Vim是從vi發展出來的一個文本編輯器,最初的簡稱是Vi IMitation,隨著功能的不斷增加,正式名稱改成了Vi IMproved。
下載vim:
圖6 更新apt
在終端執行sudo apt update,因為軟件包列表可能不是最新的,會導致找不到對應軟件包。
圖7 安裝vim-gtk3
在Ubuntu軟件包搜索中,與vim-gtk匹配的軟件包是vim-gtk3,在終端執行 sudo apt-get install vim-gtk3 -y。什么是gtk3?因為這是vim安裝的圖形化界面。
Vim還需要進行配置,這不是本實驗的內容,參考博客:基于 Ubuntu 系統的 Vim 全面配置(持續更新)_ubuntu vim-CSDN博客。(已配置vim到自動補全符號)。之后安裝了VMware Tools。
前面已完成了備份,接下來要換清華源:
獲取清華源配置:
訪問清華大學開源軟件鏡像站(https://mirrors.tuna.tsinghua.edu.cn/ ),找到 Ubuntu 鏡像使用幫助,獲取適用于 Ubuntu 24.04(代號noble )的清華源配置內容 。
圖8 原有內容
在終端執行sudo vim /etc/apt/sources.list.d/ubuntu.sources ,刪除原有內容,粘貼清華源配置(在上文給出的鏈接里面就有清華源配置內容)后按ESC退出插入模式,進入正常模式,輸入:wq按回車鍵保存退出。
執行sudo apt update ,更新軟件包索引,之后即可基于清華源進行軟件安裝、升級等操作 。
進入Linux 內核的官網,下載最新版本,或者其它版本的內核代碼。在Linux系統中,只需要在命令行輸入如下命令就可以下載Linux內核壓縮包了。
2.下載內核
圖9 執行“wget 下載鏈接”
3.解壓
下載后在終端輸入sudo tar-xvflinux-6.13.1.tar.xz解壓縮。
圖10 解壓完成
之后要將解壓的文件移動到/usr/src路徑下。
圖11 將解壓縮文件移動到/usr/src中
也可以直接執行tar xf linux-6.13.1.tar.xz -C /usr/src,這樣完成了解壓并且放置到/usr/src路徑下。
4.安裝編譯工具和依賴的軟件包
接下來安裝編譯工具以及其它依賴的軟件包,執行sudo apt-get install build-essential libncurces-dev bison flex libssl-dev zstd、sudo apt-get install libelf-dev。
(a)
(b)
圖12安裝編譯工具以及依賴的軟件包
按下Y接著執行即可。
5.配置內核
???? 在編譯內核之前,對內核源代碼進行配置。配置的目的主要是確定哪些模塊會編譯到內核當中。執行sudo make menuconfig進行配置。
圖13 進入配置界面
對每個配置選項可通過點擊<Select>來選擇:
<*>或[*]:將該功能編譯進內核;
[]:不將該功能編譯進內核;
[M]:將該功能編譯成可以在需要時動態
插入內核的模塊。
圖14 進行配置
???? 如圖所示,將Compile also drivers which will not load和Compile the kernel with warnings as errors設置成將該功能編譯進內核。進行保存后退出。(也可以不配置這兩項內容,保持默認配置,Save--->ok--->Exit--->Exit)。
必做配置:
進入kernel hacking,然后修改warn for stack frames larger than 的數值,將其修改為4096(最好不要大過這個數值)。這一步驟的圖在下文圖21。
圖15 查看.config文件屬性
在 Linux 系統中使用ll(等同于 ls -l )命令查看.config文件屬性的結果。
接下來要對.config文件進行配置:
執行sudo vim .config打開當前目錄下的 .config 文件,配置如下兩項內容。
CONFIG_SYSTEM_TRUSTED_KEYS=””
CONFIG_SYSTEM_REVOCATION_KEYS=””
圖16 vim 中打開 .config 文件
圖17 配置.config文件前
如圖17所示,在 vim 命令模式下(進入 vim 后默認是命令模式,如果不是,按 Esc 鍵進入 ),輸入 /CONFIG_SYSTEM_TRUSTED_KEYS ,然后按回車鍵。vim 會自動定位到首次出現該配置項的位置 。如果位置不對,可按 n 鍵查找下一個匹配項。找到之后,按i鍵進入插入模式,刪除雙引號內的內容(如果有 ),使其變為 CONFIG_SYSTEM_TRUSTED_KEYS="" 。同理,找到 CONFIG_SYSTEM_REVOCATION_KEYS 所在行,按i鍵進入插入模式,刪除雙引號內的內容(如果有 ),設置為 CONFIG_SYSTEM_REVOCATION_KEYS="" 。
按 Esc 鍵回到命令模式,然后輸入 :wq 并回車,保存修改并退出 vim 。
6.編譯內核
前情提要:因為沒安裝libelf-dev以及配置內核(warn for stack frames larger than 的數值)發生了報錯(上文已經告訴讀者進行了操作,如果前面操作過了應該不會出現報錯),如果在前面沒有安裝libelf-dev以及配置內核,為了避免報錯,請在編譯內核前請執行sudo apt-get install libelf-dev、執行sudo make menuconfig進行配置(具體操作界面見圖21)。
利用make命令開始編譯內核。使用 -j 選項來多線程處理,可以更有效的利用CPU資源。參數是并發數量,通常可以是CPU的2倍。如圖18所示,使用sudo make -j$(nproc)。sudo make -j$(nproc) 是在 Linux 系統中用于并行編譯內核或其他軟件項目的命令。
圖18 編譯內核
?(a)
(b)
(c)
(d)
(e)
圖19 編譯內核過程中出現錯誤
從報錯信息 “fatal error: libelf.h: 沒有那個文件或目錄” 和 “fatal error: gelf.h: 沒有那個文件或目錄” 可知,是缺少相關開發庫文件導致編譯失敗 。libelf 庫用于處理 ELF(可執行與可鏈接格式)文件,編譯內核時部分工具和模塊依賴它。
可通過以下命令安裝 libelf 開發庫來解決:sudo apt-get install libelf-dev。安裝完成后,重新執行 sudo make -j$(nproc) 命令繼續編譯內核 。
圖20 再次報錯
??? 在編譯內核模塊驅動時,如果出現如上報錯信息,主要是因為內核中設置了堆棧報警大小,其默認為1024bytes。將其修改為4096既可以消除告警信息。
解決方法:
(1)make menuconfig
(2)kernel hacking
(3)修改warn for stack frames larger than 的數值,將其修改為4096(最好不要大過這個數值)
(4)重新編譯內核模塊則不會出現如上的告警信息。
圖21 解決報錯
圖22 編譯成功
7.編譯和安裝模塊
接下來是編譯和安裝模塊。執行make modules_install。
圖23 執行make modules_install之后
8.安裝內核
注意,該步驟出現了警告,圖25下方給出了解決辦法,請先閱讀完這部分再進行操作。
將編譯好的內核文件復制到/boot目錄下,并更新GRUB配置:
圖24 出現警告
出現的 Warning: os-prober will not be executed... 警告,是因為 GRUB_DISABLE_OS_PROBER 可能被設置,導致 os-prober 工具不被執行,無法檢測其他可引導分區并添加到 GRUB 配置中。
圖25 解決警告
解決警告的過程:使用文本編輯器vim,打開/etc/default/grub文件,命令為sudo vim /etc/default/grub。在文件中找到GRUB_DISABLE_OS_PROBER這一行。如果該行被注釋(行首有#),去掉注釋符號#,并確保其值為false。保存并關閉/etc/default/grub文件后,在終端執行sudo update-grub命令。該命令會重新生成 GRUB 配置文件,應用剛才的修改。執行后,os-prober工具將被允許執行,掃描其他可引導分區并添加到 GRUB 配置中,相應警告也會消失。
圖26 重新生成grub文件
此時警告提示變為os-prober will be executed...
,說明配置修改生效,os-prober
工具已能正常執行去檢測其他可引導分區,這是預期的正確狀態。可查看/boot/grub/grub.cfg
文件(使用sudo cat /boot/grub/grub.cfg
查看內容),確認新內核及其他相關啟動項是否正確添加。
接下來要對/etc/default/grub文件進行配置。
圖27 打開/etc/default/grub文件
圖28 進行配置前
圖29 進行配置后
圖30 更新grub
實驗結果
執行reboot重啟系統。
圖31 重啟系統界面
圖32?檢查新內核
執行uname -r查看內核版本。結果是6.13.1,說明成功。
關于報錯的總結
①編譯內核時出現 “fatal error: libelf.h: 沒有那個文件或目錄” 和 “fatal error: gelf.h: 沒有那個文件或目錄” 的錯誤,這是因為缺少相關開發庫文件。通過執行sudo apt-get install libelf-dev命令安裝libelf開發庫,解決了該問題,使編譯能夠繼續進行。
②在編譯內核模塊驅動時,出現 “the frame size of 1152 bytes is larger than 1024 bytes” 的錯誤。這是由于內核中設置的堆棧報警大小默認為 1024bytes。通過make menuconfig進入內核配置界面,找到 “Kernel hacking” -> “Compile - time checks and compiler options”,將 “Warn for stack frames larger than” 的數值修改為 4096,重新編譯內核模塊后,消除了警告信息。
③安裝內核時出現 “Warning: os - prober will not be executed...” 的警告,這是因為GRUB_DISABLE_OS_PROBER可能被設置,導致os - prober工具不被執行,無法檢測其他可引導分區并添加到 GRUB 配置中。使用sudo vim /etc/default/grub打開文件,找到GRUB_DISABLE_OS_PROBER這一行,去掉注釋符號#并確保其值為false,保存并關閉文件后執行sudo update - grub命令,重新生成 GRUB 配置文件,解決了該警告問題。
如果對你有幫助的話,請為我點個贊吧?