< 操做系統 CentOS6 - Linux內核編譯 詳細步驟 >

CentOS6-Linux內核編譯 詳細步驟

背景

Win10用VMwareWorkstation搭的虛擬機 CentOS6.5,內核版本2.6.32-431.el6.x86_64 在該環境下升級至4.9.195版本(版本隨便選的一個),而且編譯版本信息(版本信息裏面加上個人學號_姓名)html

肯定內核以及版本信息linux

[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]segmentfault

  • Development Tools" :是用於更新編譯環境,確保內核源碼編譯的時候擁有編譯時所需的一切工具windows

  • ncurses-devel:確保讓make config系列指令正確地執行centos

  • 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。app

cd /usr/src/kernels/
tar -zxvf ~/installer/linux/src/linux-4.9.195.tar.gz

配置源碼

  • 因爲個人上機任務是須要在源碼的版本信息中加入個人學號_姓名,則只須要用make menuconfig指令 —> 這個指令能讓你的源碼配置在可視化界面上操做。ide

  • make menuconfig指令與以前配置編譯環境時候的後三條語句息息相關,不然會報錯誤: Makefile:546: recipe for target 'menuconfig' failed 解決辦法見後文[3]工具

  • 看到menu菜單後,進入General setup;進入setup後,再找到 Local version - append to kernel release 表示在內核版本後面加上自定義的版本字符串(小於64字符),能夠用"uname -a/-r"命令看到oop

  • 回車後鍵入:_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」,因此個人電腦是單核。
  • 編譯時間通常而言將近一個小時,要注意待機的狀況下虛擬機貌似不會在後臺繼續編譯。

安裝源碼

  1. 安裝內核模塊
make modules_install
  1. 安裝完內核模塊後內核模塊的可執行文件就會出如今/lib/modules/文件夾下,進入該目錄下就能夠看到咱們安裝內核版本的文件夾
  2. 註冊啓動項
make install
  • 這個命令是將該內核註冊給引導程序,當開機啓動的時候,引導程序會調用註冊給它的內核來啓動系統,若是有多個內核,用戶能夠選擇從哪一個內核啓動
  • 運行到這一步,很容易出現報錯: ERROR: modinfo: could not find module XXX 解決方法和具體緣由見後文[4] 可是無論如何,該報錯並不會影響內核安裝,對於進行後續操做徹底沒有任何問題。
  1. 安裝完以後修改默認內核啓動項:打開/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進行操做作具體區別如此:[點擊此處]
  1. 重啓電腦便可查看新內核版本
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 * ]
  • 簡要來講有三種緣由:
    1. 確實是缺乏了某個module
    2. 新編譯的kernel已經將該選項編譯進kernel了
    3. 模塊的名稱變了
  • 大部分狀況是屬於第三種緣由。什麼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 ]

相關文章
相關標籤/搜索