centos编译linux内核

本文详细介绍了如何从Linux内核2.6.18升级至2.6.34版本,包括下载最新内核、安装必要软件包、编译配置、修改initrd文件以及调整GRUB配置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

. 下载最新版本内核

查看linux当前版本:
# uname -r
2.6.18-128.el5

www.kernel.org下载最新稳定版 2.6.34.tar.bz2至/usr/src

# tar xjvf linux-2.6.34.tar.bz2
# cd linux-2.6.34

2. 必须安装的软件包

(1)gcc
# yum -y install gcc

(2)ncurses-devel
# yum -y install ncurses-devel


3. 编译和安装

# make mrproper
# cp /boot/config-2.6.18-164.el5  .config

# make menuconfig
Load an Alternate Configuration File ->导入.config文件 -> Save an Alternate Configuration

File ->Exit

# vim .config
CONFIG_SYSFS_DEPRECATED_V2 is not set -> CONFIG_SYSFS_DEPRECATED_V2=y

# make all
# make modules_install
# make install

4. 修改initrd

# cp /boot/initrd-2.6.34.img /tmp
# mv /boot/initrd-2.6.34.img /boot/initrd-2.6.34.img.bak
# cd /tmp
# mkdir newinitrd
# cd newinitrd/
# zcat ../initrd-2.6.34.img |cpio -i
# ls
bin  dev  etc  init  lib  proc  sbin  sys  sysroot

# vim init

echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko

这两行出现重复,删除下面的重复部分,否则使用新内核启动时会出现错误:
insmod: error inserting '/lib/dm-region-hash.ko': -1 File exists

# find .|cpio -c -o > ../initrd

# cd ..

# gzip -9 < initrd > initrd-2.6.34.img

# cp initrd-2.6.34.img /boot

# reboot


5.检查新内核版本
开机时,选择2.6.34内核
# uname -r
2.6.34

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

读入BIOS
读取MBR中的引导程序(lilo或者grub)
读取内核进主存,内核解压,试图驱动所有硬件
启动init程 序,启动级别
读取login或者xwindow等用户登录

核心模块放置在/lib/modules/`uname -r`/中
编 译核心是为了使得系统更稳定,对对优化提升整体性能而言影响很小

cd /usr/src
tar zxvf linux-2.6.34.1.tar.bz2
cd linux-2.6.34.1
make mrproper 删除一些以前留下来的.o文件
make menuconfig 使用类似菜单方式来选择核心参数,纯文本模式,不需要x window支持。
<*> 表示编译进核心 <M> 表示编译成模块,不知道该项目是什么且有模块可选时,就可以直接选择为模块
make clean 将以前曾经生成的*.o文件,这样就不会产生新旧版本的误差
make bzImage:制作出核心文件,这个过程很长。
编译好的核心放 在:/usr/src/linux-2.6.34/arch/i386/boot/bzImage里面

make modules:制作出模块相关的文件
我们在重新编译模块之前,我们应该对前一次的编译的模块进行备份。
cd /lib/modules
mv 2.6.34 2.6.34.old
模块安装:
make modules_install

1.移动新核心到/boot 中
cp /usr/src/linux-2.6.34/arch/i386/boot/bzImage /boot/vmlinuz-2.6.34
cp /usr/src/linux-2.6.34/System.map /boot/System.map-2.6.34

修改grub设置文件
[root@www ~]# vim /boot/grub/menu.lst
default=0
timeout=10
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
#hiddenmenu
title CentOS (2.6.18-128.2.1.el5xen)
        root (hd0,0)
        kernel /boot/xen.gz-2.6.18-128.2.1.el5
        module /boot/vmlinuz-2.6.18-128.2.1.el5xen ro root=LABEL=/ rhgb quiet
        module /boot/initrd-2.6.18-128.2.1.el5xen.img
title CentOS testing kernel from vbird
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.30.3vbird ro root=LABEL=/ rhgb
        initrd /boot/initrd-2.6.30.3vbird.img
额外(单一)模块编译
这些核心模块根据不同的版本,分别放到/lib /modules/`uname -r`中,各个硬件的驱动程序则放到/lib/modules/`uname -r`/kernel/drivers中,这些模块与设备代号的对应,就必须写入/etc/modprobe.conf中,一般linux内核会自动加 载,也可以用modprobe或者insmod命令去加载
在kernel2.6版的内核中,所有的核心模块都改名为*.ko了。

