linux內核編譯

一:前言

1:內核的概念:

Kernel(內核)是操作系統的核心,掌控著所有硬件設備的控制權。計算機所要完成的各項工作,都需要通過內核的幫助才能完成。內核就是系統上的一個文件,這個文件包含了驅動主機各項硬件的檢測程序與驅動模塊。

2:什么叫做編譯?

如果想要完成的某個功能是內核沒有提供的,那我們就無法通過內核來控制計算機完成這項工作。如果我們想讓內核去完成這個功能,那就必須將這個模塊“添加”到內核中,這就類似于“驅動程序”,有了這樣一個“驅動程序的支持后,硬件(CPU、網卡等)”才能去完成之前不能完成的功能。這里的模塊“添加”的過程就叫做編譯。

3:內核模塊

內核模塊的存放位置為/lib/modules/$(uname -r)/kernel,所有以.ko結尾的文件都是模塊文件;其中uname -r為當前系統內核版本信息。

二:編譯前準備(以Centos6.9為例)

1:安裝開發包組
  # yun groupinstall Development tools`
2:下載內核源碼及解壓

下載地址https://www.kernel.org/

#cd /usr/src
# tar -xvf linux-3.18.56.tar.xz 
查看解壓出來的文件夾
3:準備配置文件
# cd /usr/src/   
# cp /boot/config-2.6.32-696.el6.x86_64  ./linux-3.18.56/
# grep NTFS ./linux-3.18.56/config-2.6.32-696.el6.x86_64 
顯示結果為# CONFIG_NTFS_FS is not set

注:從boot下拷貝一個config文件主要是為了方便,這個文件里保存的是之前在安裝系統時內核做安裝的模塊。這里拷貝過來主要是為了方便演示,具體應用中可以根據自己的需要進行模塊的篩選。至于grep NTFS 是為了讓大家看一下NTFS這個模塊沒有啟動,下面在編譯的時候我們就將NTFS啟用

三:編譯開始

1:執行make menuconfig命令(該命令在源碼目錄下執行)
第一步:先給以后的內核加個名稱

2:選擇需要啟動的內核模塊
在編譯的第一個界面一次選擇File systems -->DOS/FAT/NT file systems -->NTFS file systems support(利用空格鍵選中。[M] b表示將模塊打進ramdisk中,[*]表示將模塊打在內核中。本實驗將NTFS模塊打在ramdisk中)

選擇
修改為[M]和[*]

保存退出之后
grep NTFS .config顯示修改結果

3:開始進行編譯
注:如果編譯是在遠程連接上的話、make會出問題的、如果遠程連接斷開的話那運行的進程是不是也都斷開了、這個make的進程一定是當前系統上運行的子進程、有些一旦父進程掛了、子進程也將不復存在。
所以我們使用一個叫screen這個命令來操作,沒安裝自己安裝上就是了,可以在一個窗口上啟動n個虛擬的桌面,即使退出了也會保留之前的內容,切換進screen就可以看到窗口標題欄上的screen標志了:
具體使用方法如下:

<在源碼目錄下執行>


-screen -ls:可以查看當前啟用了多少個screen 按Ctrl+a,松開再按d可以隱藏screen桌面 因為編譯內核需要比較長的時間、所以我們在screen上編譯、然后再把screen桌面隱藏就可以了;
重新接入screen: # screen -r 跟上screenID就可以了 然后我們就開始編譯吧;


正在編譯

4:安裝模塊

  make modules_install

這步完了之后可以查看一下/lib/modules 目錄下就會生成一個以版本號命名的一個文件模塊了


5:安裝內核相關文件

  make install

這一步的主要目的是將所有的編譯之后的內容拷貝安裝到相應的目錄。安裝完之后會在/boot目錄下生成一個內核文件vmlinux-3.13.2,還有一個與當前編譯的版本一樣的文件,可以查看一下。現在已經編譯好了一個新內核了


