Chinaunix首页 | 论坛 | 博客
  • 博客访问: 116587
  • 博文数量: 14
  • 博客积分: 400
  • 博客等级: 一等列兵
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-19 21:52
文章分类
文章存档

2021年(2)

2016年(2)

2014年(1)

2011年(4)

2010年(5)

我的朋友

分类: LINUX

2011-04-27 16:57:14

一、系统环境。

1、CentOS 5.2 x86_64

2、下载新内核源代码,版本:linux-2.6.38.4

二、安装过程

1、解压源代码,随便到那个目录,进入解压后的源代码目录,我的为~/software/linux-2.6.38.4

2、make mrproper :这个目的是清除原先此目录下残留的.config和.o

3、make clean

注:如果是第一次编译,可以省略2、3步骤。

4、配置。

第一种方式:make defconfig:默认配置,听说是linus的配置哦,呵呵。

                  make allnoconfig : 除必须的选项外, 其它选项一律不选. (常用于嵌入式系统)

第二种方式:make menuconfig:图形界面方式配置,系统将提示你需要安装ncurses-devel包。

yum install ncurses-devel

在第二种方式下,可以使用当前的系统的核心配置(/usr/src/kernels/2.6.18-92.el5-x86_64/.config)

通过menuconfig菜单里的Load an Alternate Configuration File加载

我的做法是:

(1)cp  /usr/src/kernels/2.6.18-92.el5-x86_64/.config .

(2)make menuconfig-->Load an Alternate Configuration File-->选择.config-->Save an Alternate Configuration File

(3)vim .config

    编译时修改.config文件中的“CONFIG_SYSFS_DEPRECATED”和“CONFIG_SYSFS_DEPRECATED_V2”,默认该选项为not set,被注释掉的,将其改为y。即修改为“CONFIG_SYSFS_DEPRECATED=y”和“CONFIG_SYSFS_DEPRECATED_V2=y”。

可以避免安装完内核后,出现如下错误,导致无法启动:

mount: could not find filesystem ‘/dev/root’

    另外我根据本机情况把网卡驱动ATL2设为y,编译进内核,把主板传感器ATK0110和CPU传感器CORETEMP设为m,编译为模块

5、make dep:依赖关系编译

6、make bzImage :编译核心,bz,表示压缩。也可以zImage,但要确保核心较小。默认即为bzImage

# make bzImage

  CHK     include/linux/version.h

  CHK     include/generated/utsrelease.h

  CALL    scripts/checksyscalls.sh

  CHK     include/generated/compile.h

