為什么要編譯Linux內核?


 

 

新的內核修訂了舊內核的bug,並增加了許多新的特性。如果用戶想要使用這些新特性,或想根據自己的系統度身定制一個更高效,更穩定的內核,就需要重新編譯Linux內核。
通常,更新的內核會支持更多的硬件,具備更好的進程管理能力,運行速度更快、 更穩定,並且一般會修復老版本中發現的許多漏洞等,經常性地選擇升級更新的系統內核是Linux使用者的必要操作內容。
為了正確的合理地設置內核編譯配置選項,從而只編譯系統需要的功能的代碼,一般主要有下面四個考慮:
(1)自己定制編譯的內核運行更快(具有更少的代碼)
(2)系統將擁有更多的內存(內核部分將不會被交換到虛擬內存中)
(3)不需要的功能編譯進入內核可能會增加被系統攻擊者利用的漏洞
(4) 將某種功能編譯為模塊方式會比編譯到內核內的方式速度要慢一些

 

這類編譯的目的主要是通過編譯來了解Linux內核編譯的過程,熟悉內核的工作原理,甚至還可以嘗試進行一些修改。
編譯只是將源碼編譯成程序,不會替換當前的系統,也不會影響當前系統的運行。

編譯內核可能是出於某種需求,比如對內核大小有要求,去掉內核中某些用不到的部分,這種場景往往是嵌入式系統。
或者自己修改了某部分內核代碼,需要編譯后驗證功能。
模塊編譯時將某些功能模塊編譯成 .ko 可以在不重新編譯內核的情況下,insmod xxx.ko 到系統中使用編寫的代碼功能。
編譯內核后不會替換當前內核,編譯后的新內核往往在類似下面的目錄下,名字大都是 bzImage
/usr/src/kernels/3.xx.x-.x86_64/arch/x86/boot/
然后可以編輯系統的 grub list 添加最新的內核來用它

新內核集成了新驅動,比如Intel核顯:    /lib/modules/`uname -r`/kernel/drivers/gpu/drm/i915/i915.ko
 
一個系統可以安裝多個內核,比如啟動文件,新內核不會覆蓋舊內核: 
/boot/vmlinuz-VERSION
/boot/initrd.img-VERSION
安裝新內核過程中,一些內核模塊需要重新編譯,比如VirtualBox:
/lib/modules/`uname -r`/updates/dkms/vboxdrv.ko
如果新內核運行不正常,可以在開機GRUB引導里選擇舊內核啟動。
也可以這樣改回原來使用的內核:
ln -sf /boot/vmlinuz-VERSION /vmlinuz
ln -sf /boot/initrd.img-VERSION /initrd.img
 其中VERSION是原來內核的版本。

 

 三、常見問題

1、rebooot無法進入系統

  提示Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0),大多是menu.lst沒設置好。

解決:

  重啟系統,選擇沒修改過的內核版本(如Ubuntu 6.06自帶的2.6.15)進入系統,檢查menu.lst文件(可以再update-grub下)
2、高版本內核無法編譯低版本內核

  編譯工具太新了,建議用適當的發行版編譯內核。同理,如果低版本無法編譯高版本,則需考慮是否應該升級相應工具。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM