項目中因爲要用到一些新的系統調用,需要升級當前所用的Red Hat5.2,於是就從Linux內核官方網站上下載源碼進行編譯。
準備工作
1.確認內核及版本信息
2.安裝軟件
編譯安裝新內核,依賴於開發環境和開發庫
# yum grouplist // 查看已經安裝的和未安裝的軟件包組,來判斷我們是否安裝了相應的開發環境和開發庫;
# yum groupinstall "Development Tools" // 一般是安裝這兩個軟件包組,這樣做會確定你擁有編譯時所需的一切工具
# yum install ncurses-devel // 你必須這樣才能讓 make *config 這個指令正確地執行
# yum install qt-devel // 如果你沒有 X 環境(圖形界面),這一條可以不用
# yum install hmaccalc zlib-devel binutils-devel elfutils-libelf-devel // 創建 CentOS-6 內核時需要它們
編譯內核
1.獲取並解壓內核源碼,配置編譯項
本次我選擇的升級內核版本是2.6.32.23。
我們在系統原有的內核配置文件的基礎上建立新的編譯選項,所以複製一份原配置文件到當前目錄下,命名爲.config。
[root@src ~]# tar -jxvf linux-2.6.32.23.tar.bz2 -C /usr/src/
[root@src ~]# cd /usr/src/linux-2.6.32.23/
[root@src linux-2.6.32.23]# cp /boot/config-2.6.18-92.el5 .config
接下來繼續配置:
[root@src linux-2.6.32.23]# sh -c 'yes "" | make oldconfig'
make oldconfig會讀取當前目錄下的.config文件,在.config文件裏沒有找到的選項則提示用戶填寫。make oldconfig會在生成新的.config之前備份爲.config.old,並生成新的.config文件。
有的文檔裏介紹使用make memuconfig(系統中必須安裝有ncurses庫),它是以菜單的方式,選擇編譯內核需要的模塊,類似界面如下:
2.開始編譯
[root@src linux-2.6.32.23]# make bzImage // 生成內核文件
[root@src linux-2.6.32.23]# make modules // 編譯模塊
[root@src linux-2.6.32.23]# make modules_install // 編譯安裝模塊
生成內核文件
編譯模塊
編譯安裝模塊
3.安裝
[root@src linux-2.6.32.23]# make install
4.修改grub引導,重啓
安裝完成後,需要修改Grub引導順序,讓新安裝的內核作爲默認內核。
# vim /etc/grub.conf
數一下剛剛新安裝的內核在哪個位置,從0開始,然後設置default爲那個數字,一般新安裝的內核在第一個位置,所以設置default=0。
然後,重啓後確認當前內核版本
[root@src ~]# shutdown -r now
[root@src ~]# uname -r
顯示內核版本爲2.6.32.23,則表示升級內核成功。
異常
1.在升級編譯完內核,重啓後無法進入系統,提示如下錯誤信息:
解決方法:編譯時修改.config文件中的“CONFIG_SYSFS_DEPRECATED_V2”,默認該選項是被註釋掉的,爲not set,將其改爲y,即修改爲“CONFIG_SYSFS_DEPRECATED_V2=y”,修改後,再編譯,重啓即正常了。
2.如果編譯失敗(如缺少依賴包),可以先清除,再重新編譯
[root@src ~]# cd /usr/src/linux-2.6.32.23
[root@src linux-2.6.32.23]# make mrproper // 完成或者安裝過程出錯,可以清理上次編譯的現場
[root@src linux-2.6.32.23]# make clean