LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1202|回复: 6

LINUX内核编译特别适合初学者+

[复制链接]
发表于 2004-5-20 08:43:16 | 显示全部楼层 |阅读模式
编译LINUX的内核
Daniel Robbins
总裁/CEO
Gentoo 技术公司
2000-09-27
本文转自http://www-900.ibm.com/developer ... 36CE05?OpenDocument
一 、内核入门:
1.        启动,第一部分 当您开启您基于 Linux 的系统时,内核被一个引导工具,例如 LILO,从硬盘载入内存。在此时,内核接管了您的系统控制。它所作的第一件事是探测并初始化它所找到的硬件 -- 它被编译成能支持的那些。一旦硬件已经被正确初始化,它就准备开始运行进程了。它运行的第一个进程被称为"init",位于 /sbin 目录下。然后,"init" 启动在 /etc/inittab 文件中指定的其他进程。

2.        启动,第二部分 "init"通常启动一个名为"getty"程序的多份拷贝,它等待来自控制台的登录。在 getty 成功处理一个登录请求后,您缺省的 shell (通常是 bash) 被载入。一旦您进入 bash,您就有能力来启动任意一个您想要的程序了。当所有这些新的进程被启动后,内核仍在控制系统,精确地给 CPU 分割时间片这样每个进程将均匀地分到。另外,内核继续为各种运行中的进程提供硬件抽象和网络服务。

3.        介绍...模块! 所有最新的 Linux 内核都支持内核模块。Kernel 模块是非常整齐的 -- 它们是除非需要驻留在硬盘上的内核部分。一旦内核需要一个特定模块的功能时,它从硬盘被载入,自动集成到内核中就可被使用了。另外,如果内核模块有好几分钟未被使用,内核可以自愿地将其从内存中调出 -- 被称之为"自动清除"。

4.        模块,第二部分 内核模块是驻留在 /lib/modules 目录下,而且每个模块再其文件名结尾都有一个 ".o"。您也许会猜到,每个模块代表一个内核功能的特定组件 -- 一个模块可能提供 FAT 文件系统支持,而另一个可能支持一种特殊的 ISA 以太网卡.模块使得您的内核占用少量的内存空间。您可创建一个内核只包含足以启动计算机的功能,而其他的功能则在需要时被载入。由于内核能自动清除它所载入的模块,您系统的内存资源能被很好地利用。

5.        模块 -- 特别注意! 您是无法将所有一切放入一个模块的。由于模块是存放在磁盘上,您可启动的内核映像需要被编译入您的磁盘控制器以及对您基本文件系统(通常是 ext2 文件系统)的支持。如果您没有将这些重要的组件编译入您的内核映像(而是将它们作为模块来编译),然后您的内核就无法获得基本的功能来从磁盘上载入这些模块了 -- 导致了一个“鸡生蛋、蛋生鸡”的问题!

二、查找并下载内核代码
1.        下载内核 如果您只是想编译一个您已安装内核的新版本(例如,实现 SMP 支持),那不需要下载任何代码 -- 跳过此部分继续下一屏。您可以在 http://www.kernel.org/pub/linux/kernel 上找到内核代码。当您进入到那后,您将发现内核的源代码按内核版本(v2.2、v2.3 等),被组织到多个不同的目录中。在每个目录中,您将发现文件被冠以"linux-x.y.z.tar.gz"和"linux-x.y.z.tar.bz2"。这些就是 Linux 内核的源代码。您也将看到冠以 "patch-x.y.z.gz" 和 "patch-x.y.z.bz2" 的文件。这些是用来更新前面完整的内核源代码的补丁包。如果您希望编译一个新的内核版本,您将需要下载这些"linux"文件其中之一。

2.        内核解包 如果您已从 kernel.org 下载一个新的内核,现在是要将其解包时候了。首先,cd /usr/src。如果这里有一个存在的"linux"目录,将其改名为"linux.old" ("mv linux linux.old",以 root 权限)。现在,可以解开新的内核包了。仍然在 /usr/src 目录下,输入 tar xzvf /path/to/my/kernel-x.y.z.tar.gz 或者 cat /path/to/my/kernel-x.y.z.tar.bz2 | bzip2 -d | tar xvf -,根据您下载的源代码是用 gzip 或 bzip2 压缩的。在输入完此命令后,您下载的内核源代码会被释放到一个新的"linux"目录下。注意 -- 全套内核源代码通常将在硬盘上占用超过 50 兆空间!