1. 下载硬件开发商提供的驱动程序源码
2.读他里面的readme或者install,并依次执行
3.把生成的核心模块拷贝到相应位置
4. 更新模块依赖属性:在/lib/modules/`uname -r` (这里是你杠编译完的内核目录)depmod -a
自行编译的模块,在核 心更新之后,需要重新编译针对新内核的模块

核心模块管理:lsmod modinfo modprobe insmod rmmod......

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

升级内核2.6.18到2.6.34.1

升级2.6.18到2.6.34.1

最新内核下载地址:http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.34.tar.bz2

首先我们的准备好要用的工具,有如下四个

module-init-tools

mkinitrd

lvm2

device-mapper

可以用rpm -qa *来查询,如果系统没有的话请自己到网上搜索并安装上

系统环境

# uname -r

2.6.18-128.el5

编译安装新内核

# tar -jxvf linux-2.6.34.1.tar.bz2 -C /usr/src/

# ln -s linux-2.6.34.1 linux

# cd linux

# cp /boot/config-2.6.18-128.el5 ./.config

# vim .config

CONFIG_SYSFS_DEPRECATED_V2=y #默认该选项为not set,

否则重启后报错

Volume group "VolGroup00" not found

Unalbe to access resume device (/dev/VolGroup00/LogVol00)

mount: could not find filesystem '/dev/root'

setuproot:moving /dev failed: No such file or directory

setuproot:error mounting /proc: No such file or directory

setuproot:error mounting /sys: No such file or directory

switchroot: mount failed: No such file or directory

Kernel panic - not syncing:Attempted to kill init!

+++++++++++++++++++

一定要作不然重启会报错,你会后悔的,~~要知道重新编译一次得多长时间,60多M的内核啊^^

+++++++++++++++++++

# make mrproper

# make menuconfig

(1)Loadable Module support选项中,选上“Module unloading”和“Automatic kernel module loading”这两项;

(2)Device Drivers---&gt;Block Devices中选上“Loopback device support”;

Device Drivers---&gt;Multi-device support(RAID and LVM)处要选上“device mapper support”;

Device Drivers---&gt;Graphics support,一定要选上“ Support for frame buffer devices”;

Device Drivers ---&gt;USB support ---&gt;选上“USB Mass Storage support”(如果是在实环境中,想要更多USB支持,就全选吧。我的是在虚拟机中,用不着了)

Device Drivers ---&gt;;Network device support ---&gt;Ethernet (10 or 100Mbit) ---&gt;<*> AMD PCnet32 PCI support

(3)File system---&gt;(以下9个选项是关于ext2和ext3文件系统配置,全部选上,要直接编译进内核,就是要按Y来选择,)

Second extended fs support(注意:此处默认是编译成模块,在此要按Y键)

Ext2 extended attributes

Ext2 POSIX Access Control Lists

Ext2 Security Labels

Ext3 journalling file system support

Ext3 extended attributes

Ext3 POSIX Access Control Lists

Ext3 Security Labels

JBB (ext3) debugging support

Device Drivers ---&gt;<*>SCSI device support (此项不选的话,下面两项就选择不上)

Device Drivers ---&gt;<*>SCSI device support ---&gt;<*>SCSI disk support

Device Drivers---&gt;<8>SCSI device support---&gt;SCSI low-level drivers---&gt;<*>; BusLogic SCSI support

# make bzImage

# make modules

# make modules_install

# make install

此时会出现3个警告,没有关系,是没有对系统打补丁造成的

可参考https://bugzilla.redhat.com/show_bug.cgi?id=488991 对内核打相应补丁

sh /usr/src/linux-2.6.34/arch/x86/boot/install.sh 2.6.34 arch/x86/boot/bzImage System.map "/boot"

WARNING: No module dm-mem-cache found for kernel 2.6.27, continuing anyway

WARNING: No module dm-message found for kernel 2.6.27, continuing anyway

WARNING: No module dm-raid45 found for kernel 2.6.27, continuing anyway

下面这几个步骤一定要做,可省君不少时间呵,

否则重启报错

insmod: error inserting ‘/lib/dm-region-hash.ko’: –1 File exits

+++++++++++++++++++++++++++++++

1.解压initrd

# cp /boot/initrd-2.6.34.img /tmp

# cd /tmp/

# ls

initrd-2.6.34.img

# mkdir newinitrd

# cd newinitrd/

# zcat ../initrd-2.6.34.img |cpio -i

11537 blocks

