CentOS6-Linux內核編譯 詳細步驟
背景
Win10用VMwareWorkstation搭的虛擬機
CentOS6.5,內核版本2.6.32-431.el6.x86_64
在該環境下升級至4.9.195版本(版本隨便選的一個),並且編譯版本信息(版本信息里面加上我的學號_姓名)
確定內核以及版本信息
[root@ymhadoop ~]# uname -r
2.6.32-431.el6.x86_64
[root@ymhadoop ~]# cat /etc/centos-release
CentOS release 6.5 (Final)
搭建編譯環境
#逐條運行命令
sudo yum groupinstall "Development Tools"
sudo yum install ncurses-devel
sudo yum install qt-devel
sudo yum install openssl-devel //后文全部默認在root權限下輸入命令(即省略sudo)
-
如果使用sudo命令報錯:
xxx is not in the sudoers file.This incident will be reported.
解決辦法見后文[1] -
Development Tools" :是用於更新編譯環境,確保內核源碼編譯的時候擁有編譯時所需的一切工具
-
ncurses-devel:確保讓make config系列指令正確地執行
-
qt-devel、openssl-devel同上
下載內核
- Linux內核的官方網址:https://www.kernel.org。這個網站只列出了所有的longterm版、最新的stable版、當前的mainline版。
- 我是從另外一個網址上下載的,存放了Linux內核的所有版本,十分方便:https://www.kernel.org/pub/linux/kernel。
下載的源碼包是:linux-4.9.195.tar.gz。 - 從windows移動文件到虛擬機中,有些文件可以直接從windows拖進虛擬機桌面上。一般選擇用SSH或者Winscp。源碼壓縮包直接放在桌面上就行。
解壓內核
CentOS6的源碼放在/urc/src/kernels/文件夾下,所以我也直接將壓縮包解壓至該路徑下,得到文件夾linux-4.9.195。
cd /usr/src/kernels/
tar -zxvf ~/installer/linux/src/linux-4.9.195.tar.gz
配置源碼
-
由於我的上機任務是需要在源碼的版本信息中加入我的學號_姓名,則只需要用make menuconfig指令 —> 這個指令能讓你的源碼配置在可視化界面上操作。
-
make menuconfig指令與之前配置編譯環境時候的后三條語句息息相關,否則會報錯誤:
Makefile:546: recipe for target 'menuconfig' failed
解決辦法見后文[3] -
看到menu菜單后,進入General setup;進入setup后,再找到 Local version - append to kernel release 表示在內核版本后面加上自定義的版本字符串(小於64字符),可以用"uname -a/-r"命令看到
-
回車后鍵入:_xxxxxxxx_ym
編譯源碼
- 進入源碼根目錄,即/usr/src/kernels/linux-4.9.195/,執行make編譯語句
cd /usr/src/kernels/linux-4.9.195/
make -j 4
- 4表示4線程編譯,據說編譯速度會稍快一點,結果編譯還是用了將近一個小時。
- make出現問題大部分原因可能是編譯器與內核版本不兼容,報錯:
make[1]: *** [scripts/kconfig/mconf.o] ERROR
解決方法見后文[2] - 如果是多核cpu,可以選擇多核編譯;使用
cat /proc/cpuinfo
查看cpu信息。
找到其中“processor : [數字]”表示對CPU的編號,這個編號從0開始,所以找到最后一個“processor : [數字]”,[數字]+1就是你的CPU數。我的機器最后一個CPU編號為“processor : 0”,所以我的電腦是單核。 - 編譯時間一般而言將近一個小時,要注意待機的情況下虛擬機貌似不會在后台繼續編譯。
安裝源碼
- 安裝內核模塊
make modules_install
- 安裝完內核模塊后內核模塊的可執行文件就會出現在/lib/modules/文件夾下,進入該目錄下就可以看到我們安裝內核版本的文件夾
- 注冊啟動項
make install
- 這個命令是將該內核注冊給引導程序,當開機啟動的時候,引導程序會調用注冊給它的內核來啟動系統,如果有多個內核,用戶可以選擇從哪個內核啟動
- 運行到這一步,很容易出現報錯:
ERROR: modinfo: could not find module XXX
解決方法和具體原因見后文[4]
但是不管如何,該報錯並不會影響內核安裝,對於進行后續操作完全沒有任何問題。
- 安裝完之后修改默認內核啟動項:打開/etc/grub.conf 查看系統內核的情況,修改grub引導順序,讓新安裝的內核作為默認內核。
- 從命令行查看文本出現的數字中可以看出存在兩個內核版本,
- 在 grub.conf 文件中決定開機使用哪個內核版本做啟動的參數是 default,默認為 0(代表從最新的內核啟動,代表的內核版本從上往下依次是 0,1, 2 等)
- 在這個例子中,如果要選擇從舊版內核即系統最開始的內核啟動,則把 default 值改為 0 ,然后重啟服務器從新的內核進行引導
vi /etc/grub.conf
#boot=/dev/sda
default=0 //此處需要將1修改成0;一般新安裝的內核在第一個位置,所以設置default=0。
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (3.10.58)
root (hd0,0)
......
- 此處需要注意:CentOS 7.0 系統更改內核啟動順序與CentOS 6.X 系統更改內核啟動順序的方式截然不同, CentOS 7 使用 grub2 作為引導程序,而CenOS6.x是修改 /etc/grub.conf 來修改啟動項。所以兩者修改進行內核啟動順序的步驟完全不一樣,CenOS7與6.x進行操作做具體區別如此:[點擊此處]
- 重啟電腦即可查看新內核版本
reboot //重啟命令
uname -r //查看內核版本信息
4.9.195_xxxxxxxxx_ym //顯示內核版本信息
可能遇到問題
1.xxx is not in the sudoers file.This incident will be reported.
sudo命令報錯是因為用普通用戶權限使用root級別命令
簡單解決就直接su命令切換到root用戶下進行原來操作即可,但是要把原命令中的sudo去掉
其他能夠允許普通用戶使用sudo命令的解決方法 [點擊這]
2.make[1]: *** [scripts/kconfig/mconf.o] 錯誤
make[1]: *** [scripts/kconfig/mconf.o] 錯誤 1
make: *** [menuconfig] 錯誤 2
一般是由於gcc和內核版本不兼容導致的。
3.Makefile:546: recipe for target 'menuconfig' failed
make[1]: *** [scripts/kconfig/mconf.o] Error 1
Makefile:546: recipe for target 'menuconfig' failed
make: *** [menuconfig] Error 2
該錯誤是因為make menuconfig需要安裝(Ubuntu)libssl-dev / (CentOS)openssl-devel
4.ERROR: modinfo: could not find module *
- 詳細可以看這篇文章[ERROR: modinfo: could not find module * ]。
- 簡要來說有三種原因:
- 確實是缺少了某個module
- 新編譯的kernel已經將該選項編譯進kernel了
- 模塊的名稱變了
- 大部分情況是屬於第三種原因。什么module報錯找不到,都可以用lsmod命令查找當前內核中該module的運行情況,可以通過find指令大致檢查出該module是改名了,還是在后續版本中沒再使用了
[root@ymhadoop ~]# lsmod | grep [module_name] //For example :lsmod | grep sco
[root@ymhadoop ~]# find /lib/ -name "*sco.ko"
參考資料
[ERROR: modinfo: could not find module * ]
[CentOS 6.x 內核升級(2.6.32 -> 3.10.58)過程記錄]
[Linux CentOS 修改內核引導順序]
[CentOS7編譯內核 詳細步驟]
[CentOS系統安裝libssl-dev時No package libssl-dev availab]
[CentOS 6.X 系統更改內核啟動順序]
[CentOS 7.3 手動編譯安裝最新版本Linux Kernel ]