Kernel: arch/x86/boot/bzImage is ready  (#2)

提示已经放到了当前目录的arch/x86/boot/bzImage里

7、make modules :编译模块,模块的多少取决于你的配置

8、make modules_install:安装module,这将把上一步构建出来的内核放入一个模块子目录中:/lib/modules/your_kernel_version

9、make install:自动安装。
(1)默认会把arch/x86/boot/bzImage复制到/boot/vmlinuz版本号,例如:vmlinuz-2.6.38.4,如果已经安装过同一个版本号的时候,将把前一个重命名为vmlinuz-2.6.38.4.old
    根据自己的机器调整为拷贝arch/x86_64/boot/bzImage 替换掉vmlinuz-2.6.38.4
(2)mkinitrd /boot/initrd-2.6.38.4.img 2.6.38.4
(3)自动在/boot/grub/grub.conf里加上了启动项,例如:
cat /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-version.img
#boot=/dev/sda
default=1
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.38.4)
root (hd0,0)
kernel /vmlinuz-2.6.38.4 ro root=LABEL=/ rhgb quiet
initrd /initrd-2.6.38.4.img
title CentOS (2.6.18-92.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quiet
initrd /initrd-2.6.18-92.el5.img
(4)建议要把hidde menu注释掉
如此,就完成了内核的编译,我已经按这种方式成功安装。

10、make headers_install :安装头文件,可以用来编译下载下来的驱动,可选

补充:
也可以直接用make, 就省了make bzImagemake modules
.config配置文件(转载自《编译 Linux2.6 内核总结》)
在 内核树的根目录中,有一个.config文件,它记录了内核的配置选项,可直接对它进行修改,再运行(若.config不存在,对内核进行配置后会生成 它,这种情况下当然不能开始就运行oldconfig). 实际上, 如果你手头有合适的 .config 文件, 可以运行 make oldconfig  直接按 .config 的内容来配置。
记得要注意备份.config

$ make oldconfig

对内核的配置都是围绕 .config 来展开的.  即便开始 .config 文件不存在, 进行配置后会创造它.

其实可以直接在menuconfig中加载已有的配置文件, 不要将它改名为.config. 否则完成配置, 退出menuconfig时会提示你运行 make mrproper. 上面提到的方法只是比较适合于oldconfig!


升级后发现系统时间有问题,搜索后解决方案如下:

CentOS 5.3 使用新内核的时候才会遇到。

实际上这是 Fedora、RH 系列的一个小 bug。
在老式的 mkinitrd 命令工作时,会将 /dev/rtc 生成好,放在 initrd 文件中。
但是新的 kernel 是自己生成的 /dev/rtc 文件的,当 kernel 生成 /dev/rtc 文件时,发现已经有 rtc 设备了。于是就将 /dev/rtc0 创建了出来。

应对这个问题,hwclock 做了调整,新的 hwclock 已经支持寻找 /dev/rtc0 设备。但在 CentOS 5.3 上使用新的 hwclock 时发现系统关闭时硬件时间同步正常,系统开机时并不正常。不过这不影响使用。

从 log 看来,最完美的解决方案就是使用 32 位的 hwclock ,是否使用,大家根据自己的环境斟酌。


升级后发现不支持iptables规则里的state,解决方案如下:

在内核配置文件中要启用一些较要的选项包括Netfilter连接跟踪、日志记录和包过滤。iptables 是通过使用由Netfilter提供的内核中的框架来建立一个策略的。

    对于2.6系列的内核来说,大多数的Netfilter编译选项都位于 Networking-->Networking Options下的Network Packet Filtering Framework一节 中。在Network Packet Filtering Framework中还有两个额外的配置节 --Core Netfilter Configuration(核心Netfilter配置)和 IP:Netfilter Configuration (IP:Netfilter配置)。

    1、核心Netfilter配置(如下的重要选项应该被启用)

        Comment match support (Comment 匹配支持)
        FTP support  (FTP协议支持)
        Length match support (数据包长度匹配支持)
        Limit match support (Limit匹配支持)
        MAC address match support (MAC地址匹配支持)
        MARK target support (MARK目标支持)
        Netfilter connection tracking support (Netfilter连接跟踪支持)
        Netfilter LOG over NFNETLINK interface (Netfilter通过NFNETLINK接口记录日志)
        Netfilter netlink interface (Netfilter netlink接口)
        Netfilter Xtables support (Netfilter Xtables支持)
        State match support (state匹配支持)
        String match support (string匹配支持)
    
    2、IP:Netfilter配置(本节需要启用的选项如下)

        ECN target support (ECN目标支持)
        Full NAT (完整NAT支持)
        IP address range match support (IP地址范围匹配支持)
        IP tables support (required for filtering/masq/NAT) (IP tables 支持,Filtering/masq/NAT需要)
        IPv4 connection tracking support (required for NAT) (IPv4连接跟踪支持,NAT需要)
        LOG target support (LOG目标支持)
        MASQUERADE target support (MASQUERADE目标支持)
        Owner match support (Owner目标支持)
        Packet filtering (包过滤支持)
        Packet mangling (包修改支持,常用于改变包的路由)
        raw table support (required for NOTRACK/TRACE) (raw表支持,NOTRACK/TRACE需要)
        Recent match support (recent匹配支持)
        REJECT target support (REJECT目标支持)
        TOS match support (TOS匹配支持)
        TOS target support (TOS目标支持)
        TTL match support (TTL匹配支持) 
        TTL target support (TTL目标支持)
        ULOG target support (ULOG目标支持)。


升级后发现开机提示wait_for_sysfs.... pci: .......等等,解决方案如下:

It's something that should be fixed in the udev rules. This is the
fixed line, we used in later releases. It adds an additional match to
prevent the warning you see:
  SUBSYSTEM=="scsi", KERNEL=="[0-9]*:[0-9]*", WAIT_FOR_SYSFS="ioerr_cnt"

修改:/etc/udev/rules.d/05-udev-early.rules文件,把
ACTION=="add", SUBSYSTEM=="scsi", WAIT_FOR_SYSFS="ioerr_cnt"
修改为
ACTION=="add",SUBSYSTEM=="scsi", KERNEL=="[0-9]*:[0-9]*", WAIT_FOR_SYSFS="ioerr_cnt"
阅读(2290) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~