首先查看當前內核版本,以便最後對照,我的當前系統爲ubuntu18.04,內核版本爲4.18.0
cat /proc/version
1、源碼下載
官網:https://www.kernel.org/pub/
Git:https://git.kernel.org/
ftp:http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/
推薦ftp,速度最快。
Git上三個版本:
mainline是主線版本,最新的
stable是穩定版
longterm是長期支持版
2、源碼配置和編譯
配置前安裝:
sudo apt update && sudo apt upgrade
sudo apt-get install git fakeroot build-essential ncurses-devxz-utils libssl-dev bc flex libelf-dev bison
解壓源代碼並進入
執行:
cp /boot/config-$(uname -r) .config
這是拷貝當前內核的配置文件,由於我們是更新當前ubuntu內核,使用此配置文件即可
接下來進行編譯配置
配置編譯推薦使用,簡單易用,界面清晰(由於更新的是ubuntu,內核本次文章不需要配置menuconfig,不需要配置交叉編譯環境)
(多種編譯配置的方式請參考文末拓展資料)
make menuconfig
此處可能會出現錯誤
Makefile:434: *** 隱含和普通規則混合:已棄用的語法
Makefile:1503: *** 隱含和普通規則混合:已棄用的語法
make: *** 沒有規則可製作目標“menuconfig”。停止。
問題原因及解決方法見下面FAQ
編譯(估計2-3個小時)
Make -j4
數字最大爲cpu物理核心數的兩倍,這樣編譯會快很多
編譯完成後安裝模塊
sudo make modules_install
安裝內核
sudo make install
3、配置grub引導
編輯grub配置文件
sudo vim /etc/default/grub
接下來分爲兩種情況討論,分爲開機進入grub引導選擇內核界面和開機自動進入新添加內核
1、若設置爲開機選擇內核
GRUB_TIMEOUT_STYLE=hidden屏蔽、GRUB_TIMEOUT=10。GRUB_TIMEOUT設置爲10或者大於0的數,此處爲開機引導界面停留時間
然後執行sudo update-grub即可重啓
2、若設置爲開機自動進入新內核
將原本的grub文件GRUB_DEFAULT=0屏蔽,添加GRUB_DEFAULT="1>2",其中1和2分別爲一級目錄和二級目錄中要選擇行數(從0開始計數)
查看內核版本:cat /proc/version
更新完成後內核版本爲4.4.92
FAQ:
錯誤:
Makefile:434: *** 隱含和普通規則混合:已棄用的語法
Makefile:1503: *** 隱含和普通規則混合:已棄用的語法
make: *** 沒有規則可製作目標“menuconfig”。停止。
原因:可能由於make對低版本makefile兼容性不好
解決:
修改Makefile文件
第一處:
修改前:
/ %/: prepare scripts FORCE
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
$(build)=$(build-dir)
修改後:
/: prepare scripts FORCE
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
$(build)=$(build-dir)
%/: prepare scripts FORCE
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
$(build)=$(build-dir)
第二處:
修改前:
config %config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
修改後:
config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
%config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
拓展資料(多種內核編譯配置方式(config))
make config:純文本界面
make menuconfig:基於文本的可視化彩色菜單及單選列面,推薦使用(ncurses-dev)
make nconfig:基於文本的可視化彩色菜單(libcdk5-dev)
make xconfig:Qt/Windows界面,需要安裝qt
make gconfig:Gtk/X-windows 界面。需要安裝GTK。
make oldconfig:純文本界面,但是其默認的問題是基於已有的本地配置文件。
make silentoldconfig:和oldconfig相似,但是不會顯示配置文件中已有的問題的回答。
make olddefconfig:和silentoldconfig相似,但有些問題已經以它們的默認值選擇。
make defconfig:這個選項將會創建一份以當前系統架構爲基礎的默認設置文件。
make ${PLATFORM} defconfig:創建一份使用arch/$ARCH/configs/${PLATFORM}defconfig中的值的配置文件。
make allyesconfig:這個選項將會創建一份儘可能多的問題回答都爲‘yes’的配置文件。
make allmodconfig:這個選項將會創建一份將儘可能多的內核部分配置爲模塊的配置文件。
注意(以下內容來源於外文翻譯):
內核代碼可以放進內核自身,也可以成爲一個模塊。例如,用戶可以將藍牙驅動作爲一個模塊加入(獨立於內核),或者直接放到內核裏,或者完全不加藍牙驅動。
當代碼放到內核本身時,內核將會請求更多的內存並且啓動會花費更長的時間。然而,內核會執行的更好。
如果代碼作爲模塊加入,代碼將會一直存在於硬盤上,需要時進行加載,接着模塊被加載到內存中。這可以減少內核內存的使用,並減少啓動的時間。但是,由於內核和模塊在內存上相互獨立所以會影響內核的性能。
另一種選擇是不添加藍牙代碼。舉例來說,內核開發人員假如知道系統永遠都不會使用藍牙設備,因此這個驅動就可以不加到內核中。這提升了內核的性能。然而,如果用戶之後需要藍牙設備,那麼他麼需要安裝藍牙模塊或者升級內核才行。