一:下載核心源碼的方法:
1、ubuntu 下下載核心源碼:apt-get install linux-source
尋找核心源碼包:apt-cache search kernel-source,之後安裝對應的源碼包,也可直接執行apt-get install linux-source
在此種情況下下載的核心源碼可能與當前使用的核心版本不同(我的ubuntu核心為2.6.35-22,而下載下來的核心為2.6.35.11)。
2、下載特定版本的Linux核心,可以參考:http://forum.ubuntu.org.cn/viewtopic.php?t=134404 Linux編譯核心詳解
例:$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.35.2.tar.bz2
二、編譯源碼
安裝完核心源碼後,進入/usr/src/後解壓,解壓完成後:
1、make menuconfig:配置核心
2、make:編譯核心
3、make modules_install :將編譯得到的核心模組複製到/lib/modules/<kernel-version>/目錄下;
4、安裝核心:make install
(啟動設定檔grub.cfg是/boot/grub/grub.cfg(fedora是在menu.lst檔案中))
三、make install
此時只是把壓縮的核心鏡像vmlinuz拷貝到了/boot下,還沒有產生initrd.img,如果此時在grub.cfg檔案中增加新編譯的核心鏡像的話(將其他核心版本的img作為此核心的img),開機後會出現:Could not load /lib/modules/.../modules.dep
到這裡本來已經絕望了,感覺浪費了這麼久的時間竟然失敗啊!在網上找著了,有人提供了一個方案,就是使用initramfs-tools產生initrd.img,命令如下:update-initramfs -c -k 2.6.35.2之後會利用lib/modules下的檔案產生initrd.img-2.6.35.2(位置在boot檔案夾下),修改grub.cfg的img的路徑。重新啟動選擇2.6.35.2,啟動成功!參考http://www.linuxquestions.org/questions/debian-26/modprobe-fatal-could-not-load-lib-modules-modules-dep-335214/
在啟動的過程中發現,ubuntu預設啟動下是看不到grub的啟動菜單的(在多系統的機器上可以看到,但虛擬機器中無法看到),因此需要修改grub.cfg中關於時間的控制即timeout,有兩個地方:
if [ "${recordfail}" = 1 ]; then
set timeout=-1
else
set timeout=10
fi
和
if keystatus; then
if keystatus --shift; then
set timeout=-1
else
set timeout=0
fi
else
if sleep --interruptible 3 ; then
set timeout=0
fi
fi
fi
前者為系統失敗或成功的等待時間,後者為啟動時按住shift或不按shift的等待時間,在虛擬機器中可以在啟動時按住shift或者直接把後者的timeout全部改為10.參考資料:http://forum.ubuntu.org.cn/viewtopic.php?f=139&t=323524
四、備忘:
1、vmlinuz是可引導的、壓縮的核心
2、initrd.img的作用:initrd.img是Linux啟 動過程中很重要的一個檔案,如果你編譯核心時將一部分功能編譯為可載入模組。如果系統的一些裝置的驅動編譯為可載入模,那麼啟動時如果沒有指定 INITRD=/path_to_initrd.img,那麼系統啟動或者會失敗,或者啟動後會有裝置無法使用(像網卡或者其它裝置)。如果沒指定initrd.img或者指定的initrd.img中並沒有包含正確的驅動模組,則系統啟動時會掛起,並報告"kernel panic: VFS: Unable to mount root fs on 08:06"的錯誤。
3、需提高:對於只是順利的走完整個流程,對於各步驟的細節很不清楚,如對核心的配置(menuconfig),核心源碼makefile的瞭解,以及產生vmlinuz和img的過程和兩個檔案的作用都不清楚,還需要再對其進行深入分析和學習!
參考資料:
1、ubuntu論壇上關於編譯核心源碼的流程,很詳細,早找到這個就不會費這麼大勁了:
http://forum.ubuntu.org.cn/viewtopic.php?t=134404
2、關於解決Could not load /lib/modules/.../modules.dep問題的方法:
http://www.linuxquestions.org/questions/debian-26/modprobe-fatal-could-not-load-lib-modules-modules-dep-335214/
3、vmlinuz和initrd.img的作用:
http://blogold.chinaunix.net/u3/100815/showart.php?id=2026646
4、Linux核心官方原始碼路徑:http://www.kernel.org/pub/linux/kernel/v2.6/
5、關於grub啟動菜單的顯示:http://forum.ubuntu.org.cn/viewtopic.php?f=139&t=323524