X86linux內核編譯

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內的硬盤信息節點。

發佈了8 篇原創文章 · 獲贊 7 · 訪問量 662
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章