9.3. 建立并安装一个定制的内核

首先,让我们先来看一下建立内核的目录。所有提到的目录都在 /usr/src/sys中,也可以通过/sys访问。 有许多子目录充当了内核的不同部分,但最重要的是arch/conf, 你可以在这儿配置内核,然后进行编译。这里的arch 可能是i386alpha或者pc98 (PC硬件发展分支的一种选择, 在日本很流行). 在一个特殊的架构目录中,所有的东西都只为这个架构服务的,其他部分的代码 是与所有平台共享的;注意一下这个目录的逻辑结构,所有支持的硬件驱动程序、 文件系统、参数选项,都放在各自的目录下。FreeBSD5.X和以上版本已经支持 sparc64, 和一些其他的还在发展的架构。

Note: 如果在你的系统上没有/usr/src/sys这个目录, 那么内核源代码就没有被安装。最简单的方法是以root身份执行/stand/sysinstall, 选择Configure, 接着是Distributions, 下来src, 最后sys。 如果你已经有一张``官方''FreeBSD系统安装盘;并且你有权限使用 光驱,那么你也可以通过下面命令行来安装源代码:

# mount /cdrom
# mkdir -p /usr/src/sys
# ln -s /usr/src/sys /sys
# cat /cdrom/src/ssys.[a-d]* | tar -xzvf -

接下来, 切换到arch/conf 目录下面, 拷贝GENERIC配置文件,并给这个文件起一个容易辨认的名称, 它就是你的内核名称。例如:

# cd /usr/src/sys/i386/conf
# cp GENERIC MYKERNEL

通常,这个名称是大写的,如果你正维护着多台不同硬件的FreeBSD机器, 以你机器的域名来命名是非常好的主意。我们把它命名为MYKERNEL就是这个原因。

Tip: 保存你的内核配置文件到目录/usr/src是个坏注意. 如果你正在体验系统,有可能你打算仅仅删掉/usr/src然后从新开始. 你这样做完5秒种后你才意识到你已经删掉了你定制的内核配置文件。 不要直接编辑GENERIC,因为在你下次更新你的源码树, 你所做的内核修改会被覆盖掉。

你可以把你的内核配置文件到某个地方,然后建立符号链接到i386目录。

例如:

# cd /usr/src/sys/i386/conf
# mkdir /root/kernels
# cp GENERIC /root/kernels/MYKERNEL   
# ln -s /root/kernels/MYKERNEL

Note: 你必须以root帐号执行这些和接下来命令,否则你会得到permission denied errors。

现在,用你喜欢的编辑器编辑MYKERNEL 。 如果你刚刚开始,那唯一能用的编辑器可能就是vi, 它由于太复杂而不在这儿介绍了,但在参考书目中有许多书会介绍到它。 然而,FreeBSD中最容易的编辑器是ee,如果你是一个初学者, 它是一个非常好的选择。你可以很自由地改变注释行来反映你的配置情况, 或和GENERIC相比所做的变化。

如果你在SunOS™或者其他BSD系统下定制过内核,那这个文件中的绝大部分将对你非常熟悉。 如果你使用的是诸如DOS这样的系统,那GENERIC配置文件看起来就非常困难, 所以在下面的 配置文件章节将慢慢地、仔细地进行介绍。

Note: 要经常检查/usr/src/UPDATING, 在你执行任何更新步骤之前, 记得用最新发布的源代码同步你的源码树 在这个文件所有重要的更新事件都会记下来;/usr/src/UPDATING总是 符合你的FreeBSD源代码版本,而且总是比手册所说的信息更加精确。

你现在必须编译内核的源代码。你可能需要执行两种方法, 这依赖于你如何重新编译内核,和你正使用的FreeBSD的版本。

方法1. 用``传统''方法建立一个内核

  1. 运行config(8)来产生内核源代码。

    # /usr/sbin/config MYKERNEL
    
  2. 切换到建立内核的目录。

    # cd ../compile/MYKERNEL
    

    对于FreeBSD 版本低于5.0,用下面的代替:

    # cd ../../compile/MYKERNEL
    
  3. 编译内核。

    # make depend
    # make
    
  4. 安装新内核。

    # make install
    

方法2. 用``新的''方法建立一个内核

  1. 切换到/usr/src 目录。

    # cd /usr/src
    
  2. 编译内核。

    # make buildkernel KERNCONF=MYKERNEL
    
  3. 安装新内核。

    # make installkernel KERNCONF=MYKERNEL
    

Note: 在FreeBSD 4.2老版本里面你必须用KERNEL= 来替换KERNCONF=。2001年2月2日以后生成的4.2-STABLE 就可以认出KERNCONF=

如果你还没有通过任何方法升级你的源码树 (你应该运行CVSup, CTM,或者使用 anoncvs), 然后你应该按下面的顺序执行: config, make depend, make, make install

新内核将会被拷贝到 /kernel 而旧的内核被移到/kernel.old。 现在,关闭系统,然后重新用你的新内核启动系统,如果出现错误,这章后面有一些 故障的解决方法。 如果新内核不能引导,请务必读一下有关如何恢复的章节.

Note: 对于FreeBSD5.0, 内核将连同他的模块安装在/boot/kernel,并且老 内核会被备份到/boot/kernel.old.和引导进程相关的其他文件比如 loader(8)以及配置文件也都安装到了/boot。 第3方的或者定制的内核模块被放在/boot/modules,用户应该意识到保持内核模块和 编译好的内核同步是非常重要的。内核模块和内核不同步将导致不稳定和错误。

Note: 如果你已经添加了新的设备(比如声卡)并且你正在运行FreeBSD 4.X或者更老的版本 你将不得不在/dev添加这些设备节点。更多的信息, 请参考章节后面的 Making Device Nodes