Linux內核編譯過程詳解

前言

Linux內核是Linux操作系統的核心,也是整個Linux功能體現的核心,就如同發動機在汽車中的重要性。內核主要功能包括進程管理、內存管理、文件管理、設備管理、網絡管理等。Linux內核是單內核設計,但卻采用了微內核的模塊化設計,支持內核線程以及動態裝載內核模塊的能力。

Linux作為一個自由軟件,在廣大愛好者的支持下,內核版本不斷更新。新的內核修訂了舊內核的bug,并增加了許多新的特性。如果用戶想要使用這些新特性,或想根據自己的系統定制一個更高效,更穩定的內核,就需要手動編譯Linux內核。那么如何編譯內核呢?本文將講解Linux內核編譯的詳細程。

內核編譯之內核獲取

編譯內核的前提是需要有新內核的源碼包,獲取源碼包的渠道有很多,這里就不詳細介紹了,建議直接去官方網站(www.kernel.org)下載。我這里準備的是3.10.10版本的源碼包,盡量不要直接編譯最新版本的內核,可能會造成不兼容等問題。

1.jpg

內核編譯之解壓源碼包

編譯內核時,一般把源碼解壓到/usr/src目錄下,解壓完成后會在該目錄下生成一個與源碼包版本號一致的目錄,為了方便起見,我們可將它做一個鏈接,鏈接為linux目錄。

2.jpg

內核編譯之配置內核

編譯內核首先需要安裝開發環境(Development Tools和Server Platform Development),配置內核之前可以查看當前系統的設備信息,了解系統詳細配置。

查看CPU信息:
cat /proc/cpuinfo
x86info             #此工具需手動安裝
lscpu
查看PCI:
lspci               #可用選項-v查看詳細信息
查看USB:
lsusb               #可用選項-v查看詳細信息
查看塊設備:
lsblk

配置內核可選用多種方法

make config           #遍歷選擇編譯內核功能
make allyesconfig     #啟用內核全部功能
make allnoconfig      #內核功能選項全部為否
make menuconfig       #開啟文本菜單選項,對窗口有限制,盡量調大窗口,否則會出錯
                      #使用此命令需安裝gcc和ncurses-devel
make gconfig          #依賴GNome桌面環境及GNome的圖形開發環境,gtk2
make kconfig          #依賴KDE桌面環境及KDE的圖形開發環境,qt

內核功能選項

[*]                   #編譯進內核本體
[M]                   #編譯成內核模塊
[ ]                   #不選擇使用

使用make menuconfig開啟菜單選項,手動選擇內核功能

3.jpg    

4.jpg 

配置完成后,配置信息會存儲于名為.config的隱藏文件,如果想方便配置,可復制/boot/config文件覆蓋.config文件,直接修改即可。

5.jpg

內核編譯之編譯安裝

編譯時如果是遠程連接,一旦斷開連接,編譯就會出問題。所以我們可使用screen命令(需安裝),啟動多個窗口,即使連接中斷,編譯也不會終止。

screen                 #開啟窗口
Ctrl+A+D               #隱藏窗口
screen -ls             #查看運行的窗口
screen -r SCREEN_ID    #返回窗口

開始編譯

6.jpg

安裝模塊

7.jpg

安裝完成后在/lib/modules/目錄下會生成一個同內核版本好的目錄,目錄下便是新內核的模塊了

8.jpg

安裝內核

9.jpg

安裝完成后會在/boot目錄下生成幾個新內核的文件

10.jpg

查看grub.conf配置文件,會發現新內核的信息已經寫入了

11.jpg

以新內核啟動

12.jpg

查看新內核版本

13.jpg

補充:

如果前面多次編譯過,在編譯開始之前可進行清理

 make clean       #清理編譯的文件,但保留配置文件
 make mrproper    #移除所有編譯生成的文件、配置文件和備份文件
 make distclean   #完全清理

如果想快速編譯,可進行如下操作

make -j *         #*為cup核心數

