准备工作:
yum install bzip2 libncurses5-dev kernel-package zlib1g-dev gcc make kernel-package wget module-init-tools procps libncurses5-dev
1,下载内核包linux-2.6.39.3放到/usr/src 目录下
cd /usr/src
tar -xvjf linux-2.6.39.3.tar.bz2
cd linux-2.6.39.3
make mrproper 清除环境变量,即清除配置文件
make menuconfig 在菜单模式下选择需要编译的内核模块:
initrd是旧版本mkinitrd生成的。如果直接编译可能会出错
出现:mount:could not find filesystem‘/dev/root’的解决方法
解决方法就是加入对旧版sysfs路径的支持,方法如下:
1)、通过make menuconfig选中以下对应的选项
General setup -->
[*] enable deprecated sysfs features to support old userspace tools
2)、修改.config文件
修改.config文件中CONFIG_SYSFS_DEPRECATED_V2,将原本被注释掉的
CONFIG_SYSFS_DEPRECATED_V2 改成CONFIG_SYSFS_DEPRECATED_V2=y
注 : 修改这项是因为旧版的mkinitrd及其nash在内核没有CONFIG_SYSFS_DEPRECATED_V2参数时默认使用旧版sysfs路 径格式,从而在新内核下无法正确访问/sys内的硬盘信息节点。
然后可以写一个编译的脚本 vim neihe.sh 在中间加入
#! /bin/sh
make dep
make clean 确保所有东西均保持最新状态.
make -j4 bzImage 生成内核文件
make modules 编译模块
make modules_install 安装模块
make install 安装
安装完成后去 /boot/grub/grub.conf 中把默认启动内核改为0
这样启动的时候可能还会报错的 作如下修改initrd-2.6.39.3initrd-2.6.39.3.imginitrd-2.6.39.3.imginitrd-2.6.39.3.imginitrd-2.6.39.3.imginitrd-2.6.39.3.imginitrd-2.6.39.3.img
1,解压initrd文件
[root@localhost ~]# cp /boot/initrd-2.6.39.3.img /tmp
[root@localhost ~]# cd /tmp/
[root@localhost tmp]# ls
initrd-2.6.39.3.img
[root@localhost tmp]# mkdir newinitrd
[root@localhost tmp]# cd newinitrd/
[root@localhost newinitrd]# zcat ../initrd-2.6.39.3.img |cpio -i
11537 blocks
释放之后看到如下内容
[root@localhost newinitrd]# ls
bin dev etc init lib proc sbin sys sysroot
2,下边就是编辑init,删掉其中重复的四行中的两行
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
3,重新打包initrd
[root@bogon newinitrd]# find .|cpio -c -o > ../initrd-2.6.39.3.img
11538 blocks
[root@bogon newinitrd]# cd ..
[root@bogon tmp]# gzip -9 < initrd-2.6.39.3 > initrd-2.6.39.3.img
[root@bogon tmp]# ls
initrd-2.6.39.3.img newinitrd
好了,initrd.img就是重新打包的initrd了,然后把initrd.img拷贝到/boot,更改grub.conf里边的initrd-2.6.39.3.img
这样“insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists” 就不会有了
编译完成后生成linux deb 包,先dpkg -i装image,再装headers
安装完成以后再update-grub 进入/boot/grub/menu.lst中选择启动的内核项 默认的第一项为0
ps:在编译完成内核后开机可能出现 Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)的错误 在/boot/grub/menu.lst中可以发现新加的内核可能是没有 initrd /initrd.img-2.6.37.6 未生成的原因不明 可以手动生成
执行命令
mkinitramfs -o /boot/initrd.img-2.6.34.10 2.6.34.10(/boot/initrd.img-2.6.34.10是这个启动加载文件的生成路径 2.6.34.10是 /lib/modules/2.6.34.10)然后update-grub 再启动新内核就没有问题了
卸载一个已经安装的内核包
debian卸载旧内核要先看看有哪些旧的内核,用命令:
dpkg --get-selections |grep linux
如果你的内核是以kernel开头的就把上面的linux改成kernel,之后再用
dpkg --purge --force-remove-essential linux-image-XXX