声明: 本手册已经被新版本代替了,不再被维护。

7. 配置内核

内容:

7.a. 时区

您首先需要选择您自己的时区,这样可以让系统知道它的位置在哪里。您可以在/usr/share/zoneinfo中找到您所在的时区,然后把它复制到/etc/localtime。请不要使用/usr/share/zoneinfo/Etc/GMT*下的时区,因为它们“名不副实”。例如,GMT-8事实上是GMT+8区。

代码 1.1: 设置时区信息

# ls /usr/share/zoneinfo
(假设您要用GMT)
# cp /usr/share/zoneinfo/GMT /etc/localtime

7.b. 安装内核源码

选择内核

Linux内核是所有发行版的核心。它位于用户程序和系统硬件之间。Gentoo提供给我们几个可选的内核源码。完整的清单参见Gentoo内核指南

我们建议你在PPC上使用gentoo-sources,它是最新的2.6版本的内核。

代码 2.1: 安装内核源码

# emerge --usepkg gentoo-sources

当您查看/usr/src时,您将会看到一个叫做linux的符号链接指向您安装的内核源码。在我们这个例子中,安装的源码指向gentoo-sources-2.6.24-r5。你的版本号可能会不同,所以请记住这点。

代码 2.2: 查看内核源码符号链接

# ls -l /usr/src/linux
lrwxrwxrwx    1 root     root           22  Mar 18 16:23 /usr/src/linux -> linux-2.6.24-gentoo-r5

现在,我们开始配置和编译您的内核。您可以用genkernel来做这件事。这将会建立一个和安装光盘所用的内核类似的通用内核。不过我们将首先说明如何“手动”配置一个内核,因为这是优化您系统环境的最佳方法。

如果您希望手动配置您的内核,点击默认:手动配置。如果您希望使用genkernel,您可以阅读备选:使用genkernel

7.c. 默认:手动配置

介绍

手动配置内核经常被Linux使用者认为是最困难的步骤。事实并非如此——当您手动配置几次内核之后,您就不会再觉得它有多么难了:)

然而,一件事情真的:在手动配置内核之前,您必须了解您的系统。您可以安装pciutils(emerge --usepkg pciutils),用其中的lspci来了解您需要的大部分信息。您现在可以在chroot的环境中运行lspci。您可以忽略任何pcilib的警告。(类似于pcilib: cannot open/sys/bus/pci/devices)。此外,您也可以在非chroot的环境执行lspci。结果相同。您还可以运行lsmod来查看安装光盘使用了哪些内核模块。(这也是个不错的提示,它可以教你该选择哪些模块)。另外一个查找哪些组件功能需要激活的好地方是检查成功启动好的内核消息日志。键入dmesg用来查看内核消息。

现在进入你的内核源代码目录,是时候来配置你的内核了。在大多数的32位PowerPC机器上首先运行make pmac32_defconfig为你的配置增加默认设置。在默认设置生成后,运行make menuconfig会出现一个基于ncurses的配置菜单。

代码 3.1: 调用menuconfig

# cd /usr/src/linux
# make pmac32_defconfig
# make menuconfig

您将会看到一些配置条目。首先我们将会列出一些您必须启用的选项(否则Gentoo将不能正常运行或者没有调整下根本不能运行)。

启用必须的选项

首先进入File Systems,选中你使用的文件系统的支持。不要将它们编译成模块,否则Gentoo将无法正常地挂载你的分区。另外选中/proc file systemVirtual memory。如果你使用一台Pegasos请确保加入对于Amiga分区的支持,或者如果你使用Apple机器时请确保加入对于Macintosh分区的支持。

代码 3.2: 选中必需的文件系统

File systems --->
  Pseudo Filesystems --->
(/proc可能被强制选上了,如果这样你会看到---)
    [*] /proc file system support
    [*] Virtual memory file system support (former shm fs)
  Partition Types --->
    [*] Advanced partition support
    [*]   Amiga partition table support
    [*]   Macintosh partition map support

(选中下面你的系统所需的一个或多个选项)
  <*> Reiserfs support
  <*> Ext3 journalling file system support
  <*> Second extended fs support
  <*> XFS filesystem support

NewWorld或OldWorld机器的用户也需要加入对于HFS的支持。OldWorld用户需要这个为了将编译好的内核复制到MacOS分区。NewWorld用户需要这个配置特殊的Apple_Bootstrap分区:

