`

编译linuxc 内核

 
阅读更多

编译内核全过程(kernel2.6.7)
花了几天才编译成功kernel2.6.7,其过程真可谓艰辛.古语有云:"苦尽甘来!"现在终于可以乐上一阵了.由于许多朋友对操作的顺序及某些重要的配置知之甚少或知之不详,往往病急乱投医.
加之网上的信息多且烦杂,使得编译内核成功率不高,甚至造成原来的系统崩溃的也不在少数.我就是其中一个其实,编译内核并不是一件难事.如果能按照正确的方法来操作,最多花上一个半小时就能搞定.是不是很受鼓舞呀!
废话少说,现在我们马上开始.我原来的系统是redhat9.0,内核2.4.20-8,编译的内核2.6.7,仅供参考.
共分为四部分:编译前准备->编译配置->编译过程->运行内核的常见问题
一 编译前准备
1)下载一份内核源代码,我下的是linux-2.6.7.tar.bz2,你可在如下地址下载它或者是更新的版本.
http://kernel.org/pub/linux/kernel/v2.6/
2) 下载最新版本的module-init-tools( "module-init-tools-3.0.tar.gz" and "modutils-2.4.21-23.src.rpm")
http://www.kernel.org/pub/linux/kernel/people/rusty/modules/module-init-tools-3.0.tar.gz
http://www.kernel.org/pub/linux/kernel/people/rusty/modules/modutils-2.4.21-23.src.rpm
3)安装module-init-tools. 它会替代depmod [/sbin/depmod]和其他工具.
tar -zxvf module-init-tools-3.0.tar.gz
cd module-init-tools-3.0
./configure --prefix=/sbin
make
make install
./generate-modprobe.conf /etc/modprobe.conf
4)安装modutils-2.4.21-23.src.rpm. 你可能会看到"user rusty and group rusty not existing"的警告. 没关系,你只需强制安装就是了.如果你不对Redhat 9和Redhat 8做这几步, 你将会在"make modules_install"这一步时出现问题.
rpm -i modutils-2.4.21-23.src.rpm
rpmbuild -bb /usr/src/redhat/SPECS/modutils.spec
rpm -Fi /usr/src/redhat/RPMS/i386/modutils-2.4.21-23.i386.rpm
5)解压缩内核源代码.把下载的源代码包放到目录/usr/src下,然后
cd /usr/src
tar xvfj linux-2.6.7.tar.bz2
cd linux-2.6.7
二 编译配置
在这一部分涉及几个重要模块的配置请,特别注意.一般用"make menuconfig"命令来配置内核.
输入以上命令后出现一个菜单界面,用户可以对需要的模块.下面着重讲几个重要的配置
1)文件系统
请务必要选中ext3文件系统,
File systems--->
[*] Ext3 journalling file system support
[*] Ext3 Security Labels
[*] JBD (ext3) debugging support
以上三项一定要选上,而且要内建(即标*). 这个非常重要,在配置完后一定要检查一下.config文件有没有"CONFIG_EXT3_FS=y"这一项. 如果不是"CONFIG_EXT3_FS=y"而是"CONFIG_EXT3_FS=m",你在运行内核时就会遇上以下错误: pivotroot: pivot_root(/sysroot,/sysroot/initrd) failed
2)网卡驱动
请务必把自己网卡对应的驱动编译进内核,比较普遍的网卡是realtek 8139,以下就是这种网卡的配置,以供参考
Device Drivers--->
Networking support--->
Ethernet (10 or 100Mbit) --->
<*> RealTek RTL-8139 C+ PCI Fast Ethernet Adapter support (EXPERIMENTAL)
<*> RealTek RTL-8139 PCI Fast Ethernet Adapter support
3)声卡驱动
也要选择自己声卡对应的驱动编译进内核,比较普遍的声卡是i810_audio,以下就是这种声卡的配置,以供参考
Device Drivers --->
Sound --->
<*> Sound card support
Advanced Linux Sound Architecture --->
<*> Advanced Linux Sound Architecture
<*> Sequencer support
< > Sequencer dummy client
<*> OSS Mixer API
<*> OSS PCM (digital audio) API[*] OSS Sequencer API
<*> RTC Timer support
PCI devices --->
<*> Intel i8x0/MX440, SiS 7012; Ali 5455; NForce Audio; AMD768/8111
Open Sound System --->
< > Open Sound System (DEPRECATED)
以上三项配置关系到新内核能否正常运行,请备加注意.其他的配置如果不是很了解,大可以按默认的选择.
三 编译过程
按如下命令编译,大概需要一个多小时,大可以好好放松一下
make bzImage
make modules
make modules_install
make install
运行新内核之前,请检查一下/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/hdc3
# initrd /initrd-version.img
#boot=/dev/hdc
default=1
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.6.7)
root (hd0,0)
kernel /vmlinuz-2.6.7 ro root=LABEL=/
initrd /initrd-2.6.7.img
title Red Hat Linux (2.4.20-
root (hd0,0)
kernel /vmlinuz-2.4.20-8 ro root=LABEL=/
initrd /initrd-2.4.20-8.img

四 运行内核的常见问题
1)RPM问题

进入编译好的内核后,与RPM相关的命令有些不能使用,并出现下列错误:

rpmdb: unable to join the environment
error: db4 error(11) from dbenv->open: Resource temporarily unavailable
error: cannot open Packages index using db3 - Resource temporarily unavailable (11)
error: cannot open Packages database in /var/lib/rpm
no packages

 

解决方法是执行“export LD_ASSUME_KERNEL =2.2.25”命令,也可以将其写入/etc/bashrc。
2)Sound问题

声音部分的模块名也改变了。我的笔记本原来的声卡驱动是i810_audio,现在已改为snd-intel8x0。因此需要把下面的内容添加到/etc/modprobe.conf中:

alias char-major-14 soundcore
alias sound snd-intel8x0
alias sound-slot-0 snd-intel8x0
alias snd-card-0 snd-intel8x0
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss
install snd-intel8x0 /sbin/modprobe --ignore-install sound-slot-0 &&
{ /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1; /bin/true; }
remove snd-intel8x0
{ /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1; /bin/true; };
/sbin/modprobe -r --ignore-remove sound-slot-0

 

然后执行“modprobe sound”加载声音模块,并使用下列命令检验声卡驱动:

#cat /proc/asound/cards

 

显示结果如下:

0 [SI7012]: ICH - SiS SI7012
SiS SI7012 at 0xdc00, irq 11


3)VMware问题

解决方法是:

◆ 将/usr/bin/vmware-config.pl中所有的“/proc/ksyms”替换为“/proc/kallsyms”。使用“sed”命令可以达到这个目的。

◆ 重新运行该脚本,使用内核头文件编译新的内核模块。在编译过程中如发生错误,应该进入/usr/lib/vmware/modules/source,使用下面的命令将vmnet.tar解包:

#tar xvf vmnet.tar

 

◆ 进入vmnet-only目录修改bridge.c文件。将“atomic_add(skb->truesize, &sk->wmem_alloc);”修改为“atomic_add(skb->truesize, &sk->sk_wmem_alloc);”,并用类似的方式将“protinfo”改为“sk_protinfo”。

◆ 再次把vmnet-only目录用下面的命令重新打包为vmmon.tar:

#tar cvf vmmon.tar vmnet-only。

 

如果按照上面的操作依旧失败,另一解决方法是到http://ftp.cvut.cz/vmware/下载vmware-any-any-updateXX.tar.gz,将其解压到任何目录下,执行其中的runme.pl。

4)USB问题

新的2.6.0内核中使用的USB模块大多数已经改名,因此需要修改/etc/rc.sysinit中对USB子系统初始化的代码。将该文件中所有的“keybdev”改为“usbkbd”、“mousedev”改为“usbmouse”、“/proc/bus/usb”改为 “/sys/bus/usb”,并在/etc/init.d/halt中进行同样的修改。此外,还要在/etc/rc.sysinit中找到 “needusbstorage”,做如下修改:

needusbstorage=
if [ $usb = "1" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /sys/bus/usb/devices 2>/dev/null`
action $"Initializing USB 1.1 host controller: " modprobe ohci-hcd 2> /dev/null
action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
action $"Initializing USB keyboard: " modprobe usbkbd 2> /dev/null
action $"Initializing USB mouse: " modprobe usbmouse 2> /dev/null
fi

 

