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内的硬盘信息节点。