6:編輯grub配置文件(一般會自動配置,查看一下)
#vim /boot/grub/grub.conf

好了、重啟一下試試,如果順利的話就可以進到內核選擇界面了,選項我們編譯的新內核就OK了

三:總結

1:步驟整理:

 1、獲取內核源碼,解壓至/usr/src
       # tar xf linux-3.13.5.tar.xz -C /usr/src
       # ln -sv /usr/src/linux-3.13.5  /usr/src/linux
   2、配置內核特性(選擇一種方法就可以了)
       make config:遍歷選擇所要編譯的內核特性
       make allyesconfig:配置所有可編譯的內核特性
       make allnoconfig:并不是所有的都不編譯
       make menuconfig:這種就是打開一個文件窗口選擇菜單
       make kconfig(KDE桌面環境下,并且安裝了qt開發環境)
       make gconfig(Gnome桌面環境,并且安裝gtk開發環境)
   3、編譯內核
       # make [-j #] : #號最多為CPU物理核心總數的兩倍,這樣會快點哦            
   4、安裝內核模塊
       # make modules_install
   5、安裝內核
       # make install
   6、驗正并測試
       # cat /boot/grub/grub.conf
       查看新內核是否已經添加, 而后重啟系統并測試

2、配置內核選項
支持“更新”模式進行配置: make help

(a) make config:基于命令行以遍歷的方式去配置內核中可配置的每個選項 
(b) make menuconfig:基于curses的文本窗口界面 
(c) make gconfig:基于GTK (GNOME)環境窗口界面 
(d) make xconfig:基于QT(KDE)環境的窗口界面 支持“全新配置”模式進行配置 
(a) make defconfig:基于內核為目標平臺提供的“默認”配置進行配置 
(b) make allyesconfig: 所有選項均回答為“yes“ 
(c) make allnoconfig: 所有選項均回答為"no“

3、編譯
全編譯:make [-j #]
編譯內核的一部分功能:
a) 只編譯某子目錄中的相關代碼:
# cd /usr/src/linux
# make dir/
(b) 只編譯一個特定的模塊:
# cd /usr/src/linux
# make dir/file.ko
例如:只為e1000編譯驅動:
#make drivers/net/ethernet/intel/e1000/e1000.ko

4、編譯內核
如何交叉編譯內核:
編譯的目標平臺與當前平臺不相同;
# make ARCH=arch_name
要獲取特定目標平臺的使用幫助
# make ARCH=arch_name help
# make ARCH=arm help

5、清理刪除
在已經執行過編譯操作的內核源碼樹做重新編譯:
需要事先清理操作:
# make clean:清理大多數編譯生成的文件,但會保留config文件等
# make mrproper: 清理所有編譯生成的文件、 config及某些備份文件
# make distclean: mrproper、 patches以及編輯器備份文件
6: 卸載內核
刪除/lib/modules/目錄下不需要的內核庫文件
刪除/usr/src/linux/目錄下不需要的內核源碼
刪除/boot目錄下啟動的內核和內核映像文件
更改grub的配置文件,刪除不需要的內核啟動列表

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 我們說的Linux其實指的就是 內核(kernel)而已。這個內核控制你主機的所有硬件并提供系統所有的功能,所以它...
    Zhang21閱讀 7,464評論 0 18
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,218評論 2 33
  • Ubuntu的發音 Ubuntu,源于非洲祖魯人和科薩人的語言,發作 oo-boon-too 的音。了解發音是有意...
    螢火蟲de夢閱讀 99,558評論 9 467
  • 準備工作: 準備好開發環境 獲取目標主機上硬件設備相關信息 獲取目標主機系統功能的相關信息 獲取內核源代碼www....
    扎啤閱讀 428評論 0 0
  • #你好,我叫白暖瑾。你失眠嗎?讓我來給你講個故事吧# 何事唱離歌,卻唱不響曾經的誓言。 “喂,你好。” “暖瑾啊。...
    蘇藎郃閱讀 241評論 0 7