三、配置内核:
1.        讨论配置问题 在您编译内核前,您需要配置它,配置是您精确控制在新内核中启用(禁止)哪些内核功能的机会。您也将控制哪些会被编译到内核的二进制映像(在启动时被载入)而哪些被编译到需要时载入的内核模块文件。老式配置内核的方法是极为痛苦的过程,并涉及到进入 /usr/src/linux 目录并输入 make config 命令。请放弃这种配置内核的方式 -- 除非您想在命令行上回答几百个(对!几百个)“yes/no”的问题。

2.        配置的新途径 我们是现代人类,我们不在输入 make config,而是输入 make menuconfig 或者 make xconfig。如果您想要配置您的内核,使用上述选择之一。如果您输入 make menuconfig,您将使用一个漂亮的基于文本的彩色菜单系统来配置内核。如果您输入 make xconfig,您将使用一个更漂亮的基于 X-Window 的 GUI 界面来配置内核的各种选项。这里有一个使用 "make menuconfig" 的屏幕截图:

当使用 "make menuconfig" 时,在左面出现一个 "< >" 的选项能被编译成为一个模块。当选项被选中,按下空格键来循环选择选项是被选中或未选中, ("<*>")表示将被编译成内核映像而("<M>")表示将被编译成模块。
3.        配置技巧 在这里有极其多的内核选项,而且我们无法在此一一解释 -- 所以请利用内核内置的帮助功能。基本上每个选项都至少有一些描述,而且每个通常都有一行"如果您不知道这个选项的含义,输入 Y。(或者 N)"。这些提示在您不知道一个特定选项的含义时能帮助您。要使用帮助,选中您有疑问的选项然后按 "?" 键。

四、编译LINUX内核
1.        make dep; make clean 一旦您的内核配置完毕,就可开始编译它了。在我们能编译它前,我们需要生成依赖(dependency)信息并清除任何老的"编译结果"。这可以通过在 /usr/src/linux 下输入 make dep; make clean 完成。

2.        make bzImage 现在是编译真正的二进制内核映像时候了。输入 make bzImage。过几分钟后,编译会结束而且您在 /usr/src/linux/arch/i386/boot(x86 PC 内核)目录下找到 bzImage 文件。我们将待会告诉您如何安装这个新内核,但是现在我们要看看模块编译了。

3.        编译模块 现在我们有了 bzImage,下面要编译模块了。即使您在配置内核时没有使用任何模块,也不要跳过此步骤 -- 在编译完 bzImage 后立刻编译模块是个好习惯。而且,如果您真的没有模块需要编译,这个步骤也非常快就结束了。输入 make modules; make modules_install。这将导致模块被编译而且被安装到 /usr/lib/<内核版本号> 目录下。祝贺您!您的内核已经被编译完成了,您的内核模块也编译完成并被安装。现在是要重新配置 LILO,这样您能使用新的内核。

五、启动配置
1.        LILO 入门 现在是最后来重新配置 LILO 的时候了,它将负责载入新的内核。LILO 是最流行的 Linux 引导工具,而且为所有的主流 Linux 发行商所采用。您要作的第一件事是察看您的 /etc/lilo.conf 文件。它将包含一行看似 "image=/vmlinuz" 的语句。该语句告诉 LILO 到何处找到内核。

2.        启动配置, 第二部分 要配置 LILO 来使用新的内核,您有两种选择。第一个是覆盖您现有的内核 -- 除非您手头上有一些紧急启动措施如还有此内核的引导盘,这很危险的方法。更为安全的选择是配置 LILO 是得它能从新的或旧的内核引导。LILO 可配置成从新内核缺省启动,但仍提供一种方法让您遇上问题时能选择旧的内核来启动。这是推荐的作法,也是我们将随后介绍的方法。

3.        启动配置, 第三部分 您的 lilo.conf 文件有可能看起来如下:
        boot=/dev/hda
        delay=20
        vga=normal
        root=/dev/hda1
        read-only
        image=/vmlinuz
        label=linux
要在您的 lilo.conf 文件中增添新的项目,参见下列步骤。首先,拷贝 /usr/src/linux/arch/i386/boot/bzImage 到您的根(root)分区上的一个文件,例如 /vmlinuz2。一旦拷贝完毕,复制您 lilo.conf 文件的最后三行并将它们添加到该文件的最后... 我们即将结束整个步骤了...

4.        启动配置, 第四部分 现在,您的 lilo.conf 文件应该看起来如下:
        boot=/dev/hda
        delay=20
        vga=normal
        root=/dev/hda1
        read-only

        image=/vmlinuz
        label=linux
        image=/vmlinuz
        label=linux
