`

编译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_*)一项,其值就是该模块的名字。
    
     
     
     
     
     
     
     
     
     
     
     


     

分享到:
评论

相关推荐

    windows下面编译linux-0.11内核

    在Windows环境下编译Linux 0.11内核是一项对技术有一定挑战性的任务,它涉及到在非Linux系统上构建开源操作系统的核心代码。Linux 0.11是Linux历史上的一个早期版本,对于学习操作系统原理和了解Linux内核的构建过程...

    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 ...

    编译Linux内核的错误汇总

    "编译Linux内核的错误汇总" 在编译Linux内核的过程中,可能会遇到各种错误,这些错误可能会导致编译失败。为了帮助大家更好地编译Linux内核,本文档总结了一些常见的错误和解决方法。 错误一:编译2.6.21内核时...

    Linux内核编译实验

    4. **了解Linux内核的编译过程**:学会如何编译Linux内核,理解编译过程中的关键步骤及其背后的原理。 5. **掌握如何将自定义代码加入Linux内核结构**:学会如何将自己的代码整合进内核,使其成为内核的一部分。 ##...

    Linux内核编译步骤

    Linux 内核编译步骤 Linux 内核编译是一个复杂的过程,需要了解 Linux 内核的结构和编译过程。下面是 Linux 内核编译的详细步骤: 步骤 1: 下载 Linux 内核源代码 在编译 Linux 内核之前,需要下载 Linux 内核的...

    编译linux内核的方法.pdf

    ### 编译Linux内核的方法:详尽指南 #### 核心知识点概览: 1. **编译环境的搭建**:包括安装必要的编译工具、库文件和配置工具。 2. **内核源代码的获取**:通过Ubuntu的源安装或从`kernel.org`下载最新内核版本...

    操作系统实验报告-编译linux内核

    本实验报告详细记录了在Fedora 10系统上编译Linux内核2.6.27.5的过程,旨在让学生理解内核构建流程,并深入学习Linux内核与发行版的关系。 实验的第一步是准备环境,这包括安装Fedora 10和必要的开发工具,如GCC和...

    linux编译时向内核添加新设备

    ### Linux内核编译时添加新设备的知识点详解 #### 一、背景介绍 在Linux系统中,设备驱动是连接硬件与操作系统的重要桥梁。对于经常使用的设备,将其直接编译入内核可以提高系统的稳定性和效率。本文将详细介绍如何...

    编译linux内核 详细解析 自身经历

    Linux 内核编译详解 Linux 内核是操作系统的核心部分,负责管理计算机的硬件资源和提供服务给应用程序。编译 Linux 内核是一个复杂的过程,需要具备一定的技术基础和经验。本文将从零开始,详细介绍 Linux 内核的...

    Linux内核移植与编译

    Linux 内核移植与编译的过程主要包括了解 Linux 内核相关知识与内核结构、了解 Linux 内核在 ARM 设备上移植的基本步骤和方法、掌握 Linux 内核裁剪与定制的基本方法等。 实验环境中,我们使用的是 PC:windows+...

    linux 3.1.1 内核编译

    ### Linux 3.1.1 内核编译详尽指南 #### 一、环境准备与内核下载 为了能够顺利地完成Linux 3.1.1内核的编译工作,首先需要确保你的系统环境符合以下条件: - **系统环境**:Red Hat Enterprise Linux 6.1 - **...

    Linux内核编译命令

    本文将详细介绍一系列用于编译Linux内核的命令,这些命令不仅涵盖了基本的编译流程,还包括了一些高级功能,如配置管理、文档生成和清理操作。 #### 二、核心编译命令 1. **makedep**: 该命令用于生成依赖关系文件...

    嵌入式Linux内核编译

    嵌入式Linux内核编译是一项复杂而关键的任务,它涉及到在特定的硬件平台上构建操作系统核心,以便在该平台上运行应用程序。在这个过程中,开发者需要创建一个交叉编译环境,因为通常开发工具(如编译器)运行在不同...

    Linux内核编译详谈

    ### Linux内核编译详谈 #### 一、引言 Linux内核是Linux操作系统的心脏,负责管理和调度计算机硬件资源。随着技术的发展,Linux内核也在不断进化以支持最新的硬件和技术特性。本文将详细介绍从早期版本的Linux内核...

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

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

    Linux内核的编译与烧写

    **知识点详解:Linux内核的编译与烧写** 在深入了解Linux内核的编译与烧写过程前,我们先来定义几个关键概念。Linux内核是Linux操作系统的核心部分,负责管理和协调计算机硬件资源,以及提供必要的服务供其他应用...

    linux内核模块编译方法

    ### Linux内核模块编译方法 #### 概述 在Linux操作系统中,内核作为操作系统的核心部分,负责管理和调度硬件资源、提供系统调用接口等关键功能。为了满足不同的应用场景需求,用户通常需要对内核进行扩展或定制,...

    windows上可编译Linux内核

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

    linux内核模块的编译详解(有图)

    Linux 内核模块的编译详解 Linux 内核模块的编译是 Linux 内核开发中的一个重要步骤。编译 Linux 内核模块需要准备好内核模块源码、编写 Makefile 文件、编译模块、加载/卸载模块等步骤。 1. 准备内核模块源码 在...

Global site tag (gtag.js) - Google Analytics