實驗環境:Ubuntu12.04LTS 內核版本 3.5.0 更新內核版本3.9.0
首先是準備條件:
①、有一臺裝有ubuntu 12.04的機器
②、先移步到http://www.kernel.org/下載linux穩定版內核(注:可以從科大鏡像下載,速度快 http://mirrors.ustc.edu.cn/linux-kernel/ )
③、擁有root權限
④、並將下載好的內核解壓到/usr/src下,使用命令如下:
#tar jxvf linux-3.3.4.tar.bz2
這樣你就可以得到一個名叫linux-3.3.4
好,現在一切都準備好了,接下來就開始配置,編譯,安裝新內核吧!
1, 進入剛纔的文件夾 /usr/src/linux-3.3.4,輸入命令:
$ make mrproper
該命令的功能在於清除當前目錄下殘留的.config和.o文件,這些文件一般是以前編譯時未清理而殘留的。而對於第一次編譯的代碼來說,不存在這些殘留文件,所以可以略過此步,但是如果該源代碼以前被編譯過,那麼強烈建議執行此命令,否則後面可能會出現未知的問題。
2, 配置編譯選項
作爲操作系統的內核,其內容和功能必然非常繁雜,包括處理器調度,內存管理,文件系統管理,進程通訊以及設備管理等等,而對於不同的硬件,其配置選項也不相同,所以在編譯源代碼之前必須設置編譯選項。其實我覺得這一步是升級內核整個過程中最有技術含量的,因爲要根據自己的需要正確選擇yes or no需要對計算機方方面面的知識都有所瞭解。但是這裏的選項實在是太多了,大概有幾百項之多,我以前曾嘗試着一項一項的選,但是最後還是放棄了,因爲有很多選項不是很明白。
既然這樣,難道沒有什麼簡便的方法麼? 當然有!那就是make menuconfig 或者make xconfig。我使用的是make menuconfig,但是前提條件是要裝ncurses。
ncurses 到http://ftp.gnu.org/pub/gnu/ncurses/下載,可以放到任何目錄進行安裝:
tar zxvf ncurses<version>.tar.gz #解壓縮並且釋放 文件包
cd ncurses<version> #進入解壓縮的目錄(注意版本)./configure #按照你的系統環境製作安裝配置文件make #編譯源代碼並且編譯NCURSES庫su root #切換到root用戶環境make install #安裝編譯好的NCURSES庫
另外,在make menuconfig過程中也會有一些選項需要你來設置*, y, n 或者m,選擇*表示選項中的內容被直接編入內核中,選擇m表示選項中的內容不編入內核,而只是編成獨立的module,用到時才調用。
ok, 在當前文件路徑下,輸入命令:
make menuconfig(或者用 make xconfig,我沒有啓用成功)
根據菜單提示,選擇編譯配置選項,並保存配置文件爲.config(也可以直接複製現有的.config文件,我是這樣做的!!!)(注:這是因爲現在的內核設置針對了大多數的電腦配置,一般包含了基本上的配置,當然寫到這裏你也可以知道,很多配置對於我們一臺機子來說有些多餘的了,有了一定基礎之後具體可以參照內核板塊說明,自己設定。)
3,確定依賴性
根據以往的經驗,這一步是必須的,但是這次編譯的時候,系統提醒我沒必須要執行這個命令:
make dep
如果用現有的.config文件,這裏會有很多內核新增加的驅動和功能讓你確認是否編入內核中,這個你就自己看着輸入y/n/m/?吧!(注:因爲我是沒有設置,所以沒有這三個選項)
4,清除編譯中間文件
輸入命令:make clean
(注:接下來的 5,6 兩個步驟可以使用 make -j4 命令,4是你內核數的兩倍,比如我的機子是T2450 雙核,所以2*2=4,當然你也可以設定另外的常數,但不要超過100,經一些網友實驗得到,*2的效率會好點。如果你還是走5,6兩步的話,速度會慢點咯)
5,生成新內核(這是我用的時間07:38-07:57,19分鐘。這裏時間的長短都取決於你機器的性能)
就是把配置過程中,我們選中編入內核中的程序編譯鏈接生產linux內核,輸入命令:
make bzImage
6,生成modules(這是我用的時間07:58-09:28)
和上步差不多,就是把配置過程中,我們選中編成modules的程序編譯鏈接成modules,輸入命令:
make modules
(注:經過5,6兩步之後,你可以查看是否編譯成功 以下的是x86結構下的內核位置
- <span style="color:#FF0000;">root@thinking-N-A:/usr/src/linux-3.9# ls -l arch/x86/boot/bzImage
- -rw-r--r-- 1 root root 5380928 Jun 8 01:11 arch/x86/boot/bzImage
- </span>
)
7,安裝modules
就是把剛纔編譯生產的modules拷到系統文件夾下,以供新內核調用。輸入命令:
make modules_install
(注:經這一步之後,輸入如下命令,看是否成功
- <span style="color:#FF0000;">root@thinking-N-A:/usr/src/linux-3.9# ls -l /lib/modules/
- total 8
- drwxr-xr-x 4 root root 4096 Feb 14 06:09 3.5.0-23-generic //這個是我原來的內核
- drwxr-xr-x 3 root root 4096 Jun 8 09:40 3.9.0
- </span>
一切都自動做好了。
8,建立要載入ramdisk的映像文件
(注:如果你的機子是2005年入手的,基本上都是scsi磁盤,也可以查看自己機子的磁盤類型,切換到root權限下,輸入命令 fdisk -l
- root@thinking-N-A:/usr/src/linux-3.9# fdisk -l
- Disk /dev/sda: 156.3 GB, 156292685824 bytes
- 255 heads, 63 sectors/track, 19001 cylinders, total 305259152 sectors
- Units = sectors of 1 * 512 = 512 bytes
- Sector size (logical/physical): 512 bytes / 512 bytes
- I/O size (minimum/optimal): 512 bytes / 512 bytes
- Disk identifier: 0x8c3283fe
- Device Boot Start End Blocks Id System
- /dev/sda1 * 2048 206847 102400 7 HPFS/NTFS/exFAT
- /dev/sda2 206848 67690495 33741824 7 HPFS/NTFS/exFAT
- /dev/sda3 67690496 92266495 12288000 7 HPFS/NTFS/exFAT
- /dev/sda4 92268542 305258495 106494977 f W95 Ext'd (LBA)
- /dev/sda5 92268544 215148543 61440000 7 HPFS/NTFS/exFAT
- /dev/sda6 215150592 265930751 25390080 83 Linux
- /dev/sda7 265932800 297445375 15756288 83 Linux
- /dev/sda8 297447424 305258495 3905536 82 Linux swap / Solaris
dev/sda 都爲scsi硬盤
且下面的步驟是針對所有機子的咯
下面的步驟缺少了一個步驟,即將.config 文件拷貝到 /boot 文件下,故首先要進行
- <span style="color:#FF0000;"><strong>root@thinking-N-A:/# cp /usr/src/linux-3.9/.config /boot/config-3.9.0</strong></span>
如若沒有這一步的話,會導致報一個 grep 文件不存在錯誤
)
如果linux系統安裝在scsi磁盤上,這步是必須的,否則可以跳過。我的linux是裝在vmware上的,用的是虛擬的scsi磁盤,所以必須 要這一步。輸入命令:
mkinitramfs -o /boot/initrd-linux3.3.4.img 3.3.4
如果你的linux不是ubuntu,而是其他的發行版本,那麼使用的命令可能不是mkinitramfs,而是mkinitrd,但功能和用法類似。
9,按裝內核
輸入命令:make install
(注,這一步也會自動更新grup項)
此時系統會把linux內核的鏡像文件還有System.map考入到/boot下,然後會自動生成引導菜單。
10, 配置grub引導程序
(下面的這步我沒做哈,因爲我還比較喜歡自己在開機的時候選擇內核版本)
既然新的內核編譯並安裝好了,那麼我們要配置系統的引導程序用新內核正確引導,這一步我的是自動添加的,如果沒有自動添加進去就自動動手修改添加吧。對象是/boot/grub/grub.cfg,首先用chmod更改該文件的只讀屬性。然後參照裏面的已有內容添加一個新啓動項,我的新啓動項是:
menuentry 'Ubuntu,Linux 3.3.4' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root ee7c3a4d-5305-46b1-807e-fa9f39a5d13e
linux /boot/vmlinuz-3.3.4 root=UUID=ee7c3a4d-5305-46b1-807e-fa9f39a5d13e ro quiet splash $vt_handoff
initrd /boot/initrd.img-3.3.4
}
menuentry 'Ubuntu,Linux 3.3.4 (恢復模式)' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root ee7c3a4d-5305-46b1-807e-fa9f39a5d13e
echo '載入 Linux 3.3.4 ...'
linux /boot/vmlinuz-3.3.4 root=UUID=ee7c3a4d-5305-46b1-807e-fa9f39a5d13e ro recovery nomodeset
echo '載入初始化內存盤...'
initrd /boot/initrd.img-3.3.4
}
submenu "Previous Linux versions" {
menuentry 'Ubuntu,Linux 3.2.0-24-generic-pae' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root ee7c3a4d-5305-46b1-807e-fa9f39a5d13e
linux /boot/vmlinuz-3.2.0-24-generic-pae root=UUID=ee7c3a4d-5305-46b1-807e-fa9f39a5d13e ro quiet splash $vt_handoff
initrd /boot/initrd.img-3.2.0-24-generic-pae
}
menuentry 'Ubuntu,Linux 3.2.0-24-generic-pae (恢復模式)' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root ee7c3a4d-5305-46b1-807e-fa9f39a5d13e
echo '載入 Linux 3.2.0-24-generic-pae ...'
linux /boot/vmlinuz-3.2.0-24-generic-pae root=UUID=ee7c3a4d-5305-46b1-807e-fa9f39a5d13e ro recovery nomodeset
echo '載入初始化內存盤...'
initrd /boot/initrd.img-3.2.0-24-generic-pae
}
默認是從新內核鏡像啓動系統。
萬事ok,敲下reboot,系統啓動後,從grub菜單中選中新內核引導linux,怎麼樣,系統啓動的鼓聲響了吧!
進入後用uname -a看看是否新內核。
11、刪除舊內核文件
1,查看一下當前內核版本:uname -a
2.查看一下當前系統內的所有內核文件:dpkg --get-selections|grep linux
3.刪除內核文件:
sudo apt-get remove linux-image-3.2.0-24*sudo apt-get remove linux-headers-3.2.0-24*或(刪除當前版本之外的所有內核)sudo apt-get purge ~ilinux-image-.*\(\!`uname -r`\)
4.另外一條命令:
sudo aptitude purge ~ilinux-image-*\(\!'uname -r'\)
這樣就成功刪除了,重啓一下看看是不是沒有那些沒用的內核啓動項了。