本文主要是寫給內核學習新手的,主要是在VMWare虛擬機上進行操做。html
首先安裝對應版本的編譯工具鏈。linux
下面進行編譯和安裝。ubuntu
1.首先解壓源碼。工具
2.使用cp命令把解壓以後的源碼複製到 /usr/src目錄中 例如:cp -r linux-2.6.32.60 /usr/src/學習
======================================ui
注:若是是首次編譯內核,無需執行上面1,2可是須要在內核源碼目錄下執行make mrproper命令來刪除以前已編譯的.o和.config文件。.net
======================================htm
3.使用su命令切換到root用戶,cd到/usr/src/中的內核源碼目錄下。blog
4.把本機的 /usr/src/本機內核版本/ 目錄下的.config文件複製到 /usr/src/要編譯的內核版本 目錄下,例如在個人機器上命令是:cp /usr/src/linux-headers-2.6.32-21/.config /usr/src/linux-2.6.32.60 。ci
5.make oldconfig。這條命令首先讀取剛纔拷貝的.config文件,而後會詢問一些新的內核特性是否編譯,對於新手來講一直按回車鍵就能夠了。
6.make bzImage,開始編譯內核
7.make modules,開始編譯模塊。
8.make modules_install,安裝內核模塊
9.make install,安裝內核
10.執行update-initramfs -c -k 內核版本號,例如在個人機器上就是:update-initramfs -c -k 2.6.32.60,這個命令十分重要。
11.拷貝編譯出的內核壓縮文件bzImage 到boot目錄下,命名爲vmlinuz-內核版本號, 例如在個人機器上是這樣操做的: cp /usr/src/linux-2.6.32.60/arch/i386/boot/bzImage /boot/vmlinuz-2.6.32.60
12.執行update-grub和update-grub命令更新引導文件。
13.reboot
==================================================
二.編譯過程出現的問題
安裝內核重啓以後加載新內核極可能出現問題從而沒法啓動,這裏說一種方法用來加載原來的內核。
這裏直說使用VMWare虛擬機的方法。
1.首先點擊 虛擬機-電源-打開電源時進入固件,這樣咱們就能夠進入BIOS了。在BIOS中選擇BOOT選項,將CD-ROM做爲第一啓動項,而後CTRL+F10進行保存重啓。
2.進入Ubuntu安裝盤,不選擇安裝,選擇try Ubuntu,這樣就進入Ubuntu試用版系統了。
3.進入系統以後首先使用sudo passwd對Root密碼進行設置,而後切換到ROOT用戶。
4.使用fdisk -l 命令查看你的 boot分區在哪一個硬盤上,個人是在/dev/sda1上面。(注意,若是你安裝系統的時候沒有進行進行分區,那麼fdisk命令顯示的Linux分區就包含boot)。
5.掛載boot分區到本身建立的目錄,例如在個人電腦上使用的命令是 mkdir mydir && mount /dev/sda1 mydir,以後cd到mydir 目錄就是在boot分區了。
咱們主要編輯 /boot/grub/grub.cfg文件,把全部關新內核的配置刪除,例如個人機器上須要刪除
menuentry 'Ubuntu, with Linux 2.6.32.60' --class ubuntu --class gnu-linux --class gnu --class os {
..........
}
全部帶有2.6.32.60的menuentry 塊都須要刪除。
刪除以後,保存文件,重啓機器,修改BIOS的BOOT爲硬盤啓動。
(注:網上還有一種修改grub.cfg的set default="0"的方法,可是在個人機器上沒有起做用)。
錯誤:Kernel Panic - not syncing :VFS: Unable to mount root fs on unknown-block(0,0)
沒辦法掛載root,解決辦法,在全部的新內核相關的menuentry塊中添加「initrd /boot/initrd.img-內核版本號」這一句。
例如在個人機器上,添加initrd /boot/initrd.img-2.6.32.60,
menuentry 'Ubuntu, with Linux 2.6.32.60.kid' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod ext2
set root='(hd0,1)'
search --no-floppy --fs-uuid --set b3b4f2e3-fb0d-4151-97ab-f73c88ab2742
linux /boot/vmlinuz-2.6.32.60 root=/dev/sda1 ro quiet splash
initrd /boot/initrd.img-2.6.32.60
}
關於initrd的問題能夠參考鳥哥的Linux私房菜第二十章。
本文參考連接:
http://blog.sina.com.cn/s/blog_4ba5b45e0102e7nk.html
http://blog.csdn.net/zufeng_chen/article/details/5824544