首先,将第一个 "image=" 行改为 "image=/vmlinuz2"。其次,将第二个 "label=" 行改为 "label=oldlinux"。然后,确定在文件的开始有一行 "delay=20" -- 如果没有,增添一行。如果它已经存在,将数字至少设为 20。

5.        启动配置, 第五部分 您最后的 lilo.conf 文件将看起来如下:
        boot=/dev/hda  
        delay=20  
        vga=normal  
        root=/dev/hda1  
        read-only  
  
        image=/vmlinuz2  
        label=linux  

        image=/vmlinuz
        label=oldlinux
作完这些修改后,您将需要以 root 身份运行 "lilo"。这非常重要!如果您不执行此步,启动的过程无法继续。运行 "lilo" 将给 lilo 一个机会来更新它的启动映射。

6.        启动配置, 详解 现在我们详细地解释一下我们所作的改动。这个 lilo.conf 文件可以用来允许您启动两个不同的内核。它允许您启动您原来的内核,位于 /vmlinuz 目录下。它也允许您启动新的内核,位于 /vmlinuz2 目录下。在缺省情况下,它将尝试启动您的新内核(指向新内核的 image/label 行首先出现在配置文件中)。如果,出于某种原因,您需要启动旧内核,只需在重新启动计算机时按住 Shift 键。LILO 将会监测到此操作,然后允许您输入要启动的映像标签名。要启动旧内核,您需要输入 "oldlinux",然后按回车键。要看到有哪些选择,您可按 TAB 键。
发表于 2005-9-1 18:47:15 | 显示全部楼层
很精彩!
回复 支持 反对

使用道具 举报

发表于 2005-9-1 19:12:32 | 显示全部楼层
老版本内核的编译方法,2.6以下的。
大多数的说明还是适用;
转入基础版;
回复 支持 反对

使用道具 举报

发表于 2005-9-1 19:21:34 | 显示全部楼层
This is so ooooooooooooold!
回复 支持 反对

使用道具 举报

发表于 2005-9-1 21:49:15 | 显示全部楼层
lilo?老了点............
回复 支持 反对

使用道具 举报

发表于 2005-9-2 15:47:14 | 显示全部楼层
转贴一下人家的:

代码成熟度选项:

