Ubuntu/Fedora 编译内核教程
生活随笔
收集整理的這篇文章主要介紹了
Ubuntu/Fedora 编译内核教程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大部分發行版安裝就自帶1個linux內核, 是不需要用戶自己編譯的.
???????? 那么編譯1個內核到底有什么好處呢, 其實好處無非有兩點:
???????? 1. 精簡內核
???????? 通用發行版的內核特點就是兼容性好, 這里的兼容性是只硬件兼容性啦, 也就是說通用的內核集成了很多種硬件的驅動和功能,而其實絕大部分的硬件驅動和部分功能(如raid支持,偏門的文件系統格式支持)是一般家用機用不上的。
???????? 而自己編譯內核能在選項里去除這些多余的選項, 只挑選當前機器適用的硬件驅動, 往往能得到1個更精簡的內核,理論上是比1個臃腫的內核更加穩定和快速的。
???????? 再講,對于任何軟件來講。理論上用當前機器自己編譯出來的會比用其他環境機器編譯出來的性能要高一點點。
???????? 2.添加新硬件支持
???????? 往往一些舊版本通用的內核對一些新硬件支持不足, 例如ubuntu 10.10就沒有很多無限網卡的驅動, 這時可以下載1個新內核的源代碼, 把該無線網卡的驅動選項選上,編譯出來的新內核就支持這個新的無線網卡了。
???????? 下面就詳細介紹下兩大發行版的編譯內核步驟。
一, 準備內核編譯工具。
? ? ? ?? 包括gcc make 和 執行make menuconfig 所需的工具。 ????????
???????? Ubuntu:
????????????????? sudo? apt-get install build-essential kernel-package? ?libncurses5-dev
???????? Fedora:
????????????????? sudo yum install ncurses-devel -y gcc* gcc-c++ *aclocal
二, 下載內核源代碼
? ? ? ?? 所有版本的內核源代碼都能在官方網站https://www.kernel.org/pub/linux/kernel/v3.x/ 里下載得到。
???????? 個人不建議下載最新版本的內核, 而是下載你當前發行版源里的最新內核, 例如我當前用的是mint 13 Maya(基于ubuntu 12.04) , 源里的內核是3.2.38 , 而我一開始就下載 3.8.2 版本內核源碼來編譯。 結果編譯不出version.h 文件導致后來的閉源顯卡驅動安裝失敗.
???????? 后來選擇3.2.38的源代碼,編譯安裝就很順利了。
???????? 下載源代碼包后,在任意1個目錄上解壓, 注意雖然源代碼很小, 但是解壓后足足500多MB, 編譯時生成的鏈接文件后高達800多MB, 注意硬盤空間就ok。
????????? 我一般放在~/Compile/kernel/ 下解壓。
?
????????? 例如我下載的源代碼包是: linux-3.8.1.tar.bz2
??????????
????????? 解壓出來的是1個文件夾 ~/Compile/kernel/linux-3.8.1/
????
????????? 至于具體的解壓命令我就不寫出來了, 如果你不會解壓tar包的話我想你也沒必要去編譯內核的。
三, 卸載顯卡驅動。
????????? 一般來講, 每次更新內核后顯卡驅動都要重裝,否則不能進入新內核的圖形界面, 通常新手編譯內核很少會一次就編譯出滿意的新內核,所以我建議編譯內核之前先把顯卡驅動卸載了,方便重啟測試新內核。
????????? 如果你當前使用intel 集成顯卡, 則不需要執行之個動作,因為intel顯卡的開源驅動已經很好地集成在通用發行版上面了。無須卸載而且你也無法卸載。
????????? 如果你使用ATI/AMD 顯卡, 則進入/usr/share/ati 目錄執行卸載腳本。
????????? sudo sh /usr/share/ati/amd-uninstall.sh
????????? 我自mx200后未用過N卡, N卡的卸載方法請自行google~
四,清理編譯環境的垃圾。
?????????? 所謂垃圾就是上一次編譯產生的中間文件, 我說過幾次了,一般新手總要編譯幾次內核的。如果你是第一次解壓源代碼包編譯,就不需要執行這一步, 首先進入解壓出來的源代碼目錄,然后執行下面命令
??????????
???????? Ubuntu:
????????????????? make-kpkg clean
???????? Fedora:
????????????????? make mrproper
五,編輯編譯選項。
????????? 注意如果你真的是有心去優化自己的內核的話,這個是1個很費時間的過程。
????????? 在內核源代碼目錄上執行:
????????? make menuconfig
????????? 里面有很多選項, 具體信息可以參考我的另一些blog文章:
????????? http://nvd11.blog.163.com/blog/static/20001831220127259426804/
????????? 有幾個容易出錯的地方,請參考這里:
????????? http://nvd11.blog.163.com/blog/static/20001831220132109939100/
????????? 無非注意幾個原則:
????????? 1. 首先你要明白你的顯卡,聲卡,cpu, 網卡(有線or無線) 的型號信息, 起碼要知道芯片的型號。 因為這些驅動都必須在內核配置里手動制定的。 具體信息可以用 lspci 或者 lsusb 或者 dmesg 命令來查看。
????????? 2. 選上必要的選項和驅動, 什么是必要的選項, 例如你當前用的文件系統格式支持, 如果你用無線網卡就要啟動wireless支持等。? 驅動就更不用說了, 如果你用的是創新的核心顯卡, 就必須選上創新的聲卡驅動, 但是獨顯驅動不用執著, 那是在編譯內核后另外安裝的。
????????? 3. 移除一切多余的選項和驅動, 例如raid支持, 這年代家用電腦投資raid的效果遠不如投資在ssd固態硬盤上。 又比如 非x86平臺支持這個選項, 只會令你的內核無謂的增大。? 驅動就更加了, 內核選項里可能有100個品牌的網卡驅動, 而實際上你只需要選中你當前使用的那1個, 其余99個就移除掉吧。
六,保存配置文件。
?????????????
?????? 當你編輯完所有選項時記得,在主界面選最后1個選項保存你的配置, 輸入1個文件名就ok了,? 例如我一般保存為 kc.config.
?????? 這樣當你第二次編譯時, 先make menuconfig 進入配置, 然后選倒數第二項導入之前保存的配置文件, 就可以方便地修改了,建議每一次修改都保存1個不同的文件名。
?????? 保存完就可以退出了。 配置文件會保存到當前源代碼目錄下。
?
七,激活配置文件
?????? 實際上,編譯的時候,系統是會檢索".config" 最這個文件作為配置文件的, 每次執行清理的時候會把這個文件清楚, 所以再編譯前要把你保存的配置文件命名為.config
?????? 假如我最新保存的配置文件是kc.config 則執行:
?????? cp kc.config .config
八,指定編譯進程數量
?????? 這一步的作用是充分利用你的多核心cpu, 一般來講你的cpu有多少個核心(雙核4線程可以當作4核心)就設幾個編譯線程數量。
?????? Fedora不需執行這個動作, 在編譯命令時加1個參數就ok了, 后面會提到。
?????? Ubuntu:?????? ????????????????? export CONCURRENCY_LEVEL=5
?????? 個人建議做成1個profile, 每次重啟編譯內核前執行1次。
九,執行編譯。
??? Ubuntu:
??? ? ? ? ? ? ? time fakeroot make-kpkg --initrd --append-to-version=amd336 kernel-image kernel-headers
???
?????????????? #注意紅色部分是你自定義的版本號.. 隨便起一個,不能有大些
?? Fedora:
?????????????? time make make all -j4
????????
?????????????? #紅色部分是制定4個線程編譯的意思。如國雙核cpu就設為2吧
???
?? 其中time 是順便計時的命令。
?? 很多人都說編譯內核是1個漫長的過程, 不過根據我的實際數據, 普通的4核cpu(真的很普通的Q6600) 編譯一次其實也只需要5分鐘多點。
?????
十,安裝內核
?????? Ubuntu:
??????????????? 內核編譯完成后,會自動在源代碼目錄的上一級目錄生成兩個deb包, 其中1個是內核和模塊的包, 另個是頭文件的包(安裝閉源顯卡驅動的前提), 所以需要退到上一級目錄。執行:
??????????????? sudo dpkg -i linux-imagexxxxx.deb
??????????????? 這個動作會自動幫你更新grub配置, 內核就安裝了, 頭文件的包無必要現在安裝,先測試內核包無問題再安裝都未遲。
????
????? Fedora:????
????????????? fedora 編譯完后并不生成安裝包, 但是實際上內核文件和模塊和頭文件都編譯出來了。只需要在當前源代碼目錄下執行:
????????????? sudo make modules_install?? #這一步是安裝模塊
?????????????
????????????? sudo make install????????? #安裝內核和頭文件
????????????? fedor執行安裝命令完后系統也會自動幫你更新grub配置。
????????????? 那么內核和模塊被安裝在哪里呢? 實際上內核是被安裝在/boot 里, 而模塊是被放到/lib/modules/<對應版本folder>/ 下
????????????? 所以執行ls -lh /boot 能查看你編譯出來的新內核, 如下圖 我自己編譯的新內核足比fedora 18自帶的小25%哦:
? ? ? ? ? ? ??
????????????
十一, 重啟測試新內核
???????? 內核安裝就可以重啟了, 重啟后會見到grub菜單多了1個你編譯的內核選項,? 選上他啟動就可以測試了
???????? 那么測試什么呢, 最主要測試兩大部分:
???????? 1. 測試你機器的所有硬件設備是否運作正常, 著重測試聲卡,網卡,攝像頭.. 當然了,前提是啟動成功啊, 很多人由于關鍵內核選項沒選上導致啟動失敗的。
???????? 2.查看開機日志, 看看啟動失敗的服務。
十二, 怎樣卸載你自己編譯的內核
??????? 當你發現自己編譯的內核有問題時, 則只能重啟用舊內核啟動,卸載你自己編譯的內核并重新編譯, 那么如何卸載內核呢。
??????? 首先你要確保你當前是在舊內核啟動的環境下, 可以用uname -r 來檢查,否則請重啟。
??????? Ubuntu:
??????????????? ubuntu是用包來安裝內核的, 所以只需要用apt-get 命令來卸載自編譯內核就ok了。
??????????????? 忘了新內核的包名字?
??????????????? 可以用如下命令來查找:
??????????????? dpkg --get-selections | grep linux?
??????????????? 下面命令下載內核
?????????????? sudo? apt-get remove linux-imagexxxx? #這個動作會同時幫你把grub里的信息移除
???????????????
?????????????? 如果你也安裝了頭文件的包, 請務必把header的包也卸載。
??????? Fedora:
??????????????? fedora 自編譯并不是用包管理器安裝的, 所以要手動刪除內核和模塊,并更新gurb設置,當然個人建議寫成1個腳本,用root來執行就ok啦, 腳本參照下面:
???????????????? rm -rf /lib/modules/3.8.1v2/??? #刪除模塊
???????????????? ls /boot/*v2* | xargs rm?????????? #刪除內核? 注意有3個文件,注意關鍵字 這一步要小心
???????????????? rm -rf /boot/grub2/grub.cfg??? #刪除grub配置
???????????????? grub2-mkconfig -o /boot/grub2/grub.cfg?? #重新生成grub配置
???????
??????????????? 好了卸載完新內核, 就可以從本文的第四步重新開始啦,直到編譯出滿意的內核為止。
???????? 那么編譯1個內核到底有什么好處呢, 其實好處無非有兩點:
???????? 1. 精簡內核
???????? 通用發行版的內核特點就是兼容性好, 這里的兼容性是只硬件兼容性啦, 也就是說通用的內核集成了很多種硬件的驅動和功能,而其實絕大部分的硬件驅動和部分功能(如raid支持,偏門的文件系統格式支持)是一般家用機用不上的。
???????? 而自己編譯內核能在選項里去除這些多余的選項, 只挑選當前機器適用的硬件驅動, 往往能得到1個更精簡的內核,理論上是比1個臃腫的內核更加穩定和快速的。
???????? 再講,對于任何軟件來講。理論上用當前機器自己編譯出來的會比用其他環境機器編譯出來的性能要高一點點。
???????? 2.添加新硬件支持
???????? 往往一些舊版本通用的內核對一些新硬件支持不足, 例如ubuntu 10.10就沒有很多無限網卡的驅動, 這時可以下載1個新內核的源代碼, 把該無線網卡的驅動選項選上,編譯出來的新內核就支持這個新的無線網卡了。
???????? 下面就詳細介紹下兩大發行版的編譯內核步驟。
一, 準備內核編譯工具。
? ? ? ?? 包括gcc make 和 執行make menuconfig 所需的工具。 ????????
???????? Ubuntu:
????????????????? sudo? apt-get install build-essential kernel-package? ?libncurses5-dev
???????? Fedora:
????????????????? sudo yum install ncurses-devel -y gcc* gcc-c++ *aclocal
二, 下載內核源代碼
? ? ? ?? 所有版本的內核源代碼都能在官方網站https://www.kernel.org/pub/linux/kernel/v3.x/ 里下載得到。
???????? 個人不建議下載最新版本的內核, 而是下載你當前發行版源里的最新內核, 例如我當前用的是mint 13 Maya(基于ubuntu 12.04) , 源里的內核是3.2.38 , 而我一開始就下載 3.8.2 版本內核源碼來編譯。 結果編譯不出version.h 文件導致后來的閉源顯卡驅動安裝失敗.
???????? 后來選擇3.2.38的源代碼,編譯安裝就很順利了。
???????? 下載源代碼包后,在任意1個目錄上解壓, 注意雖然源代碼很小, 但是解壓后足足500多MB, 編譯時生成的鏈接文件后高達800多MB, 注意硬盤空間就ok。
????????? 我一般放在~/Compile/kernel/ 下解壓。
?
????????? 例如我下載的源代碼包是: linux-3.8.1.tar.bz2
??????????
????????? 解壓出來的是1個文件夾 ~/Compile/kernel/linux-3.8.1/
????
????????? 至于具體的解壓命令我就不寫出來了, 如果你不會解壓tar包的話我想你也沒必要去編譯內核的。
三, 卸載顯卡驅動。
????????? 一般來講, 每次更新內核后顯卡驅動都要重裝,否則不能進入新內核的圖形界面, 通常新手編譯內核很少會一次就編譯出滿意的新內核,所以我建議編譯內核之前先把顯卡驅動卸載了,方便重啟測試新內核。
????????? 如果你當前使用intel 集成顯卡, 則不需要執行之個動作,因為intel顯卡的開源驅動已經很好地集成在通用發行版上面了。無須卸載而且你也無法卸載。
????????? 如果你使用ATI/AMD 顯卡, 則進入/usr/share/ati 目錄執行卸載腳本。
????????? sudo sh /usr/share/ati/amd-uninstall.sh
????????? 我自mx200后未用過N卡, N卡的卸載方法請自行google~
四,清理編譯環境的垃圾。
?????????? 所謂垃圾就是上一次編譯產生的中間文件, 我說過幾次了,一般新手總要編譯幾次內核的。如果你是第一次解壓源代碼包編譯,就不需要執行這一步, 首先進入解壓出來的源代碼目錄,然后執行下面命令
??????????
???????? Ubuntu:
????????????????? make-kpkg clean
???????? Fedora:
????????????????? make mrproper
五,編輯編譯選項。
????????? 注意如果你真的是有心去優化自己的內核的話,這個是1個很費時間的過程。
????????? 在內核源代碼目錄上執行:
????????? make menuconfig
????????? 里面有很多選項, 具體信息可以參考我的另一些blog文章:
????????? http://nvd11.blog.163.com/blog/static/20001831220127259426804/
????????? 有幾個容易出錯的地方,請參考這里:
????????? http://nvd11.blog.163.com/blog/static/20001831220132109939100/
????????? 無非注意幾個原則:
????????? 1. 首先你要明白你的顯卡,聲卡,cpu, 網卡(有線or無線) 的型號信息, 起碼要知道芯片的型號。 因為這些驅動都必須在內核配置里手動制定的。 具體信息可以用 lspci 或者 lsusb 或者 dmesg 命令來查看。
????????? 2. 選上必要的選項和驅動, 什么是必要的選項, 例如你當前用的文件系統格式支持, 如果你用無線網卡就要啟動wireless支持等。? 驅動就更不用說了, 如果你用的是創新的核心顯卡, 就必須選上創新的聲卡驅動, 但是獨顯驅動不用執著, 那是在編譯內核后另外安裝的。
????????? 3. 移除一切多余的選項和驅動, 例如raid支持, 這年代家用電腦投資raid的效果遠不如投資在ssd固態硬盤上。 又比如 非x86平臺支持這個選項, 只會令你的內核無謂的增大。? 驅動就更加了, 內核選項里可能有100個品牌的網卡驅動, 而實際上你只需要選中你當前使用的那1個, 其余99個就移除掉吧。
六,保存配置文件。
?????????????
?????? 當你編輯完所有選項時記得,在主界面選最后1個選項保存你的配置, 輸入1個文件名就ok了,? 例如我一般保存為 kc.config.
?????? 這樣當你第二次編譯時, 先make menuconfig 進入配置, 然后選倒數第二項導入之前保存的配置文件, 就可以方便地修改了,建議每一次修改都保存1個不同的文件名。
?????? 保存完就可以退出了。 配置文件會保存到當前源代碼目錄下。
?
七,激活配置文件
?????? 實際上,編譯的時候,系統是會檢索".config" 最這個文件作為配置文件的, 每次執行清理的時候會把這個文件清楚, 所以再編譯前要把你保存的配置文件命名為.config
?????? 假如我最新保存的配置文件是kc.config 則執行:
?????? cp kc.config .config
八,指定編譯進程數量
?????? 這一步的作用是充分利用你的多核心cpu, 一般來講你的cpu有多少個核心(雙核4線程可以當作4核心)就設幾個編譯線程數量。
?????? Fedora不需執行這個動作, 在編譯命令時加1個參數就ok了, 后面會提到。
?????? Ubuntu:?????? ????????????????? export CONCURRENCY_LEVEL=5
?????? 個人建議做成1個profile, 每次重啟編譯內核前執行1次。
九,執行編譯。
??? Ubuntu:
??? ? ? ? ? ? ? time fakeroot make-kpkg --initrd --append-to-version=amd336 kernel-image kernel-headers
???
?????????????? #注意紅色部分是你自定義的版本號.. 隨便起一個,不能有大些
?? Fedora:
?????????????? time make make all -j4
????????
?????????????? #紅色部分是制定4個線程編譯的意思。如國雙核cpu就設為2吧
???
?? 其中time 是順便計時的命令。
?? 很多人都說編譯內核是1個漫長的過程, 不過根據我的實際數據, 普通的4核cpu(真的很普通的Q6600) 編譯一次其實也只需要5分鐘多點。
?????
十,安裝內核
?????? Ubuntu:
??????????????? 內核編譯完成后,會自動在源代碼目錄的上一級目錄生成兩個deb包, 其中1個是內核和模塊的包, 另個是頭文件的包(安裝閉源顯卡驅動的前提), 所以需要退到上一級目錄。執行:
??????????????? sudo dpkg -i linux-imagexxxxx.deb
??????????????? 這個動作會自動幫你更新grub配置, 內核就安裝了, 頭文件的包無必要現在安裝,先測試內核包無問題再安裝都未遲。
????
????? Fedora:????
????????????? fedora 編譯完后并不生成安裝包, 但是實際上內核文件和模塊和頭文件都編譯出來了。只需要在當前源代碼目錄下執行:
????????????? sudo make modules_install?? #這一步是安裝模塊
?????????????
????????????? sudo make install????????? #安裝內核和頭文件
????????????? fedor執行安裝命令完后系統也會自動幫你更新grub配置。
????????????? 那么內核和模塊被安裝在哪里呢? 實際上內核是被安裝在/boot 里, 而模塊是被放到/lib/modules/<對應版本folder>/ 下
????????????? 所以執行ls -lh /boot 能查看你編譯出來的新內核, 如下圖 我自己編譯的新內核足比fedora 18自帶的小25%哦:
? ? ? ? ? ? ??
????????????
十一, 重啟測試新內核
???????? 內核安裝就可以重啟了, 重啟后會見到grub菜單多了1個你編譯的內核選項,? 選上他啟動就可以測試了
???????? 那么測試什么呢, 最主要測試兩大部分:
???????? 1. 測試你機器的所有硬件設備是否運作正常, 著重測試聲卡,網卡,攝像頭.. 當然了,前提是啟動成功啊, 很多人由于關鍵內核選項沒選上導致啟動失敗的。
???????? 2.查看開機日志, 看看啟動失敗的服務。
十二, 怎樣卸載你自己編譯的內核
??????? 當你發現自己編譯的內核有問題時, 則只能重啟用舊內核啟動,卸載你自己編譯的內核并重新編譯, 那么如何卸載內核呢。
??????? 首先你要確保你當前是在舊內核啟動的環境下, 可以用uname -r 來檢查,否則請重啟。
??????? Ubuntu:
??????????????? ubuntu是用包來安裝內核的, 所以只需要用apt-get 命令來卸載自編譯內核就ok了。
??????????????? 忘了新內核的包名字?
??????????????? 可以用如下命令來查找:
??????????????? dpkg --get-selections | grep linux?
??????????????? 下面命令下載內核
?????????????? sudo? apt-get remove linux-imagexxxx? #這個動作會同時幫你把grub里的信息移除
???????????????
?????????????? 如果你也安裝了頭文件的包, 請務必把header的包也卸載。
??????? Fedora:
??????????????? fedora 自編譯并不是用包管理器安裝的, 所以要手動刪除內核和模塊,并更新gurb設置,當然個人建議寫成1個腳本,用root來執行就ok啦, 腳本參照下面:
???????????????? rm -rf /lib/modules/3.8.1v2/??? #刪除模塊
???????????????? ls /boot/*v2* | xargs rm?????????? #刪除內核? 注意有3個文件,注意關鍵字 這一步要小心
???????????????? rm -rf /boot/grub2/grub.cfg??? #刪除grub配置
???????????????? grub2-mkconfig -o /boot/grub2/grub.cfg?? #重新生成grub配置
???????
??????????????? 好了卸載完新內核, 就可以從本文的第四步重新開始啦,直到編譯出滿意的內核為止。
總結
以上是生活随笔為你收集整理的Ubuntu/Fedora 编译内核教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重装windows后 用live cd修
- 下一篇: Ubuntu 安装 Docker