轉自html
yuzibo博客
linux
http://yuzibo.github.io/DebianBuildKernel.htmlgit
以前又一次編譯了好屢次。惋惜沒有一次成功的,說實話。藉助Debian強大的dpkg軟件包管理,使得又一次編譯內核只像安裝軟件同樣簡單,我都認爲這不是正宗的編譯內核,好了。廢話很少說,當即進入主題。github
我沒有使用最新的內核源碼。用的 3.2.64,咱們可以在http://www.lkml.org下載,注意這裏咱們下載的是.xz文件,需要解壓兩次。至於源碼放在哪裏,全然取決於你本身,你想放在哪裏就放在哪裏,我直接放在在用戶主文件夾都可以啊。app
xz -d linux-xx (xx就是你下載的內核源碼的版本號),這時生成.tar文件,而後ide
tar -xvf linux-xxui
sudo apt-get install kernel-package libncurses5-dev fakeroot build-essential bces5
這個怎麼說呢,在你沒有對內核配置選項有個清醒的認識以前。個人建議是使用你本機的默認配置吧,我以前配置失敗就是想弄清楚配置選項的每一個,結果備受挫折,先看看編譯內核是什麼樣的,之後咱們再說這些也不錯啊。code
cd linux-XXhtm
先進入文件夾。咱們如使用默認配置的話,
"cp /boot/config-uname -r
.config",假設咱們本身必定要配置,我建議使用make menuconfig
make-kpkg clean,略微等一會,咱們接着使用fakeroot make-kpkg --append-to-version=.141111 linux-image命令
咱們有必要講講make-kpkg與fakeroot這兩個軟件包,前者是可以本身主動替換make dep;make clean;make bzImage;make modules命令序列的腳本,而--append-to-version就是讓咱們來指定一個額外的內核版本號。這個版本號是成爲內核名的一部分,咱們可以使用數字,「+」,「,」,但是不能使用「_」,在這裏的使用方法我借鑑網上同窗的樣例,使用當天日期來解決不一樣的版本號號問題。內核模塊位於/lib/modules子文件夾下。每一個內核都有它本身的子文件夾,因此每次咱們建立新內核時使用新的內核名字,這個包安裝程序就會在/lib/modules文件夾下建立一個新的子文件夾來保存它本身的模塊。
注意。--resion僅僅會影響Debian軟件包自己的名字而不是內核的名字,Debian kernel-image文件的名字格式例如如下:
kernel-image-(kernel-version)(--append-to-version)(--version)(architecture).deb.至於什麼是fakeroot這一點我也不是很是清楚。好像是模擬root環境來建立一個kernel-image軟件包。
通過漫長的等待後。咱們在代碼文件夾的上一層文件夾就獲得一個linux-image-3.2.64.141111_3.2.64.141111-10.00.Custom_i386.deb的軟件包。別急,咱們另外一步工做需要無缺。如下是廢話,可以忽略。
咱們有一個問題是boot過程當中mount根文件系統的「先有雞仍是先有蛋的問題」,通常來講。根文件在形形色色的存儲設備上。不一樣的設備又要不一樣的硬件廠商的驅動,比方intel的ide/sata驅動,VIA的南橋需要VIA的ide/sata驅動,根文件系統也不一樣的文件系統的可能,假如把所有的驅動/模塊都編譯進內核。那天然沒問題。可現實(內核的精神或本質)是咱們把驅動/模塊都駐留在根文件系統自己/lib/modules/xxx,那麼「雞蛋」問題就就來了。要mount根文件系統卻需要根文件系統上的文件系統,怎麼辦?因而,就想出瞭如下的ramdisk,內核老是能安裝ramdisk的(因爲ramdisk暫時文件和內核同樣,也是由bootloader經過低級讀寫命令(uboot用nand read。而不用經過系統層提供的高級讀寫接口)載入進內存,所以內核可以掛載ramdisk文件系統),而後把所有要使用到的驅動/模塊都放在ramdisk上,首先,讓內核將ramdisk看成根文件來安裝,而後再利用這個根文件系統上的驅動來真正安裝根文件系統,就將這個問詳細攻克了。
補充。有時間你可以到/boot文件文件夾下看看。會有一個initrd.img的文件,initrd大致上就是 包括根文件系統的ramdisk。說了這麼多,重點尚未解決,也就是咱們需要建立這麼一個文件-initrd。將咱們新編譯的內核在根文件系統掛載前能裝進內存。那麼,咱們該怎麼樣解決問題呢?首先,使用vi編輯/boot/config-3.2.64.141111文件。將代碼CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"__這句話凝視掉(在句首用#),不然咱們就不會成功。
接下來運行
mkinitramfs -o /boot/initrd.img-3.2.64.141111 3.2.64.141111
直觀上咱們可以理解生成目標文件initrd.img-3.2.64.141111,咱們作的所有工做你最後在/boot文件夾下會發現的。
grub-update
趕快從新啓動吧,你就會發現在grub的引導菜單上有本身版本號的內核了。
首先感謝我女朋友春春的理解和支持,有她在背後,我感受很是幸福;這篇文章我重點參考了The blog