如果USB总线是2.0的,还需将“ohci-hcd”改为“ehci-hcd”。

5)Sysfs问题

解决方法是:

◆ 建立目录/sys:#mkdir /sys

◆ 在/etc/rc.d/rc.sysinit文件中找到“mount -f /proc”,在其下一行加入“mount -f /sys”。

◆ 同样在/etc/rc.d/rc.sysinit文件中找到“action $"Mounting proc filesystem: " mount -n -t proc /proc /proc”,在其下一行加入“action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys”。

◆ 在/etc/fstab文件中加入“none /sys sysfs defaults 0 0”。

◆ 在/etc/init.d/halt的halt_get_remaining函数中找到“awk '$2 ~ /^\/$|^\/proc|^\/dev/{next}”,改为“awk '$2 ~ /^\/$|^\/proc|^\/sys|^\/dev/{next}”。

6)Hotplug(热插拔)问题

内核对热插拔功能的支持与KMOD内核线程有关。

解决方法是将/etc/rc.sysinit中所有的/proc/ksyms替换为/proc/kallsyms。执行如下命令:

#mv /etc/rc.d/rc.sysinit /etc/rc.d/rc.sysinit.bak
#sed -e 's/\/proc\/ksyms/\/proc\/kallsyms/g' /etc/rc.d/rc.sysinit.bak > /etc/rc.d/rc.sysinit

