1.配置編譯及安裝
注意:
編譯內核版本爲linux2.6.29
運行系統內核爲linux2.6.32
在使用版本差距過大的內核進行編譯時工具會出現很多問題;
(1) 下載
http://www.kernel.org/pub/linux/kernel/v2.6/
首先從上面的地址下載內核源碼
(2) 將壓縮包放到/usr/src解壓
如果是.tar.bz2:
tar xjvf linux-2.6.29.tar.bz2
如果是.tar.gz:
tar zxvf linux-2.6.29.tar.gz
(3) 清理中間文件配置文件
cd linux-2.6.29
make distclean
(4) 使用正在運行的內核配置作爲參考
cp /boot/config-2.6.xxx .config
(5) 配置內核
如果不需要對內核進行裁剪保存退出即可
make menuconfig
注意:
1.將窗口全屏,窗口太小會報錯
2.缺少一個n開頭的文件,打不開menuconfig界面可以下載安裝即可
3.需要保存退出來更新.config文件
(6) 環境變量問題 (此步沒有錯誤可以跳過)
使用set查看所有本地定義的環境變量
CROSS_COMPILE=/usr/local/arm/3.4.1/bin/arm-linux
修改環境變量
vim /root/.bash_profile
用#註釋掉 CROSS_COMPILE這一行
退出並重新登錄
先exit再以root用戶登錄
如果不修改環境變量,執行make會報錯
cc1: error unrecognized command line option-mregparm=3
cc1: error unregognized command line option -march=i686
如果不想修改環境變量,執行sudo make就沒有問題
(7) 編譯內核
make bzImage
編譯好後位於arch/x86/boot目錄下
(8) 編譯內核模塊
make modules
(9) 安裝內核模塊
make modules_install
(10) 建立要載入ramdisk的映像文件
(/lib/modules/下必須有內核版本)會產生initrd-2.6.29
mkinitrd initrd-2.6.29 2.6.29
mkinitrd -v --preload mptspi --preloaddm-mod initrd-2.6.37 2.6.37
必要參數:映像文件,內核版本
可選參數:
–builtin=:跳過該模塊,讓mkinitrd 認爲該模塊已經是 builtin 的了,就不會再查找該模塊了。
mkinitrd 可選參數:
–preload=:添加某個模塊到initrd image 中。同時該模塊將在所有 scsi 模塊被加載之前先被加載。
–with= :添加某個模塊到 initrd image 中。同時該模塊將在所有 scsi 模塊加載後被加載。
-v :verbose 模式
(11) 安裝內核
將生成的兩個文件掛載到/boot/下面
bzImage–>vmliuz-2.6.29
inintrd-2.6.29–>inintrd-2.6.29
cp arch/x86/boot/bzImage /boot/vmliuz-2.6.29
cp /lib/modules/initrd-2.6.29 /boot/
(12) 修改grub配置文件
修改grub.conf文件,修改之前最好對虛擬機進行備份快照防止重啓死機
vim /boot/grub/grub.conf
(可以複製一下補充在下面,這樣進入系統可以對系統選擇啓動這兩處改爲複製到/boot/下的新系統的名字)
Grub.conf文件介紹https://www.cnblogs.com/sunada2005/p/3416820.html)
title Fedora (2.6.29)
root (hd0,0)
kernel /vmlinuz-2.6xxx ro root=UUID=40d936f0-8ec1-42f4-9d68-1cbda2cc0e0b rhgb quiet
initrd /initrd-2.6.xxx
title Fedora (2.6.25-14.fc9.i686)
root(hd0,0)
kernel/vmlinuz-2.6.25-14.fc9.i686 ro root=UUID=40d936f0-8ec1-42f4-9d68-1cbda2cc0e0brhgb quiet
initrd/initrd-2.6.25-14.fc9.i686.img
2. 驗證
(1) 重啓
reboot
(2) 查看內核版本
uname –r
(3)可能會遇到的問題
編譯內核後重啓顯示
Reading all physical volumes. This maytake a while…
No volume groups found
Volume group"VolGroup00" not found
(1) 錯誤的原因
A:是由於無法加載磁盤硬件的模塊驅動。
B: initrd是舊版本mkinitrd生成的。
(2) 解決辦法
A問題的解決辦法是建立要載入ramdisk的映像文件時,要加–preload mptspi --preload dm-mod 。
如果還有問題的話,下面的內容要選上,是M的要改爲*
DeviceDrivers —>SCSI device support—>{*}SCSI device support
DeviceDrivers —>SCSI device support—><*>SCSI disk support
DeviceDrivers —>SCSI device support—><>SCSI low-level drivers—> <> BusLogic SCSI support
DeviceDrivers —>Multiple devices driversupport(RAID and LVM)—><*>Device mapper support
B問題的解決方法就是加入對舊版sysfs路徑的支持,方法如下:
General setup
[*]enable deprecated sysfsfeatures to support old userspace tools
[*] enable deprecated sysfs features by default
或者在.config文件,添加:
CONFIG_SYSFS_DEPRECATED_V2=Y
修改這項是因爲舊版的mkinitrd及其nash在內核沒有CONFIG_SYSFS_DEPRECATED_V2參數時默認使用舊版sysfs路 徑格式,從而在新內核下無法正確訪問/sys內的硬盤信息節點。