代码 3.3: 启用HFS支持

File Systems --->
  Miscellaneous filesystems --->
    <M> Apple Macintosh file system support
    <M> Apple Extended HFS file system support

如果您在使用PPPoE接入Internet或者您在使用拨号的调制解调器,您需要下面的选项:

代码 3.4: 选中PPPoE需要的驱动

Device Drivers --->
  Network device support --->
    <*> PPP (point-to-point protocol) support
    <*>   PPP support for async serial ports
    <*>   PPP support for sync tty ports

两个压缩选项不会造成什么错误,不过它们不是必需的。PPP over Ethernet选项也不是必需的,只在使用ppp并被配置成是使用核心PPPoE时才会用到它。

不要忘了在内核中包含网卡的支持!大多数新的Apple电脑使用SunGEM以太网驱动。老的iMac通常使用BMAC驱动。

代码 3.5: 选中网络驱动

Device Drivers --->
  Network device support --->
    Ethernet (10 or 100Mbit) --->
      [*] Ethernet (10 or 100Mbit)
      <*>   Generic Media Independent Interface device support
      <*>   MACE (Power Mac ethernet) support
      <*>   BMAC (G3 ethernet) support
      <*>   Sun GEM support

目前,完全的kernel preemption在PPC上仍然不稳定以及可能导致编译错误和随机段错误。我们强烈建议你不要使用这个特性。Voluntary PreemptionNo Forced Preemption都是安全的。

代码 3.6: 确保Preemptible Kernel选项是关闭的

Kernel options --->
(选择一个)
  Preemption Model 
    (X) No Forced Preemption (Server)
    (X) Voluntary Kernel Preemption (Desktop)

如果你想从Firewire启动,你需要选中这些选项。如果你不想把它们编译进内核,你需要在initrd中包含这些模块和它们的依赖关系。

代码 3.7: 支持从firewire设备启动

Device Drivers --->
  IEEE 1394 (FireWire) support --->
    <*> IEEE 1394 (FireWire) support
    <*>   OHCI-1394 support
    <*>   SBP-2 support (Harddisks etc.)

如果你想要从USB启动,你需要选中这些选项。如果你不想把它们编译进内核,你需要在iniitrd中包含这些模块和它们的依赖关系。

代码 3.8: 支持从USB设备启动

Device Drivers --->
  USB support --->
    <*> Support for Host-side USB
    <*>   OHCI HCD support
    <*>   USB Mass Storage support

不要关闭内核framebuffer支持,因为有了它才能成功启动。如果你正在使用基于NVIDIA 的芯片组,你应当使用Open Firmware framebuffer。如果你使用的是基于ATI的芯片组,你应当使用基于你的芯片组(Mach64,Rage128或Radeon)的framebuffer驱动。

代码 3.9: 选择一个Framebuffer驱动

Device Drivers --->
  Graphics support --->
    <*> Support for frame buffer devices
    [*] Open Firmware frame buffer device support
    <*> ATI Radeon display support
    <*> ATI Rage128 display support
    <*> ATI Mach64 display support
    Console display driver support --->
      <*> Framebuffer Console support

注意: 如果你选中了超过一个framebuffer设备,它可能会默认使用一个非最理想的驱动。所以,要么只使用一个framebuffer设备,要么通过在启动时附加一个视频行告诉内核要使用的驱动来指定使用哪个设备,如video=radeonfb

当你配置好你的内核后,请继续阅读编译和安装

编译和安装

现在你的内核已配置好,是时候来编译和安装它了。退出配置菜单,然后运行以下命令:

代码 3.10: 编译内核

# make && make modules_install

当你的内核编译完成之后,复制内核镜像至如下/boot目录。如果你有一个独立的启动分区,比如在Pegasos机器上,要确保其已被正常挂载。如果你用BootX来启动,我们等一下再复制内核。

Yaboot和BootX需要使用一个未被压缩的内核,这点与很多其他的引导程序不同。未压缩的内核被称为vmlinux,在内核完成编译后它将被置于/usr/src/linux中。如果你使用了一台Pegasos机器,Pegasos的firmware需要一个压缩好的名为zImage的内核,它可以在/usr/src/linux/arch/powerpc/boot/images目录中找到。

代码 3.11: 安装内核

# cd /usr/src/linux
注意,你的内核版本可能不同
(Apple/IBM)
# cp vmlinux /boot/kernel-2.6.24-gentoo-r5
(Pegasos)
# cp arch/powerpc/boot/images/zImage /boot/kernel-2.6.24-gentoo-r5 