7)Glibc问题

用户可以升级Glibc标准库的软件包来解决该问题。因为有些发行版,例如Red Hat 9.0上默认安装的Glibc可能是被Red Hat内核小组修改过的。软件包的下载地址是:

ftp://ftp.rpmfind.net/linux/redhat/updates/9/en/os/i386/glibc-2.3.2-27.9.i386.rpm

可以连同以下几个软件包一起升级:

ftp://ftp.rpmfind.net/linux/redhat/updates/9/en/os/i386/glibc-common-2.3.2-27.9.i386.rpm

ftp://ftp.rpmfind.net/linux/redhat/updates/9/en/os/i386/glibc-devel-2.3.2-27.9.i386.rpm

ftp://ftp.rpmfind.net/linux/redhat/updates/9/en/os/i386/glibc-utils-2.3.2-27.9.i386.rpm

如果使用“rpm -Uvh glibc*”失败,请用命令“rpm -e”先删除旧的Glibc,然后用命令“rpm -Uvh --force glibc*”强制安装。

其它问题

大家也许还会遇到其它问题,但是无论遇上什么问题都可以依照下列步骤尝试解决:

1.内核组件尽可能编译为模块。执行如下命令可以快速重建内核:

#make all modules_install install

 

2.软件失败的大多数情况是由于模块名已被更改,而/etc/rc.d/rc.sysinit和/etc/rcX.d/*下的脚本却没有修改这些值而导致的。因此,依次修改相关条目可以改进,但是这也需要相当多的背景知识。如果觉得麻烦,可以把所有加载模块的命令集中在 /etc/rc.d/rc.local中。例如:

modprobe eth0
modprobe isofs
modprobe loop
modprobe vfat

 

同时修改/etc/modoribe.conf文件。具体可参见“man modoribe.conf”获得更多的帮助信息。

3.如果想知道某模块变更后的名字,可以首先在“make menuconfig”时找到该选项,选择Help找到它的配置名称(CONFIG_*),然后到源代码相关目录下的makefile中寻找 CONFIG_*。一般可以找到obj-$(CONFIG_*)一项,其值就是该模块的名字。
    
     
     
     
     
     
     
     
     
     
     
     


     

分享到:
评论

相关推荐

    Linux的内核修改与内核重新编译.pdf

    Linux 内核修改与内核重新编译 本文将详细介绍 Linux 内核修改与内核重新编译的过程,包括修改内核和重新编译内核两个方面。 一、修改内核 Linux 内核采用模块化的配置系统,提供了 make 命令来编译连接各个模块...

    Ubuntu 18.04环境下Linux 0.11 内核编译及在bochs 2.6.9中的调试运行

    "Linux 0.11 内核编译及在 Bochs 2.6.9 中的调试运行" 本文主要讲述了在 Ubuntu 18.04 环境下编译 Linux 0.11 内核,并在 Bochs 2.6.9 中进行调试运行的过程。文章涵盖了编译 Linux 0.11 内核源代码、Bochs 2.6.9 ...

    windows上可编译Linux内核

    在最后,要感谢《自己动手写操作系统》的作者于渊,其实我也是先将原先只能在Linux下编译的书里源代码用MinGW移植到Windows下编译的过程中才试着在Windows下编译Linux 0.11源代码的,有了在Windows下编译Linux 0.11...

    linux4.19内核源码

    进入上面的网址下载所需要编译的Linux内核,我选择了最新4.19.0版的内核,下载后为压缩包。(*请先保证网络正常) 2、存放 创建一个专属的文件夹,存放该压缩包。 二、编译部分 1、解压缩 如下图所示,并保证要进入...

    嵌入式Linux内核的编译与移植.pdf

    "嵌入式 Linux 内核的编译与移植" 本文总结了嵌入式 Linux 内核的编译与移植过程。嵌入式 Linux 系统是一种高起点的技术领域,而嵌入式 Linux 内核的编译与移植是该领域研究的热点。 一、嵌入式 Linux 概述 ...

    把设备驱动程序编译进嵌入式Linux内核

    由于uClinux不支持模块动态加载,而且嵌入式Linux不能够象桌面Linux那样灵活的使用insmod/rmmod加载卸载设备驱动程序, 因而这里只介绍将设备驱动程序静态编译进uClinux内核的方法。本文以uClinux为例,介绍在一个以...

    Linux2.6内核标准教程(共计8-- 第1个)

    附录C Linux内核汇编语法 358 C.1 常规汇编语法 359 C.1.1 寄存器前缀 359 C.1.2 立即数前缀 359 C.1.3 操作数顺序 359 C.1.4 操作数宽度 359 C.1.5 内存寻址格式 359 C.2 内嵌汇编语法 360 C.2.1 ...

    Linux 2.6.19.x 内核编译配置选项简介

    把内核的配置信息编译进内核中,以后可以通过scripts/extract-ikconfig脚本来提取这些信息 Enable access to .config through /proc/config.gz 允许通过/proc/config.gz访问内核的配置信息 Cpuset support 只有含有...

    Linux2.6内核标准教程(共计8--第8个)

    附录C Linux内核汇编语法 358 C.1 常规汇编语法 359 C.1.1 寄存器前缀 359 C.1.2 立即数前缀 359 C.1.3 操作数顺序 359 C.1.4 操作数宽度 359 C.1.5 内存寻址格式 359 C.2 内嵌汇编语法 360 C.2.1 ...

    Linux2.6内核标准教程(共计8--第6个)

    附录C Linux内核汇编语法 358 C.1 常规汇编语法 359 C.1.1 寄存器前缀 359 C.1.2 立即数前缀 359 C.1.3 操作数顺序 359 C.1.4 操作数宽度 359 C.1.5 内存寻址格式 359 C.2 内嵌汇编语法 360 C.2.1 ...

    Eclipse 搭建ARM Lniux 内核驱动开发环境

    Eclipse 搭建ARM Linux 内核驱动程序开发...2、安装开发工具,并将内核源码包解压到指定路径中,并编译。 eg:/usr/local/arm/linux_E9_3.0.35_for_Linux 3、利用eclipse新建一个C Project,Empty Project。 。。。。。。

    linux2.6.33内核移植s3c2410以及交叉环境编译搭建 最终修改版.pdf

    linux2.6.33内核移植s3c2410以及交叉环境编译搭建

    Linux内核中编译选项、文件以及函数之间依赖关系的解析方法.pdf

    Linux内核中编译选项、文件以及函数之间依赖关系的解析方法.pdf

    Linux2.6内核标准教程(共计8--第3个)

    附录C Linux内核汇编语法 358 C.1 常规汇编语法 359 C.1.1 寄存器前缀 359 C.1.2 立即数前缀 359 C.1.3 操作数顺序 359 C.1.4 操作数宽度 359 C.1.5 内存寻址格式 359 C.2 内嵌汇编语法 360 C.2.1 ...

    linux 内核定时器的使用

    主要是对linux内核中的定时器的使用编写的一个例子,代码中包括timer.c和makefile文件,还有一些已经编译的文件,其中有个timer.ko文件就是内核模块文件,在终端使用 insmod timer.ko就可以插入到linux内核(要与...

    Linux2.6内核标准教程(共计8--第7个)

    附录C Linux内核汇编语法 358 C.1 常规汇编语法 359 C.1.1 寄存器前缀 359 C.1.2 立即数前缀 359 C.1.3 操作数顺序 359 C.1.4 操作数宽度 359 C.1.5 内存寻址格式 359 C.2 内嵌汇编语法 360 C.2.1 ...

    Linux内核解读入门.pdf

    Linux内核解读入门 Linux内核是操作系统的核心组件,对整个系统的稳定性和安全性起着至关重要的作用。了解Linux内核的工作机制和源代码组织结构对于系统开发和维护人员来说是非常重要的。本文将介绍Linux内核的源...

    linux重编译

    教会你如何重新编译linux内核!

    基于ARM的嵌入式linux内核的裁剪与移植.pdf

    本文以s3c2410芯片为例,介绍了基于ARM的嵌入式Linux内核的裁剪与移植过程。首先,需要建立交叉编译环境,包括binutils、gcc、glibc等软件的安装。然后,需要修改Makefile,设置nash分区,编译内核,生成内核映像等...

    基于linux-2.6.X内核编译详解

    linux-2.6 内核编译 linux移植详解 超详细的

Global site tag (gtag.js) - Google Analytics