diff --git a/zh_CN.GB2312/books/handbook/boot/chapter.sgml b/zh_CN.GB2312/books/handbook/boot/chapter.sgml
index 7ecc88fa09..e58a1aeae7 100644
--- a/zh_CN.GB2312/books/handbook/boot/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/boot/chapter.sgml
@@ -1,720 +1,720 @@
FreeBSD 引导过程
概述
引导
启动电脑以及加载操作系统的过程被称为引导过程
,
或者简称为引导
。
FreeBSD 的引导过程给用户自定义启动提供了很大的伸缩性,
您可以选择启动不同的操作系统,或者是同一系统的不同版本及内核。
本章将详细介绍您能在 FreeBSD 引导过程中设置的配置选项。
这包括了引导内核、探测设备并启动 &man.init.8; 等等之前所发生的所有事情。
这些事项一般发生在文本由白变灰时。
读完这章您将会知道:
FreeBSD 引导系统里的各项组件,
以及它们之间的交互方式.
在 FreeBSD 引导时给各组件配置选项以控制引导过程。
&man.device.hints.5;的基本知识。
只适用于x86
本章只描述了运行于 Intel x86 体系之上的 FreeBSD 的引导过程。
引导问题
启动电脑及启动和引导操作系统构成了一个有趣的两难境地。
按照定义在操作系统被启动之前计算机是无法完成任何任务的,包括运行磁盘上的程序。
如果计算机在没有操作系统的情况下不能运行来自于磁盘上的程序而操作系统又是放在磁盘上的,
那操作系统是如何启动的呢?
在 Munchausen男爵历险记 (The Adventures of
Baron Munchausen) 这本书中有一个和这个过程类似的故事,
一个人掉到了下水管道里, 然后靠着拉自己的靴襻 (bootstrap)
克服重重困难爬了出来。 在早期文献中, 多以术语
bootstrap 来指代操作系统的加载机制,
如今它逐渐被简写为 booting
。
BIOS
基本输入/输出系统 BIOS
在 x86 硬件体系中,基本输入/输出系统 (BIOS) 负责加载操作系统,
为了做到这一点,BIOS 在磁盘上寻找主引导记录 (MBR),而 MBR
必须在放置的磁盘的特定位置。BIOS 有足够的能力来读入和运行 MBR,
且假使地认为 MBR 能完成加载操作系统的剩余任务,
MBR可能需要BIOS的帮助。
Master Boot Record (MBR)
Boot Manager
Boot Loader
在MBR中的代码通常被提为引导管理器 ,
尤其是与用户交互的那类。这一类引导器通常有更多代码位于磁盘第一
轨道 或在操作系统的文件系统中。
(引导管理器有时也被称为boot loader ,
但是FreeBSD对后面的引导阶段才使用这个术语。)
流行的引导管理器包括boot0 (亦称Boot
Easy ,标准的 &os; 引导管理器)、
Grub 、GAG ,以及
LILO 。
(只有boot0 能装得进MBR。)
如果您只安装了一个操作系统,那么一个标准的 MBR 就足够了。
这个 MBR 先在磁盘上搜索可引导的(亦称“活动的”)分区,
然后运行分区上的代码以加载操作系统的其它部分。
MBR由&man.fdisk.8;安装,是一个缺省的MBR。相关文件为
/boot/mbr 。
如果您在磁盘上安装了多个操作系统那么您可以安装一个不同的
引导管理器,它能显示一张操作系统的列表,您能从中选择启动哪个。
这样的两种引导器将在下一小节中讨论。
启动系统的剩余部分被分为三个阶段。第一阶段由
MBR 执行,它只是使计算机进入特定的状态然后执行第二阶段。
第二阶段稍微干得多一些。第三阶段完成加载操作系统的任务。
工作被分为三个阶段是因为 PC 标准对第一第二阶段执行的程序的大小有所限制。
把这些任务连在一起使得 FreeBSD 可以提供更大伸缩性的加载器 (loader)。
内核
init
然后内核启动,它开始探测设备并初始化它们。
一旦内核引导进程完成任务,内核将控制权交给用户进程 &man.init.8;,
它确认磁盘是否处于可用状态。&man.init.8; 然后开始用户级资源配置:
加载文件系统启动网卡,及粗略地启动所有 FreeBSD
系统加载时经常运行的进程。
引导管理器和各引导阶段
Boot Manager
The Boot Manager
主引导记录 (MBR)
在MBR或引导管理器中的代码有时被提为引导过程的
阶段0 。这一小节半夜前面提到引导器中的两种:
boot0 和LILO 。
boot0 引导管理器:
由 FreeBSD 的安装程序以及 boot0cfg(8) 所安装的 MBR,
默认基于 /boot/boot0 。
(程序boot0 非常简单,
由于在MBR 中的程序只能有446字节长,
分区表和MBR末端的0x55AA 标识也要挤占一些空间。)
如果你已经安装boot0
并且有多个操作系统在你的硬盘上,
那么你如果您安装了 FreeBSD MBR 而且安装了多个操作系统,
则会在系统启动时看到类似下面的提示:
boot0 截屏
F1 DOS
F2 FreeBSD
F3 Linux
F4 ??
F5 Drive 1
Default: F2
目前已经知道一些其它操作系统,特别是 &windows; , 会以自己的
MBR 覆盖现有 MBR。 如果发生了这种事情, 或者您想用
FreeBSD 的 MBR 覆盖现有的 MBR,您可以使用以下的命令:
&prompt.root; fdisk -B -b /boot/boot0 device
device 是要写入 MBR
的设备名,比如 ad0
代表第一个 IDE 磁盘,ad2
代表第二个 IDE 控制器上的第一个 IDE 磁盘,
da0 代表第一个 SCSI 磁盘,等等。
抑或,如果你需要一个自行配置的MBR,请使用&man.boot0cfg.8;。
The LILO Boot Manager:
要想安装这个引导管理器并也用来引导FreeBSD,
首先启动Linux,并将以下选项加入到已有的配置文件
/etc/lilo.conf :
other=/dev/hdXY
table=/dev/hdX
loader=/boot/chain.b
label=FreeBSD
在上面的内容里,使用Linux的标示符指定了FreeBSD的主分区和驱动器,
将X 替换为Linux驱动器字母,
将Y 替换为Linux主分区号。
如果您使用的是 SCSI 驱动器,您需要将
/dev/hd 改成 /dev/sd ,
这里再次使用了 XY 的语法。
如果您安装的两个系统在同一驱动器上,loader=/boot/chain.b
选项可以去掉。现在您可以执行 /sbin/lilo -v
使修改生效;应检查屏幕上的消息确认修改。
第一阶段,/boot/boot1 ,和第二阶段,
/boot/boot2
概念上,第一,第二阶段同属于一个程序,处于磁盘的相同区域。但由于空间限制,
它们被分为两部分。可是您总是会一起安装它们。它们由安装器或
bsdlabel (见下文)复制自被组合而成的
/boot/boot 。
它们位于文件系统外,引导分区的第一轨道,从第一扇区开始。在这里 boot0,或者任何其它引导管理器,
期望找到一个程序运行,继续引导进程。
所使用的扇区数可由/boot/boot 的大小确定。
boot1 非常简单,因为它再多也只能有 512 字节,
只能识别储存着分区信息的 bsdlabel ,
及寻找执行 boot2 。
boot2 稍微有点加强,能够理解 FreeBSD
的文件系统以便于寻找里面的文件,
能提供选择内核和加载器的简单界面。
因为 loader 有着更强的功能,
提供了一套易于使用的引导配置,boot2 一般都执行 loader,
但以前它的任务是直接运行内核。
boot2 的屏幕输出
>> FreeBSD/i386 BOOT
Default: 0:ad(0,a)/boot/loader
boot:
如果您要更改已安装的 boot1 和
boot2 ,请使用命令
&man.bsdlabel.8;。
&prompt.root; bsdlabel -B diskslice
diskslice 是用于引导的磁盘和分区,
比如 ad0s1
代表第一个 IDE 磁盘上的第一个分区。
dangerously dedicated
如果您在 &man.bsdlabel.8; 命令中只使用了磁盘名,比如
ad0 ,就会破坏磁盘上的所有分区。
这当然不是您所希望的,所以在按下 回车 之前
一定要对命令进行多次确认。
第三阶段,/boot/loader
boot-loader
加载器 (loader) 是三个阶段中的最后阶段,
且是放置在文件系统之中的,一般是文件
/boot/loader 。
loader 被作为一种友好的配置方式,使用了一组内建且易用的命令集。
这些命令由一个强大的多的解释器支持构建,其本身带有复杂得多的命令集。
Loader 程序流程
初始时,loader 会探测控制台和磁盘,识别是从哪块盘引导的。
它会根据这些信息设置变量,
启动解释器以接受通过脚本或交互方式传来的用户命令。
loader
loader 配置
loader 然后会读取并运行 /boot/loader.rc ,
默认地读取 /boot/defaults/loader.conf
以设置可靠的默认变量,读取 /boot/loader.conf
对这些变量作本地修改。loader.rc
依据这些变量进行动作,加载任何被选择的模块和内核。
最后,默认地,loader 会停留 10 秒等待按键,
若没有发生中断,就开始引导内核。如果被中断,用户会得到一个命令行提示符,
在这里用户得更改变量、卸载所有模块、加载模块、最后引导
或重新引导。
Loader 内建的命令
这些是最常用的 loader 命令.对所有可用命令的解释请参见
&man.loader.8;。
autobootseconds
在给定的时间内如果没有中断发生就引导内核。它显示一个倒数计时,
默认的时间范围是 10 秒。
boot
-options
kernelname
立即按照给定的选项 (如果有的话) 和内核名
(如果是内核的) 引导内核。
boot-conf
基于变量对各种模块进行自动配置 (和引导内核时发生的一样)。
您只须记住要先使用 unload 命令,
然后修改一些变量,比如 kernel 。
help
topic
显示从文件 /boot/loader.help
读取的帮助信息。如果给定的主题是 index ,
那么列出来的是所有可用的主题。
include filename
…
通过给定的文件名处理文件。文件被读入,然后被一行一行地解释。
任何错误都会立即中止 include 命令。
load -t
type
filename
加载内核、内核模块,或者是给定类型的文件 (通过给定的文件名)。
任何在文件名后面的参数都会被传给文件。
ls -l
path
显示给定路径或者是根目录 (如果路径没有指定) 下面的文件列表。
如果指定了 -l 选项,文件大小也会显示。
lsdev -v
列出所有可以加载模块的设备。
如果指定了-v 选项,会显示出更多的细节。
lsmod -v
显示已被加载的模块。如果指明了 -v 选项,
会显示更多的细节。
more filename
显示指定的文件,每隔 LINES 停顿一次。
reboot
立即重启系统。
set variable
set
variable =value
设置 loader 的环境变量。
unload
移除所有已被加载的模块。
Loader 示例
这里有一些实际中 loader 用法的示例
single-user mode
只是简单的引导默认内核,不同的是进入单用户模式:
boot -s
卸载默认内核和模块,然后加载旧的 (或者其它) 的内核:
kernel.old
unload
load kernel.old
您可以使用被称为通用内核的 kernel.GENERIC ,
或者您以前安装的内核 kernel.old
(当您升级或配置了您自己的内核等时候)。
使用以下命令加载常用的模块和另一个内核:
unload
set kernel="kernel.old "
boot-conf
加载内核配置脚本:
load -t userconfig_script /boot/kernel.conf
内核在引导时的交互
内核
引导交互
一旦内核被 loader (一般情况下) 或者 boot2 (越过 loader) 加载,
它将检查引导标志,如果有的话,就会进行必要的动作调整。
内核
引导标志
内核引导标志
这里是一些常用的引导标志:
-a
在内核初始化时,询问作为根加载的设备。
-C
从 CDROM 引导。
-c
运行 UserConfig (引导时的内核配置器)
-s
引导进入单用户模式
-v
在内核引导过程中显示更有的信息
还有更多的引导标志,阅读 &man.boot.8;
以获取有关它们的信息。
Tom
Rhodes
Contributed by
device.hints
Device Hints
这是 FreeBSD 5.0 及其以后版本的组件,
不存在于早前的版本中。
在初始化系统启动时,&man.loader.8; 会读取
&man.device.hints.5; 文件。这个文件以变量的形式储存着内核引导信息,
有时被称为 device hints
。
设备驱动程序用device hints
对设备进行配置。
Device hints 也可以在
第三阶段的boot loader 的命令行提示符中指定。变量可以用
set 命令添加,unset 命令删除,
show 命令查看。在文件 /boot/device.hints
设置的变量亦可以在这里被覆盖。键入 boot loader
中的变量不是永久性的,在下次启动时就会被忘记。
一旦系统引导成功,&man.kenv.1; 命令可以用来清楚所有的变量。
文件 /boot/device.hints 的语法是一行一个变量,
使用#
作为注释标记。
每行是按照如下方式组织的:
hint.driver.unit.keyword="value "
第三阶段 boot loader 的语法是:
set hint.driver.unit.keyword=value
driver 是设备驱动程序名,unit
是设备驱动程序单位名,keyword 是 hint 关键字。
关键字可以由以下选项组成:
at :指明设备所绑定的总线
port :指明所使用 I/O
的起始地址。
irq :指明所使用的中断请求号。
drq :指明 DMA channel 号。
maddr :指明设备占用的物理内存地址。
flags :给设备设置各种标志位。
disabled :如果设成 1 ,
设备被禁用。
设备驱动程序能够接受更多的 hints,推荐您参看它们的联机手册。参看
&man.device.hints.5;、&man.kenv.1;、&man.loader.conf.5; 和
&man.loader.8; 联机手册以获取更多的信息。
init
Init:进程控制及初始化
一旦内核完成引导,它就把控制权交给了用户进程
&man.init.8;,它放置在 /sbin/init ,
或者 init_path 变量指定的程序路径中。
这个变量是在 loader 里面设置的。
- 自动重启队列
+ 自动重启过程
- 自动重启队列保证了可用的文件系统是稳定的。
- 如果不是,且 &man.fsck.8; 不能修复这些错误,
- &man.init.8; 会进入 单用户模式
- 以便系统管理员直接解决问题。
+ 自动重启过程会确认系统中可用的文件系统处于健康的状态。
+ 如果不是, 而且使用 &man.fsck.8; 也无法修复这些问题,
+ &man.init.8; 会进入 单用户模式
+ 以便系统管理员直接修正这些问题。
单用户模式
单用户模式
控制台
此模式可以通过
- 自动重启队列或者通过带有
+ 自动重启过程 或者通过带有
-s 选项的用户引导或通过在 loader
里设置 boot_single 变量等多种方式来达到。
- 也可以在多用户模式下调动无 reboot(-r )选项和
- halt (-h ) 选项的 &man.shutdown.8;
+ 也可以在多用户模式下调动无重启 (-r ) 选项和停机
+ (-h ) 选项的 &man.shutdown.8;
命令来进入单用户模式。
如果系统 控制台 在文件
/etc/ttys 中被设置为
不安全(insecure) ,
在初始化单用户模式前会出现要求输入 root
密码的命令行提示符。
在 /etc/ttys 文件中的不安全控制台
# name getty type status comments
#
# If console is marked "insecure", then init will ask for the root password # when going to single-user mode.
console none unknown off insecure
把控制台设置成 不安全 (insecure)
使只知道 root 密码的人才能进入单用户模式,
因为您认为控制台在物理上是不安全的。因此如果您考虑到安全性,
请选择 不安全 (insecure) ,而非
安全 (secure) 。
多用户模式
多用户模式
如果 &man.init.8; 发现您的文件系统一切正常,又或者用户在 单用户模式完成了工作,
系统就会进入多用户模式,开始系统的资源配置。
rc 文件
资源配置 (rc)
资源配置分别从文件 /etc/defaults/rc.conf 、
/etc/rc.conf 中读取默认配置和细节配置,
然后加载在文件 /etc/fstab 中提及的文件系统、
启动网络服务、启动各种系统守护进程,最后启动本地安装包的启动脚本。
&man.rc.8; 联机手册是关于资源配置的很好的参考。
- shutdown 队列
+ 关机 (shutdown) 过程
shutdown
- 由命令 &man.shutdown.8; 的控制,
+ 由命令 &man.shutdown.8; 的发起的关机过程中,
&man.init.8; 会试着运行 /etc/rc.shutdown 脚本,
- 给所有进程发送 TERM 信号,然后给不按时停止的进程发送
- KILL 信号。
+ 给所有进程发送 TERM 信号, 最后给不按时停止的进程发送
+ KILL 信号。
- 在支持电源管理的体系上关闭 FreeBSD 系统的电源,只要简单的使用命令
- shutdown -p now 立即关闭电源。使用命令
- shutdown -r now 重启 FreeBSD。要执行 &man.shutdown.8;
+ 在支持电源管理的平台上关闭 FreeBSD 系统的电源, 只要简单地使用命令
+ shutdown -p now 即可。 此外, 可以用命令
+ shutdown -r now 来重启 FreeBSD。 要执行 &man.shutdown.8;
您必须是 root 用户或 operator 组的成员。
也可以使用 &man.halt.8; 和 &man.reboot.8; 命令来关闭系统,
请参看它们的联机手册以获得更多的信息。
电源管理需要支持, 这要求内核支持
&man.acpi.4; 或以模块形式加载它。
diff --git a/zh_CN.GB2312/books/handbook/config/chapter.sgml b/zh_CN.GB2312/books/handbook/config/chapter.sgml
index b5c497dae0..fd9ff61f93 100644
--- a/zh_CN.GB2312/books/handbook/config/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/config/chapter.sgml
@@ -1,2867 +1,2870 @@
Chern
Lee
原作:
Mike
Smith
这份文档基于一份教程, 其作者是
Matt
Dillon
此外, 也参考了 tuning(7), 其作者是
设置和调整
概述
系统配置
系统优化
使用 &os; 的一个重要问题是系统配置。
正确地配置系统能充分地减少以后维护和升级系统所需的工作量。
这章将解释一些 &os; 的配置过程,包括一些可以调整的 &os;
系统的一些参数。
读完本章, 您将了解:
如何有效地利用文件系统和交换分区。
rc.conf 的基本设置以及
/usr/local/etc/rc.d 启动体系。
如何设置和测试网卡。
如何在您的网络设备上配置虚拟主机。
如何使用 /etc 下的各配置文件。
如何通过 sysctl 变量来对 &os; 系统进行调优。
怎样调整磁盘性能和修改内核限制。
在阅读本章之前,您应该了解:
了解 &unix; 和 &os; 的基础知识
()。
熟悉内核配置编译的基础知识
()。
初步配置
分区规划
分区规划
/etc
/var
/usr
基本分区
当使用 &man.bsdlabel.8; 或者 &man.sysinstall.8;
来分割您的文件系统的时候,
要记住硬盘驱动器外磁道传输数据要比从内磁道传输数据快。
因此应该将小的和经常访问的文件系统放在驱动器靠外的位置,
一些大的分区比如 /usr
应该放在比较靠里的位置。
以类似这样的顺序建立分区是一个不错的主意:root,swap,
/var ,/usr 。
/var 的大小能反映您的机器使用情况。
它用来存储邮件,日志文件和打印队列缓存,
特别是邮箱和日志文件可能会达到无法预料的大小,
这主要取决于在您的系统上有多少用户和您的日志文件可以保存多长时间。
一般大多数用户不需要一个 G 以上的空间,但要记住
/var/tmp 应该足够大来以便存储一些
packages。
/usr 分区存储很多用来系统运行所需要的文件例如
&man.ports.7; (建议这样做) 和源代码 (可选的)。安装的时候这两项都是可选的。
这个分区至少要保留两个 G 的可用空间。
当选择分区大小的时候,记住保留一些空间。
用完了一个分区的空间而在另一个分区上还有很多,
可能会导致出现一些错误。
一些用户会发现 &man.sysinstall.8; 的
Auto-defaults 自动分区有时会分配给
/var 和 / 较小的分区空间。
分区应该精确一些并且大一些。
交换分区
交换分区分配
交换分区
一般来讲,交换分区应该大约是系统内存 (RAM) 的两倍。
例如,如果机器有 128M 内存,交换文件应该是 256M。
较小内存的系统可以通过多一点地交换分区来提升性能。
不建议小于 256 兆的交换分区,并且扩充您的内存应该被考虑一下。
当交换分区最少是主内存的两倍的时候,内核的 VM (虚拟内存)
页面调度算法可以将性能调整到最好。如果您给机器添加更多内存,
配置太小的交换分区会导致 VM 页面扫描的代码效率低下。
在使用多块SCSI磁盘(或者不同控制器上的IDE磁盘)的大系统上,
建议在每个驱动器上建立交换分区(直到四个驱动器)。
交换分区应该大约一样大小。内核可以使用任意大小,
但内部数据结构则是最大交换分区的 4 倍。保持交换分区同样的大小,
可以允许内核最佳地调度交换空间来访问磁盘。
即使不太使用,分配大的交换分区也是好的,
在被迫重启之前它可以让您更容易的从一个失败的程序中恢复过来。
为什么要分区?
一些用户认为一个单独的大分区将会很好,
但是有很多原因会证明为什么这是个坏主意。首先,
每个分区有不同的分区特性,因此分开可以让文件系统调整它们。
例如,根系统和 /usr 一般只是读取,写入很少。
很多读写频繁的被放在 /var 和
/var/tmp 中。
适当的划分一个系统, 在其中使用较小的分区, 这样,
那些以写为主的分区将不会比以读为主的分区付出更高的代价。
将以写为主的分区放在靠近磁盘的边缘,
例如放在实际的大硬盘的前面代替放在分区表的后面,将会提高您需要的分区的
I/O 性能。现在可能也需要在比较大的分区上有很好的 I/O 性能,
把他们移动到磁盘外围不会带来多大的性能提升,反而把
/var 移到外面会有很好的效果。最后涉及到安全问题。
一个主要是只读的小的、整洁的根分区可以提高从一个严重的系统崩溃中恢复过来的机会。
核心配置
rc 文件
rc.conf
系统的配置信息主要位于 /etc/rc.conf 。
这个文件包含了配置信息很大的一部分,主要在系统启动的时候来配置系统,
这个名字直接说明了这点;它也是 rc*
文件的配置信息。
系统管理员应该在 rc.conf 文件中建立记录来覆盖
/etc/defaults/rc.conf 中的默认设置。
这个默认文件不应该被逐字的复制到
/etc —— 它包含的是默认值而不是一个例子。
所有特定的改变应该在 rc.conf 中。
为了降低管理成本,有很多策略可以应用在成群的应用程序中来从系统指定的配置中分离
site-wide 配置。建议的方法是将 site-wide 配置放在另一个文件中,例如
/etc/rc.conf.site ,
并且把它包含进然后把这个文件包括进只包含系统指定信息的
/etc/rc.conf 。
由于 rc.conf 可以被 &man.sh.1;
阅读,所以达到这个目的很简单,例如:
rc.conf:
. /etc/rc.conf.site
hostname="node15.example.com"
network_interfaces="fxp0 lo0"
ifconfig_fxp0="inet 10.1.1.1"
rc.conf.site:
defaultrouter="10.1.1.254"
saver="daemon"
blanktime="100"
rc.conf.site 文件会被分发给每一个使用
rsync 或相似程序的系统,同时
rc.conf 文件仍然保持独立。
使用 &man.sysinstall.8; 或者 make world
来升级系统不会覆盖 rc.conf
文件, 所以系统配置信息不会丢失。
应用程序配置
典型的,被安装的应用程序有他自己的配置文件、语法等等。
从基本系统中分开他们是很重要的以至于他们可以容易的被
package 管理工具定位和管理
/usr/local/etc
一般来说,这些文件被安装在
/usr/local/etc 。这个例子中,
一个应用程序有很多配置文件并且创建了一个子目录来存放他们。
通常,当一个 port 或者 package 被安装的时候,
配置文件示例也同样被安装了。它们通常用 .default
的后缀来标识。如果不存在这个应用程序的配置文件, 它们会通过复制
.default 文件来创建。
例如,看一下这个目下的内容 /usr/local/etc/apache :
-rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf
-rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf.default
-rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf
-rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf.default
-rw-r--r-- 1 root wheel 12205 May 20 1998 magic
-rw-r--r-- 1 root wheel 12205 May 20 1998 magic.default
-rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types
-rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types.default
-rw-r--r-- 1 root wheel 7980 May 20 1998 srm.conf
-rw-r--r-- 1 root wheel 7933 May 20 1998 srm.conf.default
文件大小显示了只有 srm.conf 改变了。以后
Apache 的升级就不会改变这个文件。
Tom
Rhodes
Contributed by
启动服务
服务
许多用户会选择使用 Ports Collection 来在 &os; 上安装第三方软件。
很多情况下这可能需要进行一些配置以便让这些软件能够在系统初始化的过程中启动。 服务,
例如 mail/postfix 或
www/apache13
就是这些需要在系统初始化时启动的软件包中的两个典型代表。
这一节解释了启动第三方软件所需要的步骤。
&os; 包含的大多数服务,例如 &man.cron.8;,
就是通过系统启动脚本启动的。 这些脚本也许会有些不同,
这取决于 &os; 版本。 但是不管怎样,
需要考虑的一个重要方面是他们的启动配置文件要能被基本启动脚本识别捕获。
在 rc.d 出现之前, 应用程序会把一个简单的启动脚本放到
/usr/local/etc/rc.d
目录中, 这个目录中的脚本会被系统初始化脚本读取。
尽管很多人已经花费了相当多的时间来把旧的配置方式融入到新系统中,
仍然有许多第三方软件需要把脚本放到上面提到的目录中。
是否使用 rc.d 会对这些脚本的执行带来一些变化。
在 &os; 5.1 之前采用的是旧式的配置,
当然, 绝大多数情况下, 新式的脚本也会工作的很好。
每个脚本都应该遵守 &os; 版本所需求的一些规定:
每个脚本必须在文件名最后添加一个 .sh
的扩展名,并且这个脚本能被系统执行。
后者可以通过 chmod 命令把权限设置为
755 来实现。
它还应该能接受 start
选项来启动程序并且接受 stop
选项来结束程序。
一个简单的脚本看起来可能会像这样:
#!/bin/sh
echo -n ' utility'
case "$1" in
start)
/usr/local/bin/utility
;;
stop)
kill -9 `cat /var/run/utility.pid`
;;
*)
echo "Usage: `basename $0` {start|stop}" >&2
exit 64
;;
esac
exit 0
这个脚本提供了 stop 和
start 两个选项, 用以操作
utility 。
可以用如下方法来启动:
&prompt.root; /usr/local/etc/rc.d/utility.sh start
现在不是所有第三方软件都需要在
rc.conf 中进行如此的配置,
不过几乎每天都有新的 port 被修改来采用这种配置方法。
您应在安装的最后阶段查看所显示的信息,
以了解某个具体的应用是否需要这样的配置。
某些第三方软件会提供启动脚本, 以便与
rc.d 配合使用;
这些内容将在下一节介绍。
扩展应用程序配置
现在 &os; 提供了 rc.d ,
这使得对应用软件的启动进行配置变得更加方便,
并提供了更多的其他功能。 例如, 使用在
rc.d 一节中所介绍的关键字,
应用程序就可以设置在某些其他服务,
例如 DNS 之后启动; 除此之外,
还可以通过 rc.conf 来指定一些额外的启动参数,
而不再需要将它们硬编码到启动脚本中。 基本的启动脚本如下所示:
#!/bin/sh
#
# PROVIDE: utility
# REQUIRE: DAEMON
# KEYWORD: shutdown
#
# DO NOT CHANGE THESE DEFAULT VALUES HERE
# SET THEM IN THE /etc/rc.conf FILE
#
utility_enable=${utility_enable-"NO"}
utility_flags=${utility_flags-""}
utility_pidfile=${utility_pidfile-"/var/run/utility.pid"}
. /etc/rc.subr
name="utility"
rcvar=`set_rcvar`
command="/usr/local/sbin/utility"
load_rc_config $name
pidfile="${utility_pidfile}"
start_cmd="echo \"Starting ${name}.\"; /usr/bin/nice -5 ${command} ${utility_flags} ${command_args}"
run_rc_command "$1"
这个脚本将保证
utility 能够在
daemon 服务之后启动。 它同时也提供了设置和跟踪
PID , 也就是进程
ID 文件的方法。
可以在 /etc/rc.conf 中加入:
utility_enable="YES"
这个新方法也使得命令行参数、包含 /etc/rc.subr
中所提供的功能, 兼容 &man.rcorder.8; 工具并提供更简单的通过
rc.conf 文件来配置的方法。
用服务来启动服务
其他服务, 例如 POP 3
服务器, IMAP , 等等,
也可以通过 &man.inetd.8; 来启动。 这一过程包括从
Ports Collection 安装相应的应用程序,
并把配置加入到 /etc/inetd.conf 文件,
或去掉当前配置中的某些注释。
如何使用和配置 inetd 在
inetd 一节中进行了更为深入的阐述。
一些情况下, 通过
&man.cron.8; 来启动系统服务也是一种可行的选择。
这种方法有很多好处, 因为 cron 会以
crontab 的文件属主身份执行那些进程。
这使得普通用户也能够执行他们的应用。
cron 工具提供了一个独有的功能, 以
@reboot 来指定时间。
这样的设置将在 &man.cron.8; 启动时运行,
通常这也是系统初始化的时候。
Tom
Rhodes
Contributed by
配置 cron
cron
配置
&os; 最有用的软件包(utilities)中的一个是 &man.cron.8;。
cron 软件在后台运行并且经常检查
/etc/crontab 文件。cron
软件也检查 /var/cron/tabs 目录,搜索新的
crontab 文件。这些 crontab
文件存储一些 cron 在特定时间执行任务的信息。
cron 程序使用两种不同类型的配置文件,
即系统 crontab 和用户 crontabs。 两种格式的唯一区别是第六个字段。
在系统 crontab 中,第六个字段是用于执行命令的用户名。
这给予了系统 crontab 以任意用户身份执行命令的能力。
在用户 crontab 中, 第六个字段是要执行的命令,
所有的命令都会以这个用户自己的身份执行;
这是一项重要的安全功能。
同其他用户一样, root 用户也可以有自己的
crontab。 它不同于
/etc/crontab (也就是系统 crontab)。
由于有系统 crontab 的存在, 通常并不需要给
root 建立单独的用户 crontab。
让我们来看一下 /etc/crontab 文件:
# /etc/crontab - root's crontab for &os;
#
# $&os;: src/etc/crontab,v 1.32 2002/11/22 16:13:39 tom Exp $
#
像大多数 &os; 配置文件一样,# 字符是注释。
这样, 就可以编写注释来说明要执行什么操作, 以及这样做的原因。
需要注意的是, 注释应该另起一行, 而不能跟命令放在同一行上,
否则它们会被看成命令的一部分。 这个文件中的空行会被忽略。
首先应该定义环境变量。等号
(= ) 字符用来定义任何环境变量,像这个例子用到了
SHELL ,PATH 和 HOME
变量。如果 shell 行被忽略掉,cron 将会用默认值
sh 。如果 PATH 变量被忽略,
那么就没有默认值并且需要指定文件绝对位置。如果 HOME
被忽略,cron 将用用执行者的 home 目录。
这一行定义了七个字段。它们是 minute 、
hour 、mday 、
month 、wday 、
who 和 command 。
它们差不多已经说明了各自的用处。Minute 是命令要运行时的分钟,Hour
跟 minute 差不多,只是用小时来表示。Mday 是每个月的天。Month 跟 hour
还有 minute 都差不多,用月份来表示。wday 字段表示星期几。
所有这些字段的值必须是数字并且用24小时制来表示。who
字段是特别的,并且只在 /etc/crontab 文件中存在。
这个字段指定了命令应该以哪个用户的身份来运行。当一个用户添加了他(她)的
crontab 文件的时候,他们就会没有这个字段选项。最后,是
command 字段。这是最后的一个字段,
所以自然就是它指定要运行的程序。
最后一行定义了上面所说的值。注意这里我们有一个
*/5 列表,紧跟着是一些 *
字符。* 字符代表开始到最后
,
也可以被解释成 每次 。所以,根据这行,
显然表明了无论在何时每隔 5 分钟以 root
身份来运行 atrun 命令。查看 &man.atrun.8;
手册页以获得 atrun 的更多信息。
命令可以有任意多个传递给它们的标志。无论怎样,
扩展到多行的命令应该用反斜线(\
)来续行。
这是每个 crontab 文件的基本设置,
虽然它们有一个不同。第六行我们指定的用户名只存在于系统
/etc/crontab 文件。这个字段在普通用户的
crontab 文件中应该被忽略。
安装 Crontab
绝对不要用这种方法来编辑/安装系统 crontab。
您需要做的只是使用自己喜欢的编辑器:
cron 程序会注意到文件发生了变化,
并立即开始使用新的版本。参见
这个 FAQ 项目 以了解进一步的情况。
要安装刚写好的用户
crontab ,
首先使用最习惯的编辑器来创建一个符合要求格式的文件,然后用
crontab 程序来完成。最常见的用法是:
&prompt.user; crontab crontab-file
在前面的例子中, crontab-file 是一个事先写好的
crontab 。
还有一个选项用来列出安装的 crontab 文件:
只要传递 -l 选项给 crontab
然后看一下输出。
用户想不用模板(已经存在的文件)而直接安装他的 crontab 文件,用
crontab -e 选项也是可以的。
它将会启动一个编辑器并且创建一个新文件,当这个文件被保存的时候,
它会自动的用 crontab 来安装这个文件。
如果您稍后想要彻底删除自己的用户 crontab
可以使用 crontab 的 -r
选项。
Tom
Rhodes
Contributed by
在 &os; 中使用 rc
在 2002 年, &os; 整合了来自 NetBSD 的
rc.d 系统, 并通过它来完成系统的初始化工作。
用户要注意在
/etc/rc.d 目录下的文件。
这里面的许多文件是用来管理基础服务的, 它们可以通过
start 、 stop ,
以及 restart 选项来控制。
举例来说, &man.sshd.8; 可以通过下面的命令来重启:
&prompt.root; /etc/rc.d/sshd restart
对其它服务的操作与此类似。 当然, 这些服务通常是在启动时根据
&man.rc.conf.5; 自动启动的。 例如, 要配置使系统启动时启动网络地址转换服务,
可以简单地通过在 /etc/rc.conf 中加入如下设置来完成:
natd_enable="YES"
如果 natd_enable="NO" 行已经存在,
只要简单的把 NO 改成
YES 即可。
rc 脚本在下次重新启动的时候会自动的装载所需要的服务,
像下面所描述的那样。
由于 rc.d
系统在系统启动/关闭时首先启动/停止服务,如果设置了适当的
/etc/rc.conf 变量,标准的
start 、stop 和
restart 选项将会执行他们的动作。例如
sshd restart 命令只在 /etc/rc.conf
中的 sshd_enable 设置成 YES
的时候工作。不管是否在 /etc/rc.conf 中设置了,要
start 、stop 或者 restart
一个服务,命令前可以加上一个one
前缀。例如要不顾当前
/etc/rc.conf 的设置重新启动
sshd ,执行下面的命令:
&prompt.root; /etc/rc.d/sshd onerestart
用选项 rcvar 可以简单来的检查
/etc/rc.conf 中用适当的 rc.d
脚本启动的服务是否被启用。从而管理员可以运行这样的程序来检查
sshd 是否真的在 /etc/rc.conf
中被启动了:
&prompt.root; /etc/rc.d/sshd rcvar
# sshd
$sshd_enable=YES
第二行 (# sshd ) 是从
sshd 命令中输出的,而不是
root 控制台。
为了确定一个服务是否真的在运行,可以用 status
选项。例如验证 sshd 是否真的启动了:
&prompt.root; /etc/rc.d/sshd status
sshd is running as pid 433.
有些时候也可以 reload 服务。
这一操作实际上是向服务发送一个信号, 来强制其重新加载配置。
多数情况下, 发给服务的会是 SIGHUP
信号。 并非所有服务都支持这一功能。
rc.d 系统不仅用于网络服务,
它也为系统初始化中的多数过程提供支持。
比如 bgfsck 文件, 当它被执行时,
将会给出下述信息:
Starting background file system checks in 60 seconds.
这个文件用做后台文件系统检查,系统初始化的时候完成。
很多系统服务依赖其他服务提供的相应功能。例如,NIS 和其他基于
RPC 的服务启动可能在 rpcbind 服务启动之前失败。
要解决这个问题,依赖关系信息和其他头信息当作注释被包含在每个启动脚本文件的前面。
程序在系统初始化时分析这些注释以决定调用其他系统服务来满足依赖关系。
下面的字句可能会包含在每个启动脚本文件的前面:
PROVIDE : 指定此文件所提供的服务的名字。
REQUIRE : 列出此服务启动之前所需要的其他服务。
此脚本提供的服务会在指定的那些服务 之后
启动。
BEFORE : 列出依赖此服务的其他服务。
此脚本提供的服务将在指定的那些服务 之前
启动。
通过这种方法,系统管理员可以容易的控制系统而不用像其他一些
&unix; 操作系统一样要用 runlevels
来控制。
更多关于 rc.d 系统的信息, 可以在
&man.rc.8; 和 &man.rc.subr.8; 联机手册中找到。
如果您有意撰写自己的 rc.d 脚本,
或对现有的脚本进行一些改进, 也可以参考
这篇文章 。
Marc
Fonvieille
Contributed by
设置网卡
网卡
配置
现在我们不可想象一台计算机没有网络连接的情况。
添加和配置一块网卡是任何 &os; 系统管理员的一项基本任务。
查找正确的驱动程序
网卡
驱动程序
在开始之前,您应该知道您的网卡类型,它用的芯片和它是 PCI
还是 ISA 网卡。&os; 支持很多种 PCI 和 ISA 网卡。
可以查看您的版本硬件兼容性列表以确定您的网卡被支持。
确认系统能够支持您的网卡之后, 您还需要为它选择合适的驱动程序。
/usr/src/sys/conf/NOTES 和
/usr/src/sys/arch /conf/NOTES
将为您提供所支持的一些网卡和芯片组的信息。
如果您怀疑驱动程序是否使所要找的那一个,
请参考驱动程序的联机手册。
联机手册将提供关于所支持的硬件更详细的信息,
甚至还包括可能发生的问题。
如果您的网卡很常见的话, 大多数时候您不需要为驱动浪费精力。
常用的网卡在 GENERIC 内核中已经支持了,
所以您的网卡在启动时就会显示出来,像是:
dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38
000ff irq 15 at device 11.0 on pci0
dc0: Ethernet address: 00:a0:cc:da:da:da
miibus0: <MII bus> on dc0
ukphy0: <Generic IEEE 802.3u media interface> on miibus0
ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30
000ff irq 11 at device 12.0 on pci0
dc1: Ethernet address: 00:a0:cc:da:da:db
miibus1: <MII bus> on dc1
ukphy1: <Generic IEEE 802.3u media interface> on miibus1
ukphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
在这个例子中,我们看到有两块使用 &man.dc.4; 驱动的网卡在系统中。
如果您的网卡没有出现在
GENERIC 中, 则需要手工加载合适的驱动程序。
要完成这项工作可以使用下面两种方法之一:
最简单的办法是用 &man.kldload.8; 加载网卡对应的内核模块。
除此之外, 通过在 /boot/loader.conf
文件中加入适当的设置, 也可以让系统在引导时自动加载这些模块。
不过, 并不是所有的网卡都能够通过这种方法提供支持;
ISA 网卡是比较典型的例子。
另外, 您也可以将网卡的支持静态联编进内核。 察看
/usr/src/sys/conf/NOTES ,
/usr/src/sys/arch /conf/NOTES
以及驱动程序的联机手册以了解需要在您的内核配置文件中加一些什么。
要了解关于重新编译内核的进一步细节, 请参见 。 如果您的卡在引导时可以被内核
(GENERIC ) 识别,
您应该不需要编译新的内核。
使用 &windows; NDIS 驱动程序
NDIS
NDISulator
&windows; 驱动程序
Microsoft Windows
Microsoft Windows
device drivers (设备驱动)
KLD (kernel loadable
object)
不幸的是, 许多厂商由于认为驱动程序会涉及许多敏感的商业机密,
至今仍不愿意将把驱动程序作为开放源代码形式发布列入他们的时间表。
因此, &os; 和其他操作系统的开发者就只剩下了两种选择:
要么经历长时间的痛苦过程来对驱动进行逆向工程,
要么使用现存的为
µsoft.windows; 平台提供的预编译版本的驱动程序。
包括参与 &os; 开发的绝大多数开发人员,
都选择了后一种方法。
得益于 Bill Paul (wpaul) 的工作, 从
&os; 5.3-RELEASE 开始, 已经可以 直接地
支持 网络驱动接口标准 (NDIS, Network Driver Interface Specification) 了。
&os; NDISulator (也被称为 Project Evil) 可以支持二进制形式的
&windows; 驱动程序, 并让它相信正在运行的是 &windows;。 由于
&man.ndis.4; 驱动使用的是用于 &windows; 的二进制形式的驱动,
因此它只能在 &i386; 和 amd64 系统上使用。
&man.ndis.4; 驱动在设计时主要提供了
PCI、 CardBus 和 PCMCIA 设备的支持,
而 USB 设备目前则没有提供支持。
要使用 NDISulator, 您需要三件东西:
内核的源代码
二进制形式的 &windowsxp; 驱动程序
(扩展名为 .SYS )
&windowsxp; 驱动程序配置文件
(扩展名为 .INF )
您需要找到用于您的卡的这些文件。 一般而言,
这些文件可以在随卡附送的 CD 或制造商的网站上找到。
在下面的例子中, 我们用
W32DRIVER.SYS 和
W32DRIVER.INF 来表示这些文件。
不能在 &os;/amd64 上使用 &windows;/i386 驱动程序。
必须使用 &windows;/amd64 驱动才能在其上正常工作。
接下来的步骤是将二进制形式的驱动程序组装成内核模块。
要完成这一任务, 需要以
root 用户的身份执行 &man.ndisgen.8;:
&prompt.root; ndisgen /path/to/W32DRIVER.INF /path/to/W32DRIVER.SYS
&man.ndisgen.8; 是一个交互式的程序,
它会提示您输入所需的一些其他的额外信息;
这些工作完成之后, 它会在当前目录生成一个内核模块文件,
这个文件可以通过下述命令来加载:
&prompt.root; kldload ./W32DRIVER.ko
除了刚刚生成的内核模块之外,
还必须加载 ndis.ko 和
if_ndis.ko 这两个内核模块, 在您加载需要
&man.ndis.4; 的模块时, 通常系统会自动完成这一操作。
如果希望手工加载它们, 则可以使用下列命令:
&prompt.root; kldload ndis
&prompt.root; kldload if_ndis
第一个命令会加载 NDIS 袖珍端口驱动封装模块,
而第二条命令则加载实际的网络接口。
现在请查看 &man.dmesg.8; 来了解是否发生了错误。
如果一切正常, 您会看到类似下面的输出:
ndis0: <Wireless-G PCI Adapter> mem 0xf4100000-0xf4101fff irq 3 at device 8.0 on pci1
ndis0: NDIS API version: 5.0
ndis0: Ethernet address: 0a:b1:2c:d3:4e:f5
ndis0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
ndis0: 11g rates: 6Mbps 9Mbps 12Mbps 18Mbps 36Mbps 48Mbps 54Mbps
这之后, 就可以像使用其它网络接口
(例如 dc0 ) 一样来使用
ndis0 设备了。
与任何其它模块一样, 您也可以配置系统,
令其在启动时自动加载 NDIS 模块。 首先, 将生成的模块
W32DRIVER.ko 复制到 /boot/modules 目录中。
接下来, 在
/boot/loader.conf 中加入:
W32DRIVER_load="YES"
配置网卡
网卡
配置
现在正确的网卡驱动程序已经装载,那么就应该配置它了。
跟其他配置一样,网卡可以在安装时用
sysinstall 来配置。
要显示您系统上的网络接口的配置,输入下列命令:
&prompt.user; ifconfig
dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
ether 00:a0:cc:da:da:da
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
dc1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
ether 00:a0:cc:da:da:db
media: Ethernet 10baseT/UTP
status: no carrier
lp0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet 127.0.0.1 netmask 0xff000000
tun0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
老版本的 &os; 可能需要在 &man.ifconfig.8; 后面接
-a 选项,需要了解更多的 &man.ifconfig.8;
语法请查阅使用手册。注意所有关于 IPv6 (inet6
等等) 的记录在这个例子里都被忽略了。
在这个例子中,显示出了下列设备:
dc0 : 第一个以太网接口
dc1 : 第二个以太网接口
lp0 : 并行端口网络接口
lo0 : 回环设备
tun0 :
ppp 使用的隧道设备
&os; 使用内核引导时检测到的网卡驱动顺序来命名网卡。例如
sis2 是系统中使用 &man.sis.4;
驱动的第三块网卡。
在这个例子中,dc0
设备启用了。主要表现在:
UP 表示这块网卡已经配置完成准备工作。
这块网卡有一个 Internet (inet ) 地址
(这个例子中是 192.168.1.3 )。
它有一个有效的子网掩码 (netmask ;
0xffffff00 等同于
255.255.255.0 )。
它有一个有效的广播地址 (这个例子中是
192.168.1.255 )。
网卡的 MAC (ether ) 地址是
00:a0:cc:da:da:da
物理传输媒介模式处于自动选择状态
(media: Ethernet autoselect
(100baseTX <full-duplex>) )。我们看到
dc1 被配置成运行在
10baseT/UTP 模式下。
要了解驱动媒介类型的更多信息,
请查阅它们的使用手册。
连接状态 (status )是
active ,也就是说连接信号被检测到了。对于
dc1 ,我们看到
status: no carrier 。
这通常是网线没有插好。
如果 &man.ifconfig.8; 的输出显示了类似于:
dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
ether 00:a0:cc:da:da:da
的信息,那么就是还没有配置网卡。
要配置网卡,您需要 root 权限。
网卡配置可以通过使用 &man.ifconfig.8; 命令行方式来完成,
但是这样每次启动都要做一遍。放置网卡配置信息的文件是
/etc/rc.conf 。
用您自己喜欢的编辑器打开 /etc/rc.conf 。
并且您需要为每一块系统中存在的网卡添加一行,
在我们的例子中,添加如下几行:
ifconfig_dc0="inet 192.168.1.3 netmask 255.255.255.0"
ifconfig_dc1="inet 10.0.0.1 netmask 255.255.255.0 media 10baseT/UTP"
用自己正确的设备名和地址来替换例子中的
dc0 ,dc1
等内容。您应该应该查阅网卡驱动和 &man.ifconfig.8;
的手册页来了解各选项,也要查看一下 &man.rc.conf.5;
帮助页来了解 /etc/rc.conf 的语法。
如果在安装的时候配置了网络,关于网卡的一些行可能已经存在了。
所以在添加新行前仔细检查一下 /etc/rc.conf 。
您也可能需要编辑 /etc/hosts
来添加局域网中不同的机器名称和 IP 地址,如果它们不存在,查看
&man.hosts.5; 帮助和 /usr/share/examples/etc/hosts
以获得更多信息。
测试和调试
对 /etc/rc.conf
做了必要的修改之后应该重启系统以应用对接口的修改,
并且确认系统重启后没有任何配置错误。
系统重启后就应该测试网络接口了。
测试以太网卡
网卡
测试
为了确认网卡被正确的配置了,在这里我们要做两件事情。首先,
ping 自己的网络接口,接着 ping 局域网内的其他机器。
首先测试本地接口:
&prompt.user; ping -c5 192.168.1.3
PING 192.168.1.3 (192.168.1.3): 56 data bytes
64 bytes from 192.168.1.3: icmp_seq=0 ttl=64 time=0.082 ms
64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.074 ms
64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.076 ms
64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.108 ms
64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.076 ms
--- 192.168.1.3 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms
现在我们应该 ping 局域网内的其他机器:
&prompt.user; ping -c5 192.168.1.2
PING 192.168.1.2 (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.726 ms
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.766 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.700 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.747 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.704 ms
--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms
您如果您设置了 /etc/hosts
文件,也可以用机器名来替换 192.168.1.2 。
调试
网卡
故障排除
调试硬件和软件配置一直是一件头痛的事情,
从最简单的开始可以减轻一些痛苦。
例如网线是否插好了?是否配置好了网络服务?防火墙配置正确吗?
是否使用了被 &os; 支持的网卡?
在发送错误报告之前您应该查看一下硬件说明,
升级 &os; 到最新的 STABLE 版本,
看一下邮件列表或者在 Internet 上搜索一下。
如果网卡工作了,
但性能低下,应该好好阅读一下 &man.tuning.7; 联机手册。
您也可以检查一下网络配置,
不正确的设置会导致慢速的网络连接。
一些用户可能会在一些网卡上经历一到两次
device timeouts , 这通常是正常现象。
如果经常这样甚至引起麻烦, 则应确定一下它跟其他设备没有冲突。
仔细检查网线连接, 或者换一块网卡。
有时用户会看到少量 watchdog timeout
错误。 这种情况要做的第一件事就是检查线缆连接。
一些网卡需要支持总线控制的 PCI 插槽。
在一些老的主板上,只有一个 PCI 插槽支持 (一般是 slot 0)。
检查网卡和主板说明书来确定是不是这个问题。
No route to host
通常发生在如果系统不能发送一个路由到目的主机的包的时候。
这在没有指定默认路由或者网线没有插上时会发生。
检查 netstat -rn
的输出并确认有一个有效的路由能到达相应的主机。
如果没有,请查阅 。
ping: sendto: Permission denied
错误信息经常由防火墙的配置错误引起。
如果 ipfw 在内核中启用了但是没有定义规则,
那么默认的规则就是拒绝所有通讯,甚至 ping 请求!
查阅 以了解更多信息。
有时网卡性能低下或者低于平均水平,
这种情况最好把传输媒介模式从 autoselect
改变为正确的传输介质模式。
这通常对大多数硬件有用, 但可能不会解决所有人的问题。
接着,检查所有网络设置,并且阅读 &man.tuning.7; 手册页。
虚拟主机
虚拟主机
IP 别名
&os; 的一个很普通的用途是虚拟主机站点,
一个服务器虚拟成很多服务器一样提供网络服务。
这通过在一个接口上绑定多个网络地址来实现。
一个特定的网络接口有一个真实
的地址,
也可能有一些别名
地址。这些别名通常用
/etc/rc.conf 中的记录来添加。
一个 fxp0 的别名记录类似于:
ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"
记住别名记录必须从 alias0
开始并且按顺序递增(例如 _alias1 、
_alias2 )。
配置程序将会停止在第一个缺少的数字的地方。
计算别名的子网掩码是很重要的,幸运的是它很简单。
对于一个接口来说,必须有一个描述子网掩码的地址。
任何在这个网段下的地址必须有一个全是 1
的子网掩码(通常表示为
255.255.255.255 或
0xffffffff 。
举例来说, 假设使用
fxp0 连接到两个网络,
分别是 10.1.1.0 ,
其子网掩码为 255.255.255.0 ,
以及 202.0.75.16 ,
其子网掩码为 255.255.255.240 。
我们希望从 10.1.1.1
到 10.1.1.5 以及从
202.0.75.17 到
202.0.75.20 的地址能够互相访问。
如前所述, 只有两个网段中的第一个地址 (本例中,
10.0.1.1 和
202.0.75.17 ) 应使用真实的子网掩码;
其余的 (10.1.1.2
到 10.1.1.5 以及
202.0.75.18 到
202.0.75.20 ) 则必须配置为使用
255.255.255.255 作为子网掩码。
下面是根据上述描述所进行的 /etc/rc.conf
配置:
ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0"
ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255"
ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255"
ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255"
ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255"
ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240"
ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255"
ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255"
ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255"
配置文件
/etc 布局
在配置信息中有很多的目录,这些包括:
/etc
一般的系统配置信息。这儿的数据是与特定系统相关的。
/etc/defaults
系统配置文件的默认版本。
/etc/mail
额外的 &man.sendmail.8; 配置信息,其他 MTA 配置文件。
/etc/ppp
用于用户级和内核级 ppp 程序的配置。
/etc/namedb
&man.named.8; 数据的默认位置。通常 named.conf 和区域文件存放在这里。
/usr/local/etc
被安装的应用程序配置文件。可以参考每个应用程序的子目录。
/usr/local/etc/rc.d
被安装程序的 启动/停止 脚本。
/var/db
特定系统自动产生的数据库文件,像 package 数据库,位置数据库等等。
主机名
主机名
DNS
/etc/resolv.conf
resolv.conf
/etc/resolv.conf 指示了 &os; 如何访问域名系统(DNS)。
resolv.conf 中最常见的记录是:
nameserver
按顺序要查询的名字服务器的 IP 地址,最多三个。
search
搜索机器名的列表。这通常由本地机器名的域决定。
domain
本地域名。
一个典型的 resolv.conf 文件:
search example.com
nameserver 147.11.1.11
nameserver 147.11.100.30
只能使用一个 search 和
domain 选项。
如果您在使用 DHCP,&man.dhclient.8; 经常使用从 DHCP
服务器接受来的信息重写 resolv.conf 。
/etc/hosts
主机
/etc/hosts 是 Internet
早期使用的一个简单文本数据库。
它结合 DNS 和 NIS 提供名字到 IP 地址的映射。
通过局域网连接的机器可以用这个简单的命名方案来替代设置一个
&man.named.8; 服务器。另外,/etc/hosts
也可以提供一个 Internet 名称的本地纪录以减轻需要从外部查询带来的负担。
# $&os;$
#
# Host Database
# This file should contain the addresses and aliases
# for local hosts that share this file.
# In the presence of the domain name service or NIS, this file may
# not be consulted at all; see /etc/nsswitch.conf for the resolution order.
#
#
::1 localhost localhost.my.domain myname.my.domain
127.0.0.1 localhost localhost.my.domain myname.my.domain
#
# Imaginary network.
#10.0.0.2 myname.my.domain myname
#10.0.0.3 myfriend.my.domain myfriend
#
# According to RFC 1918, you can use the following IP networks for
# private nets which will never be connected to the Internet:
#
# 10.0.0.0 - 10.255.255.255
# 172.16.0.0 - 172.31.255.255
# 192.168.0.0 - 192.168.255.255
#
# In case you want to be able to connect to the Internet, you need
# real official assigned numbers. PLEASE PLEASE PLEASE do not try
# to invent your own network numbers but instead get one from your
# network provider (if any) or from the Internet Registry (ftp to
# rs.internic.net, directory `/templates').
#
/etc/hosts 用简单的格式:
[Internet address] [official hostname] [alias1] [alias2] ...
例如:
10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2
参考 &man.hosts.5; 以获得更多信息。
日志文件配置
日志文件
syslog.conf
syslog.conf
syslog.conf 是 &man.syslogd.8; 程序的配置文件。
它指出了的 syslog 哪种信息类型被存储在特定的日志文件中。
# $&os;$
#
# Spaces ARE valid field separators in this file. However,
# other *nix-like systems still insist on using tabs as field
# separators. If you are sharing this file between systems, you
# may want to use only tabs as field separators here.
# Consult the syslog.conf(5) manual page.
*.err;kern.debug;auth.notice;mail.crit /dev/console
*.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
security.* /var/log/security
mail.info /var/log/maillog
lpr.info /var/log/lpd-errs
cron.* /var/log/cron
*.err root
*.notice;news.err root
*.alert root
*.emerg *
# uncomment this to log all writes to /dev/console to /var/log/console.log
#console.info /var/log/console.log
# uncomment this to enable logging of all log messages to /var/log/all.log
#*.* /var/log/all.log
# uncomment this to enable logging to a remote log host named loghost
#*.* @loghost
# uncomment these if you're running inn
# news.crit /var/log/news/news.crit
# news.err /var/log/news/news.err
# news.notice /var/log/news/news.notice
!startslip
*.* /var/log/slip.log
!ppp
*.* /var/log/ppp.log
参考 &man.syslog.conf.5; 手册页以获得更多信息
newsyslog.conf
newsyslog.conf
newsyslog.conf 是一个通常用
&man.cron.8; 计划运行的 &man.newsyslog.8; 程序的配置文件。
&man.newsyslog.8; 指出了什么时候日志文件需要打包或者重新整理。
比如 logfile 被移动到
logfile.0 ,logfile.0
被移动到 logfile.1 等等。另外,日志文件可以用
&man.gzip.1; 来压缩,它们是这样的命名格式:
logfile.0.gz ,logfile.1.gz
等等。
newsyslog.conf
指出了哪个日志文件要被管理,要保留多少和它们什么时候被创建。
日志文件可以在它们达到一定大小或者在特定的日期被重新整理。
# configuration file for newsyslog
# $&os;$
#
# filename [owner:group] mode count size when [ZB] [/pid_file] [sig_num]
/var/log/cron 600 3 100 * Z
/var/log/amd.log 644 7 100 * Z
/var/log/kerberos.log 644 7 100 * Z
/var/log/lpd-errs 644 7 100 * Z
/var/log/maillog 644 7 * @T00 Z
/var/log/sendmail.st 644 10 * 168 B
/var/log/messages 644 5 100 * Z
/var/log/all.log 600 7 * @T00 Z
/var/log/slip.log 600 3 100 * Z
/var/log/ppp.log 600 3 100 * Z
/var/log/security 600 10 100 * Z
/var/log/wtmp 644 3 * @01T05 B
/var/log/daily.log 640 7 * @T00 Z
/var/log/weekly.log 640 5 1 $W6D0 Z
/var/log/monthly.log 640 12 * $M1D0 Z
/var/log/console.log 640 5 100 * Z
参考 &man.newsyslog.8; 手册页以获得更多信息。
sysctl.conf
sysctl.conf
sysctl
- sysctl.conf 看起来很像
- rc.conf 。它用 variable=value
- 的形式来设定值。指定的值在系统进入多用户模式之后被设定。
- 并不是所有的变量都可以在这个模式下设定。
+ sysctl.conf 和
+ rc.conf 这两个文件的风格很接近。 其中的配置均为
+ 变量=值
+ 这样的形式。 在这个文件中配置的值, 均会在系统进入多用户模式之后进行实际的修改操作。
+ 需要注意的是, 并不是所有的变量都能够在多用户模式下修改。
- 一个简单的例子举明了在 sysctl.conf
- 中关闭了重要的退出信号的日志并且让 Linux 程序知道他们其实运行在
- &os; 下面:
+ 如果希望关闭对收到致命的信号退出的进程进行记录,
+ 并阻止普通用户看到其他用户的进程, 可以在 sysctl.conf
+ 中进行下列配置:
- kern.logsigexit=0 # Do not log fatal signal exits (e.g. sig 11)
-compat.linux.osname=&os;
-compat.linux.osrelease=4.3-STABLE
+ # 不记录由于致命信号导致的进程退出 (例如信号 11,访问越界)
+kern.logsigexit=0
+
+# 阻止用户看到以其他用户 UID 身份执行的进程。
+security.bsd.see_other_uids=0
用 sysctl 进行调整
sysctl
调整
以 sysctl
&man.sysctl.8; 是一个允许您改变正在运行中的 &os;
系统的接口。它包含一些 TCP/IP 堆栈和虚拟内存系统的高级选项,
这可以让有经验的管理员提高引人注目的系统性能。用
&man.sysctl.8; 可以读取设置超过五百个系统变量。
基于这点,&man.sysctl.8; 提供两个功能:读取和修改系统设置。
查看所有可读变量:
&prompt.user; sysctl -a
读一个指定的变量,例如 kern.maxproc :
&prompt.user; sysctl kern.maxproc
kern.maxproc: 1044
要设置一个指定的变量,直接用
variable =value
这样的语法:
&prompt.root; sysctl kern.maxfiles=5000
kern.maxfiles: 2088 -> 5000
sysctl 变量的设置通常是字符串、数字或者布尔型。
(布尔型用 1 来表示'yes',用
0 来表示'no')。
如果你想在每次机器启动时自动设置某些变量,
可将它们加入到文件 /etc/sysctl.conf
之中。更多信息,请参阅手册页 &man.sysctl.conf.5; 及
。
Tom
Rhodes
Contributed by
只读的 &man.sysctl.8;
有时可能会需要修改某些只读的 &man.sysctl.8;
的值。 尽管有时不得不这样做,
但只有通过(重新)启动才能达到这样的目的。
例如一些膝上型电脑的 &man.cardbus.4;
设备不会探测内存范围,并且产生看似于这样的错误:
cbb0: Could not map register memory
device_probe_and_attach: cbb0 attach returned 12
像上面的错误通常需要修改一些只读的 &man.sysctl.8;
默认设置。要实现这点,用户可以在本地的
/boot/loader.conf.local 里面放一个
&man.sysctl.8; OIDs
。那些设置定位在
/boot/defaults/loader.conf 文件中。
修复上面的问题用户需要在刚才所说的文件中设置
hw.pci.allow_unsupported_io_range=1 。现在
&man.cardbus.4; 就会正常的工作了。
调整磁盘
Sysctl 变量
vfs.vmiodirenable
vfs.vmiodirenable
vfs.vmiodirenable sysctl
变量可以设置成0(关)或者1(开);默认是1。
这个变量控制目录是否被系统缓存。大多数目录是小的,
在系统中只使用单个片断(典型的是1K)并且在缓存中使用的更小
(典型的是512字节)。当这个变量设置为关闭 (0 ) 时,
缓存器仅仅缓存固定数量的目录,即使您有很大的内存。
而将其开启 (设置为1) 时, 则允许缓存器用 VM
页面缓存来缓存这些目录,让所有可用内存来缓存目录。
不利的是最小的用来缓存目录的核心内存是大于 512
字节的物理页面大小(通常是 4k)。
我们建议如果您在运行任何操作大量文件的程序时保持这个选项打开的默认值。
这些服务包括 web 缓存,大容量邮件系统和新闻系统。
尽管可能会浪费一些内存,但打开这个选项通常不会降低性能。
但还是应该检验一下。
vfs.write_behind
vfs.write_behind
vfs.write_behind sysctl
变量默认是 1 (打开)。
它告诉文件系统簇被收集满的时候把内容写进介质,
典型的是在写入大的连续的文件时。
主要的想法是, 如果可能对 I/O 性能会产生负面影响时,
应尽量避免让缓冲缓存被未同步缓冲区充满。
然而它可能降低处理速度并且在某些情况下您可能想要关闭它。
vfs.hirunningspace
vfs.hirunningspace
vfs.hirunningspace sysctl
变量决定了在任何给定情况下,
有多少写 I/O 被排进队列以给系统的磁盘控制器。
默认值一般是足够的,但是对有很多磁盘的机器来说您可能需要把它设置成
4M 或 5M。注意这个设置成很高的值(超过缓存器的写极限)会导致坏的性能。
不要盲目的把它设置太高!高的数值会导致同时发生的读操作的迟延。
sysctl 中还有许多与 buffer cache 和 VM页面 cache
有关的值, 一般不推荐修改它们。
虚拟内存系统已经能够很好地进行自动调整了。
vm.swap_idle_enabled
vm.swap_idle_enabled
vm.swap_idle_enabled sysctl
变量在有很多用户进入、离开系统和有很多空闲进程的大的多用户系统中很有用。
这些系统注重在空闲的内存中间产生连续压力的处理。通过
vm.swap_idle_threshold1 和
vm.swap_idle_threshold2 打开这个特性并且调整交换滞后
(在空闲时)允许您降低内存页中空闲进程的优先权,从而比正常的出页
(pageout)算法更快。这给出页守护进程带来了帮助。
除非您需要否则不要把这个选项打开,因为您所权衡的是更快地进入内存,
因而它会吃掉更多的交换和磁盘带宽。在小的系统上它会有决定性的效果,
但是在大的系统上它已经做了合适的页面调度这个选项允许 VM
系统容易的让全部的进程进出内存。
hw.ata.wc
hw.ata.wc
&os; 4.3 中默认将 IDE 的写缓存关掉了。 这会降低到 IDE
磁盘用于写入操作的带宽, 但我们认为这有助于避免硬盘厂商所引入的,
可能引致严重的数据不一致问题。 这类问题实际上是由于 IDE
硬盘就写操作完成这件事的不诚实导致的。 当启用了 IDE 写入缓存时,
IDE 硬盘驱动器不但不会按顺序将数据写到盘上, 而且当磁盘承受重载时,
它甚至会自作主张地对推迟某些块的实际写操作。 这样一来,
在系统发生崩溃或掉电时, 就会导致严重的文件系统损坏。
基于这些考虑, 我们将 &os; 的默认配置改成了更为安全的禁用 IDE
写入缓存。 然而不幸的是, 这样做导致了性能的大幅降低,
因此在后来的发行版中这个配置又改为默认启用了。
您可以通过观察 hw.ata.wc sysctl 变量,
来确认您的系统中所采用的默认值。 如果 IDE 写缓存被禁用,
您可以通过将内核变量设置为 1 来启用它。 这一操作必须在启动时通过
boot loader 来完成。 在内核启动之后尝试这么做是没有任何作用的。
要了解更多的信息,请查阅 &man.ata.4;。
SCSI_DELAY
(kern.cam.scsi_delay )
kern.cam.scsi_delay
kernel options
SCSI_DELAY
SCSI_DELAY 内核配置会缩短系统启动时间。
默认值在系统启动过程中有 15 秒的迟延时间,
这是一个足够多且可靠的值。把它减少到 5
通常也能工作(特别是现代的驱动器)。新一些的 &os;
(5.0 或更高版本) 应该用启动时刻可调整
kern.cam.scsi_delay 。
这个可调整的和内核配置选项接受的值是
毫秒 不是
秒 。
Soft Updates
Soft Updates
tunefs
&man.tunefs.8; 程序能够用来很好的调整文件系统。
这个程序有很多不同的选项,但是现在只介绍 Soft Updates
的打开和关闭,这样做:
&prompt.root; tunefs -n enable /filesystem
&prompt.root; tunefs -n disable /filesystem
在文件系统被挂载之后不能用 &man.tunefs.8; 来修改。打开
Soft Updates 的最佳时机是在单用户模式下任何分区被被挂载前。
Soft Updates 极大地改善了元数据修改的性能,
主要是文件创建和删除,通过内存缓存。我们建议您在所有的文件系统上使用
Soft Updates。应该知道 Soft Updates 的两点:首先, Soft Updates
保证了崩溃后的文件系统完整性,但是很可能有几秒钟 (甚至一分钟!)
之前的数据没有写到物理磁盘。如果您的系统崩溃了您可能会丢失很多工作。
第二,SoftUpdates 推迟文件系统块的释放时间。如果在文件系统
(例如根文件系统)快满了的情况下对系统进行大规模的升级比如
make installworld ,
可能会引起磁盘空间不足从而造成升级失败。
Soft Updates 的详细资料
Soft Updates
详细资料
有两种传统的方法来把文件系统的元数据 (meta-data) 写入磁盘。
(Meta-data更新是更新类似 inodes 或者目录这些没有内容的数据)
从前,默认方法是同步更新这些元数据(meta-data)。
如果一个目录改变了,系统在真正写到磁盘之前一直等待。
文件数据缓存(文件内容)在这之后以非同步形式写入。
这么做有利的一点是操作安全。如果更新时发生错误,元数据(meta-data)
一直处于完整状态。文件要不就被完整的创建要不根本就不创建。
如果崩溃时找不到文件的数据块,&man.fsck.8;
可以找到并且依靠把文件大小设置为 0 来修复文件系统。
另外,这么做既清楚又简单。缺点是元数据(meta-data)更新很慢。例如
rm -r 命令,依次触及目录下的所有文件,
但是每个目录的改变(删除一个文件)都要同步写入磁盘。
这包含它自己更新目录,inode 表和可能对文件分散的块的更新。
同样问题出现大的文件操作上(比如 tar -x )。
第二种方法是非同步元数据更新。这是 Linux/ext2fs 和 *BSD ufs 的
mount -o async 默认的方法。所有元数据更新也是通过缓存。
也就是它们会混合在文件内容数据更新中。
这个方法的优点是不需要等待每个元数据更新都写到磁盘上,
所以所有引起元数据更新大的操作比同步方式更快。同样,
这个方法也是清楚且简单的,所以代码中的漏洞风险很小。
缺点是不能保证文件系统的状态一致性。如果更新大量元数据时失败
(例如掉电或者按了重启按钮),文件系统会处在不可预知的状态。
系统再启动时没有机会检查文件系统的状态;inode
表更新的时候可能文件的数据块已经写入磁盘了但是相关联的目录没有,却不能用
fsck 命令来清理(因为磁盘上没有所需要的信息)。
如果文件系统修复后损坏了,唯一的选择是使用 &man.newfs.8; 并且从备份中恢复它。
这个问题通常的解决办法是使用 dirty region logging
或者 journaling
尽管它不是一贯的被使用并且有时候应用到其他的事务纪录中更好。
这种方法元数据更新依然同步写入,但是只写到磁盘的一个小区域。
过后他们将会被移动到正确的位置。因为纪录区很小,
磁盘上接近的区域磁头不需要移动很长的距离,所以这些比写同步快一些。
另外这个方法的复杂性有限,所以出现错误的机会也很少。缺点是元数据要写两次
(一次写到纪录区域,一次写到正确的区域)。正常情况下,
悲观的性能可能会发生。从另一方面来讲,
崩溃的时候所有未发生的元数据操作可以很快的在系统启动之后从记录中恢复过来。
Kirk McKusick,伯克利 FFS 的开发者,用 Soft Updates
解决了这个问题:元数据更新保存在内存中并且按照排列的顺序写入到磁盘
(有序的元数据更新
)。这样的结果是,在繁重的元数据操作中,
如果先前的更新还在内存中没有别写进磁盘,后来的更新就会捕捉到。
所以所有的目录操作在写进磁盘的时候首先在内存中执行
(数据块按照它们的位置来排列,所以它们不会在元数据前被写入)。
如果系统崩溃了这将导致一个固定的 日志回朔
:
所有不知如何写入磁盘的操作都像没有发生过一样。文件系统的一致性保持在
30 到 60 秒之前。它保证了所有正在使用的资源被标记例如块和 inodes。崩溃之后,
唯一的资源分配错误是一个实际是空闲
的资源的资源被标记为使用
。
&man.fsck.8; 可以认出这种情况并且释放不再使用的资源。它对于忽略崩溃后用
mount -f 强制挂上的文件系统的错误状态是安全的。
为了释放可能没有使用的资源,&man.fsck.8; 需要在过后的时间运行。一个主意是用
后台 fsck :系统启动的时候只有一个文件系统的
快照 被记录下来。fsck
可以在过后运行。所有文件系统可以在有错误
的时候被挂接,
所以系统可以在多用户模式下启动。接着,后台 fsck
可以在所有文件系统需要的时候启动来释放可能没有使用的资源。
(尽管这样,不用 Soft Updates 的文件系统依然需要通常的
fsck 。)
它的优点是元数据操作几乎跟非同步一样快
(也就是比需要两次元数据写操作的 logging
更快)。缺点是代码的复杂性(意味着对于丢失用户敏感数据有更多的风险)
和高的内存使用量。另外它有些特点需要知道。崩溃之后,
文件系统状态会落后
一些。同步的方法用
fsck 后在一些地方可能产生一些零字节的文件,
这些文件在用 Soft Updates 文件系统之后不会存在,
因为元数据和文件内容根本没有写进磁盘(可能发生在运行
rm 之后)。这可能在文件系统上安装大量数据时候引发问题,
没有足够的剩余空间来两次存储所有文件。
调整内核限制
调整
内核限制
文件/进程限制
kern.maxfiles
kern.maxfiles
kern.maxfiles 可以根据系统的需要适当增减。
这个变量用于指定在系统中允许的文件描述符的最大数量。
当文件描述符表满的时候,
file: table is full
会在系统消息缓冲区中反复出现, 您可以使用
dmesg 命令来观察这一现象。
每个打开的文件、 套接字和管道, 都会占用一个文件描述符。
在大型生产服务器上, 可能会轻易地用掉数千个文件描述符,
具体用量取决于服务的类型和并行启动的服务数量。
- 在早期版本的 &os; 中, kern.maxfile 的默认值,
+ 在早期版本的 &os; 中, kern.maxfiles 的默认值,
是根据您内核配置文件中的 maxusers 选项计算的。
kern.maxfiles 这个数值,
- 会与 maxusers 成比例增减。
+ 会随 maxusers 成比例地增减。
当编译定制的内核时, 按照您系统的用途来修改这个值是个好主意。
这个数字同时还决定内核的许多预设的限制值。 有时,
尽管并不会真的有 256 个用户同时连接一台生产服务器,
但对于高负载的 web 服务器而言, 却可能需要与之类似的资源。
从 FreeBSD 4.5 开始, kern.maxusers
会在系统启动时, 根据可用内存的尺寸进行计算, 在内核开始运行之后,
可以通过只读的 kern.maxusers sysctl 变量值来进行观察。
有些情况下, 可能会希望使用更大或更小一些的
kern.maxusers , 它可以以加载器变量的形式进行配置;
类似 64、 128 和 256 这样的值都并不罕见。 我们不推荐使用超过 256
的值, 除非您需要巨量的文件描述符; 根据
kern.maxusers 推算默认值的那些变量,
一般都可以在引导甚至运行时通过 /boot/loader.conf
(请参见 &man.loader.conf.5; 联机手册或
/boot/defaults/loader.conf 文件来获得相关的指导)
或这篇文档的其余部分所介绍的方式来调整。 而在
FreeBSD 4.4 值钱的版本, 则只能通过内核的 &man.config.8;
选项 maxusers 来加以调整。
在较早的版本中, 如果您明确地将
maxusers 设置为
0 , 则系统会自动地根据硬件配置来确定这个值。
自动调整算法会将
maxusers 设置为与主存的数量一样,
或者取其下限 32 或上限 384。
。 在 &os; 5.X 和更高版本中, maxusers
如果不指定的话, 就会取默认值 0 。 如果希望自行管理
maxusers , 则应配置一个不低于 4 的值,
特别是使用 X Window System 或编译软件的时候。
这样做的原因是, maxusers
所决定的一个最为重要的表的尺寸会影响最大进程数,
这个数值将是 20 + 16 *
maxusers 。 因此如果将 maxusers 设置为 1,
您就只能同时运行 36 个进程, 这还包括了 18
个左右的系统引导时启动的进程, 以及 15 个左右的,
在您启动 X Window System 时所引发的进程。 即使是简单的任务,
如阅读联机手册, 也需要启动多至九个的进程, 用以过滤、
解压缩, 并显示它。 将
maxusers 设为 64 将允许您同时执行最多 1044
个进程, 这几乎足以满足任何需要了。 不过,
如果您看在启动其它程序, 或运行用以支持大量用户的服务 (例如
ftp.FreeBSD.org ) 时,
看到令人担忧的 proc table
full 错误, 就应该提高这一数值,
并重新联编内核。
maxusers 并 不能
限制实际能够登录到您系统上来的用户的数量。
它的主要作用是根据您可能支持的用户数量来为一系列系统数据表设置合理的尺寸,
以便提供支持他们所需运行的进程资源。 而 能够
限制并发远程以及 X 终端窗口数量的变量则是 pseudo-device pty
16 。 对于 &os; 5.X, 您不再需要为这一数字而担心,
因为 &man.pty.4; 驱动已经是
自动复制的
了; 您只需在配置文件中指定
device pty 即可。
kern.ipc.somaxconn
kern.ipc.somaxconn
kern.ipc.somaxconn sysctl 变量
限制了接收新 TCP 连接侦听队列的大小。对于一个经常处理新连接的高负载
web服务环境来说,默认的 128 太小了。
大多数环境这个值建议增加到 1024 或者更多。
服务进程会自己限制侦听队列的大小(例如 &man.sendmail.8;
或者 Apache ),
常常在它们的配置文件中有设置队列大小的选项。
大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。
网络限制
NMBCLUSTERS 内核配置选项指出了系统可用的网络Mbuf的数量。
一个高流量的服务器使用一个小数目的网络缓存会影响 &os; 的性能。
每个 cluster 可能需要2K内存,所以一个1024的值需要在内核中给网络缓存保留2M内存。
可以用简单的方法计算出来需要多少网络缓存。
如果您有一个同时发生1000个以上连接的web服务器,
并且每个连接用掉16K接收和发送缓存, 就需要大概32M网络缓存来确保web服务器的工作。
一个好的简单计算方法是乘以2,所以2x32Mb/2Kb=64MB/2kb=32768。
我们建议在有大量内存的机器上把这个值设置在4096到32768之间。
没有必要把它设置成任意太高的值,它会在启动时引起崩溃。
&man.netstat.1; 的 -m 选项可以用来观察网络cluster使用情况。
kern.ipc.nmbclusters 可以用来在启动时刻调节这个。
仅仅在旧版本的 &os; 需要使用 NMBCLUSTERS
&man.config.8; 选项。
经常使用 &man.sendfile.2; 系统调用的繁忙的服务器,
有必要通过 NSFBUFS 内核选项或者在
/boot/loader.conf (查看 &man.loader.8; 以获得更多细节)
中设置它的值来调节 &man.sendfile.2; 缓存数量。
这个参数需要调节的普通原因是在进程中看到 sfbufa
状态。sysctl kern.ipc.nsfbufs
变量在内核配置变量中是只读的。 这个参数是由 kern.maxusers
决定的,然而它可能有必有因此而调整。
即使一个套接字被标记成非阻塞,在这个非阻塞的套接字上呼叫
&man.sendfile.2; 可能导致 &man.sendfile.2; 呼叫阻塞直到有足够的
struct sf_buf 可用。
net.inet.ip.portrange.*
net.inet.ip.portrange.*
net.inet.ip.portrange.* sysctl
变量自动的控制绑定在 TCP 和 UDP 套接字上的端口范围。
这里有三个范围:一个低端范围,一个默认范围和一个高端范围。
大多数网络程序分别使用由 net.inet.ip.portrange.first
和 net.inet.ip.portrange.last 控制的从 1024 到 5000
的默认范围。端口范围用作对外连接,并且某些情况可能用完系统的端口,
这经常发生在运行一个高负荷 web 代理服务器的时候。
这个端口范围不是用来限制主要的例如 web
服务器进入连接或者有固定端口例如邮件传递对外连接的。
有时您可能用完了端口,那就建议适当的增加
net.inet.ip.portrange.last 。
10000 、20000 或者
30000 可能是适当的值。
更改端口范围的时候也要考虑到防火墙。 一些防火墙会阻止端口的大部分范围
(通常是低范围的端口)并且用高端口进行对外连接(—)。
基于这个问题建议不要把 net.inet.ip.portrange.first
设的太小。
TCP 带宽迟延(Bandwidth Delay Product)
限制 TCP 带宽延迟积
net.inet.tcp.inflight.enable
限制 TCP 带宽延迟积和 NetBSD 的 TCP/Vegas 类似。
它可以通过将 sysctl 变量
net.inet.tcp.inflight.enable
设置成 1 来启用。
系统将尝试计算每一个连接的带宽延迟积,
并将排队的数据量限制在恰好能保持最优吞吐量的水平上。
这一特性在您的服务器同时向使用普通调制解调器,
千兆以太网, 乃至更高速度的光与网络连接
(或其他带宽延迟积很大的连接) 的时候尤为重要,
特别是当您同时使用滑动窗缩放, 或使用了大的发送窗口的时候。
如果启用了这个选项, 您还应该把
net.inet.tcp.inflight.debug 设置为
0 (禁用调试),
对于生产环境而言, 将 net.inet.tcp.inflight.min
设置成至少
6144 会很有好处。 然而, 需要注意的是,
这个值设置过大事实上相当于禁用了连接带宽延迟积限制功能。
这个限制特性减少了在路由和交换包队列的堵塞数据数量,
也减少了在本地主机接口队列阻塞的数据的数量。在少数的等候队列中、
交互式连接,尤其是通过慢速的调制解调器,也能用低的
往返时间 操作。但是,注意这只影响到数据发送
(上载/服务端)。对数据接收(下载)没有效果。
调整 net.inet.tcp.inflight.stab 是
不 推荐的。 这个参数的默认值是
20, 表示把 2 个最大包加入到带宽延迟积窗口的计算中。
额外的窗口似的算法更为稳定, 并改善对于多变网络环境的相应能力,
但也会导致慢速连接下的 ping 时间增长 (尽管还是会比没有使用
inflight 算法低许多)。 对于这些情形,
您可能会希望把这个参数减少到 15, 10, 或 5;
并可能因此而不得不减少
net.inet.tcp.inflight.min (比如说,
3500) 来得到希望的效果。 减少这些参数的值,
只应作为最后不得已时的手段来使用。
虚拟内存
kern.maxvnodes
vnode 是对文件或目录的一种内部表达。
因此, 增加可以被操作系统利用的 vnode 数量将降低磁盘的 I/O。
一般而言, 这是由操作系统自行完成的, 也不需要加以修改。
但在某些时候磁盘 I/O 会成为瓶颈, 而系统的 vnode 不足,
则这一配置应被增加。 此时需要考虑是非活跃和空闲内存的数量。
要查看当前在用的 vnode 数量:
&prompt.root; sysctl vfs.numvnodes
vfs.numvnodes: 91349
要查看最大可用的 vnode 数量:
&prompt.root; sysctl kern.maxvnodes
kern.maxvnodes: 100000
如果当前的 vnode 用量接近最大值, 则将
kern.maxvnodes 值增大 1,000
可能是个好主意。 您应继续查看
vfs.numvnodes 的数值,
如果它再次攀升到接近最大值的程度,
仍需继续提高 kern.maxvnodes 。
在 &man.top.1; 中显示的内存用量应有显著变化,
更多内存会处于活跃 (active) 状态。
添加交换空间
不管您计划得如何好,有时候系统并不像您所期待的那样运行。
如果您发现需要更多的交换空间,添加它很简单。
有三种方法增加交换空间:添加一块新的硬盘驱动器、通过
NFS 使用交换空间和在一个现有的分区上创建一个交换文件。
要了解关于如何加密交换区, 相关配置, 以及为什么要这样做, 请参阅手册的
。
在新的硬盘驱动器上使用交换空间
这是添加交换空间最好的方法,
当然为了达到这个目的需要添加一块硬盘。
毕竟您总是可以使用另一块磁盘。如果能这么做,
重新阅读一下手册中关于交换空间的 来了解如何最优地安排交换空间。
通过 NFS 交换
除非没有可以用作交换空间的本地硬盘时,
否则不推荐您使用 NFS 来作为交换空间使用。
NFS 交换会受到可用网络带宽限制并且增加 NFS 服务器的负担。
交换文件
您可以创建一个指定大小的文件用来当作交换文件。
在我们的例子中我们将会使用叫做 /usr/swap0
的 64MB 大小的文件。当然您也可以使用任何您所希望的名字。
在 &os; 中创建交换文件
确认您的内核配置包含虚拟磁盘(Memory disk)驱动
(&man.md.4;)。它在 GENERIC 内核中是默认的。
device md # Memory "disks"
创建一个交换文件(/usr/swap0 ):
&prompt.root; dd if=/dev/zero of=/usr/swap0 bs=1024k count=64
赋予它(/usr/swap0 )一个适当的权限:
&prompt.root; chmod 0600 /usr/swap0
在 /etc/rc.conf 中启用交换文件:
swapfile="/usr/swap0" # Set to name of swapfile if aux swapfile desired.
通过重新启动机器或下面的命令使交换文件立刻生效:
&prompt.root; mdconfig -a -t vnode -f /usr/swap0 -u 0 && swapon /dev/md0
Hiten
Pandya
Written by
Tom
Rhodes
电源和资源管理
以有效的方式利用硬件资源是非常重要的。在提出 ACPI
之前,管理电源使用和系统散热对操作系统是很困难的。硬件被嵌入的
BIOS 接口管理,例如可插拔 BIOS
(PNPBIOS) 或者高级电源管理(APM)
等等。电源和资源管理是现代操作系统的关键组成部分。
例如您可能当系统温度过高的时候让您的操作系统能监视到
(并且可能提醒您)。
在 &os; 使用手册的这一章节,我们将提供 ACPI
全面的信息。 参考资料会在末尾给出。
什么是 ACPI?
ACPI
APM
高级配置和电源接口 (ACPI )
是一个业界标准的硬件资源和电源管理接口 (因此而得名) 。它是
操作系统控制的配置和电源管理(Operating System-directed
configuration and Power Management) ,也就是说,
它给操作系统(OS )提供了更多的控制和弹性。
在引入 ACPI 之前,
现代操作系统使得目前即插即用接口的局限性更加 凸现
出来。
ACPI 是 APM(高级电源管理)
的直接继承者。
高级电源管理 (APM) 的缺点
高级电源管理 (APM)
是一种基于系统目前的活动控制其电源使用的机制。
APM BIOS 由 (系统的) 制造商提供, 并且是硬件平台专属的。
在 OS 中的 APM 驱动作为中介来访问 APM 软件接口 ,
从而实现对电源使用的管理。
APM 有四个主要的问题。 首先, 电源管理是通过
(制造商专属的) BIOS 实现的, 而 OS 则完全不了解其细节。
例如, 用户在 APM BIOS 中设置了硬盘驱动器的空闲等待数值,
当超过这一空闲时间的限制时, 它 (BIOS) 将会减慢硬盘驱动器的速度,
而不会征求 OS 的同意。 第二, APM 逻辑是嵌入
BIOS 的, 因此它是在 OS 的控制之外运转的。
这意味着用户只能通过通过刷新他们 ROM 中的 APM BIOS
才能够解决某些问题; 而这是一个很危险的操作,
因为它可能使系统进入一个无法恢复的状态。 第三, APM
是一种制造商专属的技术, 也就是说有很多第三方的
(重复的工作) 以及 bugs, 如果在一个制造商的 BIOS 中有,
也未必会在其他的产品中解决。 最后但绝不是最小的问题, APM
BIOS 没有为实现复杂的电源策略提供足够的余地,
也无法实现能够非常适合具体机器的策略。
即插即用 BIOS (PNPBIOS)
在很多时候都是不可靠的。 PNPBIOS 是 16-位 的技术,
因此 OS 不得不使用 16-位 模拟才能够与 PNPBIOS 的方法
接口
。
&os; APM 驱动在 &man.apm.4; 手册页中有描述。
配置 ACPI
acpi.ko 驱动默认的在启动时通过
&man.loader.8; 被加载并且 不应该
被编译进内核。原因是这个模块跟系统很容易的工作在一起,比方说不用为了
acpi.ko 而重新编译内核。
这对更简单的测试来说很有利。另一个原因是系统启动后再启动
ACPI 不是很有用,并且在一些情况下会失败。
拿不准的话只要全部禁止 ACPI 即可。
这个驱动不应该而且不能被卸载,因为系统通过它跟各种各样的硬件打交道。
ACPI 可以通过 &man.acpiconf.8; 来禁止。实际上通过
ACPI 的交互可以通过 &man.acpiconf.8; 来完成。
简单的说,如果任何关于 ACPI 的信息在
&man.dmesg.8; 的输出中,那么它很可能已经运行了。
ACPI 和 APM
不能共存并且应该份开始用。后来装载的如果注意到另一个在运行将会终止执行。
最简单的表现形式是,ACPI 可以通过
&man.acpiconf.8; 的 -s 标志和一个
1-5 的选项来使系统进入休眠状态。
5 选项将会像下面动作一样让系统软关机:
&prompt.root; halt -p
其他选项也是可行的。查看 &man.acpiconf.8; 手册页以获得更多信息。
Nate
Lawson
撰写人:
Peter
Schultz
协力:
Tom
Rhodes
使用和调试 &os; ACPI
ACPI
problems
ACPI 是一种全新的发现设备、 管理电源使用、
以及提供过去由 BIOS 管理的访问不同硬件的标准化方法。
让 ACPI 在各种系统上都能正确使用的工作一直在进行,
但许多主板的 ACPI 机器语言
(AML ) 字节代码中的 bug, &os; 的内核中子系统设计的不完善,
以及 &intel;
ACPI-CA 解释器中的 bug 仍然不时会出现。
这份文档期望能够帮助您协助 &os;
ACPI 的维护人员来找到您所观察到的问题的根源,
并通过调试找到其解决方法。 感谢您阅读这份文档,
我们也希望能够解决您的系统上的问题。
提交调试信息
在提交问题之前, 请确认您已经在运行最新的
BIOS 版本, 此外, 也包括嵌入式控制器的固件版本。
如果您希望提交一个问题,
请确保将下述信息发到
freebsd-acpi@FreeBSD.org :
问题行为的描述, 包括系统类型、型号,以及任何触发问题的相关信息。
另外, 请注意尽可能准确地描述这一问题是否对您是陌生的。
在 boot
-v
之后得到的 &man.dmesg.8; 输出, 以及任何在重现
bug 时出现的错误信息。
在禁用了 ACPI 之后的 boot
-v
的 &man.dmesg.8; 输出, 如果您发现禁用 ACPI
能够帮助消除问题。
来自 sysctl hw.acpi 的输出。
这也是找到您的系统所提供的功能的一种好办法。
能够得到您的 ACPI Source Language
(ASL ) 的 URL 。
不要 把
ASL 直接发到邮件列表中,
因为它们可能非常大。
为了得到 ASL
您可以运行这个命令:
&prompt.root; acpidump -t -d > name -system .asl
(把
name 改为您的登录名,
并把
system 改为您的硬件制造商及其型号。 例如:
njl-FooCo6000.asl )
许多开发者也会订阅 &a.current;
但还是请发到 &a.acpi.name; 这样它会被更多人看到。
请耐心等待, 因为我们都有全职的其他工作。
如果您的 bug 不是显而易见的, 我们可能会要求您通过
&man.send-pr.1; 来提交一个 PR 。
在输入 PR 时,请将同样的信息包含进去。
这将帮助我们来追踪和解决问题。
不要在给 &a.acpi.name; 写信之前发送
PR 因为我们把它当作已知文体的备忘录而不是报告机制。
您的问题很可能已经被其他人报告过了。
背景
ACPI
ACPI 存在于采用
ia32 (x86)、 ia64 (安腾)、 以及 amd64 (AMD) 架构的所有现代计算机上。
完整的标准具有大量的各式功能, 包括
CPU 性能管理、 电源控制、 温度监控、
电池系统、 嵌入式控制器以及总线枚举。
绝大多数系统实现比完整标准的功能要少一些。 例如,
桌面系统通常只实现总线枚举部分, 而笔记本则通常支持降温和电源管理功能。
笔记本通常还提供休眠和唤醒支持, 并提供与此适应的复杂功能。
符合 ACPI 的系统中有许多组件。
BIOS 和芯片组制造商提供一些固定的表
(例如, FADT ) 在存储器中, 以提供类似
APIC 映射 (用于 SMP )、
配置寄存器、 以及简单的配置值等等。 另外,
一个字节代码 (bytecode) 表
(系统区别描述表
DSDT )
则提供了通过树状命名空间来指定设备及其功能的方法。
ACPI 驱动必须要处理固定表,
实现字节码解释器, 并修改驱动程序和内核, 以接受来自
ACPI 子系统的信息。 对于 &os;, &intel;
提供了一个解释器 (ACPI-CA ),
它在 Linux 和 NetBSD 也可以使用。
ACPI-CA 源代码可以在
src/sys/contrib/dev/acpica
找到。 用于在 &os; 中允许 ACPI-CA
正确运转的代码则在
src/sys/dev/acpica/Osd 。
最后, 用于实现 ACPI 设备的驱动可以在
src/sys/dev/acpica 找到。
常见问题
ACPI
problems
要让 ACPI 正常工作,
它的每一部分都必须工作正常。 下面是一些常见的问题,
按照出新的频繁程度排序, 并给出了一些绕过或修正它们的方法。
鼠标问题
某些时候, 唤醒操作会导致鼠标不再正常工作。
已知的绕过这一问题的方法, 是在
/boot/loader.conf 文件中添加
hint.psm.0.flags="0x3000" 设置。
如果这样做不能解决问题, 请考虑按前面介绍的方法提交问题报告。
休眠/唤醒
ACPI 提供了三种休眠到
RAM (STR ) 的状态,
S1 -S3 ,
以及一个休眠到磁盘的状态 (STD ),
称作 S4 。 S5 是
软关机
同时也是系统接好电源但没有开机时的正常状态。
S4 实际上可以用两种不同的方法来实现。
S4 BIOS 是一种由
BIOS 辅助的挂起到磁盘方法, 而
S4 OS
则是完全由操作系统实现的。
可以使用 sysctl hw.acpi
来查看与休眠有关的项目。
这里是我的 Thinkpad 上得到的结果。
hw.acpi.supported_sleep_state: S3 S4 S5
hw.acpi.s4bios: 0
这表示我可以使用 acpiconf -s
来测试 S3 ,
S4 OS , 以及
S5 。 如果 s4bios 是一
(1 ), 则可以使用
S4 BIOS
来代替 S4
OS 。
当测试休眠/唤醒时, 从
S1 开始, 如果它被支持的话。
这个状态是最可能正常工作的状态, 因为它不需要太多的驱动支持。
没有人实现 S2 但如果您有它的支持,
则应该和 S1 类似。 下一件值得尝试的是
S3 。 这是最深的
STR 状态,
并需要一系列驱动的支持才能够正常地重新初始化您的硬件。
如果您在唤醒系统时遇到问题, 请不要吝惜发邮件给 &a.acpi.name;
邮件列表, 尽管不要指望问题一定会很快解决,
因为有许多驱动程序/硬件需要进行更多的测试和改进。
为了帮助隔离问题, 请在内核中删去尽可能多的驱动。
如果这样做能够解决问题, 请尝试逐个加载驱动直到问题再次出现。
通常预编译的驱动程序如
nvidia.ko 、 X11
显示驱动, 以及 USB 的问题最多,
而以太网卡的驱动则通常工作的很好。
如果您能够通过加载和卸载驱动使系统正常工作,
您可以通过将适当的命令放到
/etc/rc.suspend 和
/etc/rc.resume 来将这个过程自动化。
在这两个文件中有一个注释掉的卸载和加载驱动程序的例子供您参考。
另外您还可以将 hw.acpi.reset_video 设置为零
(0), 如果您的显示在唤醒之后显得很混乱。
此外您还可以尝试更长或更短的
hw.acpi.sleep_delay 值看看是否有所助益。
另一件值得一试的事情是使用一个比较新的包含
ACPI 支持的 Linux 发行版来试试看他们的
休眠/唤醒 功能是否在同样的硬件上能够正常工作。
如果在 Linux 下正常, 则很可能是 &os; 驱动程序的问题,
而隔离问题并找到存在问题的驱动有助于解决它。
需要注意的是 ACPI 的维护人员通常并不维护其他驱动
(例如 声音、 ATA , 等等)
因此如果最终发现是驱动的问题最好还是发到
&a.current.name; 邮件列表并发给驱动程序的维护者。
如果您喜欢冒险, 则可以加一些 &man.printf.3;
到有问题的驱动中, 以找到它的恢复功能发生问题的位置。
最后, 试试看禁用 ACPI
并代之以启用 APM 。
如果 休眠/唤醒 能够在 APM 下正常工作,
使用 APM 可能会更好,
特别是对于较老的硬件 (2000年以前)。
硬件制造商需要一些时间来让老硬件的
ACPI 工作正常,
而 ACPI 的问题十之八九是
BIOS 中的毛病引发的。
系统停止响应 (暂时或永久性地)
中断风暴
绝大多数系统停止响应是由于未能及时响应中断或发生了中断风暴导致的。
芯片组有很多问题最终会溯源到 BIOS
如何在引导系统之前配置中断, APIC
(MADT ) 表的正确性, 以及
系统控制中断
(SCI ) 如何路由。
通过察看 vmstat -i
的输出中包括 acpi0
的那一行可以区分中断风暴和未能及时响应中断。
如果每秒计数器增长的速度多于一两个,
则您是遇到了中断风暴。 如果系统停止了响应,
您可以尝试停止内核并进入 DDB
(在控制台上按 CTRL
ALT ESC )
并输入 show interrupts 。
APIC
禁用
处理中断问题的救命稻草是尝试禁用
APIC 支持, 这是通过在
loader.conf 中加入
hint.apic.0.disabled="1"
完成的。
崩溃
崩溃对于 ACPI 是比较罕见的情况,
如果发现, 我们将会非常重视并很快修复它。
您要做的第一件事是设法隔离出能够重现崩溃 (如果可能的话)
的操作并获取一份调用堆栈。 请启用
options DDB 并设置串行控制台
(参见 )
或配置一个 &man.dump.8; 分区。 您将在
DDB 中通过 tr
得到调用堆栈。 如果您只能用手抄的方法记录它,
一定要记下头五 (5) 行和最后五 (5) 行。
然后, 尝试通过在启动时禁用
ACPI 来隔离故障。 如果这样做能够正常工作,
请通过设置 debug.acpi.disable
的那组数值来隔离具体是哪个 ACPI
子系统的问题。 请参见
&man.acpi.4; 联机手册中给出的那些例子。
系统在休眠或关机之后又启动了
首先请尝试在 &man.loader.conf.5; 中设置
hw.acpi.disable_on_poweroff= 0
。
这将让 ACPI 不再在关机过程中禁用一些事件。
基于同样的原因, 一些系统需要把这个值设置为 1
(这是默认值)。
这通常能够修复在休眠或关机时立即再次启动的问题。
其他问题
如果您有 ACPI 的其他问题
(同 docking station 协同工作、 无法检测设备, 等等),
请把描述发给邮件列表; 不过, 这些问题也有可能和
ACPI 中尚未完成的部分有关,
它们可能需要时间才能被实现。 请给点耐心,
并准备测试我们可能会发给您的补丁。
ASL 、acpidump , 以及
IASL
ACPI
ASL
最常见的问题是 BIOS
制造商提供的不正确 (甚至完全错误的!) 字节代码。
这通常会以类似下面这样的内核消息显示在控制台上:
ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\
(Node 0xc3f6d160), AE_NOT_FOUND
许多时候, 您可以通过将
BIOS 升级到最新版本来解决此类问题。
绝大多数控制台消息是无害的, 但如果您有其他问题例如电池工作不正常,
则从 AML 开始查找问题将是一条捷径。
字节代码, 或常说的 AML ,
是从一种叫做 ASL 的语言写成的源代码进行编译得到的结果。
AML 一般存放在
DSDT 表中。 要得到您系统的
ASL , 需要使用 &man.acpidump.8;。
需要同时指定 -t (显示固定标的内容)
和 -d (将 AML 反编译成
ASL ) 两个选项。 请参见
如何提交调试信息
一节了解如何使用它。
最方便的初步检查是尝试重新编译
ASL 来看看是否有错误。
通常可以忽略这一过程中产生的警告,
但错误一般就都是 bug, 它们通常就是导致
ACPI 无法正常工作的原因。
要重新编译您的 ASL ,
可以使用下面的命令:
&prompt.root; iasl your.asl
修复 ASL
ACPI
ASL
我们的长期目标是让每一个人都能够在不需要任何用户干预的情况下使用
ACPI 。 然而, 目前我们仍然在开发绕过
BIOS 制造商常见错误的方法。
µsoft; 解释器 (acpi.sys 和
acpiec.sys ) 并不会严格地检查是否遵守了标准,
因此许多只在 &windows; 中测试 ACPI 的
BIOS 制造商很可能永远不会修正他们的
ASL 。 我们希望不断地找出并用文档说明
µsoft; 的解释器到底允许那些不标准的行为,
并在 &os; 进行对应的修改使它能够正常工作而不需要用户修正
ASL 。 作为一项临时缓解问题的方法,
并帮助我们确认其行为, 您可以手工修正
ASL 。 如果这样能够解决问题,
请把新旧 ASL 的 &man.diff.1;
发给我们, 这样我们就有可能绕过 ACPI-CA
中的错误行为, 从而不再需要您来手工修正。
ACPI
error messages
下面是一些常见的错误信息, 它们的原因,
以及如何修正。
_OS dependencies (_OS 依赖)
某些 AML 假定世界是由不同版本的
&windows; 组成的。 您可以让 &os; 声称自己是任意
OS 来看一看是否能够修正问题。
比较简单的办法是设置
hw.acpi.osname ="Windows 2001"
到 /boot/loader.conf 中, 或使用您在
ASL 中找到的其他字符串。
Missing Return statements (缺少返回语句)
一些方法可能没按照标准要求的那样显式地返回值。
尽管 ACPI-CA 无法处理它,
但 &os; 提供了一个绕过它并允许其暗含地返回值的方法。
您也可以增加一个显式的
Return 语句, 如果您知道那里需要返回一个值的话。
要强制 iasl 编译
ASL , 需要使用 -f
标志。
替换默认的 AML
在定制 your.asl 之后,
您可以通过下面的命令编译它:
&prompt.root; iasl your.asl
可以使用 -f 标志来强制创建
AML , 即使在编译过程中发生了错误。
请注意某些错误 (例如, 缺少 Return 语句)
会自动被解释器忽略掉。
DSDT.aml 是
iasl 命令的默认输出文件名。
可以加载它来取代您 BIOS
中存在问题的副本 (它仍然存在于闪存中),
其方法是按下面的说明编辑
/boot/loader.conf :
acpi_dsdt_load="YES"
acpi_dsdt_name="/boot/DSDT.aml"
一定要把您的 DSDT.aml 复制到
/boot 目录中。
从
ACPI 中获取调试输出信息
ACPI
问题
ACPI
调试
ACPI 驱动程序提供了非常灵活的调试机制。
这允许您指定一组子系统, 以及所需要的详细信息。
需要调试的子系统可以按 layers(层)
来指定, 并分为 ACPI-CA 组件 (ACPI_ALL_COMPONENTS)
和 ACPI 硬件支持 (ACPI_ALL_DRIVERS)。
调试输出的详细程度可以通过
level(详细度)
来指定, 其范围是
ACPI_LV_ERROR (只报告错误) 到 ACPI_LV_VERBOSE (显示所有)。
level
是一个位掩码因此可以一次设置多个选项,
中间用空格分开。 实际使用中您应该考虑使用串行控制台来记录输出,
如果它太长以至于冲掉了控制台消息缓冲的话。
不同的层和输出详细度的完整列表可以在 &man.acpi.4; 联机手册中找到。
调试输出默认并不开启。 要起用它, 您需要在内核设置中添加
options ACPI_DEBUG , 如果您的内核中编入了
ACPI 的话。 您还可以在
/etc/make.conf 中加入
ACPI_DEBUG=1 来在全局起用它。
如果它只是模块, 您可以用下面的方法来重新编译
acpi.ko :
&prompt.root; cd /sys/modules/acpi/acpi
&& make clean &&
make ACPI_DEBUG=1
安装 acpi.ko 到
/boot/kernel and add your
并把所需的详细度和层在 loader.conf 中指定。
这个例子将启用所有
ACPI-CA 组件以及所有
ACPI 硬件驱动
(CPU 、 LID , 等等) 的消息。
只输出错误信息, 也就是最低的详细度。
debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS"
debug.acpi.level="ACPI_LV_ERROR"
如果您需要的信息是由某个特定的事件触发的
(比如说, 休眠之后的唤醒), 您可以不修改
loader.conf 而转而使用
sysctl
来在启动和为那个事件准备系统之后再指定层和详细度。
这些 sysctl 的名字和
loader.conf 中的一致。
参考文献
关于 ACPI 的更多信息可以从下面这些地方找到:
The &a.acpi;
ACPI 邮件列表存档
旧的 ACPI 邮件列表存档
The ACPI 2.0 标准
&os; 手册页: &man.acpi.4;,
&man.acpi.thermal.4;, &man.acpidump.8;, &man.iasl.8;,
&man.acpidb.8;
DSDT 调试资源 .
(使用 Compaq 作为例子但通常情况下都很有用。)
diff --git a/zh_CN.GB2312/books/handbook/desktop/chapter.sgml b/zh_CN.GB2312/books/handbook/desktop/chapter.sgml
index 398843e6fa..6a7bf06074 100644
--- a/zh_CN.GB2312/books/handbook/desktop/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/desktop/chapter.sgml
@@ -1,1029 +1,1029 @@
Christophe
Juniet
Contributed by
桌面应用
概述
FreeBSD 可以运行种类繁多的桌面应用程序,
这包括像浏览器和字处理这样的软件。 绝大多数这样的程序都可以通过 package
来安装, 或者从 Ports
Collection 自动地构建。 许多新用户希望能够在它们的系统中找到这样的应用程序。
这一章将向您展示如何轻松地使用 package 或者 Ports Collection
中安装这样的软件。
需要注意的是从 ports 安装意味着要编译源码。 根据编译的
ports 和电脑速度的不同, 这可能需要花费相当长的时间。
若是您觉得编译源码太过耗时的话, 绝大多数 ports
也有预编译的版本可供安装。
因为 FreeBSD 提供的二进制兼容 Linux 的特性, 许多原本为 Linux
开发的程序都可以直接用在您的桌面。 在安装任何的 Linux
应用程序之前, 强烈的推荐您阅读 。
当您在寻找特定的 ports 时, 可以使用 &man.whereis.1;。 一般来说,
许多利用 Linux 二进制兼容特性的 ports 都以linux-
开头。
在下面的介绍中,都假设安装 Linux 应用程序前已经开启了 Linux 二进制兼容功能。
本章涵盖以下种类应用程序:
浏览器 (例如 Mozilla 、
Opera 、
Firefox 、
Konqueror )
办公、图象处理 (例如
KOffice 、
AbiWord 、
GIMP 、
OpenOffice.org )
文档查看 (例如 &acrobat.reader; 、
gv 、
Xpdf 、
GQview )
财务 (例如
GnuCash 、
Gnumeric 、
Abacus )
阅读这章之前,您应该:
知道如何安装额外的第三方软件()。
知道如何安装 Linux 软件()。
想要获得更多的有关多媒体环境的信息,请阅读
。如果您想要建立和使用电子邮件,
请参考。
浏览器
浏览器
web
FreeBSD并没有预先安装特定的浏览器。然而,在 ports 的目录 www
有许多浏览器可以安装。如果您没有时间一一编译它们
(有些时候这可能需要花费相当长的时间) 大部分都有 package 可用。
KDE 和
GNOME 已经提供 HTML 浏览器。
请参考得到更多完整的有关设定这些桌面环境的信息。
如果您要找小型的浏览器, 可以试试看
www/dillo 、
www/links 或
www/w3m 。
这一节涉及如下程序:
程序名称
资源需求
安装时间
主要依赖
Mozilla
多
大量时间和空间
Gtk+
Opera
少
轻松
同时有可用的 FreeBSD 和 Linux 版本。 Linux 版本需要使用
Linux 二进制兼容模块和
linux-openmotif 。
Firefox
中等
长
Gtk+
Konqueror
中等
长
需要 KDE 库
Mozilla
Mozilla
Mozilla 是一个完全移植到 FreeBSD
上的现代化的、 稳定的浏览器。 它拥有非常合乎标准的 HTML 支持,
它也能处理邮件和阅读新闻组。
假如您打算做一个自己的主页的话,它甚至提供一个 HTML 编辑器。
&netscape; 的使用者可能觉得它和
Communicator 非常相似,
两者有些部分实际上是相通的。
在 CPU 速度低于 233MHz 或者内存少于 64MB
的老式电脑上,Mozilla
会占用相当多资源而难以使用。您也许可以试试
Opera 浏览器,本章稍后将会介绍它。
也许基于某种原因,您不能或者不想编译
Mozilla ,FreeBSD GNOME 团队已经为您制作好了
package。只需要通过网络安装它:
&prompt.root; pkg_add -r mozilla
如果没 package 可用,而您又有足够的时间和磁盘空间,您可以获取
Mozilla 的源码来编译并安装它到您的系统上。
执行以下指令既可:
&prompt.root; cd /usr/ports/www/mozilla
&prompt.root; make install clean
Mozilla 需要 root
权限执行 chrom 注册来确定正确的初始化。另外,
如果您想要一些额外的插件比如象 mouse gestures,您也必须以
root 权限执行 Mozilla
以便正确的安装。
一旦您完成了 Mozilla 安装,您就再也不需要
root 权限了。您可以用如下方式执行
Mozilla :
&prompt.user; mozilla
也可以用如下方式直接运行电子邮件和新闻阅读器:
&prompt.user; mozilla -mail
Firefox
Firefox
Firefox 是基于 Mozilla
代码系的下一代浏览器。 Mozilla
是一个完整的应用程序套件, 包含了浏览器、 邮件客户端、
聊天客户端等等。 而 Firefox
则只是一个浏览器, 这使得它体积更小并且执行速度更快。
您可以通过输入下面的命令来安装预编译的包:
&prompt.root; pkg_add -r firefox
如果您喜欢从源代码编译, 则可以使用 Ports
套件来完成这项工作:
&prompt.root; cd /usr/ports/www/firefox
&prompt.root; make install clean
Firefox、 Mozilla 与 &java; 插件
在这一节和下一节中,
我们均假定您已经安装了 Firefox 或
Mozilla 。
&os; 基金会拥有来自 Sun Microsystems 的关于发布针对 &os;
的预编译版本的 Java 运行环境
(&jre;) 和 Java 开发包 (&jdk;) 的授权。 用于
&os; 的预编译版本可以在 &os;
基金会 网站上找到。
要为 Firefox 或
Mozilla 添加 &java; 支持,
您必须首先安装 java/javavmwrapper port。
接下来, 从
下载 Diablo &jre; 软件包,
并使用 &man.pkg.add.1; 来安装它。
启动浏览器, 并在地址栏中输入
about:plugins 然后按
Enter 。 浏览器将给出一个页面,
其中会显示已经安装的插件,
您应在这个列表中找到 &java;
插件。
Firefox、 Mozilla 与 ¯omedia; &flash; 插件
¯omedia; &flash; 插件并没有直接提供其 &os; 版本。 不过,
我们有一个软件层 (wrapper) 可以用来运行 Linux 版本的插件。
这个 wrapper 也支持 &adobe; &acrobat;、
RealPlayer 和很多其他插件。
应安装 www/linuxpluginwrapper
port, 这个 port 需要依赖一个很大的 port,
emulators/linux_base 。
请按照 port 在安装过程中所给出的提示对您的
/etc/libmap.conf 进行正确的配置!
示范的配置可以在
/usr/local/share/examples/linuxpluginwrapper/
目录找到。
下一步是安装 www/linux-flashplugin7 port。
一旦装好了这个插件, 就可以打开浏览器, 并在地址栏中输入
about:plugins 然后按下
Enter 。 这将显示目前可用的插件列表。
如果您没有在这个列表中看到 &flash; 插件,
则多数情况下这是由于缺少一个符号链接导致的。
您需要以 root ,
身份执行下面的命令:
&prompt.root; ln -s /usr/local/lib/npapi/linux-flashplugin/libflashplayer.so \
/usr/X11R6/lib/browser_plugins/
&prompt.root; ln -s /usr/local/lib/npapi/linux-flashplugin/flashplayer.xpt \
/usr/X11R6/lib/browser_plugins/
重新启动浏览器之后,
插件就应该会在前面提到的那个列表中有所体现了。
在播放某些 &flash; 动画时, 您的浏览器可能会崩溃,
这时这个补丁可能会对您有所帮助:
&prompt.root; cd /usr/src
&prompt.root; fetch http://people.FreeBSD.org/~nork/rtld_dlsym_hack.diff
&prompt.root; patch < rtld_dlsym_hack.diff
&prompt.root; cd libexec/rtld-elf/
&prompt.root; make clean
&prompt.root; make obj
&prompt.root; make depend
&prompt.root; make && make install
接下来, 重新启动计算机。
linuxpluginwrapper 只能在
&i386; 架构上运行。
Opera
Opera
Opera 是一个功能齐全,
并符合标准的浏览器。 它还提供了内建的邮件和新闻阅读器、 IRC 客户端,
RSS/Atom feed 阅读器以及更多功能。 除此之外,
Opera 是一个比较轻量的浏览器,
其速度很快。 它提供了两种不同的版本: native
FreeBSD 版本, 以及通过 Linux
模拟运行的版本。
要使用 Opera 的 FreeBSD
版本来浏览网页,安装以下的 package:
&prompt.root; pkg_add -r opera
有些 FTP 站点没有所有版本的 package,
您也可以通过 Ports Collection 来安装:
&prompt.root; cd /usr/ports/www/opera
&prompt.root; make install clean
要安装 Linux 版本的
Opera ,将上面例子中的
opera 替换为 linux-opera 。Linux
版本在某些情况下非常有用,象是使用只有 Linux 版本的插件,例如 Adobe
&acrobat.reader; 。不然的话在其它方面,
FreeBSD 和 Linux 版本是完全一样的。
Konqueror
Konqueror
Konqueror 是
KDE 的一部分,不过也可以通过安装
x11/kdebase3
在非 KDE 环境下使用。
Konqueror 不止是一个浏览器,
也是一个文件管理器和多媒体播放器。
Konqueror 也带有丰富的插件,
可以在 misc/konq-plugins 下面找到。
Konqueror 也支持 &flash; ,
可以在 找到一个 How To。
办公、图象处理
当需要进行办公或者进行图象处理时,
新用户通常都会找一些好用的办公套件或者字处理软件。目前有一些 桌面环境比如象
KDE 已经提供了办公套件。
FreeBSD 提供所有的要求,桌面环境也不例外。
这节涉及如下程序:
软件名称
资源需求
安装时间
主要依赖
KOffice
少
多
KDE
AbiWord
少
少
Gtk+ 或 GNOME
The Gimp
少
长
Gtk+
OpenOffice.org
多
长
&jdk; 1.4 、 Mozilla
KOffice
KOffice
办公套件
KOffice
KDE 社区提供了一套办公套件,
它能用在桌面环境。它包含四个标准的组件,这些组件可以在其它办公套件中找到。
KWord 是字处理程序、
KSpread 是电子表格程序、
KPresenter 是演示文档制作管理程序、
Kontour 是矢量绘图软件。
安装最新的
KOffice 之前,先确定您是否安装了最新版的
KDE 。
使用 package 来安装 KOffice ,安装细节如下:
&prompt.root; pkg_add -r koffice
如果没有可用的 package,您可以使用 Ports Collection 安装。
安装 KDE3 的
KOffice 版本,如下:
&prompt.root; cd /usr/ports/editors/koffice-kde3
&prompt.root; make install clean
AbiWord
AbiWord
AbiWord 是一个免费的字处理程序,它看起来和
µsoft; Word 的感觉很相似。
它适合用来打印文件、信函、报告、备忘录等等,
它非常快且包含许多特性,并且非常容易使用。
AbiWord 可以导入或输出很多文件格式,
包括一些象 Microsoft.doc 格式的文件。
AbiWord 也有 package
的安装方式。您可以用以下方法安装:
&prompt.root; pkg_add -r abiword
如果没有可用的 package,它也可以从 Ports Collection 编译。ports
collection 应该是最新的。它的安装方式如下:
&prompt.root; cd /usr/ports/editors/abiword
&prompt.root; make install clean
GIMP
GIMP
对图象的编辑或者加工,
GIMP 是一个非常精通图象处理的软件。
它可以被用来当作简单的绘图程序或者一个专业的照片处理套件。
它支持大量的插件和具有脚本界面的特性。
GIMP 可以读写众多的文件格式,
支持扫描仪和手写板。
您可以用下列命令安装:
&prompt.root; pkg_add -r gimp
如果您在 FTP 站点没有找到这个 package,您也可以使用
Ports Collection 的方法安装。ports 的 graphics
目录也包含有 Gimp 手册 。
以下是安装它们的方法:
&prompt.root; cd /usr/ports/graphics/gimp
&prompt.root; make install clean
&prompt.root; cd /usr/ports/graphics/gimp-manual-pdf
&prompt.root; make install clean
Ports 中的 graphics
目录也有开发中的 GIMP 版本
graphics/gimp-devel 。
HTML 版本的 Gimp 手册 可以在
graphics/gimp-manual-html
找到。
OpenOffice.org
OpenOffice.org
办公套件
OpenOffice.org
OpenOffice.org 包括一套完整的办公套件:
一个字处理程序、一个电子表格程序、一个演示文档管理程序和一个绘图程序。
它和其它的办公套件的特征非常相似,它可以导入输出不同的流行的文件格式。
它包括一些不同的语言界面、拼写检查和字典。
OpenOffice.org 的字处理程序使用 XML
文件格式使它增加了可移植性和灵活性。电子表格程序支持宏语言和使用外来的数据库界面。
OpenOffice.org 已经可以平稳的运行在
&windows;、&solaris;、Linux、FreeBSD
和 &macos; X 等各种操作系统下。更多的有关
OpenOffice.org 的信息您可以在
OpenOffice.org 网页 找到。
对于特定的 FreeBSD 版本的信息,您可以在直接在 FreeBSD OpenOffice
移植团队 的页面下载。
安装 OpenOffice.org 方法如下:
- &prompt.root; pkg_add -r openoffice
+ &prompt.root; pkg_add -r openoffice.org
如果您正在使用 &os; 的 -RELEASE 版本, 一般来说这样做是没问题的。
如果不是这样, 您就可能需要看一看 &os; OpenOffice.org
移植小组的网站,
并使用 &man.pkg.add.1; 从那里下载并安装合适的软件包。
最新的发布版本和开发版本都可以在那里找到。
装好 package 之后, 您只需输入下面的命令就能运行
OpenOffice.org 了:
&prompt.user; openoffice.org
在第一次运行时, 将询问您一些问题,
并在您的主目录中建立一个 .openoffice.org2 目录。
如果没有可用的 OpenOffice.org
package,您仍旧可以选择编译 port。然而,
您必须记住它的要求以及大量的磁盘空间和相当长的时间编译。
- &prompt.root; cd /usr/ports/editors/openoffice.org-2.0
+ &prompt.root; cd /usr/ports/editors/openoffice.org-2
&prompt.root; make install clean
如果希望联编一套进行过本地化的版本,
将前述命令行改为:
&prompt.root; make LOCALIZED_LANG=your_language install clean
您需要将
your_language 改为正确的 ISO-代码。
所支持的语言代码可以在
files/Makefile.localized 文件中找到,
这个文件位于 port 的目录。
一旦完成上述操作, 就可以通过下面的命令来运行
OpenOffice.org 了:
&prompt.user; openoffice.org
文档查看器
一些新的文档格式近来得到流行。它们所需要的标准查看器可能不一定在系统内。
在本节我们将了解如何安装它们。
这节涵盖如下应用程序:
软件名称
资源需求
安装时间
主要依赖
&acrobat.reader;
少
少
Linux二进制兼容
gv
少
少
Xaw3d
Xpdf
少
少
FreeType
GQview
少
少
Gtk+ 或 GNOME
&acrobat.reader;
Acrobat Reader
PDF
查看器
现在许多文档都用 PDF 格式,
根据轻便小巧文档格式
的定义。一个被建议使用的查看器是
&acrobat.reader; ,由 Adobe 所发行的
Linux 版本。因为 FreeBSD 能够运行 Linux 二进制文件,
所以它也可以用在 FreeBSD 中。
要从 Ports collection 安装 &acrobat.reader;
7 , 只需:
&prompt.root; cd /usr/ports/print/acroread7
&prompt.root; make install clean
由于授权的限制, 我们不提供预编译的版本。
gv
gv
PDF
查看器
PostScript
查看器
gv 是 &postscript; 和
PDF 文件格式查看器。它源自 ghostview
因为使用 Xaw3d 函数库让它看起来更美观。
它很快而且界面很干净。gv
有很多特性比如象纸张大小、刻度或者抗锯齿。
大部分操作都可以用键盘或鼠标完成。
安装 gv package,如下:
&prompt.root; pkg_add -r gv
如果您无法获取预编译的包, 则可以使用 Ports
collection:
&prompt.root; cd /usr/ports/print/gv
&prompt.root; make install clean
Xpdf
Xpdf
PDF
查看器
如果您想要一个小型的 FreeBSD PDF 查看器,
Xpdf 是一个小巧并且高效的查看器。
它只需要很少的资源而且非常稳定。它使用标准的 X
字体并且不需要 &motif; 或者其它的
X 工具包。
安装 Xpdf package,使用如下命令:
&prompt.root; pkg_add -r xpdf
如果 package 不可用或者您宁愿使用 Ports Collection,如下:
&prompt.root; cd /usr/ports/graphics/xpdf
&prompt.root; make install clean
一旦安装完成,您就可以启动
Xpdf 并且使用鼠标右键来使用菜单。
GQview
GQview
GQview 是一个图片管理器。
您可以单击鼠标来观看一个文件、开启一个外部编辑器、
使用预览和更多的功能。它也有幻灯片播放模式和一些基本的文件操作。
您可以管理采集的图片并且很容易找到重复的。
GQview 可以全屏幕观看并且支持国际化。
如果您想要安装
GQview package,如下:
&prompt.root; pkg_add -r gqview
如果您没有可用的 package 或者您宁愿使用 Ports Collection,如下:
&prompt.root; cd /usr/ports/graphics/gqview
&prompt.root; make install clean
财务
假如,基于任何的理由,您想要在 FreeBSD Desktop
管理您个人的财政,有一些强大并且易于使用的软件可以被您选择安装。
它们中的一些与流行的文件格式兼容象
Quicken
或 Excel 文件。
本节涵盖如下软件:
软件名称
资源需求
安装时间
主要依赖
GnuCash
少
长
GNOME
Gnumeric
少
长
GNOME
Abacus
少
少
Tcl/Tk
GnuCash
GnuCash
GnuCash 是
GNOME 的一部分,GNOME
致力于为最终用户提供用户友好且功能强大的软件。使用
GnuCash ,您可以关注您的收入和开支、您的银行帐户,
或者您的股票。它的界面特性看起来非常的专业。
GnuCash 提供一个智能化的注册、帐户分级系统、
很多键盘快捷方式和自动完成方式。它能分开一个单个的处理到几个详细的部分。
GnuCash 能导入和合并
Quicken QIF 文件格式。
它也支持大部分的国际日期和流行的格式。
安装 GnuCash 到您的系统,如下:
&prompt.root; pkg_add -r gnucash
如果 package 不可用,您可以使用 Ports Collection 安装:
&prompt.root; cd /usr/ports/finance/gnucash
&prompt.root; make install clean
Gnumeric
Gnumeric
电子表格
Gnumeric
Gnumeric 是一个电子表格程序,
GNOME 桌面环境的一部分。
它以通过元素格式和许多片断的自动填充系统来方便的自动猜测
用户输入而著称。
它能导入一些流行的文件格式,比如象 Excel 、
Lotus 1-2-3 或 Quattro Pro 。
Gnumeric 凭借 math/guppi 支持图表。
它有大量的嵌入函数和允许所有通常比如象、数字、货币、日期、
时间等等的一些单元格式。
安装 Gnumeric package,如下:
&prompt.root; pkg_add -r gnumeric
如果 package 不可用,您可以使用 Ports Collection 安装:
&prompt.root; cd /usr/ports/math/gnumeric
&prompt.root; make install clean
Abacus
Abacus
spreadsheet
Abacus
Abacus 是一个小巧易用的电子表格程序。
它包含许多嵌入函数在一些领域如统计学、财务和数学方面很有帮助。
它能导入和输出 Excel 文件格式。
Abacus 可以产生 &postscript;
输出。
安装 Abacus package,如下:
&prompt.root; pkg_add -r abacus
如果 package 不可用,您可以使用 Ports Collection 安装:
&prompt.root; cd /usr/ports/deskutils/abacus
&prompt.root; make install clean
总结
当 FreeBSD 因为它的效能和稳定而在 ISP 之间流行时,
它也可以完全应用在桌面环境。拥有数以千计的
packages 或者
ports ,
您可以为您的需要建立完美的桌面环境。
一旦您完成了您的桌面环境的安装,您可能想要进一步了解
misc/instant-workstation 。
meta-port
允许您为一个工作站建立一个定制的 ports 设置。您可以编辑
/usr/ports/misc/instant-workstation/Makefile 定制它。
接着是缺省添加和删除 ports 的语法,和使用通常的步骤建立它。
最后,您将能建立一个适合您自己桌面的大的 package
并在您的其它的工作站上安装它!
下面是本章涉及到的所有的软件的快速回顾:
软件名称
Package 名称
Ports 名称
Mozilla
mozilla
www/mozilla
Opera
opera
www/opera
Firefox
firefox
www/firefox
KOffice
koffice-kde3
editors/koffice-kde3
AbiWord
abiword
editors/abiword
The GIMP
gimp
graphics/gimp
OpenOffice.org
openoffice
editors/openoffice-1.1
&acrobat.reader;
acroread
print/acroread7
gv
gv
print/gv
Xpdf
xpdf
graphics/xpdf
GQview
gqview
graphics/gqview
GnuCash
gnucash
finance/gnucash
Gnumeric
gnumeric
math/gnumeric
Abacus
abacus
deskutils/abacus
diff --git a/zh_CN.GB2312/books/handbook/install/chapter.sgml b/zh_CN.GB2312/books/handbook/install/chapter.sgml
index 982f3129d8..ac51841d2e 100644
--- a/zh_CN.GB2312/books/handbook/install/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/install/chapter.sgml
@@ -1,4665 +1,4665 @@
Jim
Mock
结构、组织重整, 部分重写
Randy
Pratt
sysinstall 操作流程、屏幕抓图以及一般性文件
安装 FreeBSD
概述
installation
FreeBSD 提供了一个以文字为主,简单好用的安装程序,叫做
sysinstall 。这是 FreeBSD 默认使用的安装程序;
厂商如果想,也可以提供适合自己需要的安装程序。本章说明如何使用
sysinstall 来安装 FreeBSD。
学习完本章之后,您将会知道:
如何制作 FreeBSD 安装磁盘
FreeBSD如何参照及分割您的硬盘
如何启动 sysinstall .
在执行 sysinstall 时您将要回答的问题、
问题代表什么意义,以及该如何回答它们。
在阅读本章之前,您应该:
阅读您要安装的 FreeBSD 版本所附的硬件支持列表以确定您的硬件有没有被支持。
一般来说,此安装说明是针对 &i386; (PC 兼容机
) 体系结构的电脑。
如果有其它体系结构(如Alpha)的安装说明,我们将一并列出。
虽然本文档经常保持更新,但有可能与您安装版本上所带的说明文档有些许出入。
在这里建议您使用本说明文章作为一般性的安装指导参考手册。
安装前的准备工作
列出您电脑的硬件清单
在安装 FreeBSD 之前,您应该试着将您电脑中的硬件清单列出来。FreeBSD
安装程序会将这些硬件(磁盘、网卡、光驱等等)以及型号及制造厂商列出来。
FreeBSD 也会尝试为这些设备找出最适当的 IRQ 及 IO 端口的设定。但是因为 PC
的硬件种类实在太过复杂,这个步骤不一定总是能成功。
这时,您就可能需要手动更改有问题的设备的设定值。
如果您已经安装了其它的操作系统,如 &windows; 或 Linux,那么您可以先由
这些系统所提供的工具来查看您的设备设定值是怎么分配的。如果您真的没办法
确定某些接口卡用什么设定值,那么您可以检查看看,说不定它的设定已经标示
在卡上。常用的 IRQ 号号码为 3、5 以及 7;IO 端口的值通常以 16 进制位表示,例如
Ox330。
我们建议您在安装 FreeBSD 之前把这些信息打印或记录下来,做成表格
的样子也许会比较有帮助,例如:
硬件设备清单
设备名
IRQ
IO 端口号
备注
第一块硬盘
N/A
N/A
40 GB,Seagate 制造,第一个 IDE 接口主设备
CDROM
N/A
N/A
第一个 IDE 接口从设备
第二块硬盘
N/A
N/A
20 GB,IBM 制造, 第二个 IDE 接口主设备
第一个 IDE 控制器
14
0x1f0
网卡
N/A
N/A
&intel; 10/100
Modem
N/A
N/A
&tm.3com; 56K faxmodem,位于 COM1 口
…
备份您的数据
如果您的电脑上面存有重要的数据资料,那么在安装 FreeBSD 前请确定
您已经将这些资料备份了,并且先测试这些备份文档是否有问题。FreeBSD
安装程序在要写入任何资料到您的硬盘前都会先提醒您确认,一旦您确定要
写入,那么以后就没有反悔的机会。
决定要将 FreeBSD 安装到哪里
如果您想让 FreeBSD 使用整个硬盘,那么请直接跳到下一节。
但是,如果您想让 FreeBSD 跟您已有的系统并存,那么您必须对您数据
存在硬盘的分布方式有深入的了解以及其所造成的影响。
&i386; 体系结构的硬盘分配方式
一个 PC 硬盘可以被细分为许多分散的区域。这些区域叫做
分区(partitions) 。 由于设计的原因,每个硬盘仅
支持四个分区;这些分区叫做主分区(Primary partion) 。
为了突破这个限制以便能使用更多的分区,就有了新的分区类型,叫做
扩展分区(Extended partition) 。一个硬盘可以拥有一个扩展分区。在
扩展分区里可以建立许多个所谓的逻辑分区(Logical partitions) 。
每个分区都有其独立的分区号(partition ID) ,
用以区分每个分区的数据类型。FreeBSD 分区的分区号为 165 。
一般而言,每种操作系统都会有自己独特的方式来区别分区。例如 DOS 及其
之后的 &windows;, 会分配给每个主分区及逻辑分区一个
驱动器字符 ,
从 C: 开始。
FreeBSD 必须安装在主分区。 FreeBSD 可以在这个分区上面存放系统数据
或是您建立的任何文件。然而,如果您有多个硬盘,您也可以在这些硬盘上(全部
或部分)建立 FreeBSD 分区。在您安装 FreeBSD 的时候,必须要有一个分区可以给
FreeBSD 使用。这个分区可以是尚未规划的分区或是已经划好,但是里面的数据
您都不想保存的分区。
如果您已经用完了您硬盘上的所有分区,那么您必须使用其它操作系统所
提供的工具(如 DOS 或 &windows; 下的 fdisk )来腾出一个分区
给 FreeBSD 使用。
如果您的某个分区有多余的空间,您可以使用它。但是使用前您需要先整理
一下这些分区。
FreeBSD 最小安装需要约 100 MB 的空间,但是这仅是 非常
基本的安装,几乎没有剩下多少空间可以建立您自己的文件。一个较理想的最小安装是
250 MB,不含图形界面;或是 350 MB 以上,包含图形界面。如果您还需要安装
其它的第三方厂商的套件,那么将需要更多的硬盘空间。
您可以使用商业软件,例如 &partitionmagic; (硬盘分区魔术师)
或类似 GParted 这样的免费工具来调整分区尺寸,
为 FreeBSD 腾出空间。 FreeBSD 光盘的 tools
目录包含两个免费的工具也可以完成这个工作:FIPS 以及
PResizer ,它们的文档可以在同一目录中找到。FIPS 、
PResizer ,和 &partitionmagic;
能够改变 FAT16 以及 FAT32 分区的大小 —
它们可以在 &ms-dos; 以及 &windows; ME 系统中使用。 这些工具的说明文件可以在同一个目录下面找到
&partitionmagic; 和 GParted
都能改变 NTFS 分区的尺寸。
不当的使用这些工具可能会删掉您硬盘上的数据资料!在使用这些工具前
确定您有最近的、没问题的备份数据。
使用已存在的分区
假设您只有一个 4GB 的硬盘,而且已经装了 &windows; 然后您将这个硬盘分成两个分区
C: 跟 D: ,每个分区大小为
2 GB。在 C: 分区上存放有 1 GB 的数据、
D: 分区上存放 0.5 GB 的数据。
这意味着您的盘上有两个分区,一个驱动器符号是一个分区(如 c:、d:)。
您可以把所有存放在 D: 分区上的数据复制到
C: 分区,这样就空出了一个分区(d:)给 FreeBSD 使用。
缩减已现在的分区
假设您只有一个 4 GB 的硬盘,而且已经装了 &windows;。您在安装 &windows; 的时候
把 4 GB 都给了 C: 分区,并且已经使用了 1.5 GB 的空间。
您想将剩余空间中的 2 GB 给 FreeBSD 使用。
为了安装 FreeBSD,您必须从下面两种方式中选择一种:
备份 &windows; 的数据资料,然后重新安装 &windows;,并给 &windows; 分配 2 GB
的空间。
使用上面提及的 &partitionmagic; 来整理
或切割您的分区。
Alpha 体系结构的硬盘分配方式
Alpha
在 Alpha 上,您必须使用一整颗硬盘给 FreeBSD,没有办法在同一个硬盘上跟
其它操作系统共存。根据不同的 Alpha 机器,您的硬盘可以是 SCSI 或 IDE 硬盘,只要
您的机器可以从这些硬盘开机就可以。
按照 Digital/Compaq 使用手册书写的惯例,所有 SRM 输入的部分都用大写
表示。注意,SRM 大小写有别。
要想得知您硬盘的名称以及型号,可以在 SRM console 提示符下使用
SHOW DEVICE 命令:
>>>SHOW DEVICE
dka0.0.0.4.0 DKA0 TOSHIBA CD-ROM XM-57 3476
dkc0.0.0.1009.0 DKC0 RZ1BB-BS 0658
dkc100.1.0.1009.0 DKC100 SEAGATE ST34501W 0015
dva0.0.0.0.1 DVA0
ewa0.0.0.3.0 EWA0 00-00-F8-75-6D-01
pkc0.7.0.1009.0 PKC0 SCSI Bus ID 7 5.27
pqa0.0.0.4.0 PQA0 PCI EIDE
pqb0.0.1.4.0 PQB0 PCI EIDE
此范例使用 Digital Personal Workstation 433au 并且显示出此机器联接
有三个硬盘。第一个是 CDROM,叫做 DKA0 ;另外两个
是两个硬盘,分别叫做 DKC0 及 DKC100
。
硬盘名称中有 DKx 字样的是 SCSI 硬盘。例如
DKA100 表示是一个 SCSI 设备,其 SCSI ID 为 1,位于
第一个 SCSI 接口 (A)。 DKC300 表示一个 SCSI 硬盘,
SCSI ID 为 3,位于第三个 SCSI 接口 (C)。设备名称 PKx
表示 SCSI 控制卡。由以上 SHOW DEVICE 指令的输出结果看来,
SCSI 光盘也被视为是 SCSI 硬盘的一种。
IDE 硬盘的名称类似 DQx ,而 PQx
则表示相对应的硬盘控制器。
收集您的网络配置相关资料
如果您想通过网络(FTP 或是 NFS)安装 FreeBSD,那么您就必须知道您的网络配置
信息。在安装 FreeBSD 的过程中将会提示您输入这些资料,以顺利完成安装过程。
使用以太网或电缆/DSL Modem
如果您通过局域网或是要通过网卡使用电缆/DSL 上网,那么您必须准备下面
的信息:
IP 地址。
默认网关 IP 地址。
主机名称。
DNS 服务器的 IP 地址。
子网掩码。
如果您不知道这些信息,您可以询问系统管理员或是您的网络服务提供者。
他们可能会说这些信息会由 DHCP 自动分配;如果这样的话,
请记住这一点就可以了。
使用 Modem 连接
如果您由 ISP 提供的拨号服务上网,您仍然可以通过它安装 FreeBSD,
只是会需要很长的时间。
您必须知道:
拨号到 ISP 的电话号码。
您的 modem 是连接到哪个 COM 端口。
您拨号到 ISP 所用的账号和密码。
检查 FreeBSD 发行勘误
虽然我们尽力确保每个 FreeBSD 发行版本的稳定性,但偶尔也会有一些错误进入发行版。
极少数情况下,这些问题甚至可能会影响安装。
当发现和修正问题之后,它们会列在 FreeBSD 网站中的
FreeBSD 发行勘误 中。
在您安装之前,应该首先看一看这份勘误表,以了解可能存在的问题。
虽然我们尽力使得每个 FreeBSD 释出版本都很稳定,但是过程中仍然不免有时
会发现错误。在很罕见的情形下,这些错误会影响到安装过程。当我们发现这些
错误并且修正后,会将它们列在 FreeBSD 网站的 FreeBSD Errata(勘误表) 中, 在您安装FreeBSD前应该
先看看勘误表中有没有什么问题会影响到您的安装。
关于所有释出版本的信息,包括勘误表,可以在
FreeBSD 网站 的发行版信息 一节中找到。
准备安装介质
FreeBSD 可以通过下面任何一种安装介质进行安装:
安装介质
CDROM 或 DVD
在同一计算机上的 DOS 分区
SCSI 或 QIC 磁带
软盘
网络
通过防火墙的一个 FTP 站点,或使用 HTTP 代理。
NFS 服务器
一个指定的并行或串行接口
如果您购买了 FreeBSD 的 CD 或 DVD,那么您可以直接进入下一节
。
如果您还没有 FreeBSD 的安装文件,您应该回到
一节,
它介绍了如何准备所需要的安装介质。之后,您就可以回到这一节,
并从 继续。
准备引导介质
FreeBSD 的安装过程开始于将您的电脑开机进入 FreeBSD 安装环境—-并非在
其它的操作系统上运行一个程序。计算机通常使用安装在硬盘上的操作系统进行
引导,也可以配置成使用一张bootable(可引导)
的软盘进行启动。
大多数现代计算机都可以从光驱进行引导系统。
如果您有 FreeBSD 的安装光盘或 DVD(或者是您购买的,或者是您自己准备的。)
并且您的计算机可以从光驱进行启动 (通常在 BIOS 中会有 Boot Order
或类似的选项可以设置),那么您就可以跳过此小节。因为 FreeBSD 光盘及 DVD 光盘都是可
以引导的,用它们开机您不用做什么特别的准备。
一般来说,要建立安装盘(软盘)请依照下列步骤:
获取开机软盘映像文件
开机软盘映像文件可以在您的安装介质的
floppies/ 目录下找到,
另外您也可以从下述网站的 floppies 目录下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/<架构名> /<版本> -RELEASE/floppies/ .
将 <架构名> 和
<版本>
替换为您使用的计算机体系结构和希望安装的版本号。
例如,用于安装 &i386; 上的
&os; &rel.current;-RELEASE 的文件的地址,
应该是 。
软盘映像文件的扩展名是 .flp 。
在 floppies/ 目录中包括了许多不同的映像文件,
随您安装的 FreeBSD 版本, 某些时候也随硬件的不同,
您需要使用的映像文件可能会有所不同。 您通常会需要三张软盘,
即 boot.flp 、
kern1.flp , 以及
kern2.flp 。 请查阅同一目录下的
README.TXT 文件以了解关于这些映像文件的最新信息。
在安装 &os; 5.3 之前的 5.X 系统时,
某些设备可能会需要另一张软盘来加载它们的驱动。 这些驱动在
drivers.flp 映像中提供。
您的 FTP 程序必须使用 二进制模式 来下载这些映
像文件。有些浏览器只会用 text (或ASCII
) 模式来传输数据,
用这些浏览器下载的映像文件做成的软盘将无法正常开机。
准备软盘
您必须为您下载的每一个映像文件准备一张软盘。并且请避免使用到坏掉的
软盘。最简单的方式就是您先将这些软盘格式化,不要相信所谓的已格式化的软
盘。在 &windows; 下的格式化程序不会告诉您出现多少坏块,它只是简单的标记它
们为 bad
并且忽略它们。根据建议您应该使用全新的软盘来存放
安装程序。
如果您在安装 FreeBSD 的过程中造成当机、冻结或是其它怪异现象,第一个
要怀疑的就是引导软盘。请用其它的软盘制作映像文件再试试看。
将映像文件写入软盘中
.flp 文件 并非 一般的文件,
您不能直接将它们复制到软盘上。事实上它是一张包含完整磁盘内容的映像文件。这
表示您 不能 简单的使用 DOS 的 copy 命令将文件写到软盘上,
而必须使用特别的工具程序将映像文件直接写到软盘中。
DOS
如果您使用 &ms-dos; 或 &windows; 操作系统来制作引导盘,那么您可以使用我们提供
的 fdimage 程序来将映像文件写到软盘中。
如果您使用的是光盘,假设光盘的驱动器符号为 E: ,
那么请执行下面的命令:
E:\> tools\fdimage floppies\kern.flp A:
重复上述命令以完成每个 .flp 文件的写入,每换一个
映像文件都必须更换软盘;制作好的软盘请注明是使用哪个映像文件做的。如果您的映
像文件存放在不同的地方,请自行修改上面的指令指向您存放 .flp
文件的地方。要是您没有 FreeBSD 光盘,您可以到 FreeBSD 的 FTP 站点tools
目录 中下载。
如果您在 &unix; 系统上制作软盘(例如其它 FreeBSD 机器),您可以使用
&man.dd.1; 命令来将映像文件写到软盘中。如果您用 FreeBSD,可以执行下面的命令:
&prompt.root; dd if=kern.flp of=/dev/fd0
在 FreeBSD 中,/dev/fd0 指的是第一个软驱(即
A: 驱动器);/dev/fd1 是
B: 驱动器,依此类推。其它的 &unix; 系统可能会用
不同的的名称,这时您就要查阅该系统的说明文件。
您现在可以安装 FreeBSD 了
开始安装
默认情况下, 安装过程并不会改变任何您硬盘中的数据,除非您看到
下面的讯息:
Last Chance: Are you SURE you want continue the installation?
If you're running this on a disk with data you wish to save then WE
STRONGLY ENCOURAGE YOU TO MAKE PROPER BACKUPS before proceeding!
We can take no responsibility for lost disk contents!
在看到这最后的警告讯息前您都可以随时离开安装程序面不会变更您的硬盘。
如果您发现有任何设定错误,这时您可以直接将电源关掉而不会造成任何伤害。
开机启动
引导 &i386; 系统
从电脑尚未开机开始说起
将电脑电源打开。刚开始的时候它应该会显示进入系统设置菜单或 BIOS
要按哪个键,常见的是 F2 、F10 、
Del 或
Alt
S
。不论是要按哪个键,请按它进入 BIOS 设置画面。有时您的计算机
可能会显示一个图形画面,典型的做法是按 Esc 将关掉这个图形
画面,以使您能够看到必要的设置信息。
找到设置开机顺序的选项,它的标记为 Boot Order
通常会列出一些设备让您选择,例如:Floppy 、
CDROM 、First Hard Disk 等等。
如果您要用软盘安装,请确定选到 floppy disk;如果您要用光盘安装,
请选择 CDROM。为了避免疑惑,请参考您的主板说明手册。
储存设定并离开,系统应该会重新启动。
如果您用软盘安装,请将在
一节中制作好的第一张引导盘,里面包含kern.flp
文件的那张盘,放入软盘驱动器中。
如果您是从光盘安装,那么开机后请将 FreeBSD 光盘放入光驱中。
如果您开机后如往常一样并没有从软盘或光盘引导,请检查:
是不是软盘或光盘太晚放入面错失开机引导时间。如果是,请将它们
放入后重新开机。
BIOS 设定不对,请重新检查 BIOS 的设定。
您的 BIOS 不支持从这些安装介质引导。
FreeBSD 即将启动。如果您是从光盘引导,您会见到类似下面的画面:
Verifying DMI Pool Data ........
Boot from ATAPI CD-ROM :
1. FD 2.88MB System Type-(00)
Uncompressing ... done
BTX loader 1.00 BTX version is 1.01
Console: internal video/keyboard
BIOS drive A: is disk0
BIOS drive B: is disk1
BIOS drive C: is disk2
BIOS drive D: is disk3
BIOS 639kB/261120kB available memory
FreeBSD/i386 bootstrap loader, Revision 0.8
/kernel text=0x277391 data=0x3268c+0x332a8 |
|
Hit [Enter] to boot immediately, or any other key for command prompt.
Booting [kernel] in 9 seconds... _
如果您是从软盘引导,会看到类似下面的画画:
Verifying DMI Pool Data ........
BTX loader 1.00 BTX version is 1.01
Console: internal video/keyboard
BIOS drive A: is disk0
BIOS drive C: is disk1
BIOS 639kB/261120kB available memory
FreeBSD/i386 bootstrap loader, Revision 0.8
/kernel text=0x277391 data=0x3268c+0x332a8 |
Please insert MFS root floppy and press enter:
请根据提示将
kern.flp 软盘取出, 并插入
mfsroot.flp 这张盘, 然后按
Enter 。 &os; 5.3
和更高版本提供了另外一组软盘,
在 前一节
中已经介绍过了。 您只需从第一张软盘启动,
然后再需要时根据提示插入其他软盘。
不论是从软盘或光盘引导,您都会看到下面这段信息:
Hit [Enter] to boot immediately, or any other key for command prompt.
Booting [kernel] in 9 seconds... _
您可以等待十秒, 或按 Enter 。
引导 Alpha 系统
Alpha
从电脑尚未打开电源开始。
打开电脑电源并等待屏幕上出现开机提示信息。
如您需要准备安装软盘,请参考 。
将用 kern.flp 做的引导盘放入软驱中然后输入下列命令
(请视实际情况修改命令中的软驱盘符):
>>>BOOT DVA0 -FLAGS '' -FILE ''
如果您要从光盘引导,请将光盘放入光驱中然后输入下列命令开始安装
(请视情况修改命令中的光驱盘符):
>>>BOOT DKA0 -FLAGS '' -FILE ''
然后 FreeBSD 就会启动。如果您从软盘引导,到某个阶段您会看到下面的信息:
Please insert MFS root floppy and press enter:
按照屏幕指示,将 kern.flp 软盘取出,换上
mfsroot.flp 然后按Enter 键。
不论从软盘或光盘引导,您都会看到下面这段信息:
Hit [Enter] to boot immediately, or any other key for command prompt.
Booting [kernel] in 9 seconds... _
您可以等待 10 秒或是按 Enter 跳过。之后就会进入内核
设定菜单。
查看设备探测的结果
前面屏幕显示的最后几百行字会存在缓冲区中以便您查阅。
要浏览缓冲区,您可以按下 Scroll Lock 键,这会开启画面的
卷动功能。然后您就可以使用方向键或 PageUp 、PageDown
键来上下翻阅。再按一次 Scroll Lock 键将停止画面卷动。
在您浏览的时候会看到类似 的画面。
真正的结果依照您的电脑装置而有所不同。
典型的设备探测结果
avail memory = 253050880 (247120K bytes)
Preloaded elf kernel "kernel" at 0xc0817000.
Preloaded mfs_root "/mfsroot" at 0xc0817084.
md0: Preloaded image </mfsroot> 4423680 bytes at 0xc03ddcd4
md1: Malloc disk
Using $PIR table, 4 entries at 0xc00fde60
npx0: <math processor> on motherboard
npx0: INT 16 interface
pcib0: <Host to PCI bridge> on motherboard
pci0: <PCI bus> on pcib0
pcib1:<VIA 82C598MVP (Apollo MVP3) PCI-PCI (AGP) bridge> at device 1.0 on pci0
pci1: <PCI bus> on pcib1
pci1: <Matrox MGA G200 AGP graphics accelerator> at 0.0 irq 11
isab0: <VIA 82C586 PCI-ISA bridge> at device 7.0 on pci0
isa0: <iSA bus> on isab0
atapci0: <VIA 82C586 ATA33 controller> port 0xe000-0xe00f at device 7.1 on pci0
ata0: at 0x1f0 irq 14 on atapci0
ata1: at 0x170 irq 15 on atapci0
uhci0 <VIA 83C572 USB controller> port 0xe400-0xe41f irq 10 at device 7.2 on pci
0
usb0: <VIA 83572 USB controller> on uhci0
usb0: USB revision 1.0
uhub0: VIA UHCI root hub, class 9/0, rev 1.00/1.00, addr1
uhub0: 2 ports with 2 removable, self powered
pci0: <unknown card> (vendor=0x1106, dev=0x3040) at 7.3
dc0: <ADMtek AN985 10/100BaseTX> port 0xe800-0xe8ff mem 0xdb000000-0xeb0003ff ir
q 11 at device 8.0 on pci0
dc0: Ethernet address: 00:04:5a:74:6b:b5
miibus0: <MII bus> on dc0
ukphy0: <Generic IEEE 802.3u media interface> on miibus0
ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
ed0: <NE2000 PCI Ethernet (RealTek 8029)> port 0xec00-0xec1f irq 9 at device 10.
0 on pci0
ed0 address 52:54:05:de:73:1b, type NE2000 (16 bit)
isa0: too many dependant configs (8)
isa0: unexpected small tag 14
orm0: <Option ROM> at iomem 0xc0000-0xc7fff on isa0
fdc0: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq2 on isa0
fdc0: FIFO enabled, 8 bytes threshold
fd0: <1440-KB 3.5" drive> on fdc0 drive 0
atkbdc0: <Keyboard controller (i8042)> at port 0x60,0x64 on isa0
atkbd0: <AT Keyboard> flags 0x1 irq1 on atkbdc0
kbd0 at atkbd0
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: model Generic PS/@ mouse, device ID 0
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
sc0: <System console> at flags 0x100 on isa0
sc0: VGA <16 virtual consoles, flags=0x300>
sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
sio0: type 16550A
sio1 at port 0x2f8-0x2ff irq 3 on isa0
sio1: type 16550A
ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
pppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
ppc0: FIFO with 16/16/15 bytes threshold
plip0: <PLIP network interface> on ppbus0
ad0: 8063MB <IBM-DHEA-38451> [16383/16/63] at ata0-master UDMA33
acd0: CD-RW <LITE-ON LTR-1210B> at ata1-slave PIO4
Mounting root from ufs:/dev/md0c
/stand/sysinstall running as init on vty0
仔细检查探测结果以确定 FreeBSD 找到所有您期望出现的设备。
如果设备没有被探测到, 那么就不会列出。
如果此设备需要配置 IRQ 以及 IO 端口地址,
请检查输入是否正确。
如果您需要改变某些设备的设置,您可以很容易地退出 sysinstall
程序,然后从头重新来过。这也有助您熟悉这些过程。
选择离开 Sysinstall
在主界面使用方向键选择 Exit Install 您会看到
如下的信息:
User Confirmation Requested
Are you sure you wish to exit? The system will reboot
(be sure to remove any floppies from the drives).
[ Yes ] No
如果 CDROM 还留在光驱里,而且选择了
&gui.yes;, 则安装程序将重新启动。
如果您是从软盘启动,那么重新开机前您必须将 mfsroot.flp
软盘取出再换上 kern.flp 软盘。
介绍 Sysinstall
sysinstall 是 FreeBSD 项目所提供的安装程序。
它以 console(控制台)为主,分为多个菜单及画面让您配置及控制安装过程。
sysinstall 菜单画面由方向键、Enter
、 Space 、以及其它按键所控制。在主画面的 Usage 菜单
有这些按键的说明。
要查看这些说明,请将光标移到 Usage 项目,然后
[Select] 按键被选择,,
然后按下 Enter 键。
安装画面的使用说明会显示出来,阅读完毕请按 Enter 键回到主
画面。
选取 Sysinstall 主菜单的 Usage 项目
选择 Documentation(说明文件) 菜单
用方向键从主菜单选择 Doc 条目然后按
Enter 键。
选择说明文件菜单
这将会进入说明文件菜单。
阅读这些说明文件很重要。
要阅读一篇文章,请用方向键选取要阅读的文章然后按 Enter 键。
阅读中再按一下 Enter 就会回到说明文件画面。
若要回到主菜单,用方向键选择 Exit 然后按下
Enter 键。
选择键盘对应(Keymap)菜单
如果要改变键盘按键的对应方式,请在主菜单选取 Keymap
然后按 Enter 键。一般情况下不改变此项,除非您使用了非标准键盘或非
美国键盘。
Sysinstall 主菜单
您可以使用上下键移动到您想使用的键盘对应方式,然后按下 Space
键以选取它;再按 Space 键可以取消选取。当您完成后,请选择 &gui.ok;
然后按 Enter 键。
这一屏幕只显示出部分列表。选择 &gui.cancel; 按 Tab 键将使用
默认的键盘对应,并返回到主菜单
安装选项设置画面
选择 Options 然后按 Enter 键。
Sysinstall 主菜单
Sysinstall 选项设置
预设值通常可以适用于大部分的使用者,您并不需要改变它们。版本名称要
根据安装的版本进行变化。
目前选择项目的描述会在屏幕下方以蓝底白字显示。注意其中有一个项目是
Use Defaults(使用默认值) 您可以由此项将所有的
设定还原为预设值。
可以按下 F1 来阅读各选项的说明。
按 Q 键可以回到主画面。
开始进行标准安装
Standard(标准) 安装适用于那些 &unix; 或
FreeBSD 的初级使用者。用方向键选择 Standard 然后按
Enter 键可开始进入标准安装。
开始进行标准安装
分配磁盘空间
您的第一个工作就是要分配 FreeBSD 用的硬盘空间以便 sysinstall
先做好一些准备。为了完成这个工作,您必须先对 FreeBSD 如何找到
磁盘信息做一个了解。
BIOS 磁盘编号
当您在系统上安装配置 FreeBSD 之前,有一个重要的事情一定要注意,尤其
是当您有多个硬盘的时候。
DOS
Microsoft Windows
在 pc 架构,当您跑像 &ms-dos; 或 µsoft.windows; 这种跟 BIOS 相关的操作
系统的时候,BIOS 有能力改变正常的磁盘顺序,然后这些操作系统会跟着 BIOS 做改变。
这让使用者不一定非要有所谓的 primary master
硬盘开机。许多人发
现最简单而便宜备份系统的方式就是再去买一块一模一样的硬盘,然后定期将数据从第
一块硬盘复制到第二个硬盘,使用
Ghost 或
XCOPY 。所以,当第一个硬盘死了,或者是被病毒破坏,
或者有坏轨道,他们可以调整 BIOS 中的开机顺序而直接用第二块硬盘开机。这跟将机壳
拆开,把第二块硬盘跟第一块硬盘对调(要调jumper)有同样的效果,差别就是不用拆壳;
因此,对有这方面需求的人而言,直接在 BIOS 中设定非常方便。
SCSI
BIOS
比较昂贵,配有 SCSI 控制卡的系统通常可以延伸 BIOS 的功能来让 SCSI 设备(可达七个)
达到类似改变顺序的功能。
习惯于使用这种方式的使用者可能会感到惊讶,因为在 FreeBSD 中并非如此。
FreeBSD 不会参考 BIOS,而且也不知道所谓的 BIOS 逻辑磁盘对应
。
是怎么回事。这会让人感觉很疑惑,明明就是一样的硬盘而且资料也完全从另一块
复制过来的,结果却没办法像以前那样用。
当使用 FreeBSD 以前,请将 BIOS 中的硬盘开机顺序调回正常的顺序,并且以后
不要再改变。 如果一定要交换硬盘顺序, 那请用硬件的方式, 打开机壳并调整调线。
范例:Bill 和 Fred 的安装历险
Bill 替 Fred 把旧的 Wintel 的机器装上了 FreeBSD。他装了一台 SCSI 硬盘,
ID 是 0,然后把 FreeBSD 装在上面。
Fred 开始使用他新的 FreeBSD 系统;但是过了几天,他发现这旧的 SCSI
硬盘发生了许多小问题。之后,他就跟 Bill 说起这件事。
又过了几天,Bill 决定是该解决问题的时候了,所以他从后面房间的硬盘
收藏
中找出了一个一模一样的硬盘,并且经过表面测试后显示这块
硬盘没有问题。因此,Bill 将它的 ID 调成 4,然后安装到 Fred 的机器,并且将资料从
磁盘 0 复制到磁盘 4。现在新硬盘装好了,而且看起来好像一切正常;所以,Bill 认为
现在应该可以开始用它了。Bill 于是到 SCSI BIOS 中设定 SCSI ID 4 为开机盘,用磁盘 4
重新开机后,一切跑得很顺利。
继续用了几天后,Bill 跟 Fred 决定要来玩点新的:该将 FreeBSD 升级了。Bill
将 ID 0 的硬盘移除(因为有问题)并且又从收藏区中拿了一块一样的硬盘来。然后他
用 Fred 神奇的网络 FTP 磁盘将新版的 FreeBSD 安装在这块硬盘上;安装过程没什么问
题发生。
Fred 用了这新版本几天后,觉得它很适合用在工程部门…是时候将以前放在旧
系统的工作资料复制过来了。因此,Fred 将 ID4 的 SCSI 硬盘(里面有放着旧系统中复制
过来的最新资料)mount 起来,结果竟然发现在 ID4 的硬盘上,他以前的所有资料都不见
了!
资料跑到哪里去了呢?
当初 Bill 将 ID0 硬盘的资料复制到 ID4 的时候,ID4 即成为一个 新的副本
。
而当他调 SCSI BIOS 设定 ID4 为开机盘,想让系统从 ID4 开机,
这其实只是他自己笨,因为大部分的系统可以直接调 BIOS 而改变开机顺序,但是 FreeBSD 却会把开机
顺序还原成正常的模式,因此,Fred 的 FreeBSD 还是从原来那块 ID0 的硬盘开机的。所有
的资料都还在那块硬盘上,而不是在想象之中的 ID4 硬盘。
幸运的是, 在我们发现这件事的时候那些资料都还在,
我们将这些资料从最早的那块 ID0 硬盘取出来并交还给 Fred,
而 Bill 也由此了解到计算机计数是从 0 开始的。
虽然我们这里的例子使用 SCSI 硬盘,但是相同的概念也可以套用在 IDE 硬盘上。
使用 FDisk 创建分区
如果不再做改变,数据将会写进硬盘。如果您犯了一个错误想重新开始,请选择
sysinstall 安装程序的退出按钮(exit)。或按
U 键来 Undo 操作。如果您的操作没有结果,您总可以重新启动您
的计算机来达到您的目的。
当您在 sysinstall 主菜单选择使用标准安装
后,您会看到下面的信息:
Message
In the next menu, you will need to set up a DOS-style ("fdisk")
partitioning scheme for your hard disk. If you simply wish to devote
all disk space to FreeBSD (overwriting anything else that might be on
the disk(s) selected) then use the (A)ll command to select the default
partitioning scheme followed by a (Q)uit. If you wish to allocate only
free space to FreeBSD, move to a partition marked "unused" and use the
(C)reate command.
[ OK ]
[ Press enter or space ]
如屏幕指示,按 Enter 键,然后您就会看到一个列表
列出所有在探测设备的时候找到的硬盘。
范例显示的是有找到两个 IDE 硬盘的情形,这两个硬盘分别为
ad0 和 ad2 。
选择要分区的硬盘
您可能正在奇怪,为什么 ad1 没有列出来?
为什么遗失了呢?
试想,如果您有两个 IDE 硬盘,一个是在第一个 Primary master,一个是
Secondary master,这样会发生什么事呢?如果 FreeBSD 依照找到的顺序来为他们
命名,如 ad0 和ad1
那么就不会有什么问题。
但是,现在问题来了。如果您现在想在 primary slave 加装第三个硬盘,
那么这个硬盘的名称就会是 ad1 ,之前的
ad1 就会变成ad2 。
这会造成什么问题呢?因为设备的名称(如ad1s1a )
是用来寻找文件系统的,因此您可能会发现,突然,您有些文件系统从此无法正确
地显示出来,必须修改 FreeBSD 配置文件(译注:/etc/fstab)才可以正确显示。
为了解决这些问题,在配置内核的时候可以叫 FreeBSD 直接用 IDE 设备所
在的位置来命名,而不是依据找到的顺序。使用这种方式的话,在 secondary master
的 IDE 设备就 永远是 ad2 ,
即使您的系统中没有ad0 或 ad1
也不受影响。
此为 FreeBSD 内核的默认值,这也是为什么上面的画面只显示
ad0 和 ad2 的原因。
画面上这台机器的两颗硬盘是装在 primary 及 secondary 的 master 上面;并没有任何一个
硬盘安装在 slave 插槽上。
您应该选择您想安装 FreeBSD 的硬盘,然后按下 &gui.ok;。之后
FDisk 就会开始,您会看到类似
的画面。
FDisk 的显示画面分为三个部分。
第一部分是画面上最上面两行,显示的是目前所选择的硬盘的信息。包含它的
FreeBSD 名称、硬盘分布以及硬盘的总容量。
第二部分显示的是目前选择的硬盘上有哪些分区,每个分区的开始及结束位置、
所占容量、FreeBSD 名称、它们的描述以及类别(sub-type)。此范例显示有两个分区、
一个大的 FAT 分区,(很可能是 &ms-dos; 或 &windows; 的
C: )、以及一个扩展分区(在 &ms-dos; 或 &windows; 里
面还可以包含逻辑分区)。
第三个部分显示 FDisk 中可用的命令。
典型的尚未编辑前的 Fdisk 分区表
接下来要做的事跟您要怎么给您的硬盘分区有关。
如果您要让 FreeBSD 使用整个硬盘(稍后您确认要 sysinstall
继续安装后会删除所有这个硬盘上的资料),那么您就可以按
A 键(Use Entire Disk )
目前已有的分区都会被删除,取而代之的是一个小的,标示为 unused
的分区,以及一个大的 FreeBSD 分区。之后,请用方向键将光标移到这个
FreeBSD 分区,然后按 S 以将此分区标记为启动分区。 您会看
到类似 的画面。
注意, 在 Flags
栏中的 A 记号表示此分区是 激活 的,
因而启动将从此分区进行。
要删除现有的分区以便为 FreeBSD 腾出空间,
您可以将光标移动到要删除的分区后按 D 键。
然后就可按 C 键, 并在弹出的对话框中输入将要创建的分区的大小。
输入合适的大小后按 Enter 键。
一般而言, 这个对话框中的初始值是可以分配给该分区的最大值。
它可能是最大的邻接分区或未分配的整个硬盘大小。
如果您已经建立好给 FreeBSD 的分区(使用像 &partitionmagic;
类似的工具),那么您可以按下 C 键来建立一个新
的分区。同样的,会有对话框询问您要建立的分区的大小。
Fdisk 分区使用整个硬盘
完成后,按 Q 键。您的变更会存在 sysinstall
中,但是还不会真正写入您的硬盘。
安装多重引导
在这步骤您可以选择要不要安装一个多重引导管理器。一般而言,如果碰到
下列的情形,您应该选择要安装多重引导管理程序。
您有一个以上的硬盘,并且 FreeBSD 并不是安装在第一个硬盘上。
您可以在一个硬盘上,除了 FreeBSD,您还有安装其它的操作系统;然后
您想要选择在开机的时候要进入哪个系统。
如果您在这台机器上只安装一个 FreeBSD 操作系统,并且安装在第一个硬盘,
那么选择 Standard 安装就可以了。如果您已经使用
了一个第三方的多重引导程序,那么请选择 None 。
选择好配置后请按 Enter 。
Sysinstall 多重引导管理程序
按下 F1 键所显示的在线说明中有讨论一些操作系统共存
可能发生的问题。
在其它硬盘上创建分区
如果您的系统上有一个以上的硬盘,在选择完多重引导管理程序后会再回到
选择硬盘的画面。如果您要将 FreeBSD 安装在多个硬盘上,那么您可以在这里选择
其它的硬盘,然后重复使用 FDisk 来建立分区。
如果您想让 FreeBSD 来管理其它的硬盘,那么两个硬盘都必须安装 FreeBSD
的多重引导管理程序。
离开选择硬盘画面
Tab 键可以在您最后选择的硬盘、 &gui.ok; 以及 &gui.cancel;
之间进行切换。
用 Tab 键将光标移动到 &gui.ok;然后按 Enter
键继续安装过程。
使用 bsdlabel
创建分区
您现在必须在刚刚建立好的 slice 中规划一些 label。 请注意, 每个 label 的代号是
a 到 h , 另外, 习惯上
b 、 c 和
d 是有特殊用途的, 不应该随意变动。
某些应用程序可以利用一些特殊的分区而达到较好的效果,尤其是分区分散
在不同的硬盘的时候。但是,现在您是第一次安装FreeBSD,所以不需要去烦恼如
何分割您的硬盘。最重要的是,装好FreeBSD然后学习如何使用它。当您对FreeBSD
有相当程序的熟悉后,您可以随时重新安装FreeBSD,然后改变您分区的方式。
下面的范例中有四个分区—一个是磁盘交换分区,别外三个是文件系统。
为第一个硬盘分区
分区
文件系统
大小
描述
a
/
100 MB
这是一个根文件系统(root filesystem)。任何其它的文件系统都会
挂在根目录(译注:用根目录比较亲切)下面。 100 MB 对于此目录来说
是合理的大小,因为您往后并不会在这里存放太多的数据;在安装FreeBSD后会
用掉约 40 MB 的根目录空间。剩下的空间是用来存放临时文件用的,同时,
您也应该预留一些空间,因为以后的FreeBSD版本可能会需要较多的
/ (根目录)空间。
b
N/A
2-3 x RAM
此分区为系统磁盘交换分区(swap space)。选择正确的交换空间
大小可是一门学问唷。一般来说,交换空间的大小应该是您系统上内存(RAM)
大小的2到3倍。交换空间至少要有 64 MB 因此,如果您的电脑上的RAM比
32 MB 小,请将交换空间大小设为 64 MB。
如果您有一个以上的硬盘,您可以在每个硬盘上都配置交换分区。 FreeBSD
会利用每个硬盘上的交换空间, 这样做能够提高 swap 的性能。
如果是这种情形, 先算出您总共需要的交换空间大小 (如128 MB),
然后除以您拥有的硬盘数目(如2块),
算出的结果就是每个硬盘上要配置的交换空间的大小。
在这个例子中, 每个硬盘的交
换空间为 64 MB
e
/var
50 MB
/var 目录会存放不同长度的文件、日志以及
其它管理用途的文件。大部分这些文件都是FreeBSD每天在运行的时候会读取或
是写入的。当这些文件放在另外的文件系统(译注:即/var)可以避免影响到
其它目录下面类似的文件存取机制。
f
/usr
剩下的硬盘空间
您所有的其它的文件通常都会存在/usr
目录以及其子目录下面。
如果您要将FreeBSD安装在一个以上的硬盘,那么您必须在您配置的其它分区上
再建立分区。最简单的方式就是在每个硬盘上建立两个分区,一个是交换分区,一个
是文件系统分区。
为其它磁盘分区
分区
文件系统
大小
描述
b
N/A
见描述
之前提过,交换分区是可以跨硬盘的。但是,即使
a 分区没有使用,习惯上还是会把交换分区放在
b 分区上。
e
/diskn
剩下的硬盘空间
剩下的空间是一个大的分区,最简单的做法是将之规划为
a 分区而不是e 分区。然而,
习惯上a 分区是保留给根目录 (/ )
用的。您不一定要遵守这个习惯,但是sysinstall
会,所以照着它做会使您的安装比较清爽、干净。您可以将这些文件系统挂在任何
地方,本范例建议将它们挂在/diskn 目录,n 依据每个硬盘而有所不同,但是,您喜欢的话
也可将它们挂在别的地方。
分区的配置完成后,您可以用sysinstall .
来建立它们了。您会看到下面的信息:
Message
Now, you need to create BSD partitions inside of the fdisk
partition(s) just created. If you have a reasonable amount of disk
space (200MB or more) and don't have any special requirements, simply
use the (A)uto command to allocate space automatically. If you have
more specific needs or just don't care for the layout chosen by
(A)uto, press F1 for more information on manual layout.
[ OK ]
[ Press enter or space ]
按下 Enter 键开始FreeBSD分区表编辑器,称做
Disklabel 。
显示您第一次执行
Disklabel 的画面。画面分为三个区域。
前几行显示的是您正在编辑的硬盘以及您正在建立的slice位于哪个分区上。
(在这里, Disklabel 使用的是
分区名称 而不是 slice 名)。此画面也会显示slice还有
多少空间可以使用;亦即,有多余的空间,但是尚未指派分区。
画面中间区域显示已建立的区区,每个分区的文件系统名称、所占的大小以及
一些关于建立这些文件系统的参数选项。
下方的第三区显示在 Disklabel 中可用的按键。
Sysinstall Disklabel 编辑器
Disklabel 您可以自动配置分区以及给它们预设
的大小。您可以按 A 键使用此功能。您会看到类似
的画面。根据您硬盘的大小,自动分配所配置
的大小不一定合适。但是没有关系,您并不一定要使用预设的大小。
默认情况下会给/tmp
目录一个独立分区,而不是附属在 / 之下。这样可以
避免将一些临时文件放到根目录中(译注:可能会用完根目录空间)。
Sysinstall Disklabel 编辑器-使用自动配置
如果您不想使用默认的分区布局,
则需要用方向键移动光标并选中第一个分区, 然后按
D 来删除它。 重复这一过程直到删除了所有推荐的分区。
要建立第一个分区 (a , 作为
/ — 根文件系统), 请确认您已经在屏幕顶部选中了正确的
slice, 然后按 C 。 接下来将出现一个对话框, 要求您输入新分区的尺寸
(如 所示)。 您可以输入以块为单位的尺寸,
或以 M 表示MB、
G 结尾表示GB, 或者 C
表示柱面数的方式来表达尺寸。
从 FreeBSD 5.X 开始, 用户可以:
使用 Custom Newfs
(Z ) 选项来选择
UFS2 (在 &os; 5.1 和更高版本中的默认值)。 用
Auto Defaults 来创建, 然后用 Custom Newfs 选项,
或在创建文件系统时指定 -O 2 。
如果您使用了 Custom Newfs 选项,
不要忘记增加 -U 来启用 SoftUpdates!
根目录使用空间
显示在对话框中的默认大小是使用整个分区,您可以用
Backspace 键删除这些数字然后按照上述方式输入您想要的
大小,如64M (),
然后按&gui.ok;。
编辑要分区大小
输入完大小后接着问您要建立的分区是文件系统还是交换空间,如
所示。第一个分区是文件系统,所以
确认选择 FS 后按Enter 键。
选择根分区类型
最后,因为您要建立的是一个文件系统,所以必须告诉
Disklabel 这个文件系统要挂接在什么地方,如
所示。根文件系统的挂接点
/ , 所以请输入 / ,然后按
Enter 键。
选择根挂接点
刚刚制作好的分区会显示在画面上。您应该重复上述的动作以建立其它的
分区。当建立交换空间的时候,系统不会问您要将它挂接在哪里,因为交换空间是不用
挂在系统上的。当您在建立最后一个分区/usr 的时候,您可以
直接使用默认的大小,即所有此分区剩余的空间。
您最终的 FreeBSD DiskLabel 编辑器画面会类似
, 实际数字按您的选择而有所不同。按下
Q 键完成分区的建立。
Sysinstall Disklabel 编辑器
选择要安装的软件包
选择要安装的软件包
安装哪些软件包在很大程度上取决于系统将被用来做什么,以及有多少可用的磁盘空间。
内建的选项包括了运行所需要的最小系统,到把所有软件包全都装上的常用配置。
&unix; 或 FreeBSD 新手通常直接选择一个设定好的软件包就可以了,
而有经验的使用者则可以考虑自己订制安装哪些软件包。
按下 F1 可以看到有关软件包的更多选项信息,
以及它们都包含了哪些软件,之后,可以按 Enter
回到软件包选择画面。
如果您想要使用图形界面,
则必须选择软件包名称开头是 X 的那些软件包。
对于 X 服务器的配置,
以及选择默认的桌面管理器这样的工作必须在 &os; 安装完成之后才能作。
关于配置 X 服务器的更多资料可以在 找到。
默认的 X11 版本取决于您所安装的 FreeBSD 版本。
对于 FreeBSD 5.3 以前的版本,
安装的将是 &xfree86; 4.X 。 对于
&os; 5.3 和以后的版本, 默认的则是
&xorg; 。
如果需要定制内核, 您还需要选择包含源代码的那个选项。
要了解为什么应该编译和构建新的内核, 请参见
。
显然, 包含所有组件的系统是最万能的。
如果磁盘空间足够, 用光标键选择
中的
All
并按 Enter 。 如果担心磁盘空间不够的话,
则选择最合适的选项。 不要担心选择的是否是最合适的,
因为其他软件包可以在安装完毕后再加入进来。
选择软件包
安装ports软件包
当选择完您想要安装的部分后,接着会询问您要不要安装FreeBSD Ports
软件包;Ports软件包可以让您简单方便地安装软件包。Ports本身并不包含编辑
软件所需要的程序源代码,而是一个包含自动下载、编辑以及安装的文档集合。
一章讨论如何使用Ports.
安装程序并不会检查您是否有足够的硬盘空间来放ports,所以,如果要安装
ports软件所,请先确定您有足够的硬盘空间。 FreeBSD &rel.current;版本
FreeBSD Ports Collection 大约占用 &ports.size; 大小的硬盘空间。您要为
这些版本设置大一点的值来安装它们。
User Confirmation Requested
Would you like to install the FreeBSD Ports Collection?
This will give you ready access to over &os.numports; ported software packages,
at a cost of around &ports.size; of disk space when "clean" and possibly much
more than that if a lot of the distribution tarballs are loaded
(unless you have the extra CDs from a FreeBSD CD/DVD distribution
available and can mount it on /cdrom, in which case this is far less
of a problem).
The Ports Collection is a very valuable resource and well worth having
on your /usr partition, so it is advisable to say Yes to this option.
For more information on the Ports Collection & the latest ports,
visit:
http://www.FreeBSD.org/ports
[ Yes ] No
选择 &gui.yes; 将会安装
Ports Collection, 而选择 &gui.no;
则将跳过它。 选好后按 Enter 继续。
此后, 选择安装的软件包的屏幕将再次出现。
确认您要安装的软件包
如果对您的选择感到满意,请选择Exit
退出,确保&gui.ok; 被高亮显示,然后按Enter
继续。
选择您要使用的安装介质
如果要从 CDROM 或 DVD安装,使用方向键将光标移到
Install from a FreeBSD CD/DVD 。确认
&gui.ok; 被选取,然后按 Enter 开始安装程序。
如果要使用其它的方式安装,请选择适当的安装介质然后按照屏幕指示
进行安装。
按 F1 可以显示安装介质的在线说明。按一下
Enter 可返回选择安装介质画面。
选择安装介质
FTP安装模式
installation
network
FTP
使用FTP安装,有三种方式:主动式(active)FTP、被动式(passive)FTP
或是透过HTTP代理服务器。
主动式FTP: 从FTP服务器安装
这个选项将会使所有的FTP传输使用 Active
模式。
这将无法通过防火墙,但是可以使用在那些比较早期,不支持被动模式的FTP站。
如果您的连接在使用被动(默认值)模式卡住了,请换主动模式看看!
被动模式FTP: 通过防火墙从FTP服务器安装
FTP
passive mode
此选项会让 sysinstall 使用
Passive
模式来安装。这使得使用者可以穿过
不允许用非固定TCP PORTS连入的防火墙。
FTP 透过 HTTP 代理服务器: 透过HTTP代理服务器,由
FTP服务器安装
FTP
via a HTTP proxy
此选项会让 sysinstall 通过HTTP协议
(像浏览器一样)连到proxy服务器。proxy服务器会解释送出的请求,
然后通知FTP服务器。因为通过HTTP协议,所以可以穿过防火墙。
要用这种方式,您必须指定proxy服务器的地址。
对于一个 FTP 代理服务器而言,通常在使用者登入名称中加入您要登入的
服务器的用户名,加在 @
符号后面。然后代理服务器就会
假装
成一个真的服务器。 例如, 假设您要从
ftp.FreeBSD.org 安装,通过 FTP
代理服务器 foo.example.com ,使用1024端口。
在这种情况下,您可以到 options 菜单,将 FTP username 设为
ftp@ftp.FreeBSD.org ,密码设为您的电子邮件地址。
安装介质部分,指定FTP (或是被动式 FTP,如果代理服务器支持的话) 以及URL为
ftp://foo.example.com:1234/pub/FreeBSD 。
因为ftp.FreeBSD.org 的
/pub/FreeBSD 目录会被抓取到
foo.example.com 之下,您就可以从
这台 机器 (会从
ftp.FreeBSD.org 抓取文件) 安装。
安装确认
到此为止,可以开始进行安装了,这也是您避免更动到您的硬盘的最后机会。
User Confirmation Requested
Last Chance! Are you SURE you want to continue the installation?
If you're running this on a disk with data you wish to save then WE
STRONGLY ENCOURAGE YOU TO MAKE PROPER BACKUPS before proceeding!
We can take no responsibility for lost disk contents!
[ Yes ] No
选择 &gui.yes; 然后按下
Enter 确认安装
安装所需的时间会根据您所选择的软件、安装介质以及您电脑的速度而有所不同。
在安装的过程中会有一些信息来显示目前的进度。
当您看到下面的信息表示已经安装完成了:
Message
Congratulations! You now have FreeBSD installed on your system.
We will now move on to the final configuration questions.
For any option you do not wish to configure, simply select No.
If you wish to re-enter this utility after the system is up, you may
do so by typing: /stand/sysinstall .
[ OK ]
[ Press enter to continue ]
按下 Enter 以进行安装后的配置。
选择 &gui.no; 然后按 Enter
会取消安装,不会对您的系统造成更动。您会看到下面的信息:
Message
Installation complete with some errors. You may wish to scroll
through the debugging messages on VTY1 with the scroll-lock feature.
You can also choose "No" at the next prompt and go back into the
installation menus to retry whichever operations have failed.
[ OK ]
产生这个信息是因为什么东西也没有安装,按下 Enter
后会离开安装程序回到主安装界面。从主安装界面可以退出安装程序。
安装后的配置
安装成功后, 就可以进行进一步的配置了。
引导新安装的 FreeBSD 系统之后, 使用
sysinstall (/stand/sysinstall
如果您使用的是 &os; 5.2 之前的版本), 并选择
Configure 。
配置网卡
如果您之前配置用 PPP 通过 FTP 安装,那么这个画面将不会出现;正像所说
的那样,您可以稍后再做配置。
如果想更多的了解网卡或将FreeBSD配置为网关或路由器,请参考
Advanced Networking
的相关文章。
User Confirmation Requested
Would you like to configure any Ethernet or SLIP/PPP network devices?
[ Yes ] No
如果要配置网卡,请选择
&gui.yes; 然后按 Enter 。
否则请选择 &gui.no; 继续。
选择网卡设备
用方向键选择您要配置的网卡接口,然后按Enter 。
User Confirmation Requested
Do you want to try IPv6 configuration of the interface?
Yes [ No ]
目录私人区域网络IP协议IPv4 已经足够,所以选择
&gui.no; 然后按 Enter 。
如果想试试新的IP通信协议 IPv6 ,使用 RA
服务,请选择 &gui.yes; 然后按 Enter 。
寻找 RA 服务器将会花费几秒的时间。
User Confirmation Requested
Do you want to try DHCP configuration of the interface?
Yes [ No ]
如果您不需要 DHCP (Dynamic Host Configuration Protocol 动态主机配置协议)
,选择 &gui.no; 然后按Enter 。
选择 &gui.yes; 会执行dhclient ,
如果成功,它会自动将网络配置信息填上。更多的信息请参考
。
下面的网络配置显示了怎样把以太网设备配置成区域网络网关的角色。
配置 ed0接口
使用Tab 键可以在各个栏目之间进行切换,请输入适当
的信息:
Host(机器名称)
完整的机器名称,例如本例中的 k6-2.example.com 。
Domain(域名)
您机器所在的域名称,如本例的 example.com
IPv4 Gateway(IPv4网关)
输入将数据包传送到远端网络的机器IP地址。只有当机器是网络上的
一个节点时才要输入。如果这台机器要作为您局域网的网关,
请将此处设为空白 。IPv4网关,也被称作默认网关或
默认路由器。
域名服务器
本地网络中的域名服务器的IP地址。本例中假设机器所在的网络中
没有域名服务器,所以填入的是ISP提供的域名服务器地址
(208.163.10.2 。)
IPv4 地址
本机所使用的IP地址。本例为
192.168.0.1 。
子网掩码
本范例中的IP地址属于一个C类地址
(192.168.0.0 -
- 192.168.255.255 )。默认的子网掩码为
+ 192.168.0.255 )。默认的子网掩码为
(255.255.255.0 )。
ifconfig 额外参数设定
任何ifconfig 命令跟网卡接口有关的参数。
本范例中没有。
使用 Tab 键选择 &gui.ok;然后按
Enter 键。
User Confirmation Requested
Would you like to Bring Up the ed0 interface right now?
[ Yes ] No
选择 &gui.yes; 然后按
Enter 将会将机器的网卡转为启用状态。机器下次启动
的时候即可使用。
配置网关
User Confirmation Requested
Do you want this machine to function as a network gateway?
[ Yes ] No
如果这台机器要作为本地网络和其它机器之间传送数据包的网关,请选择
&gui.yes; 然后按 Enter 。
如果这台机器只是网络上的普通节点,请选择 &gui.no;
并按 Enter 继续。
配置网络服务
User Confirmation Requested
Do you want to configure inetd and the network services that it provides?
Yes [ No ]
如果选择 &gui.no; ,许多网络服务,如
telnetd 将不会启用。这表示远端用户将无法
telnet 进入这台机器。本机器上的用户还是可以
telnet 到远端机器的。
这些服务可以在安装完成后修改/etc/inetd.conf
配置文件来启用它们。请参阅
以获得更多的信息。
如果您想现在就配置这些网络服务,请选择[ Yes ] ,
然后会看到下面的信息:
User Confirmation Requested
The Internet Super Server (inetd) allows a number of simple Internet
services to be enabled, including finger, ftp and telnetd. Enabling
these services may increase risk of security problems by increasing
the exposure of your system.
With this in mind, do you wish to enable inetd?
[ Yes ] No
选择 &gui.yes; 继续。
User Confirmation Requested
inetd(8) relies on its configuration file, /etc/inetd.conf, to determine
which of its Internet services will be available. The default FreeBSD
inetd.conf(5) leaves all services disabled by default, so they must be
specifically enabled in the configuration file before they will
function, even once inetd(8) is enabled. Note that services for
IPv6 must be separately enabled from IPv4 services.
Select [Yes] now to invoke an editor on /etc/inetd.conf, or [No] to
use the current settings.
[ Yes ] No
选择 &gui.yes; 将允许您添加网络服务
(或将相应网络服务每行开头的 # 除掉即可。)
编辑 inetd.conf 配置文件
在加入您想启用的服务后,按下 Esc 键会出现一个
对话框可以让您离开以及保存修改。
匿名 FTP
FTP
anonymous
User Confirmation Requested
Do you want to have anonymous FTP access to this machine?
Yes [ No ]
不允许匿名 FTP访问
选择默认的 &gui.no; 并按下
Enter 键将仍然可以让在这台机器上有账号的用户访问
FTP。
允许匿名 FTP访问
如果您选择允许匿名 FTP 存取,那么网络中任何人都可以使用FTP来访问您
的机器。在启用匿名访问之前应该考虑网络的安全问题。如果要知道更多有关网络
安全的信息,请参阅 。
要启用FTP匿名访问,用方向键选择 &gui.yes;
然后按 Enter 键。您会看到下面(或类似)的画面:
默认的匿名 FTP 配置
按 F1 键可以查看在线帮助文档:
This screen allows you to configure the anonymous FTP user.
The following configuration values are editable:
UID: The user ID you wish to assign to the anonymous FTP user.
All files uploaded will be owned by this ID.
Group: Which group you wish the anonymous FTP user to be in.
Comment: String describing this user in /etc/passwd
FTP Root Directory:
Where files available for anonymous FTP will be kept.
Upload subdirectory:
Where files uploaded by anonymous FTP users will go.
默认的FTP根目录将放在 /var 目录下。如果您
的/var目录空间不足以应付您的FTP需求,您可以将FTP的根目录改为
/usr 目录下的 /usr/ftp
目录。
当您对一切配置都满意后,请按 Enter 键继续。
User Confirmation Requested
Create a welcome message file for anonymous FTP users?
[ Yes ] No
如果您选择 &gui.yes; 并按下
Enter 键,系统会自动打开文本编辑器让您编辑FTP的欢迎信息。
编辑FTP欢迎信息
此文本编辑器叫做 ee 。按照指示修改信息文本或是
稍后再用您喜爱的文本编辑器来修改。请记住画面下方显示的文件位置。
按 Esc 将弹出一个默认为
a) leave editor 的对话框。按
Enter 退出并继续。再次按
Enter 将保存修改。
配置网络文件系统
网络文件系统 (NFS) 可以让您可以在网络上共享您的文件。一台机器可以
配置成NFS服务器、客户端或两者并存。请参考
以获得更多的信息。
NFS 服务器
User Confirmation Requested
Do you want to configure this machine as an NFS server?
Yes [ No ]
如果您不想安装网络文件系统,请选择 &gui.no;
然后按 Enter 键。
如果您选择 &gui.yes; 将会出现一个对话框提醒您
必须先建立一个 exports 文件。
Message
Operating as an NFS server means that you must first configure an
/etc/exports file to indicate which hosts are allowed certain kinds of
access to your local filesystems.
Press [Enter] now to invoke an editor on /etc/exports
[ OK ]
按 Enter 键继续。系统会启动文本编辑器让您编辑
exports 文件。
编辑 exports 文件
按照指示加入真实输出的文件目录或是稍后用您喜爱的编辑器自行编辑。
请记下画面下方显示的文件名称及位置。
按下 Esc 键会出现一具对话框,默认选项是
a) leave editor 。按下
Enter 离开并继续。
NFS 客户端
NFS 客户端允许您的机器访问NFS服务器。
User Confirmation Requested
Do you want to configure this machine as an NFS client?
Yes [ No ]
按照您的需要,选择 &gui.yes;
或 &gui.no; 然后按 Enter 。
安全配置
安全配置
中包含了一些可以通过启用或停用某些程序
来达到某些程序的安全性配置。安全配置越严格,则默认启动的程序就越少。
基本的原则是:除非必要,否则不要执行一些可有有无的程序。
请注意,安全文件的配置都是默认值,在安装完成后您可以随时通过
编辑 /etc/rc.conf 配置文件来改变这些配置。
如果想得到更多的信息请参阅 &man.rc.conf.5; 手册。
下表说明每一种安全等级的意义。每列所代表的是安全等级,每行所
代表的是程序或功能是启用还是停用。
可能的安全等级
极/高度安全
中度安全
&man.sendmail.8;
否
是
&man.sshd.8;
否
是
&man.portmap.8;
否
不一定
如果之前安装时配置机器为NFS客户端或服务器,则会启用些
项目。
NFS server
否
是
&man.securelevel.8;
是
如果打算将安全级配置 securelevel 设置为 Extreme
或 High
, 请务必阅读 &man.init.8; 联机手册,
并特别注意有关安全等级意义的部分, 以了解其影响;
否则您稍后就可能会遇到很大的麻烦!
否
User Confirmation Requested
Do you want to select a default security profile for this host (select
No for "medium" security)?
[ Yes ] No
选择 &gui.no; 并按
Enter 会将安全等级高为中度安全。
选择 &gui.yes; 并按
Enter 将允许您选择其它程度的安全等级。
选择安全等级
按 F1 显示在线帮助;按Enter
键可以回到选择画面。
如果您没有什么特殊的等级需求,请用方向键选择 中度 ,
确定选择了 &gui.ok; 然后按Enter 。
依据您选择的安全等级,会显示相对应的确认信息。
Message
Moderate security settings have been selected.
Sendmail and SSHd have been enabled, securelevels are
disabled, and NFS server setting have been left intact.
PLEASE NOTE that this still does not save you from having
to properly secure your system in other ways or exercise
due diligence in your administration, this simply picks
a standard set of out-of-box defaults to start with.
To change any of these settings later, edit /etc/rc.conf
[OK]
Message
Extreme security settings have been selected.
Sendmail, SSHd, and NFS services have been disabled, and
securelevels have been enabled.
PLEASE NOTE that this still does not save you from having
to properly secure your system in other ways or exercise
due diligence in your administration, this simply picks
a more secure set of out-of-box defaults to start with.
To change any of these settings later, edit /etc/rc.conf
[OK]
按下 Enter 继续安装后面的配置。
安全等级并非万能药!即使您选择极度安全,您还是必须时常阅读
邮件列表中有关安全的部分、使用有效的密码以及平常就注意安全问题。
这里只是稍为配置一下常用的安全等级而已。
配置系统终端
系统提供了几个选项可以让您配置终端的表现方式。
User Confirmation Requested
Would you like to customize your system console settings?
[ Yes ] No
要查阅及配置这些选项,请选择 &gui.yes;
并按Enter 。
系统终端配置选项
最常用的选项就是屏幕保护程序了。使用方向键将光标移动到
Saver 然后按Enter 。
屏幕保护程序选项
选择您想使用的屏幕保护程序,然后按 Enter 。
之后回到系统终端配置画面。
默认开启屏幕保护程序的时间是300秒。如果要更改此时间,请再次选择
Saver 。然后选择 Timeout
并按 Enter 键。系统会弹出一个对话框如下:
屏幕保护时间设置
您可以直接改变这个值,然后选 &gui.ok;并按 Enter
键回到系统终端配置画面。
退出系统终端配置
选择 Exit 然后按下
Enter 键会回到安装后的配置画面。
配置时区
配置您机器的时区可以让系统自动校正任何区域时间的变更并且在执行
一些跟时区相关的程序时不会出错。
例子中假设此台机器位于美国东部的时区。请参考您所在的地理位置来配置。
User Confirmation Requested
Would you like to set this machine's time zone now?
[ Yes ] No
选择 &gui.yes; 并按下
Enter 键以配置时区。
User Confirmation Requested
Is this machine's CMOS clock set to UTC? If it is set to local time
or you don't know, please choose NO here!
Yes [ No ]
这里按照您机器时间的配置,选择 &gui.yes;
或 &gui.no; 然后按 Enter 。
选择您所处的地理区域
请选择适当的区域然后按 Enter 。
选择您所在的国家
选择您所在的国家然后按 Enter 。
选择您所在的时区
选择您所在的时区然后按 Enter 。
Confirmation
Does the abbreviation 'EDT' look reasonable?
[ Yes ] No
检查一下时区的缩写是否正确,如果没错,请按 Enter
返回系统安装后的配置画面。
Linux 兼容性
User Confirmation Requested
Would you like to enable Linux binary compatibility?
[ Yes ] No
选择 &gui.yes; 并按下Enter
键,将允许您在FreeBSD中执行Linux的软件。安装程序会安装一些为了跟Linux
兼容的软件包。
如果您是通过FTP安装,那么您必须连到网络上。有时候FTP站并不会包含
所有的安装软件包(例如Linux兼容软件包);不过,稍后您还可以再安装这个
项目。
配置鼠标
此选项可以让您在终端上使用三键鼠标剪贴文字。如果您用的鼠标是两个
按钮,请参考手册 &man.moused.8;;以取得有关模拟三键鼠标的信息。范例中
使用的鼠标不是USB接口。(例如ps/2或com接口的鼠标):
User Confirmation Requested
Does this system have a non-USB mouse attached to it?
[ Yes ] No
如果您使用的不是USB鼠标,请选择 &gui.yes; ;
否则请选择 &gui.no; 。然后按Enter 。
选择鼠标类型
使用方向键选择 Type 然后按
Enter 。
设置鼠标协议
在这个例子中使用的类型是ps/2鼠标,所以可以使用默认的
Auto(自动) 。 您可以用方向键选择合适的项目,
确定选择了 &gui.ok; 后按 Enter 键离开此画面。
配置鼠标端口
选择 Port 然后按 Enter 。
配置鼠标端口
假设这台机器用的是ps/2鼠标,您可以采用默认的
PS/2 选项。请选择适当的项目然后按
Enter 。
启动鼠标服务进程
选择Enable 然后按
Enter 来启动和测试鼠标。
测试鼠标功能
鼠标指针可以在屏幕上移动,指明鼠标服务已经正常启用。那么请选择
&gui.yes; 按 Enter 键。否则鼠标没
有配置成功 — 选择 &gui.no; 并尝试不同的配置
选项。
选择 Exit 并按
Enter 退回到系统安装完成后的配置画面。
Tom
Rhodes
Contributed by
配置其他网络服务
配置网络服务总是让那些新手敬畏,因为他们缺乏在这个领域应有的基础知识。
网络,包括因特网有许多关于现代操作系统包括 &os; 的评论文章。这些文章对于
理解&os;拥有的广泛的网络性能是非常有帮助的。在安装这些服务的过程中也能让
用户理解它们可用的各种服务。
网络服务是一些可以使在网络的任何人来访问您提供的服务的程序。有许多
努力想使这些程序不会有任何的 伤害
。不幸的是,这些程序并
不是十全十美的,黑客可能会掌握程序中的一些露洞来进行攻击。只启用一些您
熟悉的和需要的服务十分重要。如果您存在一些疑虑或没有启用这些服务的必要
那么最好不要使用这些服务。您可以事后通过运行
sysinstall 程序或使用
/etc/rc.conf 配置文件来启用它们。
选择 Networking
选项将下显示一个类似下面的菜单:
网络配置之上层配置
第一个选项,Interfaces ,
已经在前面 中讨论过,因此这里可以略过。
选择 AMD 选项,添加 BSD
对自动挂接程序的支持。这个程序和NFS 协议一起使用
不需要经过特别的设置就可以自动挂接远程文件系统。
下一行是 AMD Flags 的参数选项。当您选择后,会弹出一个
子菜单来让您选择 AMD 的参数。菜单中包含一系列的选项:
-a /.amd_mnt -l syslog /host /etc/amd.map /net /etc/amd.map
-a 选项用来设置默认的挂接位置,这里使用的是
/.amd_mnt 目录。 -l
指定默认的 日志 文件;但是,当
syslogd 被指定用来接收所有的日志时,那么它们会被送到
系统日志程序。/host 被用来挂接远程
主机输出的一个文件系统,例子中/net
目录被用来挂接从IP 输出的一个文件系统。
/etc/amd.map 文件定义了 AMD 的默认
输出选项。
FTP
anonymous
Anon FTP 允许匿名 FTP 访问。
选中这个选项,可以使这台机器成为一台匿名 FTP 服务器。
要注意启用这个选项的安全风险。其它的菜单将说明一些安全问题和更深入的配置。
Gateway 配置菜单可以使本机器成为一台以前我们提到过
的网关。如果您在安装过程中偶尔选中了它,也可以在这里选中这个选项来取消。
Inetd 选项用来配置或完全禁止我们在上面讨论的
&man.inetd.8; 守护程序。
Mail 可以用来配置系统默认的 MTA
或邮件传输代理。选择这个选项将了出现下面的菜单:
选择默认的 MTA
这里给您提供了一个安装默认MTA 的机会。
MTA 用来投递本系统上用户邮件到因特网去。
选择 Sendmail 将会安装 &os;默认的
流行的的 sendmail 服务程序。
Sendmail local 选项用来设置sendmail
默认的MTA ,也可以禁止它从Internet接收邮件的能力。
还有其它的一些选项如:
Postfix 和
Exim 都类似于
Sendmail 的角色。它们两者也可以投递邮件;
有些用户更喜欢选择使用Sendmail 、
MTA 二者之一。
选择 MTA 或不选择它之后,网络配置菜单的下一
个选项是 NFS client 客户端程序。
NFS client 客户端可以使系统通过 NFS
与服务器进行通信。
NFS 服务器通过NFS
协议可以使其它在网络上的机器来访问自己的文件系统。如果这台机器要作为一台
独立的服务器,这个选项可以保留不选。下面可能还有更多的配置,关于客户端和
服务器的配置请参阅 一节。
接下来的 NFS 服务器选项,可以允许您把系统设备成
为一台NFS 服务器。这需要更多的信息来启动远程过程调
用(RPC )服务。 RPC 用来连接调
用两台机器上的程序。
下一项是 Ntpdate 选项,处理时间同步。当选择它后,
会出现一个像下面所似的菜单:
Ntpdate 配置
从这个菜单选择一个离您最近的服务器。在您连接这台服务器时,除去
连接时的反应时间,时间同步最精确的服务器。
下一个选项是 PCNFSD 。 这个选项将安装第三方软件包
net/pcnfsd 。 它可以用来为无法自行提供
NFS 认证服务的操作系统, 如微软的 &ms-dos; 提供服务。
滚屏到下一页看一下其它选项:
网络配置之下层配置
&man.rpcbind.8;, &man.rpc.statd.8; 和 &man.rpc.lockd.8;
这三个程序是用来提供远程过程调用 (RPC ) 服务的。
rpcbind 程序管理 NFS
服务器和客户端的通信, 这是 NFS 正确工作的必要前提。
rpc.statd 程序可以和其它主机上
rpc.statd 程序交互, 以提供的状态监控。
这些状态报告默认情况下会保存到
/var/db/statd.status 文件中。 最后的一项是
rpc.lockd 选项, 如果启用,
则将提供文件上锁服务。 通常将它和 rpc.statd
联用, 以监视哪些主机会请求对文件执行上锁操作, 以及这种操作的频繁程度。
尽管后两项功能对于调试非常有用, 但它们并不是
NFS 服务器和客户端正常运行所必需的。
下一个项目是Routed ,这是一个路由程序。
&man.routed.8; 程序管理网络路由表,发现多播路由,
并且支持在网络上与它物理相连的主机来复制它的路由表的请求。
它被广泛地应用在本地网络中并扮演关网关的角色。
当选择它后,一个子菜单会来询问您这个程序的默认位置。
默认的位置已经被定义过, 您可以选择 Enter 键,
也可以按下其它的键。 这时会出来另一个菜单来询问您传递给 routed 程序的参数。
默认的是 -q 参数。
接下来是 Rwhod 选项,选中它会启用 &man.rwhod.8; 程序
在系统初时化的时候。 rwhod 程序通过网络周期性的广播系统
信息或以客户
的身份来收集这些信息。更多的信息可以查看
&man.ruptime.1; 和&man.rwho.1; 手册页。
倒数第二个选项是&man.sshd.8; 程序。它可以通过使用
OpenSSH 来提供安全的shell服务,我们推荐通过
使用它来使用 telnet 和 FTP 服务。
sshd 服务通过使用加密技术来创建从一台机器到另一台机
器的安全连接。
最后有一个 TCP 扩展选项。这可以用来扩展在
RFC 1323 和RFC 1644
里定义的TCP 功能。当许多主机以高速连接本机时,可
能会引起某些连接被丢弃。我们不推荐使用这个选项,但是当使用独立的主机
时可以从它上面得到一些好处。
现在您已经配置完成了网络服务,您可以滚动屏幕到顶部选择 Exit
项,退出进入下一个配置部分。
配置 X Server
从 &os; 5.3-RELEASE 开始, X 服务的配置机制从
sysinstall 中删掉了。 您必须在安装完 &os;
之后再配置 X 服务。 关于安装和配置 X 服务的进一步细节可以在 找到。 如果您不是在安装 5.3-RELEASE 之前的 &os; 版本的话,
则可以跳过这一节。
要使用诸如
KDE 、 GNOME ,
以及其他一些图形界面, 则需要配置 X 服务器。
为了以非root 用户运行
&xfree86; 您必须安装
x11/wrapper 软件。在FreeBSD 4.7及以上
版本是默认安装的,但以前的版本要手工安装到系统中。
要知道您的显卡是否被支持,请参考
&xfree86; 网站。
User Confirmation Requested
Would you like to configure your X server at this time?
[ Yes ] No
您需要了解监视器和显卡信息的制造规格。
如果配置有误, 可能会造成设备损毁。
如果您一时没有这样的信息, 请选择
&gui.no;, 之后再通过
sysinstall (对于 &os;
5.2 以前的版本来说, 是 /stand/sysinstall ), 选择
Configure 然后是
XFree86 来配置。
如果设置不当, X 服务器将导致系统停止响应。
通常, 建议您在安装完成之后再配置 X 服务程序。
如果您有显卡和显示器的信息,请选择
&gui.yes; 并按 Enter
来配置 X-server。
选择配置方法菜单
您可以通过许多方法来配置 X server。在认真读了所有的说明后,
请使用方向键来选择一种配置方式,并按Enter
键确认。
xf86cfg 和
xf86cfg -textmode 配置方法可能会使屏幕黑屏一会,
过一会即会启动。要有耐心。
下面将介绍xf86config 配置工具。
根据系统硬件的不同,下面的信息可能会适当的发生变动:
Message
You have configured and been running the mouse daemon.
Choose "/dev/sysmouse" as the mouse port and "SysMouse" or
"MouseSystems" as the mouse protocol in the X configuration utility.
[ OK ]
[ Press enter to continue ]
这个信息指明,前面配置的鼠标驱动程序被检测到。按
Enter 键继续。
启动 xf86config 后会显示一个简单的说明:
This program will create a basic XF86Config file, based on menu selections you
make.
The XF86Config file usually resides in /usr/X11R6/etc/X11 or /etc/X11. A sample
XF86Config file is supplied with XFree86; it is configured for a standard
VGA card and monitor with 640x480 resolution. This program will ask for a
pathname when it is ready to write the file.
You can either take the sample XF86Config as a base and edit it for your
configuration, or let this program produce a base XF86Config file for your
configuration and fine-tune it.
Before continuing with this program, make sure you know what video card
you have, and preferably also the chipset it uses and the amount of video
memory on your video card. SuperProbe may be able to help with this.
Press enter to continue, or ctrl-c to abort.
按 Enter 将启动鼠标配置。请按照指示选择
Mouse Systems
作为鼠标协议,
/dev/sysmouse 作为鼠标端口。下面的例子
向您说明的是使用一个 PS/2 鼠标:
First specify a mouse protocol type. Choose one from the following list:
1. Microsoft compatible (2-button protocol)
2. Mouse Systems (3-button protocol) & FreeBSD moused protocol
3. Bus Mouse
4. PS/2 Mouse
5. Logitech Mouse (serial, old type, Logitech protocol)
6. Logitech MouseMan (Microsoft compatible)
7. MM Series
8. MM HitTablet
9. Microsoft IntelliMouse
If you have a two-button mouse, it is most likely of type 1, and if you have
a three-button mouse, it can probably support both protocol 1 and 2. There are
two main varieties of the latter type: mice with a switch to select the
protocol, and mice that default to 1 and require a button to be held at
boot-time to select protocol 2. Some mice can be convinced to do 2 by sending
a special sequence to the serial port (see the ClearDTR/ClearRTS options).
Enter a protocol number: 2
You have selected a Mouse Systems protocol mouse. If your mouse is normally
in Microsoft-compatible mode, enabling the ClearDTR and ClearRTS options
may cause it to switch to Mouse Systems mode when the server starts.
Please answer the following question with either 'y' or 'n'.
Do you want to enable ClearDTR and ClearRTS? n
You have selected a three-button mouse protocol. It is recommended that you
do not enable Emulate3Buttons, unless the third button doesn't work.
Please answer the following question with either 'y' or 'n'.
Do you want to enable Emulate3Buttons? y
Now give the full device name that the mouse is connected to, for example
/dev/tty00. Just pressing enter will use the default, /dev/mouse.
On FreeBSD, the default is /dev/sysmouse.
Mouse device: /dev/sysmouse
下一个要配置的项目是键盘。在例子中使用的键盘一般是101-key 。您可以选择不
同的键盘类型或直接按 Enter 键来使用默认配置。
Please select one of the following keyboard types that is the better
description of your keyboard. If nothing really matches,
choose 1 (Generic 101-key PC)
1 Generic 101-key PC
2 Generic 102-key (Intl) PC
3 Generic 104-key PC
4 Generic 105-key (Intl) PC
5 Dell 101-key PC
6 Everex STEPnote
7 Keytronic FlexPro
8 Microsoft Natural
9 Northgate OmniKey 101
10 Winbook Model XP5
11 Japanese 106-key
12 PC-98xx Series
13 Brazilian ABNT2
14 HP Internet
15 Logitech iTouch
16 Logitech Cordless Desktop Pro
17 Logitech Internet Keyboard
18 Logitech Internet Navigator Keyboard
19 Compaq Internet
20 Microsoft Natural Pro
21 Genius Comfy KB-16M
22 IBM Rapid Access
23 IBM Rapid Access II
24 Chicony Internet Keyboard
25 Dell Internet Keyboard
Enter a number to choose the keyboard.
1
Please select the layout corresponding to your keyboard
1 U.S. English
2 U.S. English w/ ISO9995-3
3 U.S. English w/ deadkeys
4 Albanian
5 Arabic
6 Armenian
7 Azerbaidjani
8 Belarusian
9 Belgian
10 Bengali
11 Brazilian
12 Bulgarian
13 Burmese
14 Canadian
15 Croatian
16 Czech
17 Czech (qwerty)
18 Danish
Enter a number to choose the country.
Press enter for the next page
1
Please enter a variant name for 'us' layout. Or just press enter
for default variant
us
Please answer the following question with either 'y' or 'n'.
Do you want to select additional XKB options (group switcher,
group indicator, etc.)? n
接下来,我们要配置显示器。不要超过您显示器的刷新频率,这样可能
会损坏您的显示器。如果您有疑问,请参考其它信息后再做配置。
Now we want to set the specifications of the monitor. The two critical
parameters are the vertical refresh rate, which is the rate at which the
whole screen is refreshed, and most importantly the horizontal sync rate,
which is the rate at which scanlines are displayed.
The valid range for horizontal sync and vertical sync should be documented
in the manual of your monitor. If in doubt, check the monitor database
/usr/X11R6/lib/X11/doc/Monitors to see if your monitor is there.
Press enter to continue, or ctrl-c to abort.
You must indicate the horizontal sync range of your monitor. You can either
select one of the predefined ranges below that correspond to industry-
standard monitor types, or give a specific range.
It is VERY IMPORTANT that you do not specify a monitor type with a horizontal
sync range that is beyond the capabilities of your monitor. If in doubt,
choose a conservative setting.
hsync in kHz; monitor type with characteristic modes
1 31.5; Standard VGA, 640x480 @ 60 Hz
2 31.5 - 35.1; Super VGA, 800x600 @ 56 Hz
3 31.5, 35.5; 8514 Compatible, 1024x768 @ 87 Hz interlaced (no 800x600)
4 31.5, 35.15, 35.5; Super VGA, 1024x768 @ 87 Hz interlaced, 800x600 @ 56 Hz
5 31.5 - 37.9; Extended Super VGA, 800x600 @ 60 Hz, 640x480 @ 72 Hz
6 31.5 - 48.5; Non-Interlaced SVGA, 1024x768 @ 60 Hz, 800x600 @ 72 Hz
7 31.5 - 57.0; High Frequency SVGA, 1024x768 @ 70 Hz
8 31.5 - 64.3; Monitor that can do 1280x1024 @ 60 Hz
9 31.5 - 79.0; Monitor that can do 1280x1024 @ 74 Hz
10 31.5 - 82.0; Monitor that can do 1280x1024 @ 76 Hz
11 Enter your own horizontal sync range
Enter your choice (1-11): 6
You must indicate the vertical sync range of your monitor. You can either
select one of the predefined ranges below that correspond to industry-
standard monitor types, or give a specific range. For interlaced modes,
the number that counts is the high one (e.g. 87 Hz rather than 43 Hz).
1 50-70
2 50-90
3 50-100
4 40-150
5 Enter your own vertical sync range
Enter your choice: 2
You must now enter a few identification/description strings, namely an
identifier, a vendor name, and a model name. Just pressing enter will fill
in default names.
The strings are free-form, spaces are allowed.
Enter an identifier for your monitor definition: Hitachi
下一个配置是从显卡的驱动列表里选择一个显卡驱动程序。如果忽略
当前列表中的选项,请直接按Enter 下一屏将会出现在屏幕上,
会显示下面的信息:
Now we must configure video card specific settings. At this point you can
choose to make a selection out of a database of video card definitions.
Because there can be variation in Ramdacs and clock generators even
between cards of the same model, it is not sensible to blindly copy
the settings (e.g. a Device section). For this reason, after you make a
selection, you will still be asked about the components of the card, with
the settings from the chosen database entry presented as a strong hint.
The database entries include information about the chipset, what driver to
run, the Ramdac and ClockChip, and comments that will be included in the
Device section. However, a lot of definitions only hint about what driver
to run (based on the chipset the card uses) and are untested.
If you can't find your card in the database, there's nothing to worry about.
You should only choose a database entry that is exactly the same model as
your card; choosing one that looks similar is just a bad idea (e.g. a
GemStone Snail 64 may be as different from a GemStone Snail 64+ in terms of
hardware as can be).
Do you want to look at the card database? y
288 Matrox Millennium G200 8MB mgag200
289 Matrox Millennium G200 SD 16MB mgag200
290 Matrox Millennium G200 SD 4MB mgag200
291 Matrox Millennium G200 SD 8MB mgag200
292 Matrox Millennium G400 mgag400
293 Matrox Millennium II 16MB mga2164w
294 Matrox Millennium II 4MB mga2164w
295 Matrox Millennium II 8MB mga2164w
296 Matrox Mystique mga1064sg
297 Matrox Mystique G200 16MB mgag200
298 Matrox Mystique G200 4MB mgag200
299 Matrox Mystique G200 8MB mgag200
300 Matrox Productiva G100 4MB mgag100
301 Matrox Productiva G100 8MB mgag100
302 MediaGX mediagx
303 MediaVision Proaxcel 128 ET6000
304 Mirage Z-128 ET6000
305 Miro CRYSTAL VRX Verite 1000
Enter a number to choose the corresponding card definition.
Press enter for the next page, q to continue configuration.
288
Your selected card definition:
Identifier: Matrox Millennium G200 8MB
Chipset: mgag200
Driver: mga
Do NOT probe clocks or use any Clocks line.
Press enter to continue, or ctrl-c to abort.
Now you must give information about your video card. This will be used for
the "Device" section of your video card in XF86Config.
You must indicate how much video memory you have. It is probably a good
idea to use the same approximate amount as that detected by the server you
intend to use. If you encounter problems that are due to the used server
not supporting the amount memory you have (e.g. ATI Mach64 is limited to
1024K with the SVGA server), specify the maximum amount supported by the
server.
How much video memory do you have on your video card:
1 256K
2 512K
3 1024K
4 2048K
5 4096K
6 Other
Enter your choice: 6
Amount of video memory in Kbytes: 8192
You must now enter a few identification/description strings, namely an
identifier, a vendor name, and a model name. Just pressing enter will fill
in default names (possibly from a card definition).
Your card definition is Matrox Millennium G200 8MB.
The strings are free-form, spaces are allowed.
Enter an identifier for your video card definition:
接下来,设置显卡的分辨率。典型的使用范围是 640x480, 800x600,
和 1024x768,这些显卡的功能特性、分辨率的大小以眼睛的舒适为准。
当选择颜色深度时,可以选择您显卡支持最大模式。
For each depth, a list of modes (resolutions) is defined. The default
resolution that the server will start-up with will be the first listed
mode that can be supported by the monitor and card.
Currently it is set to:
"640x480" "800x600" "1024x768" "1280x1024" for 8-bit
"640x480" "800x600" "1024x768" "1280x1024" for 16-bit
"640x480" "800x600" "1024x768" "1280x1024" for 24-bit
Modes that cannot be supported due to monitor or clock constraints will
be automatically skipped by the server.
1 Change the modes for 8-bit (256 colors)
2 Change the modes for 16-bit (32K/64K colors)
3 Change the modes for 24-bit (24-bit color)
4 The modes are OK, continue.
Enter your choice: 2
Select modes from the following list:
1 "640x400"
2 "640x480"
3 "800x600"
4 "1024x768"
5 "1280x1024"
6 "320x200"
7 "320x240"
8 "400x300"
9 "1152x864"
a "1600x1200"
b "1800x1400"
c "512x384"
Please type the digits corresponding to the modes that you want to select.
For example, 432 selects "1024x768" "800x600" "640x480", with a
default mode of 1024x768.
Which modes? 432
You can have a virtual screen (desktop), which is screen area that is larger
than the physical screen and which is panned by moving the mouse to the edge
of the screen. If you don't want virtual desktop at a certain resolution,
you cannot have modes listed that are larger. Each color depth can have a
differently-sized virtual screen
Please answer the following question with either 'y' or 'n'.
Do you want a virtual screen that is larger than the physical screen? n
For each depth, a list of modes (resolutions) is defined. The default
resolution that the server will start-up with will be the first listed
mode that can be supported by the monitor and card.
Currently it is set to:
"640x480" "800x600" "1024x768" "1280x1024" for 8-bit
"1024x768" "800x600" "640x480" for 16-bit
"640x480" "800x600" "1024x768" "1280x1024" for 24-bit
Modes that cannot be supported due to monitor or clock constraints will
be automatically skipped by the server.
1 Change the modes for 8-bit (256 colors)
2 Change the modes for 16-bit (32K/64K colors)
3 Change the modes for 24-bit (24-bit color)
4 The modes are OK, continue.
Enter your choice: 4
Please specify which color depth you want to use by default:
1 1 bit (monochrome)
2 4 bits (16 colors)
3 8 bits (256 colors)
4 16 bits (65536 colors)
5 24 bits (16 million colors)
Enter a number to choose the default depth.
4
最后,要保存您的配置,确定输入 /etc/X11/XF86Config
作为保存位置。
I am going to write the XF86Config file now. Make sure you don't accidently
overwrite a previously configured one.
Shall I write it to /etc/X11/XF86Config? y
如果您配置失败,您也可以尝试着按 &gui.yes; 来
重新再试一次,会显示下面的信息:
User Confirmation Requested
The XFree86 configuration process seems to have
failed. Would you like to try again?
[ Yes ] No
如果配置 &xfree86; 时遇上困难,请选择
&gui.no; 并按 Enter 键继续
进行安装。安装完成后可以使用 xf86cfg -textmode 或
xf86config 命令行配置程序来以 root
用户的身份进行配置。配置 &xfree86; 的另外一种方法
描述在 。如果您选择不配置&xfree86;
那么下一个菜单将让您选择要安装的软件包。
默认情况下可以使用组合键
Ctrl Alt
Backspace ,在发生错误或在硬件损坏前退出
设置屏幕。
默认的显示模式可以使用X系统下的
Ctrl Alt +
或
Ctrl Alt -
来改变。
一旦有了可以运行的 &xfree86; ,
就可以使用 xvidtune 来调整显示的高度和宽度以及显示器的中心位置。
一些不适当的配置可能会损坏您的设备。如果在使用它们前存在疑虑,请不要
安装它们。可以使用监视器的控制工具来调整X窗口的显示。与文本显示模式不同
它更容易损坏设备。
在调整这些参数前,请阅读 &man.xvidtune.1; 手册。
下面是一个配置 &xfree86; 的成功例子,它选择了
使用默认的桌面。
选择默认的桌面
从 &os; 5.3-RELEASE 开始, X 桌面的选择机制已经从
sysinstall 中删掉了。
您只能在安装好 &os; 之后再配置它。 关于安装和配置 X
桌面的更多细节可以在 找到。
如果不是在安装 &os; 5.3-RELEASE 之前的版本,
则可以跳过这一节。
有许多窗口管理器可以使用。它们从基本的桌面环境到全部的桌面应用,是
一个大型的软件集。一些人可能只希望使用一些占用磁盘空间少,内存低的窗口
管理器;而另外一些人则更倾向于使用有便多特性的桌面环境。选择使用那种桌
面的最好的方法就是尝试着试用一些不同的桌面环境。这些桌面都可以在安装
完成后通过ports收集或包管理器来进行安装。
您可以选择一个流行的桌面配置成为默认的桌面,可以使您在安装完
成后立刻启动它。
选择默认桌面
使用箭头选择一个桌面,然后键入Enter 键。选择的桌面将被
安装。
安装软件包
这些软件包已经被预编译成二进制程序了,安装软件有一个很简单的方法。
前面已经介绍了如何安装一个软件包的例子。
如果需要的话, 在安装结束之后, 仍然可以使用
sysinstall (对于 &os;
5.2 之前的版本是 /stand/sysinstall )
来安装其他软件包。
User Confirmation Requested
The FreeBSD package collection is a collection of hundreds of
ready-to-run applications, from text editors to games to WEB servers
and more. Would you like to browse the collection now?
[ Yes ] No
选择 &gui.yes; 按Enter
将会显示软件包选择屏幕。
选择软件所的种类
在任何时候只有安装介质上有的软件包才能被安装进系统。
如果选择All 那么所有的软件包将会被显示,您也
可以选择一个特殊的分类。使用箭头进行选择,然后键入 Enter 。
一个菜单将会显示这个分类中可用的所有软件包。
选择软件包
bash shell 被选中了。通过在加亮的软件
上键入Space 键,来选择您想要的软件所。每个选择的软件
包的简短描述都会显示在屏幕左下脚。
按 Tab 键选择 &gui.ok;或 &gui.cancel;。
当您完成了安装标记之后,键入 Tab 键选择 &gui.ok;
然后键入Enter 返回软件包选择菜单。
左右箭头键也可以用来选择 &gui.ok;和 &gui.cancel;。用这种方法也可以
用 &gui.ok; 然后按 Enter 来返回软件包选择菜单。
安装软件包
使用 Tab 和箭头键来选择 [ Install ]
然后键入 Enter 。您接着需要确定您要安装的软件包。
确认安装的软件包
选择 &gui.ok; 然后键入Enter 键将开始软件的安装,
安装信息将会不断地出现。如果有一些错误信息,请作好记录。
安装完成之后,继续最后的配置。如果您不想安装任何软件包并退回到
最终配置屏幕,请选择Install 。
添加用户/组
您至少要在安装过程中添加一个用户,以便于您能不用root
来登录使用系统。根分区通常比较小,用 root 来运行应用程序
可能会快一点。但这样会有一些危险:
User Confirmation Requested
Would you like to add any initial user accounts to the system? Adding
at least one account for yourself at this stage is suggested since
working as the "root" user is dangerous (it is easy to do things which
adversely affect the entire system).
[ Yes ] No
选择 &gui.yes; 然后键入Enter 继续添加用户。
选择用户
用箭头键来选择 User 然后按
Enter 。
添加用户信息
下面的描述信息会出现在屏幕的下方,可以使用 Tab
键来切换不同的项目,以便输入相关信息:
Login ID
新用户的登录名(强制性必须写)
UID
这个用户的ID编号(如果不写,系统自动添加)
Group
这个用户的登录组名(如果不写,系统自动添加)
Password
这个用户的密码(键入这个需要很仔细!)
Full name
用户的全名(解释、备注)
Member groups
这个用户所在的组
Home directory
用户的主目录(如果不写,系统自动添加)
Login shell
用户登录的shell(默认是/bin/sh )。
你可以将登录 shell 由 /bin/sh 改为
/usr/local/bin/bash , 以便使用事先以 package 形式安装的
bash shell。
不要使用一个不存在的或您不能登录的shell。最通用的shell是使用
BSD-world 的 C shell,可以通过指定/bin/tcsh 来修改。
用户也可以被添加到 wheel 组中成了一个超级用户,
从而拥有 root 权限。
当您感觉满意时,键入 &gui.ok; 键,用户和组管理菜单将会重新出现。
退出用户和组管理
如果有其他的需要, 此时还可以添加其他的组。
此外, 还可以通过
sysinstall (在 &os; 5.2 以前的版本中是
/stand/sysinstall ) 在安装完成之后添加它们。
当您完成添加用户的时候,选择Exit
然后键入Enter 继续下面的安装。
设置 root 密码
Message
Now you must set the system manager's password.
This is the password you'll use to log in as "root".
[ OK ]
[ Press enter to continue ]
键入 Enter 来设置 root
密码。
密码必须正确地输入两次。 毋庸讳言,
您需要选择一个不容易忘记的口令。
请注意您输入的口令不会回显, 也不会显示星号。
Changing local password for root.
New password :
Retype new password :
密码成功键入后,安装将继续。
退出安装
如果您需要设置其他的网络设备, 或者需要完成其他的配置,
可以在此时或者事后通过 sysinstall
(对于 &os; 5.2 之前的版本是 /stand/sysinstall )
来进行配置。
User Confirmation Requested
Visit the general configuration menu for a chance to set any last
options?
Yes [ No ]
选择 &gui.no; 然后键入 Enter
返回到主安装菜单。
退出安装
选择 [X Exit Install] 然后键入
Enter 。您可能需要确认是否真的退出安装:
User Confirmation Requested
Are you sure you wish to exit? The system will reboot (be sure to
remove any floppies from the drives).
[ Yes ] No
选择 &gui.yes; 取出软盘。CDROM驱动器将被锁定,
直到机器重新启动。CDROM然后就可以从驱动器中取出来了。
在系统重新启动的时候可能会见到出错信息。
FreeBSD的启动
FreeBSD 在 &i386;上启动
如果启动正常,您将看到在屏幕上有很多信息滚动,最后您会看到登录命令行。
您可以通过键入 Scroll-Lock 和使用 PgUp
与 PgDn 来查看信息,再键入 Scroll-Lock
回到命令行。
记录信息可能不会显示(缓冲区的限制)。您可以通过键入
dmesg 来查看。
使用您在安装过程中设置的用户名/密码来登录。(例子中使用
rpratt )。除非必须的时候请不要用
root 用户登录。
典型的启动信息:(忽略版本信息)
Copyright (c) 1992-2002 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
The Regents of the University of California. All rights reserved.
Timecounter "i8254" frequency 1193182 Hz
CPU: AMD-K6(tm) 3D processor (300.68-MHz 586-class CPU)
Origin = "AuthenticAMD" Id = 0x580 Stepping = 0
Features=0x8001bf<FPU,VME,DE,PSE,TSC,MSR,MCE,CX8,MMX>
AMD Features=0x80000800<SYSCALL,3DNow!>
real memory = 268435456 (262144K bytes)
config> di sn0
config> di lnc0
config> di le0
config> di ie0
config> di fe0
config> di cs0
config> di bt0
config> di aic0
config> di aha0
config> di adv0
config> q
avail memory = 256311296 (250304K bytes)
Preloaded elf kernel "kernel" at 0xc0491000.
Preloaded userconfig_script "/boot/kernel.conf" at 0xc049109c.
md0: Malloc disk
Using $PIR table, 4 entries at 0xc00fde60
npx0: <math processor> on motherboard
npx0: INT 16 interface
pcib0: <Host to PCI bridge> on motherboard
pci0: <PCI bus> on pcib0
pcib1: <VIA 82C598MVP (Apollo MVP3) PCI-PCI (AGP) bridge> at device 1.0 on pci0
pci1: <PCI bus> on pcib1
pci1: <Matrox MGA G200 AGP graphics accelerator> at 0.0 irq 11
isab0: <VIA 82C586 PCI-ISA bridge> at device 7.0 on pci0
isa0: <ISA bus> on isab0
atapci0: <VIA 82C586 ATA33 controller> port 0xe000-0xe00f at device 7.1 on pci0
ata0: at 0x1f0 irq 14 on atapci0
ata1: at 0x170 irq 15 on atapci0
uhci0: <VIA 83C572 USB controller> port 0xe400-0xe41f irq 10 at device 7.2 on pci0
usb0: <VIA 83C572 USB controller> on uhci0
usb0: USB revision 1.0
uhub0: VIA UHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub0: 2 ports with 2 removable, self powered
chip1: <VIA 82C586B ACPI interface> at device 7.3 on pci0
ed0: <NE2000 PCI Ethernet (RealTek 8029)> port 0xe800-0xe81f irq 9 at
device 10.0 on pci0
ed0: address 52:54:05:de:73:1b, type NE2000 (16 bit)
isa0: too many dependant configs (8)
isa0: unexpected small tag 14
fdc0: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isa0
fdc0: FIFO enabled, 8 bytes threshold
fd0: <1440-KB 3.5" drive> on fdc0 drive 0
atkbdc0: <keyboard controller (i8042)> at port 0x60-0x64 on isa0
atkbd0: <AT Keyboard> flags 0x1 irq 1 on atkbdc0
kbd0 at atkbd0
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: model Generic PS/2 mouse, device ID 0
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
sc0: <System console> at flags 0x1 on isa0
sc0: VGA <16 virtual consoles, flags=0x300>
sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
sio0: type 16550A
sio1 at port 0x2f8-0x2ff irq 3 on isa0
sio1: type 16550A
ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
ppc0: FIFO with 16/16/15 bytes threshold
ppbus0: IEEE1284 device found /NIBBLE
Probing for PnP devices on ppbus0:
plip0: <PLIP network interface> on ppbus0
lpt0: <Printer> on ppbus0
lpt0: Interrupt-driven port
ppi0: <Parallel I/O> on ppbus0
ad0: 8063MB <IBM-DHEA-38451> [16383/16/63] at ata0-master using UDMA33
ad2: 8063MB <IBM-DHEA-38451> [16383/16/63] at ata1-master using UDMA33
acd0: CDROM <DELTA OTC-H101/ST3 F/W by OIPD> at ata0-slave using PIO4
Mounting root from ufs:/dev/ad0s1a
swapon: adding /dev/ad0s1b as swap device
Automatic boot in progress...
/dev/ad0s1a: FILESYSTEM CLEAN; SKIPPING CHECKS
/dev/ad0s1a: clean, 48752 free (552 frags, 6025 blocks, 0.9% fragmentation)
/dev/ad0s1f: FILESYSTEM CLEAN; SKIPPING CHECKS
/dev/ad0s1f: clean, 128997 free (21 frags, 16122 blocks, 0.0% fragmentation)
/dev/ad0s1g: FILESYSTEM CLEAN; SKIPPING CHECKS
/dev/ad0s1g: clean, 3036299 free (43175 frags, 374073 blocks, 1.3% fragmentation)
/dev/ad0s1e: filesystem CLEAN; SKIPPING CHECKS
/dev/ad0s1e: clean, 128193 free (17 frags, 16022 blocks, 0.0% fragmentation)
Doing initial network setup: hostname.
ed0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
inet6 fe80::5054::5ff::fede:731b%ed0 prefixlen 64 tentative scopeid 0x1
ether 52:54:05:de:73:1b
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x8
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
Additional routing options: IP gateway=YES TCP keepalive=YES
routing daemons:.
additional daemons: syslogd.
Doing additional network setup:.
Starting final network daemons: creating ssh RSA host key
Generating public/private rsa1 key pair.
Your identification has been saved in /etc/ssh/ssh_host_key.
Your public key has been saved in /etc/ssh/ssh_host_key.pub.
The key fingerprint is:
cd:76:89:16:69:0e:d0:6e:f8:66:d0:07:26:3c:7e:2d root@k6-2.example.com
creating ssh DSA host key
Generating public/private dsa key pair.
Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
The key fingerprint is:
f9:a1:a9:47:c4:ad:f9:8d:52:b8:b8:ff:8c:ad:2d:e6 root@k6-2.example.com.
setting ELF ldconfig path: /usr/lib /usr/lib/compat /usr/X11R6/lib
/usr/local/lib
a.out ldconfig path: /usr/lib/aout /usr/lib/compat/aout /usr/X11R6/lib/aout
starting standard daemons: inetd cron sshd usbd sendmail.
Initial rc.i386 initialization:.
rc.i386 configuring syscons: blank_time screensaver moused.
Additional ABI support: linux.
Local package initialization:.
Additional TCP options:.
FreeBSD/i386 (k6-2.example.com) (ttyv0)
login: rpratt
Password:
生成 RSA 和 DSA密钥在比较慢的机器上可能要花很长时间。这只是一个
新安装后的首次启动,以后的启动会变得更快一点。
如果已经完成 X 服务器的配置, 且指定了默认的桌面窗口管理器,
就可以在命令行键入 startx 来启动它了。
FreeBSD 在 Alpha机器上启动
Alpha
一旦安装完成,您就可以键入下面的命令来启动FreeBSD:
>>>BOOT DKC0
这是从指定的固定硬件进行引导。如果要使 FreeBSD 下次能够自动启动,
使用下面的命令:
>>> SET BOOT_OSFLAGS A
>>> SET BOOT_FILE ''
>>> SET BOOTDEF_DEV DKC0
>>> SET AUTO_ACTION BOOT
启动信息跟启动 &i386;机器时差不多。(但不完全一样)
FreeBSD 关机
正确的关闭操作系统是很重要的。不要仅仅关闭电源。首先,您需要成为一个超
级用户,通过键入 su 命令来实现。然后输入
root 密码。这需要用户是 wheel
组的一名成员。然后,以root 键入
shutdown -h now 命令。
The operating system has halted.
Please press any key to reboot.
当shutdown命令发出后,屏幕上出现 Please press any key to reboot
信息时,您就可以安全的关闭计算机了。如果按下任意一个键,计算机将重新启动。
您也能够使用
Ctrl
Alt
Del
组合键来重新启动计算机,但是不推荐使用这个操作。
支持的硬件
hardware
FreeBSD当前可以广泛运行在ISA、VLB、EISA、PCI总线的PC上,包括
Inter,AMD,Cyrix或 NexGen x86
系列的机器,还有一些
Compaq Alpha的机器。支持普通的 IDE 或 ESDI 驱动配置,各种SCSI控制器,
PCMCIA卡,USB设备,网卡和其它网络串口设备。FreeBSD也支持IBM微通道
(MCA)的总线结构。
每个发行版都会提供一个FreeBSD支持的硬件列表。您可以在名字叫做
HARDWARE.TXT 的文件中找到。它可以在CDROM或FTP发行组件
或sysinstall 的文档菜单中找到。对于特定的架构,都
有相应的硬件支持列表。也可以在FreeBSD的网站 Release
Information 找到更多的信息。
常见问题
安装
常见问题
下面将介绍一些在安装过程中常见的问题,像如何报告发生的问题,如何
双重启动FreeBSD和 &ms-dos;。
当您遇到错误时,应该怎么做?
由于pc结构的限制,不可能100%的不出现问题,但是有些问题是您可以
自己解决的。
先检查您的硬件,确保您的硬件被支持。
如果您的硬件能够被支持,但还是会出问题,那就重新启动计算机。当出现
内核配置信息的时候,重新配置一下硬件信息。因为绝大多数硬件的IRQ,IO地
址,DMA通道都有它们的生产商预先进行默认配置。如果您的硬件已经重新装配了,
就需要使用配置编辑器告诉FreeBSD到哪里去找相关信息。
如果某个设备配置好后,发现又有个设备出现错误。碰到这种情况,就当卸掉
这个设备的驱动程序。
有些安装问题可以借助更新硬件的程序来解决,特别是主板的
BIOS 。大部分的主板制造商都会提供网站给用户下载新的
BIOS以及提供如何更新的说明。
也有许多制造商强烈建议,除非必要否则不要轻易更新
BIOS 。因为更新的过程可能
会发生问题,进而损害BIOS 芯片。
不要禁用安装过程中您会用到的驱动程序, 例如显示 sc0 。
如果安装程序在修改了某些配置之后安装程序行为诡异或失败,
您可能修改或删除了某些不应删除的组件。
如果遇到这种情况, 应重新启动以便尝试其他设置。
在配置模式下,您可以:
列出在内核中安装的设备驱动程序。
禁用不适合您机器的设备驱动程序。
通过驱动程序改变IRQ,DRQ和IO端口地址。
调整内核与您的硬件设置一致之后,键入 Q ,以新的设置
重新启动计算机。当FreeBSD安装完成之后,在配置模式下做的更改会一直存在,不需
要在每次启动计算机时再重新设置。即使如此,有可能您会想建立一个定制内核使您
的系统效率达到最好,可以看看以下的链接 custom kernel。
处理 &ms-dos; 分区存在的问题
DOS
许多 &os; 的用户会在运行了 µsoft; 的 PC
上安装 FreeBSD。 以下是一些关于在这种系统中安装 FreeBSD
常会出现的问题。 &os; 中有一个叫 FIPS
的应用程序。 此工具程序可以在安装光盘的
tools 目录下找到, 或者, 也可以从
&os; 的镜像站点 下载。
FIPS 允许您将现有的 &ms-dos;
分区一分为二, 保留原原有的分区, 而将新系统安装到空出来的分区上。
首先要整理 &ms-dos; 分区的碎片, 您可以用 &windows; 的
Disk Defragmenter (进入资源管理器,
右键单击硬盘, 并选择整理碎片) 或
Norton Disk Tools 来完成这项工作。
接下来就可以运行 FIPS ,
它会提示您接下来所需要进行的操作。 接下来就可以重新启动并将 &os;
安装到新空出来的分区中了。 安装所需的磁盘空间, 可以从
Distributions 菜单给出的值来进行估计。
有一个由PowerQuest公司生产的非常有用的工具。从
http://www.powerquest.com 网站上
可以得到&partitionmagic; 。这个工具的功能比
FIPS 要强大。如果您经常要添加或删除操作系统,强烈建议
您使用它。当然,它很贵。如果您只是想安装 &os; 的话, FIPS
就已足够了。
使用 &ms-dos; 和 &windows; 文件系统
现在 &os; 还不支持经过Double Space™
应用程序压缩过的文件系统。因此其它的文件系统在被&os;访问其数据之前必须先
解压缩。它可以通过运行位于 Start >
Programs >
System Tools menu中的
Compression Agent 程序来实现。
&os;可以支持基于 &ms-dos; 的文件系统。这要求您使用带参数的 &man.mount.msdosfs.8;
命令。 最常使用的是:
&prompt.root; mount_msdosfs /dev/ad0s1 /mnt
在此例子中, &ms-dos; 文件系统位于主硬盘的第一个分区。您的情况可能与引不同,
查看命令 dmesg 和 mount 的输出。它们应该
可以让您得到足够的分区信息。
&ms-dos; 的扩展分区会被映射在 &os;分区的末尾。换句话说,分区号要大于
&os; 正在使用的分区号。例如,第一个 &ms-dos; 分区可能位于
/dev/ad0s1 ,&os; 分区可能位于
/dev/ad0s2 ,跟着是 &ms-dos; 的扩展分区位于
/dev/ad0s3 。这可能会使您感觉迷茫。
NTFS 分区也可以通过类似 &man.mount.ntfs.8; 命令挂接在FreeBSD上。
Alpha 用户的问题与解答
Alpha
这节主要回答一些在Alpha系统上安装FreeBSD时经常问到的问题。
我可以从 ARC 或 Alpha BIOS 控制台启动吗?
ARC
Alpha BIOS
SRM
不行。 &os;,像Compaq Tru64 和 VMS,只能从SRM 控制台启动。
求救,我没有空间了!我需要删除每一样东西吗?
不,这个时候不行。
我可以挂上 Compaq Tru64 或 VMS 的文件系统吗?
不,这个时候不行。
Valentino
Vaschetto
Contributed by
高级安装指南
这节主要描述在一些特殊情况下如何安装FreeBSD。
在一个没有显示器或键盘的系统上安装FreeBSD
installation
headless (serial console)
serial console
这种类型的安装叫做 headless install(无关安装)
,
因您正要安装FreeBSD的机器不是没带显示器,就是没有显卡。您可能会问那怎么安装?
可以使用一个串行控制台。串行控制台基本上是使用另外一台机器来充当主显示设备
和键盘。要这样做,只要执行下面的步骤:创建安装软件,请看 一节说明。
按下面的步骤,修改这些软盘用来引导进入一个串行控制台:
通过启动软盘来引导进入一个串行控制台
mount
如果您想用软盘,FreeBSD将进入它通常的安装模式。我们要把FreeBSD
引导进入串行控制台,需要这样做,您必须使用 &man.mount.8;命令在FreeBSD系统
上挂一kern.flp 的那个软盘。
&prompt.root; mount /dev/fd0 /mnt
现在您已经挂上了软盘,
需要进入 /mnt 目录:
&prompt.root; cd /mnt
这儿是您必须设置软盘引导进入串行控制台的地方。您必须制作一个包含
/boot/loader -h 这行的叫做boot.config
的文件。所有这些是为了给引导程序一个标记以引导进入串行控制台。
&prompt.root; echo "/boot/loader -h" > boot.config
现在您已经正确配置好了软盘,您必须使用 &man.umount.8;
命令卸下软盘。
&prompt.root; cd /
&prompt.root; umount /mnt
现在您可以从软盘驱动器中取出软盘了。
连接您的 Null-modem 线
null modem cable
您现在需要一根 null modem线来连接两台机器。
只要连接两台机器的串口。
普通的串行线是不行的 ,您需要使用一根null modem的线,
因为它在一些十字交叉口有金属线。
开始启动安装
现在开始启动安装。把 kern.flp 的那张软盘
插入软盘驱动器,然后开启电源。
连接您的无头机器
cu
现在您已经通过&man.cu.1;连接到了那台机器。
&prompt.root; cu -l /dev/cuaa0
就这样!您已经能够通过您的cu session对话来控制
那台无头
机器了。它将要求您把 mfsroot.flp 的那张软盘
插入驱动器,然后它将提示选择使用哪种终端。只要选择FreeBSD的彩色控制台,然后
继续您的安装。
准备您自己的安装介质
为了避免重复 FreeBSD disc
在这里指 FreeBSD CDROM or DVD
那即意味着您要购买或自己制做。
有好几个原因需要您创建自己的FreeBSD安装介质。这可能是物理介质,如磁带,
使用 sysinstall 程序找到的安装文件,FTP站点或
&ms-dos;分区。
例如:
您有许多机器连接到本地网络,使用一个FreeBSD光盘。您要使用FreeBSD来
创建一个本地FTP站点,然后使用这个FTP站点来代替连接到Internet。
您有一张 FreeBSD 光盘, FreeBSD 不支持您的 CD/DVD 驱动器, 但
&ms-dos;/&windows; 支持。 您要复制安装文件到一个DOS分区,
然后使用这些文件进行安装。
您要安装的计算机没有 CD/DVD驱动器和网卡,但您可以连接一个
Laplink-style
串口或并口线缆到那台计算机。
您要通过一个磁带机来安装FreeBSD.
创建一张安装光盘
FreeBSD的每个发行版本都提供两张CDROM映像(ISO images
)。
如果您有刻录机,这些映像文件可以被(burned
) 成FreeBSD的安装光盘。
如果没有刻录机,而上网带宽却很便宜,它也是一种很好的安装方式。
下载正确的 ISO 映像文件
每个版本的ISO映像文件都可以从 ftp://ftp.FreeBSD.org/pub/FreeBSD/ISO-IMAGES-架构名 /版本
或最近的镜像站点下载。选择合适的 架构 和
版本 。
目录中包含下面一些映像文件:
FreeBSD 4.X ISO 映像文件名和含意
文件名
包含内容
版本 -RELEASE-架构名 -miniinst.iso
安装 FreeBSD 所需的全部文件。
版本 -RELEASE-架构名 -disc1.iso
安装 FreeBSD 所需的全部文件, 以及这张光盘能装下的、
尽可能多的第三方软件包。
版本 -RELEASE-架构名 -disc2.iso
一份用于与 sysinstall 中的
Repair
(修复) 机制联用的
现场文件系统
。 一份
FreeBSD CVS 目录的副本, 以及这张光盘能装下的、
尽可能多的第三方软件包。
FreeBSD 5.X ISO 映像文件名和含意
文件名
包含内容
版本 -RELEASE-架构 -bootonly.iso
引导 FreeBSD 内核并启动安装界面所需的全部数据。
安装文件可以从 FTP 或其他安装源获得。
版本 -RELEASE-架构名 -miniinst.iso
安装 FreeBSD 所需的全部文件。
版本 -RELEASE-架构名 -disc1.iso
安装 FreeBSD 所需的全部文件,
以及一份用于与 sysinstall 中的
Repair
(修复) 机制联用的
现场文件系统
。
版本 -RELEASE-架构名 -disc2.iso
&os; 文档以及这张光盘能装下的、
尽可能多的第三方软件包。
您 必须 下载 miniinst
ISO 镜像或第一张光盘的镜像之一。 不需要两个都下载,
因为第一张光盘包括了 miniinst ISO 的全部内容。
miniinst ISO 镜像只有在
5.4-RELEASE 之前的版本才提供。
如果访问 Internet 的价格便宜, 建议使用 miniinst ISO。
这样您可以安装 FreeBSD, 并从网上通过 ports/packages 系统 (参见
) 根据需要下载和安装第三方软件包。
如果您正打算安装 &os;
并同时选择一些第三方软件包,
则可以下载第一张光盘的镜像文件。
其它的映像盘也是很有用的,但不是必须的,尤其是在您有高速的网络连接时。
刻录 CDs
您必须把这些映像文件刻录成光盘。如果您在其它的FreeBSD系统上完成
此项工作,请看 得到更多的信息,(特别是
和 )
如果您在其它的系统平台上执行,您需要相应的刻录软件。映像文件使用
的是标准的ISO格式,必须被您的刻录软件所支持。
如果有兴趣制作一张定制的 FreeBSD
版本, 请参考 Release Engineering
Article 。
为 FreeBSD 安装盘建立局域网 FTP 站点
installation
network
FTP
FreeBSD 光盘的布局和 FTP 站点相同。 这样,
建立局域网 FTP 站点来用于网络上的其它计算机安装 FreeBSD,
就十分的容易。
在要作为FTP站点的那台FreeBSD机器上,确定FreeBSD磁盘放入光驱
中并将它挂在/cdrom 目录中。
&prompt.root; mount /cdrom
在/etc/passwd 文件中建立一个可匿名访问FTP
服务器的账号。您可以利用&man.vipw.8; 命令编辑/etc/passwd
文件,加入下面这一行叙述:
ftp:*:99:99::0:0:FTP:/cdrom:/nonexistent
确定在/etc/inetd.conf 配置文件中开启
了FTP服务。
任何本地网络中的机器在安装FreeBSD选择安装介质时就可以选择透过
FTP站点,然后选取 Other
后输入
ftp://本地FTP服务器
即可以透过本地的FTP站点来安装FreeBSD。
如果用作 FTP 客户端的引导介质 (通常是软盘)
与本地局域网的 FTP 站点上的版本不一致, sysinstall
会不允许您完成安装。 如果您使用的版本差距不很大,
并且希望绕过这一判断, 则应进入 Options 菜单,
并将安装包的名字改为
any 。
此方式最好使用在有防火墙保护的内部网络。如果要将此FTP服务公开给外面的
网际网络(非本地用户),您的电脑必须承担被侵入或其它的风险。我们强烈建议您
要有完善的安全机制才这样做。
创建安装软盘
installation
floppies
如果您从软盘安装(我们不 推荐那样做),或者是由于
不支持硬件或者更简单的理由是因为您坚持要使用软盘安装。您必须准备几张软盘。
至少这些软盘必须是 1.44 MB 或 1.2 MB 的,用来容纳所有在
bin (命令) 目录下的文件。如果您在 DOS
操作系统下准备就 MUST 使用 &ms-dos;下的 FORMAT
命令来格式化软盘。 如果您使用的是 &windows; 操作系统,
在资源管理器中就可以完成这个工作 (用右键单击 A:
驱动器, 并选择 Format
)。
不要 指望厂家的预先格式化!
最好还是亲自进行格式化。
过去用户报告的很多问题都是由于不正确地使用格式化设备所造成的,
所以我们需要在这里着重提一下。
如果您在另外一台FreeBSD的机器上做了启动盘的话,进行格式化是一个不
错的主意。虽然您不需要把每张盘都做成DOS文件系统。您也可以使用
bsdlabel 和 newfs
命令来创建一个UFS文件系统,具体操作按下面的顺序进行:
&prompt.root; fdformat -f 1440 fd0.1440
&prompt.root; bsdlabel -w -r fd0.1440 floppy3
&prompt.root; newfs -t 2 -u 18 -l 1 -i 65536 /dev/fd0
如果使用 5.25"软盘的话,需要使用 fd0.1200 和
floppy5 来格式化 1.2 MB 的磁盘空间。
然后您就可以像其它的文件系统一样挂上和写入这些磁盘。
格式化这些磁盘后,您必须把文件复制到磁盘中。
这些发行文件被分割成刚好可存进五张 1.44 MB 软盘。
检查您所有的磁盘, 找出所有可能适合的文件。
直到您找到所有需要的配置并且将它们以这种方式安置。
第一个配置都应该有一个子目录在磁盘上, 例如:
a:\bin\bin.aa 、
a:\bin\bin.ab , 等等。
一旦您进入选择安装介质的屏幕,选择 Floppy
将会看到后面的提示符。
从 &ms-dos; 分区安装
installation
from MS-DOS
如果从 &ms-dos; 分区安装, 您需要将发布文件复制到该分区根目录下的
freebsd 目录中。 例如:
c:\freebsd 。 您必须复制一部分 CDROM 或 FTP
上的目录结构, 因此, 如果您从光盘进行复制,
建议使用 DOS 的 xcopy 命令。
下面是准备进行 FreeBSD 最小系统安装的例子:
C:\> md c:\freebsd
C:\> xcopy e:\bin c:\freebsd\bin\ /s
C:\> xcopy e:\manpages c:\freebsd\manpages\ /s
假设 C: 盘是您的空闲空间,
E: 盘是您挂接的 CDROM。
如果您没有光盘驱动器,您可以从以下网站下载发行包。 ftp.FreeBSD.org .
每一个发行包都在一个目录中,例如 base 发行包可以在 &rel.current;/base/ 目录中找到。
对很多发行包来说,如果您希望从 &ms-dos;分区安装的话(您有足够的空间),
安装 c:\freebsd — 下的每个文件-这个
BIN 发行包只是最低限度的要求。
创建一个安装磁带
installation
from QIC/SCSI Tape
从磁带安装也许是最简单的方式,比在线使用 FTP 安装或使用 CDROM 还快。
安装的程序假设是简单地被压缩在磁带上。在您得到所有配置文件后,简单地解开它们,
用下面的命令:
&prompt.root; cd /freebsd/distdir
&prompt.root; tar cvf /dev/rwt0 dist1 ... dist2
在您安装的时候,您要确定留有足够的空间给临时目录(允许您选择)
来容纳磁带安装时 全部 的内容。由于不是随机访问
磁带的,所以这种安装方法需要很多临时空间。
开始安装时,在从软盘启动 之前 ,
磁带机必须已经放在驱动设备中。 否则, 安装过程中可能会找不到它。
通过网络安装
installation
network
serial (SLIP or PPP)
installation
network
parallel (PLIP)
installation
network
Ethernet
有三种类型的网络安装方法。串口(SLIP或PPP),并口(PLIP),以太网
(标准的以太网控制器,包括PCMCIA)。
SLIP 支持是相当原始的,并且被限制在主要对hard-wired 的连接,就像
一台膝上型计算机与另一台计算机间的串行线。现在的SLIP的安装还没有提供拨号功能,
这个连接应该是 hard-wired ;用PPP工具提供的这种便利性应该首先尽可能被用于SLIP
设备。
如果您使用一个MODEM,那您就只有PPP这一种选择了。在您安装的过程中,
要确定您能很容易地获得完整且快速的关于您服务提供商的信息。
如果您使用 PAP 或 CHAP 方式连接到您的 ISP,(换句话说,如果您不使用
脚本在&windows;中连接到您的ISP),那么您需要在ppp
提示符下输入dial 命令。否则,当PPP连接者只提供一种最简单的
终端模拟器,您必须知道如何使用针对MODEM的 AT commands
拨号到您
的ISP。想知道更深入的信息可以参考用户级PPP那节 handbook and FAQ 。如果您有一些问题,可以使用
set log local ... 命令将日志显示在屏幕上。
您也可以通过并口电缆连接到另外一台FreeBSD(2.0或以后的版本)机器上进行
安装,您可以考虑使用 laplink
并口电缆进行安装。通过并口安装要
比通过串口(最高 50 kbytes/sec)安装快得多。
最后,通过网络安装最快的方法是利用以太网技术!FreeBSD支持绝大多数普通
的以太网卡。每个FreeBSD发行版都在硬件注释中提供支持的网卡的列表和需要的设置。
如果您要使用PCMCIA接口的以太网,在启动计算机 之前 ,
确信已经把它插好了。目前,FreeBSD还不支持PCMCIA的热插拔。
通过网络安装,您可能需要知道IP地址,地址掩码,还有机器的名字。如果您
通过PPP进行安装,就不需要静态的IP地址,IP地址会由ISP给您自动指派。您的系统
管理员会告诉您通过网络安装的细节。如果您通过主机名而不是IP地址来访问其它主
机,需要有一个域名服务器或一个网关地址(如果您使用PPP进行安装,那它就是您的
ISP的IP地址)。如果您要通过一个HTTP的代理服务器进行FTP安装,需要一个代理
服务器地址。如果您不知道这些,在安装 之前 可以询问
您的系统管理员或您的ISP服务商。
通过NFS安装之前
installation
network
NFS
NFS 安装方式是非常方便的。 只需要简单地将 FreeBSD 文件复制到一台服务器上,
然后在安装时选择NFS介质。
如果这个服务器要特权端口
才能支持(如SUN的工作站),
您需要在安装前在 Options 菜单中设置 NFS Secure 。
如果您的一台网卡比较糟糕,速度很慢,则应考虑
NFS Slow 的选项。
为了达到NFS安装的目的,这个服务器必须支持 subdir 加载。例如,如果您的
FreeBSD &rel.current; 目录存在:
ziggy:/usr/archive/stuff/FreeBSD ,然后
ziggy 将必须允许直接挂上
/usr/archive/stuff/FreeBSD ,而不仅仅是
/usr 或
/usr/archive/stuff 。
在 FreeBSD的 /etc/exports 配置文件中,是由
-alldirs 选项来控制的。其它 NFS服务器也许有不同的方式。
如果您从服务器得到permission denied 这个信息,可能是因为您没有正确的启用它。
diff --git a/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml b/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml
index 8954d9c761..5d6b4fc048 100644
--- a/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml
@@ -1,3062 +1,3070 @@
获取 FreeBSD
CDROM 和 DVD 发行商
零售盒装产品
可以从下面几个零售商那里买到 FreeBSD 的盒装产品(FreeBSD CD,
附加软件,印刷文档):
CompUSA
WWW:
Frys Electronics
WWW:
CD 和 DVD 光盘
FreeBSD CD 和 DVD 光盘可以从许多在线零售商那里买到:
BSD Mall by Daemon News
PO Box 161
Nauvoo , IL 62354
USA
Phone: +1 866 273-6255
Fax: +1 217 453-9956
Email: sales@bsdmall.com
WWW:
BSD-Systems
Email: info@bsd-systems.co.uk
WWW:
FreeBSD Mall, Inc.
3623 Sanford Street
Concord , CA 94520-1405
USA
Phone: +1 925 674-0783
Fax: +1 925 674-0821
Email: info@freebsdmall.com
WWW:
Hinner EDV
St. Augustinus-Str. 10
D-81825 München
Germany
Phone: (089) 428 419
WWW:
Ikarios
22-24 rue Voltaire
92000 Nanterre
France
WWW:
JMC Software
Ireland
Phone: 353 1 6291282
WWW:
Linux CD Mall
Private Bag MBE N348
Auckland 1030
New Zealand
Phone: +64 21 866529
WWW:
The Linux Emporium
Hilliard House, Lester Way
Wallingford
OX10 9TA
United Kingdom
Phone: +44 1491 837010
Fax: +44 1491 837016
WWW:
Linux+ DVD Magazine
Lewartowskiego 6
Warsaw
00-190
Poland
Phone: +48 22 860 18 18
Email: editors@lpmagazine.org
WWW:
Linux System Labs Australia
21 Ray Drive
Balwyn North
VIC - 3104
Australia
Phone: +61 3 9857 5918
Fax: +61 3 9857 8974
WWW:
LinuxCenter.Ru
Galernaya Street, 55
Saint-Petersburg
190000
Russia
Phone: +7-812-3125208
Email: info@linuxcenter.ru
WWW:
发行人
如果您是销售商并且想销售 FreeBSD CDROM 产品,
请和发行人联系:
Cylogistics
809B Cuesta Dr., #2149
Mountain View , CA 94040
USA
Phone: +1 650 694-4949
Fax: +1 650 694-4953
Email: sales@cylogistics.com
WWW:
Ingram Micro
1600 E. St. Andrew Place
Santa Ana , CA 92705-4926
USA
Phone: 1 (800) 456-8000
WWW:
Kudzu, LLC
7375 Washington Ave. S.
Edina , MN 55439
USA
Phone: +1 952 947-0822
Fax: +1 952 947-0876
Email: sales@kudzuenterprises.com
LinuxCenter.Ru
Galernaya Street, 55
Saint-Petersburg
190000
Russia
Phone: +7-812-3125208
Email: info@linuxcenter.ru
WWW:
Navarre Corp
7400 49th Ave South
New Hope , MN 55428
USA
Phone: +1 763 535-8333
Fax: +1 763 535-0341
WWW:
FTP 站点
官方的 FreeBSD 源代码可以从遍布全球的镜像站点
通过匿名 FTP 下载。 站点
有着良好的网络连接并且允许大量的并发连接, 但是
您或许更想找一个 更近的
镜像站点 (特别是当您想进行某种形式的镜像的时候)。
FreeBSD 镜像
站点数据库 要比使用手册中的镜像列表更加精确,
因为它从 DNS 中获取信息而不依赖于静态的主机列表。
FreeBSD 可以从下面这些镜像站点通过匿名 FTP
下载。如果您选择了通过匿名 FTP 获取 FreeBSD,
请尽量使用离您比较近的站点。被列为
主镜像站点
的镜像站点一般都有完整的 FreeBSD 文件
(针对每种体系结构的所有当前可用的版本),
您或许从您所在的国家或地区的站点下载会得到更快的下载速度。
每个站点提供了最流行的体系结构的最近的版本而有可能不提供完整的
FreeBSD 存档。所有的站点都提供匿名 FTP
访问而有些站点也提供其他的访问方式。对每个站点可用的访问方式
在其主机名后有所说明。
&chap.mirrors.ftp.inc;
匿名 CVS
概述
CVS
匿名
匿名 CVS(或人们常说的
anoncvs )是由和 FreeBSD 附带的 CVS 实用工具提供的用于和远程的
CVS 代码库同步的一种特性。
尤其是, 它允许 FreeBSD 用户不需要特殊的权限对任何一台 FreeBSD 项目的官方
anoncvs 服务器执行只读的 CVS 操作。
要使用它,简单的设置 CVSROOT
环境变量指向适当的 anoncvs 服务器,
输入 cvs login 命令
并提供广为人知的密码anoncvs
,然后使用
&man.cvs.1; 命令像访问任何本地仓库一样来访问它。
cvs login 命令把用来登录 CVS
服务器的密码储存在您的 HOME 目录中一个叫
.cvspass 的文件里。
如果这个文件不存在,
第一次使用 cvs
login 的时候可能会出错。 请创建一个空的
.cvspass 文件,然后试试重新登录。
也可以这么说 CVSup 和 anoncvs
服务本质上提供了同样的功能,但是有各种各样
不同的场合可以影响用户对同步方式的选择。简单来说,
CVSup 在网络资源利用方面
更加有效,而且是到目前为止在两者之中技术上更成熟的
除了成本方面。要使用
CVSup ,在下载任何东西之前
必须首先安装配置特定的客户端,
而且只能用于下载相当大块的
CVSup 称作
collections 。
相比之下,anoncvs 可以通过 CVS
模块名来从单个文件里检出任何东西并赋给特定的程序
(比如 ls 或者 grep )。
当然,anoncvs 也只适用于对
CVS 仓库的只读操作,所以如果您是想用和 FreeBSD 项目共享的仓库提供本地开发的话,
CVSup 几乎是您唯一的选择。
使用匿名 CVS
配置 &man.cvs.1; 使用匿名 CVS 仓库可以简单的设定
CVSROOT 环境变量指向 FreeBSD 项目的
anoncvs 服务器之一。到此书写作为止,
下面的服务器都是可用的:
奥地利 :
:pserver:anoncvs@anoncvs.at.FreeBSD.org:/home/ncvs
(使用 cvs login 然后在提示输入口令时输入任意口令。)
法国 :
:pserver:anoncvs@anoncvs.fr.FreeBSD.org:/home/ncvs
(pserver (口令是 anoncvs
), ssh (没有口令))
德国 :
:pserver:anoncvs@anoncvs.de.FreeBSD.org:/home/ncvs
(Use cvs login and enter the password
anoncvs
when prompted.)
德国 :
:pserver:anoncvs@anoncvs2.de.FreeBSD.org:/home/ncvs
(rsh, pserver, ssh, ssh/2022)
日本 :
:pserver:anoncvs@anoncvs.jp.FreeBSD.org:/home/ncvs
(Use cvs login and enter the password
anoncvs
when prompted.)
美国 :
freebsdanoncvs@anoncvs.FreeBSD.org:/home/ncvs
(仅 ssh - 无口令)
SSH HostKey: 1024 a1:e7:46:de:fb:56:ef:05:bc:73:aa:91:09:da:f7:f4 root@sanmateo.ecn.purdue.edu
SSH2 HostKey: 1024 52:02:38:1a:2f:a8:71:d3:f5:83:93:8d:aa:00:6f:65 ssh_host_dsa_key.pub
USA :
anoncvs@anoncvs1.FreeBSD.org:/home/ncvs (仅 ssh - 无口令)
SSH HostKey: 1024 8b:c4:6f:9a:7e:65:8a:eb:50:50:29:7c:a1:47:03:bc root@ender.liquidneon.com
SSH2 HostKey: 2048 4d:59:19:7b:ea:9b:76:0b:ca:ee:da:26:e2:3a:83:b8 ssh_host_dsa_key.pub
因为 CVS 实际上允许 检出
曾经存在的 (或者,某种情况下将会存在)
FreeBSD 源代码的任意版本, 您需要熟悉
&man.cvs.1; 的版本 (-r ) 参数,
以及在 FreeBSD 代码库中可用的值。
有两种标签,修订标签和分支标签。
修订标签特指一个特定的修订版本。含义始终是不变的。
分支标签,另一方面,
指代给定时间给定开发分支的最新修订,
因为分支标签不涉及特定的修订版本,
它明天所代表的含义就可能和今天的不同。
包括了用户可能感兴趣的
修订标签。 另外,这里面没有一个可以用于 Ports Collection,
因为它没有多个修订版本。
当您指定一个分支标签,您通常会得到那个开发分支的文件的最新版本。
如果您希望得到一些旧的版本,您可以用
-D date 标记制定一个日期。
察看 &man.cvs.1; 手册页了解更多细节。
示例
在这之前强烈建议您通读 &man.cvs.1; 的手册页,
这里有一些简单的例子来展示如何使用匿名
CVS:
从 -CURRENT 检出些东西 (&man.ls.1;):
&prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.jp.FreeBSD.org:/home/ncvs
&prompt.user; cvs login
在提示符处,输入密码 anoncvs
.
&prompt.user; cvs co ls
通过 SSH 检出整个 src/
代码树:
&prompt.user; cvs -d freebsdanoncvs@anoncvs.FreeBSD.org:/home/ncvs co src
The authenticity of host 'anoncvs.freebsd.org (128.46.156.46)' can't be established.
DSA key fingerprint is 52:02:38:1a:2f:a8:71:d3:f5:83:93:8d:aa:00:6f:65.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'anoncvs.freebsd.org' (DSA) to the list of known hosts.
检出 6-STABLE 分支中的 &man.ls.1; 版本:
&prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.jp.FreeBSD.org:/home/ncvs
&prompt.user; cvs login
在提示符处,输入密码 anoncvs
。
&prompt.user; cvs co -rRELENG_6 ls
创建 &man.ls.1; 的变化列表(用标准的 diff)
&prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.jp.FreeBSD.org:/home/ncvs
&prompt.user; cvs login
在提示符处,输入密码 anoncvs
。
&prompt.user; cvs rdiff -u -rRELENG_5_3_0_RELEASE -rRELENG_5_4_0_RELEASE ls
找出可以使用的其它的模块名:
&prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.jp.FreeBSD.org:/home/ncvs
&prompt.user; cvs login
在提示符处,输入密码 anoncvs
.
&prompt.user; cvs co modules
&prompt.user; more modules/modules
其他资源
下面附加的资源可能对学习
CVS 有帮助:
CVS 指南 来自 Cal Poly。
CVS 主页 ,
CVS 开发和支持社区。
CVSweb 是
FreeBSD 项目的 CVS web 界面。
使用 CTM
CTM
CTM 是保持远程目录树和中央服务器目录树同步的一种方法。
它被开发用于 FreeBSD 的源代码树,虽然其他人随着时间推移会发现它可以用于其他目的。
当前几乎没有,也或者只有很少的文档讲述创建 deltas 的步骤,
所以如果您希望使用 CTM 去做其它事情,
请联系 &a.ctm-users.name; 邮件列表了解更多信息。
为什么我该使用 CTM ?
CTM 会给您一份 FreeBSD
源代码树的本地副本。 代码树有很多的
flavors
可用。不管您是希望跟踪完整的 CVS 树还是只是一个分支,
CTM 都会给您提供信息。
如果您是 FreeBSD 上的一个活跃的开发者,但是缺乏或者不存在 TCP/IP 连接,或者只是希望把变化自动发送给您,
CTM 就是适合您的。对于最积极的分支
您将会每天获得三个以上的 deltas。
然而,您应该考虑通过邮件来自动发送。
升级的大小总是保证尽可能的小。
通常小于 5K,也偶然(十分之一可能)会有 10-50K,也不时地有个大的 100K+ 甚至更大的。
您也需要让自己了解直接和开发代码而不是预发行版本打交道的各种警告。这种情况会很显著,
如果您选择了 current
代码的话。强烈建议您阅读 和
FreeBSD 保持同步。
使用
CTM 我需要做什么?
您需要两样东西:CTM
程序,还有初始的 deltas 来 feed it(达到
current
级别)。
CTM 程序从版本 2.0 发布以来
已经是 FreeBSD 的一部分了,如果您安装了源代码副本的话, 它位于
/usr/src/usr.sbin/ctm 。
您喂给 CTM 的 deltas
可以有两种方式,FTP 或者 email。
如果您有普通的访问 Internet 的 FTP 权限,
那么下面的 FTP 站点支持访问
CTM :
或者看看这一小节 镜像。
FTP 访问相关的目录并取得
README 文件,从那里开始。
如果您希望通过 email 得到您的 deltas:
订阅一个
CTM 分发列表。
&a.ctm-cvs-cur.name; 支持完整的 CVS 树。
&a.ctm-src-cur.name; 支持最新的开发分支。
&a.ctm-src-4.name; 支持 4.X 发行分支,
等等。。(如果您不知道如何订阅邮件列表,
点击上面的列表名或者到
&a.mailman.lists.link; 点击您希望订阅的列表。
列表页包含了所有必要的订阅指导。)
当您开始接收到您邮件中的 CTM
升级时,您可以使用
ctm_rmail 程序来解压并应用它们。
事实上如果您想要让进程以全自动的形式运行的话,您可以通过在
/etc/aliases 中设置直接使用 ctm_rmail 程序。
查看 ctm_rmail 手册页了解更多细节。
不管您使用什么方法得到
CTM deltas,您都应该订阅
&a.ctm-announce.name; 邮件列表。
以后会有单独的地方提交有关
CTM 系统的操作的公告。
点击上面的邮件列表名并按照指示订阅邮件列表。
第一次使用 CTM
在您开始使用 CTM
delta 之前,您需要获得一个起始点。
首先您应该确定您已经有了什么。每个人都可以从一个空
目录开始。
您必须用一个初始的 空的
delta 来开始您的
CTM 支持树。曾经为了您的便利这些
起始
deltas 被有意的通过 CD 来发行,
然而现在已经不这样做了。
因为代码树有数十兆字节,您应该更喜欢从手头上已经有的东西开始。如果您有一张
-RELEASE CD 光盘,您可以从里面复制或者解压缩一份初始代码出来。
这会节省非常多的数据传输量。
您会发现这些初始的
deltas 名字的数字后面都有个
X (比如 src-cur.3210XEmpty.gz )。
后面加一个 X 的设计符合您的初始 seed
的由来。
Empty 是一个空目录。通常一个基本的从
Empty 开始的转换由
100 个 deltas 构成。顺便说一下,他们都很大!70 到 80
兆字节的 gzip 压缩的数据对于
XEmpty deltas 是很平常的。
一旦您已经选定了一个基本的 delta 开始,您就需要比这个数高的所有的 delta。
在您的日常生活中使用 CTM
要应用 deltas,简单的键入:
&prompt.root; cd /where/ever/you/want/the/stuff
&prompt.root; ctm -v -v /where/you/store/your/deltas/src-xxx.*
CTM 能够理解被
gzip 压缩的 deltas,所以您不需要先
gunzip 他们,这可以节省磁盘空间。
除非觉得整个过程非常可靠,
CTM 不会涉及到您的代码树的。您也可以使用
-c 标记来校验 delta,
这样 CTM 就不会涉及代码树;
它会只校验 delta 的完整性看看是否可以安全的用于您的当前代码树。
CTM 还有其他的一些参数,
查看手册页或者源代码了解更多信息。
这真的就是全部的事情了。每次得到一个新的
delta,就通过 CTM 运行它来保证您的代码是最新的。
如果这些 deltas 很难重新下载的话不要删除它们。
有些东西坏掉的时候您会想到保留它们的。
即使您只有软盘,也请考虑使用
fdwrite 来做一份副本。
维持您本地的变动
作为一名开发者喜欢实验,改动代码树中的文件。
CTM
用一种受限的方式支持本地修改:再检查文件
foo 存在之前,首先查找
foo.ctm 。如果这个文件存在,
CTM 会对它操作而不是
foo 。
这种行为给我们提供了一种简单的方式来维持本地的改动:
只要复制您计划修改的文件并用
.ctm 的后缀重新命名。
然后就可以自由的修改代码了,CTM 会更新
.ctm 文件到最新版本。
其他有趣的 CTM 选项
正确的找出哪些将被更新
您可以确定变动列表,
CTM 可以做到,在您的代码库上使用
CTM 的
-l 选项。
这很有用如果您想要保存改动的日志,
pre- 或者 post- 用各种风格处理修改的文件的纪录,
或者仅仅是想感受一下孩子般的疯狂。
在升级前制作备份
有时您可能想备份将要被 CTM
升级所改动的所有文件。
指定 -B backup-file 选项会导致
CTM 备份将要被给定的 CTM
delta 改动的所有文件到 backup-file 。
限定受升级影响的文件
有时您可能对限定一个给定的 CTM
升级的范围感兴趣,也有可能想知道怎样从一列 deltas 中解压缩一部分文件。
您可以通过使用 -e 和 -x
选项指定过滤规则表达式来控制 CTM
即将对之操作的文件列表。
例如,要从您保存的CTM deltas
集里解压缩出一个最新的 lib/libc/Makefile
文件,运行这个命令:
&prompt.root; cd /where/ever/you/want/to/extract/it/
&prompt.root; ctm -e '^lib/libc/Makefile' ~ctm/src-xxx.*
对于每一个在 CTM
delta 中指定的文件,-e
和 -x 选项按照命令行给定的顺序应用。
文件只有在所有的 -e 和
-x 被应用之后标记为合格之后
才能被 CTM 操作。
CTM 未来的计划
其中几项:
在 CTM 中使用一些认证方式,
这样来允许察觉冒充的 CTM 补丁。
整理 CTM 的选项,
它们变得杂乱而违反直觉了。
杂项
也有一系列的
ports collection 的 deltas,但是人们对它的兴致还没有那么高。
CTM 镜像
CTM/FreeBSD 可以在下面的镜像站点通过匿名
FTP 下载。如果您选择通过匿名 FTP 获取 CTM ,
请试着使用一个离您较近的站点。
如果有问题,请联系 &a.ctm-users.name;
邮件列表。
加利福尼亚州,海湾地区,官方源代码
南非,旧的 deltas 的备份服务器
中国台湾
如果您在您附近找不到镜像或者镜像不完整,
试着使用搜索引擎比如
alltheweb .
使用 CVSup
概述
CVSup 是一个用于从远程服务器主机上的主
CVS 仓库发布和升级源代码树的软件包。
FreeBSD 的源代码维护在加利福尼亚州一台主开发服务器的 CVS 仓库里。
有了 CVSup ,FreeBSD
用户可以很容易的保持他们自己的源代码树更新。
CVSup 使用所谓的升级
pull 模式。在 pull
模式下,客户端在需要的时候向服务器端请求更新。
服务器被动的等待客户端的升级请求。
因此所有的升级都是客户端发起的。
服务器决不会发送未请求的升级。用户必须手动运行
CVSup 客户端获取更新,
或者设置一个 cron 作业来让它以固定的规律自动运行。
术语 CVSup 用大写字母写正是表示,
代表了完整的软件包。 它的主要组件是运行在每个用户机器上的客户端 cvsup ,
和运行在每个 FreeBSD 镜像站点上的服务器端 cvsupd 。
当您阅读 FreeBSD 文档和邮件列表时,您可能会看见
sup 。
Sup 是
CVSup 的前身,有着相似的目的。
CVSup 使用很多和 sup 相同的方式,
而且, 它还是用使用和 sup 的兼容的配置文件。
Sup 已经不再被 FreeBSD 项目使用了,
因为 CVSup 既快又有更好的灵活性。
安装
安装 CVSup 最简单的方式就是使用
FreeBSD packages collection
中预编译的 net/cvsup 包。
如果您想从源代码构建 CVSup ,
您可以使用 net/cvsup
port。但是预先警告一下:
net/cvsup port 依赖于 Modula-3
系统,会花费相当的时间和磁盘空间来下载编译。
如果想在没有安装 &xfree86;
或 &xorg; 的计算机, 例如服务器上使用
CVSup , 则只能使用不包含
CVSup GUI
的 net/cvsup-without-gui 。
CVSup 配置
CVSup 的操作被一个叫做
supfile 的配置文件所控制。
在目录 /usr/share/examples/cvsup/
下面有一些示例的 supfiles 。
supfile 中的信息解答了
CVSup 下面的几个问题:
您想接收
哪些文件?
您想要它们的
哪个版本?
您想从哪里
获取它们?
您想把它们
放在您自己机器的什么地方?
您想把
您的状态文件放在哪?
在下面的章节里,我们通过依次回答这些问题来创建一个典型的
supfile 文件。首先,我们描述一下
supfile 的整体构成。
supfile 是个文本文件。注释用
# 开头,至行尾有效。
空行和只包含注释的行会被忽略。
每个保留行描述一批用户希望接收的文件。
每行以 collection
,
由服务器端定义的合理的文件分组,的名字开头。
collection 的名字告诉服务器您想要的文件。
collection 名字结束或者有更多的字段,用空格分隔。
这些字段回答了上面列出的问题。
字段类型有两种:标记字段和值字段。
标记字段由独立的关键字组成,比如,
delete 或者
compress 。值字段也用关键字开头,
关键字后面跟 = 和第二个词而没有空格。
例如,release=cvs 是一个值字段。
一个典型的 supfile 往往接收多于一个的
collection。创建
supfile 的一种方式是明确的为每一个
collection 指定相关的字段。然而,这样使得
supfile 的行变得特别长,很不方便,
因为 supfile 中的所有 collection 的大部分
字段都是相同的。
CVSup 提供了一个默认机制来避免
这些问题。用特定的伪 collection 名 *default
开头的行可以被用来设置标记和值为 supfile
中随后的 collection 中的默认值。
默认值可以通过为这个 collection 自身指定不同的值来对单个的
collection 覆盖设置,
也可以在 mid-supfile 中通过附加的
*default 行改变或扩充。
知道了这些,我们现在就可以开始创建一个
用于接收和升级 FreeBSD-CURRENT 主源代码树的
supfile 文件了。
您想接收哪些文件?
通过 CVSup 可用的文件组织成叫做
collections
的名称组。
这些可用的 collection 在 随后的章节 中描述。
在这个例子里,
我们希望接收 FreeBSD 系统的完整的主代码树。
有一个单独的大的 collection
src-all 让我们完成这个。
创建我们的
supfile 的第一步,
我们简单的列出这些 collection,每个一行(在这个例子里,
只有一行):
src-all
您想要他们的
哪个版本?
通过 CVSup ,您实际上可以接收
曾经存在的源代码的任何版本。
这是有可能的,因为
cvsupd 服务器直接通过
CVS 仓库工作,那包含了所有的版本。您可以
用 tag= 和 date= 值字段
指定一个您想要的版本。
仔细的正确指定任何 tag=
字段。有一些 tag 只对特定的 collection 文件合法。
如果您指定了一个不正确的或者
拼写错误的 tag,CVSup
会删除您可能不想删除的文件。
特别地,对 ports-*
collection 只 使用
tag=. 。
tag= 字段在仓库中表示为一个符号标签。
有两种标签,修订标签和分支标签。
修订标签代表一个特定的修订版本。
它的含义是一成不变的。
分支标签,另一方面,代表给定开发线上给定时间的最新修订。
因为分支标签不代表一个特定的修订版本,
它明天的含义就可能和今天的有所不同。
包含了用户可能感兴趣的分支标签。
当在 CVSup 的配置文件中指定标签的时候,必须用
tag= 开头
(RELENG_4 会变成
tag=RELENG_4 )。
记住只有 tag=. 可以用于
Ports Collection。
注意像看到的那样正确的输入标签名。
CVSup 不能辨别合法和不合法标签。
如果您拼写错了标签名,
CVSup
会像您指定了一个没有任何文件的合法标签一样工作,
那会删除您已经存在的代码。
当您指定一个分支标签的时候,您通常会收到开发线上文件的最新版本。
如果您希望接收一些过时的版本,您可以通过用
date= 值字段指定一个日期来做到。
&man.cvsup.1; 手册页解释了如何来做。
对于我们的示例来说,我们希望接收 FreeBSD-CURRENT。
我们在我们的
supfile 的开头添加这行:
*default tag=.
有一个重要的特例,
如果您既没指定 tag= 字段也没指定
date= 字段的情况。这种情况下,
您会收到直接来自于服务器 CVS 仓库的真实的 RCS 文件,
而不是某一特定版本。
开发人员一般喜欢这种操作模式。
通过在他们的系统上维护一份仓库自身的副本,
他们可以浏览修订历史以及检查文件过去的版本。
然而,这个好处是以大量的磁盘空间为代价的。
您想从哪里获取他们?
我们使用 host= 字段来告诉
cvsup 从哪里获取更新。
任何一个 CVSup 镜像站点都可以,
虽然您应该选择一个离您比较近的站点。
在这个例子里我们将使用一个虚拟的 FreeBSD 发布站点,
cvsup99.FreeBSD.org :
*default host=cvsup99.FreeBSD.org
您需要在运行 CVSup
之前把这个改成一个实际存在的站点。
在任何 cvsup 运行的特定时刻,
您都可以在命令行上使用 -h
hostname 选项来覆盖主机设置。
您想把它们放在
您自己机器的什么地方?
prefix= 字段告诉
cvsup 把接收的文件放在哪里。
在这个例子里,我们把源代码文件直接放进我们的主源代码树,
/usr/src 。
src 目录已经隐含在我们选择接收的 collection 里了,
所以正确的写法是:
*default prefix=/usr
cvsup 在哪里维护它的状态文件?
CVSup 客户端在被叫做 base
的目录里维护了几个状态文件。 这些文件帮助
CVSup 更有效的工作,
通过跟踪您已经接收到哪些更新的方式。
我们将使用标准的 base 目录,
/var/db :
*default base=/var/db
如果您的 base 目录还不存在,现在最好创建它。
如果 base 目录不存在,cvsup
客户端会拒绝工作。
其他的 supfile
设置:
在 supfile
中有一些其他选项需要介绍一下:
*default release=cvs delete use-rel-suffix compress
release=cvs 显示服务器应该从 FreeBSD 的主 CVS 仓库中获取信息。
事实上总是这样的,但是也有可能会超出这个讨论的范围。
delete 给
CVSup 权限删除文件。
您应该总是指定这个,这样
CVSup
可以保证您的源代码树完全更新。CVSup
很小心的只删除那些不再依赖的文件。
您拥有的任何额外的文件会被严格的保留。
use-rel-suffix 是 ... 不可思议的。
如果您真的想了解它,查看 &man.cvsup.1; 手册页。
否则,就指定而不用担心这个。
compress 启用 gzip 风格的信道压缩。
如果您的网络连接是 T1 或者更快, 您可能不想使用压缩。
否则,它非常有帮助。
把它们放在一起:
这是我们的示例的完整 supfile
文件:
*default tag=.
*default host=cvsup99.FreeBSD.org
*default prefix=/usr
*default base=/var/db
*default release=cvs delete use-rel-suffix compress
src-all
refuse 文件
像上面提到的,CVSup 使用一种
pull 方法 。基本上,这意味着您要连接到
CVSup 服务器,服务器说,
这有些您能下载的东西
...
,然后您的客户端反应好,我要这个,
这个,这个,还有这个。
在默认的配置中,
CVSup 客户端会取回您在配置文件中选定的
collection 和标签的每个文件。
然而,并不总是您想要的,
尤其是您在同步 doc ,ports ,或者
www 树 — 大部分人都不能阅读四种或者五种
语言,因此他们不需要下载特定语言的文件。
如果您在 CVSup Ports Collection,您
可以通过单独指定每个 collection 来避免这个
(比如,ports-astrology ,
ports-biology ,等等取代简单的说明
ports-all )。然而,因为 doc
和 www 树没有特定语言的 collection,您必须
使用 CVSup 许多极好的特性之一:
refuse 文件。
refuse 文件本质上是告诉
CVSup 它不应该从 collection
中取得某些文件;换句话说,它告诉客户端
拒绝 来自服务器的特定的文件。
refuse 文件可以在
base /sup/
中找到(或者,如果您没有,应该创建一个)。
base 在您的 supfile 中定义;
默认情况下,base 就是
/var/db ,
这意味着默认的 refuse 文件就是
/var/db/sup/refuse 。
refuse 文件的格式很简单;
它仅仅包含您不希望下载的文件和目录名。
例如,如果您除了英语和德语之外不会讲其他语言,
而且也不打算阅读德文的文档翻译版本,
则可以把下面这些放在您的
refuse 文件里:
doc/bn_*
doc/da_*
doc/de_*
doc/el_*
doc/es_*
doc/fr_*
doc/it_*
doc/ja_*
doc/nl_*
doc/no_*
doc/pl_*
doc/pt_*
doc/ru_*
doc/sr_*
doc/tr_*
doc/zh_*
等等其他语言(您可以通过浏览
FreeBSD
CVS 仓库 找到完整的列表)。
有这个非常有用的特性,那些慢速连接或者要为他们的 Internet
连接按时付费的用户就可以节省宝贵的时间因为他们不再需要
下载那些从来不用的文件。要了解
refuse 文件的更多信息以及其它
CVSup 的优雅的特性,请浏览它的
手册页。
运行 CVSup
您现在准备尝试升级了。命令很简单:
&prompt.root; cvsup supfile
supfile
的位置当然就是您刚刚创建的 supfile 文件名啦。
如果您在 X11 下面运行,cvsup
会显示一个有一些可以做平常事情的按钮的 GUI 窗口。
按 go 按钮,然后看着它运行。
在这个例子里您将要升级您目前的
/usr/src 树,您将需要
用 root 来运行程序,这样
cvsup 有需要的权限来更新您的文件。
刚刚创建了您的配置文件,又从来没有使用过这个程序,
紧张不安是可以理解的。有一个简单的方法不改变您当前的文件
来做一次试验性的运行。只要在方便的地方创建一个
空目录,并在命令行上作为一个额外的参数说明:
&prompt.root; mkdir /var/tmp/dest
&prompt.root; cvsup supfile /var/tmp/dest
您指定的目录会作为所有文件更新的目的路径。
CVSup 会检查您在
/usr/src 中的文件,但是不会修改或
删除。任何文件更新都会被放到
/var/tmp/dest/usr/src 里了。
在这种方式下运行 CVSup 也会把它的 base
目录状态文件保持原样。这些文件的新版本
会被写到指定的目录。
因为您有
/usr/src 目录的读权限,所以执行这种试验性的运行
甚至不需要使用 root 用户。
如果您没有运行 X11 或者不喜欢 GUI,
当您运行 cvsup 的时候需要在命令行添加
两个选项:
&prompt.root; cvsup -g -L 2 supfile
-g 告诉
CVSup 不要使用 GUI。如果您
没在运行 X11 这个是自动的,否则您必须指定它。
-L 2 告诉
CVSup 输出所有正在升级的文件的细节。
有三个等级可以选择,从 -L 0 到
-L 2 。默认是 0,意味着除了错误消息
什么都不输出。
还有许多其它的选项可用。想要一个简短的列表,
输入 cvsup -H 。要查看更详细的描述,
请查看手册页。
一旦您对升级工作的方式满意了,您就
可以使用 &man.cron.8; 来安排规则的运行
CVSup 。
很显然的,您不应该让 CVSup
通过 &man.cron.8; 运行的时候使用它的 GUI。
CVSup 文件 collection
CVSup 可用的文件 collection
是分级组织的。
有几个大的 collection,然后它们有分成更小的子
collection。接收一个大的 collection 等同于
接收它的每一个子 collection。
collection 的等级关系在下面列表中通过缩进的使用
反映出来。
最常用的 collection 是
src-all ,和
ports-all 。其它的 collection 只被有着特定
目的的小部分人使用,
有些站点可能不全部支持。
cvs-all release=cvs
FreeBSD 主 CVS 仓库,包含
密码系统的代码。
distrib release=cvs
FreeBSD 发行版本和镜像相关的
文件。
doc-all release=cvs
FreeBSD 使用手册和其它文档的源代码。
其中不包含 FreeBSD web 站点的文件。
ports-all release=cvs
FreeBSD Ports Collection。
如果您不想升级全部的
ports-all (整个 ports 树),
而只是使用下面列出的一个子集,
请确保您总是 升级了
ports-base 子 collection!
无论何时在 ports 构建下层构造有所改变的时候都会通过
ports-base 表现出来,事实上某些
改变会很快的被实际的
ports 使用,因此,如果您只升级了
实际的
ports 而他们使用了一些新的特性,
就有极大的可能编译会因一些神秘的错误信息而失败。
这种情况下非常快速的 要做的事情
就是确保您的
ports-base 子 collection 更新到
最新。
要自行构建 ports/INDEX , 您
必须 接受
ports-all (完整的 ports tree)。
在部分 ports tree 上构建 ports/INDEX
是不被支持的。 请参见
FAQ 。
ports-accessibility
release=cvs
用以帮助残疾用户的软件。
ports-arabic
release=cvs
阿拉伯语支持。
ports-archivers
release=cvs
存档工具。
ports-astro
release=cvs
天文相关的 ports。
ports-audio
release=cvs
声音支持。
ports-base
release=cvs
Ports Collection 构建下部构造 -
位于 /usr/ports 的
Mk/ 和
Tools/ 子目录的
各种各样的文件。
请查看
重要警告:您应该
总是 更新这个
子 collection,无论您更新
FreeBSD Ports Collection 的任何部分的时候!
ports-benchmarks
release=cvs
基准。
ports-biology
release=cvs
生物学。
ports-cad
release=cvs
计算机辅助设计工具。
ports-chinese
release=cvs
中文语言支持。
ports-comms
release=cvs
通信软件。
ports-converters
release=cvs
字符编码转换。
ports-databases
release=cvs
数据库
ports-deskutils
release=cvs
计算机发明前常出现在桌面上的东西。
ports-devel
release=cvs
开发工具。
ports-dns
release=cvs
DNS 相关软件。
ports-editors
release=cvs
编辑器
ports-emulators
release=cvs
其它操作系统的模拟器
ports-finance
release=cvs
货币,金融相关应用程序。
ports-ftp
release=cvs
FTP 客户端和服务器端工具。
ports-games
release=cvs
游戏
ports-german
release=cvs
德语支持。
ports-graphics
release=cvs
图形图像工具。
ports-hebrew
release=cvs
希伯来语支持。
ports-hungarian
release=cvs
匈牙利语言支持。
ports-irc
release=cvs
Internet 多线交谈(IRC)工具。
ports-japanese
release=cvs
日语支持。
ports-java
release=cvs
&java; 工具。
ports-korean
release=cvs
韩国语言支持。
ports-lang
release=cvs
编程语言。
ports-mail
release=cvs
邮件软件。
ports-math
release=cvs
数值计算软件。
ports-mbone
release=cvs
MBone 应用程序。
ports-misc
release=cvs
杂样工具。
ports-multimedia
release=cvs
多媒体软件。
ports-net
release=cvs
网络软件。
ports-net-im
release=cvs
即时消息软件。
ports-net-mgmt
release=cvs
网管软件。
ports-net-p2p
release=cvs
对等网 (peer to peer network) 应用。
ports-news
release=cvs
USENET 新闻软件。
ports-palm
release=cvs
Palm
系列软件支持。
ports-polish
release=cvs
波兰语支持。
ports-portuguese
release=cvs
葡萄牙语支持。
ports-print
release=cvs
打印软件。
ports-russian
release=cvs
俄语支持。
ports-science
release=cvs
科学计算。
ports-security
release=cvs
安全工具。
ports-shells
release=cvs
命令行 shell。
ports-sysutils
release=cvs
系统实用工具。
ports-textproc
release=cvs
文本处理工具(不
包含桌面出版)。
ports-ukrainian
release=cvs
乌克兰语支持。
ports-vietnamese
release=cvs
越南语支持。
ports-www
release=cvs
万维网(WWW)相关软件。
ports-x11
release=cvs
支持 X window 系统的 ports。
ports-x11-clocks
release=cvs
X11 时钟。
ports-x11-fm
release=cvs
X11 文件管理器。
ports-x11-fonts
release=cvs
X11 字体和字体工具。
ports-x11-toolkits
release=cvs
X11 工具包。
ports-x11-servers
release=cvs
X11 服务器。
ports-x11-themes
release=cvs
X11 主题。
ports-x11-wm
release=cvs
X11 窗口管理器。
projects-all release=cvs
FreeBSD 内部项目的代码库。
src-all release=cvs
FreeBSD 主代码,包含密码系统的代码。
src-base
release=cvs
/usr/src
顶层的各式各样的文件。
src-bin
release=cvs
但用户模式下可能用到的用户工具
(/usr/src/bin )。
src-contrib
release=cvs
FreeBSD 项目之外的工具和库,通常在 FreeBSD 中不作修改
(/usr/src/contrib )。
src-crypto release=cvs
FreeBSD 项目之外的
密码系统工具和库,通常在 FreeBSD 中不作修改
(/usr/src/crypto )。
src-eBones release=cvs
Kerberos 和 DES
(/usr/src/eBones )。
没有在当前的 FreeBSD 发行中使用。
src-etc
release=cvs
系统配置文件
(/usr/src/etc )。
src-games
release=cvs
游戏
(/usr/src/games )。
src-gnu
release=cvs
GNU 公共许可协议的工具
(/usr/src/gnu )。
src-include
release=cvs
头文件
(/usr/src/include )。
src-kerberos5
release=cvs
Kerberos5 安全包
(/usr/src/kerberos5 )。
src-kerberosIV
release=cvs
KerberosIV 安全包
(/usr/src/kerberosIV )。
src-lib
release=cvs
库
(/usr/src/lib )。
src-libexec
release=cvs
通常被其它程序调用的系统程序
(/usr/src/libexec )。
src-release
release=cvs
生成 FreeBSD 版本必需的文件
(/usr/src/release )。
src-sbin release=cvs
但用户模式的系统工具
(/usr/src/sbin )。
src-secure
release=cvs
密码相关库和命令
(/usr/src/secure )。
src-share
release=cvs
跨多个平台的共享的文件
(/usr/src/share )。
src-sys
release=cvs
内核
(/usr/src/sys )。
src-sys-crypto
release=cvs
内核密码系统代码
(/usr/src/sys/crypto )。
src-tools
release=cvs
维护 FreeBSD 的各种各样的工具
(/usr/src/tools )。
src-usrbin
release=cvs
用户工具
(/usr/src/usr.bin )。
src-usrsbin
release=cvs
系统工具
(/usr/src/usr.sbin )。
www release=cvs
FreeBSD WWW 站点的源代码。
distrib release=self
CVSup 服务器的
配置文件。用于 CVSup
镜像站点。
gnats release=current
GNATS bug 跟踪数据库。
mail-archive release=current
FreeBSD 邮件列表存档。
www release=current
预处理过的 FreeBSD WWW 站点文件(不是源文件)。
用于 WWW 镜像站点。
更多信息
CVSup FAQ 和关于
CVSup 的其它信息,请查看
CVSup 主页 。
大多数
CVSup 的和 FreeBSD 相关的讨论都在
&a.hackers;。软件的新版本在那发布,
还有 &a.announce;。
问题和 bug 报告应该发给
程序作者 cvsup-bugs@polstra.com 。
CVSup 站点
FreeBSD 的 CVSup 服务器运行于
下列站点:
&chap.mirrors.cvsup.inc;
使用 Portsnap
介绍
Portsnap
是一套用以安全地分发 &os; ports 套件的系统。 每隔大约一个小时,
就会生成一份 ports 的最新 快照
,
它会被打包并进行数字签名。 这些文件接下来将通过 HTTP
来分发。
与 CVSup 类似,
Portsnap 采用
拉 (pull) 的模式来进行更新:
经过打包并签名的 ports tree 被放在 web 服务器上,
被动地等待用户请求它们。 用户需要手工运行
&man.portsnap.8; 来下载更新,
或者设置 &man.cron.8; 任务来自动地进行更新。
由于一些技术原因, Portsnap
并不自动地直接更新位于
/usr/ports/ 目录中的 实际的
ports
tree; 事实上, 默认情况下它只操作位于
/var/db/portsnap/ 的压缩的 ports tree 副本,
而这个副本则用于更新实际的 ports tree。
如果 Portsnap 是通过
&os; Ports Collection 安装的,
则这份压缩快照的默认位置则是 /usr/local/portsnap/
而非 /var/db/portsnap/ 。
安装
在 &os; 6.0 和更新版本上,
Portsnap 已经成为 &os;
基本系统的一部分。 在较早版本的 &os; 中,
它可经由 sysutils/portsnap
port 来安装。
Portsnap 的配置
Portsnap 的操作,
是通过 /etc/portsnap.conf 配置文件来控制的。
对于多数用户来说, 默认的配置文件已经可用了; 要了解进一步的细节,
则应参考 &man.portsnap.conf.5; 联机手册。
假如 Portsnap 是通过
&os; Ports Collection 安装的, 则它将使用配置文件
/usr/local/etc/portsnap.conf 而非
/etc/portsnap.conf 。 这个文件并不随 port
的安装自动创建, 但我们提供了一个示例的配置文件;
将其复制到合适的位置, 然后运行下面的命令:
&prompt.root; cd /usr/local/etc && cp portsnap.conf.sample portsnap.conf
首次运行 Portsnap
在首次运行 &man.portsnap.8; 时, 它需要将整个
ports tree 的压缩快照下载到 /var/db/portsnap/ (或者,
如果 Portsnap 是通过
Ports Collection 安装的, 则是
/usr/local/portsnap/ )。
在 2006 年初, 其下载尺寸大约是 41 MB。
&prompt.root; portsnap fetch
一旦下载了压缩的快照, 就可以将它释放成为位于
/usr/ports/ 中的
实际的
ports tree 了。 即时之前那个目录中已经有了一份
ports tree 也需要这样做 (例如,
通过使用 CVSup ), 因为这个操作,
将为后续的 portsnap 决定更新 ports tree
的哪一部份提供基础。
&prompt.root; portsnap extract
默认安装时, 并不会自动创建
/usr/ports 这个目录。
如果您使用 &os; 6.0-RELEASE, 在首次使用
portsnap 之前应手工创建这个目录。
在更高版本的 &os; 和 Portsnap 中,
这个操作会由 portsnap 命令自动完成。
更新 Ports Tree
在首次下载压缩的 ports tree 快照,
并将其释放到 /usr/ports/ 之后,
更新 ports tree 包含下面两步:
fetch (下载) 对于压缩快照的更新,
并使用它们来 update (更新)
实际的 ports tree。 这两步可以通过一个
portsnap 命令来完成:
&prompt.root; portsnap fetch update
较早版本的 portsnap
并不支持这种写法。 如果不能用的话, 试试看下面的:
&prompt.root; portsnap fetch
&prompt.root; portsnap update
通过 cron 来运行 Portsnap
为了避免对于 Portsnap
服务器的 快闪
式访问,
portsnap fetch 不支持作为
&man.cron.8; 任务来运行。 与此相反, 提供了一个特殊的
portsnap cron 命令,
它在开始下载更新之前会随机等待最多 3600 秒。
此外, 强烈建议不要将
portsnap update 作为
cron 任务来运行, 因为它可能给正在同时进行的 port
安装带来大问题。 不过, 更新 ports 的 INDEX 文件一般并无大碍, 这可以通过
portsnap 的
-I 参数来实现 (显然, 如果
portsnap -I update 是通过
cron 来运行的, 在之后还需要执行不带 -I 的
portsnap update 来更新 ports tree 余下的部分。)
可以在 /etc/crontab
中加入下列设置, 以便让 portsnap 更新其压缩快照, 以及位于
/usr/ports/ 中的 INDEX 文件,
并在有 port 过期时发出邮件通知:
0 3 * * * root portsnap -I cron update && pkg_version -vIL=
如果系统时钟没有设置为使用本地时区,
请将 3 改为一介于 0 和 23 的随机值, 以便让
Portsnap 服务器的负载更为平均。
某些较早版本的 portsnap ,
并不支持在一次调用 portsnap 时使用多个命令 (例如,
cron update )。 如果这样不行, 请将
portsnap -I cron update 改为
portsnap cron && portsnap -I update 。
CVS 标签
当使用 cvs 或者
CVSup
获取和升级源代码的时候,必须指定一个修订标签。
修订标签代表 &os; 开发的一个特定分支,
或者一个特定的时间点。第一种叫做
分支标签
,第二种叫做
版本标签
。
分支标签
所有这些,除了 HEAD (这个总是
合法标签)以外,只适用于 src/
树。ports/ ,doc/ ,和
www/ 树没有分支。
HEAD
主线的符号名,或者说 FreeBSD-CURRENT。
当没有指定修订版本的时候也是默认的。
在 CVSup 里,这个标签通过
一个 . 来反映出来(不是标点,而是一个
. 字符)。
在 CVS 里,当没有修订标签指定时这是默认的。
在一台 STABLE 机器上检出或者升级到 CURRENT 源代码
通常不是
一个好主意,除非这是您的本意。
RELENG_6
这是 FreeBSD-6.X 的开发分支,
也被称作 FreeBSD 6-STABLE。
RELENG_6_1
FreeBSD-6.1 的发行版分支, 只用于安全公告,
以及其他重要更新。
RELENG_6_0
FreeBSD-6.0 的发行版分支, 只用于安全公告,
以及其他重要更新。
RELENG_5
这是 FreeBSD-5.X 的开发分支,
也被称作 FreeBSD 5-STABLE。
RELENG_5_5
FreeBSD-5.5 安全分支。 只被安全公告和其它重要更新使用。
RELENG_5_4
FreeBSD-5.4 安全分支。 只被安全公告和其它重要更新使用。
RELENG_5_3
FreeBSD-5.3 安全分支。 只被安全公告和其它重要更新使用。
RELENG_5_2
针对 FreeBSD-5.2 和 FreeBSD-5.2.1 的发行版本分支,只做
安全咨询和其它紧急的修正。
RELENG_5_1
针对 FreeBSD-5.1 的发行版本分支,只做
安全咨询和其它紧急的修正。
RELENG_5_0
针对 FreeBSD-5.0 的发行版本分支,只做
安全咨询和其它紧急的修正。
RELENG_4
FreeBSD-4.X 开发线,也被叫做
FreeBSD-STABLE。
RELENG_4_11
FreeBSD-4.11 发行版, 只被安全公告和其它重要更新使用。
RELENG_4_10
针对 FreeBSD-4.10 的发行版本分支,只做
安全咨询和其它紧急的修正。
RELENG_4_9
针对 FreeBSD-4.9 的发行版本分支,只做
安全咨询和其它紧急的修正。
RELENG_4_8
针对 FreeBSD-4.8 的发行版本分支,只做
安全咨询和其它紧急的修正。
RELENG_4_7
针对 FreeBSD-4.7 的发行版本分支,只做
安全咨询和其它紧急的修正。
RELENG_4_6
针对 FreeBSD-4.6 和 FreeBSD-4.6.2 的发行版本分支,只做
安全咨询和其它紧急的修正。
RELENG_4_5
针对 FreeBSD-4.5 的发行版本分支,只做
安全咨询和其它紧急的修正。
RELENG_4_4
针对 FreeBSD-4.4 的发行版本分支,只做
安全咨询和其它紧急的修正。
RELENG_4_3
针对 FreeBSD-4.3 的发行版本分支,只做
安全咨询和其它紧急的修正。
RELENG_3
FreeBSD-3.X 的开发线,也被叫做
3.X-STABLE。
RELENG_2_2
FreeBSD-2.2.X 的开发线,也被叫做
2.2-STABLE。这个分支过于陈旧了。
版本标签
当一个特定的 &os; 版本发行时,
这些标签代表了一个指定的时间点。发布工程进程在
Release Engineering
Information 和
Release
Process 文档中被详细描述。
src
树使用以 RELENG_ 开头的标签。
ports 和
doc 树使用以
RELEASE 开头的标签。
最后, www 树上不会有任何特定发行版的标签。
+
+ RELENG_6_2_0_RELEASE
+
+
+ FreeBSD 6.2
+
+
+
RELENG_6_1_0_RELEASE
FreeBSD 6.1
RELENG_6_0_0_RELEASE
FreeBSD 6.0
RELENG_5_5_0_RELEASE
FreeBSD 5.5
RELENG_5_4_0_RELEASE
FreeBSD 5.4
RELENG_4_11_0_RELEASE
FreeBSD 4.11
RELENG_5_3_0_RELEASE
FreeBSD 5.3
RELENG_4_10_0_RELEASE
FreeBSD 4.10
RELENG_5_2_1_RELEASE
FreeBSD 5.2.1
RELENG_5_2_0_RELEASE
FreeBSD 5.2
RELENG_4_9_0_RELEASE
FreeBSD 4.9
RELENG_5_1_0_RELEASE
FreeBSD 5.1
RELENG_4_8_0_RELEASE
FreeBSD 4.8
RELENG_5_0_0_RELEASE
FreeBSD 5.0
RELENG_4_7_0_RELEASE
FreeBSD 4.7
RELENG_4_6_2_RELEASE
FreeBSD 4.6.2
RELENG_4_6_1_RELEASE
FreeBSD 4.6.1
RELENG_4_6_0_RELEASE
FreeBSD 4.6
RELENG_4_5_0_RELEASE
FreeBSD 4.5
RELENG_4_4_0_RELEASE
FreeBSD 4.4
RELENG_4_3_0_RELEASE
FreeBSD 4.3
RELENG_4_2_0_RELEASE
FreeBSD 4.2
RELENG_4_1_1_RELEASE
FreeBSD 4.1.1
RELENG_4_1_0_RELEASE
FreeBSD 4.1
RELENG_4_0_0_RELEASE
FreeBSD 4.0
RELENG_3_5_0_RELEASE
FreeBSD-3.5
RELENG_3_4_0_RELEASE
FreeBSD-3.4
RELENG_3_3_0_RELEASE
FreeBSD-3.3
RELENG_3_2_0_RELEASE
FreeBSD-3.2
RELENG_3_1_0_RELEASE
FreeBSD-3.1
RELENG_3_0_0_RELEASE
FreeBSD-3.0
RELENG_2_2_8_RELEASE
FreeBSD-2.2.8
RELENG_2_2_7_RELEASE
FreeBSD-2.2.7
RELENG_2_2_6_RELEASE
FreeBSD-2.2.6
RELENG_2_2_5_RELEASE
FreeBSD-2.2.5
RELENG_2_2_2_RELEASE
FreeBSD-2.2.2
RELENG_2_2_1_RELEASE
FreeBSD-2.2.1
RELENG_2_2_0_RELEASE
FreeBSD-2.2.0
AFS 站点
FreeBSD 的 AFS 服务器运行于下面的站点:
瑞典
文件的路径是:
/afs/stacken.kth.se/ftp/pub/FreeBSD/
stacken.kth.se # Stacken Computer Club, KTH, Sweden
130.237.234.43 #hot.stacken.kth.se
130.237.237.230 #fishburger.stacken.kth.se
130.237.234.3 #milko.stacken.kth.se
维护者 ftp@stacken.kth.se
rsync 站点
下面的站点让 FreeBSD 可以通过 rsync 协议下载。
rsync 实用程序和
&man.rcp.1; 的工作方式很相像,
但是有更多的选项,使用 rsync 远程更新协议只传输
两份文件的不同之处,
因此能够大幅度的提高网络同步速率。
如果您是 FreeBSD FTP 服务器或者 CVS 仓库的镜像站点,
这一点非常有用。
rsync 套件可以工作在许多种
操作系统上,在 FreeBSD 上,查看
net/rsync
port 或者使用 package。
捷克共和国
rsync://ftp.cz.FreeBSD.org/
可用的 collection:
ftp:FreeBSD FTP 服务器的
部分镜像。
FreeBSD:FreeBSD FTP 服务器的
完整镜像。
德国
rsync://grappa.unix-ag.uni-kl.de/
可用的 collection:
freebsd-cvs:完整的 FreeBSD
CVS 仓库。
这台服务器也镜像 NetBSD 和 OpenBSD 项目,
还有其他的一些项目的 CVS 仓库。
荷兰
rsync://ftp.nl.FreeBSD.org/
可用的 collection:
vol/4/freebsd-core: 对于
FreeBSD FTP 服务器的完整镜像。
英国
rsync://rsync.mirror.ac.uk/
可用的 collection:
ftp.FreeBSD.org: FreeBSD FTP 服务器
的完整镜像。
美国
rsync://ftp-master.FreeBSD.org/
服务器只供 FreeBSD 主镜像站点使用。
可用的 collection:
FreeBSD:FreeBSD FTP 服务器的主要存档。
acl:FreeBSD 主 ACL
列表。
rsync://ftp13.FreeBSD.org/
可用的 collection:
FreeBSD:FreeBSD FTP 服务器的完整
镜像。
diff --git a/zh_CN.GB2312/books/handbook/x11/chapter.sgml b/zh_CN.GB2312/books/handbook/x11/chapter.sgml
index 4131563b68..43b542a9ca 100644
--- a/zh_CN.GB2312/books/handbook/x11/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/x11/chapter.sgml
@@ -1,1482 +1,1482 @@
Ken
Tom
Updated for X.Org's X11 server by
Marc
Fonvieille
X Window 系统
概述
FreeBSD 使用 X11 来为用户提供功能强大的图形用户界面。
X11 是一种开放源代码的 X Window 系统实现,
它包括 &xorg; 和
&xfree86; 。 &os; 在包括
&os; 5.2.1-RELEASE
在内的版本之前, 都默认安装
&xfree86; , 一种由 &xfree86; Project, Inc.
发布的 X11 服务。 从 &os; 5.3-RELEASE 开始,
默认并且为官方支持的 X11 变成了
&xorg; , 它是由 X.Org
基金会开发的 X11 服务, 采用与 &os; 类似的授权。 此外,
也有一些用于 &os; 的商业 X 服务器。
这章将介绍 X11 的安装和配置, 并着重强调
&xorg; 。 如欲了解关于 &xfree86;
的详细信息 (在较早的 &os; 版本中,
&xfree86; 是默认的 X11
软件包), 则可以访问存档的旧版 &os; 使用手册, 其网址为 。
欲了解 X11 所支持的显示卡等硬件,
请访问 &xorg; 网站。
在阅读完这一章后,您将会了解:
X 视窗系统的不同组件,它们是如何协同工作的。
如何安装和配置 X11。
如何安装和使用不同的窗口管理器。
如何在 X11 中使用 &truetype; 字体。
如何为您的系统设置图形登录
(XDM )。
在阅读这一章之前,您应该:
知道如何安装额外的第三方应用程序()。
理解 X
对于那些熟悉其他图形环境,比如
µsoft.windows; 或者
&macos; 的用户来说,第一次使用 X 可能会感觉很惊讶。
尽管您不需要了解各种 X 组件的所有细节和它们是如何互相影响的;
然而, 了解一些基本的知识可以让您很好地利用 X 的强大功能。
为什么要使用 X?
X 不是第一个为 &unix; 而开发的视窗系统, 但它是最流行的。
X 的原始开发团队在开发 X 之前就已经在另外一个视窗系统上工作了。
那个系统的名字叫做
W
(就是 Window
)。X 只是罗马字母中 W 后面
的一个。
X 可以被叫做 X
, X Window 系统
,
X11
, 等等。把 X11 称做
X Windows
可能会冒犯某些人;
查看 &man.X.7; 可以了解更多的信息。
X 客户机/服务器模型
X 一开始就是针对网络而设计的,所以
采用了 client-server
模型。在 X 模型中,
X server
运行在有键盘,显示器,鼠标的计算机上。
服务器用来管理显示信息,处理来自键盘和鼠标的输入等。
每一个 X 应用程序 (比如 XTerm , 或者
&netscape; ) 就是一个 client
。
一个 client 给服务器发送信息,如 Please draw a
window at these coordinates
, 然后服务器就返回处理信息,如
The user just clicked on the OK
button
。
如果您在只有一台计算机的家里或小型办公环境中使用 FreeBSD,您就
需要在同一台计算机上运行 X server和 X client。然而,如果您有很多运行
FreeBSD 的机器,您可以在您的桌面计算机上运行 X server,而在比较高档
的服务器上运行 X 应用程序。在这样的环境中,X server 和 X client 之间的
通信就可以通过网络来进行。
这迷惑了一些人,因为 X 的术语和他们料想的有些不同。
他们以为 X server
是运行在功能强大的大型机上的,而
X client
是运行在他们桌面上的计算机上的。
记住,X server 是有键盘和显示器的那台计算机,而
X client 是那些显示窗口的程序。
并不需要 client 和 server 都运行在同一种操作系统上,或甚至运行在
同一种类型的计算机上。在 µsoft.windows; 或者 Apple 公司的 &macos; 上运行
一个 X server 也是可以的,在它们上面也有很多免费的和商业化的应用程序。
窗口管理器
X 的设计哲学很像 &unix; 的设计哲学,
tools, not policy
。这就意味着 X 不会试图去规定任务应该如何
去完成,而是,只给用户提供一些工具,至于决定如何使用这些工具是用户自己的
事情。
这套哲学扩展了 X,它不会规定窗口在屏幕上应该是什么样子,要如何移动鼠标,
什么键应该用来切换窗体 (比如,
Alt
Tab
按键,在 µsoft.windows; 环境中的作用), 每个窗口的工具条应该
看起来像什么,他们是否应该有关闭按钮等等。
实际上,X 行使了一种叫做
窗口管理器
的应用程序的职责。有很多这样的程序可用:
AfterStep ,
Blackbox , ctwm ,
Enlightenment ,
fvwm , Sawfish ,
twm ,
Window Maker ,等等。每一个窗口管理器
都提供了不同的界面和观感;其中一些还支持
虚拟桌面
;有一些允许您可以定制一些键来管理您的桌面;
一些有开始
按钮,或者其他类似的设计;一些是 可定制主题的(themeable)
,
通过安装新的主题, 可以完全改变外观。 这些以及很多其他的窗口管理器,
都可以在 Ports Collection 的
x11-wm 分类目录里找到。
另外,KDE 和
GNOME 桌面环境都有他们自己的窗口管理器
与桌面集成。
每个窗口管理器也有不同的配置机制;有些需要手工来写配置文件,
而另外一些则可以使用 GUI 工具来完成大部分的配置任务,至少
(Sawfish ) 有一个用 Lisp 语言来写的配置
文件。
焦点策略
窗口管理器的另一个特性是鼠标的 focus policy
。
每个窗口系统都需要有一个选择窗口的方法来接受键盘的输入信息,以及当前
哪个窗口处于可用状态。
您通常比较熟悉的是一个叫做 click-to-focus
的焦点策略。
这是 µsoft.windows; 使用的典型焦点策略,也就是您在一个窗口上点击
一下鼠标,这个窗口就处于当前可用的状态。
X 不支持一些特殊的焦点策略。确切地说,窗口管理器控制着在什么时候哪个窗口
拥有焦点。不同的窗口管理器支持不同的焦点方案。它们都支持点击即获得焦点,
而且它们中的大多数都支持好几种方案。
最流行的焦点策略:
focus-follows-mouse
鼠标指示器下面的窗口就是获得焦点的窗口。这可以不是位于其他所有
窗口顶部的窗口。您可以通过将鼠标移到另一个窗口就可以来改变焦点,您
不需要在它上面点击。
sloppy-focus
这种方式是对 focus-follows-mouse 策略的一个小小扩展。对于
focus-follows-mouse, 如果您把鼠标移到了根窗口(或桌面背景)上,
则所有的其它窗口都会失去焦点, 而相关的全部键盘输入也会丢失。
如果选择了 sloppy-focus, 则只有当指针进入新窗口时,
窗口焦点才会发生变化, 而当退出当前窗口时是不会变化的。
click-to-focus
当前窗口由鼠标点击来选择。窗口被突出显示
,
出现在所有其他窗口的前面。即使指针被移向了另一个窗口,所有的键盘输入
仍会被这个窗口接收。
许多窗口管理器支持其他的策略,与这些相比又有些变化。您可以看具体
窗口管理器的文档。
窗口部件
提供工具而非策略的 X 方法使得在每个应用程序屏幕上看到的窗口部件得到了
大大的扩展。
Widget
只是针对用户接口中所有列举项目的一个术语,它
可以用某种方法来点击或操作;如按钮,复选框,单选按钮,图标,列表框等等。
µsoft.windows; 把这些叫做控件
。
µsoft.windows; 和苹果公司的 &macos; 都有一个严格的窗口部件策略。
应用程序开发者被建议确保他们的应用程序共享一个普通的所见即所得的用户界面。
对于 X,它并不要求一个特殊的图形风格或一套相结合的窗口部件集。
这样的结果是您不能期望 X 应用程序只拥有一个普通的所见即所得的界面。
有很多的流行的窗口部件集设置,包括来自于 MIT 的 Athena,
&motif; (模仿
µsoft.windows; 的窗口风格, 所有部件都具有斜边和3种灰色度),
OpenLook ,
和其他一些窗口部件集。
如今, 绝大多数比较新的 X 应用程序将使用一组新式的窗口设计,
包括 KDE 所使用的 Qt,
以及 GNOME 所使用的 GTK+。
在这样一种窗口系统下,&unix; 桌面的一些所见即所得特性作了一些收敛,
以使初学者感到更容易一些。
安装 X11
&xorg; 是 &os;
上的默认 X11 实现。 &xorg;
是由 X.Org 基金会发行的开放源代码 X Window 系统实现中的 X 服务。
&xorg; 基于
&xfree86 4.4RC2 和 X11R6.6 的代码。
从 &os; Ports 套件可以安装 &xorg;
的 &xorg.version; 版本。
如果需要从 Ports Collection 编译和安装 &xorg; :
&prompt.root; cd /usr/ports/x11/xorg
&prompt.root; make install clean
要完整地编译 &xorg; 则需要至少
4 GB 的剩余磁盘空间。
另外 X11 也可以直接从 package 来安装。
我们提供了可以与 &man.pkg.add.1; 工具配合使用的 X11 安装包。
如果从远程下载并安装时,
&man.pkg.add.1; 请不要指定版本号。
&man.pkg.add.1; 会自动地下载最新版本的安装包。
想要从 package 安装
&xorg; , 简单地输入下面的命令:
&prompt.root; pkg_add -r xorg
上面的例子介绍了如何安装完整的
X11 软件包, 包括服务器端,客户端,字体等等。
此外, 也有一些单独的 X11 的 ports 和 packages.
这一章余下的部分将会讲解如何配置
X11, 以及如何设置一个高效的桌面环境。
Christopher
Shumway
Contributed by
配置 X11
&xorg;
X11
开始之前
在配置 X11 之前,
您需要了解所安装的系统的下列信息:
显示器规格
显示卡的芯片类型
显示卡的显存容量
水平刷新率
垂直刷新率
显示器的规格被 X11 用来决定显示的分辨率和刷新率。
这些规格通常可以从显示器所带的文档中,
以及制造商的网站找到。
需要知道两个数字范围: 垂直刷新率和水平刷新率。
显示卡的芯片类型将决定
X11 使用什么模块来驱动图形硬件。
绝大多数的硬件都能被自动检测,
但是了解它在自动检测出错的时候还是很有用处的。
显示卡的显存大小决定了系统支持的分辨率和颜色深度。
了解这些限制非常重要。
配置 X11
配置 X11 需要几步。 第一步是以超级用户的身份建立初始的配置文件:
&prompt.root; Xorg -configure
这会在 /root 中生成一个叫做
xorg.conf.new 的配置文件
(无论您使用 &man.su.1; 或直接登录,
都会改变默认的 $HOME 目录变量)。
X11 程序将尝试探测系统中的图形硬件,并将探测到的硬件信息写入配置文件,
以便加载正确的驱动程序。
下一步是测试现存的配置文件,
以确认 &xorg;
能够同系统上的图形设备正常工作。
要完成这个任务,只需:
&prompt.root; Xorg -config xorg.conf.new
如果用户看到一个黑灰的格子和一个 X 形的鼠标指针,那么配置就是成功的。
要退出测试, 只要同时按下
Ctrl
Alt
Backspace
。
如果鼠标工作不正常, 则需要先配置它。
参见 &os; 安装一张中的 。
X11 调优
接下来是调整 xorg.conf.new
配置文件并作测试。 用文本编辑器如
&man.emacs.1; 或 &man.ee.1; 打开这个文件。 要做的第一件事是为当前系统的显示器设置刷新率。
这些值包括垂直和水平的同步频率。 把它们加到
xorg.conf.new 的
"Monitor" 小节中:
Section "Monitor"
Identifier "Monitor0"
VendorName "Monitor Vendor"
ModelName "Monitor Model"
HorizSync 30-107
VertRefresh 48-120
EndSection
HorizSync 和
VertRefresh 在配置文件中可能没有。
如果是这样的话, 就需要添加它们, 并在
HorizSync 以及 VertRefresh
后面设置合适的数值。 在上面的例子中, 给出了相应的显示其的参数。
X 能够利用显示器所支持的 DPMS (能源之星) 功能。
&man.xset.1; 程序可以控制超时时间, 并强制待机、挂起或关机。
如果希望启用显示器的 DPMS 功能, 则需要把下面的设置添加到 monitor 节中:
Option "DPMS"
xorg.conf
关闭 xorg.conf.new
之前还应该选择默认的分辨率和色深。
这是在 "Screen" 小节中定义的:
Section "Screen"
Identifier "Screen0"
Device "Card0"
Monitor "Monitor0"
DefaultDepth 24
SubSection "Display"
Viewport 0 0
Depth 24
Modes "1024x768"
EndSubSection
EndSection
DefaultDepth 关键字描述了要运行的默认色深。
这可以通过 &man.Xorg.1; 的
-depth 命令行开关来替代配置文件中的设置。
Modes 关键字描述了给定颜色深度下屏幕的分辨率。
需要说明的是, 目标系统的图形硬件只支持由 VESA 定义的标准模式。
前面的例子中, 默认色深是使用 24位色。
在采用这个色深时, 允许的分辨率是 1024x768。
最后就是将配置文件存盘, 并使用前面介绍的测试模式测试一下。
在发现并解决问题的过程中可以帮助您的工具之一就是
X11 的日志文件,包含了与 X11 服务器相关的每个设备的信息。
&xorg; 日志的文件名是
/var/log/Xorg.0.log 这样的格式。
实际的日志文件名可能是 Xorg.0.log 到
Xorg.8.log 等等。
如果一切准备停当, 就可以把配置文件放到公共的目录中了。
您可以在 &man.Xorg.1; 里面找到具体位置。
这个位置通常是 /etc/X11/xorg.conf 或
/usr/X11R6/etc/X11/xorg.conf 。
&prompt.root; cp xorg.conf.new /etc/X11/xorg.conf
现在已经完成了 X11 的配置全过程。 &xorg;
可以通过 &man.startx.1; 工具来启动。
除此之外, X11 服务器也可以用
&man.xdm.1; 来启动。
有一个图形配置工具
&man.xorgcfg.1;, 会随 X11 软件包一同安装。
它可以通过选择合适的驱动和设置交互式地定义配置。
这个程序可以从控制台通过命令 xorgcfg -textmode 来直接启动。
欲了解详情, 请参考 &man.xorgcfg.1; 的联机手册。
另外还有一个叫做 &man.xorgconfig.1; 的文本界面配置工具
这是一个控制台工具, 对用户而言不太友好,
不过当其他工具无法工作时, 它仍然可能可以使用。
高级配置主题
配置 &intel; i810 显示芯片组
Intel i810 显示芯片
配置Intel i810芯片组的显示卡需要有针对 X11
的能够用来驱动显示卡的 agpgart AGP程序接口。
请参见 &man.agp.4; 驱动程序的联机手册了解更多细节。
这也适用于其他的图形卡硬件配置。
注意如果系统没有将 &man.agp.4;
驱动程序编译进内核,尝试用 &man.kldload.8; 加载模块是无效的。
这个驱动程序必须编译进内核或者使用 /boot/loader.conf
在启动时加载进入内核。
添加宽屏平板显示器
widescreen flatpanel configuration
这一节假定您了解一些关于高级配置的知识。
如果使用前面的标准配置工具不能产生可用的配置,
则在日志文件中提供的信息应该足以修正配置使其正确工作。
如果需要的话, 您应使用一个文本编辑器来完成这项工作。
目前的宽屏 (WSXGA、 WSXGA+、 WUXGA、 WXGA、 WXGA+, 等等)
支持 16:10 和 10:9 或一些支持可能有问题的显示比例。 常见的一些
16:10 比例的分辨率包括:
2560x1600
1920x1200
1680x1050
1440x900
1280x800
未来, 将可以很容易地把这些分辨率作为 Section
"Screen" 中的 Mode ,
类似下面这样:
Section "Screen"
Identifier "Screen0"
Device "Card0"
Monitor "Monitor0"
DefaultDepth 24
SubSection "Display"
Viewport 0 0
Depth 24
Modes "1680x1050"
EndSubSection
EndSection
&xorg; 能够自动地通过 I2C/DDC 信息来自动获取宽屏显示器的分辨率信息,
并处理显示器支持的频率和分辨率。
如果驱动程序没有对应的 ModeLines ,
就需要给 &xorg; 一些提示了。
使用 /var/log/Xorg.0.log 能够提取足够的信息,
就可以写一个可用的 ModeLine 了。
这类信息如下所示:
(II) MGA(0): Supported additional Video Mode:
(II) MGA(0): clock: 146.2 MHz Image Size: 433 x 271 mm
(II) MGA(0): h_active: 1680 h_sync: 1784 h_sync_end 1960 h_blank_end 2240 h_border: 0
(II) MGA(0): v_active: 1050 v_sync: 1053 v_sync_end 1059 v_blanking: 1089 v_border: 0
(II) MGA(0): Ranges: V min: 48 V max: 85 Hz, H min: 30 H max: 94 kHz, PixClock max 170 MHz
这些信息称做 EDID 信息。 从中建立
ModeLine 只是把这些数据重新排列顺序而已:
ModeLine <name> <clock> <4 horiz. timings> <4 vert. timings>
如此, 本例中的 Section "Monitor" 中的 ModeLine
应类似下面的形式:
Section "Monitor"
Identifier "Monitor1"
VendorName "Bigname"
ModelName "BestModel"
ModeLine "1680x1050" 146.2 1680 1784 1960 2240 1050 1053 1059 1089
Option "DPMS"
EndSection
经过简单的编辑步骤之后, X 就可以在您的宽屏显示器上启动了。
Murray
Stokely
供稿
在 X11 中使用字体
Type1 字体
X11 使用的默认字体不是很理想。
大型的字体显得参差不齐,看起来很不专业, 并且, 在
&netscape; 中, 小字体简直无法看清。
有好几种免费、 高质量的字体可以很方便地用在 X11 中。 例如,URW字体集合
(x11-fonts/urwfonts ) 就包括了高质量的
标准 type1 字体 (Times Roman ,
Helvetica 、 Palatino 和其他一些)。 在 Freefont 集合中
(x11-fonts/freefonts ) 也包括更多的字体,
但它们中的绝大部分使用在图形软件中,如
Gimp ,在屏幕字体中使用并不完美。另外,
只要花很少的功夫,可以将
&xfree86; 配置成能使用
&truetype; 字体:请参见后面的
&truetype; 字体一节。
要安装上面的Type1字体,您只需要运行下面的命令:
&prompt.root; cd /usr/ports/x11-fonts/urwfonts
&prompt.root; make install clean
freefont 或其他的字库和上面所说的大体类似。 为了让 X
服务器能够检测到这些字体, 需要在
X 服务器的配置文件 (/etc/X11/xorg.conf )
中增加下面的配置:
FontPath "/usr/X11R6/lib/X11/fonts/URW/"
或者,也可以在命令行运行:
&prompt.user; xset fp+ /usr/X11R6/lib/X11/fonts/URW
&prompt.user; xset fp rehash
这样会起作用,但是当 X 会话结束后就会丢失,
除非它被添加到启动文件 (~/.xinitrc 中,
针对一个寻常的 startx 会话,或者当您通过一个类似
XDM 的图形登录管理器登录时添加到
~/.xsession 中)。
第三种方法是使用新的
/usr/X11R6/etc/fonts/local.conf 文件: 查看
anti-aliasing 章节。
&truetype; 字体
TrueType 字体
fonts (字体)
TrueType
&xorg; 已经内建了对
&truetype; 字体的支持。有两个不同的模块能够启用这个功能。
在这个例子中使用 freetype 这个模块,因为它与其他的字体描绘后端
是兼容的。要启用 freetype 模块,只需要将下面这行添加到
/etc/X11/xorg.conf 文件的
"Module" 部分。
Load "freetype"
现在,为 &truetype; 字体创建一个目录 (比如,
/usr/X11R6/lib/X11/fonts/TrueType )
然后把所有的 &truetype; 字体复制到这个目录。记住您不能直接从
&macintosh; 计算机中提取 &truetype; 字体;
能被 X11 使用的必须是
&unix;/&ms-dos;/&windows; 格式的。
一旦您已经将这些文件复制到了这个目录, 就可以用
ttmkfdir 来创建
fonts.dir 文件,
以便让X字体引擎知道您已经安装了这些新文件。
ttmkfdir 可以在 FreeBSD
Ports Collection
x11-fonts/ttmkfdir 中找到。
&prompt.root; cd /usr/X11R6/lib/X11/fonts/TrueType
-&prompt.root; ttmkfdir > fonts.dir
+&prompt.root; ttmkfdir -o fonts.dir
现在把 &truetype; 字体目录添加到字体路径中。
这和上面 Type1 字体的步骤是一样的,
那就是,使用
&prompt.user; xset fp+ /usr/X11R6/lib/X11/fonts/TrueType
&prompt.user; xset fp rehash
或者把 FontPath 这行加到
xorg.conf 文件中。
就是这样。现在 &netscape; ,
Gimp ,
&staroffice; 和其他所有的 X 应用程序
应该可以认出安装的 &truetype;
字体。一些很小的字体(如在 Web 页面上高分辨率显示的文本)
和一些很大的字体(在
&staroffice; 下) 现在看起来已经很好了。
Joe Marcus
Clarke
Updated by
Anti-Aliased 字体
anti-aliased fonts
fonts
anti-aliased
X11 从 &xfree86; 4.0.2 开始支持字体的反走样。
但是, 字体配置在
&xfree86; 4.3.0 之前是非常繁琐的。
从 &xfree86; 4.3.0 开始,
对于所有支持 Xft 的应用程序, 所有放到 X11
/usr/X11R6/lib/X11/fonts/ 和
~/.fonts/ 中的字体都自动地被加入反走样支持。
并不是所有的应用程序都支持 Xft, 但已经有相当多的程序提供 Xft 支持了。
支持 Xft 的应用程序包括 Qt 2.3 以及更高版本
(用以开发 KDE 桌面的工具包)、
GTK+ 2.0 和更高版本 (用于开发
GNOME 桌面的工具包), 以及
Mozilla 1.2 和更高版本。
要控制哪些字体是 anti-aliased,或者配置 anti-aliased 特性,
创建(或者编辑,如果文件已经存在的话)文件
/usr/X11R6/etc/fonts/local.conf 。Xft 字体系统的几个
高级特性都可以使用这个文件来调节;
这一部分只描述几种最简单的情况。要了解更多的细节,请查看
&man.fonts-conf.5;.
XML
这个文件一定是 XML 格式的。注意确保所有的标签都完全的关闭掉。
这个文件以一个很普通的 XML 头开始, 后跟一个 DOCTYPE 定义,
接下来是 <fontconfig> 标签:
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
像前面所做的那样,在
/usr/X11R6/lib/X11/fonts/ 和
~/.fonts/ 目录下的所有字体已经可以被支持 Xft 的
应用程序使用了。如果您想添加这两个目录以外的其他路径,
简单的添加下面这行到
/usr/X11R6/etc/fonts/local.conf 文件中:
<dir>/path/to/my/fonts</dir>
添加了新的字体,尤其是添加了新的字体目录后,
您应该运行下面的命令重建字体缓存:
&prompt.root; fc-cache -f
Anti-aliasing 会让字体边缘有些模糊,这样增加了非常小的文本的可读性,
并从大文本字体中删除 锯齿
。
但如果使用普通的文本, 则可能引起眼疲劳。
要禁止 14磅 以下字体的反走样, 需要增加如下配置:
<match target="font">
<test name="size" compare="less">
<double>14</double>
</test>
<edit name="antialias" mode="assign">
<bool>false</bool>
</edit>
</match>
<match target="font">
<test name="pixelsize" compare="less" qual="any">
<double>14</double>
</test>
<edit mode="assign" name="antialias">
<bool>false</bool>
</edit>
</match>
fonts
spacing
用 anti-aliasing 来间隔一些等宽字体也是不适当的。
这似乎是 KDE 的一个问题。
要修复这个问题需要确保每个字体之间的间距保持在100。
加入下面这些行:
<match target="pattern" name="family">
<test qual="any" name="family">
<string>fixed</string>
</test>
<edit name="family" mode="assign">
<string>mono</string>
</edit>
</match>
<match target="pattern" name="family">
<test qual="any" name="family">
<string>console</string>
</test>
<edit name="family" mode="assign">
<string>mono</string>
</edit>
</match>
(这里把其他普通的修复的字体作为
"mono" ),然后加入:
<match target="pattern" name="family">
<test qual="any" name="family">
<string>mono</string>
</test>
<edit name="spacing" mode="assign">
<int>100</int>
</edit>
</match>
某些字体,比如 Helvetica,当 anti-aliased 的时候可能存在问题。
通常的表现为字体本身似乎被垂直的切成两半。
糟糕的时候,还可能导致应用程序比如
Mozilla 崩溃。
为了避免这样的现象,考虑添加下面几行到
local.conf 文件里面:
<match target="pattern" name="family">
<test qual="any" name="family">
<string>Helvetica</string>
</test>
<edit name="family" mode="assign">
<string>sans-serif</string>
</edit>
</match>
一旦您完成对
local.conf 文件的编辑,确保您使用了
</fontconfig> 标签来结束文件。
不这样做将会导致您的更改被忽略。
X11 默认的字库当使用反走样时会比较难看。
更好的字库可以在
x11-fonts/bitstream-vera
port 中找到。 这个 port 会创建一个
/usr/X11R6/etc/fonts/local.conf 文件,
如果这个文件不存在的话。 反之,
port 将创建 /usr/X11R6/etc/fonts/local.conf-vera
文件。 将其内容合并到
/usr/X11R6/etc/fonts/local.conf 中,
则 Bitstream 字体将自动地代替默认的
X11 Serif, Sans Serif, 以及单倍距字体。
最后,用户可以通过他们个人的
.fonts.conf 文件来添加自己的设定。
要完成此项工作, 用户只需简单地创建
~/.fonts.conf 并添加相关配置。
此文件也必须是 XML 格式的。
LCD screen
Fonts
LCD screen
最后:对于LCD屏幕, 可能希望使用子像素的取样。 简单而言,
这是通过分别控制 (水平方向分开的) 红、绿、蓝 像素,
来改善水平分辨率; 这样做的效果一般会非常明显。
要启用它, 只需在
local.conf 文件的某个地方加入:
<match target="font">
<test qual="all" name="rgba">
<const>unknown</const>
</test>
<edit name="rgba" mode="assign">
<const>rgb</const>
</edit>
</match>
随您显示器的种类不同, 可能需要把
rgb 改为 bgr 、
vrgb 或 vbgr :
试验一下看看那个更好。
Mozilla
disabling anti-aliased fonts (禁用反锯齿字体)
在下次启动 X server 时, 反锯齿 (anti-aliasing) 功能就启用了。
不过, 应用程序必须了解如何使用它, 才能因此而受益。
目前 Qt 工具包已经对其提供了全面支持,
因此整个 KDE 环境都能使用反锯齿字体。
GTK+ 和
GNOME 也可以通过 Font
capplet
来使用反锯齿功能 (进一步细节请参见 )。 默认情况下,
Mozilla 1.2 及更高版本有能力自动使用反锯齿。
要禁用这一特性, 则需要使用指定 -DWITHOUT_XFT
并重新联编
Mozilla 。
Seth
Kingsley
Contributed by
X 显示管理器
概要
X Display Manager
X 显示管理器(XDM )
是一个X视窗系统用于进行登录会话管理的可选项。
这个可以应用于多种情况下,包括小
X Terminals
,
桌面,大网络显示服务器。既然 X 视窗系统不受网络和协议的限制,
那对于通过网络连接起来的运行 X 客户端和服务器端的不同机器,
就会有很多的可配置项。
XDM
提供了一个选择要连接到哪个显示服务器的图形接口,
只要键入如登录用户名和密码这样的验证信息。
您也可以把 XDM 想象成与
&man.getty.8 工具一样(see for
details)。为用户提供了同样功能。它可以完成系统的登录任务,
然后为用户运行一个会话管理器
(通常是一个 X 视窗管理器)。接下来 XDM
就等待这个程序退出,发出信号用户已经登录完成,应当退出屏幕。
这时,
XDM
就可以为下一个登录用户显示登录和可选择屏幕。
使用 XDM
XDM 精灵程序在
/usr/X11R6/bin/xdm 中。您可以在任何时候
用 root 来运行这个程序,
在本地机器上,它将启动管理X的画面。如果要
XDM 每次机器一启动就开始运行,
一个简单的办法是在 /etc/ttys 中加入一个记录。
有关这个文件的更多的格式和使用方法,可以看看 。在默认的
/etc/ttys 文件中用于运行
XDM 守护程序的一行是这样的:
ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure
默认情况下,这个记录是关闭的,要启用它,
您需要把第5部分的 off 改为
on 然后按照 的指导
重新启动 &man.init.8;。第一部分,这个程序将管理的终端名称是
ttyv8 。这意味着
XDM 将运行在第9个虚拟终端上。
配置 XDM
XDM 的配置目录是在
/usr/X11R6/lib/X11/xdm 中。在这个目录中,
您会看到几个用来改变
XDM 行为和外观的文件。您会找到这些文件:
文件
描述
Xaccess
客户端授权规则。
Xresources
默认的X资源值。
Xservers
远程和本地显示管理列表。
Xsession
用于登录的默认的会话脚本。
Xsetup_ *
登录之前用于加载应用程序的脚本。
xdm-config
运行在这台机器上的所有显示的全局配置。
xdm-errors
服务器程序产生的错误。
xdm-pid
当前运行的 XDM 的进程 ID。
当 XDM 运行时,
在这个目录中有几个脚本和程序可以用来设置桌面。
这些文件中的每一个的用法都将被简要地描述。
这些文件的更详细的语法和用法在
&man.xdm.1; 中将有详细描述。
默认的配置是一个矩形的登录窗口,上面有机器的名称,
Login:
和
Password:
。如果您想设计您自己个性化的
XDM 屏幕,这是一个很好的起点。
Xaccess
用以连接由
XDM 所控制的显示设备的协议,
叫做 X 显示管理器连接协议 (XDMCP)。
这个文件是一组用以控制来自远程计算机的 XDMCP 连接的规则。
除非您修改 xdm-config
使其接受远程连接, 否则其内容将被忽略。 默认情况下,
它不允许来自任何客户端的连接。
Xresources
这是一个默认的用来显示选项和登录屏幕的应用程序文件。这
就是您能够定制登录程序的外观的地方。这个格式与
X11 文档中描述的默认应用
程序文件是一样的。
Xservers
这是一个选择者应当提供的作为可选的远程显示列表。
Xsession
这是一个用户登录后针对
XDM 的默认会话脚本。通常,在
~/.xsession
中每个用户将有一个可定制的会话脚本。
Xsetup_*
在显示选择者或登录接口之前,这些将被自动运行。
这是一个每个显示都要用到的脚本,叫做
Xsetup_ ,
后面会跟一个本地显示的数字(比如
Xsetup_0 )。典型的,这些脚本将在后台
(如 xconsole )运行一个或两个程序。
xdm-config
此文件以应用程序默认值的形式,
提供了在安装时所使用的普适的显示设置。
xdm-errors
这个文件包含了
XDM 正设法运行的的 X 服务器 的输出。
如果 XDM 正设法运行的显示由于某种原因被挂起,
那这是一个寻找错误信息的好地方。
这些信息会在每一个会话的基础上被写到用户的
~/.xsession-errors
文件中。
运行一个网络显示服务器
对于其他客户端来说,为了连接到显示服务器,您将必须编辑访问控制规则,
然后启用连接侦听。默认的这些被设置成比较保守的值。
要让XDM 能侦听连接,先要在
xdm-config
文件中注释掉一行:
! SECURITY: do not listen for XDMCP or Chooser requests ! Comment out this line if you want to manage X terminals with xdm
DisplayManager.requestPort: 0
然后重新启动XDM 。
记住默认应用程序文件的注释以!
字母开始,不是#
。
您需要设置严格的访问控制。看看在
Xaccess 文件中的实例记录,可以参考
&man.xdm.1; 的联机手册。
替换 XDM
有几个替换默认
XDM 程序的方案。 其中之一是
上一节已经描述过的kdm (与
KDE 捆绑在一起)。
kdm 提供了许多视觉上的改进和局部的修饰,
同样能让用户在启动时能选择他们喜欢的窗口管理器。
Valentino
Vaschetto
Contributed by
桌面环境
这节描述了 FreeBSD 上用于 X 的不同桌面环境。
桌面环境
可能仅仅是一个简单的窗口管理器,
也可能是一个像
KDE 或者 GNOME 这样的完整桌面应用程序套件。
GNOME
有关 GNOME
GNOME
GNOME 是一个用户界面友好的桌面环境,
能够使用户很容易地使用和配置他们的计算机。
GNOME
包括一个面板(用来启动应用程序和显示状态),
一个桌面(存放数据和应用程序的地方),
一套标准的桌面工具和应用程序,
和一套与其他人相互协同工作的协议集。
其他操作系统的用户在使用
GNOME 提供的强大的图形驱动环境时会觉得很好。
更多的关于 FreeBSD 上 GNOME 的信息
可以在 FreeBSD GNOME
Project 的网站上找到。 此外,
这个网站也提供了相当详尽的关于安装、 配置和管理
GNOME 的常见问题解答 (FAQ)。
安装 GNOME
安装
GNOME 的最简单的方法是
第 2 章描述的在FreeBSD安装过程中通过
Desktop Configuration
菜单来进行。
它们也可以很容易地从一个package或Ports Collection安装:
要从网络安装GNOME ,
只要键入:
&prompt.root; pkg_add -r gnome2
从源代码编译GNOME ,可以使用
ports树:
&prompt.root; cd /usr/ports/x11/gnome2
&prompt.root; make install clean
一旦装好了 GNOME ,
就必须告诉 X server 启动
GNOME 而不是默认的窗口管理器。
最简单的启动
GNOME 的方法是使用
GDM , GNOME 显示管理器。
随 GNOME 桌面一同安装的
GDM (但默认是禁用的), 可以通过在
/etc/rc.conf 中加入
gdm_enable="YES" 来启用。 这样在重新启动的时候,
GNOME 就会在登录时自动启动 —
除此之外不需要进一步设置了。
GNOME 也可以通过适当地配置名为
.xinitrc 的文件来启动。
如果已经有了自定义的 .xinitrc ,
将启动当前窗口管理器的那一行改为启动
/usr/X11R6/bin/gnome-session 就可以了。
如果还没有, 那么只需简单地:
&prompt.user; echo "/usr/X11R6/bin/gnome-session" > ~/.xinitrc
接下来输入 startx ,
GNOME 桌面环境就启动了。
如果之前使用了一些旧式的显示管理器, 例如
XDM , 则这样做是没用的。
此时应建立一个可执行的 .xsession
文件, 其中包含同样的命令。 要完成这项工作, 需要用
/usr/X11R6/bin/gnome-session
取代现有的窗口管理器:
&prompt.user; echo "#!/bin/sh" > ~/.xsession
&prompt.user; echo "/usr/X11R6/bin/gnome-session" >> ~/.xsession
&prompt.user; chmod +x ~/.xsession
还有一种做法, 是配置显示管理器,
以便在登录时提示您选择窗口管理器; 在
KDE 细节
环节中介绍了关于如何为 kdm
(KDE 的显示管理器)进行这样的配置。
在GNOME上使用Anti-aliased字体
GNOME
anti-aliased fonts
X11 通过RENDER
扩展来支持 anti-aliasing。
GTK+ 2.0 以及更高的版本(被
GNOME 使用的工具包)可以使用这个功能。
配置 anti-aliasing 在
描述。所以,使用最近的软件,
anti-aliasing 可以应用在
GNOME 桌面环境中。只需要依次选择
应用程序
桌面首选项
字体 ,然后选上
最佳形状 ,
最佳对比度 ,或者
像素圆滑(LCD) 。对于
GTK+ 应用程序,它们不是
GNOME 桌面的一部分,在启动程序前需要设置
环境变量GDK_USE_XFT 的值为
1 。
KDE
KDE
有关 KDE
KDE 是一个容易使用的现代桌面环境。
KDE 有很多很好的特性:
一个美丽的现代的桌面。
一个集合了完美网络环境的桌面。
一个集成的帮助系统,能够方便、高效地帮助您使用
KDE 桌面和它的应用程序。
所有的KDE 应用程序具有一致的所见即所得界面。
标准的菜单和工具栏,键盘布局,颜色配置等。
国际化:KDE
可以使用超过40种语言。
集中的一致化的桌面驱动配置。
许多有用的
KDE 应用程序。
KDE 附带了一个名为
Konqueror 的 web 浏览器,
它是其他运行于 &unix; 系统上的 web 浏览器的一个强大的竞争对手。
要了解关于 KDE
的更多详情, 可以访问 KDE
网站 。 与 FreeBSD 相关的 KDE
信息和资源, 可以在 FreeBSD-KDE
团队 的网站找到。
安装 KDE
与 GNOME 或其他桌面环境一样,安装
KDE 的最容易的方法是通过
第 2 章所描绘的 FreeBSD 安装过程的
Desktop Configuration
菜单来安装。
另外,它也可以很容易地从packages或Ports Collection安装:
要从网络安装 KDE 只需要:
&prompt.root; pkg_add -r kde
&man.pkg.add.1; 就会自动的下载最新版本的应用程序。
要从源代码编译 KDE ,
可以使用 ports 树:
&prompt.root; cd /usr/ports/x11/kde3
&prompt.root; make install clean
KDE 安装完成后,
X server必须被告知启动这个应用程序以代替默认的窗口管理器。
这可以通过编辑 .xinitrc 文件来完成:
&prompt.user; echo "exec startkde" > ~/.xinitrc
现在,无论您什么时候用
startx 进入 X 视窗系统,
KDE 就将成为您的桌面环境。
如果使用一个像
XDM 这样的显示管理器,
那配置文件可能有点不同。需要编辑一个
.xsession 文件,有关
kdm 的用法会在这章的后面介绍。
有关 KDE 的更多细节
现在 KDE 已经被安装在系统中了。
通过帮助页面或点击多个菜单可以发现很多东西。
&windows; 或 &mac; 用户会有回到家的感觉。
有关 KDE 的最好的参考资料是
它的在线文档。KDE
拥有它自己的 web 浏览器
Konqueror ,
还有很多其他的应用程序和丰富文档。
这节的余下部分将讨论一些很难用走马观花的方法来学习的技术项目。
KDE 显示管理器
KDE
display manager
如果在同一系统上有多个用户, 则管理员通常会希望使用图形化的登录界面。
前面已经提到, 使用
XDM 可以完成这项工作。 不过,
KDE 本身也提供了另一个选择,
即 kdm , 它的外观更富吸引力,
而且提供了更多的登录选项。 值得一提的是,
用户还能通过菜单很容易地选择希望使用的桌面环境 (KDE 、
GNOME 或其它)。
要启用 kdm , 需要修改
/etc/ttys 中的 ttyv8 项。
将其改为类似下面的样子:
ttyv8 "/usr/local/bin/kdm -nodaemon" xterm on secure
XFce
有关XFce
XFce 是以被GNOME
使用的 GTK+ 工具包为基础的桌面环境,
但是更加轻巧,适合于那些需要一个易于使用和配置并且简单而高效的桌面的人。
看起来,它非常像使用在商业&unix;系统上的
CDE 环境。
XFce 的主要特性有下面这些:
一个简单,易于使用的桌面。
完全通过鼠标的拖动和按键来控制等。
与CDE
相似的主面板,菜单,applets和应用launchers。
集成的窗口管理器,文件管理器,声音管理器,
GNOME 应用模块,和其他一些。
可配置界面的主题。(因为它使用GTK+)
快速,轻便,高效:对于比较老的/旧的机器或带有很少内存的机器仍然很理想。
更多有关XFce
的信息可以参考XFce
网站 。
安装XFce
有一个二进制的XFce
软件包存在(在写作的时候)。要安装的话,执行下面的命令:
&prompt.root; pkg_add -r xfce4
另外,要从源代码建立,使用Ports Collection:
&prompt.root; cd /usr/ports/x11-wm/xfce4
&prompt.root; make install clean
现在,要告诉X服务器在下次X启动时执行
XFce 。
只要执行下面的命令:
&prompt.user; echo "/usr/X11R6/bin/startxfce4" > ~/.xinitrc
接下来就是启动 X,
XFce 将成为您的桌面。
与以前一样,如果使用像
XDM 这样的显示管理器,需要创建一个
.xsession 文件,就像有关
GNOME 的那节描述的,
使用/usr/X11R6/bin/startxfce4
命令,或者,配置显示管理器允许在启动时选择一个桌面,
就像有关 kdm的那节描述的。
diff --git a/zh_CN.GB2312/books/porters-handbook/book.sgml b/zh_CN.GB2312/books/porters-handbook/book.sgml
index 41c5fecaef..fcf815ebbb 100644
--- a/zh_CN.GB2312/books/porters-handbook/book.sgml
+++ b/zh_CN.GB2312/books/porters-handbook/book.sgml
@@ -1,10905 +1,10983 @@
%books.ent;
]>
FreeBSD Porter 手册
The FreeBSD Documentation Project
2000 年 4 月
2000
2001
2002
2003
2004
2005
2006
The FreeBSD Documentation
Project
&cnproj.freebsd.org;
2005 年 11 月
2005
2006
&cnproj.freebsd.org;
&bookinfo.trademarks;
&bookinfo.legalnotice;
介绍
几乎每个人都是通过 FreeBSD Ports Collection
在 FreeBSD 上面装应用程序 (“ports”)的。
就像FreeBSD的其它部分一样, 它主要来自于志愿者的努力。
所以在阅读这份文档的时候请务必记住这些。
在 FreeBSD 的世界里, 任何人都能提交新的 port,
或志愿地维护一个已有的 port, 如果那个 port 没人维护的话 —
不需要任何特殊的权限来做这件事情。
自行制作 port
那么, 您有兴趣创建自己的 port 或升级现有的 port?
太好了。
下面的内容将会提供一些创建FreeBSD port的指导。
如果想升级一个现有的 port, 那么您应该在看完这些内容并阅读
。
因为这份文档不是十分详细, 您还应该再参考一下
/usr/ports/Mk/bsd.port.mk , 所有 port
的 Makefile 文件都会包含它。 即使不是每天都去摆弄 Makefile,
您也会从那个文件里面获得很多知识, 里面的注释非常详细。
还有要补充一下,如果您有其它的问题, 可以给&a.ports;
这个 mailing list 发信。
在这份文档里提到的大部分的变量
(VAR )
是不能修改的。 大多 (但不是全部) 都在
/usr/ports/Mk/bsd.port.mk
的开始部分进行了介绍; 其它一些也应该可以在那里找到。
注意这些文件使用了非标准的制表符:
Emacs 和
Vim 应该能在打开文件的时候自动识别它,
而 &man.vi.1; 和 &man.ex.1 则需要在打开文件的时候通过
:set tabstop=4 来修正默认的设置。
简单的 port
这一章主要介绍如何快速创建一个简单的 port。
很多时候, 这点内容是不够的, 您需要阅读这份文档中更深入的内容。
首先, 需要取得包含源代码的 tar包, 并把它放到
DISTDIR 变量所指的地方。 默认的情况下, 这应该是
/usr/ports/distfiles 。
下面的内容假定您不需要修改软件的源代码就能在 FreeBSD
上编译通过。 如果需要修改代码, 就需要参考下一章的内容了。
编写 Makefile
最简单的 Makefile
应该是这个样子的:
# New ports collection makefile for: oneko
# Date created: 5 December 1994
# Whom: asami
#
# $FreeBSD$
#
PORTNAME= oneko
PORTVERSION= 1.1b
CATEGORIES= games
MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
MAINTAINER= asami@FreeBSD.org
COMMENT= A cat chasing a mouse all over the screen
MAN1= oneko.1
MANCOMPRESSED= yes
USE_IMAKE= yes
.include <bsd.port.mk>
看看您是否能够看懂。 不必担心
$FreeBSD$
那一行, 当这个 port 被导入到 ports 树里的时候,
CVS 会自动填写它。 您可以在
示范的 Makefile那章找到更多的细节。
创建描述文件
有 2 个描述文件对于任何一个 port 来说是必须的,
不论它是不是打算成为 package。 它们是
pkg-descr 和
pkg-plist 。 这两个文件使用 pkg-
前缀以区别于其它文件。
pkg-descr (关于 port 的冗长描述文件)
这是 port 里一个较长的描述文件。
使用一段或几段文件文字来简明的描述这个 ports 是用来做什么的。
这 不是 手册或者对如何
深入使用/编译这个port的说明! 要是您从
README 或者联机手册里面中复制文字的话,
请务必小心 ; 通常, 它们不是对这个 port
简明扼要的描述, 或者用了难以使用的格式 (比如,
联机手册里有迫使两端对齐的空格)。
如果要移植的软件有官方的WWW网页, 您应该在这里列出来。
使用 WWW: 作为前缀来表示
一个 网站,
这样其它的自动工具就能正常工作了。
下面是一个简单的
pkg-descr 例子:
This is a port of oneko, in which a cat chases a poor mouse all over
the screen.
:
(etc.)
WWW: http://www.oneko.org/
pkg-plist (port 的装箱单)
这份文件列出了 port 所要安装的所有文件。 由于 package
也是据此进行打包, 因此它也被称作 装箱单(packing list)
.
这个文件中, 路径是相对于安装的路径的 (通常是
/usr/local 或
/usr/X11R6 )。 如果您使用
MANn
变量的话, 请不要在这里列出任何联机手册。 假如 port
在安装过程中会创建一些目录, 请务必增加对应的
@dirrm 行,
以便在 package 被卸载时予以自动删除。
下面是一个简单的例子:
bin/oneko
lib/X11/app-defaults/Oneko
lib/X11/oneko/cat1.xpm
lib/X11/oneko/cat2.xpm
lib/X11/oneko/mouse.xpm
@dirrm lib/X11/oneko
参考 &man.pkg.create.1; 的联机手册以获得更多有关装箱单的细节
建议您将这个文件里的所有的文件名按字母排序。
这样, 在升级这个port的时候就能够更方便地核实所做的修改。
手工创建这样一份列表可能是一件非常枯燥的事情。
如果您的 port 需要安装大量的文件, 自动创建装箱单
会帮您省下不少时间。
只有一种情况可以不用 pkg-plist 文件。
如果这个 port 只安装很少量的一些文件或目录的话,
这些文件和目录就可以分别列在 Makefile 的
PLIST_FILES 和PLIST_DIRS
变量里。 举个例子来说, 我们可以在上面那个
oneko port 里面不用
pkg-plist , 而把下面的这几行加到
Makefile 里面:
PLIST_FILES= bin/oneko \
lib/X11/app-defaults/Oneko \
lib/X11/oneko/cat1.xpm \
lib/X11/oneko/cat2.xpm \
lib/X11/oneko/mouse.xpm
PLIST_DIRS= lib/X11/oneko
当然, 如果一个 port 不需要给它自己创建目录的话,
就不用设置 PLIST_DIRS 变量了。
不过, 如果用这种方式来列出 port 要安装的文件和目录的话,
也就无法利用在 &man.pkg.create.1; 里介绍的命令来制作 package 了。
因此, 这种方法只适用于那些简单的 port, 使它们更为简化。 同时,
这种做法也有助于减少 ports collection 中的文件数量。
在采用 pkg-plist 之前,
请考虑一下使用这种方法。
稍后我们将看到 pkg-plist
以及 PLIST_FILES 如何处理
更复杂的任务。
创建校验和文件
只要键入 make makesum ,
port 便会自动创建 distinfo 文件。
如果下载的文件的校验和经常变化,
而您又能确保它们的来源可靠 (比如, 来自于CD制造商,
或每天构建生成的文档文件), 就应该在 IGNOREFILES
里面标明这些文件。 这样, 再运行
make makesum 的时候便不会把这些标记
IGNORE 的文件计算在内了。
测试 port
应当确定您的 port 确实做了您希望它们做的事情,
包括打包。下面是需要重点检查的一些重要的工作。
pkg-plist 中没有包括任何不想安装的文件
pkg-plist 包含了所有应该安装的文件
您的 port 能够使用 reinstall
多次安装。
您的 port 能在卸载 (deinstall) 时,
自动完成 清理
推荐的测试顺序
make install
make package
make deinstall
pkg_add package-name
make deinstall
make reinstall
make package
确信在 package 和
deinstall 阶段没有任何警告。
第三步以后, 检查是否所有新建的目录都被正确删除了。
在第四步以后, 试着运行一下所装的软件,
确保当它以 package 方式安装的时候也能正常工作。
用 portlint 来检查 port
请使用 portlint 命令来检查您的 port
是否符合我们的规范。 devel/portlint
程序是 ports 套件的一部分。
这个程序的主要功能是帮助您检查
Makefile 的样式是否符合规范,
以及 package 的命名是否得体。
提交 port
首先, 确信您已经阅读了
该做什么和不该做什么 一节。
既然已经对所制作的 port 相当满意了, 剩下的工作,
便是将它放进 FreeBSD 的主 ports 树, 以便让更多的人从中受益。
我们并不需要您的 work
目录以及 pkgname.tgz 包, 因此现在可以删除它们了。
接下来, 只要把 shar `find
port_dir` 的输出写到一份 bug 报告中, 并用
&man.send-pr.1; 程序 (参见 Bug
Reports and General Commentary 以了解关于
&man.send-pr.1; 的进一步详情) 将其送出。 请务必将您的 bug 报告分类 (category) 为
ports 并把子分类 (class) 设置为
change-request (不要把报告表及为机密的, 即
confidential !)。 此外,
在 PR 的描述 (Description
) 一栏中,
应该填写您所移植的应用程序的简单介绍, 而 shar
则应放到修正 (Fix
) 栏中。
在问题报告里面使用了一段好的描述,
能使我们的工作变得更容易。 我们更倾向于这样的描述:
用 New port: <category>/<portname>
<short description of the port>
来说明这是一个新的 port, 而用
Update port: <category>/<portname>
<short description of the update>
来说明这是对一个已有的 port 的升级。 如果您坚持使用这样的方案,
那么我们将更容易更方便地阅读您的 PR。
再次声明, 不要包含原始的distfile,
work 目录, 或者您用
make package 制作的包 。
在您提交的您的 port 以后请耐心等待。
有时在一个 port 正式加入 FreeBSD 之前需要花费好几个月,
尽管也有可能是几天。 您可以查看
正等待被 commit 到 FreeBSD 的 port 。
一旦我们看过了您的报告, 有必要的话我们会联系您,
并把它放到 ports 树里。 您的名字也会出现在
Additional FreeBSD Contributors
和其它的文件。 不是很棒吗!?
:-)
复杂的 Porting
好了, 也许工作没那么简单, port 需要做些修改才能够在
FreeBSD 上跑起来。 在这一章里,
我们将会一步步举例来介绍应该如何修改来使您的
port 能在 FreeBSD 上面运行。
整个系统是如何运转的?
首先, 这一系列的动作是由用户在您的
port 目录里敲入 make 后发生的。
您也许会发现在另外的一个窗口里阅读一下
bsd.port.mk 将会有助于您的理解。
要是您不是非常明白 bsd.port.mk
是做什么的话, 也不用太担心, 很多人都不知道的...
:->
fetch 会首先被执行。
fetch 将检查在本地的
DISTDIR 目录里是否存在
tar 包。 如果 fetch
没有找到就会查找 Makefile 中定义的
MASTER_SITES URL, 还有我们的主
FTP 站点 ,
在那里我们备份了所有被认可的 distfile。 假设那个
MASTER_SITES 站点是直接连在 Internet 上的,
就会试着用 FETCH 指定的程序取回
distfile。 如果成功的话, 文件会被保存在DISTDIR
所指定的目录以备稍后使用。
接下来会执行 extract 。
它会在 DISTDIR 中寻找您的
tar 包 (通常是用 gzip 压缩的 tar 包),然后解压缩到由
WRKDIR 所指定的临时目录里
(默认为work 目录)。
下一步是执行 patch 。
首先任何在 PATCHFILES 中定义的补丁都会被打上。
然后, 在由 PATCHDIR 指定的目录
(默认为 files 目录)
中发现的patch-* ,
它们将会以文件名的字母顺序被先后打上。
configure 会被执行。
这一步骤可能会有以下几种情形。
如果存在 scripts/configure ,
就会执行它
如果定义了 HAS_CONFIGURE
或者 GNU_CONFIGURE , 就会执行
WRKSRC /configure 。
如果定义了USE_IMAGE , 就会执行
XMKMF (默认为: xmkmf
-a )。
build 会被执行。
这一步将会进入ports的工作目录
(WRKSRC )
然后进行编译。如果定义了USE_GMAKE ,
就会使用 GNU make , 反之,
则会使用系统默认的 make 。
以上都是系统默认的步骤。 您也可以定义
pre-something 或者
post-something ,
或者把以此命名的脚本放到
scripts 目录,
它们会在默认的动作之前或之后被执行。
举个例子, 如果您在您的 Makefile
里定义了post-extract , 并在
script 目录里放了一个
pre-build 脚本,
那么在 tar 包解开之后
post-extract 将被调用,
pre-build 脚本会在默认的编译之前被执行。
我们推荐您在 Makefile
定义所有的动作, 如果不是十分复杂的话,
这样, 别人能更容易明白您的 port
需要执行哪些非默认的动作。
默认的行为都是由 bsd.port.mk 定义的
do-something
来表示的。 例如, port 中用来解压缩的命令是由
do-extract 来定义的。
如果您对默认的设置不满意, 可以通过在
Makefile 重新定义
do-someting
来做些改变。
主
动作 (例如
extract 、
configure , 等等)
仅仅是用来确定所有相应的阶段都完成了,
以及调用真实的动作或脚本, 它们不应被修改。
如果您想要修改解压缩这个动作,
可以修改 do-extract ,
但永远都不要改变 extract
的操作!
我们已经介绍了在用户敲入 make
之后会发生哪些事情了。 接下来我们将进行进一步的学习,
来看一看如何创建一个理想的 port。
获取源代码
获取源代码的 tar 包 (通常是
foo .tar.gz 或者
foo .tar.Z ) 并把它们放进
DISTDIR 。 最好使用 主流 的版本。
您需要设置变量 MASTER_SITES
来指向原始 tar 包的获取位置。 您可以在
bsd.sites.mk
里找到一些速度较快的主流站点。 请使用这些站点 —
和相关的定义 — 如果可能的话,
应尽量避免在同一个源代码树里出现大量重复的信息。
这些站点会随着时间而变化,
如果每个人都随意加入的话会使维护变得非常困难。
如果您找不到一个有很好网络连接的
FTP/HTTP 站点, 或者它们使用了非标准的格式,
您也许就会想在您自己的 FTP 或 HTTP
服务器上放上一份副本。
如果您找不到可靠的地方放置 distfiles,
我们也可以提供给您一些空间来保存它。
我们自己的 ftp.FreeBSD.org ;
然而这只是一个折衷的办法。 distfile 必须放进某人在
freefall 上的
~/public_distfiles/
目录中。 可以要求帮助您 commit port 的人来放这个
distfile, 而这个人也需要把 MASTER_SITES 、
MASTER_SITE_LOCAL 以及
MASTER_SITE_SUBDIR 的设置,
改为在 freefall 上的用户名。
如果您的 port 的 distfile 一直在变化,
而作者拒绝改变其版本号, 您可以考虑把 distfiles
放在自己的主页, 并在 MASTER_SITES
里把原作者的列为首选位置。 如果可能, 试着与 port
的作者沟通一下让他不要这么做, 这将有助于建立对源代码的控制。
在您的主页上放置您自己的 distfile 会避免用户得到
checksum mismatch
的错误, 而且能减轻我们 FTP 站点维护人员的工作量。
如果您的port只有一个主站点的话, 我们建议您在自己的网站上做一份备份,
并他列为 MASTER_SITES 的第2项。
如果您的 port 需要来自网络上的一些补丁, 请把它们放到
DISTDIR 里。 不用担心它们跟源代码不是来自同一站点。
我们有办法处理 (参阅下面的
补丁文件)。
修改 port
解开 tar 包, 对源代码做出合理的修改使得这个 port
能在最新版本的 FreeBSD 上面运行。
一定要 仔细记录 您所做的每处改动,
包括删除、添加、修改的文件等等, 这些修改以后会在您的 port
中以脚本或补丁的方式出现, 并且能通过运行它们来自动完成您对
port 的改动要求。
如果您的 port 要求用与用户交互/配置来完成编译或安装的话,
您可以看一下 Larry Wall 的经典的 Configure
脚本, 适当地模仿一下。 Port collection 的目的,
就是使每个 port 占用最少的空间,
并做到软件的 即插即用
。
除非明确地声明, 否则您提交给
FreeBSD ports collection 的补丁,
脚本和其它的文件都将被假定以标准的 BSD 版权发布。
打补丁
在您准备制作 port 的过程中, 增加或修改的文件,
都可以通过 &man.diff.1; 来做成补丁。 希望应用到源代码上的每个补丁,
都应保存为单独的文件, 并命名为
patch-* , 其中
* 表示将要修改的文件的完整路径名,
例如 patch-Imakefile 或
patch-src-config.h 。 这些文件,
都应保存在 PATCHDIR
(通常是 files/ ), 这里的补丁都会自动应用到源代码上。
所有的补丁必须是相对于
WRKSRC 的 (一般而言, 您的 port 会将其
tarball 解压缩在那里, 并完成余下的工作)。 为了让修正和升级更容易,
您应避免使用多个 patch 去修改同一个文件 (例如,
patch-file 以及
patch-file2 都修改
WRKSRC /foobar.c ) 这种情况。
只有 [-+._a-zA-Z0-9] 这些字符,
可以出现在补丁的文件名中, 请务必不要使用除这些字符以外的其它字符。
不要把您的补丁命名成 patch-aa
或 patch-ab 等这样的名字,
最好能在补丁名中提到路径和文件名。
不要把 RCS 字符串放进补丁。 我们把文件放进 ports
树的时候, CVS 会损坏它们, 当我们再 check out 出来的时候,
它们就会和原来的不一样, 从而导致打补丁失败。 RCS 字符串
是由美元符号 ($ ) 围绕的,
通常由 $Id 或
$RCS 开头。
使用 &man.diff.1; 的递归选项(-r )
很好, 但是请检查一下最后输出的 patch,
确保没有任何的垃圾信息。 特别地, 有 2 种文件不需要 diff,
并且应该删除: 一种是 Makefile ,
当您的port使用了Imake ,
或者 GNU configure 等等的话。
如果您不得不编辑configure.in
以使 autoconf 去生成
configure , 不要使用
configure 来做 diff
(这常常会有好几千行长!); 请定义
USE_AUTOTOOLS=autoconf:253 并对应
configure.in 来制作 diff。
假如需要删除文件, 则应在
post-extract target,
而不是作为补丁的一部分来完成。
除此之外, port 的
Makefile 还可以通过 in-place 模式的
&man.sed.1; 来直接进行简单的替换操作。 如果补丁需要使用变量值,
这就非常有用了。 例如:
post-patch:
@${REINPLACE_CMD} -e 's|for Linux|for FreeBSD|g' ${WRKSRC}/README
@${REINPLACE_CMD} -e 's|-pthread|${PTHREAD_LIBS}|' ${WRKSRC}/configure
往往在移植某些软件的时候会遇到这样一种情况,
特别是这个软件是在 &windows; 上开发的时候,
大多数的源代码都需要进行CR/LF的转换。
这很可能会给以后打补丁带来问题, 还可能触发编译警告,
并给脚本的执行带来麻烦 (/bin/sh^M not found),
等等。 要迅速将所有文件中的 CR/LF 改为只用 LF, 可以在 port 的
Makefile 中加入
USE_DOS2UNIX=yes 。 除此之外,
还可以指定一个需要执行这种转换操作的文件列表:
USE_DOS2UNIX= util.c util.h
配置
把任何附加的配置命令加进您的
configure 脚本并把它保存到
scripts 子目录。 如前面提到的那样,
您也能在 Makefile 和/或
使用 pre-configure 或
post-configure 的脚本来做同样的事情。
处理用户输入
如果您的 port 要求用户的输入以便配置编译、 或安装配置过程,
就必须在 Makefile 里设置
IS_INTERACTIVE 变量。
如果用户设置了 BATCH 的话,
这将让用户能跳过您的 port 来完成
通宵编译
(如果用户设置了
INTERACTIVE 的话, 那么 只有
那些要求互动的 port 才会被编译)
这将给那些不停编译 ports 的机器省下很多时间。
通常我们还建议,
如果对于那些问题能有合理的缺省答案的话, 应检查一下
PACKAGE_BUILDING 变量,
并根据其设置决定是否执行关闭交互脚本。
这将允许我们为 CDROM 和 FTP 来编译 package。
配置 Makefile
配置 Makefile 是相当简单的,
我们在此建议您在开始之前看一下现有的例子。
在这份手册里也有一个
Makefile例子,
照着里面变量的顺序来写能使得您的 port
更容易地被其它人看懂。
现在, 当您开始编写您新的Makefile
的时候, 可以依次思考一下以下的问题:
作者发布的代码
放在 DISTDIR 中的是不是标准的用 gzip 压缩的
tar 包, 例如 foozolix-1.2.tar.gz ?
如果是, 可以先略过这一节。 如果不是,
您应当看看是不是要覆盖这些变量: DISTVERSION 、
DISTNAME 、
EXTRACT_CMD 、
EXTRACT_BEFORE_ARGS 、
EXTRACT_AFTER_ARGS 、
EXTRACT_SUFX ,
DISTFILES ,取决于您 port 的 distfile
格式有多么怪异。 (最常见的一个例子便是
EXTRACT_SUFX=.tar.Z , 一般这是因为 tar
包是用 compress 而不是
gzip 压缩的时候。)
最糟的情况是, 您需要自己编写
do-extract
来覆盖默认的定义, 尽管这不常见,
但如果遇到了, 还是需要这么做。
命名
Makefile 的第一部分便是 port
的名字、 版本号, 以及它所属的分类。
PORTNAME 和 PORTVERSION
您应该把 PORTNAME 设置为您
port 的名字, PORTVERSION
则是 port 的版本号。
PORTREVISION 和
PORTEPOCH
PORTREVISION (port 的修订版本号)
PORTERVISION
变量是一个单调递增的值, 如果不为
0, 就会被加到包名的后面,
当 PORTVERSION 增加
的时候应被置 0 (也就是当官方有新版本发布的时候)。
PORTREVISION
会被自动化工具 (比如 &man.pkg.version.1;)
用来检测是否存在可用的新版本。
每当 port 发生变化并对生成的
package 的内容或结构有显著影响时,
都应增加 PORTREVISION
值。
下面是一些应当修改 PORTREVISION
的情况:
有新的补丁用来修正安全漏洞、
错误, 或给 port 添加了新的功能。
修改了 Makefile
里编译时开启或禁用的选项。
修改了要安装文件的列表或安装时的行为
(例如, 修改了一个用来给 package
初始化数据的脚本, 如 ssh host keys)。
一个port依赖的共享库版本改变
(在这种情况下, 当安装了新版本的共享库,
后再去安装较早的软件就会出错,
因为它们要依赖老的 libfoo.x
而不是libfoo.(x+1))。
原作者修改了 port distfile, 并且 distfile
的新老版本之间用
diff -ru 只能发现一些细微的变化,
这时我们只需要对
distinfo 做相应的修正,
而不需要修改
PORTVERSION 。
不需要修改
PORTREVISION 的例子:
port 结构风格的改变,
但对于打成的包没有功能的上的变化。
MASTER_SITES
发生变化, 或进行了对 port 功能的修改,
但不致影响最后打成的包。
对 distfiles 诸如修正拼写错误之类的补丁,
对用户而言没有升级上的麻烦。
对一个原本编译失败的包的修改,
使其可编译, 而没有加入新功能。 因为
PORTREVISION
表示包的内容发生了变化,
如果先前没有可编译的包, 也就不需要修改
PORTREVISION
来表示变化。
一个修改并提交 port 的原则是:
使得别人能从中受益 (改进、 修改已有错误,
或使新的 package 能够运行),
您还要权衡一下这是否应让那些经常更新
ports 树的人升级,
如果回答是 是
的话,
PORTREVISION
就应该修改了。
PORTEPOCH (port 的加权版本号)
有时软件商或 FreeBSD 的
porter 会使用比旧版的版本号小的数字做为新版本号的情况。
举例来说, 从
foo-20000801 到 foo-1.0 (从形式上来说这是不对的,
因为 20000801 在数值上比1大很多)。
在这种情况下, PORTEPOCH
应当增加。 如果
PORTEPOCH 非 0,
就应当加到包名字的后面。
PORTEPOCH
永远不能被减少或清零,
因为那样会导致与前一时期的 package
比较版本时产生不正确的结果。
(就是说, 那个 package 就不会被检测到已经过时了。)
新的版本号 (比如前面在前面那个例子中的
1.0,1 ) 在数值上比前一个版本
(20000801) 小, 但多数自动化的工具会认为
,1
后缀意味着比前一个包的后缀 ,0 大。
错误的去除或重置
PORTEPOCH
会导致很多不幸发生; 如果您还不明白前面的讨论,
请多阅读几次直至明白为止,
或到邮件列表上来提问。
大多数 port 都不会用到
PORTEPOCH ,
并且如果某个软件的下一个版本改变了版本号结构的话,
用巧妙的方法来设定 PORTVERSION
也能避免使用 PORTEPOCH 。 然而,
FreeBSD porter 也需要注意, 当有新版本的软件发布,
但并非正式版本时 — 比如
snapshot
版本,
原作者可能会使用当时的日期来命名,
这在新的 官方
版本发布的时候,
就很容易引起前面提到的问题。
举个例子, 如果 snapshot 版本的发布日期是
20000917, 这个软件的上一个版本是1.2,
那么这个版本的 PORTVERSIN 应该设为
1.2.20000917 或类似的样子, 而不是20000917,
这样在 1.3 发布以后,
新版本就可以在数值上大于旧的版本了。
关于 PORTREVISION 和
PORTEPOCH 的用例
gtkmumble port,版本号
0.10 , 被提交到
ports collection:
PORTNAME= gtkmumble
PORTVERSION= 0.10
PKGNAME 变成
gtkmumble-0.10 。
然后有人发现了一个安全漏洞,
需要用一个FreeBSD的补丁。 PORTREVISION
就要相应的增加。
PORTNAME= gtkmumble
PORTVERSION= 0.10
PORTREVISION= 1
PKGNAME 变成了
gtkmumble-0.10_1
软件的作者发布了新的版本, 版本为
0.2 (作者本来的意思是,
用 0.10 表示
0.1.0 ,而不是指
0.9 之后的那个版本
- 但是现在太迟了)。
因为现在的次版本号 2
在数值上比上一个版本 10 小,
PORTEPOCH 必须增加,
以使新的 package 被认为是 更新的
。
由于那是作者发布的一个新版本, 因此
PORTREVISION 应被置0 (或者从
Makefile 里面删除它)。
PORTNAME= gtkmumble
PORTVERSION= 0.2
PORTEPOCH= 1
PKGNAME 变成了
gtkmumble-0.2,1
下一个版本将会是 0.3。
由于 PORTEPOCH 从不减少,
那么就无须改动:
PORTNAME= gtkmumble
PORTVERSION= 0.3
PORTEPOCH= 1
PKGNAME 变成
gtkmumble-0.3,1
如果在这次升级中 PORTEPOCH
被置为了0 , 那么在装了
gtkmumble-0.10_1 包的机器上就无法检测到
gtkmumble-0.3 包的更新,
因为 3 在数值上比
10 小。 记住, 这是
PORTEPOCH 最重要的地方。
PKGNAMEPREFIX 和 PKGNAMESUFFIX
2 个可选的变量, PKGNAMEPREFIX 和
PKGNAMESUFFIX 可以和
PORTNAME 还有
PORTVERSION 配合使用,
形成像这样的 PKGNAME :
${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION} 。
请确定符合我们的
包命名规则。
当然, 不 允许在
PORTVERSION
中使用连字符 (- )。 如果包名有
language- 或
-compiled.specifics 部分 (见下文),
请分别用 PKGNAMEPREFIX 和
PKGNAMESUFFIX , 不要直接加到
PORTNAME 中。
包命名规则
以下是您在命名您的包时应当遵守的规则。
这将使得我们放包的目录更利于浏览,
因为我们已经有数以万计的包了,
如果用户觉得查看包名很困难的话,
他们会很快走开的。
一个包的名字应该看起来像这样:
language_region -name- compiled.specifics -version.numbers 。
要像这样来定义包的名字:
${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION} 。
确保所有的变量符合上面的格式。
FreeBSD 会尽力去支持用户当地的语言。
如果这个 port 是某种语言专用的, 那么
language- 部分应该是
由 ISO-639 定义的自然语言的 2 个字母缩写。 比如,
ja 是表示日本, ru
是表示俄罗斯, vi 表示越南,
zh 表示中国, ko
表示韩国, de 表示德国。
如果是针对某种语言的某一地区的话,
再要加上2个字母的国家代码。 例如,
en_US 表示美国英语,
fr_CH 表示瑞士法语。
language- 部分应该在
PKGNAMEPREFIX 变量里设置。
name 部分的首字母应该
小写。 (余下的部分能包含大写字母, 所以当您
要转换一个包含大写字母软件的名字时, 您需要
自己做出判断。) 对于perl 5
模块的命名, 有个传统的规则是, 在前面
加上 p5-
并把两个冒号的部分改为连字号, 如:
Data::Dumper 模块变成
p5-Data-Dumper 。
如果软件的名字里还有数字、 连字号、 下划线,
您也可以把这些包括进来 (例如 kinput2 )。
如果 port 可以使用不同的 硬编码默认配置
进行构建 (通常是一系列 port 的一部分目录名), 则
-compiled.specifics
部分就应该明示编译进去的默认值 (此处连字号是可选的)。
通常的用例包括纸型和不同的字体尺寸。
-compiled.specifics
部分应该通过 PKGNAMESUFFIX
变量来设置。
版本号应该紧随在连字号
(- ) 后面并由数字和字母组成。
特别指出, 另外的连字号是不允许出现在版本号里的。
唯一例外的是字符串 pl
(表示 patchlevel
),
只能
用在软件没有主版本号和次版本号的情况下。
如果软件的版本号里出现了像
alpha
, beta
,
rc
, pre
,
取第一个字母把它放在小数点的后面。
如果在版本号里一直出现那些名字,
那么在数字和字母之间不应有多余的小数点。
这个方法是为了更容易得凭版本号来排序 port。
特别注意的是, 确保版本号之间的每部分都由小数点来分隔,
如果日期也是版本号的一部分, 就用这样的格式,
yyyy .mm .dd
或者
dd .mm .yyyy
这样的格式, 而非
yy .mm .dd ,
因为后者不适合表示千年的格式。
这里是一些真实的例子,
我们藉此说明如何把软件作者对软件的命名,
转换为适合我们包的命名方式:
发行版的名字
PKGNAMEPREFIX
PORTNAME
PKGNAMESUFFIX
PORTVERSION
说明
mule-2.2.2
(空)
mule
(空)
2.2.2
没什么需要修改的
XFree86-3.3.6
(空)
XFree86
(空)
3.3.6
没什么需要修改的
EmiClock-1.0.2
(空)
emiclock
(空)
1.0.2
程序的名字不能使用大写字母
rdist-1.3alpha
(空)
rdist
(空)
1.3.a
像 alpha
这样的字符串是不允许出现的
es-0.9-beta1
(空)
es
(空)
0.9.b1
像 beta
这样的字符串是不允许出现的
mailman-2.0rc3
(空)
mailman
(空)
2.0.r3
像 rc
这样的字符串是不允许出现的
v3.3beta021.src
(空)
tiff
(空)
3.3
那个是啥鬼东西?
tvtwm
(空)
tvtwm
(空)
pl11
总需要有个版本号吧
piewm
(空)
piewm
(空)
1.0
总需要有个版本号吧
xvgr-2.10pl1
(空)
xvgr
(空)
2.10.1
pl 只允许在没有
主/次 版本号的情况下才能出现
gawk-2.15.6
ja-
gawk
(空)
2.15.6
日文版
psutils-1.13
(空)
psutils
-letter
1.13
纸张大小已经在编译的时候被硬编码到程序里了
pkfonts
(空)
pkfonts
300
1.0
300dpi 字体的包
如果在原始的代码里没有版本号,
或者原作者并不打算开发另外的版本,
就应把版本号设成 1.0 (就像前面
piewm 的例子那样)。 否则,
要求原始的作者加上版本号或使用日期
(yyyy .mm .dd )
来作为版本号。
分类
CATEGORIES (所属分类)
在包制作完成之后,
它会被放在 /usr/ports/packages/All ,
并建立一系列来自
/usr/ports/packages
下子目录的符号连接。 这些子目录的名称是由
CATEGORIES
指定的。 这将方便于那些用户在 FTP 站点或 CDROM
的一大堆包里面寻找自己想要的包。 请查看一下
目前的分类表,
并找出一个适合您 port 的分类。
此列表也会决定您的 port 在 port
目录中的位置。 如果您在这里设定了 1 个以上的分类,
则认为您 port 文件应放到以第一个分类命名的子目录中。 请参阅
后面
关于如何选择正确分类的更多讨论。
目前的分类表
这是目前 port 中的分类。 那些用星号
(* ) 标记的是
虚拟 分类 —
它们在ports树里没有相应的子目录,
因而只用来做为次要的分类, 用以方便搜索。
对于非虚拟的分类来说,
您会看到在相对应子目录中的 Makefile
里有写在 COMMENT 里的单行描述。
分类
描述
注意事项
accessibility
帮助残障人士的 port。
afterstep*
对于
AfterStep
窗口管理器的支持。
arabic
阿拉伯语言支持。
archivers
压缩与备份工具。
astro
有关天文学的 port。
audio
声音支持。
benchmarks
测评程序。
biology
生物学相关的软件。
cad
计算机辅助设计工具。
chinese
中文语言支持。
comms
通讯软件。
大部分是用于串口通讯的。
converters
字符编码转换。
databases
数据库。
deskutils
在发明计算机以前就已经在桌面上使用的东西。
devel
程序开发工具。
不要把开发库放在这里 —
除非您再也找不到更合适的分类,
否则就不该放在这个分类里。
dns
DNS 相关的软件。
editors
通用编辑器。
有特殊用途的编辑器应该被置于相应的分类中
(比如, 数学-方程式
编辑器应该放在 math 分类里。
elisp*
Emacs-lisp相关的port。
emulators
其它操作系统的模拟器。
终端模拟器 不应该
属于这个分类 — 基于 X 的应该放在
x11 而基于文本模式的应该放到
comms 或 misc
中去, 取决于具体的功能。
finance
货币、 金融以及相关的应用程序。
french
法语语言支持。
ftp
FTP 客户端和服务器端的程序。
如果您的 port 同时支持 FTP 和 HTTP 的话,
把它放进 ftp 并把
www 做为第二分类。
games
游戏。
german
德语语言支持。
gnome*
关于
GNOME
项目的支持。
graphics
图形图象程序。
hamradio*
业余无线电爱好者使用的软件。
haskell*
有关 Haskell 编程语言的软件。
hebrew
希伯来语语言支持。
hungarian
匈牙利语语言支持。
ipv6*
IPv6 相关软件。
irc
IRC 相关程序
japanese
日语语言支持。
java
有关 Java 编程语言的软件。
java 分类对于一个
port 来说并不是唯一的分类。
最好用来放和 Java 语言相关的 port,
而且我们鼓励不要把 java
做为一个 port 的主分类。
kde*
K 桌面环境 (KDE)
相关的软件。
korean
韩语语言支持。
lang
编程语言。
linux*
Linux 相关的应用程序。
lisp*
和 Lisp 编程语言有关的软件。
mail
电子邮件软件。
math
数值计算和其它数学相关的软件。
mbone
MBone 应用程序。
misc
各式各样的实用程序。
通常不属于其它的任何分类,
如果可能的话, 尽量为您的 port 选择
misc
以外的分类, 因为在这里的
port 比较容易被人忽略。
multimedia
多媒体软件。
net
各种网络相关的软件。
net-im
即时消息软件。
net-mgmt
网络管理软件。
net-p2p
对等网 (Peer to peer network) 应用程序。
news
USENET新闻组相关软件。
palm
Palm™ 系列相关软件。
parallel*
并行计算相关软件。
pear*
Pear PHP 架构相关软件。
perl5*
Perl 5 相关的软件。
plan9*
Plan9 相关程序。
polish
波兰语语言语言支持。
portuguese
葡萄牙语语言支持。
print
打印相关的软件。
桌面出版工具 (打印预览工具等等)
也可以放在此分类里。
python*
Python 编程语言相关的软件。
ruby*
Ruby 编程语言相关的软件。
rubygems*
移植版本的 RubyGems 软件包。
russian
俄语语言支持。
scheme*
与 Scheme 语言有关的 port。
science
科学相关但不适合放在
astro 、
biology , 以及
math 分类的 port。
security
安全相关的实用程序。
shells
命令行 shell。
sysutils
系统相关的实用程序。
tcl80*
依赖于 Tcl 8.0 版运行的 port。
tcl81*
依赖于 Tcl 8.1 版运行的 port。
tcl82*
依赖于 Tcl 8.2 版运行的 port。
tcl83*
依赖于 Tcl 8.3 版运行的 port。
tcl84*
需要依赖 Tcl 8.4 版运行的 port。
textproc
文本处理的实用程序。
这个分类并不适合于那些应该放到
print 的桌面出版工具。
tk80*
依赖于 Tk 8.0 版运行的 port。
tk82*
依赖于 Tk 8.2 版运行的 port。
tk83*
依赖于 Tk 8.3 版运行的 port。
tk84*
依赖于 Tk 8.4 版运行的 port。
tkstep80*
需要 TkSTEP 8.0 来运行的 port。
ukrainian
乌克兰语语言支持。
vietnamese
越南语语言支持。
windowmaker*
WindowMaker 窗口管理器的相关支持。
www
Word Wide Web的相关软件。
HTML语言相关的支持也可以放在这个分类里。
x11
X Window System以及相关软件。
这个分类是给那些直接支持X Window System
的软件的。 不要把常规的 X 应用程序也放进这里;
它们中的大多数都应被归类到
x11-* (参见下文)。
如果您的 port 是
X 应用程序, 应定义 USE_XLIB
(使用 USER_IMAKE 隐含包括它),
然后把它放到合适的分类里。
x11-clocks
X11 下的时钟程序。
x11-fm
X11 下的文件管理器。
x11-fonts
X11 下的字体以及相关工具。
x11-servers
X11 服务器。
x11-themes
X11 主题。
x11-toolkits
X11 工具包。
x11-wm
X11 窗口管理器。
xfce*
与
Xfce
桌面环境有关的 port。
zope*
Zope 相关的支持。
选择正确的分类
由于不少分类是重复的, 您通常在用哪个分类作为您
port 的主分类上做出选择。 下面有几条规则能帮您解决这个问题。
这是一个带优先级的表, 按优先级降序罗列:
第一个分类必须是个物理的分类 (参阅
前面)。
这对于制作包是必要的。
虚拟分类和物理分类可能在包制作完成后混合在一起。
对于特定语言的分类通常放在第一位。
例如, 如果您的 port 会安装一些 X11 的日文字体,
那么 CATEGORIES 那行
就应该是 japanese x11-fonts 。
有特定意义的分类应当被列在无特定意义的前面。
例如, HTML 编辑器应该是这样的 www
editors , 而不是其它的什么。 同样地,
您不应该列出 net , 如果 port 属于
irc 、 mail 、
mbone 、 news 、
security , 或是 www ,
因为 net 可以表示它们的超集。
只有当主要的分类是一门自然语言的时候,
x11 能被做为第二分类。
需要特别指出的是, 您不应把 X 的应用程序也归类为
x11 。
Emacs
模式应当于相应的应用程序放在同一个分类里, 而不是
editors 分类。 举例来说,
一个用于编辑某种编程语言源代码的
Emacs
模式应该被归为
lang 一类。
misc
分类的 port 不能有其它非虚拟的分类。
如果您在您的 CATEGORIES
里设了 misc 和另外的分类,
那意味着可以安全地删除 misc
并把 port 放到其它的子目录中了!
如果您的 port 确实不属于现有的分类,
才把它放到 misc 。
如果您不能确定使用哪个分类, 请在您提交的
&man.send-pr.1; 里加上一行注释,
这样我们就能在导入进 port 树之前讨论一下。
如果您是 committer, 发一份备忘到 &a.ports;
先讨论一下。 很多情况是新的 port 被加到错误的分类里,
然后又立即被移走。这会造成源代码库不必要和不良的膨胀。
如何提议建立新的分类
由于 Ports Collection 在持续增长, 已经引入了许多新的分类。
新的分类既可以是 虚拟的 分类 —
这些分类在整个 ports 目录中没有属于自己的子目录 —
或 物理的 分类 — 它们有自己的子目录。
接下来我们将讨论与建立新的物理分类有关的事项,
以便帮助您理解如何提议建立新的分类。
我们目前的做法是避免建立新的物理分类, 除非有非常多的 port
应被归入这一分类, 或者 port 属于某一特定的小团体 (例如,
与某种人类语言相关), 或两者皆是。
这样做的原因是这类修改会让 committer 和用户都不得不进行 许多工作
来在 Ports Collection 进行或追踪修改。 此外,
提议新的分类通常都会引起争论。 (可能这是因为关于某个分类是否
太大
一直没有非常一致的意见的缘故,
另一方面, 分类是否能够能够有助于浏览 (以及多少个分类是合适的),
等等, 也都是问题。)
下面是具体的步骤:
在 &a.ports; 提议新的分类。 您应提供建立新分类的详细依据,
包括为什么认为现有的分类不够, 以及希望移动位置的一系列 port
的名字。 (如果有尚在
GNATS 而未 commit 的 port,
也应一一列出。) 如果您是相关 port 的监护人或提交者,
说明这一情况可能有助于您的提议得到通过。
参与讨论。
如果有人支持您的建议, 应及时提交一个 PR,
其中包括提议 PR 的理由, 以及需要移动的 port 的列表。
理想情况下, 这个 PR 也应包含针对下列文件的补丁:
进行 repocopy 之后对 Makefile
进行的修改
新分类的 Makefile
旧分类的 Makefile
依赖于旧 port 的 port 的
Makefile
(此外, 作为一项加分因素,
您还可以按照 Committer 指南所介绍的流程,
提供一些其它需要修改的文件。)
由于这是一项影响 ports 基础设施的变动,
它不仅涉及 repo-copy 的使用,
而且也可能会影响构建集群的衰退测试操作,
因此这类 PR 应分派给 &a.portmgr;。
如果这一 PR 得到批准, 某个 committer 将按照在
Committer 指南 中所介绍的步骤来完成余下的工作。
提议新的虚拟分类和上述过程类似, 但会容易许多,
因为不需要实际地移动任何 port。 这种情况下, PR 应附带的补丁,
就只需要修改影响到的 port 的 Makefile, 以便在其中的
CATEGORIES 中加入新的分类了。
如何提议对分类进行重新组织
有些时候会有一些人提议重新将分类组织为 2-层 或某种基于关键字的结构。
目前为止, 还没有进行任何相关的改变, 因为尽管这些修改比较容易完成,
但修改整个 Ports Collection 所需要进行的工作, 至少也是令人生畏的。
在发表您的观点之前, 请阅读在邮件列表存档中历史上所进行过的提议;
此外, 您也会被要求提供一个可用的原形。
源码包文件
在 Makefile 中的第二部分是描述用于构建 port
所必需下载的文件, 以及到什么地方去下载它们。
DISTVERSION/DISTNAME (源码包版本号/名称)
DISTNAME 是作者称呼您所 port 软件的名字。
DISTNAME 的默认值是
${PORTNAME}-${PORTVERSION} ,
因此只有在需要时才应手工指定。
DISTNAME 只在两个地方用到。 第一处是源码包文件列表
(DISTFILES ), 其默认值是
${DISTNAME} ${EXTRACT_SUFX} 。
第二处是源码包应被展开到的目录名,
即 WRKSRC 所指定的目录,
其默认值是 work/${DISTNAME} 。
某些软件作者发布源码包的时候并不采取
${PORTNAME}-${PORTVERSION} 这样的模式,
这可以通过设置 DISTVERSION 来自动处理。
PORTVERSION 和 DISTNAME
会自动地展开, 当然, 也可以改掉它。 下表给出了一些例子:
DISTVERSION
PORTVERSION
0.7.1d
0.7.1.d
10Alpha3
10.a3
3Beta7-pre2
3.b7.p2
8:f_17
8f.17
PKGNAMEPREFIX 和
PKGNAMESUFFIX 并不影响
DISTNAME 。 此外还应注意
WRKSRC 等于
work/${PORTNAME}-${PORTVERSION} ,
而源代码的压缩包则可能是
${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}
以外的其它名字。 一般情况下应该保持 DISTNAME
不变 — 更好的方法是定义
DISTFILES 而不是同时设置
DISTNAME 和 WRKSRC
(可能还有 EXTRACT_SUFX )。
MASTER_SITES (主流下载站点)
记录 FTP/HTTP-URL 指向 MASTER_SITES
中原始压缩档的目录部分。 不要忘了结尾的斜线
(/ )!
make 宏将尝试使用
FETCH 来抓取所指定的源码包文件,
如果无法在本地系统中找到这些文件的话。
建议您指定多个镜像站点, 最好是在不同的大洲上的。
这样将有效地防止由于大范围网络问题所导致无法下载的问题。
我们甚至打算增加自动检测距离最近的站点并从那里下载的功能;
使用多个站点是这样做的重要一步。
如果原始的源码包是流行的软件,
例如 X-contrib、 GNU, 或 Perl CPAN 等等之一,
您可能会希望使用
MASTER_SITE_*
(例如 MASTER_SITE_XCONTRIB 、
MASTER_SITE_GNU 和
MASTER_SITE_PERL_CPAN ) 来简化撰写。 简单地将
MASTER_SITES 设置为这些变量之一, 并使用
MASTER_SITE_SUBDIR 来指定路径就可以达到目的。
下面是一个例子:
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
这些变量是在
/usr/ports/Mk/bsd.sites.mk 中定义的。
新项目会随时增加, 因此在您提交 port 之前,
应先看一看这个文件的最新版本。
用户也可以在他们的 /etc/make.conf
文件中自行设置 MASTER_SITE_* 变量,
以便让系统使用他们的选择, 从他们喜欢的镜像站点进行下载。
EXTRACT_SUFX (压缩包所用的扩展名)
如果您有一个源码包文件,
而它使用了某种怪异的扩展名来表达压缩方法, 应设置
EXTRACT_SUFX 。
例如, 如果源码包文件的名字是
foo.tgz 而非更为一般的
foo.tar.gz , 您应写上:
DISTNAME= foo
EXTRACT_SUFX= .tgz
USE_BZIP2 和 USE_ZIP
变量会自动根据需要将 EXTRACT_SUFX 设置为
.tar.bz2 或 .zip 。
如果这两个都没设置, 则 EXTRACT_SUFX 的
默认值将是 .tar.gz 。
任何时候都不需要同时设置 EXTRACT_SUFX 和
DISTFILES .
DISTFILES (全部源代码包)
有些时候所下载的文件名字和 port 的名字没有任何联系。
例如, 可能是 source.tar.gz ,
或者与此类似的其它名字。 也有一些其它的应用软件,
它们的源代码可能被存放到了不同的压缩包中, 而且全都需要下载。
如果遇到这种情况, 可以将 DISTFILES
设置为以空格分隔的一组需要下载的文件列表。
DISTFILES= source1.tar.gz source2.tar.gz
如果没有予以明确的设置, DISTFILES 的默认值将是
${DISTNAME}${EXTRACT_SUFX} 。
EXTRACT_ONLY (只解压缩部分源文件)
如果只有一部分 DISTFILES 需要解压缩
— 例如, 其中的一个是源代码, 而其它则是未压缩的文档 —
此时应把那些需要解压缩的文件加到
EXTRACT_ONLY 中。
DISTFILES= source.tar.gz manual.html
EXTRACT_ONLY= source.tar.gz
如果 DISTFILES 中 没有
需要解压缩的文件, 则应将 EXTRACT_ONLY 设为空串。
EXTRACT_ONLY=
PATCHFILES (通过下载得到的补丁文件)
如果您的 port 需要来自 FTP 或 HTTP 的一些额外的补丁,
应将 PATCHFILES 设置为这些文件的名字,
并将 PATCH_SITES 指向包含这些文件的目录的 URL
(格式与 MASTER_SITES 相同)。
如果这些补丁, 由于包含了其它的目录名,
而导致它们不是相对于源代码目录的顶级目录
(也就是 WRKSRC ) 的话,
就需要相应地设置 PATCH_DIST_STRIP 了。
例如, 如果补丁中所有的目录名前面都有一个多余的
foozolix-1.0/ , 就应设置
PATCH_DIST_STRIP=-p1 。
不需要担心补丁文件本身是否是压缩的; 如果文件名以
.gz or .Z
结尾, 系统会自动解压缩。
如果补丁是同某些其它文件, 例如文档, 一同以 gzip 压缩的 tar
格式发布的, 就不能简单地使用
PATCHFILES 了。 这种情况下,
您应将这些补丁包的文件和位置加入到
DISTFILES 和 MASTER_SITES
中。 然后, 用 EXTRA_PATCHES 变量来指出这些文件,
这样 bsd.port.mk 就会自动地为您应用这些补丁了。
需要特别注意的是, 不要 将补丁文件复制到
PATCHDIR 目录中 — 这个目录可能是不可写的。
压缩包会以同源代码一样的方式解压缩, 因此不需要自行完成解压缩操作,
并复制补丁文件。 如果您一定要这样做, 就要注意,
不要让解压缩出来的文件覆盖先前已经存在的文件。
此外, 这么做还需要手工增加命令,
以便在 pre-clean target
中删除这些复制出来的文件。
来自不同站点的多个源代码包或补丁文件
(MASTER_SITES:n )
(这一节在某种程度上应被视作 进阶话题
;
刚开始阅读这份文档的读者可能会希望先跳过这一部分)。
这一节提供了被称作 MASTER_SITES:n 和
MASTER_SITES_NN 的下载控制机制。
这里我们把它们称为 MASTER_SITES:n 。
首先给出一些背景。 OpenBSD 在其 DISTFILES 和
PATCHFILES 变量中提供了一个很棒的功能,
即, 允许这些文件和补丁拥有 :n
后缀, 其中 n 可以使用
[0-9] , 来表达组。 例如:
DISTFILES= alpha:0 beta:1
在 OpenBSD 中, 源码包文件 alpha
应被关联到变量
MASTER_SITES0 而不是公共的
MASTER_SITES 变量上; 而
beta 则应关联到
MASTER_SITES1 上。
这是一个很有意思的功能,
它可以避免无休止地搜索正确的下载站点的过程。
想象 DISTFILES 中指定了 2 个文件,
而 MASTER_SITES 包含了 20 个站点的情形,
这其中许多站点慢如蜗牛, 而 beta 可以在
MASTER_SITES 的所有站点找到, 而
alpha 只能在第 20 个上面找到。
如果监护人了解这一点, 那么检查所有的站点无疑是在浪费时间,
不是吗? 这显然不是开始一个愉快周末的好办法!
现在您有了一个感性的认识了, 想象一下
DISTFILES 和更多的
MASTER_SITES 。 显然, 我们的
distfiles 调查员先生
会感谢您减少他浪费在等待下载上所耗费的时间。
下一节中, 将按照 FreeBSD 对上述想法的实现来加以阐释。
我们对 OpenBSD 所提出的概念进行了一些改进。
简化信息
这一节将介绍如何迅速地对从不同的站点以及子目录下载多个源码包和补丁进行精确的控制。
这里, 我们将描述 MASTER_SITES:n 的一种简化用法。
对于多数情况而言这样做是足够的。 然而, 如果您需要更多信息,
还需要参考下面的几节。
一些应用程序需要从多个站点下载不同的源码包。 例如,
Ghostscript 包括了程序核心本身,
以及大量的驱动文件, 以及则取决于用户的打印机品牌和型号的驱动程序。
某些驱动文件已经随程序核心附带, 但也有很多需要从其它站点下载。
为了适应这种需要, 每一个
DISTFILES 项应跟随一个冒号,
以及一个 标签名
。 在
MASTER_SITES 的每个站点也应跟随冒号和标签名,
以便指定从哪个网站下载源码包文件。
例如, 考虑一个将源代码包分为两部分,
即 source1.tar.gz
和 source2.tar.gz 的软件,
它必须从两个不同的站点下载。 port 的
Makefile 应包括类似
的配置。
简化的 MASTER_SITES:n
用法, 每个文件来自一个站点
MASTER_SITES= ftp://ftp.example1.com/:source1 \
ftp://ftp.example2.com/:source2
DISTFILES= source1.tar.gz:source1 \
source2.tar.gz:source2
多个源码包可以使用同一个标签。 继续前面的例子,
假定增加了第三个源码包, source3.tar.gz ,
应从 ftp.example2.com 下载。
Makefile 的这部分应写成
的样子。
简化的 MASTER_SITES:n 用法,
其中同一个站点上提供了不止一个文件
MASTER_SITES= ftp://ftp.example1.com/:source1 \
ftp://ftp.example2.com/:source2
DISTFILES= source1.tar.gz:source1 \
source2.tar.gz:source2 \
source3.tar.gz:source2
深入介绍
前面的例子无法满足您的需求? 这一节,
我们将详细介绍 MASTER_SITES:n
的精细控制是如何工作的, 以及如何修改您的 port
来使用它们。
元素可以包含
:n 这样的后缀, 其中
n 是
[^:,]+ , 概念上即
n 可以取任意数字或字母,
但我们目前将其限定为
[a-zA-Z_][0-9a-zA-Z_]+ 。
此外, 字符串匹配时对大小写是敏感的;
换言之, n 与
N 不同。
但是, 由于表达特殊的意义, 下列单词不能用于后缀:
default 、 all 和
ALL (它们会在
中介绍的部分用到)。 此外, DEFAULT
是一个有特殊用途的词 (请参见 )。
后缀为 :n
的项目属于 n 组, 而
:m 属于
m 组, 依此类推。
没有后缀的元素是无组的, 也就是它们都属于那个特殊的
DEFAULT 组。 给元素加入
DEFAULT 后缀通常是多余的,
除非您有同时属于 DEFAULT 和其它组的元素
(参见 )。
下面的例子是等价的, 但通常应适用第一个:
MASTER_SITES= alpha
MASTER_SITES= alpha:DEFAULT
组之间不是互斥的, 同一元素可以同时隶属于多个组,
而组则可以为空或者有任意多个元素。 同一组中的重复元素,
并不会被自动消去。
如果希望同一元素同时属于多个组, 可以用逗号
(, ) 分开。
这种办法可以避免仅为指定不同的组而多次重复同一元素。 例如
:m,n,o 表示这个元素同时属于
m 、 n 和 o
这三组。
下面这些写法都是等价的, 但只推荐使用最后一种:
MASTER_SITES= alpha alpha:SOME_SITE
MASTER_SITES= alpha:DEFAULT alpha:SOME_SITE
MASTER_SITES= alpha:SOME_SITE,DEFAULT
MASTER_SITES= alpha:DEFAULT,SOME_SITE
同一组中的所有站点, 会根据
MASTER_SORT_AWK 排序。
在 MASTER_SITES 和
PATCH_SITES 中的组也会进行排序。
在 MASTER_SITES 、
PATCH_SITES 、
MASTER_SITE_SUBDIR 、
PATCH_SITE_SUBDIR 、
DISTFILES , 以及
PATCHFILES 中, 都可以使用组,
其语法为:
所有 MASTER_SITES 、
PATCH_SITES 、
MASTER_SITE_SUBDIR 以及
PATCH_SITE_SUBDIR 的元素, 都必须以
/ 字符结尾。 如果有元素属于某些组,
则组后缀
:n
必须出现在终结符
/ 之后。
MASTER_SITES:n 机制依赖于
/ 的存在, 以避免在 :n
是元素一部分, 而 :n 同时又表示组
n 时发生混淆。 为了兼容性的考虑,
因为之前 / 终结符在
MASTER_SITE_SUBDIR 和
PATCH_SITE_SUBDIR 元素中都不是必需的,
如果后缀所紧跟的字符不是 / ,
则 :n 将被认为是元素的一部分,
而不被当作组后缀, 即使元素拥有 :n
后缀。 请参见
和
以了解进一步的细节。
在 MASTER_SITE_SUBDIR 中
MASTER_SITES:n 的详细用法
MASTER_SITE_SUBDIR= old:n new/:NEW
组 DEFAULT 中的目录
-> old:n
组 NEW 中的目录
-> new
用到逗号分隔符、 多个文件, 多个站点和
不同子目录的 MASTER_SITES:n
详细用法
MASTER_SITES= http://site1/%SUBDIR%/ http://site2/:DEFAULT \
http://site3/:group3 http://site4/:group4 \
http://site5/:group5 http://site6/:group6 \
http://site7/:DEFAULT,group6 \
http://site8/%SUBDIR%/:group6,group7 \
http://site9/:group8
DISTFILES= file1 file2:DEFAULT file3:group3 \
file4:group4,group5,group6 file5:grouping \
file6:group7
MASTER_SITE_SUBDIR= directory-trial:1 directory-n/:groupn \
directory-one/:group6,DEFAULT \
directory
前述的例子的结果是下述的对于下载行为的精细控制。
站点的列表按照使用的顺序给出。
file1 将从
MASTER_SITE_OVERRIDE
http://site1/directory-trial:1/
http://site1/directory-one/
http://site1/directory/
http://site2/
http://site7/
MASTER_SITE_BACKUP
下载。
file2 将和
file1 以同样的方式下载,
因为它们属于同一组
MASTER_SITE_OVERRIDE
http://site1/directory-trial:1/
http://site1/directory-one/
http://site1/directory/
http://site2/
http://site7/
MASTER_SITE_BACKUP
file3 将从
MASTER_SITE_OVERRIDE
http://site3/
MASTER_SITE_BACKUP
下载。
file4 将从
MASTER_SITE_OVERRIDE
http://site4/
http://site5/
http://site6/
http://site7/
http://site8/directory-one/
MASTER_SITE_BACKUP
下载。
file5 将从
MASTER_SITE_OVERRIDE
MASTER_SITE_BACKUP
下载。
file6 将从
MASTER_SITE_OVERRIDE
http://site8/
MASTER_SITE_BACKUP
下载。
如何对来自
bsd.sites.mk 的特殊变量, 例如
MASTER_SITE_SOURCEFORGE 进行分组?
参见 。
MASTER_SITE_SOURCEFORGE 中
MASTER_SITES:n 的详细用法
MASTER_SITES= http://site1/ ${MASTER_SITE_SOURCEFORGE:S/$/:sourceforge,TEST/}
DISTFILES= something.tar.gz:sourceforge
something.tar.gz 将从所有
MASTER_SITE_SOURCEFORGE 中的站点下载。
如何与 PATCH* 变量连用?
前面的例子介绍的都是
MASTER* 变量,
但对于 PATCH* 也是完全一样的,
它们在
有所介绍。
简化的 PATCH_SITES 中的
MASTER_SITES:n 用法。
PATCH_SITES= http://site1/ http://site2/:test
PATCHFILES= patch1:test
会改变 ports 的哪些行为? 哪些不会?
所有普通的 ports 的行为都会保持不变。
MASTER_SITES:n 功能的代码,
只有在某些元素包含了前述, 特别是
中所提及语法的
:n 后缀时,
才会启用。
不受影响的 port target:
checksum 、
makesum 、
patch 、
configure 、
build , 等等。
显然, do-fetch 、
fetch-list 、
master-sites 和
patch-sites 的行为会发生变化。
do-fetch : 会按照新的、
带有组后缀的
DISTFILES 和
PATCHFILES 在
MASTER_SITES 和
PATCH_SITES 所匹配的组元素, 以及
MASTER_SITE_SUBDIR 和
PATCH_SITE_SUBDIR 来进行。
请参见 。
fetch-list : 和旧式的
fetch-list 类似, 但以同
do-fetch 相似的方式处理组。
master-sites 和
patch-sites :
(与旧版本不兼容) 仅返回组 DEFAULT
的元素; 事实上, 它们会执行
master-sites-default 和
patch-sites-default
这两个 target。
更进一步, 使用
master-sites-all 或
patch-sites-all 这两个
target 之一, 要比直接检查
MASTER_SITES 或
PATCH_SITES 更好。
此外, 未来版本可能不再保证直接检查能够正确工作。
请参见
以了解关于这些新 target 的更多技术细节。
port 中的新 target
一系列
master-sites-n
和
patch-sites-n
target 可以分别用来列出 MASTER_SITES 和
PATCH_SITES 中的 n
组的内容。 例如,
master-sites-DEFAULT 和
patch-sites-DEFAULT 都会返回
DEFAULT 组的内容, 而
master-sites-test 和
patch-sites-test 则返回
test 组的内容, 等等。
新增的
master-sites-all 和
patch-sites-all 这两个 target,
会完成先前
master-sites 和
patch-sites 所做的工作。
它们会返回所有组的元素, 就像这些元素都属于同一组一样,
并且会列出与
MASTER_SITE_BACKUP 或
MASTER_SITE_OVERRIDE 中在
DISTFILES 或
PATCHFILES 中指定的同样多个; 分别对于
master-sites-all 和
patch-sites-all 。
DIST_SUBDIR (独立的源码包子目录)
避免让您的 port 使
/usr/ports/distfiles 陷入混乱。
如果您的 port 需要下载很多文件, 或者需要下载可能与其它 port
的源文件名冲突的文件 (例如,
Makefile ), 则应将 DIST_SUBDIR
设置为 port 的名字 (通常可以用 ${PORTNAME} 或
${PKGNAMEPREFIX}${PORTNAME} )。 这将把
DISTDIR 从默认的
/usr/ports/distfiles 改为
/usr/ports/distfiles/DIST_SUBDIR ,
并将与您的 port 有关的文件放到那个目录中。
此外, 它也会在备份文件主服务器 ftp.FreeBSD.org
上查找同一子目录下的文件 (直接在您的
Makefile 中设置 DISTDIR
则不会有这样的效果, 因此您应使用
DIST_SUBDIR 。)
这一设置并不影响您在 Makefile
中定义的 MASTER_SITES 。
ALWAYS_KEEP_DISTFILES (一直保存源码包)
如果您的 port 采用的是预编译的包,
但却采用了某种要求源代码必须与预编译版本一同提供的授权,
例如 GPL, 则应使用 ALWAYS_KEEP_DISTFILES
来告诉 &os; 构建集群保留一份在 DISTFILES
中文件的副本。 一般来说这些 port 的用户并不需要这些文件,
因此, 只在定义了
PACKAGE_BUILDING 符的时候,
才将源代码包文件加入 DISTFILES 是个好主意。
如何使用 ALWAYS_KEEP_DISTFILES 。
.if defined(PACKAGE_BUILDING)
DISTFILES+= foo.tar.gz
ALWAYS_KEEP_DISTFILES= yes
.endif
当您在 DISTFILES 加入其它文件时,
请务必确保这些文件也出现在了 distinfo 中。
此外, 这些额外的文件通常也会展开到
WRKDIR 中, 对于某些 ports,
这可能导致一些不希望的副作用, 因而需要进行特别的处理。
MAINTAINER (监护人)
请在此处写上您的电子邮件地址。 :-)
需要注意一点, MAINTAINER
变量的值只能是一个不包括注释部分的电子邮件地址,
其格式应为 user@hostname.domain 。
请不要在此处写任何说明性的文字, 例如您的真实姓名 — 这会给
bsd.port.mk 带来麻烦。
监护人有责任保持 port 随时更新, 并确保其能够正确地运行。
详细的 port 监护人职责说明, 请参见
port 监护人面临的挑战 一节。
对于 port 的修改, 应被发给 port 的监护人进行复审,
且在 commit 之前需要获得其监护人的同意。
假如某一 port 的监护人没有在两周之内 (不包括主要的公共假日)
响应来自用户的更新请求, 则可视为监护人超时,
在这种情况下可以在没有监护人明确同意的情形下进行更新。
如果监护人在多达三个月的时间内没有进行任何响应,
则可以认为该监护人不辞而别, 允许对出现此类问题的 port 进行监护人变更。
尽管如此, 监护人为 &a.portmgr; 或者 &a.security-officer; 的 port
不受此限。 对监护人为这些小组的 port 进行未经许可的 commit 是不允许的。
我们保留对监护人所提交修正案进行改动的权力, 以便使其更符合现行的 Ports
Collection 规范, 而无需提交补丁的人明确批准。 此外, 大规模的基础性修改,
也可能使 port 在没有得到监护人同意的情形下进行修改。
但这类修改都不会影响 port 本身的功能。
&a.portmgr; 保留以任何原因收回或绕过任何人监护权的权力,
而 &a.security-officer; 则保留以安全原因收回或绕过监护权的权力。
依赖关系
许多 port 会依赖其它 port。
有七个变量用于帮助您确保所需的文件都存在于用户的机器上。
此外, 也提供了用于支持常见情形的依赖关系变量,
以及对依赖关系行为的更多控制。
LIB_DEPENDS (依赖的函数库/共享库)
这个变量用于指定 port 所依赖的共享库。 其内容是由一系列
lib :dir :target
元组构成的表, 其中 lib 是共享库的名字,
而 dir 则是在找不到时应该从哪里构建和安装,
最后, target 用于指定在那个目录中调用的
target。 例如,
LIB_DEPENDS= jpeg.9:${PORTSDIR}/graphics/jpeg
会检测主版本号为 9 的 jpeg 共享库, 如果它不存在,
则会进入到您的 ports 目录中的 graphics/jpeg
子目录, 并构建和安装它。 如果您指定的 target
就是 DEPENDS_TARGET (默认是
install ), 则可以略去不写。
lib 部分是一个正则表达式, 用于在
ldconfig -r 的输出中进行查找。 可以使用类似
intl.[5-7] 和 intl 这样的值。
前一种模式, 即
intl.[5-7] , 能够匹配
intl.5 、 intl.6 和
intl.7 中的任意一个。 第二种模式, 即
intl 则可以匹配任意版本的
intl 库。
依赖关系会被检测两次, 一次是在
extract target 中, 而另一次则是在
install target。 另外,
依赖关系的名字会放到 package 中, 以便让
&man.pkg.add.1; 能够自动地在用户系统上安装所需的未安装的其它
package。
RUN_DEPENDS (依赖的运行环境)
这个变量可以用来指定 port 在运行时所需要的可执行文件,
以及资源文件。 它是一系列
path :dir :target
元组的列表, 这里, path 时所需的可执行,
或者资源文件的名字, dir 是在无法找到这些文件或目录时,
去什么地方完成构建和安装以便获得这些文件; 而
target 则用来指定在这个目录中所调用的
target 的名字。 假如 path 以斜线
(/ ) 开始, 则会当作普通文件,
使用 test -e 来测试; 反之,
则系统会假定这是一个可执行文件, 并且用 which -s
来检测程序是否存在于搜索路径中。
例如,
RUN_DEPENDS= ${LOCALBASE}/etc/innd:${PORTSDIR}/news/inn \
wish8.0:${PORTSDIR}/x11-toolkits/tk80
将检查文件, 或者目录
/usr/local/etc/innd 是否存在,
如果找不到, 则将从 port 目录的
news/inn 子目录加以安装。
系统也会检查是否能够在搜索路径中找到名为 wish8.0
的文件, 如果找不到的话, 则会进入 ports 目录中的
x11-toolkits/tk80 子目录,
并进行构建和安装的操作。
这种情况下, innd 实际上是一个可执行文件;
如果可执行文件不会出现在搜索路径中, 您就需要指定完整路径了。
ports 构建集群上官方的搜索 PATH 是
/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin
这个依赖关系会在
install target 的过程中进行检查。
此外, 依赖关系的名字会被放到 package 中, 以便
&man.pkg.add.1; 能够在用户的系统中尚未安装相关软件时自动地安装那些 package。
如果您希望指定一个的 target
和默认的 DEPENDS_TARGET 相同,
则可以略去不写。
BUILD_DEPENDS (依赖的构建环境)
此变量用于指定用来构建 port 的可执行文件或资源文件。
与 RUN_DEPENDS 类似, 它是一个
path :dir :target
元组的列表。 例如, BUILD_DEPENDS=
unzip:${PORTSDIR}/archivers/unzip 将检测名为
unzip 的可执行文件是否存在, 如果不存在,
则会进入到您的 ports 目录中的 archivers/unzip
并完成构建和安装工作。
这里的 build
表示从解压缩到编译的全部过程。
依赖关系是在 extract target 的过程中检测的。
假如您要指定的 target 和
DEPENDS_TARGET 相同, 则可以略去不写。
FETCH_DEPENDS (依赖的下载环境)
这一变量用于指定 port 在下载时所需的可执行文件或资源文件。
和前两个类似, 它是一组
path :dir :target
元组。 例如, FETCH_DEPENDS=
ncftp2:${PORTSDIR}/net/ncftp2
将检测名为 ncftp2 的可执行文件是否存在,
如果找不到, 则将进入到您 ports 目录中的
net/ncftp2 子目录并加以构建和安装。
这个依赖关系是在
fetch target 过程中检查的。
如果与 DEPENDS_TARGET 相同,
则可以省略 target 部分。
EXTRACT_DEPENDS (依赖的解压缩环境)
此变量用于指定 port 在解压缩时所需的可执行文件或其它资源文件。
和前一个变量类似, 它是一系列
path :dir :target
元组的列表。 例如, EXTRACT_DEPENDS=
unzip:${PORTSDIR}/archivers/unzip 将检查名为
unzip 的可执行文件是否存在, 如果不存在,
则会进入到您的 ports 目录中的 archivers/unzip
子目录, 予以构建和安装。
这个依赖关系是在
extract target 的过程中检查的。 如果与
DEPENDS_TARGET 相同,
则可以略去 target 部分。
只有在其它方式都不可用 (默认是 gzip )
而且无法通过 所介绍的 USE_ZIP 或
USE_BZIP2 都不能达到需要时,
才应使用这个变量。
PATCH_DEPENDS (依赖的打补丁环境)
这个变量用于指定 port 在进行 patch
操作时所需的可执行文件或其它资源文件。 和前一个变量类似, 它是一组
path :dir :target
元组的表。 例如, PATCH_DEPENDS=
${NONEXISTENT}:${PORTSDIR}/java/jfc:extract
表示进入到您的 ports 目录中的
java/jfc 子目录, 并将其解压缩。
这个依赖关系是在
patch target 的过程中检查的。
target 部分如果和
DEPENDS_TARGET 相同, 就可略去不写。
DEPENDS (一般依赖)
如果有无法归类于上述类别的依赖关系, 或者您的 port
需要解压缩其它 port 的源代码才能够完成构建或安装,
则应使用它来表达。 这个变量是一组格式为
dir :target
的元组表, 与前四个不同, 它并不实施检查。 这里的
target 部分,
如果与 DEPENDS_TARGET 相同, 就可以略去不写。
USE_*
提供了一系列变量, 用以封装大量 port 都用到的依赖关系。
虽然使用这些变量是可选的, 但它们能显著减少 port 的
Makefile 复杂性。 这些变量的共同特征在于,
它们的名字都是 USE_*
这样的形式。 这些变量的使用, 应严格限制于 port 的
Makefile 以及
ports/Mk/bsd.*.mk ,
而绝不应用于表达用户能够设置的选项 — 这种情况下应采用
WITH_* 和
WITHOUT_*
这样的变量。
任何 情况下, 都不应在
/etc/make.conf 中配置
USE_* 。
例如, 设置 USE_GCC=3.2
将导致每一个 port 都依赖于 gcc32, 甚至包括
gcc32 本身!
常用的 USE_*
变量
变量
含义
USE_BZIP2
此 port 的源码包是使用
bzip2 压缩的。
USE_ZIP
此 port 的源码包是用
zip 压缩的。
USE_BISON
此 port 在构建时使用 bison 。
USE_GCC
此 port 需要使用某一特定版本的
gcc 才能完成编译。
可以使用类似 3.2 这样的值来精确指定版本。
如果希望使用不低于某一版本的编译器, 则可以用
3.2+ 这样的形式。 如果与所希望的版本吻合,
则将使用基本系统中所提供的 gcc , 反之,
系统会从 ports 中安装所希望版本的 gcc ,
并调整 CC 以及
CXX 变量的设置。
与 gmake
和 configure 脚本有关的变量在
中进行了介绍, 而
autoconf 、
automake 以及
libtool 的介绍则可以在
找到。
介绍了与 Perl 有关的的变量。
中列出了关于 X11 的变量。 关于 GNOME 的变量在 , 而关于 KDE 的则在 。 讲述了和 Java 有关的变量, 而 则包含了关于
Apache 、 PHP
以及 PEAR 的介绍性信息。 关于 Python ,
在 进行了讨论, 而关于
Ruby 的介绍,
则可以在 中找到。
最后, 提供了用于
SDL 应用程序的变量介绍。
在依赖关系中指定最低版本
在依赖某个其他 port 时, 可以以下面的句法在
*_DEPENDS 变量中指定最低版本:
p5-Spiffy>=0.26:${PORTSDIR}/devel/p5-Spiffy
第一个字段指明了所依赖 package 的名字,
用以与 package 数据库中的某项匹配, 然后是比较算符,
以及 package 的版本号。 前面的例子中,
如果系统中安装了 p5-Spiffy-0.26 则认为满足了依赖条件。
关于依赖关系的补充说明
如前面所提到的那样, 在需要某一依赖的 port 时,
将调用 DEPENDS_TARGET 所指定的 target。
这一变量的默认值是 install 。 这不是一个用户变量,
它不应在 port 的
Makefile 中予以定义。 如果您的 port 需要使用特殊的
target 来处理依赖关系, 应使用 *_DEPENDS 的
:target 部分, 而不是重定义
DEPENDS_TARGET 来完成。
当您输入 make clean 时, 其依赖的 port
也会自动进行清理。 如果您不希望如此, 应定义环境变量
NOCLEANDEPENDS 。 如果 port
依赖一些重新构建需要花费很长时间的 port 时, 例如 KDE, GNOME
或 Mozilla 时, 这一方法会非常有用。
要无条件地依赖某个 port, 可以使用 ${NONEXISTENT}
作为 BUILD_DEPENDS 或
RUN_DEPENDS 的第一部分。 只有在您需要使用其它
port 提供的源代码时才应这样做。 通常也可以通过这样指定来缩短编译所需的时间。
例如
BUILD_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract
表示依赖 jpeg port 并将其解压缩。
除非其它方式都不适合, 否则不要使用 DEPENDS 。
这样指定将在任何情况下都构建 (默认情况下还会安装) 其它 port,
而且这依赖关系还会进入 package。 如果真的需要这样, 写成
BUILD_DEPENDS 和
RUN_DEPENDS 可能更合适一些 —
至少它的表达更为明确。
循环的依赖关系是致命的
不要在 ports tree 中引入任何循环依赖关系!
ports 构建技术不能够容忍循环依赖关系。 如果您引入了这样的关系,
就一定会有人安装的 FreeBSD 会因此而损坏, 而且这种现象会越来越多。
这些情形很难检测; 如果有疑虑, 在进行这样的修改之前, 务必执行:
cd /usr/ports; make index 。 这个过程在旧的机器上会很慢,
但能够让大量的用户 — 也包括您自己 —
拯救于由这种问题所造成的困惑之中。
MASTERDIR (主 port 所在的目录)
如果 port 需要依某些变量的设置 (举例来说, 分辨率或纸型)
来构建略有不同的预编译包, 则可以为每一个这样的包建立不同的目录,
这样可以让用户更容易地看到他们想要安装的版本, 但又能在这些 port
之间共用尽可能多的文件。 一般情况下, 如果运用得当, 除主目录之外都只需要很短的
Makefile 。 这些 Makefile 中,
可以用 MASTERDIR 来指定其它文件所在的目录。
另外, 还应使用一个变量作为
PKGNAMESUFFIX
的一部分, 以便为不同的包给出不同的命名。
用例子来阐述这些会更为明晰。 以下是
japanese/xdvi300/Makefile 的部分代码:
PORTNAME= xdvi
PORTVERSION= 17
PKGNAMEPREFIX= ja-
PKGNAMESUFFIX= ${RESOLUTION}
:
# default
RESOLUTION?= 300
.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \
${RESOLUTION} != 300 && ${RESOLUTION} != 400
@${ECHO_MSG} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
@${ECHO_MSG} "Possible values are: 118, 240, 300 (default) and 400."
@${FALSE}
.endif
japanese/xdvi300 也提供了全部常规的补丁,
以及打包用到的文件等等内容。 如果您在那里输入 make ,
它将使用默认的分辨率值 (300) 并正常地构建 port。
对于其它分辨率而言, 以下是 完整的
xdvi118/Makefile :
RESOLUTION= 118
MASTERDIR= ${.CURDIR}/../xdvi300
.include "${MASTERDIR}/Makefile"
(xdvi240/Makefile 和
xdvi400/Makefile 是相似的)。
MASTERDIR 定义会告诉
bsd.port.mk 常规的目录,
例如 FILESDIR 以及
SCRIPTDIR 应在
xdvi300 中查找。 RESOLUTION=118
这行将覆盖在 xdvi300/Makefile 中所作的
RESOLUTION=300 设置, 从而 port
将以分辨率为 118 的设置来构建。
联机手册
MAN[1-9LN] 这些变量,
会自动地将联机手册加到 pkg-plist (这也意味着
不能 在
pkg-plist 中列出联机手册 — 参见 PLIST 的生成 来了解更多细节)。 此外,
这也会让安装阶段自动地根据在 /etc/make.conf
中所作的 NOMANCOMPRESS 设置来自动对联机手册文件执行压缩或解压缩操作。
如果 port 尝试通过使用符号连接或硬连接将联机手册安装为多个名字,
就必须使用 MLINKS 变量来予以明示。
由 port 创建的连接, 将由 bsd.port.mk
删除和重建, 以确认它们指向了正确的文件。 任何在 MLINKS 中列出的文件都不应在
pkg-plist 中再出现。
要指定是否在安装时对联机手册进行压缩,
可以使用 MANCOMPRESSED 变量。
这一变量可以取三种值, yes 、 no 和
maybe 之一。 yes
表示联机手册已经以压缩的形式安装, no 表示还没有,
而 maybe 则表示所安装的软件会尊重
NOMANCOMPRESS 的设置值, 因此
bsd.port.mk 不需要特别做什么事情。
如果设置了 USE_IMAKE 而未定义
NO_INSTALL_MANPAGES ,
MANCOMPRESSED 会自动设为
yes , 反之则是
no 。 除非默认值不合适,
否则就不需要在 port 中明确地加以改变。
如果 port 将联机手册放到了
PREFIX 之外的其它目录, 则应使用
MANPREFIX 来加以设置。 此外,
如果只有某些部分的联机手册会安装到不标准的位置, 例如某些 perl
模块的 port, 还可以使用
MANsect PREFIX (此处
sect 是 1-9 、
L 或 N 之一) 来指定。
如果您的联机手册需要装入专用于某一语言专用的子目录,
需要将 MANLANG 设为那种语言的名字。
此变量的默认值是 "" (也就是只有英语)。
下面是一个综合的例子。
MAN1= foo.1
MAN3= bar.3
MAN4= baz.4
MLINKS= foo.1 alt-name.8
MANLANG= "" ja
MAN3PREFIX= ${PREFIX}/share/foobar
MANCOMPRESSED= yes
这表示 port 会安装六个文件;
${PREFIX}/man/man1/foo.1.gz
${PREFIX}/man/ja/man1/foo.1.gz
${PREFIX}/share/foobar/man/man3/bar.3.gz
${PREFIX}/share/foobar/man/ja/man3/bar.3.gz
${PREFIX}/man/man4/baz.4.gz
${PREFIX}/man/ja/man4/baz.4.gz
此外, ${PREFIX}/man/man8/alt-name.8.gz
可能会通过您的 port 安装, 也可能不会。 无论如何,
都会创建一个符号连接, 把 foo(1) 和
alt-name(8) 联机手册连起来。
Info 文件
如果软件包需要安装 GNU 文件,
则需要在 INFO 变量中列出 (不需要指定
.info 后缀), 这样安装/卸载代码就会自动地在注册包时将它们加入到
pkg-plist 了。
Makefile 选项
某些大型应用程序可以在构建时使用一系列配置选项,
用以在系统中已经安装了某些库或应用程序时增加一些功能。
例如, 选择某种自然 (人类的) 语言, GUI 或命令行界面,
由于并不是所有的用户都希望使用这些库或者应用程序, port
系统提供了一组方便的机制, 来让 port 的作者控制构建时的配置。
支持这些特性可以让用户体验更好, 并达到事半功倍的效果。
开关 (KNOBS )
WITH_* 和
WITHOUT_*
这些变量是为系统管理员准备的。 许多这样的变量被标准化并置于
ports/Mk/bsd.*.mk ; 也有一些没有,
这可能会比较令人困惑。 如果您需要增加类似的配置变量,
请考虑使用下表中的变量。
您不应假定每一个
WITH_*
都会有对应的
WITHOUT_*
变量, 反之亦然。 一般而言, 会使用默认值。
除非另有说明, 这些变量都是测试是否定义,
而不是它们设置了 YES 或
NO 。
WITH_*
和 WITHOUT_*
变量
变量
意义
WITH_APACHE2
如果定义了这个变量, 则使用
www/apache20
而不是默认的
www/apache13 。
WITH_BERKELEY_DB
这个变量表示所用的 Berkeley 数据库软件包版本, 例如
databases/db41 。
WITH_BDB_VER 可以取的值包括
2、 3、 4、 41 和 42。
WITH_MYSQL
这个变量用于指定所用的 MySQL 数据库软件包的版本, 例如
databases/mysql40-server 。
WANT_MYSQL_VER 可以取的值,
包括 323、 40、 41 和 50。
WITHOUT_NLS
表示不需要国际化支持, 这可以节省编译所消耗的时间。
默认情况下, 会启用国际化支持。
WITH_OPENSSL_BASE
使用基本系统中的 OpenSSL 版本。
WITH_OPENSSL_PORT
使用通过 security/openssl
安装, 并代替原先随基本系统安装的 OpenSSL 版本。
WITH_POSTGRESQL
这个变量用于指定所需的 PostGreSQL 数据库软件包的版本, 例如
databases/postgresql72 。
WITHOUT_X11
如果 port 能够在是否包含
X 支持的情况下分别构建, 则一般情况应该默认以包含
X 支持的配置来构建。 如果定义了这一变量,
则应构建不包含 X 支持的版本。
开关 (knob) 的命名
我们建议 port 的开发人员使用相似的开关, 以便最终用户使用,
并减少开关名称的总数。 最为常用的开关名字可以在
KNOBS
文件中找到。
开关的名字应反映其功能。 如果 port 的 PORTNAME
包括 lib- 前缀, 则开关名中应删去 lib- 前缀。
OPTIONS (菜单式可选项)
背景
OPTIONS 将为正在安装 port
的用户提供一个包含可用选项的对话框,
并将用户的选择保存到 /var/db/ports/portname /options 中。
下次重新联编 port 时, 这些选项将被再次使用。
这样一来, 就不需要劳神去记忆您之前联编 port 时的那几十个
WITH_* 和
WITHOUT_* 选项了!
当用户运行 make config (或首次运行
make build ) 时, 框架会首先检查
/var/db/ports/portname /options 。
如果这个文件不存在, 则它会使用
OPTIONS 的值来生成一个可以启用或禁用各个选项的对话框。
随后, 用户的选择将保存到
options 文件中,
并被用于联编 port。
使用 make showconfig 可以查看保存的配置。
此外, make rmconfig 可以删除已经保存的配置。
语法
OPTIONS 变量的语法是:
OPTIONS= OPTION "说明性文字" 默认值 ...
默认值必须是 ON 和
OFF 之一。 这种三元组可以使用多次。
定义 OPTIONS 变量的值,
必须在引用 bsd.port.pre.mk 之前定义。
而 WITH_* 和 WITHOUT_*
只有在引用了
bsd.port.pre.mk 之后才能开始检测。
由于基础支持框架的一些缺陷, 您只能使用
WITH_* 变量来检测那些默认值为
OFF 的选项, 而使用
WITHOUT_* 变量来检测那些默认值为
ON 的选项。 这样做的原因是:
当定义了 PACKAGE_BUILDING 或
BATCH 来联编 package 时, config
target 并不执行, 因此也就不会有选定的 OPTIONS 。
这会导致 make depends 和
make describe 在没有遵循前面规则的 port
联编失败。
例子
简单的 OPTIONS 用法
OPTIONS= FOO "启用 foo 选项" On \
BAR "支持 bar 功能" Off
.include <bsd.port.pre.mk>
.if defined(WITHOUT_FOO)
CONFIGURE_ARGS+= --without-foo
.else
CONFIGURE_ARGS+= --with-foo
.endif
.if defined(WITH_BAR)
RUN_DEPENDS+= bar:${PORTSDIR}/bar/bar
.endif
.include <bsd.port.post.mk>
+
+ 自动激活的特性
+
+ 在使用 GNU configure 脚本时, 一定要小心有些特性会由其自动检测而激活。
+ 您应通过明确地指定相应的
+ --without-xxx 或 --disable-xxx
+ 参数到 CONFIGURE_ARGS 来禁用不希望的特性。
+
+
+ 处理选项时的错误做法
+ .if defined(WITH_FOO)
+LIB_DEPENDS+= foo.0:${PORTSDIR}/devel/foo
+CONFIGURE_ARGS+= --enable-foo
+.endif
+
+
+ 在前面的例子中, 假设系统中已经安装了 libfoo 库。 用户可能并不希望应用程序使用 libfoo,
+ 因此他在 make config 对话框中关掉了这个选项。
+ 但是, 应用程序的 configure 脚本检测到了系统中存在这个库,
+ 并将其加入到了最终可执行文件支持的功能中。 现在, 如果用户决定从系统中卸载 libfoo 时,
+ ports 系统就无法保护这个应用程序免遭破坏了 (因为没有记录 libfoo 的依赖关系)。
+
+
+ 处理选项时的正确做法
+ .if defined(WITH_FOO)
+LIB_DEPENDS+= foo.0:${PORTSDIR}/devel/foo
+CONFIGURE_ARGS+= --enable-foo
+.else
+CONFIGURE_ARGS+= --disable-foo
+.endif
+
+
+ 在第二个例子中, libfoo 库被明确禁用。 即使系统中已经安装了这个库,
+ configure 脚本也不会启用相应的功能了。
+
+
指定工作临时目录
每个 port 都会被解压缩到一个工作临时目录中, 这个目录必须是可写的。
ports 系统默认情况下会将
DISTFILES 解压缩到一个叫做
${DISTNAME} 的目录中。 换言之, 如果设了:
PORTNAME= foo
PORTVERSION= 1.0
则 port 的源码包文件的顶级目录将是
foo-1.0 。
如果这不是所希望的情形, 您可以修改一系列变量的设置。
WRKSRC (开始构建操作的目录名)
这个变量给出了在应用程序的源代码包解压缩之后所生成的目录的名字。
如果我们之前的例子解压缩生成一个叫做 foo (而不是
foo-1.0 ) 的目录, 您应:
WRKSRC= ${WRKDIR}/foo
或者, 也可能是
WRKSRC= ${WRKDIR}/${PORTNAME}
NO_WRKSUBDIR (不需要临时的构建目录)
如果 port 完全不需要写入到某个子目录中,
您应设置 NO_WRKSUBDIR 以明示这一点。
NO_WRKSUBDIR= yes
CONFLICTS (设置与其它包的冲突)
如果您的软件包无法与某些其它软件包共存
(由于文件冲突, 运行环境不兼容, 等等),
将这些包的名字列在 CONFLICTS
变量中。 此处可以使用 shell 通配符, 如 * 和
? 。 列举软件包的名称时, 应采用
/var/db/pkg 中的形式。 请确认
CONFLICTS 不会匹配它本身, 否则将导致
FORCE_PKG_REGISTER 无法正常工作。
CONFLICTS 会自动地设置
IGNORE , 后者的完整介绍,
可以在 找到。
特殊情况
有一些您在创建port时的特殊情况,我们在这里提一下。
共享库
如果您的port安装了一个或多个共享库,那么请定义一个
USE_LDCONFIG make 变量,
在post-install 标记把它注册进共享库
缓冲时会调用bsd.port.mk 去运行
${LDCONFIG} -m 来指向新库的安装目录。
(通常是 PREFIX /lib )
同样,您也可以适当的在您的
pke-plist 文件
中定义一组@exec /sbin/ldconfig -m
和@unexec /sbin/ldconfig -R,
那么用户可以在安装后马上
就能使用,并且在卸载软件包后系统也不会认为这些共享库仍然存在。
USE_LDCONFIG= yes
如果您需要把共享库安装在缺省的位置之外,
可以通过定义 make 变量 USE_LDCONFIG
来改变默认的安装路径, 它包含安装共享库的目录列表
例如: 如果您的共享库安装到
PREFIX /lib/foo 和
PREFIX /lib/bar
directories目录,您可以在您的
Makefile 中这样设置:
USE_LDCONFIG= ${PREFIX}/lib/foo ${PREFIX}/lib/bar
请务必仔细检查, 通常这是完全不必要的,
或者可以通过 -rpath 或在连接时设置 LD_RUN_PATH
来避免 (参见 lang/moscow_ml
给出的例子), 或者用一个 shell 封装程序来在执行可执行文件之前设置
LD_LIBRARY_PATH , 类似
www/mozilla 那样。
当在 64-位系统上安装 32-位 的函数库时, 请使用
USE_LDCONFIG32 。
尽量将共享库版本号保持为
libfoo.so.0 这样的格式。
我们的运行环境连接器只会检查主 (第一个) 版本数字。
如果在更新 port 时升级了其库的主版本号,
则其它所有连接了受影响的库的 port 的 PORTREVISION 都应递增,
以强制它们采用新版本的库重新编译。
如果 port 要安装长版本号的共享库,
例如 libfoo.so.0.2.9 , 则 ports
构建基础架构会自动尝试重命名这些文件。 如果需要禁用这一行为, 则应定义
NO_FILTER_SHLIBS 。
Ports 的发行限制
众多协议,并且其中的一些致力于
限制怎样的应用程序能被打包,
是否能用于销售赢利等等。
做为一名porter您有义务去阅读软件的协议
并且确保FreeBSD 项目不必为通过FTP/HTTP
或CD-ROM重新发布源码或编译的二进制而解释
什么。如果有任何疑问,
请联系 &a.ports;。
处于这种情况,就可以设置以下描述
的变量。
NO_PACKAGE (禁止编译结果打包)
这个变量表示我们可能不能生成这个应用
程序的二进制文件。例如,他的协议不允许
二进制文件的再次发行,或者他可能禁止从
补丁过的源代码打包的发行。
不管怎么样,port的 DISTFILES 可以
随意的镜像到FTP/HTTP。除非NO_CDROM
变量也被设置,软件包也可以发行在一张CD-ROM
(或类似的媒介上)。
NO_PACKAGE 也能用在当二进制包
不是非常有用,并且这个应用软件经常要
从源代码编译。例如:当这个应用软件在
编译的时候要在配置信息中指定特定的硬件
代码时,可以设置NO_PACKAGE 。
NO_PACKAGE 应该设置成字符串
来描述为什么这个软件
不能打包。
NO_CDROM (禁止以 CDROM 发行预编译包)
这个变量仅仅指出虽然我们允许
生成二进制包,但也许我们既不能把这个
软件包也不能把port的DISTFILES
放在光盘(或类似的媒介)上销售。但不管怎么样,
二进制包和port的DISTFILES
可以从FTP/HTTP上获得。
如果这个变量和
NO_PACKAGE 一起被设置,
那么这个port的DISTFIELS
将只能从FTP/HTTP上获得。
NO_CDROM 应该被设置成一个字符串
来描述为什么这个port不能重新发布在CD-ROM上。
例如:如果这个port的协议仅仅是用于非商业活动
,那么这个变量就能设置了。
NOFETCHFILES (不自动抓取指定的文件)
在 NOFETCHFILES 变量中定义的文件,
不会自动从
MASTER_SITES 抓取。 一种典型的用例是,
使用来自某个软件供应商提供的 CD-ROM 上的文件。
用于检查在 MASTER_SITES 上是否包含了所需文件的工具,
应忽略这些文件, 而不是报告它们不存在。
RESTRICTED (禁止任何形式的再分发)
如果应用程序既不允许镜像其 DISTFILES ,
也不允许发布其预编译版本的包, 设置它就可以了。
NO_CDROM 或 NO_PACKAGE
不应与 RESTRICTED 同时设置,
因为它包含了这些情形。
RESTRICTED 应设置为一个说明 port 为何不能发布的串。
典型情况可能是由于 port 包含了专有的软件, 因而用户需要自行下载
DISTFILES , 可能是注册或者同意某一
EULA 的条款。
RESTRICTED_FILES (禁止某些文件的再分发)
当设置了 RESTRICTED 或 NO_CDROM
时, 这个变量会默认设置为 ${DISTFILES}
${PATCHFILES} , 否则它会为空。 如果只有某些源码包文件是受限的,
则可以用这个变量来指明它们。
注意, port committer 应该在
/usr/ports/LEGAL 中为每一个源码包文件撰写对应的项目,
并介绍这些限制的原因。
构建机制
make 、 gmake , 以及
imake
如果 port 用到了 GNU make , 应设置
USE_GMAKE=yes 。
用于与 gmake 有关的 port 的变量
变量
意义
USE_GMAKE
此 port 需要使用 gmake
来完成构建过程。
GMAKE
不在 PATH 中时, gmake
的完整路径。
对于 X 应用程序的 port, 如果它使用
imake 根据
Imakefile 文件来生成
Makefile , 则应设置
USE_IMAKE=yes 。 这会使构建过程中的配置
(configure) 阶段自动执行 xmkmf -a 。
如果 -a 标志会给您的 port 带来麻烦, 则需设置
XMKMF=xmkmf 。 如果 port 用到了
imake 但并不使用
install.man target, 则应设置
NO_INSTALL_MANPAGES=yes 。
如果 port 源文件的 Makefile 的主构建
target 是 all 以外的名字,
应对应地设置 ALL_TARGET 。
对于 install 而言, 对应的变量是
INSTALL_TARGET 。
configure 脚本
假如 port 使用 configure 脚本来从
Makefile.in
生成 Makefile 文件, 需要设置
GNU_CONFIGURE=yes 。
如果希望传额外的参数给 configure 脚本
(默认参数为 --prefix=${PREFIX}
${CONFIGURE_TARGET} ),
应通过 CONFIGURE_ARGS 来指定这些参数。
类似地, 可以通过
CONFIGURE_ENV 变量来传递一些环境变量。
如果您的软件包使用 GNU configure ,
而生成的可执行文件命名方式 怪异
如
i386-portbld-freebsd4.7- 应用程序名 ,
则需要更进一步地通过改变
CONFIGURE_TARGET 变量来按照较新版本的
autoconf 生成的脚本所希望的方式指定 target。
其方法是, 紧随 Makefile
中 GNU_CONFIGURE=yes 一行之后加入:
CONFIGURE_TARGET=--build=${MACHINE_ARCH}-portbld-freebsd${OSREL}
用于用到了 configure 脚本的 port 的变量
变量
意义
GNU_CONFIGURE
此 port 需要用 configure 脚本来准备构建。
HAS_CONFIGURE
与 GNU_CONFIGURE 类似,
但默认的 configure target 并不加入
CONFIGURE_ARGS 。
CONFIGURE_ARGS
希望传给
configure 脚本的额外参数。
CONFIGURE_ENV
希望在执行 configure
脚本时设置的环境变量。
CONFIGURE_TARGET
替换默认的 configure target。 其默认值是
${MACHINE_ARCH}-portbld-freebsd${OSREL} 。
使用 scons
如果您的 port 使用 SCons , 就需要定义
USE_SCONS=yes 了。
使用 scons 的 port 会用到的变量
变量
含义
SCONS_ARGS
当前 port 希望传给 SCons
环境的参数。
SCONS_BUILDENV
希望在系统环境中设置的变量。
SCONS_ENV
希望在 SCons 环境中设置的变量。
SCONS_TARGET
传递给 SCons 的最后一个参数, 类似于
MAKE_TARGET 。
利用 GNU autotools
入门
众多 GNU autotools 提供了一种在多重操作系统和机器架构之上构建软件的抽象机制。
在 Ports Collection 中, port 可以通过简单的方法来使用这些工具:
USE_AUTOTOOLS= 工具 :版本 [:操作 ] ...
撰写本书时, 工具 可以设置为
libtool 、 libltdl 、
autoconf 、 autoheader 、
automake 或 aclocal 之一。
版本 用来指定希望使用的工具的特定版本 (参见
devel/{automake,autoconf,libtool}[0-9]+
以了解有效的版本号)。
操作 是一个可选的扩展选项,
用于修改如何使用工具。
可以同时指定多个不同的工具, 可以在一行中指定, 也可以用
Makefile 的 += 结构。
在开始介绍其它工具之前, 需要强调的是, 这些结构只能用于构建 port。
如果希望进行跨平台的开发, 例如在 IDE 中, 则应使用
devel/gnu-{automake,autoconf,libtool} 这些 port。 devel/anjuta 以及 devel/kdevelop (分别对应于 GNOME 和 KDE)
是关于如何做到这一点的良好范例。
libtool
使用 GNU 构建框架的共享库通常会使用
libtool 来调整共享库的编译和安装,
以便与所运行的操作系统相匹配。 通常的做法是使用应用程序所附带的
libtool 副本。
如果需要使用外部的 libtool ,
则可以使用 Ports 套件提供的版本:
USE_AUTOTOOLS= libtool:版本 [:env]
如果不使用额外的操作符,
libtool:版本
表示希望构建框架使用 configure 脚本来对系统所安装的 libtool
进行修补。 这会暗含地定义 GNU_CONFIGURE 。
更进一步, 构建框架还会设置一系列 make 和 shell
变量用于 port 后续的操作。 请参见
bsd.autotools.mk 了解进一步的详情。
如果指定了 :env 操作符, 则表示只设置环境,
而跳过其他的操作。
先前的写法
新的 USE_AUTOTOOLS 结构
USE_LIBTOOL_VER=15
libtool:15
USE_INC_LIBTOOL_VER=15
已不再使用
WANT_LIBTOOL_VER=15
libtool:15:env
最后, LIBTOOLFLAGS 和
LIBTOOLFILES 可以用来替换最常修改的参数, 以及将被
libtool 修补的文件。 多数 port 不需要这样做。
请参见 bsd.autotools.mk 以了解进一步的细节。
libltdl
一些 ports 会使用 libltdl 库,
后者是 libtool 软件包的一部分。
使用这个库并不意味着必须使用
libtool 本身, 因此提供了另一组结构。
USE_AUTOTOOLS= libltdl:版本
目前, 这一设置所做的全部工作是将
LIB_DEPENDS 设置为适当的
libltdl port, 并作为一项方便的功能,
协助开发人员消除在 USE_AUTOTOOLS 框架以外的,
对于 autotools port 的依赖。 这个工具并不提供其它的操作符。
先前的写法
新的 USE_AUTOTOOLS 结构
USE_LIBLTDL=YES
libltdl:15
autoconf 和
autoheader
某些 port 并没有直接提供 configure 脚本, 但包含了作为
autoconf 模板的 configure.ac 文件。
可以用下列设置来要求
autoconf 创建 configure 脚本,
并使用 autoheader 来为 configure
脚本创建模板头文件。
USE_AUTOTOOLS= autoconf:版本 [:env]
以及
USE_AUTOTOOLS= autoheader:版本
上述设置会暗含使用
autoconf:版本 。
对于 libtool , 设置与前面类似。
如果指定可选的 :env 操作符,
则表示只设置用于后续工作的环境。 如果不指定,
则会对 port 进行相应的修补和重新配置。
先前的写法
新的 USE_AUTOTOOLS 结构
USE_AUTOCONF_VER=213
autoconf:213
WANT_AUTOCONF_VER=259
autoconf:259:env
USE_AUTOHEADER_VER=253
autoheader:253 (implies
autoconf:253 )
其它的可选变量, 如
AUTOCONF_ARGS 和
AUTOHEADER_ARGS 可以通过 port 的
Makefile 来显式地指定替换。
类似 libtool , 多数 port 并不需要这样做。
automake 和
aclocal
某些软件包只提供了 Makefile.am
文件。 这些文件必须首先用
automake 转换为
Makefile.in 并使用
configure 来生成实际的
Makefile 。
类似地, 偶尔会有一些软件包不提供构建所需的
aclocal.m4 文件。
这些文件可以通过使用 aclocal
来扫描 configure.ac 或
configure.in 自动生成。
aclocal 与
automake 有和 autoheader
与 autoconf 在前面一节中所介绍的相类似的关系。
aclocal 会暗含使用
automake , 因此:
USE_AUTOTOOLS= automake:版本 [:env ]
和
USE_AUTOTOOLS= aclocal:版本
也自动暗含使用
automake:版本 。
与 libtool 类似,
autoconf 如果使用了可选的
:env 操作符表示仅仅设置用于后续使用的环境,
如果不设置, 则会对 port 进行重新配置。
先前的写法
USE_AUTOTOOLS construct
USE_AUTOMAKE_VER=14
automake:14
WANT_AUTOMAKE_VER=15
automake:15:env
USE_ACLOCAL_VER=19
aclocal:19 (implies
automake:19 )
As with
autoconf 和 autoheader 、
automake 和 aclocal
提供了对应的可选参数变量 AUTOMAKE_ARGS 和
ACLOCAL_ARGS , 如果需要的话,
可以在 port 的 Makefile 中指定。
使用 GNU gettext
基本用法
如果您的 port 需要使用 gettext ,
只要将 USE_GETTEXT 设置为 yes ,
您的 port 就会增加对 devel/gettext 的依赖。
USE_GETTEXT 也可以指定为所需的
libintl 库的版本,
它是 gettext 的基本组成部分,
尽管如此, 强烈建议您不要 使用这个功能:
您的 port 应能与目前版本的
devel/gettext 配合工作。
在 port 中相当常见的情况下, 会需要同时使用
gettext 和 configure 。
一般而言, GNU configure 能够自动定位到 gettext 。
如果它没有成功地完成这项工作, 则可以通过类似下面这样的
CPPFLAGS 和 LDFLAGS 将
gettext 的位置告诉它:
USE_GETTEXT= yes
CPPFLAGS+= -I${LOCALBASE}/include
LDFLAGS+= -L${LOCALBASE}/lib
GNU_CONFIGURE= yes
CONFIGURE_ENV= CPPFLAGS="${CPPFLAGS}" \
LDFLAGS="${LDFLAGS}"
当然, 不需要传参数给 configure 时, 代码可以更为简练:
USE_GETTEXT= yes
GNU_CONFIGURE= yes
CONFIGURE_ENV= CPPFLAGS="-I${LOCALBASE}/include" \
LDFLAGS="-L${LOCALBASE}/lib"
可选用法
一些软件产品提供了禁用 NLS 的能力,
例如, 在 configure 时, 指定
--disable-nls 参数。 如果您 port
的软件支持这种配置, 则应根据 WITHOUT_NLS
的设置来有条件地使用 gettext 。
对于比较简单和不太复杂的 port, 您可以使用下列结构:
GNU_CONFIGURE= yes
.if !defined(WITHOUT_NLS)
USE_GETTEXT= yes
PLIST_SUB+= NLS=""
.else
CONFIGURE_ARGS+= --disable-nls
PLIST_SUB+= NLS="@comment "
.endif
您要做的下一件事是合理地安排装箱单文件,
使其根据用户配置来决定是否将消息编录 (message catalog)
文件放入最终的装箱单。 前面已经介绍了在 Makefile
中所需的写法, 这种做法在 高级
pkg-plist 用法 这节中进行了介绍。
简单地说, 在 pkg-plist
中出现的 %%NLS%% 均会在禁用 NLS 时自动替换为
@comment
,
反之则替换为空串。 这样, 在最终的装箱单中带 %%NLS%% 的行,
在 NLS 关闭的情况下就会变为注释, 反之, 这些前缀就会自动删掉。
现在需要做的事情就是把 %%NLS%% 插到 pkg-plist
中的消息编录文件的那些行开头, 例如:
%%NLS%%share/locale/fr/LC_MESSAGES/foobar.mo
%%NLS%%share/locale/no/LC_MESSAGES/foobar.mo
在比较复杂的情形中, 您可能需要使用更高级的技术, 例如 动态生成装箱单 等。
处理消息编录目录
在安装消息编录文件时还有一个需要注意的地方。 这些文件会放到
LOCALBASE /share/locale
下与语言对应的目录中, 这些目录一般您的 port 不需要创建和删除。
最常用的语言的目录已经在 /etc/mtree/BSD.local.dist
中列出; 也就是说, 它们是基本系统的一部分。 其他一些语言的目录, 则由 devel/gettext 控制。
您最好查看一下 pkg-plist ,
以确定是否正在安装某种不常用语言的文件。
使用 perl
如果 MASTER_SITES 设为
MASTER_SITE_PERL_CPAN , 则应尽量把
MASTER_SITE_SUBDIR 设置为顶级目录的名字。
例如, 对 p5-Module-Name
而言推荐的名字是 Module 。
您可以在 cpan.org
找到顶级目录的名字。 这可以确保在模块的作者发生变化时,
保持 port 继续可用。
以上规则有一个例外, 即对应目录不存在或源码包不在那个目录中时, 允许使用作者的 id 作为
MASTER_SITE_SUBDIR 。
用于用到 perl 的 port 的变量
变量
意义
USE_PERL5
表示 port 将 perl 5 用于构建和运行。
USE_PERL5_BUILD
表示 port 将 perl 5 用于构建。
USE_PERL5_RUN
表示 port 将 perl 5 用于运行。
PERL
perl 5 的完整路径, 可能是系统自带的,
或者从 port 安装, 但没有版本号。 如果您需要在脚本中替换
#!
行, 则应使用这个变量。
PERL_CONFIGURE
采用 Perl 的 MakeMaker 进行配置。 这一变量隐含设置
USE_PERL5 。
PERL_MODBUILD
使用 Module::Build 进行配置、 构建并安装。
这一变量隐含设置 PERL_CONFIGURE 。
只读变量
PERL_VERSION
系统中安装的 perl 的完整版本 (例如,
5.00503 )。
PERL_VER
系统中安装的 perl 的短版本 (例如,
5.005 )。
PERL_LEVEL
系统中安装的 perl 的版本整数值,
其形式为 MNNNPP
(例如, 500503 )。
PERL_ARCH
perl 保存某平台专用的库的位置。
默认值为 ${ARCH}-freebsd 。
PERL_PORT
系统中所安装的 perl port 的名字
(例如, perl5 )。
SITE_PERL
站点专用的
perl package 安装路径。
其值会自动加入到 PLIST_SUB 中。
Perl 模块通常并没有官方网站, 这些 port
应将 cpan.org 作为其
pkg-descr WWW 行的内容。 推荐的 URL 格式为
http://search.cpan.org/dist/Module-Name/
(保留最后的斜线)。
使用 X11
变量定义
用到 X 的 port 可以使用的变量
USE_X_PREFIX
此 port 将文件安装到 X11BASE_REL 而非通常的
PREFIX 。
USE_XLIB
此 port 用到了 X 库。
USE_MOTIF
此 port 使用 Motif 工具包。 这一变量暗含
USE_XPM 设置。
USE_IMAKE
此 port 用到了 imake 。 这一变量也会自动设置
USE_X_PREFIX 。
XMKMF
设置为 xmkmf 的完整路径名, 如果它不在
PATH 中的话。 默认值是 xmkmf
-a 。
用于表示对 X11 某些组件的依赖关系的变量
X_IMAKE_PORT
用以提供 imake 以及许多其它用于构建
X11 的工具的 port。
X_LIBRARIES_PORT
用以提供 X11 库的 port。
X_CLIENTS_PORT
用以提供 X 客户的 port。
X_SERVER_PORT
用以提供 X 服务的 port。
X_FONTSERVER_PORT
用以提供字体服务的 port。
X_PRINTSERVER_PORT
用以提供打印服务的 port。
X_VFBSERVER_PORT
用以提供在虚拟帧缓存服务(virtual framebuffer server) 的 port。
X_NESTSERVER_PORT
用以提供嵌套 X 服务的 port。
X_FONTS_ENCODINGS_PORT
用以为字体提供编码的 port。
X_FONTS_MISC_PORT
用以提供多种位图字体的 port。
X_FONTS_100DPI_PORT
用以提供 100dpi 位图字体的 port。
X_FONTS_75DPI_PORT
用以提供 75dpi 位图字体的 port。
X_FONTS_CYRILLIC_PORT
用以提供西里尔位图字体的 port。
X_FONTS_TTF_PORT
用以提供 &truetype; 字体的 port。
X_FONTS_TYPE1_PORT
用以提供 Type1 字体的 port。
X_MANUALS_PORT
用以提供面向开发人员的联机手册的 port。
在变量中使用与 X11 有关的变量
# 使用 X11 库并依赖字体服务和西里尔字体。
RUN_DEPENDS= ${X11BASE}/bin/xfs:${X_FONTSERVER_PORT} \
${X11BASE}/lib/X11/fonts/cyrillic/crox1c.pcf.gz:${X_FONTS_CYRILLIC_PORT}
USE_XLIB= yes
需要使用 Motif 的 port
如果您的 port 需要 Motif 库, 则应在
Makefile 中定义 USE_MOTIF 。
默认的 Motif 实现是
x11-toolkits/open-motif 。
用户可以通过设置 WANT_LESSTIF 变量来选择
x11-toolkits/lesstif 代替它。
bsd.port.mk 会将 MOTIFLIB
变量设置为到合适的 Motif 库的引用。 请使用补丁将您 port 中
Makefile 或
Imakefile 提到 Motif
库的地方改为 ${MOTIFLIB} 。
有两种比较常见的情况:
如果 port 中将 Motif 在其 Makefile 或
Imakefile 表达为
-lXm , 则简单地将其替换为
${MOTIFLIB} 。
如果 port 在其 Imakefile
中使用 XmClientLibs , 则将其改为
${MOTIFLIB} ${XTOOLLIB}
${XLIB} .
注意 MOTIFLIB (通常) 会展开为
-L/usr/X11R6/lib -lXm 或
/usr/X11R6/lib/libXm.a , 所以不需要在其前加入
-L 或 -l 。
X11 字体
如果 port 将为 X Window 系统安装字体, 将这些字体放到
X11BASE /lib/X11/fonts/local 。
通过 Xvfb 来获得虚拟的 DISPLAY
某些应用程序必须在有可用的 X11 显示的时候才能成功编译。
这会给 FreeBSD 预编译包构建集群带来麻烦, 因为它们是不接显示器的。
通过下面的官方 hack, 预编译包构建集群将启动采用虚拟帧缓存的
X server。 这样, 编译过程将有可用的 DISPLAY 。
.if defined(PACKAGE_BUILDING)
BUILD_DEPENDS+= Xvfb:${X_VFBSERVER_PORT} \
${X11BASE}/lib/X11/fonts/misc/8x13O.pcf.gz:${X_FONTS_MISC_PORT}
.endif
桌面项
通过利用
DESKTOP_ENTRIES 变量,
可以很容易地在您的 port 中创建桌面项 (Freedesktop
标准 )。 这些项会在类似 GNOME 或 KDE
这样的符合这一标准的桌面环境中显示在应用程序菜单中。
这样做会自动创建、 安装 .desktop 文件, 并将其加入
pkg-plist 。 其语法为:
DESKTOP_ENTRIES= "NAME" "COMMENT" "ICON" "COMMAND" "CATEGORY" StartupNotify
您可以在
Freedesktop 网站上 找到可用的分类名称。 StartupNotify
表示应用程序在支持启动通知的环境中清除状态信息。
例子:
DESKTOP_ENTRIES= "ToME" "Roguelike game based on JRR Tolkien's work" \
"${DATADIR}/xtra/graf/tome-128.png" \
"tome -v -g" "Application;Game;RolePlaying" \
false
使用 GNOME
FreeBSD/GNOME 项目组使用一组自己的变量来定义 port
所使用的 GNOME 组件。
这些变量的详细列表
可以在 FreeBSD/GNOME 项目的主页找到。
使用 KDE
用于用到 KDE 的 port 的变量
USE_QT_VER
表示您的 port 使用了 Qt。 可选的值是
1 和
3 ; 它们表示所用的 Qt 的主版本号。
这个变量将自动把 MOC 和
QTCPPFLAGS 默认设置为适当的值。
USE_KDELIBS_VER
表示您的 port 有使用 KDE 库。 可选的值是
3 ; 它表示所用 KDE 的主版本号。
这个变量会自动将 USE_QT_VER
设置为合适的版本。
USE_KDEBASE_VER
表示您的 port 要使用 KDE 基本运行环境。 可选的值是
3 ; 它表示所用 KDE 的主版本号。
这个变量会自动将 USE_KDELIBS_VER
设置为合适的版本。
MOC
设置 moc 的路径。
默认的值, 与 USE_QT_VER
有关。
QTCPPFLAGS
设置用于处理 Qt 代码的 CPPFLAGS 。
默认设置与
USE_QT_VER 的值有关。
使用 Java
变量定义
如果您的 port 需要 Java™ 开发包 (JDK) 来完成构建、
支持运行, 甚至完成解开源代码包这样的工作,
就应该定义 USE_JAVA 。
在 Ports Collection 中有许多不同的 JDK, 它们的版本各不相同,
或是来自不同的供应商。 如果您的 port 必须使用其中的某个特定的版本,
也可以予以定义。 最新的稳定版本是
java/jdk15 。
用到 Java 的 port 可以使用的变量
变量
意义
USE_JAVA
只有定义它才能使其它变量生效。
JAVA_VERSION
用空格分开的适合 port 使用的 Java 版本。
可选的 "+" 可以用于指定某个范围的版本 (可以用:
1.1[+] 1.2[+] 1.3[+] 1.4[+] )。
JAVA_OS
用空格分开的适应 port 的 JDK port 操作系统类型 (可以用: native
linux )。
JAVA_VENDOR
用空格分开的适应 port 的 JDK port 供应商
(可以用: freebsd bsdjava sun ibm
blackdown )。
JAVA_BUILD
设置这个变量表示所选的 JDK port 应被列入 port 的构建依赖关系。
JAVA_RUN
设置这个变量表示所选的 JDK port 应被列入 port 的运行环境依赖关系。
JAVA_EXTRACT
设置这个变量表示所选的 JDK port 应被列入 port 的解压缩支持依赖关系。
USE_JIKES
port 是否应使用
jikes bytecode 编译器进行构建。
如果没有设置, 则 port 将在
jikes 可用的情况下在构建时使用它。
您也可以明确地禁止使用或要求使用
jikes (通过将这个变量设置为 'no'
或 'yes' )。 后一种情形中, devel/jikes 将加入 port 的构建依赖关系。
任何情况下, 如果 jikes
被作为 javac 使用, 则
bsd.java.mk 会定义
HAVE_JIKES 变量。
下面是在设置了 USE_JAVA 之后,
port 能够从系统中获得的配置:
向使用了 Java 的 port 提供的变量
变量
值
JAVA_PORT
JDK port 的名字 (例如
'java/jdk14' )。
JAVA_PORT_VERSION
JDK port 的完整版本 (例如
'1.4.2' )。 如果您只需要版本号的前两位, 则可用
${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/} 。
JAVA_PORT_OS
所用 JDK port 的操作系统 (例如
'linux' )。
JAVA_PORT_VENDOR
所用 JDK port 的供应商 (例如
'sun' )。
JAVA_PORT_OS_DESCRIPTION
所用 JDK port 操作系统的描述
(例如 'Linux' )。
JAVA_PORT_VENDOR_DESCRIPTION
所用 JDK port 供应商的描述 (例如
'FreeBSD Foundation' )。
JAVA_HOME
JDK 的安装目录 (例如
'/usr/local/jdk1.3.1' )。
JAVAC
所用 Java 编译器的完整路径 (例如
'/usr/local/jdk1.1.8/bin/javac' 或
'/usr/local/bin/jikes' )。
JAR
所用 jar 工具的完整路径 (例如
'/usr/local/jdk1.2.2/bin/jar' 或
'/usr/local/bin/fastjar' )。
APPLETVIEWER
所用 appletviewer 工具的完整路径 (例如
'/usr/local/linux-jdk1.2.2/bin/appletviewer' )。
JAVA
所用 java 执行文件的完整路径。
您应使用它来执行 Java 程序 (例如
'/usr/local/jdk1.3.1/bin/java' )。
JAVADOC
所用 javadoc 工具的完整路径。
JAVAH
所用 javah 程序的完整路径。
JAVAP
所用 javap 程序的完整路径。
JAVA_KEYTOOL
所用 keytool 工具的完整路径。
只有当 JDK 是 Java 1.2 或更高版本时才可用。
JAVA_N2A
所用 native2ascii 工具的完整路径。
JAVA_POLICYTOOL
所用 policytool 程序的完整路径。
只有当 JDK 是 Java 1.2 或更高版本时才可用。
JAVA_SERIALVER
所用 serialver 程序的完整路径。
RMIC
所用 RMI 桩/架 生成器,
rmic 的完整路径。
RMIREGISTRY
所用 RMI 注册表程序,
rmiregistry 的完整路径。
RMID
所用 RMI 服务程序 rmid 的完整路径。
只有当 JDK 是 Java 1.2 或更高版本时才可用。
JAVA_CLASSES
所用 JDK 类文件目录的完整路径。
对 JDK 1.2 和更高版本的环境而言, 这应该是
${JAVA_HOME}/jre/lib/rt.jar 。 更早版本的
JDK 则使用
${JAVA_HOME}/lib/classes.zip 。
HAVE_JIKES
随 jikes 是否将被应用于 port
的构建过程而定 (参见前述 USE_JIKES )。
您可以使用 java-debug make target
以获取用于调试 port 的信息。 大多数前述变量的值皆会予以呈现。
此外, 还会定义下述常量, 以确保所有的
Java port 均以一致之方式安装:
为使用 Java 的 port 定义的常量
常量
值
JAVASHAREDIR
所有 Java 相关资料的安装根目录。
默认值: ${PREFIX}/share/java .
JAVAJARDIR
用以安装 JAR 文件的目录。 默认值:
${JAVASHAREDIR}/classes 。
JAVALIBDIR
其它 port 安装的 JAR 文件所在的目录。 默认值:
${LOCALBASE}/share/java/classes 。
相关的项也会定义在
PLIST_SUB (在
中进行介绍) 和
SUB_LIST 中。
采用 Ant 进行构建
如果 port 采用 Apache Ant 进行构建,
则需要定义 USE_ANT 。 如是, 则 Ant
将作为 子-make 命令来使用。 如果 port 未定义 do-build
target, 则将默认依 MAKE_ENV 、
MAKE_ARGS 和 ALL_TARGETS .
的设置执行 Ant。 这类似于 中介绍的关于
USE_GMAKE 的机制。
若 jikes 被作为
javac 使用 (参见 中的
USE_JIKES ), 则 Ant 会自动将其用于 port 的构建过程。
最佳实践
如果您正移植某个 Java 库, 您的 port 应把
JAR 文件安装到 ${JAVAJARDIR} , 而其它文件则应放在
${JAVASHAREDIR}/${PORTNAME} 下
(除了文档, 参见下文)。 要减少打包文件的尺寸,
您可以直接在 Makefile 中引用这些 JAR 文件,
具体做法是使用下面的语句 (此处的 myport.jar
是作为 port 一部分安装的 JAR 文件的名字):
PLIST_FILES+= %%JAVAJARDIR%%/myport.jar
移植 Java 应用程序时, port 通常会希望将所有文件安装到同一目录
(包括其依赖的 JAR)。 这时强烈建议使用
${JAVASHAREDIR}/${PORTNAME} 。
移植软件的开发人员, 可以自行决定是否将所依赖的其它 JAR 安装到此目录,
或直接使用已经装好的那些
(来自 ${JAVAJARDIR} )。
无论您正制作哪一类的 port (库或者应用程序),
附加的文档都应安装到和其它 port
同样的位置。
已经知道, JavaDoc 会根据 JDK 版本的不同而产生不同的文件。
对于那些不打算强制使用某一特定版本 JDK 的 port 而言,
这无疑提高了制作装箱单
(pkg-plist ) 的难度。 这是为什么强烈建议使用
PORTDOCS 宏的原因。 更进一步, 即使您能够预测
javadoc 将要生成的文件, 所需的
pkg-plist 的尺寸, 也是鼓吹使用
PORTDOCS 的一大理由。
DATADIR 的默认值是
${PREFIX}/share/${PORTNAME} 。
对 Java port 而言将 DATADIR 改为
${JAVASHAREDIR}/${PORTNAME} 是一个好主意。
当然, DATADIR 会自动加到
PLIST_SUB 中 (在 有所介绍) 因此您可以在
pkg-plist 中直接使用
%%DATADIR%% 。
撰写本文时, 对是应该从源代码构建, 还是直接安装预编译的
Java ports 安装包并没有明确的规定。 尽管如此, &os; Java Project
的开发人员仍鼓励移植软件的开发者在不麻烦的情况下尽可能从源代码完成构建。
本节中所介绍的全部特性, 均是在 bsd.java.mk
中实现的。 如果您感觉自己的 port 需要更为复杂的 Java 支持,
请首先参阅
bsd.java.mk CVS 日志 , 因为通常撰文介绍最新特性需要一些时间。
此外, 如果您认为所缺少的支持对许多其它 Java port 亦属有益,
请在 &a.java; 对其进行讨论。
在 PR 中的 java 类别,
主要是用于 &os; Java project 移植 JDK 本身之用。
因而, 提交您的 Java port 时, 应归入
ports 类别, 除非您正尝试解决的问题是 JDK
实现本身或 bsd.java.mk 的。
类似地, 您应参考 中所详述的关于
CATEGORIES 在 Java port 中的使用规则。
使用 Apache 和 PHP
Apache
用到 Apache 的 port 可以使用的变量
USE_APACHE
此 port 需要 Apache。 可用的值:
yes (任意可用版本)、
1.3 、 2.0 、
2.2 、 2.0+ 、
等等。 默认依赖的版本是
1.3 。
WITH_APACHE2
此 port 需要 Apache 2.0。 如果没有这个变量,
则 port 将依赖 Apache 1.3。 这一变量目前已经过时,
因而不应继续使用。
APXS
到 apxs 可执行文件的完整路径。
您可以在 port 中替代该值。
HTTPD
到 httpd 可执行文件的完整路径。
您可以在 port 中替代该值。
APACHE_VERSION
目前系统中安装的 Apache 版本 (只读变量)。
这一变量只有在引用了 bsd.port.pre.mk
之后才能使用, 其可能的值为:
13 、 20 、
22 。
APACHEMODDIR
Apache 模块所在的文件夹。 在 pkg-plist 中,
这一变量会自动展开。
APACHEINCLUDEDIR
Apache 头文件所在的文件夹。 在 pkg-plist 中,
这一变量会自动展开。
APACHEETCDIR
Apache 配置文件所在的文件夹。 在 pkg-plist 中,
这一变量会自动展开。
在移植 Apache 模块时比较有用的变量
MODULENAME
模块的名称。 默认值为
PORTNAME 。 例如:
mod_hello
SHORTMODNAME
模块的简略名字。 默认情况下会自动根据
MODULENAME 计算, 但您也可以自行设置值来替代它。
例如: hello
AP_FAST_BUILD
使用 apxs 来编译和安装模块。
AP_GENPLIST
同时自动创建
pkg-plist 。
AP_INC
在编译过程中, 将指定的目录加入到搜索头文件的目录中。
AP_LIB
在编译过程中, 将指定的目录加入到搜索函数库的目录中。
AP_EXTRAS
传递给
apxs 的额外参数。
Web 应用程序应安装到
PREFIX /www/应用程序的名字
并且不应假定 Apache 的存在, 除非它们必须使用 Apache。
用户可能会希望运行 Apache 以外的其它 Web 服务器。
PHP
用到 PHP 的 port 中可以使用的变量
USE_PHP
此 port 需要 PHP。 取值为 yes
将把 PHP 加入依赖关系。 此外, 还可以在此指定将所需要的 PHP
扩展模块。 例如: pcre xml
gettext
DEFAULT_PHP_VER
选择在没有安装 PHP 时自动安装的 PHP 主版本。 默认是
4 。 可选 4 、
5 之一。
IGNORE_WITH_PHP
此 port 无法与给定版本的 PHP 一同工作。
可选值为 4 、
5 之一。
USE_PHPIZE
此 port 将作为 PHP 扩展模块进行构建。
USE_PHPEXT
此 port 将作为 PHP 扩展,
且需要作为扩展模块注册。
USE_PHP_BUILD
构建依赖于 PHP。
WANT_PHP_CLI
希望使用 CLI (命令行) 版本的 PHP。
WANT_PHP_CGI
希望使用 CGI 版本的 PHP。
WANT_PHP_MOD
希望使用 Apache 模块版本的 PHP。
WANT_PHP_SCR
希望使用 CLI 或 CGI 版本的 PHP。
WANT_PHP_WEB
希望使用 Apache 模块或 CGI 版本的 PHP。
PEAR 模块
移植 PEAR 模块的过程非常简单。
使用 FILES 、
TESTS 、 DATA 、
SQLS 、 SCRIPTFILES 、
DOCS 以及 EXAMPLES
这些变量来指明您希望安装的文件。
所有这里列出的文件都会自动安装到合适的位置, 并加入
pkg-plist 。
在 Makefile 文件的最后一行引入
${PORTSDIR}/devel/pear/bsd.pear.mk 。
用于 PEAR 类的 Makefile 例子
PORTNAME= Date
PORTVERSION= 1.4.3
CATEGORIES= devel www pear
MAINTAINER= example@domain.com
COMMENT= PEAR Date and Time Zone Classes
BUILD_DEPENDS= ${PEARDIR}/PEAR.php:${PORTSDIR}/devel/pear-PEAR
RUN_DEPENDS= ${BUILD_DEPENDS}
FILES= Date.php Date/Calc.php Date/Human.php Date/Span.php \
Date/TimeZone.php
TESTS= test_calc.php test_date_methods_span.php testunit.php \
testunit_date.php testunit_date_span.php wknotest.txt \
bug674.php bug727_1.php bug727_2.php bug727_3.php \
bug727_4.php bug967.php weeksinmonth_4_monday.txt \
weeksinmonth_4_sunday.txt weeksinmonth_rdm_monday.txt \
weeksinmonth_rdm_sunday.txt
DOCS= TODO
_DOCSDIR= .
.include <bsd.port.pre.mk>
.include "${PORTSDIR}/devel/pear/bsd.pear.mk"
.include <bsd.port.post.mk>
使用 Python
对用到 Python 的 port 最有用的一些变量
USE_PYTHON
此 port 需要 Python。 可以用
2.3+ 这样的形式来指定所希望的版本。
除此之外, 也可以用横线来分隔两个版本号,
以表示某个范围的版本, 例如: 2.1-2.3
USE_PYDISTUTILS
使用 Python distutils 来完成配置、 编译和安装。 对包含
setup.py 的 port 而言这是必需的。
它会自动覆盖默认的
do-build 以及
do-install 这两个 target。 如未定义
GNU_CONFIGURE ,
它还会改变 do-configure 。
PYTHON_PKGNAMEPREFIX
作为 PKGNAMEPREFIX 来区分不同 Python
版本的 package。 例如: py24-
PYTHON_SITELIBDIR
全站 package 所在的目录, 它包括了 Python
的安装目录 (通常是 LOCALBASE )。
在安装 Python 模块时, PYTHON_SITELIBDIR
变量会非常有用。
PYTHONPREFIX_SITELIBDIR
去掉了 PREFIX 部分的 PYTHON_SITELIBDIR。 应尽可能在
pkg-plist 中使用
%%PYTHON_SITELIBDIR%% 。
%%PYTHON_SITELIBDIR%% 的默认值是
lib/python%%PYTHON_VERSION%%/site-packages
PYTHON_CMD
Python 解释器的命令行, 包括版本号。
PYNUMERIC
将数值处理扩展模块加入依赖关系。
PYXML
将 XML 扩展模块加入依赖关系。 (对于
Python 2.0 和更高版本不再需要, 因为它已经成为了标准组件)。
USE_TWISTED
将 twistedCore 加入依赖关系。
也可以用这个变量指定所需的组件,
例如: web lore pair
flow
USE_ZOPE
加入对 Zope, 一种 web 应用平台的依赖。
这会把 Python 依赖改为 Python 2.3。 此外
ZOPEBASEDIR 也会自动设为
Zope 安装目录的位置。
完整的可用变量列表, 可以在
/usr/ports/Mk/bsd.python.mk
中找到。
使用 Emacs
本节尚有待撰写。
使用 Ruby
使用 Ruby 的 port 可以使用的变量
变量
说明
USE_RUBY
此 port 需要 Ruby。
USE_RUBY_EXTCONF
此 port 使用 extconf.rb
来完成配置。
USE_RUBY_SETUP
此 port 使用 setup.rb
来完成配置。
RUBY_SETUP
将此变量名设置为所用的
setup.rb 的文件名。 通常会是
install.rb 。
下表展示了 ports 系统提供给 port 作者的一些变量。
您应使用这些变量, 以便把文件装到合适的位置。 请尽可能多地在
pkg-plist 中使用它们。 这些变量不应在 port
中重新定义。
使用 Ruby 的 port 中的一些可用的只读变量
变量
说明
示范值
RUBY_PKGNAMEPREFIX
作为 PKGNAMEPREFIX 以区分用于不同
Ruby 版本的 package。
ruby18-
RUBY_VERSION
x.y.z 形式的完整 ruby 版本。
1.8.2
RUBY_SITELIBDIR
平台无关库的安装路径。
/usr/local/lib/ruby/site_ruby/1.8
RUBY_SITEARCHLIBDIR
平台相关的库的安装路径。
/usr/local/lib/ruby/site_ruby/1.8/amd64-freebsd6
RUBY_MODDOCDIR
模块文档的安装路径。
/usr/local/share/doc/ruby18/patsy
RUBY_MODEXAMPLESDIR
模块用例的安装路径。
/usr/local/share/examples/ruby18/patsy
可用变量的完整列表, 可以在
/usr/ports/Mk/bsd.ruby.mk 中找到。
使用 SDL
变量 USE_SDL 可以用于自动配置 port
的依赖关系, 以适应使用类似
devel/sdl12 和
x11-toolkits/sdl_gui
这些依赖 SDL 的库的情形。
目前系统能够识别下列 SDL 库:
sdl: devel/sdl12
gfx: graphics/sdl_gfx
gui: x11-toolkits/sdl_gui
image: graphics/sdl_image
ldbad: devel/sdl_ldbad
mixer: audio/sdl_mixer
mm: devel/sdlmm
net: net/sdl_net
sound: audio/sdl_sound
ttf: graphics/sdl_ttf
因此, 如果 port 需要依赖
net/sdl_net 和
audio/sdl_mixer ,
则对应的写法将是:
USE_SDL= net mixer
同时, net/sdl_net 和
audio/sdl_mixer 所依赖的
devel/sdl12 也会被自动地加入。
加入您使用 USE_SDL , 它将自动地:
将对于 sdl12-config 的依赖关系加入到
BUILD_DEPENDS
将变量 SDL_CONFIG 加入到
CONFIGURE_ENV
将对所选的库的依赖, 加入到
LIB_DEPENDS
要检查某个特定的 SDL 库是否可用,
可以通过 WANT_SDL 变量来达到目的:
WANT_SDL=yes
.include <bsd.port.pre.mk>
.if ${HAVE_SDL:Mmixer}!=""
USE_SDL+= mixer
.endif
.include <bsd.port.post.mk>
使用 wxWidgets
这一节介绍了在 ports tree 中的
wxWidgets 库的现状,
以及它与 ports 系统的集成。
介绍
许多不同版本的
wxWidgets 库之间是存在相互冲突的 (它们会安装同名的文件)
在 ports 系统中, 这一问题是通过将不同的版本以包含版本号后缀的名字安装来解决的。
这样做的一个最明显的缺点是, 应用程序必须进行修改, 才能找到所希望的版本。
幸运的是, 多数应用程序会调用 wx-config 脚本来确定需要的编译器和连接器选项。
这个脚本会随可用的版本不同而有不同的名字。 主要的应用程序都会尊重环境变量的配置,
或提供一个 configure 参数, 用以指定调用哪个 wx-config 。
如果不是这样的话, 就需要对应用程序打补丁了。
版本的选择
为了让您的 port 使用指定版本的
wxWidgets , 可以定义两个变量 (如果只定义了一个,
则另一个会取默认值):
用于选择 wxWidgets
版本的变量
变量
说明
默认值
USE_WX
列出这个 port 能使用的版本
全部版本
USE_WX_NOT
列出这个 port 不能使用的版本
无
下面是可用的
wxWidgets 版本, 以及对应的
ports:
可用的 wxWidgets
versions
版本
Port
2.4
x11-toolkits/wxgtk24
2.6
x11-toolkits/wxgtk26
2.6 版也提供了一个 Unicode
版本, 这个版本可以通过 slave port x11-toolkits/wxgtk26-unicode 来安装,
但这也是通过变量来指定的 (参见 )。
在 中的变量,
可以设为下列值或由空格分隔的组合:
wxWidgets 版本
说明
例子
单个版本
2.4
某版本以上版本
2.4+
某版本以下版本
2.6-
某段版本 (版本号较小的必须在前)
2.4-2.6
除此之外, 还有一些用以从可用的本那本中选择所希望的版本的变量。
这种变量也可以设为一组版本, 而靠前的版本的优先级更高。
用于选择希望的版本的
wxWidgets versions
变量名
用于
WANT_WX_VER
port
WITH_WX_VER
用户
选择组件
也有一些其他应用, 尽管它们本身并不是
wxWidgets 库, 但却与之相关。
这些应用程序可以在
WX_COMPS 变量中使用, 以下是可用的组件:
可用的 wxWidgets
组件
名称
说明
版本限制
wx
主库
无
contrib
第三方库
无
python
wxPython
(Python 绑定)
无
mozilla
wxMozilla
2.4
svg
wxSVG
2.6
您可以为每个依赖的组件, 通过冒号分隔的后缀指定其类型。
如果没有指定, 则会使用默认的依赖类型 (参见 )。
下面是可用的类型:
可用的 wxWidgets 依赖类型
名称
说明
build
联编时需要该组件, 相当于
BUILD_DEPENDS
run
运行时需要该组件, 相当于
RUN_DEPENDS
lib
联编和运行时均需要该组件,
相当于 LIB_DEPENDS
组件的默认依赖关系类型, 如下表所示:
默认的 wxWidgets 依赖关系类型
组件
依赖关系类型
wx
lib
contrib
lib
python
run
mozilla
lib
svg
lib
选择 wxWidgets
组件
下面的片段展示了使用
wxWidgets 版本
2.4 及第三方库的方法。
USE_WX= 2.4
WX_COMPS= wx contrib
Unicode
wxWidgets 库从其 2.5
版开始支持 Unicode 了。 在 ports 系统中, 这两种版本均有提供,
并可以通过下列变量来选择:
用以在 Unicode 版本的
wxWidgets
的变量
变量
说明
作用
WX_UNICODE
该 port 只能 配合
Unicode 版本使用
port
WANT_UNICODE
port 能够与两种版本配合使用, 但希望使用
Unicode 版本
port
WITH_UNICODE
令 port 使用 Unicode 版本
用户
WITHOUT_UNICODE
令 port 使用普通版本,
如果支持的话 (即未定义 WX_UNICODE )
用户
如果 port 同时支持 Unicode 和普通版本,
请不要使用 WX_UNICODE 。 如果希望默认启用
Unicode, 应定义 WANT_UNICODE 。
检测已安装的版本
要检测系统中安装的版本, 就需要定义
WANT_WX 。 如果没有将其设置为特定的版本,
则组件将包含版本后缀。
HAVE_WX 变量在检测完成后会自动填入内容。
检测已安装的 wxWidgets
版本和组件
下面的片段可以在安装
wxWidgets 的系统中令 port 使用它,
反之则作为一项选项提供。
WANT_WX= yes
.include <bsd.port.pre.mk>
.if defined(WITH_WX) || ${HAVE_WX:Mwx-2.4} != ""
USE_WX= 2.4
CONFIGURE_ARGS+=--enable-wx
.endif
下面的片段在系统中有安装过时启用
wxPython 支持,
或在没有安装时作为选项提供; 对
wxWidgets 也是如此办理, 版本皆为
2.6 。
USE_WX= 2.6
WX_COMPS= wx
WANT_WX= 2.6
.include <bsd.port.pre.mk>
.if defined(WITH_WXPYTHON) || ${HAVE_WX:Mpython} != ""
WX_COMPS+= python
CONFIGURE_ARGS+=--enable-wxpython
.endif
定义的变量
以下是一些可以在 port 中使用的变量
(这之前需要定义 中的至少一个变量)。
为使用
wxWidgets 的 port 定义的变量
变量名
说明
WX_CONFIG
到 wxWidgets
wx-config 脚本的路径 (名字会随版本不同而不同)
WXRC_CMD
到 wxWidgets
wxrc 程序的路径 (名字会随版本不同而不同)
WX_VERSION
将要用到的 wxWidgets 版本
(例如, 2.6 )
WX_UNICODE
如果没有定义, 而将会使用 Unicode 时, 系统将自动定义此变量。
在 bsd.port.pre.mk 中进行处理
如果您需要在引用了 bsd.port.pre.mk 之后立即对一些变量进行处理,
则需要定义 WX_PREMK 。
如果定义了 WX_PREMK , 则在此
之后 定义的依赖关系、 组件和变量将不会生效,
您在引用 bsd.port.pre.mk
之前的 wxWidgets port 变量将直接起作用。
在命令中使用 wxWidgets 变量
下面的片段以执行
wx-config 脚本来得到完整的版本号,
将其赋值到变量中, 并传递给一个程序举例说明了
WX_PREMK 的用法。
USE_WX= 2.4
WX_PREMK= yes
.include <bsd.port.pre.mk>
.if exists(${WX_CONFIG})
VER_STR!= ${WX_CONFIG} --release
PLIST_SUB+= VERSION="${VER_STR}"
.endif
在 target 中的 wxWidgets 变量可以直接使用,
而无需 WX_PREMK 的参与。
+
+
+ 额外的 configure 参数
+
+ 某些 GNU configure 脚本在只设置了
+ WX_CONFIG 环境变量时, 无法自动找到
+ wxWidgets , 而需要使用额外的参数来加以指定。
+ 您可以使用 WX_CONF_ARGS 变量来给出这些参数。
+
+
+ 可用于 WX_CONF_ARGS 的值
+
+
+
+
+ 可用值
+
+ 结果
+
+
+
+
+
+ absolute
+
+ --with-wx-config=${WX_CONFIG}
+
+
+
+ relative
+
+ --with-wx=${X11BASE}
+ --with-wx-config=${WX_CONFIG:T}
+
+
+
+
+
使用 Lua
这一节描述了在 ports 系统中的
Lua 库的现状, 以及它与 ports 系统的集成。
介绍
许多不同版本的 Lua
库和相关的解释器之间是相互冲突的 (它们会安装同名的文件)。
在 ports 系统中, 这一问题是通过将不同版本的文件以不同的版本号作为后缀名解决的。
这样做最大的一个问题是, 每个程序都需要进行修改才能找到它所需要的版本。
不过, 通过将适当的参数传给编译器和连接器很容易解决这个问题。
选择版本
要让您的 port 使用指定版本的
Lua ,
可以定义两个变量的值 (如果只定义了其中的一个, 则另一个会使用默认值):
用于选择 Lua
版本的变量
变量
说明
默认值
USE_LUA
port 能够使用的 Lua 版本列表
全部可用版本
USE_LUA_NOT
与 port 不兼容的版本列表
无
下面是目前 ports 系统提供的可用
Lua 版本和对应的目录:
可用的 Lua 版本
版本
Port
4.0
lang/lua4
5.0
lang/lua50
5.1
lang/lua
在 中的变量,
可以设置为下面的版本之一, 或用空格分隔的若干版本:
指定 Lua 版本
说明
例子
一个版本
4.0
某个版本或更高版本
5.0+
不高于某个版本
5.0-
版本范围 (低版本必须在前)
5.0-5.1
除此之外, 也有一些用来从可用版本中选择推荐版本的其它变量。 这些变量也可以设置为一组版本,
而前面的版本优先级较高。
用于选择推荐 Lua
版本的变量
变量名
用于
WANT_LUA_VER
port
WITH_LUA_VER
用户
选择 Lua 版本
下面是一个用到
Lua 版本 5.0 或
5.1 , 并默认使用 5.0
的 port 的片段。 这个默认值可以通过
WITH_LUA_VER 来另外指定。
USE_LUA= 5.0-5.1
WANT_LUA_VER= 5.0
组件的选择
也有一些其它的应用, 尽管本身并不是
Lua 库, 但却与它们相关。
这些应用可以通过 LUA_COMPS
变量来指定。 可用的组件如下:
可用的 Lua 组件
名字
说明
版本限制
lua
主库
无
tolua
用于访问 C/C++ 代码的库
4.0-5.0
ruby
Ruby 绑定
4.0-5.0
还有一些其它的组件, 但这些组件是由解释器,
而不是由应用程序使用的 (也就是不被其它模块使用)。
每个组件的依赖关系类型可以通过手工添加分隔符为冒号的后缀来指定。
如果不指定, 则会采用默认类型 (请参见 )。
以下是可用的依赖关系类型:
可用的 Lua 依赖关系类型
名字
说明
build
这个组件是联编过程所必需的, 相当于
BUILD_DEPENDS
run
在运行时需要这个组件, 相当于
RUN_DEPENDS
lib
这个组件在联编和运行时都需要,
相当于 LIB_DEPENDS
组件的默认依赖关系类型如下:
默认的 Lua 依赖关系类型
组件
依赖关系类型
lua
对于 4.0-5.0 是 lib
(动态连接) 而对于 5.1 则是
build (静态连接)
tolua
build (静态连接)
ruby
lib (动态连接)
选择 Lua 组件
下面是一个使用了
Lua 版本 4.0
及其 Ruby 绑定的 port 片段。
USE_LUA= 4.0
LUA_COMPS= lua ruby
检测系统中已安装的版本
要检测系统中已安装的版本, 您必须定义
WANT_LUA 。 如果没有将其设定为具体的版本,
则组件会包含版本后缀。 在检测之后,
HAVE_LUA 变量将设为检测到的版本。
检测已安装的 Lua 版本和组件
下面是一个如果系统中有安装
Lua 或选择了选项时使用它的 port 片段。
WANT_LUA= yes
.include <bsd.port.pre.mk>
.if defined(WITH_LUA5) || ${HAVE_LUA:Mlua-5.[01]} != ""
USE_LUA= 5.0-5.1
CONFIGURE_ARGS+=--enable-lua5
.endif
下面的这段 port 在系统中已经有安装, 或用户选择了
tolua 和
Lua 支持时加以安装, 版本均选择
4.0 。
USE_LUA= 4.0
LUA_COMPS= lua
WANT_LUA= 4.0
.include <bsd.port.pre.mk>
.if defined(WITH_TOLUA) || ${HAVE_LUA:Mtolua} != ""
LUA_COMPS+= tolua
CONFIGURE_ARGS+=--enable-tolua
.endif
定义的变量
在 port 中可以使用下列变量 (在定义了
中至少一个变量之后)。
为用到
Lua 的 port 定义的变量
变量名
说明
LUA_VER
将要使用的 Lua 版本。
(例如, 5.1 )
LUA_VER_SH
Lua 动态连接库的主版本
(例如, 1 )
LUA_VER_STR
不带点的 Lua 版本
(例如, 51 )
LUA_PREFIX
安装 Lua (及其组件) 使用的后缀
LUA_SUBDIR
在 ${PREFIX}/bin 、
${PREFIX}/share 和
${PREFIX}/lib 中用于安装
Lua 的子目录
LUA_INCDIR
用以安装 Lua 和
tolua 头文件的目录
LUA_LIBDIR
用以安装 Lua 和
tolua 库文件的目录
LUA_MODLIBDIR
用以安装 Lua
模块动态连接库 (.so ) 的目录
LUA_MODSHAREDIR
用以安装 Lua
模块 (.lua ) 的目录
LUA_PKGNAMEPREFIX
Lua 模块包的后缀名
LUA_CMD
到 Lua
解释器的路径
LUAC_CMD
到 Lua
编译器的路径
TOLUA_CMD
到 tolua
程序的路径
告诉 port 到什么地方去找
Lua
下面的 port 片段展示了如何告诉使用的
configure 脚本去什么地方查找 Lua
的头文件和库文件。
USE_LUA= 4.0
GNU_CONFIGURE= yes
CONFIGURE_ENV= CPPFLAGS="-I${LUA_INCDIR}" LDFLAGS="-L${LUA_LIBDIR}"
在 bsd.port.pre.mk 时进行处理
如果您需要在使用引用 bsd.port.pre.mk 之后就得到变量,
以便将其用于执行一些命令, 需要定义 LUA_PREMK 。
如果您定义了 LUA_PREMK , 则在您引用
bsd.port.pre.mk 之后 ,
即使修改了 Lua port 变量,
版本和依赖关系也都不会随之发生变化了。
在命令中使用 Lua 变量
下面的片段展示了如何利用
LUA_PREMK , 并运行
Lua 解释器得到完整的版本串,
将其赋值给一个变量, 并传递给程序。
USE_LUA= 5.0
LUA_PREMK= yes
.include <bsd.port.pre.mk>
.if exists(${LUA_CMD})
VER_STR!= ${LUA_CMD} -v
CFLAGS+= -DLUA_VERSION_STRING="${VER_STR}"
.endif
在 target 中的 Lua 变量可以在命令中安全的使用,
而无需使用
LUA_PREMK 。
启动和停止服务 (rc 脚本)
rc.d 脚本在系统启动时用于启动服务,
并为管理员提供停止、 启动和重新启动某个服务的标准方法。 Ports
安装的脚本会集成到系统的 rc.d 框架中。
关于如何使用它的说明, 可以在
使用手册的 rc.d
章节 找到。 关于可用命令的详细解释, 则可以在
&man.rc.8; 和 &man.rc.subr.8; 找到。 最后, 您可以参阅
这篇文章
了解撰写 rc.d 脚本的最佳实践。
可以安装一或多个 rc 脚本:
USE_RC_SUBR= doormand
这些脚本必须放到 files
目录, 并附加 .in 。
与基本系统中的 rc.d 脚本不同, 这种脚本中
. /etc/rc.subr 行必须替换为
. %%RC_SUBR%% , 因为较早版本的 &os;
中并不提供 /etc/rc.subr 文件。 此外,
这里还可以使用标准的
SUB_LIST 替换展开。 除此之外,
我们还强烈推荐使用 %%PREFIX%% 、
%%LOCALBASE%% , 以及
%%X11BASE%% 这几个替换展开。 关于
SUB_LIST 的介绍可以在 本书的相关章节 找到。
在 &os; 6.1-RELEASE 之前, 与 &man.rcorder.8; 的集成是通过
USE_RCORDER 而不是
USE_RC_SUBR 来完成的。 但是,
这种方法已经被淘汰。
从 &os; 6.1-RELEASE 开始, 本地安装的 rc.d
脚本 (包括由 port 安装的脚本) 会纳入基本系统的 &man.rcorder.8;。
以下是一个简单的 rc.d 脚本:
#!/bin/sh
# PROVIDE: doormand
# REQUIRE: LOGIN
#
# 在 /etc/rc.conf.local 或 /etc/rc.conf 中增加下述设置可以启用这一服务:
#
# doormand_enable (bool): 默认设为 NO。
# 设为 YES 可以启用 doormand。
# doormand_config (path): 默认设为 %%PREFIX%%/etc/doormand/doormand.cf。
#
. %%RC_SUBR%%
name="doormand"
rcvar=${name}_enable
command=%%PREFIX%%/sbin/${name}
pidfile=/var/run/${name}.pid
load_rc_config $name
: ${doormand_enable="NO"}
: ${doormand_config="%%PREFIX%%/etc/doormand/doormand.cf"}
command_args="-p $pidfile -f $doormand_config"
run_rc_command "$1"
这里, 对变量的默认赋值方法应采用 "=",
而非 ":=" 这样的形式。 这是因为,
前一种赋值方法只有在变量未被设置时才设置默认值,
而后一种方法则会在变量没有设置,
或者 其值为空时都设置默认值。
用户非常可能在其
rc.conf.local 中使用类似
doormand_flags="" 这样的设置,
而采用 ":=" 来进行赋值,
则会在不经意间覆盖用户所希望的设置。
高级 pkg-plist 用法
根据 make 变量对 pkg-plist 进行修改
某些 port, 特别是 p5- port,
会需要根据配置选项 (或对于 p5- port 而言,
perl 的版本) 来修改它们的 pkg-plist 。
为简化这一工作, 在
pkg-plist 中的 %%OSREL%% 、
%%PERL_VER%% , 以及
%%PERL_VERSION%% 将自动进行相应的替换。
其中, %%OSREL%% 的值是操作系统以数值表示的版本 (例如
4.9 )。 %%PERL_VERSION%%
则是 perl 的完整版本号 (例如
5.00502 ) 而 %%PERL_VER%%
是 perl 的版本去掉 patchlevel
的部分 (例如 5.005 )。 许多其它与 port 文档文件有关的
%%变量 %% 在 相应章节 中进行了介绍。
如果您还需要进行其它的替换, 可以通过将
PLIST_SUB 变量设置为一组
变量 =值
对来实现。 其中, %%VAR %%
表示在 pkg-plist 中将被
值 替换的那些文字。
举例来说, 如果 port 需要把很多文件放到和版本有关的目录中,
可以在 Makefile 中按照类似下面的例子:
OCTAVE_VERSION= 2.0.13
PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}
并在 pkg-plist 中将具体的版本替换为
%%OCTAVE_VERSION%% 。 这样, 在升级 port 时,
就不需要再到 pkg-plist 中修改那几十 (或者,
有时甚至是上百) 行的内容了。
这一替换过程 (以及加入 联机手册 的过程),
会在 pre-install 和
do-install 两个 target 之间, 通过读取
PLIST 并写入
TMPPLIST
(默认情况下, 是:
WRKDIR /.PLIST.mktmp ) 来完成。
因此, 如果您的 port 动态生成 PLIST ,
就需要在 pre-install 之前完成。
另外, 如果您的 port 需要编辑所生成的文件, 则需要在
post-install 中操作名为
TMPPLIST 的那个文件。
另一种可行的修改装箱单的方法,
则是根据 PLIST_FILES 和
PLIST_DIRS 这两个变量的设置来进行。
它们的值会作为目录名连同 PLIST
的内容一起写入 TMPPLIST 。
在 PLIST_FILES
和 PLIST_DIRS 中列出的名字, 会经历前面所介绍的
%%变量 %%
替换过程。 除此之外, 在 PLIST_FILES
中列出的文件, 会不加任何修改第出现在最终的装箱单中,
而 @dirrm 将作为前缀加到 PLIST_DIRS
所列的名字之前。 为了达到目的, PLIST_FILES 和
PLIST_DIRS 必须在写
TMPPLIST 之前,
也就是在 pre-install 或更早的阶段进行设置。
空目录
清理空目录
一定要让 port 在卸载时进行清理空目录。
通常, 可以通过为所有由 port 创建的目录增加对应的
@dirrm 行来实现。 在删除父目录之前,
需要首先删除它的子目录。
:
lib/X11/oneko/pixmaps/cat.xpm
lib/X11/oneko/sounds/cat.au
:
@dirrm lib/X11/oneko/pixmaps
@dirrm lib/X11/oneko/sounds
@dirrm lib/X11/oneko
然而, 有时 @dirrm 会由于其它 port
使用了同一个目录而发生错误。
利用 @dirrmtry 可以只删除那些空目录,
而避免给出警告。
@dirrmtry share/doc/gimp
按照上面的写法, 将不会显示任何错误信息, 而且,即使在
${PREFIX} /share/doc/gimp
由于其它 port 在其中安装了一些别的文件的时候, 也不会导致
&man.pkg.delete.1; 异常退出。
如何建立空目录
在 port 安装过程中创建的空目录需要特别留意。 安装 package
时并不会自动创建这些目录, 这是因为 package 只保存文件。
要确保安装 package 时会自动创建这些空目录, 需要在
pkg-plist 中加入与
@dirrm 对应的行:
@exec mkdir -p %D/share/foo/templates
配置文件
如果 port 需要把一些文件放到
PREFIX /etc ,
不要 简单地安装它们, 并将其列入
pkg-plist , 因为这样会导致
&man.pkg.delete.1; 删除用户精心编辑的文件,
而新安装时则又会把这些文件覆盖。
因此, 您应把配置文件的例子按其它的后缀来安装
(例如 filename .sample
就是一个不错的选择) 并显示一条 消息
告诉用户如何复制并编辑这个配置文件, 以便让软件能够正确工作。
因此, 应按其它的后缀来安装配置文件的例子
(filename .sample
就是一个不错的选择)。 如果实际的配置文件不存在,
则将其复制为实际文件的名字。 卸载时, 如果发现用户没有修改配置文件,
则将其删除。 您需要在 port 的 Makefile ,
以及 pkg-plist (对于从 package
安装的情形) 进行处理。
示例的 Makefile 部分:
post-install:
@if [ ! -f ${PREFIX}/etc/orbit.conf ]; then \
${CP} -p ${PREFIX}/etc/orbit.conf.sample ${PREFIX}/etc/orbit.conf ; \
fi
示例的 pkg-plist 部分:
@unexec if cmp -s %D/etc/orbit.conf.sample %D/etc/orbit.conf; then rm -f %D/etc/orbit.conf; fi
etc/orbit.conf.sample
@exec if [ ! -f %D/etc/orbit.conf ] ; then cp -p %D/%F %B/orbit.conf; fi
另外, 还应显示一条 消息 指出用户应在何处复制并编辑这个文件,
以便让软件能开始正常工作。
动态装箱单与静态装箱单的对比
静态装箱单 是指在 Ports Collection 中以
pkg-plist 文件 (可能包含变量替换),
或以 PLIST_FILES 和 PLIST_DIRS
的形式嵌入到 Makefile 出现的装箱单。
即使它是由工具或 Makefile 中的某个 target 在经由 committer 加入到
Ports Collection 之前 自动生成的也是如此,
因为可以在不下载或编译源代码包的前提下对其进行检视。
动态装箱单 是指在 port
编译并安装时生成的装箱单。 在下载并编译您所移植的应用程序的源代码之前,
或在执行了 make
clean 之后, 就无法查看其内容了。
尽管使用动态装箱单并不被禁止, 但监护人应尽可能使用静态装箱单,
因为它能够让用户使用 &man.grep.1;来发现所需的 ports,
例如, 它是否会安装某个特定文件。 动态列表主要应用于复杂的,
其装箱单随所选功能会发生巨变 (因而使得维护静态装箱单不再可行),
或那些随版本而改变装箱单内容的 port (例如, 使用
Javadoc 来生成文档的那些 ports)。
我们鼓励那些选择使用动态装箱单的监护人提供一个能够生成
pkg-plist 的 target, 以便于用户检视其内容。
装箱单 (package list) 的自动化制作
首先, 请确认已经基本上完成了 port 的工作, 仅缺
pkg-plist 。
接下来, 建立一个用于安装您的 port 的临时目录,
并在其中安装它所依赖的所有其他软件包:
&prompt.root; mkdir /var/tmp/$(make -V PORTNAME)
&prompt.root; mtree -U -f $(make -V MTREE_FILE) -d -e -p /var/tmp/$(make -V PORTNAME)
&prompt.root; make depends PREFIX=/var/tmp/$(make -V PORTNAME)
将目录结构保存到一新文件中。
&prompt.root; (cd /var/tmp/$(make -V PORTNAME) && find -d * -type d) | sort > OLD-DIRS
建立一空白 pkg-plist 文件:
&prompt.root; :>pkg-plist
如果您的 port 遵循 PREFIX (应该如此)
则接下来应安装该 port 并创建装箱单。
&prompt.root; make install PREFIX=/var/tmp/$(make -V PORTNAME)
&prompt.root; (cd /var/tmp/$(make -V PORTNAME) && find -d * \! -type d) | sort > pkg-plist
此外还应把新建立的目录加入装箱单。
&prompt.root; (cd /var/tmp/$(make -V PORTNAME) && find -d * -type d) | sort | comm -13 OLD-DIRS - | sort -r | sed -e 's#^#@dirrm #' >> pkg-plist
最后需要手工整理 packing list; 这一过程不是
完全 自动的。 联机手册应列入 port
的 Makefile 中的
MANn , 而不是装箱单。
用户配置文件应被删除, 或以
filename .sample
这样的名字来安装。 info/dir 文件,
也不应列入, 同时应按照 info
文件 的说明来增加一些 install-info 行。
所有由 port 安装的库, 应按照
动态连接库
小节中介绍的方法处理。
另外, 也可以使用
/usr/ports/Tools/scripts/ 中的
plist 脚本来自动创建
package list。 第一步和上面一样, 也就是
mkdir , mtree 并
make depends 。 然后构建和安装
port:
&prompt.root; make install PREFIX=/var/tmp/$(make -V PORTNAME)
然后让 plist 生成
pkg-plist 文件:
&prompt.root; /usr/ports/Tools/scripts/plist -Md -m $(make -V MTREE_FILE) /var/tmp/$(make -V PORTNAME) > pkg-plist
与前面类似, 如此生成的装箱单也需要手工进行一些清理工作。
pkg-* 文件
前面有一些没有提及的关于
pkg-* 文件的技巧,
它们可以方便地完成许多任务。
pkg-message (安装预编译包时显示的消息文件)
如果您需要在安装时显示一条消息给用户,
可以把这消息放在 pkg-message 中。
这一特性通常可以用于在 &man.pkg.add.1; 之后显示一些附加的安装步骤,
或显示关于授权的信息。
当需要显示一些编译开关或警告时,
请使用 ECHO_MSG 。
pkg-message 文件只是为显示安装后的执行操作指导使用的。
类似地, 还需要留意
ECHO_MSG 和 ECHO_CMD
之间的区别。 前一个是在屏幕上显示消息性的文字, 而后一个则用于在执行命令时使用管道。
下面是用到了这两个宏的例子
shells/bash2/Makefile :
update-etc-shells:
@${ECHO_MSG} "updating /etc/shells"
@${CP} /etc/shells /etc/shells.bak
@( ${GREP} -v ${PREFIX}/bin/bash /etc/shells.bak; \
${ECHO_CMD} ${PREFIX}/bin/bash) >/etc/shells
@${RM} /etc/shells.bak
pkg-message 文件,
并不需要明确地加到 pkg-plist 中。
此外, 在用户使用 port 而不是 package 来安装软件时,
它并不会被显示出来。 因此如果需要的话, 您应该在
post-install target 中指定显示它。
pkg-install (安装预编译包时执行的脚本文件)
如果您的 port 需要在预编译的安装包通过 &man.pkg.add.1;
安装时执行一些命令, 则应通过
pkg-install 脚本来完成。
这个脚本会自动地加入 package, 并被
&man.pkg.add.1; 执行两次: 第一次是
${SH} pkg-install ${PKGNAME}
PRE-INSTALL 而第二次是
${SH} pkg-install ${PKGNAME} POST-INSTALL 。
$2 可被用来检测脚本运行的模式。
环境变量 PKG_PREFIX 将设置为 package 的安装目录。
请参见 &man.pkg.add.1; 以了解更进一步的细节。
在使用 make install 时这个脚本不会被自动运行。
如果需要运行它, 则必须在您的 port 中的
Makefile 里明确地予以调用, 其方法是加入类似
PKG_PREFIX=${PREFIX} ${SH} ${PKGINSTALL}
${PKGNAME} PRE-INSTALL 这样的命令。
pkg-deinstall (卸载时执行的脚本文件)
这一脚本将在 package 被卸载时执行。
此脚本会被 &man.pkg.delete.1; 执行两次。
第一次是 ${SH} pkg-deinstall ${PKGNAME}
DEINSTALL 而第二次则是
${SH} pkg-deinstall ${PKGNAME} POST-DEINSTALL 。
pkg-req (安装预编译包时检测是否应执行操作的脚本文件)
如果您的 port 需要确定它是否应被安装,
可以创建 pkg-req requirements
脚本。 它会在安装/卸载时自动运行, 以决定操作是否应被实施。
这个脚本会在使用 &man.pkg.add.1; 安装时以
pkg-req ${PKGNAME} INSTALL 的命令行执行。
卸载时, 它将由 &man.pkg.delete.1; 以
pkg-req ${PKGNAME} DEINSTALL 的命令行执行。
改变
pkg-* 文件的名字
所有 pkg-* 文件的名字,
皆系采用变量予以定义, 因此在需要时可以在您的
Makefile 中加以改变。 当您需要在多个 port
之间共享某些 pkg-* 文件,
或需要写入某些文件时就非常有用了。 (参见 在
WRKDIR 以外的地方写文件,
以了解为什么直接将变更写入 pkg-*
子目录是个糟糕的主意)
下面是一组变量以及它们的默认值 (PKGDIR 默认情况下是
${MASTERDIR} 。)
变量
默认值
DESCR
${PKGDIR}/pkg-descr
PLIST
${PKGDIR}/pkg-plist
PKGINSTALL
${PKGDIR}/pkg-install
PKGDEINSTALL
${PKGDIR}/pkg-deinstall
PKGREQ
${PKGDIR}/pkg-req
PKGMESSAGE
${PKGDIR}/pkg-message
请修改这些变量, 而不是直接覆盖
PKG_ARGS 的值。 如果您改变了
PKG_ARGS , 这些文件将无法在安装 port
时正确地复制到 /var/db/pkg 目录。
使用 SUB_FILES 和
SUB_LIST
SUB_FILES 和 SUB_LIST
这两个变量可以用来在 port 文件中使用某些动态的值, 例如
pkg-message 中的
installation PREFIX 。
使用 SUB_FILES
变量可以指定需要自动修改的文件列表。 在
SUB_FILES 中的每一个
file , 都必须有一个对应的、
存在于 FILESDIR 目录的
file .in 文件。
如果您加入了一些文件, 例如
pkg-message 、 pkg-install 、
pkg-deinstall 或 pkg-reg , 则相关的
PKG-FILE 变量就应设置为
WRKDIR /pkg-file 。
用 SUB_FILES 变量,
可以指定需要自动进行修改的文件列表。 在
SUB_FILES 中的每一个
文件 ,
在 FILESDIR 目录中都必须有一个对应的
文件 .in 。
修改后的版本将保存在 WRKDIR 。
在 USE_RC_SUBR (或已经过时的
USE_RCORDER ) 中定义的文件会自动加入到
SUB_FILES 中。 对于
pkg-message 、
pkg-install 、 pkg-deinstall
and pkg-reg , 对应的 Makefile 变量会被自动设置,
以指向处理过的版本。
SUB_LIST 这个变量的内容是一系列
VAR=VALUE 对。 SUB_FILES
所列出的文件中所有的
%%VAR%% 都将被替换为
VALUE 。 系统自动定义了一些常用的替换对,
包括: PREFIX 、
LOCALBASE 、 X11BASE 、
DATADIR 、 DOCSDIR , 以及
EXAMPLESDIR 。 替换结果中所有以
@comment 开头的行,
都将在变量替换之后被删去。
下面的例子中, 将把 pkg-message
中的 %%ARCH%% 替换为系统所运行的架构名称:
SUB_FILES= pkg-message
SUB_LIST= ARCH=${ARCH}
注意, 在上述例子中, FILESDIR
里必须有 pkg-message.in 这个文件。
下面是一个正确的 pkg-message.in 例子:
Now it is time to configure this package.
Copy %%PREFIX%%/share/examples/putsy/%%ARCH%%.conf into your home directory
as .putsy.conf and edit it.
测试您的 port
运行 make describe
许多 &os; port 维护工具, 例如
&man.portupgrade.1;, 会依赖于一个名为
/usr/ports/INDEX 的数据库的正确性,
它提供了关于 port 的相关信息, 例如依赖关系等等。
INDEX 是由顶级的
ports/Makefile 通过
make index 来建立的, 这个命令会进入每一个 port
的子目录, 并在那里执行 make describe 。
因此, 如果某个 port 的 make describe 失败,
就没有人能生成 INDEX ,
人们很快会变得不高兴。
无论在 make.conf 中设置了什么选项,
这个文件都应能够正确地生成。 因此,
应避免在 (例如) 某个依赖关系无法满足时使用 .error 。
(参见 。)
如果 make describe 只是产生一个字符串,
而不是错误信息, 可能就没什么问题。 请参见
bsd.port.mk 以了解所生成的串的意义。
最后要说明的是, 新版本的
portlint (在下一节中将进行介绍)
将会自动地运行 make describe 。
Portlint
在提交或 commit 之前, 应使用 portlint
来进行检查。 portlint 会对常见的、
包括功能上的和格式上的错误给出警告。 对于新的 (或在 repocopy 代码库中复制的)
port, portlint -A 可以完成全面检查;
对于暨存的 port, portlint -C 一般就足够了。
由于 portlint 采用启发式方法来检查错误,
有时它会产生误警。 另外, 有时由于 port
框架的限制可能没有办法修正它指出的问题。 如果您有疑虑,
请写信询问 &a.ports;。
PREFIX (安装时的顶级目录名) 和 DESTDIR
PREFIX 能够决定 port 安装时的目的位置。
一般情况下这个位置是 /usr/local
或 /opt 。 用户可以将 PREFIX
设为其希望的任意值。 您的 port 则必须遵循这个变量。
除此之外, 如果用户配置了 DESTDIR ,
则表示希望将 port 安装到另一个环境, 通常是 jail
或在 / 以外的其他位置挂接的系统中。
实际上, port 会安装到
DESTDIR /PREFIX ,
并注册到位于 DESTDIR /var/db/pkg
的预编译包数据库中。 在撰写 port 时, 遵循
DESTDIR 的配置十分重要。
一般而言 PREFIX 会设为
LOCALBASE_REL (默认是
/usr/local )。 如果设置了
USE_X_PREFIX 或 USE_IMAKE ,
则 PREFIX 会设为 X11BASE_REL (默认是
/usr/X11R6 )。 如果设置了
USE_LINUX_PREFIX , 则 PREFIX
会设为 LINUXBASE_REL (默认是
/compat/linux )。
避免将 /usr/local 或
/usr/X11R6 硬编码到源代码中,
能够大大提高 port 的灵活性, 并适应不同环境的需要。
对于使用 imake 的 X port,
这一工作是自动完成的; 其他情况下, 通常可以简单地将 port
所用到的 Makefile 脚本中出现的
/usr/local (或对于没有使用 imake 的 X port 而言,
/usr/X11R6 ) 替换为读取
${PREFIX} 变量就能达到目的了,
因为这个变量在联编和安装的过程中, 会自动向下传递。
一定要避免让您的 port 在
/usr/local 而不是正确的 PREFIX
中安装文件。 简单的测试方法是:
&prompt.root; make clean; make package PREFIX=/var/tmp/$(make -V PORTNAME)
如果有文件安装到了 PREFIX 以外的地方,
打包过程将抱怨找不到这些文件。
这一步骤并不能帮助发现内部引用, 或纠正在引用其它 port
中的文件时使用的 LOCALBASE 。 您需要在
/var/tmp/$(make -V PORTNAME)
中测试安装好的软件, 才能够达到这样的目的。
除非真的需要, 否则不要设置 USE_X_PREFIX
(例如, 如果它需要引用 X11BASE 中的文件)。
您可以在自己的 Makefile 中改变
PREFIX 变量的值, 也可以通过用户环境变量来影响它。
然而, 一般情况下决不应该在 Makefile
中明确设置它的值。
此外, 引用其它 port 中的文件时, 应使用前面介绍的变量,
而不要直接指定它们的路径名。 例如, 如果您的 port
需要使用 PAGER 这个宏来指明
less 的完整路径, 应使用下面的编译选项:
-DPAGER=\"${LOCALBASE}/bin/less\"
而非
-DPAGER=\"/usr/local/bin/less\" 。
这种方法能够增加在系统管理员把整个 /usr/local
目录挪到其它位置时安装成功的机会。
请注意 LOCALBASE 、
LINUXBASE 、 X11BASE 、
DOCSDIR 、 EXAMPLESDIR 、
DATADIR 以及 DESKTOPDIR
这些变量中已经包含了 DESTDIR 。 使用
DESTDIR LOCALBASE
是错误的。 在您需要相对于 DESTDIR 的路径时,
应使用 LOCALBASE_REL 、
LINUXBASE_REL 和 X11BASE_REL 。
为了使脚本撰写过程不过分地繁琐, 可以用 TARGETDIR
来代替 DESTDIR PREFIX 。
以下是一些正确的用法:
post-install:
${INSTALL_PROGRAM} ${WRKSRC}/helper ${TARGETDIR}/bin/helper
${INSTALL_DATA} ${WRKSRC}/guide.txt ${DOCSDIR}
在引用 port 的依赖关系时, 会用到
LOCALBASE , 因为我们正在目标环境中进行工作。
如果必须在软件中将路径硬编码进去,
则应使用 LOCALBASE_REL 的值,
因为这些软件会在目标环境内使用。
以下是一些正确的用法:
RUN_DEPENDS= ${LOCALBASE}/share/gonzo/launch.dat:${PORTSDIR}/games/gonzo
post-patch:
@${REINPLACE_CMD} -e 's|/usr/gonzo/launch.dat|${LOCALBASE_REL}/share/gonzo/launch.dat}' ${WRKSRC}/main.c
@${REINPLACE_CMD} -e 's|/etc/game.conf|${PREFIX}/etc/game.conf|' ${WRKSRC}/loader.c
post-install:
@${INSTALL_DATA} ${WRKSRC}/example/conf ${TARGETDIR}/etc/game.conf
在装箱单和 pkg-* 脚本中,
%%LOCALBASE%% 、 %%LINUXBASE%%
和 %%X11BASE%% 在扩展时,
会自动剔除 DESTDIR ,
因为这些文件都会在目标环境中使用。
Tinderbox
如果您是非常热心的 ports 参与者, 则可以看看 Tinderbox 。
这是一个强大的用于构建和测试 ports 的系统, 它基于
Pointyhat 的脚本。 您可以使用
misc/tinderbox port 来安装
Tinderbox 。 请一定仔细阅读随它安装的文档,
因为配置并不简单。
请访问 Tinderbox 网站
以了解进一步的细节。
升级
如果您发现某个 port 相对原作者所发布的版本已经过时,
则首先需要确认的是您的 port 是最新的。 您可以在 &os; FTP 镜像的
ports/ports-current 目录中找到它们。
但是, 如果您正在使用较多的 port, 则可能使用
CVSup 来保持 Ports Collection 最新更为简单, 这在
使用手册
中进行了介绍。 此外, 这样做也有助于保持 port 依赖关系的正确性。
下一步是检查是否已经有在等待的更新。 要完成这项工作,
可以采用下列两种方法之一。 有一个用于搜索
FreeBSD 问题报告 (PR) 数据库 (也被称作
GNATS )。 在下拉框中选择 ports ,
然后输入 port 的名字。
但是, 有些时候人们会忘记将避免混淆的 port 的名字放到 Synopsis 字段中。
这种时候, 您可以试试看
FreeBSD Ports 监视系统 (也被叫做
portsmon )。 这个系统会尝试按照 port 的名字来进行分类。
要搜索和某个特定 port 有关的 PR, 可以使用
port概览 。
如果没有候审的 PR, 下一步是给 port 的维护者写信, 这可以通过执行
make maintainer 看到。 这个人可能正在进行升级工作,
或者由于某种理由暂时没有升级 (例如, 新版本有稳定性问题);
一般您不希望重复他们的工作。 注意没有维护者的 port 的维护者会显示为
ports@FreeBSD.org , 这是一般性 port 问题的邮件列表,
因此发邮件给它一般没什么意义。
如果维护者要求您去完成升级, 或者没有维护者,
您就可以通过自行完成升级来帮助 &os; 了! 请进行修改,
并保存在新旧目录上执行的递归式 diff 的输出 (例如,
如果您修改的 port 的目录名是 superedit
而修改前的目录的名字是 superedit.bak , 则应提交的是
diff -ruN superedit.bak superedit 的结果)。
一致式 (unified) 或 上下文式 (context) diff 都是可以的,
但一般来说 port committer 会更喜欢一致式 diff。
请注意这里使用的选项 -N , 它的目的是强制 diff
正确地处理出现新文件, 或老文件被删除的情形。 在把 diff 发给我们之前,
请再次检查输出, 以便确认每一个修改都是有意义的。
为了简化常用的补丁文件操作, 您可以使用
/usr/ports/Tools/scripts/patchtool.py 。
使用之前, 请首先阅读
/usr/ports/Tools/scripts/README.patchtool 。
如果 port 目前还无人维护, 而且您自己经常使用它,
请考虑自荐为它的维护者。 &os; 有超过 2000 个没有维护者的 port,
而这正是最需要志愿人员的领域。
(要了解关于维护者的任务描述, 请参见
Makefile 中的 MAINTAINER 小节)。
将 diff 发送给我们的最佳方式是通过 &man.send-pr.1; (category 一栏写
ports )。 如果您正维护那个 port,
请务必在 synopsis 的开头写上 [maintainer update] ,
并将您的 PR 的 Class
设置为 maintainer-update 。
反之, 您的 PR 的 Class
就应该是
change-request 。 请在信中逐个提及每一个删除或增加的文件,
因为这些都必须明确地在使用 &man.cvs.1; 进行 commit 时明确地指定。
如果 diff 超过了 20K, 请考虑压缩并对其进行 uuencode;
否则, 简单地将其原样加入 PR 即可。
在您 &man.send-pr.1; 之前, 请再次阅读 Problem
Reports 一文中的
如何撰写问题报告 小节;
它给出了丰富的关于如何撰写更好的问题报告的介绍。
如果您的更新是由于安全考虑, 或修复已经 commit 的 port
中的严重问题, 请通知 &a.portmgr; 来申请立即重建和分发您的 port
的 package。 否则, 不愿怀疑的使用 &man.pkg.add.1; 的用户,
可能会在未来数周之内继续通过使用 pkg_add -r
安装旧版本。
再次强调, 请使用 &man.diff.1; 而非 &man.shar.1; 来发送现有 port 的更新!
现在您已经了解了所需的所有操作, 您可能会像要阅读在
中关于如何保持最新的描述。
Ports 的安全
安全为何如此重要
软件中偶尔会引入 bug。 毋庸置疑, 安全漏洞是最为危险的。
从技术角度看, 这些漏洞可以通过消除导致它们的 bug 来修复。
然而, 处理一般的 bug 和安全漏洞的策略是截然不同的。
典型的小 bug 通常只影响那些启用了某些能够触发它的选项组合的用户。
开发人员最终会在发布没有那个问题的新版之后给出一个补丁来修正它,
而用户中的主体并不会立即升级, 因为他们并没有因存在问题而感到苦恼。
严重的 bug 可能会导致数据丢失和其它问题, 无论如何,
谨慎的用户知道, 除了软件 bug 之外还有很多其它事故可能会导致数据丢失,
因此他们会备份重要数据; 此外, 严重的 bug 通常会被很快发现。
安全漏洞则完全不同。 第一, 它们可能存在数年而不被发现,
因为它们可能并不导致软件无法正常工作。 第二, 通过利用漏洞,
恶意的一方可能会得到未获授权的访问权限,
并利用这些权限毁掉或修改敏感数据;
而更糟糕的情况则是用户可能根本注意不到损害已经发生。 第三,
暴露出安全漏洞的系统, 往往能够帮助攻击者闯入其它之前不可能进入的系统。
因此, 只是修正安全漏洞是不够的: 必须以清晰和全面的方式通知公众,
这样他们就能够评估风险, 并采取适当的措施。
修复安全漏洞
当说起 port 或 package 时, 安全漏洞往往是出现在原作者的发行包,
或移植过程中加入的文件里。 对于前一种情况,
软件的原作者通常会立刻发布一个补丁甚至新版,
您只需要按照原作者的修正去更新 port 就可以了。
如果由于某种原因修正被延误, 则要么 将
port 标记为 FORBIDDEN , 要么在 port
中加入一个自己的补丁。 如果有存在漏洞的 port, 尽可能尽快修复其漏洞就是。
无论是哪种情况, 您还是需要按照 标准的提交流程 提交,
除非您有直接在 ports tree 上 commit 的权限。
作为 ports committer 并不能够随便 commit 所有 port。
请注意通常 port 都有维护者, 而他们应得到您的尊重。
在漏洞被修正之后, 一定要同时增加 port 的修订版本号。
这样, 规律性地升级安装的 package 的用户就能够看到他们需要进行升级。
另外, 还应构建预编译的安装包, 并通过 FTP 和 WWW 镜像发布,
以取代有漏洞的版本。 注意要增加
PORTREVISION 数字, 除非在修正问题时
PORTVERSION 发生了变化。 一般来说,
如果在 port 中增加了补丁文件, 就应该增加 PORTREVISION ,
但例外的例子是您已经将软件升级到了最新版,
因为这时已经改掉 PORTVERSION 了。 请参见
相关小节
以了解进一步的信息。
通知整个用户群体
VuXML 数据库
当发现了安全漏洞时的一项重要而紧迫的步骤,
就是让使用 port 的用户群了解其危险。 这类通知有两重目的。
首先, 如果危害真的很严重, 可能理性的办法就是立即应用一项缓解措施,
例如, 停止受到影响的服务, 甚至完全删除 port, 直到问题被修正为止。
其次, 许多用户只是偶尔升级所安装的软件包, 通过通知,
他们能够知道已经到了 必须 更新软件的时候,
因为已经有了修正这些问题的版本了。
由于现有的 port 数量极其庞大, 为每一个问题都发布安全公告,
毫无疑问地会发表和狼来了一样多的安全公告,
并增大受众在真的发生严重的问题时忽略问题的可能。
因此, 在 port 中发现的安全漏洞, 会在 FreeBSD VuXML
数据库 中记录。 安全官团队成员会持续地追踪这个数据库的修改,
以了解需要他们注意的内容。
如果您是 committer, 则可以自行更新 VuXML 数据库。
这样, 您就能够同时帮助安全官团队,
并尽早将至关重要的信息传达给用户群体。 然而, 如果您不是 committer,
或者您相信自己发现了一个异常严重的漏洞, 或者由于其它情况,
请不要由于按照 FreeBSD
安全信息 页面上的方法联系安全官团队。
现在您选择了一条艰难的路。 正如其名称所暗示的那样, VuXML
数据库本质上是一个 XML 文档。 其源文件 vuln.xml
被保存在 security/vuxml port 的目录中。
所以, 它的全名是
PORTSDIR /security/vuxml/vuln.xml 。
每当您发现 port 中的安全漏洞时, 请把新的纪录加入到那个文件中。
在熟悉 VuXML 之前, 您最好先看看是否有类似的您发现的问题的其它记录,
并复制它作为模板。
VuXML 简介
XML 是一个复杂的语言, 它远远超越了这本书的范围。
不过, 只需了解标记的命名规则, 就能 VuXML 记录的结构有一个大体的了解了。
XML 标记的名字应出现在一对尖括号之间。 每一个
<tag> 必须有一个对应的 </tag>。 标记可以嵌套,
如果嵌套的话, 内层的标记必须在外层标记之前结束。
这就形成了一个标记的层次结构, 也就是关于它们之间如何嵌套的规则。
听起来很像 HTML, 是不是? 最主要的区别在于, XML
是可扩展的 (eX tensible),
例如通过定义新的标记等等。 由于其结构的内在性质,
XML 能够赋予无组织的数据新的形态。 VuXML 是专门为描述安全漏洞设计的语言。
现在让我们来观察一个实际的 VuXML 记录:
<vuln vid="f4bc80f4-da62-11d8-90ea-0004ac98a7b9">
<topic>Several vulnerabilities found in Foo</topic>
<affects>
<package>
<name>foo</name>
<name>foo-devel</name>
<name>ja-foo</name>
<range><ge>1.6</ge><lt>1.9</lt></range>
<range><ge>2.*</ge><lt>2.4_1</lt></range>
<range><eq>3.0b1</eq></range>
</package>
<package>
<name>openfoo</name>
<range><lt>1.10_7</lt></range>
<range><ge>1.2,1</ge><lt>1.3_1,1</lt></range>
</package>
</affects>
<description>
<body xmlns="http://www.w3.org/1999/xhtml">
<p>J. Random Hacker reports:</p>
<blockquote
cite="http://j.r.hacker.com/advisories/1">
<p>Several issues in the Foo software may be exploited
via carefully crafted QUUX requests. These requests will
permit the injection of Bar code, mumble theft, and the
readability of the Foo administrator account.</p>
</blockquote>
</body>
</description>
<references>
<freebsdsa>SA-10:75.foo</freebsdsa>
<freebsdpr>ports/987654</freebsdpr>
<cvename>CAN-2010-0201</cvename>
<cvename>CAN-2010-0466</cvename>
<bid>96298</bid>
<certsa>CA-2010-99</certsa>
<certvu>740169</certvu>
<uscertsa>SA10-99A</uscertsa>
<uscertta>SA10-99A</uscertta>
<mlist msgid="201075606@hacker.com">http://marc.theaimsgroup.com/?l=bugtraq&m=203886607825605</mlist>
<url>http://j.r.hacker.com/advisories/1</url>
</references>
<dates>
<discovery>2010-05-25</discovery>
<entry>2010-07-13</entry>
<modified>2010-09-17</entry>
</dates>
</vuln>
标记的名字都是简单明了的, 下面我们来介绍一下需要由您填写的字段:
这是 VuXML 记录的顶级 tag。
它有一个强制性的字段, vid ,
用于为此记录 (它包含的部分) 指定一个全局唯一标识符 (UUID)。
您应为每一个新的 vuXML 生成新的 UUID (而且别忘了要把模板中的
UUID 换成新的, 如果您不是从头开始的话)。 您可以使用 &man.uuidgen.1;
来生成 VuXML UUID; 另外, 如果您使用的是 FreeBSD 4.x
版本, 也可以用 devel/p5-Data-UUID 并执行:
perl -MData::UUID -le 'print lc new Data::UUID->create_str'
关于问题的一句话描述。
此处给出受到影响的 package 的名字。 可以给出多个名字,
因为可能有多个软件包基于同一个 master port 或软件产品。
这可能包括稳定和开发分支、 本地化版本,
以及提供了不同的编译时选项的 slave port。
撰写 VuXML 记录时, 您有责任找到所有相关的包。 很多时候
make search name=foo 是您的朋友。
需要留意的通常包括:
foo port 的
foo-devel 变体;
包含不同后缀的其它变体, 例如
-a4 (对于和打印有关的软件包),
-without-gui (提供但禁用了 X
支持的软件包), 以及类似的其它情况;
jp- , ru- 、
zh- , 以及其它可能的本地化变体,
它们通常可以在 Ports Collection 中相应的国家分类中找到。
受影响的 package 版本, 可以使用
<lt> , <le> ,
<eq> , <ge> ,
和 <gt> 表达成一个或多个版本及其范围。
注意给出的版本范围不应存在重叠。
在描述范围的时候, * (星号)
表达最小的版本。 更具体地说,
2.* 小于 2.a 。
因此, 星号可以用来匹配所有可能的
alpha 、 beta ,
以及 RC 版本。 例如,
<ge>2.*</ge><lt>3.*</lt>
可以选择性地匹配每一个 2.x 的版本, 而
<ge>2.0</ge><lt>3.0</lt>
显然不能, 因为它会漏掉
2.r3 而匹配
3.b 。
上面的例子指定了受影响的版本, 是包括 1.6
到 1.9 上下界的所有版本, 以及
2.x 在 2.4_1 之前的版本,
和 3.0b1 版。
受到影响的一组 package (本质上是 ports)
可以列在 <affected> 小节中。
如果多个软件产品都采用了同样的基础代码,
(比如说 FooBar、 FreeBar 和 OpenBar) 而且包含同样的 bug
或漏洞。 请注意列出多个名字时, 应该在一个
<package> 小节中完成。
如果可能, 版本的范围应包括
PORTEPOCH 和
PORTREVISION 。
务必注意, 根据加权规则, 带有非零 PORTEPOCH
的版本, 系统会认为比没有
PORTEPOCH 的版本高, 例如 3.0,1
高于 3.1 甚至
8.9 。
关于问题的摘要性信息。 此处使用
XHTML。 务必要成对使用
<p> 和 </p> 。
可以使用较为复杂的标记, 但仅限于有助于让信息更准确和明了的修饰:
请不要过分地美化。
这部分包含了相关的可供参考的文档。
请尽可能多提供参考文献。
指定
FreeBSD
安全公告 。
指定
FreeBSD
问题报告 。
指定 Mitre
CVE ID。
指定
SecurityFocus
Bug ID 。
指定
US-CERT
安全公告。
指定
US-CERT
漏洞说明。
指定
US-CERT
计算机安全警报。
指定
US-CERT
技术性计算机安全警报。
指向邮件列表存档的 URL。
属性 msgid 是可选项,
用以指定某一封信的 message ID。
一般的 URL。 只有在没有其它更适合的参考文献时,
才应使用它。
问题被全面披露的日期
(YYYY-MM-DD )。
记录加入到数据库中的日期
(YYYY-MM-DD )。
记录最后一次被修改的日期
(YYYY-MM-DD )。 新记录不应包括这个字段。
只有在修改记录时才应加入它。
测试您对 VuXML 数据库所作的修改
假定您打算撰写, 或已经写好了一个关于
package clamav 的问题描述, 并且,
已经知道 0.65_7 版本修正了这个问题。
您需要做的准备工作, 是安装一个新版本的
ports security/portaudit 程序以及
security/portaudit-db 。
首先, 检查一下是否已经有了关于这个漏洞的描述。
如果已经有过这样的记录, 那么它将匹配较早版本的 package,
0.65_6 :
&prompt.user; packaudit
&prompt.user; portaudit clamav-0.65_6
要运行 packaudit , 您必须拥有写入
DATABASEDIR 目录,
通常是 /var/db/portaudit 的权限。
如果什么都没有发现, 您就可以考虑写一个新的记录来描述这个漏洞了。
现在可以生成一个新的 UUID (假设它是
74a9541d-5d6c-11d8-80e3-0020ed76ef5a ),
然后将您的新记录加入到 VuXML 数据库中。 接下来,
用下面的命令来检查它是否符合语法:
&prompt.user; cd ${PORTSDIR}/security/vuxml && make validate
您需要安装下列 package 中的至少一个:
textproc/libxml2 、
textproc/jade 。
接下来从 VuXML 文件重构 portaudit 数据库:
&prompt.user; packaudit
要验证您新加入的项的 <affected>
小节能够正确地匹配希望的 package, 可以使用下面的命令:
&prompt.user; portaudit -f /usr/ports/INDEX -r 74a9541d-5d6c-11d8-80e3-0020ed76ef5a
请参见 &man.portaudit.1; 以了解关于这个命令语法的更多细节。
请确信新添加的记录不会在输出中匹配不应匹配的项。
现在检查您添加的记录所匹配的版本是否正确:
&prompt.user; portaudit clamav-0.65_6 clamav-0.65_7
Affected package: clamav-0.65_6 (matched by clamav<0.65_7)
Type of problem: clamav remote denial-of-service.
Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html>
1 problem(s) found.
显然, 前一个版本会匹配, 而后一个不会。
最后, 验证您从
VuXML 数据库中能够正确地得到预期的网页效果:
&prompt.user; mkdir -p ~/public_html/portaudit
&prompt.user; packaudit
&prompt.user; lynx ~/public_html/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html
该做什么和不该做什么
介绍
这里是一些在移植软件时可能会遇到的常见问题。
您应按照这个列表检查自己的 port, 同样地,
您也可以帮助检查 PR 数据库
中由其它人提交的 port。 请按照在
问题报告和一般性注释 中介绍的方法提交您的看法。
帮助检查 PR 数据库中的 ports 即能够帮助我们更快地 commit 它们,
也能证明您清楚地了解如何完成这些工作。
对可执行文件做脱模 (strip) 操作
除非不得不进行, 否则不要手工对可执行文件作脱模操作。
所有文件在安装时都应脱模, 但 INSTALL_PROGRAM
宏会在安装的同时对其进行脱模 (参见下一节的内容)。
如果您需要对某一文件进行脱模, 但不希望使用
INSTALL_PROGRAM 宏, 则应使用
${STRIP_CMD} 来处理程序。
一般而言这应该在 post-install
target 中进行。 例如:
post-install:
${STRIP_CMD} ${PREFIX}/bin/xdl
可以使用 &man.file.1; 命令来检查所安装的可执行文件是否进行过脱模。
如果它没有给出 not stripped 的提示,
则表示已经做过脱模了。 另外,
&man.strip.1; 不会对已经脱模过的文件重新脱模, 它会直接退出的。
INSTALL_* 宏
您应使用由 bsd.port.mk 提供的宏来完成操作,
以确保您自己的 *-install target
能够正确地设置属主和权限信息。
INSTALL_PROGRAM 代表用于安装二进制的可执行文件的命令。
INSTALL_SCRIPT 代表用于安装可执行脚本的命令。
INSTALL_DATA 代表用于安装普通用户可访问的数据的命令。
INSTALL_MAN 代表用于安装联机手册,
以及其它文档的命令 (注意, 它并不会对这些文件实施压缩操作)。
这些宏基本上就是给出了适当参数的 install 命令。
下面给出了如何使用它们的例子。
WRKDIR (构建时使用的临时目录)
任何时候都不要在
WRKDIR 以外的位置写文件。 WRKDIR
是在 port 构建过程中唯一的一处一定可写的地方 (参见
如何从
CDROM 安装 port 以了解从只读的目录中构建和安装 port 的例子)。
如果您需要改变 pkg-*
文件, 请按照 重新定义某个变量 介绍的方法,
而不是覆盖它们来实现。
WRKDIRPREFIX (用于构建的临时目录的父目录名)
一定要确保您的 port 尊重 WRKDIRPREFIX 的设置。
绝大多数 port 并不需要担心这个。 具体说来,
当引用其它 port 的 WRKDIR 时,
需要注意正确的位置应该是
WRKDIRPREFIX PORTSDIR /subdir /name /work
而不是 PORTSDIR /subdir /name /work 或 .CURDIR /../../subdir /name /work ,
或别的什么。
另外, 如果您自行定义了 WRKDIR , 也要把
${WRKDIRPREFIX}${.CURDIR} 放到前面。
区分不同的操作系统, 以及 OS 的版本
在不同版本的 Unix 下可能需要对代码进行一些修改或增加少许编译选项,
才能够正确地编译和运行。 如果您需要根据一些条件来对代码进行修改,
请尽可能让这些修改通用, 这样, 我们就能够将这些代码移植回更早的 FreeBSD
系统, 并交叉移植到其它 BSD 系统, 例如来自 CSRG 的 4.4BSD,
BSD/386, 386BSD, NetBSD 和 OpenBSD。
推荐的获得 4.3BSD/Reno (1990) 以及更新版本 BSD 代码版本号的方式, 是使用
sys/param.h
中所定义的 BSD 宏的值。 一般来说这个文件已经被引用了;
如果没有的话, 增加下述代码:
#if (defined(__unix__) || defined(unix)) && !defined(USG)
#include <sys/param.h>
#endif
到 .c 文件中合适的地方。
我们相信所有定义了这两个符号的系统中, 都提供了
sys/param.h 。 如果您发现有不这样做的系统,
请通过致信 &a.ports; 让我们了解这一情况。
另一种方法是使用 GNU Autoconf 风格的方式:
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
采用这种方法时, 不要忘了把 -DHAVE_SYS_PARAM_H 加到
Makefile 中的 CFLAGS 里。
一旦引用了 sys/param.h , 您就可以使用:
#if (defined(BSD) && (BSD >= 199103))
来检测代码是否正在 4.3 Net2 代码基础,
或更新的系统上编译 (例如 FreeBSD 1.x, 4.3/Reno, NetBSD 0.9, 386BSD,
BSD/386 1.1 以及更高版本)。
使用:
#if (defined(BSD) && (BSD >= 199306))
来检测代码是否正在 4.4 或更新的系统 (例如 FreeBSD 2.x, 4.4,
NetBSD 1.0、 BSD/386 2.0 或更高版本)。
对于 4.4BSD-Lite2 代码系来说, BSD 宏的值应该是
199506 。 这里只是作为信息提供,
您不应使用它来区分基于 4.4-Lite 的 FreeBSD 和基于 4.4-Lite2 的版本。
这些情况下, 您应使用
__FreeBSD__ 宏。
保守地使用:
__FreeBSD__ 在所有版本的
FreeBSD 中皆有定义。 如果您正进行的修改
只 影响 FreeBSD, 则应使用这个宏。
类似 sys_errlist[] 之于
strerror() 这样的移植问题是伯克利代码系公用的,
而并非 FreeBSD 所专有。
在 FreeBSD 2.x 中, __FreeBSD__
定义为 2 。 更早版本中, 它曾经是
1 。 新的版本都会在主要的版本号变化时变更它。
如果您需要区分 FreeBSD 1.x 系统和 FreeBSD 2.x 及更高版本的区别,
通常应使用前述的 BSD 宏来进行。
如果事实上需要一个 FreeBSD 专有的修改 (例如,
在使用 ld 时需要特殊的共享库选项),
则可以用 __FreeBSD__ 和 #if
__FreeBSD__ > 1 来检测 FreeBSD 2.x 和新系统上的变化。
如果需要更细粒度地检测 FreeBSD 2.0-RELEASE 之后版本的变化,
则可以使用:
#if __FreeBSD__ >= 2
#include <osreldate.h>
# if __FreeBSD_version >= 199504
/* 适用于 2.0.5+ 版本的代码 */
# endif
#endif
在已有的数百个 port 中, 只有一两个应该使用 __FreeBSD__ 。
早期的 port 在不适当的地方使用了它并引发问题,
并不意味着您也必定如此。
__FreeBSD_version 值
下面是在 sys/param.h
__FreeBSD_version 中定义的值及其意义的列表,
这里给出以方便您查阅:
__FreeBSD_version 值
版本
__FreeBSD_version
2.0-RELEASE
119411
2.1-CURRENT
199501, 199503
2.0.5-RELEASE
199504
2.1 之前的 2.2-CURRENT
199508
2.1.0-RELEASE
199511
2.1.5 之前的 2.2-CURRENT
199512
2.1.5-RELEASE
199607
2.1.6 之前的 2.2-CURRENT
199608
2.1.6-RELEASE
199612
2.1.7-RELEASE
199612
2.2-RELEASE
220000
2.2.1-RELEASE
220000 (无变化)
在 2.2.1-RELEASE 之后的 2.2-STABLE
220000 (无变化)
texinfo-3.9 之后的 2.2-STABLE
221001
top 之后的 2.2-STABLE
221002
2.2.2-RELEASE
222000
2.2.2-RELEASE 之后的 2.2-STABLE
222001
2.2.5-RELEASE
225000
2.2.5-RELEASE 之后的 2.2-STABLE
225001
合并 ldconfig -R 之后的 2.2-STABLE
225002
2.2.6-RELEASE
226000
2.2.7-RELEASE
227000
2.2.7-RELEASE 之后的 2.2-STABLE
227001
&man.semctl.2; 修改之后的 2.2-STABLE
227002
2.2.8-RELEASE
228000
2.2.8-RELEASE 之后的 2.2-STABLE
228001
&man.mount.2; 修改之前的 3.0-CURRENT
300000
&man.mount.2; 修改之后的 3.0-CURRENT
300001
&man.semctl.2; 修改之后的 3.0-CURRENT
300002
ioctl 参数变化之后的 3.0-CURRENT
300003
ELF 变换之后的 3.0-CURRENT
300004
3.0-RELEASE
300005
3.0-RELEASE 之后的 3.0-CURRENT
300006
3/4切分之后的 3.0-STABLE
300007
3.1-RELEASE
310000
3.1-RELEASE 之后的 3.1-STABLE
310001
C++ 构建/析构函数顺序变化之后的 3.1-STABLE
310002
3.2-RELEASE
320000
3.2-STABLE
320001
二进制不兼容的 IPFW 和 socket 变化之后的 3.2-STABLE
320002
3.3-RELEASE
330000
3.3-STABLE
330001
libc 中加入 &man.mkstemp.3; 之后的 3.3-STABLE
330002
3.4-RELEASE
340000
3.4-STABLE
340001
3.5-RELEASE
350000
3.5-STABLE
350001
3/4切分之后的 4.0-CURRENT
400000
修改动态连接器处理方式之后的 4.0-CURRENT
400001
C++ 构建/析构函数顺序变化之后的
400002
提供 &man.dladdr.3; 之后的 4.0-CURRENT
400003
修正了 __deregister_frame_info 的 4.0-CURRENT
(也表示在 EGCS 1.1.2
集成之后的 4.0-CURRENT)
400004
&man.suser.9; API 变化之后的 4.0-CURRENT
(也表示 newbus 之后的 4.0-CURRENT)
400005
cdevsw 注册机制改变之后的 4.0-CURRENT
400006
加入了 socket 级凭据的 so_cred 之后的 4.0-CURRENT
400007
在 libc_r 中加入 poll 系统调用接口之后的 4.0-CURRENT
400008
将内核中
dev_t 类型改为 struct
specinfo 指针之后的 4.0-CURRENT
400009
修正了一处 &man.jail.2; 漏洞之后的 4.0-CURRENT
400010
sigset_t 数据类型改变之后的 4.0-CURRENT
400011
切换到 GCC 2.95.2 编译器之后的 4.0-CURRENT
400012
加入了可插的 linux模式 ioctl 处理程序后的 4.0-CURRENT
400013
引入 OpenSSL 之后的 4.0-CURRENT
400014
GCC 2.95.2 中 ABI 默认值从 -fvtable-thunks 改为
-fno-vtable-thunks 之后的 4.0-CURRENT
400015
引入 OpenSSH 之后的 4.0-CURRENT
400016
4.0-RELEASE
400017
4.0-RELEASE 之后的 4.0-STABLE
400018
引入延迟校验和之后的 4.0-STABLE
400019
将 libxpg4 的代码并入 libc 之后的 4.0-STABLE
400020
Binutils 升级到 2.10.0 之后的 4.0-STABLE, ELF
标志变化, 以及将 tcsh 引入基本系统
400021
4.1-RELEASE
410000
4.1-RELEASE 之后的 4.1-STABLE
410001
&man.setproctitle.3; 从 libutil 移入 libc
之后的 4.1-STABLE
410002
4.1.1-RELEASE
411000
4.1.1-RELEASE 之后的 4.1.1-STABLE
411001
4.2-RELEASE
420000
合并 libgcc.a 和 libgcc_r.a,
并修改了相关的 GCC 连接方式之后的 4.2-STABLE
420001
4.3-RELEASE
430000
引入 wint_t 之后的 4.3-STABLE
430001
PCI 电源状态 API 合并之后的 4.3-STABLE
430002
4.4-RELEASE
440000
引入 d_thread_t 之后的 4.4-STABLE
440001
mount 结构改变之后的 4.4-STABLE (影响文件系统 kld)
440002
用户态部分的 smbfs 被引入之后的 4.4-STABLE
440003
4.5-RELEASE
450000
usb 结构元素改名之后的 4.5-STABLE
450001
在 &man.rc.conf.5; 变量
sendmail_enable 默认值改为
NONE 之后的 4.5-STABLE
450004
默认将 XFree86 4 用于预编译包构建之后的 4.5-STABLE
450005
accept 过滤器修正了安全问题并且不再会轻易被 DoS
之后的 4.5-STABLE
450006
4.6-RELEASE
460000
修正了 &man.sendfile.2; 以吻合文档,
而不再根据发出的头计算发出数据量之后的 4.6-STABLE
460001
4.6.2-RELEASE
460002
4.6-STABLE
460100
MFC `sed -i' 之后的 4.6-STABLE
460101
MFC 许多 pkg_install 新特性之后的 4.6-STABLE
460102
4.7-RELEASE
470000
4.7-STABLE
470100
开始生成 __std{in,out,err}p 引用, 而不是 __sF。
这将 std{in,out,err} 从编译时表达式变成了运行时值。
470101
MFC mbuf 相关的将 m_aux mbuf 改为 m_tag
的修改之后的 4.7-STABLE
470102
OpenSSL 升级到 0.9.7 之后的 4.7-STABLE
470103
4.8-RELEASE
480000
4.8-STABLE
480100
&man.realpath.3; 变为线程安全的之后的 4.8-STABLE
480101
对 twe 的 3ware API 修改之后的 4.8-STABLE
480102
4.9-RELEASE
490000
4.9-STABLE
490100
kinfo_eproc 中加入 e_sid 之后的 4.9-STABLE
490101
MFC rtld 的 libmap 功能之后的 4.9-STABLE
490102
4.10-RELEASE
491000
4.10-STABLE
491100
MFC 20040629 版本的包维护工具之后的 4.10-STABLE
491101
修正了 VM 当解除 wire 不存在页面时的问题之后的
4.10-STABLE
491102
4.11-RELEASE
492000
4.11-STABLE
492100
将 libdata/ldconfig 目录加入 mtree 文件之后的
4.11-STABLE。
492101
5.0-CURRENT
500000
加入 ELF 头字段, 并改变我们的 ELF 执行文件标记方式之后的
5.0-CURRENT
500001
kld 元数据修改之后的 5.0-CURRENT
500002
buf/bio 修改之后的 5.0-CURRENT
500003
binutils 升级后的 5.0-CURRENT
500004
将 libxpg4 并入 libc,
以及引入 TASKQ 之后的 5.0-CURRENT
500005
加入 AGP 接口之后的 5.0-CURRENT
500006
Perl 升级到 5.6.0 之后的 5.0-CURRENT
500007
KAME 代码升级到 2000/07 之后的 5.0-CURRENT
500008
ether_ifattach() 和 ether_detach()
修改之后的 5.0-CURRENT
500009
将 mtree 改为原先的默认值,
并使用 -L 来跟随符号连接之后的 5.0-CURRENT
500010
kqueue API 修改之后的 5.0-CURRENT
500011
&man.setproctitle.3; 从 libutil 挪到 libc 之后的
5.0-CURRENT
500012
首个 SMPng commit 之后的 5.0-CURRENT
500013
<sys/select.h> 改为 <sys/selinfo.h>
之后的 5.0-CURRENT
500014
libgcc.a 和 libgcc_r.a 以及 GCC
连接方式变动之后的 5.0-CURRENT
500015
修改以允许 libc 和 libc_r 连接到一起,
不再鼓励使用 -pthread 之后的 5.0-CURRENT
500016
从 struct ucred 切换到 struct xucred
以便使内核为 mountd 等程序导出的 API 稳定下来之后的
5.0-CURRENT
500017
加入 CPUTYPE 用于 CPU 专用的优化的
make 变量之后的 5.0-CURRENT
500018
machine/ioctl_fd.h 改为 sys/fdcio.h 之后的
5.0-CURRENT
500019
locale 名称改变之后的 5.0-CURRENT
500020
引入 bzip2 之后的 5.0-CURRENT,
同时也代表删去了 S/Key
500021
加入 SSE 支持之后的 5.0-CURRENT
500022
KSE 第2个里程碑之后的 5.0-CURRENT
500023
d_thread_t 之后的 5.0-CURRENT,
同时 UUCP 被移入 ports
500024
64-位平台上的描述符和 creds API 变化之后的
5.0-CURRENT
500025
采用 XFree86 4 作为默认的预编译包,
以及加入 strnstr() libc 函数之后的 5.0-CURRENT
500026
加入 strcasestr() libc 函数之后的 5.0-CURRENT
500027
引入了用户态的 smbfs 组件之后的 5.0-CURRENT
500028
加入了新的 C99 指定位宽整形变量之后的 5.0-CURRENT
(未予增加)
修改了 &man.sendfile.2; 的返回值之后的 5.0-CURRENT
500029
引入适合表达文件标志的 fflags_t
类型之后的 5.0-
500030
usb 结构元素改名之后的 5.0-CURRENT
500031
引入 Perl 5.6.1 之后的 5.0-CURRENT
500032
&man.rc.conf.5; 变量
sendmail_enable 默认值改为
NONE 之后的 5.0-CURRENT
500033
mtx_init() 增加了第三个参数之后的 5.0-CURRENT
500034
包含 Gcc 3.1 的 5.0-CURRENT
500035
在 /usr/src 中删去了 Perl 的 5.0-CURRENT
500036
加入 &man.dlfunc.3; 之后的 5.0-CURRENT
500037
一些 struct sockbuf 的成员变为结构,
并重新排列顺序之后的 5.0-CURRENT
500038
引入 GCC 3.2.1 之后的 5.0-CURRENT。 头文件也不再使用
_BSD_FOO_T_ 而开始使用 _FOO_T_DECLARED。
这个值还可以用于作为一个包含使用 &man.bzip2.1;
的预编译包支持的预期点。
500039
以去掉对 disklabel 结构内容的依赖的名义,
对磁盘相关的函数进行了许多修改之后的 5.0-CURRENT
500040
libc 中加入 &man.getopt.long.3; 之后的 5.0-CURRENT
500041
Binutils 2.13 升级, 包含了新的 FreeBSD 模拟,
vec 以及输出格式之后的 5.0-CURRENT
500042
libc 中加入了弱 pthread_XXX 符号之后的 5.0-CURRENT,
从而淘汰了 libXThrStub.so。 5.0-RELEASE。
500043
创建 RELENG_5_0 分支之后的 5.0-CURRENT
500100
<sys/dkstat.h> 变成了一个空文件, 不应再被引用
500101
修改 d_mmap_t 接口之后的 5.0-CURRENT
500102
taskqueue_swi 以无全局锁的方式运行之后的 5.0-CURRENT,
同时还加入了使用全局锁的 taskqueue_swi_giant
500103
去掉了 cdevsw_add() 和 cdevsw_remove()
出现 MAJOR_AUTO 分配机制
500104
采用新的 cdevsw 初始化方法之后的 5.0-CURRENT
500105
devstat_add_entry() 被
devstat_new_entry() 取代
500106
修改 devstat 接口; 请参见 sys/sys/param.h 1.149
500107
改变了 Token-Ring 接口
500108
加入 vm_paddr_t
500109
将 &man.realpath.3; 改为线程安全之后的
5.0-CURRENT
500110
&man.usbhid.3; 与 NetBSD 同步之后的 5.0-CURRENT
500111
加入新的 NSS 实现, 以及 POSIX.1 getpw*_r, getgr*_r
函数之后的 5.0-CURRENT
500112
删去旧式 rc 系统之后的 5.0-CURRENT
500113
5.1-RELEASE.
501000
创建 RELENG_5_1 分支之后的 5.1-CURRENT
501100
改正 sigtimedwait(2) 和 sigwaitinfo(2)
语义之后的 5.1-CURRENT
501101
在 &man.bus.dma.tag.create.9; 中加入了 lockfunc
和 lockfuncarg 字段之后的 5.1-CURRENT
501102
集成了 GCC 3.3.1-pre 20030711 之后的
5.1-CURRENT
501103
twe 中 3ware API 变化之后的 5.1-CURRENT
501104
允许动态连接 /bin 和 /sbin,
以及将某些库移动到 /lib 之后的 5.1-CURRENT
501105
增加内核级 Coda 6.x 支持之后的 5.1-CURRENT
501106
将 16550 UART 常量从
<dev/sio/sioreg.h> 挪到
<dev/ic/ns16550.h> 之后的
5.1-CURRENT。 此外, rtld 也从此无条件支持 libmap 功能
501107
更新 PFIL_HOOKS API 之后的 5.1-CURRENT
501108
增加 kiconv(3) 之后的 5.1-CURRENT
501109
默认的 cdevsw open 和 close 操作变化之后的 5.1-CURRENT
501110
cdevsw 的布局变化之后的 5.1-CURRENT
501111
增加 kobj 多继承之后的 5.1-CURRENT
501112
修改 struct ifnet 中的 if_xname 之后的 5.1-CURRENT
501113
将 /bin 和 /sbin 改为动态连接之后的 5.1-CURRENT
501114
5.2-RELEASE
502000
5.2.1-RELEASE
502010
创建 RELENG_5_2 分支之后的 5.2-CURRENT
502100
libc 中加入了 __cxa_atexit/__cxa_finalize
两个函数之后的 5.2-CURRENT
502101
默认线程库从 libc_r 改为 libpthread 之后的
5.2-CURRENT
502102
设备驱动 API 大规模翻修之后的 5.2-CURRENT
502103
增加 getopt_long_only() 之后的 5.2-CURRENT
502104
C 的 NULL 定义改为 ((void *)0) 之后的 5.2-CURRENT,
这会产生更多的编译警告
502105
pf 连入构建和安装过程之后的 5.2-CURRENT
502106
在 sparc64 上将 time_t 改为 64-位 值之后的 5.2-CURRENT
502107
在一些头文件修改以支持 Intel C/C++ 编译器,
以及让 execve(2) 更严格地符合 POSIX 之后的
5.2-CURRENT
502108
引入 bus_alloc_resource_any API 之后的 5.2-CURRENT
502109
加入 UTF-8 locale 之后的 5.2-CURRENT
502110
删去 getvfsent(3) API 之后的 5.2-CURRENT
502111
为 make(1) 增加 .warning 语句之后的 5.2-CURRENT
502112
所有串口设备都强制使用 ttyioctl() 之后的 5.2-CURRENT
502113
引入 ALTQ 框架之后的 5.2-CURRENT
502114
修改 sema_timedwait(9) 使其成功时返回 0,
失败时返回非 0 的错误代码之后的 5.2-CURRENT
502115
将内核 dev_t 改为指向 struct cdev * 的指针之后的
5.2-CURRENT
502116
将内核 udev_t 改为 dev_t 之后的 5.2-CURRENT
502117
为 clock_gettime(2) 和 clock_getres(2) 增加
CLOCK_VIRTUAL 和 CLOCK_PROF 支持之后的 5.2-CURRENT
502118
对网络接口复制进行全面修改之后的 5.2-CURRENT
502119
package 工具升级为 20040629 之后的 5.2-CURRENT
502120
不再将蓝牙代码标记为 i386 专用之后的 5.2-CURRENT
502121
引入 KDB 调试器框架之后的 5.2-CURRENT。
同时还引入了 DDB 作为后台, 以及 GDB 后台。
502122
修改 VFS_ROOT 和 vflush 使其使用一个 struct
thread 参数之后的 5.2-CURRENT。 struct kinfo_proc
增加了一个用户数据指针。 同时, 默认的 X 实现切换为
xorg
502123
将使用 rc.d 和传统脚本的 port 分别启动之后的
5.2-CURRENT
502124
取消前一修改之后的 5.2-CURRENT
502125
删除 kmem_alloc_pageable() 并引入 gcc 3.4.2 的
5.2-CURRENT
502126
修改 UMA 内核 API 允许构建函数和初始化失败之后的
5.2-CURRENT
502127
vfs_mount 签名和全局替换 suser(9) API 的
PRISON_ROOT 为 SUSER_ALLOWJAIL 之后的 5.2-CURRENT
502128
pfil API 修改之前的 5.3-BETA/RC
503000
5.3-RELEASE
503001
创建 RELENG_5_3 分支之后的 5.3-STABLE
503100
加入了 glibc 风格的
&man.strftime.3; 填充选项的 5.3-STABLE
503101
MFC OpenBSD 的 nc(1) 之后的 5.3-STABLE
503102
在 MFC 了
<src/include/stdbool.h> 和
<src/sys/i386/include/_types.h>
用于兼容 GCC 和 Intel C/C++ 编译器的修正之后的 5.4-PRERELEASE
503103
MFC 了将 ifi_epoch 由 wall 时钟时间改为 uptime
之后的 5.4-PRERELEASE
503104
MFC 了 vswprintf(3) 中的 EOVERFLOW 检查的 5.4-PRERELEASE
503105
5.4-RELEASE.
504000
创建 RELENG_5_4 分支之后的 5.4-STABLE
504100
加大默认线程堆栈尺寸之后的 5.4-STABLE
504101
加入 sha256 之后的 5.4-STABLE
504102
MFC if_bridge 之后的 5.4-STABLE
504103
bsdiff 和 portsnap MFC 之后的 5.4-STABLE
504104
在 MFC 了 ldconfig_local_dirs
修改之后的 5.4-STABLE。
504105
5.5-RELEASE.
505000
在创建 RELENG_5_5 分支之后的 5.5-STABLE
505100
6.0-CURRENT
600000
内核中永久性启用 PFIL_HOOKS 之后的 6.0-CURRENT
600001
最初将 ifi_epoch 加入 if_data 结构之后的 6.0-CURRENT。
此后不久即被撤销。 请不要使用这个值。
600002
if_data 中再次加入 ifi_epoch 成员之后的 6.0-CURRENT
600003
将 struct inpcb 参数加入 pfil API 之后的 6.0-CURRENT
600004
newsyslog 加入了 "-d
DESTDIR" 参数之后的 6.0-CURRENT
600005
加入了 glibc 风格的
&man.strftime.3; 填充选项之后的 6.0-CURRENT
600006
加入了 802.11 框架更新之后的 6.0-CURRENT
600007
修改 VOP_*VOBJECT() 并为无全局锁的文件系统引入
MNTK_MPSAFE 标志之后的 6.0-CURRENT
600008
加入 cpufreq 框架和驱动之后的 6.0-CURRENT
600009
引入 OpenBSD 的 nc(1) 之后的 6.0-CURRENT
600010
删去并不存在的 SVID2
matherr() 支持之后的 6.0-CURRENT
600011
增大默认线程堆栈尺寸之后的 6.0-CURRENT
600012
增加了针对
<src/include/stdbool.h> 和
<src/sys/i386/include/_types.h>
的用于 Intel C/C++ 编译器的 GCC-兼容性修正。
600013
修正了 vswprintf(3) 的 EOVERFLOW 检查之后的 6.0-CURRENT
600014
将 struct if_data 成员 ifi_epoch 从 wall 时钟时间改为 uptime
之后的 6.0-CURRENT
600015
修改 LC_CTYPE 磁盘格式之后的 6.0-CURRENT
600016
修改 NLS 编录磁盘格式之后的 6.0-CURRENT
600017
修改 LC_COLLATE 磁盘格式之后的 6.0-CURRENT
600018
将 acpica 头文件安装到 /usr/include
600019
为 send(2) API 加入了 MSG_NOSIGNAL
600020
在 cdevsw 上增加了一些字段
600021
基本系统中删去了 gtar
600022
unix(4) 中加入了 LOCAL_CREDS, LOCAL_CONNWAIT 两个 socket 选项
600023
加入了 &man.hwpmc.4; 及其相关工具之后的 6.0-CURRENT
600024
加入 struct icmphdr 之后的 6.0-CURRENT
600025
pf 更新到了 3.7
600026
引入了内核 libalias 和 ng_nat
600027
将 ttyname_r(3) 接口改为符合 POSIX 标准,
并通过 unistd.h 和 libc
600028
将 libpcap 升级为 v0.9.1 alpha 096 之后的 6.0-CURRENT
600029
引入 NetBSD 的 if_bridge(4) 之后的 6.0-CURRENT
600030
将 struct ifnet 从驱动的 softc 中拆出之后的 6.0-CURRENT。
600031
引入了 libpcap v0.9.1 之后的 6.0-CURRENT。
600032
所有自 RELENG_5 以来没有修改过的共享库的版本递增之后的
6.0-STABLE。
600033
为 dev_clone 处理出口函数中增加身份信息参数之后的
6.0-STABLE。 6.0-RELEASE。
600034
6.0-RELEASE 之后的 6.0-STABLE
600100
将 local_startup 目录中的脚本集成到基本系统的 &man.rcorder.8;
之后的 6.0-STABLE。
600101
更新 ELF 类型和常量之后的 6.0-STABLE。
600102
MFC 了 pidfile(3) API 之后的 6.0-STABLE。
600103
在 MFC 了 ldconfig_local_dirs
修改之后的 6.0-STABLE。
600104
在 csh(1) 中加入了 NLS 目录支持之后的 6.0-STABLE。
600105
6.1-RELEASE
601000
6.1-RELEASE 之后的 6.1-STABLE。
601100
引入 csup 之后的 6.1-STABLE。
601101
更新了 iwi(4) 之后的 6.1-STABLE。
601102
将域名解析函数更新至
BIND9, 并导出了可重入版本的
netdb 函数之后的 6.1-STABLE。
601103
在 OpenSSL 中启用了 DSO (动态共享库)
支持之后的 6.1-STABLE。
601104
6.2-RELEASE
602000
6.2-RELEASE 之后的 6.2-STABLE。
602100
7.0-CURRENT。
700000
所有自 RELENG_5 以来没有修改过的共享库的版本递增之后的
7.0-CURRENT。
700001
为 dev_clone 处理出口函数中增加身份信息参数之后的
7.0-CURRENT。
700002
将 memmem(3) 加入 libc 之后的 7.0-CURRENT。
700003
将 solisten(9) 改为接受一 backlog 参数之后的
7.0-CURRENT。
700004
将 IFP2ENADDR() 改为返回一 IF_LLADDR() 指针之后的
7.0-CURRENT。
700005
在 struct ifnet 中增加 if_addr
成员, 并删除 IFP2ENADDR() 之后的 7.0-CURRENT。
700006
将 local_startup 目录中的脚本集成到基本系统的 &man.rcorder.8;
之后的 7.0-CURRENT。
700007
去掉 MNT_NODEV 挂接选项之后的 7.0-CURRENT。
700008
对 ELF-64 类型和符号版本进行变更之后的
7.0-CURRENT。
700009
增加 hostb 和 vgapci 驱动、 pci_find_extcap(),
并将 AGP 驱动改为不再影射 aperature
之后的 7.0-CURRENT。
700010
除 Alpha 之外的所有平台上 tv_sec 改为 time_t
之后的 7.0-CURRENT。
700011
修改 ldconfig_local_dirs 之后的 7.0-CURRENT。
700012
在修改了
/etc/rc.d/abi 以支持
/compat/linux/etc/ld.so.cache
以某只读文件系统上的符号连接形式存在之后的 7.0-CURRENT。
700013
引入 pts 之后的 7.0-CURRENT。
700014
在引入 &man.hwpmc.4; 的第 2 版 ABI
之后的 7.0-CURRENT。
700015
在 libc 中加入了 &man.fcloseall.3; 之后的
7.0-CURRENT。
700016
删去 ip6fw 之后的 7.0-CURRENT。
700017
引入了 snd_emu10kx 之后的 7.0-CURRENT。
700018
引入了 OpenSSL 0.9.8b 之后的 7.0-CURRENT。
700019
增加了 bus_dma_get_tag 函数之后的 7.0-CURRENT。
700020
在引入了 libpcap 0.9.4 和
tcpdump 3.9.4 之后的 7.0-CURRENT。
700021
在对 dlsym 进行修改, 使其在指定 dso 及其暗指的依赖中查找符号之后的
7.0-CURRENT。
700022
加入新的声音 IOCTL 之后的 7.0-CURRENT。
700023
汇入 OpenSSL 0.9.8d 之后的 7.0-CURRENT。
700024
加入了 libelf 之后的 7.0-CURRENT。
700025
+
+ 对音效相关的 sysctl 进行大幅调整之后的 7.0-CURRENT。
+ 700026
+
请注意, 2.2.5-RELEASE 之后有一段时间的 2.2-STABLE 会声称自己是
2.2.5-STABLE
。 这种模式的版本号表示的是年月。
但随后, 我们决定, 从 2.2 开始, 将它改为更为简洁的 主/次
版本号的形式来命名版本。 这是因为并行地在多个分支上进行开发,
使得通过实际的发布日期来区分不同的版本变得不再显示。
如果您正在做新的 port, 应该不需要担心较早的 -CURRENT;
在此列出仅供参考。
在 bsd.port.mk 之后写一些内容
不要在 .include
<bsd.port.mk> 这行之后增加任何内容。
这通常可以通过在您的 Makefile
中间的某处引用 bsd.port.pre.mk ,
并在结尾的地方引用
bsd.port.post.mk 来避免。
只能够采用
bsd.port.pre.mk /bsd.port.post.mk 或
bsd.port.mk 两种写法之一;
任何时候都不要同时使用两种写法。
bsd.port.pre.mk 只定义了很少的变量,
它们可以在 Makefile
中用于进行一些测试, 而 bsd.port.post.mk
则定义了所有其它的变量。
下面是一些由 bsd.port.pre.mk
定义的比较重要的变量 (这并不是一份完整的列表,
您可以阅读 bsd.port.mk 以获得全部变量的名字)。
变量
描述
ARCH
由 uname
-m 输出得到的硬件架构的名字
(例如, i386 )
OPSYS
由 uname -s 返回的操作系统类型 (例如,
FreeBSD )
OSREL
操作系统的版本号 (例如
2.1.5 或
2.2.7 )
OSVERSION
操作系统的版本号的数值形式; 它等于
__FreeBSD_version 。
PORTOBJFORMAT
系统默认的执行文件格式
(elf 或 aout ;
请注意, 现代的
FreeBSD 版本中,
aout 已在淘汰之列。)
LOCALBASE
local
目录的根 (例如,
/usr/local/ )
X11BASE
X11
目录的根 (例如,
/usr/X11R6 )
PREFIX
port 应被安装到哪里 (参见 关于
PREFIX 的更多说明)。
如果您需要定义
USE_IMAKE , USE_X_PREFIX , 或
MASTERDIR 这些变量, 则应在引用
bsd.port.pre.mk 之前完成。
下面是一些在引用
bsd.port.pre.mk 之后可以进行的判断:
# 如果 perl5 已经在系统中提供, 则不必编译 lang/perl5
.if ${OSVERSION} > 300003
BROKEN= perl is in system
.endif
# ELF 只使用一个 shlib 版本
.if ${PORTOBJFORMAT} == "elf"
TCL_LIB_FILE= ${TCL_LIB}.${SHLIB_MAJOR}
.else
TCL_LIB_FILE= ${TCL_LIB}.${SHLIB_MAJOR}.${SHLIB_MINOR}
.endif
# 软件会自动为 ELF 创建符号链接, 但 a.out 则需要另行创建
post-install:
.if ${PORTOBJFORMAT} == "aout"
${LN} -sf liblinpack.so.1.0 ${PREFIX}/lib/liblinpack.so
.endif
您还记得应该在
BROKEN= 和
TCL_LIB_FILE= 后面使用制表符,
而不是空格, 对吧? :-)
安装附加的文档
如果您的软件包含了标准的联机手册和 info 手册以外的文档,
而且您认为它们对用户会有用, 请把这些文档安装到
PREFIX /share/doc 下。
和前面类似, 这也可以在
post-install target 中完成。
为您的 port 建立一个新的目录。
这个目录的名字应该反映它是属于哪个 port 的。 通常建议使用
PORTNAME 。 不过, 如果您认为不同版本的 port
可能会同时安装, 也可以用完整的
PKGNAME 。
另外, 应该让是否安装取决于变量
NOPORTDOCS 的设置, 这样用户就能够在
/etc/make.conf 中禁止安装它。 例如:
post-install:
.if !defined(NOPORTDOCS)
${MKDIR} ${DOCSDIR}
${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${DOCSDIR}
.endif
这里是一些便于使用的变量, 以及它们在
Makefile 中默认的展开方式:
DATADIR 会展开成
PREFIX /share/PORTNAME 。
DOCSDIR 会展开成
PREFIX /share/doc/PORTNAME 。
EXAMPLESDIR 会展开成
PREFIX /share/examples/PORTNAME 。
这些变量也会被导出到 PLIST_SUB 中。
只要可能, 它们的值就将在那里以相对于
PREFIX 的路径形式出现。
也就是说, share/doc/PORTNAME
在装箱单中默认情况下会替换掉 %%DOCSDIR%% , 等等。
(更多的 pkg-plist 代换可以在
这里 找到。)
所有的安装的文档文件和目录,
都应在 pkg-plist 出现, 并且使用
%%PORTDOCS%% 前缀, 例如:
%%PORTDOCS%%%%DOCSDIR%%/AUTHORS
%%PORTDOCS%%%%DOCSDIR%%/CONTACT
%%PORTDOCS%%@dirrm %%DOCSDIR%%
如果不希望在 pkg-plist 中逐个列举文档文件, port
也可以将 PORTDOCS 设置为一组文件及其 shell glob
模式, 通过这种方式来加入到最终的装箱单中。
这些名字应是相对于 DOCSDIR 的。
因此, 使用了 PORTDOCS ,
并将文档安装到非标准位置的 port, 应相应地设置
DOCSDIR 。
如果有在 PORTDOCS 中列出目录,
或者这一变量中的 glob 模式匹配到了目录, 则整个子树中的文件和目录,
都将被注册到最终的装箱单中。 如果定义了 NOPORTDOCS , 则
PORTDOCS 中定义的文件和目录将不被安装或加入装箱单。
是否安装文档到前面所说的 PORTDOCS 仍取决于 port 本身。
下面是一个典型的使用 PORTDOCS 的例子:
PORTDOCS= README.* ChangeLog docs/*
您也可以使用 pkg-message 这个文件,
来在安装时显示一些信息。 参见 关于使用
pkg-message 的这一节 以了解进一步的详情。
需要说明的是, 并不需要把 pkg-message 加到
pkg-plist 中。
子目录
尽可能让 port 将它创建的文件, 放置到
PREFIX 中正确的位置。 一些 port
会把各式各样的东西混在一起, 并放到一个同名的目录中, 这是不对的。
另外, 许多 port 会把除了可执行文件、 头文件和联机手册之外的所有文件,
全都一股脑地放到 lib 中, 这在和 BSD
配合使用时会有问题。 多数文件,
应被放到下列位置之一: etc
(安装/配置文件)、 libexec
(由系统内部调用的可执行文件)、 sbin
(为超级用户/管理员提供的可执行文件)、 info
(用于 info 浏览器的文档) 或 share
(平台无关的其它文件)。 请参见 &man.hier.7; 以了解进一步的详情; 针对
/usr 的那些规则, 同样也适用于
/usr/local 。 例外情况是那些需要和 USENET
news
打交道的 port, 它们可以选择采用
PREFIX /news
作为文件的目的地。
在 wrapper 脚本中使用 exec 语句
如果 port 安装了用以启动其他程序的脚本,
并且运行其他程序是这些脚本的最后一项操作,
请务必使用 exec 语句来运行这些程序, 例如:
#!/bin/sh
exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar "$@"
使用 exec 语句表示执行指定的程序来取代 shell
进程。 如果省略了 exec ,
则 shell 进程会一直在内存中, 从而不必要地消耗了额外的系统资源。
UID 和 GID
最新的预留 UID 和 GID 可以在 ports/UIDs 和
ports/GIDs 这两个文件中找到。
如果您的 port 安装到系统上之前需要一些用户,
请使用 pkg-install 脚本来调用
pw 以便自动地创建它们。 请参见
net/cvsup-mirror 提供的例子。
请注意我们强烈地不推荐这样做。
请在前面提到的那两个文件中注册所需的用户/组 ID 号。
如果您的 port 需要与其编译成安装包时同样的用户/组 ID,
则必须在 50 到 999 之间选择一个未用的 UID 并在
ports/UIDs (用于用户) 或
ports/GIDs (用于组) 中进行注册。 请参见
japanese/Wnn6 提供的例子。
如果您的 port 需要在这一范围内预留新的 UID 或 GID 的话,
请同时提交修改这两个文件的补丁。
理性行事
任何 Makefile 都应该简单并理性地行事。
如果您能让其中的条目更为简单和易读, 一定要这样做。
例如, 使用 make 提供的
.if 结构, 而不要使用 shell 的
if , 只要能重定义
EXTRACT* 就不要重载
do-extract , 尽量使用
GNU_CONFIGURE 而不是 CONFIGURE_ARGS
+= --prefix=${PREFIX} 。
如果您在尝试做什么事情的时候发现不得不写大量的代码,
请回过头来复审一下
bsd.port.mk , 看看是否有您正打算做的事情的现成实现。
尽管读起来可能很费劲, 但有很多貌似很难的问题,
在 bsd.port.mk 中都给出了十分简便的解决方案。
遵循 CC 和
CXX 设置
port 应遵循 CC
和 CXX 变量的设置。
这也就是说, port 不应使用绝对的方式来设置这个变量的值,
而罔顾已经存在的设置; 与此相反, 它应该在其值后加入需要的其它值。
这样, 就可以设置全局的构建选项, 令其影响所有的 port 构建过程了。
如果实在无法这样做, 请在 Makefile
中加入 NO_PACKAGE=ignores
cflags 。
下面的 Makefile
实例给出了如何遵循 CC 和 CXX
变量的设置。 注意这里用到的 ?= :
CC?= gcc
CXX?= g++
下面则是没有遵循
CC 和 CXX
的例子:
CC= gcc
CXX= g++
在 FreeBSD 系统中,
CC 和 CXX
这两个变量都可以在
/etc/make.conf 中自行定义。
第一个例子只有在
/etc/make.conf 中没有定义时才对这两个变量进行定义,
从而保持了系统范围的配置。 而第二个例子则会覆盖任何现有的配置。
遵循 CFLAGS
您的 port 应遵循 CFLAGS 变量的设置。
这也就是说, port 不应使用绝对的方式来设置这个变量的值,
而罔顾已经存在的设置; 与此相反, 它应该在其值后加入需要的其它值,
这样, 就可以设置全局的构建选项, 令其影响所有的 port 构建过程了。
如果实在无法这样做, 请在 Makefile
中加入 NO_PACKAGE=ignores
cflags 。
下面的 Makefile 例子,
可以帮助我们理解如何遵循 CFLAGS 的设置。 注意所用的
+= :
CFLAGS+= -Wall -Werror
下面是一个未能遵循
CFLAGS 设置的例子:
CFLAGS= -Wall -Werror
一般来说, CFLAGS 在
FreeBSD 系统中是在 /etc/make.conf 里配置的。
第一个例子在
CFLAGS 变量中增加了一些参数,
并保持了所有系统预定义的标志。 而第二个例子,
则会覆盖掉任何先前定义的参数。
您应从第三方软件的
Makefile 中去掉特殊的优化设置。
系统的 CFLAGS 给出了全系统范围内的优化设置参数。
下面是一个未经修改的 Makefile
实例:
CFLAGS= -O3 -funroll-loops -DHAVE_SOUND
如果使用系统的优化参数, 则
Makefile 中的设置应该类似下面这样:
CFLAGS+= -DHAVE_SOUND
线程库
在 &os; 上, 线程库必须通过特殊的连接器参数
-pthread 连接到可执行文件。 如果 port 一定要直接连接
-lpthread 或 -lc_r ,
则应将其改为使用由 ports 框架提供的 PTHREAD_LIBS 。
这个变量的值通常是 -pthread ,
但在某些特定平台上的 &os; 版本中, 它可能是其它值, 因此, 不要将
-pthread 硬编码到您的补丁中, 而应使用
PTHREAD_LIBS 变量。
如果设置了 PTHREAD_LIBS ,
而在构建时出现 unrecognized
option '-pthread' 这样的错误, 可能需要通过将
CONFIGURE_ENV 设为 LD=${CC}
来使用
gcc 作为连接器。
-pthread 这一选项并不为
ld 所直接支持。
反馈
如果进行了一些很好的修改和补丁, 一定要把它们发回给原作者,
或维护者, 以便在下一版本的代码中包含它们。
这会让您在软件发布新版本的时候变得轻松一些。
README.html
不要包含 README.html 文件。
这个文件并非 CVS 代码库中的一部分, 它是由
make readme 命令生成的。
使用 BROKEN 、
FORBIDDEN 或 IGNORE
阻止用户安装 port
某些时候会需要阻止用户安装某个 port。
想要告诉用户某个 port 不应被安装, 有许多可以在 port 的
Makefile 中使用的
make 变量。 下列
make 的值, 将是在用户试图安装时得到的提示信息。
务请使用正确的 make 变量,
因为每一个都表达了截然不同的意义, 而且许多自动化系统, 例如
port 构建集群、
FreshPorts, 以及
portsmon, 都依赖于
Makefile 的正确性。
变量
BROKEN 专门用于表达目前无法正确编译、
安装或卸载这类问题。 如果是临时性的问题, 则可以使用它。
如果进行了相关的配置, 则构建集群仍将尝试构建它,
以确认导致问题的深层问题是否已被解决。 (不过, 一般情况下,
构建集群并不会这样做。)
举例来说, 当 port 发生下述情况时, 应使用
BROKEN :
无法编译 (does not compile)
无法正确进行配置或安装操作
在
${LOCALBASE} 和
${X11BASE} 以外的地方安装文件
卸载时无法删除所安装的全部文件 (不过,
留下用户改过的文件可接受的, 因为可能希望这样作)
FORBIDDEN 用于表示 ports 中包含安全漏洞,
或者可能会给安装了这个 port 的 FreeBSD
系统带来严重的安全隐患 (例如: 一个很不安全的程序,
或包含了能够被轻易攻陷的服务的软件)。 如果发现了安全漏洞,
而其作者没有发布升级版本, 则应立即把那个
port 标记为 FORBIDDEN 。
理想情况下, 包含安全漏洞的 port 应被尽快升级,
以便减少包含漏洞的 FreeBSD 主机的数量
(我们希望保持良好的安全记录), 然而,
有时在安全漏洞的披露和软件更新之间可能会有一个间隔,
此时应予以说明。 除了安全之外, 请不要以任何其它理由将 port 标记为
FORBIDDEN 。
IGNORE 用来表示 port
由于某些其它原因不应予以构建。 如果认为发生了结构性的问题,
则应使用它。 任何情况下,
构建集群都不会构建标记为
IGNORE 的 port。 以下是使用
IGNORE 的一些例子:
能够编译但无法正常运行
无法与运行的 &os; 版本一同工作
构建时需要 &os; 内核的源代码,
但用户没有安装它们
由于授权原因, 必须手工下载 distfile
无法与的某个已安装的 port 一同工作 (例如, port 依赖于
www/apache21 而安装的则是
www/apache13 )
如果 port 与某个已经安装的
port 冲突 (例如, 它们在同一位置安装同名但功能不同的文件),
则应 使用
CONFLICTS 来标记它。
CONFLICTS 将自动地设置
IGNORE 。
如果 port 只应在某些平台上标记为 IGNORE ,
还有另外两个方便使用的
IGNORE 变量可供选择:
ONLY_FOR_ARCHS 和
NOT_FOR_ARCHS 。 例如:
ONLY_FOR_ARCHS= i386 amd64
NOT_FOR_ARCHS= alpha ia64 sparc64
可以使用 ONLY_FOR_ARCHS_REASON 和
NOT_FOR_ARCHS_REASON 来配置定制的
IGNORE 消息。 此外, 还可以使用
ONLY_FOR_ARCHS_REASON_ARCH
和
NOT_FOR_ARCHS_REASON_ARCH
来分别指定与具体平台有关的信息。
如果 port 会下载并安装用于 i386 的预编译二进制文件, 则应设置
IA32_BINARY_PORT 。 如果设置了这个变量,
则系统会检查是否已经在
/usr/lib32 目录中安装了
IA32 版本的函数库, 以及内核是否提供了 IA32 兼容支持。
如果这些依赖条件不满足, 则会自动设置
IGNORE 。
实现说明
这些字串不应使用引号括起来。 此外, 由于显示给用户的方式不同,
这些字串的措辞也应有所不同。 例如:
BROKEN= this port is unsupported on FreeBSD 5.x
IGNORE= is unsupported on FreeBSD 5.x
它们分别会在
make describe 时产生下面的输出:
===> foobar-0.1 is marked as broken: this port is unsupported on FreeBSD 5.x.
===> foobar-0.1 is unsupported on FreeBSD 5.x.
使用 DEPRECATED
或 EXPIRATION_DATE 表示某个 port 将被删除
一定要记得 BROKEN 和
FORBIDDEN 只应作为当某个 port
无法正常工作时的临时解决方案。 永久性地坏掉了的 port 应被从 ports tree
中完全删除。
需要时还可以使用 DEPRECATED
和 EXPIRATION_DATE 来通知用户某个 port
不应被使用, 并即将被删除。 前一个变量用来表达为什么计划删除 port;
而后一个是则是一个 ISO 8601 格式的日期 (YYYY-MM-DD)。
两者都会向用户呈现。
也可以设置 DEPRECATED
而不给出 EXPIRATION_DATE (例如,
建议使用某个新版本的 port), 但反之则没有意义。
目前还没有确切的关于需要给出多少通知的政策。
当前的实践是, 对于与安全有关的问题为一个月,
而与构建有关的问题则为两个月。 这也让有兴趣的 committer
能够有一点时间来修正问题。
避免使用 .error 结构
在 Makefile 中给出信号,
表示由于某种外界因素 (例如, 用户指定了无效的构建选项)
而无法安装的方法是将变量
IGNORE 设为一非空值。 这个值将被格式化,
并在用户执行 make install 是给出提示。
用 .error 实现这一目的是一种常见的误用。
这样做的问题是, 许多在 ports 树上运行的自动化工具会因此而失败。
最常见的情况见于构建 /usr/ports/INDEX 的过程
(参见 )。 然而, 即使十分普通的命令,
例如 make -V maintainer ,
在这种情况下也会失败。 这是不可接受的。
怎样避免使用 .error
考虑有人在 make.conf 中设置了
USE_POINTYHAT=yes
的情形。 接下来的例子中, 第一个 Makefile
中的问题将导致 make index 失败,
而第二个则不会:
.if USE_POINTYHAT
.error "POINTYHAT is not supported"
.endif
.if USE_POINTYHAT
IGNORE=POINTYHAT is not supported
.endif
对于 sysctl 的使用
除了在 target 中之外, 是不鼓励使用 sysctl
的。 这是因为计算
makevar , 例如在
make index 中所进行的那种,
都不得不运行一条命令, 这会使这一操作变得更慢。
在使用 &man.sysctl.8; 时,
务必通过 SYSCTL 变量来进行,
因为此变量将展开成命令的完整路径, 并且用户可以根据需要另行指定。
重新发布的 distfiles
有时, 一些软件的作者会修改业已发布的 distfile 的内容,
而并不修改文件名。 这种情况下, 您需要验证这些变动是来自软件作者的官方改动。
在过去, 曾经发生过下载服务器上的 distfile 被悄悄换成注入过恶意代码的版本,
并给用户安全造成威胁或损害的事情。
您应保留一份旧的 distfile, 并下载一份新的, 分别展开,
用 &man.diff.1; 来对比其内容。 如果没有发现可疑的变动,
就可以更新 distinfo 了。
请务必在您的 PR 或 commit log 中对这些差异进行描述,
以便让别人了解您已经仔细对比过差异, 并确认没有问题了。
除此之外, 也可以联系软件的作者, 以确认这些修改是否是他们做的。
一些必要的 workaround
有时, 需要绕过一些较早版本的 &os; 中包含软件中的 bug。
某些版本的 &man.make.1; 在处理 OSVERSION
的比较时存在问题, 至少对 4.8 和 5.0 是这样。 这经常会导致在
make describe 时发生问题 (因而,
ports make index 也会无法正常工作)。
绕过这个问题的方法, 是在判断语句周围增加空格, 例如:
if ( ${OSVERSION} > 500023 )
请小心, 在 4.9 或 5.2 上测试安装,
是 不能 检测到这个问题的。
杂记
需要仔细地反复检查
pkg-descr 和 pkg-plist
这两个文件。 如果您正在复审一个 port,
并认为这两个文件应该改进, 请一定要这样做。
请不要在系统中复制多份 GNU General Public License。
一定要非常小心地处理法律问题!
不要让我们发布没有得到合法授权的软件!
示范的 Makefile
这里是一个您可以在建立新 port 时参考的
Makefile 。 请务必删除不需要的那些注释
(方括号中间的文字)!
建议您按照下面这样的格式 (变量顺序, 小节之间的空行等) 来编写。
这个格式的作用是便于查找重要的信息。 我们建议您使用 portlint 来检查
Makefile 。
[头部... 主要是让我们更容易地分辨不同的 port。]
# New ports collection makefile for: xdvi
[版本这行, 只有在 PORTVERSION 变量不足以描述 port 时才需要]
# Date created: 26 May 1995
[这是最初将软件移植到 FreeBSD 上的日期, 一般来说是建立这份 Makefile 的日期。
请注意不要在之后再次修改这个日期。]
# Whom: Satoshi Asami <asami@FreeBSD.org>
#
# $FreeBSD$
[ ^^^^^^^^^ 这是 CVS 在文件 commit 到我们的代码库时, 自动进行替换的 RCS ID。
如果您正在升级 port, 不要把它改回 "$FreeBSD$"。
CVS 会自动进行处理。]
#
[这个小节描述 port 本身以及主要下载站点 - PORTNAME 和 PORTVERSION
应放在最前面, 随后是 CATEGORIES, 然后是 MASTER_SITES, 接下来是
MASTER_SITE_SUBDIR。 如果需要的话, 接下来应指定
PKGNAMEPREFIX 和 PKGNAMESUFFIX。 随后是 DISTNAME, EXTRACT_SUFX,
以及 DISTFILES, EXTRACT_ONLY, 如果需要的话。]
PORTNAME= xdvi
PORTVERSION= 18.2
CATEGORIES= print
[如果不想使用 MASTER_SITE_* 宏, 一定不要忘记结尾的斜线 ("/")!]
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
PKGNAMEPREFIX= ja-
DISTNAME= xdvi-pl18
[如果源代码包不是标准的 ".tar.gz" 形式, 就需要设置这个]
EXTRACT_SUFX= .tar.Z
[分散的补丁 -- 可以为空]
PATCH_SITES= ftp://ftp.sra.co.jp/pub/X11/japanese/
PATCHFILES= xdvi-18.patch1.gz xdvi-18.patch2.gz
[监护人(maintainer); *必须有*! 这是某个资源处理 port 更新、 构建失败,
以及回答用户直接提问或汇报 bug 的人。 为了保证 Ports Collection
有尽可能高的品质, 我们不再接受指定给 "ports@FreeBSD.org" 的新 port。]
MAINTAINER= asami@FreeBSD.org
COMMENT= A DVI Previewer for the X Window System
[依赖的其它软件包 -- 可以为空]
RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript
LIB_DEPENDS= Xpm.5:${PORTSDIR}/graphics/xpm
[这节是其它不适合上几节的标准 bsd.port.mk 变量]
[如果需要在 configure、 build 或 install 过程中提问...]
IS_INTERACTIVE= yes
[如果解压缩到 ${DISTNAME} 以外的目录...]
WRKSRC= ${WRKDIR}/xdvi-new
[如果作者发布的补丁不是相对于 ${WRKSRC} 的, 可能需要调整这个]
PATCH_DIST_STRIP= -p1
[如果需要运行由 GNU autoconf 生成的 "configure" 脚本]
GNU_CONFIGURE= yes
[如果需要使用 GNU make, 而不是 /usr/bin/make 来完成构建...]
USE_GMAKE= yes
[如果是一个 X 应用程序, 并使用 "xmkmf -a" 来运行...]
USE_IMAKE= yes
[et cetera.]
[将在接下来的部分使用的非标准的变量]
MY_FAVORITE_RESPONSE= "yeah, right"
[接下来是特殊规则, 按调用顺序排列]
pre-fetch:
i go fetch something, yeah
post-patch:
i need to do something after patch, great
pre-install:
and then some more stuff before installing, wow
[结语]
.include <bsd.port.mk>
保持同步
&os; 的 Ports Collection 在持续地进行修改。
这里提供了一些关于如何保持同步的信息。
FreshPorts
最简单的了解已经被 commit 到 ports 中的更新的方法, 是订阅
FreshPorts 。
您可以选择多个 ports 并对其进行监视。 强烈建议维护人员订阅它,
这样就不仅能接收到他们自己所做的修改, 而且能看到其它 &os;
committer 所做的改动。 (保持与所依赖的
ports 框架同步是必要的—虽然一般来说您会在这样的 commit
之前收到一个礼貌性的通知, 但有时可能会有人没有注意到需要这样做,
或者这样做很困难。 另外, 有些时候通知的修改也可能是微不足道的。
我们希望每一个人能够正确地进行判断。)
如果想使用 FreshPorts, 之需要建立一个账号。 如果您注册的邮件地址是
@FreeBSD.org , 您会看到 web 页面右侧的 opt-in
连接。 如果您已经注册了 FreshPorts 账号,
但没有使用 @FreeBSD.org 邮件地址,
则只需把邮件地址改为 @FreeBSD.org , 重新订阅,
并将其改回。
FreshPorts 也会对每一个 FreeBSD ports tree 上的 commit
进行自动的合法性检查。 如果您订阅了这项服务, 则如果发现了错误,
就会收到来自 FreshPorts 的检测报告。
代码库的 Web 访问界面
可以通过 web 界面来浏览源代码库中的文件。
影响整个 ports 系统的修改, 现在都会在
CHANGES 文件中说明。 影响某一个 port 的变动, 则在
UPDATING 文件中说明。 尽管如此, 所有问题最为权威的答案,
毫无疑问应该是
bsd.port.mk 的源代码, 以及相关的文件。
&os; Ports 邮件列表
如果您维护了某个或某一些 ports, 则应该考虑订阅
&a.ports;。 对于 ports 工作方式的重要修改都会在此宣示,
并提交到 CHANGES 。
位于 pointyhat.FreeBSD.org
的 &os; Port 构建集群
&os; 的一个最不为人所知的强项是,
它拥有一个专用于持续构建 Ports Collection 的集群,
这个集群会构建所有主要的 OS 版本在每一个 Tier-1 架构上的 package。
您可以在
package
构建和错误日志 找到其结果。
每一个 port 都会被构建,
除非标记为 IGNORE 。
标记了 BROKEN 的 port 仍然会被继续尝试,
以了解是否某些依赖关系的变动解决了其问题
(这是通过给 port 的 Makefile 传
TRYBROKEN 参数来完成的)。
&os; 的 Port Distfile 普查
构建集群是一组专门用于构建所有 ports 的最新的版本的机器,
其上已经下载所有的 distfile。 然而, 由于 Internet 在持续地发生变化,
distfile 可能很快就消失了。 FreeBSD
Ports distfiles 普查 试图查询每一个 port 的所有下载站点,
以期找出这些文件是否依然存在。 维护者应规律性地检查这些报告,
这不仅会提高用户构建的速度, 同时也避免了浪费那些镜像了全部
distfile 的志愿者的带宽。
&os; 的 Ports 追踪系统
另一个非常方便的资源, 就是
FreeBSD Ports 追踪系统 (也被称作
portsmon )。
这个系统包含了一个处理若干信息来源的数据库,
并提供了一个可以通过 web 方式浏览的界面。 目前,
它利用到了和 ports 有关的问题报告 (PR)、 来自构建集群的错误日志,
以及来自 Ports Collection 的文件所提供的信息。
未来, 还会对它进行进一步的扩展, 从而提供包括 distfile 普查,
以及其它来源在内的更多信息。
要使用这个工具, 可以从查看关于某一个 port 的全部资料的
Port 的纵览 开始。
本文撰写时, 这是唯一一个能够将 GNATS PR 项,
同对应的 port 名字映射起来的资源。 (提交 PR 的用户,
有时并不在 Synopsis (概要) 中指明 port 的名字,
尽管我们希望他们这样做)。 因此, portsmon
在您想要查找是否有人提交某个现存的 port 的 PR,
以及它的构建是否出现了错误; 或在您创建新的 port
之前想要查找一下是否已经有人提交过时, 就非常有用了。