如果想將編譯生成的文件保存至別處,可進行如下操作

mkdir /path/to/somewhere               #創建存放目錄
cd /path/to/somewhere                  #進入目錄
./configure --ksource=/usr/src/linux   #指定源目錄

如何只編譯內核的部分代碼

只編譯某子目錄中的相關代碼:
cd /usr/src/linux
make  path/to/dir/
只編譯部分模塊:
make M=path/to/dir
只編譯一個模塊:
make path/to/dir/MOD_NAME.ko
將編譯生成的文件保存至別處:
make O=/path/to/somewhere

The end

好了,內核編譯的過程就是這樣了,其中麻煩的地方除了需要消耗大量時間,也就是配置內核菜單了(英文傷不起…),想詳細了解每個項目的意思請自行查資料。

以上僅為個人總結,如有錯漏,大神勿噴~~~

原創文章,作者:書生,如若轉載,請注明出處:http://www.www58058.com/2063

(0)
書生書生
上一篇 2015-03-31 20:15
下一篇 2015-04-01 13:45

相關推薦

  • [轉]百萬級訪問網站前期的技術準備

       [轉]百萬級訪問網站前期的技術準備 開了自己域名的博客,第一篇就得來個重磅一點的才對得起這4美金的域名。作為一個技術從業者十年,逛了十年發現有些知識東一榔頭西一棒槌的得滿世界  看個遍才整理出個頭緒,那咱就系統點的從頭一步一步的說,一個從日幾千訪問的小小網站,到日訪問一兩百萬的小網站,怎么才能讓它平滑的度過這個階段,別在 …

    Linux干貨 2016-10-29
  • linux終端變量設置,文件系統,man使用說明,文件類型

    一、定義終端提示符的變量 export PS1=’\e[32m[\e[33m\u\e[31m@\e[35m\h\e[36m\t\e[34m\#\e[31m\s\e[37m\W\e[32m]\$ ‘  `]# export 是個命令      PS1指終端提示符變量    &n…

    Linux干貨 2013-06-16
  • puppet代碼分析

    這篇博客的目的是通過分析Forge上的Puppet模塊來加深一些概念的理解,同時了解一些常用用法。 今天的例子是jfryman-nginx模塊,它是原puppetlabs-nginx模塊的升級版本,依賴3個Puppet公共模塊:puppetlabs-apt,puppetlabs-stdlib和puppetlabs-concat。安裝非常方便,puppet m…

    2017-03-18
  • Linux之啟動和內核管理

     Linux之啟動和內核管理     本文主要包括以下內容一  CentOS 5和6的啟動流程二  服務管理三  Grub管理四  自制Linux五  啟動排錯六  編譯安裝內核   Linux組成Linux: kernel+rootfskernel: 進程管…

    Linux干貨 2016-09-15
  • shell腳本編程

    Shell腳本是包含一些命令或聲明,并符合一定格式的文本文件。 程序:指令+數據 程序編程風格 過程式  以指令為中心,數據服務于指令。 對象式  以數據為中心,指令服務于數據。 Shell程序:提供了編寫和能力,解釋執行。 編程邏輯處理方式:           順序執行   …

    Linux干貨 2016-08-15
  • linux的管道命令和用戶管理命令

    1、列出當前系統上的所有已經登錄的用戶的用戶名 [root@localhost home]# who | cut -d” ” -f1 | uniq root test root 2、取出最后登錄到當前系統的用戶相關信息 [root@localhost home]# who | tail -1 root pts/3 2017-07-16 19:38 (192.…

    Linux干貨 2017-07-17

評論列表(3條)

  • stanley
    stanley 2015-04-01 13:28

    不錯,內容充實,格式優美,能迅速吸引眼球并能勾起讀者繼續的欲望

    • 書生
      書生 2015-04-01 20:35

      @stanley大神辛苦 每篇都一一審核修改

  • 壞喵嗚
    壞喵嗚 2015-04-03 17:27

    意義不大。如果gcc不滿足要求怎么辦

欧美性久久久久