Code maturity level options --->
  • Prompt for development and/or incomplete code/drivers
  • Select only drivers expected to compile cleanly

    打开使用开发中、不完全的代码/驱动会让内核配置多出很多选项,由于我们需要使用一些正在开发中的功能,因此必需打开这一选项。

    通用设置选项:

    General setup --->
    () Local version - append to kernel release
    这里填入的是64字符以内的字符串,你在这里填上的字符口串可以用uname -a命令看到。
  • Support for paging of anonymous memory (swap)
    这是使用交换分区或者交换文件来做为虚拟内存的,当然要选上了。
  • System V IPC
    表示系统5的Inter Process Communication,它用于处理器在程序之间同步和交换信息,如果不选这项,很多程序运行不起来
  • POSIX Message Queues
    这是POSIX的消息队列,它同样是一种IPC。建议你最好将它选上
  • BSD Process Accounting
    这是充许用户进程访问内核将账户信息写入文件中的。这通常被认为是个好主意,建议你最好将它选上。
  • BSD Process Accounting version 3 file format
  • Sysctl support
    这个选项能不重新编译内核修改内核的某些参数和变量,如果你也选择了支持/proc,将能从/proc/sys存取可以影响内核的参数或变量。建议你最好将它选上
    [ ] Auditing support
    审记支持,用于和内核的某些子模块同时工作,例如SELinux。只有选择此项及它的子项,才能调用有关审记的系统调用
    (15) Kernel log buffer size (16 => 64KB, 17 => 128KB)
    内核日志缓存的大小,12 => 4 KB,13 => 8 KB,14 => 16 KB单处理器,15 => 32 KB多处理器,16 => 64 KB for x86 NUMAQ or IA-64,17 => 128 KB for S/390
  • Support for hot-pluggable devices
    是否支持热插拔的选项,肯定要选上
  • Kernel Userspace Events
    内核中分为系统区和用户区,这里系统区和用户区进行通讯的一种方式,选上。
  • Kernel .config support
    将.config配置信息保存在内核中,选上它及它的子项使得其它用户能从/proc中得到内核的配置
  • Enable access to .config through /proc/config.gz
    [ ] Configure standard kernel features (for small systems) --->
    这是为了编译某些特殊的内核使用的,通常你可以不选择这一选项,你也不用对它下面的子项操心了。
    --- Configure standard kernel features (for small systems)
    [ ] Load all symbols for debugging/kksymoops
    是否装载所有的调试符号表信息,如果你不需要对内核调试,不需要选择此项。
  • Enable futex support
    不选这个内核不一定能正确的运行使用glibc的程序,当然要选上
  • Enable eventpoll support
    不选这个内核将不支持事件轮循的系统调用,最好选上
  • Optimize for size
    这个选项使gcc使用-Os的参数而不是-O2的参数来优化编译,以获得更小尺寸的内核,建议选上。
  • Use full shmem filesystem
    在很少的内存且不使用交换内存时,不要选择这项
    (0) Function alignment
    (0) Label alignment
    (0) Loop alignment
    (0) Jump alignment

    可加载模块:

    Loadable module support --->
  • Enable loadable module support
  • Module unloading不选这个功能,加载的模块就不能卸载
    [ ] Forced module unloading
    [ ] Module versioning support (EXPERIMENTAL)
    [ ] Source checksum for all modules
  • Automatic kernel module loading

    处理器类型及特性:

    Processor type and features --->
    Subarchitecture Type (PC-compatible) --->
    Processor family (Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon) --->
    [ ] Generic x86 support
    这一选项针对x86系列的CPU使用更多的常规优化。如果你在上面一项选的是i386、i586之类的才选这个
  • HPET Timer Support
    HPET是替代8254芯片的下一代时钟处理器。这里你可以安全的选上这一选项。如果硬件不支持的话,将仍使用8254时钟处理器
  • Symmetric multi-processing support
    对称多处理器支持,在单CPU的机器上,不选这个选项会更快一些。由于超线程技术,看起来是两颗CPU,因些要选上这个选项
    (1) Maximum number of CPUs (2-255) 支持的最大CPU数
    [ ] SMT (Hyperthreading) scheduler support
  • Preemptible Kernel
    这个选项能使应用程序即使内核在高负载时也很可靠,建议最好选上
  • Machine Check Exception
    这个选项能让CPU检测到系统故障时通知内核,一般我用组装的台式机会选这项。
    < > Toshiba Laptop support
    < > Dell laptop support
    < > /dev/cpu/microcode - Intel IA32 CPU microcode support
    < > /dev/cpu/*/msr - Model-specific register support
    < > /dev/cpu/*/cpuid - CPU information support
    Firmware Drivers --->
    < > BIOS Enhanced Disk Drive calls determine boot disk (EXPERIMENTAL)
    High Memory Support (4GB) --->
    [ ] Allocate 3rd-level pagetables from highmem
    [ ] Math emulation
  • MTRR (Memory Type Range Register) support
    [ ] Boot from EFI support (EXPERIMENTAL)
  • Enable kernel irq balancing
    [ ] Use register arguments (EXPERIMENTAL)

    电源管理:

    Power management options (ACPI, APM) --->
  • Power Management support
    [ ] Power Management Debug Support
    [ ] Software Suspend (EXPERIMENTAL)
    ACPI (Advanced Configuration and Power Interface) Support --->
    APM (Advanced Power Management) BIOS Support --->
    CPU Frequency scaling --->

    ACPI (Advanced Configuration and Power Interface) Support --->
  • ACPI Support
    这是一种电源管理方式,你可以看看你的BIOS是否支持。如果支持的话建议你选上这项
    [ ] Sleep States (EXPERIMENTAL)
    < > AC Adapter
    < > Battery
    <*> Button 捕获Power、Sleep、Lid(我也不知道这是什么按钮)等按钮是否按下,并做相应的动作
    <*> Video 集成在板上的显卡的ACPI支持,对有些板卡可能不起作用
    < > Fan
    <*> Processor
    <*> Thermal Zone
    < > ASUS/Medion Laptop Extras
    < > IBM ThinkPad Laptop Extras
    < > Toshiba Laptop Extras
    (0) Disable ACPI for systems before Jan 1st this year
    [ ] Debug Statements
  • Power Management Timer Support

    APM (Advanced Power Management) BIOS Support --->
    < > APM (Advanced Power Management) BIOS support
    高级电源管理的支持,一般来说笔记本应该选上,台式机可以不选。
    [ ] Ignore USER SUSPEND
  • Enable PM at boot time
    [ ] Make CPU Idle calls when idle
    [ ] Enable console blanking using APM
    [ ] RTC stores time in GMT 按Unix的标准,硬件的时钟应该设为格林威治时间
    [ ] Allow interrupts during APM BIOS calls
  • Use real mode APM BIOS call to power off
  • CPU Frequency scaling
    这一选项允许改变CPU的主频,使CPU在低负荷或使用电池时降低主频,达到省电的目的。
    [ ] Enable CPUfreq debugging
    < > /proc/cpufreq interface (deprecated)
    Default CPUFreq governor (performance) --->
    --- 'performance' governor
    <*> 'powersave' governor
    <*> 'userspace' governor for userspace frequency scaling
    [ ] /proc/sys/cpu/ interface (2.4. / OLD)
    <*> 'ondemand' cpufreq policy governor自动调节主频
    <*> CPU frequency table helpers 多数的CPU需要这一项来调节主频
    <*> ACPI Processor P-States driver 报告处理器的状态
    < > AMD Mobile K6-2/K6-3 PowerNow!
    < > AMD Mobile Athlon/Duron PowerNow!
    < > AMD Opteron/Athlon64 PowerNow!
    < > Cyrix MediaGX/NatSemi Geode Suspend Modulation
    <*> Intel Enhanced SpeedStep Intel的变频技术支持
    [ ] Use ACPI tables to decode valid frequency/voltage pairs
    --- Built-in tables for Banias CPUs
    < > Intel Speedstep on ICH-M chipsets (ioport interface)
    < > Intel SpeedStep on 440BX/ZX/MX chipsets (SMI interface)
    < > Intel Pentium 4 clock modulation
    < > nVidia nForce2 FSB changing
    < > Transmeta LongRun
    < > VIA Cyrix III Longhaul
    --- shared options
    [ ] /proc/acpi/processor/../performance interface (deprecated)
    [ ] Relaxed speedstep capability checks

    总线类型:
  • PCI support
    PCI access mode (Any) --->强列建议选Any,系统将优先使用MMConfig,然后使用BIOS,最后使用Direct检测PCI设备。
    [ ] Message Signaled Interrupts (MSI and MSI-X)
    [ ] Legacy /proc/pci interface
    [ ] PCI device name database
  • ISA support
  • EISA support
  • Vesa Local Bus priming
  • Generic PCI/EISA bridge
  • EISA virtual root device
    [ ] EISA device name database
    [ ] MCA support
    < > NatSemi SCx200 support
    PCCARD (PCMCIA/CardBus) support --->
    PCI Hotplug Support --->
    PCCARD (PCMCIA/CardBus) support --->一般只有笔记本电脑上才会有PCMCIA插槽,如果你是台式机的话,可以不选这一项,然后跳过这一部份。
    PCI Hotplug Support --->
    < > Support for PCI Hotplug (EXPERIMENTAL)
    一般来讲只有服务器上会有热插拔的设备,如果你使用的是台式机,你可以不选择此项并跳过这一部份。

    可执行文件格式:
  • Kernel support for ELF binaries
    ELF是开放平台下最常用的二进制文件,它支持不同的硬件平台
    < > Kernel support for a.out and ECOFF binaries
    <*> Kernel support for MISC binaries

    此选项允许插入二进制的封装层到内核中,当使用Java、.NET、Python、Lisp等语言编写的程序时非常有用

    设备驱动:

    PCMCIA SUPPORT
    WIRELESS SUPPORT


    文件系统:

    <*> Second extended fs support
  • 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
    [ ] JBD (ext3) debugging support
    <*> Reiserfs support
    [ ] Enable reiserfs debug mode
    [ ] Stats in /proc/fs/reiserfs
  • ReiserFS extended attributes
  • ReiserFS POSIX Access Control Lists
  • ReiserFS Security Labels
    JFS filesystem support
  • JFS POSIX Access Control Lists
    [ ] JFS debugging
    [ ] JFS statistics
    XFS filesystem support
  • Realtime support (EXPERIMENTAL)
  • Quota support
  • Security Label support
  • POSIX ACL support
    < > Minix fs support
    < > ROM file system support
  • Quota support
    < > Old quota format support
    Quota format v2 support
  • Dnotify support
    < > Kernel automounter support
    < > Kernel automounter version 4 support (also supports v3)
    CD-ROM/DVD Filesystems --->
    DOS/FAT/NT Filesystems --->
    Pseudo filesystems --->
    Miscellaneous filesystems --->
    Network File Systems --->
    Partition Types --->
    Native Language Support --->
    Profiling support --->
    Kernel hacking --->
    Security options --->
    Cryptographic options --->
    Library routines --->

    编译内核:

    # cd /usr/src/linux-2.6

    # make mrproper

    # make menuconfig

    # make

    # make modules_install install
  • 本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    回复 支持 反对

    使用道具 举报

    发表于 2005-9-2 16:01:47 | 显示全部楼层
    编译内核的事情,还是要经过自己编译 N 次之后才知道是咋回事。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表