# 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

# find .|cpio -c -o &gt; ../initrd

11538 blocks

# cd ..

# gzip -9 < initrd > initrd-2.6.34.img

# ls

initrd-2.6.34.img initrd newinitrd

initrd-2.6.34.img就是重新打包的initrd了,然后把initrd.img拷贝到/boot,就可以了,再reboot,就不 会有之前的错误了.

将init文件的第二行“setquiet” 去掉,boot时就可以打印出initrd在做什么,功能类似于 sh –x init

这个应该是某个地方配置的有问题,所以才出现了重复加载的问题,没时间去细究原因,代价是每次make install后都需要按照上面的步骤修改initrd.img

+++++++++++++++++++++++++++++++

# vim /boot/grub/grub.conf

将default=1改为default=0(不改的话也可以,只不过重启之后会默认进入2.6.18内核)

重启查看我们新安装好的内核

# uname -r

2.6.34

# service iptables start
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules: iptables-restore v1.3.5: iptables-restore: unable to initializetable 'nat'

Error occurred at line: 2
Try `iptables-restore -h' or 'iptables-restore --help' for more information.
                                                           [FAILED]

# service iptables save
Saving firewall rules to /etc/sysconfig/iptables:          [  OK  ]
# service iptables start
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[FAILED]
# service iptables start
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[FAILED]

# vim /etc/sysconfig/iptables-config

IPTABLES_MODULES=”ip_conntrack_netbios_ns”     =====注释掉

# service iptables start
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
[root@song linux]# service iptables restart
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]

 

Ok

本文出 自 51CTO.COM技术博客
一、下载内核
www.kernel.org 下载新内核到 /usr/src 
下载建议最好下载比当前已安装版本高的内核我下载的是 linux-2.6.34.tar.bz2( 原来的内核是 2.6.18-128.e15-i686)
★     我察看当前内核的版本  

[root@localhost~]#uname -a
Linux localhost.localdomain 2.6.18-128.e15-i686 #1 SMP Tue Jun 8 10:30:55 CST 2010 i686 i686 i386 GNU/Linux
然后将其解压到/usr/src目录下,使用下面的命令 解压得到linux-2.6.34:
[root@localhost~]#tar -jxvf linux-2.6.34.tar.bz2
       [root@localhost~]#bzip2 -d linux-2.6.34.tar.bz2

如果所下载的 是.tar.gz(.tgz)文件,请使用下面的命令:

[root@localhost~]#tar -zxvf linux-2.6.34.tar.gz

为了不把原来的目录覆盖掉所以呢在当前路径下做一个链接为linux:

    [root@localhost~]#ln -s /usr/src/linux-2.6.34   /usr/src/linux

二、 配置内核
[root@localhost~]#make   clean        清除原有不需要的模块和文件(垃息)
[root@localhost~]#make mrproper      清理源代码数
[root@localhost~]#make menuconfig    基于ncurse的图形配置界面,可以在文本下以菜单方式,进行配置。
Load an Alternate Configuration File,导入.config文件
注:内核配置有两种方法,一种是直接置入内核* ;另一种是编成模块M ;两种方法各有优点;直接编入内核的,比如设备的启动,不再需要加载模块的这一过程了;而编译成模块,则需要加载设备的内核支持的模块;但直接把所有的东 西都编入内核也不是可行的,内核体积会变大,系统负载也会过重。我们编内核时最好把极为重要的编入内核;其它的如果您不明白的,最好用默认.
移动 键盘上下左右键,按Enter 进入一个目录。把指针移动到Exit就退出当前目录到上级目录;
修改完毕选择Save an Alternate Configuration File,然后退出配置
[root@localhost~]#cp ../kernels/2.6.18-128.e15-i686/.config /usr/src
★     编辑配置文件.config

[root@localhost~]#vim .config

找到105行的"#CONFIG_SYSFS_DEPRECATED is not set"改为"CONFIG_SYSFS_DEPRECATED=y" 保存
假如不修改该行,在升级重新启动后会报如下的错,导致启动失败

Volume group "VolGroup00" not found

Unalbe to access resume device (/dev/VolGroup00/LogVol00)

mount: could not find filesystem '/dev/root'

setuproot:moving /dev failed: No such file or directory

setuproot:error mounting /proc: No such file or directory

setuproot:error mounting /sys: No such file or directory

switchroot: mount failed: No such file or directory

Kernel panic - not syncing:Attempted to kill init!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值