现在请继续阅读安装独立的内核模块

7.d. 安装独立内核模块

配置模块

你应该将你想在启动时加载的模块列在/etc/modules.autoload.d/kernel-2.6中。如果你需要你也能为你的模块加上额外的选项。

要查看所有可用的模块,运行如下的find命令。不要忘记把“<kernel version>”替换成你刚编译好的内核版本:

代码 4.1: 查看所有可用的模块

# find /lib/modules/<kernel version>/ -type f -iname '*.o' -or -iname '*.ko'

比如,要自动加载3c59x模块,编辑文件kernel-2.6并在其中输入模块名,一行一个模块。

代码 4.2: 编辑/etc/modules.autoload.d/kernel-2.6

# nano -w /etc/modules.autoload.d/kernel-2.6

代码 4.3: /etc/modules.autoload.d/kernel-2.6

3c59x

请阅读配置你的系统来继续安装。

7.e. 备选:使用genkernel

现在您的内核源码树已经安装了,是时候用genkernel脚本自动编译您的内核了。genkernel是使用类似安装光盘中的内核配置来配置内核的。这表明当您用genkernel建立内核时,您的系统在启动时候将会如同安装光盘那样识别您所有的硬件。因为genkernel不需要手动配置内核,所以它对于那些不想自己编译特定内核的用户来说是一个理想的解决方案。

现在,让我们看看如何使用genkernel。首先,emerge genkernel ebuild:

代码 5.1: Emerging genkernel

# emerge --usepkg genkernel

接下来,复制安装光盘使用的内核配置到genkernel用于寻找默认内核配置的地方:

代码 5.2: 复制安装光盘的内核配置

# zcat /proc/config.gz > /usr/share/genkernel/ppc/kernel-config-2.6

如果你使用firewire或USB设备启动,你需要增加一些模块到initrd中。编辑/usr/share/genkernel/ppc/modules_load然后修改MODULES_FIREWIRE="ieee1394 ohci1394 sbp2"用以支持firewire或者是MODULES_USB="usbcore ohci-hcd ehci-hcd usb-storage"用以支持USB。

在编译你的源代码前,fstab需要轻微地调整下。fstab剩余部分会在接下来的步骤中完成,所以现在不用担心细节方面。如果你之前没有创建过一个单独的启动分区(不是bootstrap,它们是不同的),从/etc/fstab中移除掉引用/boot的那一行。在大多数Apple的机器上都需要这样做。

代码 5.3: 在没有启动分区的机器上将/boot从/etc/fstab中删掉

# nano -w /etc/fstab
删除这一行
/dev/BOOT		/boot		ext2		noauto,noatime	1 2

现在通过运行genkernel --genzimage all来编译你的内核源代码。对于Pegasos机器,我们需要使用一个不同的配置文件以及创建一个zImage,而不是Apple机器使用的vmlinux内核。注意,因为genkernel编译的内核支持大多数的硬件,所以编译需要相当一会儿的时间才能完成!

请注意,如果你放置内核的分区不是使用ext2或ext3文件系统,你可能需要使用genkernel --menuconfig all来手动配置你的内核,然后内核中(也就是说:不是作为一个模块)添加你的文件系统支持。EVMS2或LVM2的用户可能也需要添加--evms2--lvm2参数。

代码 5.4: 运行genkernel

# genkernel all

代码 5.5: 在Pegasos上运行genkernel

# genkernel --genzimage --kernel-config=/usr/share/genkernel/ppc/Pegasos all

一旦genkernel完成,一个内核、全套模块和初始root磁盘(initrd)都会被创建好。在后面文档中配置引导程序的时候,我们会使用到这个内核和initrd。写下你将来要用的内核和initrd文件的名字,在配置引导程序时你需要它们。在启动至自动检测硬件之后(就像安装CD上那样)你“真正”的系统启动前,initrd将会立即启动。同时确保复制下需要的启动参数,因为一个使用genkernel编译的内核的成功启动也需要这些。

代码 5.6: 检查创建好的内核镜像名和initrd

注意,你的内核版本可能不同
# ls /boot/kernel-genkernel-ppc-2.6.24-gentoo-r5 /boot/initramfs-genkernel-ppc-2.6.24-gentoo-r5

现在请继续阅读配置你的系统