Home | SmbFTPD | Forum |
|
第八章 编译核心 核心 (kernel) 顾名思义是整个操作系统的核心,系统一开机即加载核心,它控制了整个系统的运作,包含和硬件沟通、系统资源配置、内存管理、档案系统管理等等。 本章将介绍如何客制化一个核心,它可以缩小您的系统、增加支持的软硬件、更改系统限制等。读完本章后,您将了解下列主题:
8.1 为什么要重新编译核心 传统上,我们将所有支持的硬件、档案系统等全部放到核心中,每次有新增的硬件或功能都必须重新编译核心,并重新启动计算机。但随着支持的功能越来越多,系统核心变得越来越肥大,而重新开机以加载新加入的功能也不符合现代操作系统的需求。 目前 FreeBSD 许多可以独立出来的功能都能做成所谓的核心模块 (kernel module),当系统有需要使用该模块时,才将它加载核心中。这么做的好处就是可以让我们更快加入硬件驱动程序,更方便地加入我们想要的功能。所有可以独立出来的模块都可以编译放入核心中,然而,使用动态加载的方式和直接编入核心中各有优缺,直接编入核心中可以减少加载的时间,而动态加载可以让我们在不需要用到该功能时立即从系统中移除其所占用的资源。以 DVD 所使用的档案系统格式为例,我们平常可能很少用到 DVD,所以并未将它加入核心中。但当需要时,我们可以 kldload 这支程序来动态加载该模块,使用完毕后,也可以立即使用 kldunload 将它从核心中移除,在使用上方便许多。 我们刚安装完 FreeBSD 时,所使用的核心是一般性的核心,称之为 GENERIC kernel。为了要支持常见的软硬件,因此 GENERIC 核心中可能包含了许多我们用不到的驱动程序,也可能不支持一些特殊的硬件。例如,单单网络卡驱动程序就有数十种被加入 GERERIC 核心中,其实我们只需要使用其中一种。在硬件方面,核心中包含了太多的东西不仅会占去内存的空间,不同程序间也有可能造成冲突。 在软件方面,如果要启动 FreeBSD 的防火墙功能,或是使用 ADSL 联机 (4.4 以前的版本),都需要重新将支持这些功能的参数加到核心中。另外,如果要改变系统的效率,你必须修改核心中的参数,例如增加同时上线的人数、或最大同时开启的档案数等。当然,有的功能在 FreeBSD 中可以经由 sysctl 这个指令来修改,而毋需修改核心,但大部份的功能是一定要修改核心的。过于肥大的核心,开机需要的时间较长,所以我们可以将不必要的设定移除,以加速开机速度。 除此之外,我们常看到 FreeBSD 总部发布安全性漏洞修补程序,在完成原始码的修补之后,大多数的修补都必须重新编译核心。所以我们还是要来了解一下如何为自己量身订做一个新的核心。 请放心,编译核心并不难,其实只有几个步骤,只要依下列的方法去做,相信您对于系统核心将有更深入的了解。 8.2 修改核心 首先,您必须确认在安装 FreeBSD 时,有将所有 FreeBSD 的原始码 src 装进来。请先检查 /usr/src/sys/i386/conf/ 目录存在,您可以在这个目录中看到一个名为 GENERIC 的文字文件,GENERIC 就是安装时用的一般核心。在 FreeBSD 4.x 的版本中,这个目录下还有一个 LINT 的档案,这个档案中包含了所有可用的核心参数,您可以参考这个档以取出所需的设定加入自己的核心中。如果您使用的是 FreeBSD 5.x 以后的版本,请参考 NOTES 这个档。 如果系统中没有 /usr/src/sys 这个目录,表示您在安装时并未安装 FreeBSD 的原始码,您可以使用 sysinstall 这个指令来执行安装的选单工具,并安装原始码。执行了 sysinstall 后,请选择 [Configure] -> [Distribution] -> [src] -> [sys],即可安装核心的原始码。除了使用 sysinstall 外,您也可以先将本书所附第一张光盘放入光驱中,并使用下列指令来安装: # mount /cdrom # mkdir -p /usr/src/sys # ln -s /usr/src/sys /sys # cat /cdrom/6.0-RELEASE/src/ssys.[a-d]* | tar -xzvf - 有了核心的原始码后,我们就可以开始进行修改。首先,我们要做的就是将 GENERIC 复制一份,并修改复制的那一份。 # cd /usr/src/sys/i386/conf # cp GENERIC MYKERNEL 上面那一行指令就是把 GENERIC 复制一份叫做 MYKERNEL,新的 KERNEL 要叫什么名字你可以自己取一个比较有意义的名字。建议您不要将自己所修改的核心设定放在 /usr/src/sys/i386/conf 目录下,有时候我们可能会因为硬盘空间不足而删除 /usr/src 这个目录,或者日后进行升级时忘了备份我们编辑过的核心设定档。所以建议您将 GENERIC 复制到其它目录下,再建立一个 link 到 /usr/src/sys/i386/conf,如此一来,我们可以更方便的备份及保存设定。例如,我们可以将它复制到 /root 目录下: # cd /usr/src/sys/i386/conf # cp GENERIC /root/MYKERNEL # ln -s /root/MYKERNEL 接着就要来修改 MYKERNEL 了,请使用文字处理软件打开 MYKERNEL 后,再依文件中的说明来修改,把不必要的项目移除。必须要注意的是,核心中有的参数是互相依赖的,也就是说某些参数的存在一定要有某一行的支持。现在使用指令 ee 来修改刚才复制的核心: # ee MYKERNEL 在核心中,如果在一行的开头有"#"表示该行为批注,以下我们针对 GENERIC 核心中每一个参数的说明。 8.2.1 基本的设定
这一行是必备的,代表的是使用 i386 的计算器架构 (architecture),也就是 IBM 兼容个人计算机。FreeBSD 支持的硬件架构包含了 i386、pc98、alpha、sparc64 等。
上面这四行指的是 CPU 的类型,最近的 CPU 都是 I686_CPU。有些 CPU 如 Cyrix 233Hz CPU 或 Pentume Pro 也都是 I686。我们可以在开机后使用 dmesg 指令或参考 /var/run/dmesg.boot 来看 CPU 类型,并移除不必要的类型。
这个可以说是核心的名字,我们在开机时会看到这个字符串,建议将它修改成和您核心设定档同名,例如,MYKERNEL 或 WEBSERVER 等。
这个项目在 FreeBSD 5.x 后已经不必设定了。这是用来控制系统内部表格(internal system tables)大小的参数,它的值大约是您期望系统同一时间会上线使用的使用者数量。如果您使用的是 FreeBSD 4.5 以上的版本,建议您将它设定 0。如果设成非 0 的数字,这个值一定要设定大于四,maxusers 的值决定了处理程序所容许的最大值,20+16*maxusers 就是你将得到的所容许处理程序。 系统一开机就必须要有 18 个处理程序 (process),即便是简单的执行指令 man 又会产生 9 个 process,所以将这个值设为 64 应该是一个合理的数目。如果你的系统会出现 proc table full 的讯息的话,可以就把它设大一点,例如 128。不过现在的 FreeBSD 很聪明,您只要将它设为 0,FreeBSD 会动态分配合理的值。 值得注意的是 maxusers 的值和同时可以上线的最大使用者人数并无关系,它只是决定你的 kernel 中一些数据结构的大小,真正影响上线人数的是 pseudo-device pty。 8.2.2 一般选项
这个参数是用来将核心编辑成除错模式。加了这个参数之后,核心会包含一些除错用的信息,除非您需要做核心开发或协助测试核心程序,否则不需要加入这个参数。除错模式的核心会比一般核心庞大许多,而且也会影响系统效能。
这是传统的 FreeBSD 排程方式,它会被用来控制系统中所要执行的工作顺序。FreeBSD 5.x 之后加入新的排程方法,称之为 ULE。ULE 主要是为了 SMP 多颗 CPU 排程而设计,但您也可以用来做为一般排程使用。若您想试试 ULE 排程的功能,您可以将 SCHED_4BSD 改为 SCHED_ULE。
这个参数让 kernel 用软件的方式仿真浮点运算,如果你的 CPU 不含浮点运算器,你就必须打开此参数。486-DX 以上的 CPU 可以不需要这一行。不过 FreeBSD 所提供的一般浮点仿真器并不是十分精准,如果你没有浮点运算器却又需要最好的准确度,建议你把这一行改成 GPL_MATH_EMULATE 来使用 GNU 浮点模拟。因为 GNU 版权的关系,因此 FreeBSD 不以它来当作内定的仿真器。由于目前我们所使用的 CPU 都支持浮点运算,所以在 FreeBSD 5.x GENERAL kernel 预设并未加入这个参数。
上述这二行是因特网沟通协议,就算您不打算连上网络,至少必需保留第一个 INET 的设定,因为大多数的程序都会要求使用 lookback 网络 (就是自己的机器和自己的机器沟通)。INET6 指的是 IPv6 协议,如果您要使用 IPv6 则必需加入该参数。 8.2.3 各种档案系统的支持
这是最基本的档案系统支持,如果你是从硬盘开机的,你一定需要它。FreeBSD 5.x 已经不再需要 FFS_ROOT 这个选项了,所以如果您使用 5.x 并不会看到这一行。
使用 soft update 可以加速对硬盘的在取速度,我们必须先再核心中加入对于 soft update 的支持,再针对不同的档案分割区启动此功能。您可以打指令 mount 来查看各个分割区是否已启动 soft update,如果没有,tunefs 这个指令来启动它。我们在安装 FreeBSD 时,预设除了根目录的分割区外,其它的磁盘分割区都会将此功能打开。
FreeBSD 5.x 才加入这个选项,它是一种权限控制的功能,预设是开启的状态。一旦这个选项打开始,并开始使用档案系统之后,最好不要将它关闭,以避免奇怪的问题产生。
这个选项可以加快 FreeBSD 对于大型目录的处理速度,但将需要很大的内存空间。如果此核心是供大型服务器使用,加入这个参数可以有比较好的效能。
内存映对档案系统 (Memory-mapped Filesystem)。基本上它容许我们将一块内存空间当做档案系统来使用,以达到快速存取暂存盘的功能。例如,我们可以分割出一个 MFS 供 /tmp 使用,因为许多程序会利用 /tmp 建立暂时档案,而 MFS 是将档案系统挂在内存中,对于数据的存取会快很多。不过 FreeBSD 5.x 后已经不再使用 MFS 而改由 md-backed 档案系统所取代。
这些选项是传统的 UNIX 都支持的网络档案系统,在 FreeBSD 4.x 中,只有 NFS 及 NFS_ROOT 这二个选项。而 FreeBSD 5.x 将 NFS 分成 NFS 客户端及服务器二个选项。传统的 NFS 是使用 UDP 的方式传输。但 FreeBSD 的 NFS 支持 TCP 模式,如果您不打算使用 TCP 模式,您可以将这些选项移除。
支持 MS-DOS 档案系统。除非你每次开机都要使用 MS-DOS 档案系统,否则您可以将它移除,系统会在你使用到 MSDOS 档案系统时自动加载核心模块。除此之外,你也可以使用 mtools来存取 DOS 的软盘,这并不需要有 MSDOS 档案系统的支持。
ISO 9660 是 CD-ROM 的档案系统,如果你只是偶尔用到 CD-ROM,你可以此功能移除,同样的,系统会在使用到 CD-ROM 时自动加载核心模块。此外,当我们使用 CD-ROM 听音乐时并不需要 CD9660 的支持。CD9660_ROOT 只有当我们要拿 ISO 9660 档案系统做根目录时才需要,FreeBSD 5.x 后预设已将它移除。
处理程序档案系统,它是将一些系统信息伪装成档案系统并挂入 /proc 目录下,让一些系统监控软件 (如 ps 这个指令) 可以从中得到执行中的处理程序的信息。在 FreeBSD 5.0 以后的版本预设不再使用 /proc,大多数的监控程序也都改成不必使用 /proc 来得到系统信息。如果您使用的是 FreeBSD 5.x 以后的版本,要使用 PROCFS 还必须加入下列这一个参数:
这个参数只出现在 FreeBSD 5.x 后,FreeBSD 4.x 并无此参数。 8.2.4 软硬件兼容性设定
这是为了要和 4.3 BSD 兼容所使用的参数,请不要将它移除,否则有些应用程序可能会出现奇怪的影响。
FreeBSD 6.x 做了许多修改,为了兼容于 FreeBSD 4.x、5.x 的系统呼叫 (system call),建议您保参这个设定。
这个选项控制了开机时寻找 SCSI 设备时要延迟多久 (MILLISECONDS),预设是 5 秒。有的 SCSI 需要一段时间来进行被始化的动作,当使用 IDE 的硬盘开机时,我们可以忽略这一行。如果您是以 SCSI 硬盘开机,您可以把这一行的数字调小一点以加快开机的速度。当然,如果因此抓不到硬盘,您就必须再把这个值调高一点。
允许使用者抓取console 所印出的讯息。这个选项对于 X window 使用者尤其有用。例如,我们可以使用 xterm -C 来模拟 console,以得到 talk、write (一种在 UNIX 网络聊天的功能) 所传来的讯息,或是任何从系统发出的讯息。不过 FreeBSD 5.x 后已不再需要这个选项。
这个选项可以让我们在开机时编辑开机选项。FreeBSD 5.x 后已不再支持这二个选项,而改用 device.hints,请 man device.hints。
允许使用核心除错追踪,通常只有对于核心开发者比较有用。
这个参数提供 System V 共享内存的支持。最常使用 SYSVSHM 的是 X Windows 的 XSHM 功能,有些图形化的程序用使用它来提高执行速度。如果你使用 X Windows 或是 BBS,你一定要打开此参数。
提供 System V messages 的支持,虽然不常用到,但是它只占一点点 kernel 的空间。如果你架 bbs 站,这是一定要的啦。
提供 System V semaphores 的支持,虽然不常用到,但是它只占一点点 kernel 的空间。您可以使用 ipcs 这个指令来查看是否有应用程序使用 System V 的这些选项,例如 Postsgre SQL 就必须用到。
Real-time extensions added in the 1993 POSIX。有些程序 (如 star office) 会用到它。FreeBSD 5.x 后不再需要 P1003_1B 这个选项。
这个选项限制 ICMP 封包错误回应所使用的频宽,它可以降低我们被阻断式攻击 (denial of service packet) 的危险。如果您使用 FreeBSD 4.x,建议您保留该选项。FreeBSD 5.x 后预设已将此功能打开,所以这个选项在 6.x 已经不需要了。
这二个选项可以使用多颗 CPU,FreeBSD 5.x 后对于多颗 CPU 的支持有更好的效率,如果您只使用单颗 CPU,可以将此选项关闭。 8.2.5 总线及软盘机
所有 FreeBSD 支持的硬件一定有上述其中之一的总线,isa 总线在现在的 i386 机器上已经很少见了。而 eisa 在 586 以后的主机板已经没见过了。pci 应该是目前的主流,只要您有 pci 适配卡就必须打开此选项。
这个选项是用来支持 AGP 适配卡,大多数的显示卡都是 AGP 接口。
以上几个选项用以支持软盘机,在 FreeBSD 5.x 后只需要一个 fdc 即可。而使用 FreeBSD 4.x 时,如果您只有一个软盘机,您可以将 fd1 移除。 8.2.6 IDE 接口装置
这是 ATA 及 ATAPI 的驱动程序,如果您有 ATA 硬盘或光驱,一定要打开这个选项。如果要支持以下任何 IDE 接口装置都必须将这个选项打开。
以上装置分别是 ATA 硬盘、ATA 磁盘阵列装置、IDE 光驱、IDE 软盘机、及 IDE 磁带机。您可以将不必要的装置移除,例如 IDE 软盘机等。
这个选项用来将 ATA 控置单元设定为固定的控制编号,通常用在一些比较旧的设备上。 8.2.7 SCSI 装置
以上这些项目都是 SCSI 适配卡的驱动程序,如果您有 SCSI 适配卡,您可以使用 dmesg 去查看您的适配卡型号,并留下所需的驱动程序即可。如果您只有 IDE 设备,您可以将所有项目移除。
这些是 SCSI 接口的设备,如果您有任何 SCSI 接口的设备或是 USB 硬盘、大姆哥,一定要保留 scbus 这个 SCSI 总线的选项。ch 是 SCSI media changer (一种备份用的设备)。如果您有 SCSI 硬盘或是 USB 硬盘,请保留 da 这个选项。而 sa 及 cd 分别是 SCSI 磁带机及光驱。
以上是磁盘阵列装置,如果您没有任何磁盘阵列,可以将它们全部移除。 8.2.8 基本外围设备
atkbdc 这个选项用来控制键盘及鼠标。而 atkbd 及 psm 分别为 AT 键盘及 PS/2 鼠标的驱动程序。
这是显示卡的驱动程序。
启动时更新屏幕,屏幕保护程序会使用到它。FreeBSD 4.x 及 5.x 后所使用的选项不太一样喔。
这是预设的 console 驱动程序,如果有屏幕一定要保留这个选项。
支持 vt 200 及 vt100 等兼容终端机。
这是支持 FreeBSD 浮点运算,请勿移除。
这是用来支持 AGP 显示卡的驱动程序。
支持 APM 电源管理,在 FreeBSD 4.x 下,如果您想要在打指令 shutdown -p 时能自动关机,请将 disable 字样移除。FreeBSD 5.x 后请将 apm 该行的井字号移除。接着必须在 /etc/rc.conf 中加入下列二行:
这是用来支持 i82454 休眠待命模式。
这些是 PCMCIA 适配卡的驱动程序,如果您使用的是笔记型计算机,请保留这些项目。FreeBSD 5.x 后支持 32 bit 的 PCMCIA 接口,但 FreeBSD 4.x 不支援喔。
支持串行端口 Serial (COM) ports。在 FreeBSD 4.x 下,sio0、sio1 等分别代表着 COM1、COM2、COM3、COM4。而 FreeBSD 5.x 后只要一个 sio 即可。通常我们只有 COM1 及 COM2,如果您有内接式的调制解调器,您可能要保留 COM3 或 COM4。
这些是并列端口及其它并列端口装置 (如列表机) 的驱动程序。 8.2.9 网络卡设定
这些是网络卡的驱动程序,您可以使用 dmesg 去查看自己的网络卡型号,并保留所需要的型号设定即可。
如果您使用的是下列这些 PCI 10/100 的网络卡,请保留 MII bus 这个选项。
上列为 PCI 的网络卡,请使用 dmesg 查看您的网络卡型号,并保留所需的型号即可。请注意上列网络卡都必须要有 MII bus 的支持。
ISA接口的网络卡。如果很不幸的你的网络卡是 ISA 接口,建议你换成 PCI 的适配卡,否则你应该要先知道你使用的 irq 及 port。如果你的型号是 ed0 ,则请勿移除上述的 miibus。
这些是无线网络卡。 8.2.10 虚拟装置
这二个虚拟的装置分别用来做随机运算及 loopback 网络,请保留这二个选项。
这是系统的内存装置。
这是支持 user space 程序直接存取系统 I/O,X Windows 需要这个项目。
这是用来产生随机密码数字之类的装置。
这是用来支持以太网络,只要您有网络卡都必须保留这个项目。
sl 用以支持 SLIP,SLIP已经几乎被 PPP 所取代,ppp 可以更简单、快速的建立 modem-to-modem 联机。在 sl 后面的数字是要仿真多少条 SLIP。
支持 ppp 拨接连线。
tun 会被 ppp 所使用,如果您有拨接网络 (含 ADSL 拨号) 一定要保留这个选项。
最大的 ttys,如 telnet 同时上线最大人数,在 FreeBSD 4.x 预设是 16。你可以在 pty 的后面加上数字来提高人数,最大是 256。FreeBSD 5.x 后则毋需担心这个问题。
用来支持虚拟的 Memory disk,这是一种将某块内存拿来当成磁盘驱动器使用的虚拟装置。
支持 IPv6 和 IPv4 之间的沟通。
用以支持 IPv6 和 IPv4 之间的转换。
这是 Berkeley Packet Filter,可以让我们的网络卡支持 promiscuous mode,一些网络监控程序会需要使用这个装置,例如 tcpdump、ethereal 等。 8.2.11 USB 装置
以上为 USB 装置的驱动程序,请参考井字号之后的批注。如果您要使用 USB 2.0 的装置,请记得将 ehci 装置前面的井号移除。
这些是 USB 接口的网络卡,如果您要支持任何一种,都必须将 miisub 的选项打开。
8.3 编译与安装 8.3.1 编译新的核心 修改完核心之后,记得要先存盘,接着可以开始编译了。编译核心有二种方式,大部份的时候,我们可以任意使用这二种方法其中之一,使用第二种方式所需要的时间稍微长一点,以下是一些参考的法则:
FreeBSD 支持一种名为 CVSup 更新所有原始码的方式,更新完原始码后,要执行 make world 来重新编译所有程序,这时候就要使用方式二。 方式一: 第一种是使用传统的编译方式,以下范例所使用的核心设定档名为 MYKERNEL,请改成您所使用的档名。首先我们先使用 config 这个指令会依照我们所修改的设定档成出编译核心所需要的档案。 # cd /usr/src/sys/i386/conf # config MYKERNEL config 这个指令会产生一个编译所使用的目录,如果您在执行 config 后发现错误讯息,请检查您所修改的档案是否有问题,例如语法错误等。
接下来就要到编译用的目录下。FreeBSD 5.0 以前的目录和 5.x 后的目录不一样哦: FreeBSD 4.x: # cd ../../compile/MYKERNEL/ FreeBSD 5.x 以后: # cd ../compile/MYKERNEL/ 接下来就可以开始进行编译了: # make depend # make 上面的指令完成后,应该就完成了核心的编译。如果在过程中出现错误的讯息,注意一下错误是什么,并再次修改核心设定档。一般常见的错误可能是某一个设备的设定需要另一个设定,例如网络卡驱动程序要求 miibus,而却将它移除了。 完成了上述的步骤确定没问题时,就要安装新的核心了。使用下列指令加以安装: # make install 完成安装后,我们就可以移除编译过程所产生的档案了: 如果是 FreeBSD 4.x: # cd / ; rm -rf /usr/src/sys/compile/MYKERNEL 如果是 FreeBSD 5.x 以后: # cd / ; rm -rf /usr/src/sys/i386/compile/MYKERNEL 方式二: 在 FreeBSD 4.2-STABLE 2001年2月以后的版本,我们可以使用新的方式来编译及安装新的核心: # cd /usr/src # make buildkernel KERNCONF=MYKERNEL # make installkernel KERNCONF=MYKERNEL 安装完成后,将编译过程中使用的档案删除: # rm -rf /usr/obj/usr/src/sys/MYKERNEL 最后我们就可以重新开机了,在重新开机之前,我们多下了几个 sync 这个指令。这个指令的用意是要求系统将所有暂存在内存内的数据都写入硬盘。 # sync;sync;sync;reboot 8.3.2 新的核心有问题 万一很不幸的,你发现编完核心后,无法开机进入 FreeBSD,这时候就要使用旧的核心来开机了。 如果是 FreeBSD 4.x,请在开机时看到倒数计时的时候,按 Enter 以外的键,会出现 boot: 这时候就先打 unload 来将已加载的数据移除,再打 /kernel.old 以使用旧的核心。 boot: unload boot: /kernel.old 万一连旧的核心也无法使用时,就使用安装时的核心。 boot: /kernel.GENERIC 如果您使用的是 FreeBSD 5.x 以后,请在看到开机选单时按 6 以进入 loader 模式,并输入下列指令以使用旧的 kernel 开机: OK unload OK boot /boot/kernel.old 在 FreeBSD 4.x 下,如果你想要删除坏的核心,由于 kernel 文件有特殊的档案属性,因此必须先使用下列指令修改属性,之后才可以删除。 # chflags noschg /kernel # rm -rf /kernel 值得注意的是FreeBSD 5.x 后的 kernel 放在 /boot/kernel 目录下,而旧的核心在 /boot/kernel.old。
|
Top | Ths file was last modified: 2006 January 15 04:49:59. |
Copyright © 2002-2024 Alex Wang from www.twbsd.org. All rights reserved. |