diff --git a/zh_CN.GB2312/books/handbook/basics/chapter.sgml b/zh_CN.GB2312/books/handbook/basics/chapter.sgml index f43b3fb2a7..9dfbbc71cb 100644 --- a/zh_CN.GB2312/books/handbook/basics/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/basics/chapter.sgml @@ -1,2297 +1,2297 @@ Chris Shumway Rewritten by UNIX 基础 概述 基础 下列章节的命令和功能适用于FreeBSD操作系统。 同时这里许多内容和一些 &unix; 类似操作系统相关。 假如您已经熟悉这些内容可跳过不阅读。 假如您是FreeBSD新手, 那您应该认真详细地从头到尾读一遍这些章节。 读取这些内容,您将会学到: 怎样在FreeBSD使用虚拟控制台 &unix;文件权限是怎样工作的。 &os;默认文件系统的架构。 &os;磁盘架构。 怎样挂接或卸下文件系统。 什么是进程、守护进程、信号。 什么是shell,应当怎样去改变登录进入的默认环境。 怎样使用基本的文本编辑器。 什么是设备,什么是设备节点。 &os; 下,使用的是什么可执行文件格式。 怎样使用 man 手册并取得更多资讯。 虚拟控制台和终端 虚拟控制台 终端 FreeBSD能多方面应用,其中之一它能在字符终端输入命令。 您可以在这方面容易地使用FreeBSD这个有强大适应性和功能的 &unix; 系统, 这部份介绍 多终端多控制台, 和您在 FreeBSD 应怎样使用它们。 控制台 控制台 假如您没有设置到 FreeBSD 在启动期间给出图形登录, 那么系统将在引导和启动脚本正确运行完成后,给您一个登录的提示。 您会看到类似这样的界面: Additional ABI support:. Local package initialization:. Additional TCP options:. Fri Sep 20 13:01:06 EEST 2002 FreeBSD/i386 (pc3.example.org) (ttyv0) login: 这些信息可能和您的系统稍微有点不同,但不会有很大差别。 最后两行是我们感兴趣的, 理解这一行: FreeBSD/i386 (pc3.example.org) (ttyv0) 这一行是您刚才启动的系统信息其中一块, 您所看到的是一个FreeBSD控制台, 运行在一个Intel或兼容的x86体系架构上面 现在理解一下i386的含义。 请注意 即使您的 FreeBSD 不是运行在一个 Intel 386 CPU, 都会定为i386。 他不是指您的处理器,而处理器的体系结构已经显示过去了。 。这个结构名称 (每一种&unix;结构都有自己的名称) 叫 pc3.example.org, 就是现在这个系统控制台—这个 ttyv0 终端的样子。 在最后,最后一行一直保持这样: login: 假设在这一部份您的用户名 username已经注册在FreeBSD里, 那一步介绍您应怎样做。 进入FreeBSD FreeBSD是一个多用户和多重处理的系统, 这个介绍换句话来说就是一个系统可容纳许多不同的用户, 谁都可以同时在单一结构下运行大量的程序。 每一个多用户系统都必须在某方面去区别user, 在FreeBSD里 (和这&unix; 类似的操作系统),完成这方面工作是有必要的, 每位使用者在运行程之前都必须登录, 每位用户都有他的用户名 (username) 和密码 (password)。 FreeBSD 会在用户进入之前作出两次询问。 启动脚本 在FreeBSD启动和启动脚本正确运行完后 启动脚本这些程序在FreeBSD在启动过程中运行。 它们的主要功能为其他每方面的运行作好准备, 和运行您的配置所用到的相关环境。 ,它将要求您提供一个有效的用户名: login: 举个例子更容易理解,我们假设您的用户名叫john。 在提示符下输入 john并单击Enter, 此时您应该看到这个提示password: login: john Password: 现在输入 john的密码,和单击 Enter。这个密码是没有回显的! 您在这时不必担心,它出于安全考虑才这样做的。 假如您输入的密码是正确的,您应该尽快进入FreeBSD并为练习可用的命令作好准备。 您应该看见 MOTD 或者出现一个命令提示符 (#$% 字符). 这表明您已成功登录进入FreeBSD。 多个控制台 在一个控制台运行 &unix; 命令虽说很好, 但FreeBSD具有一次运行 多个程序的能力。仅使用一个控制台只会浪费FreeBSD同时运行多任务的能力。 而虚拟控制台在这方面发挥强大的功能。 FreeBSD 能配置出给您不同需求的虚拟控制台, 在键盘上您用一组键就能从各个虚拟控制台之间切换。 各个控制台有自己的传输通道, 当您从各个控制台切换时 FreeBSD 会切换到合适的键盘传输通道和显示器传输通道。 FreeBSD 各个控制台之间可利用特殊组键切换并保留原有控制台 关于 FreeBSD 的控制台和键盘设备这些详细资料或使用技巧可在手册里找到: &man.syscons.4;、&man.atkbd.4;、&man.vidcontrol.1; 和 &man.kbdcontrol.1;。 我们不在这里详细介绍, 但是爱好者总会在手册里找到详细的答案。 ,您可这样做: AltF1AltF2, 一直到 AltF8 在FreeBSD里切换到其中一个虚拟控制台。 同样地, 您正在从其中某个控制台切换到另一个控制台的时候, FreeBSD 会保存正在使用和恢复将要使用屏幕传输通道。 这种结果形成一种 错觉, 您拥有许多虚拟屏幕和键盘可以输入很多的命令。 这些程序需要在一个虚拟控制台不能停止运行而又不需要观察它, 它继续运行而您可以切换到其他的虚拟控制台。 <filename>/etc/ttys</filename>文件 FreeBSD虚拟控制台的默认配置为8个,但并不是硬性设置, 您可以很容易设置虚拟控制台的个数增多或减少。 虚拟控制台的的编号和设置在/etc/ttys 文件里。 您可以使用/etc/ttys文件在FreeBSD下配置虚拟控制台。 文件里每一未加注释的行都能设置一个终端或虚拟控制台 (当行里含有 # 这个字符时不能使用) 。 FreeBSD 默认配置是配置出9个虚拟控制台而只能启动8个, 以下这些行是 ttyv 一起启动: # name getty type status comments # ttyv0 "/usr/libexec/getty Pc" cons25 on secure # Virtual terminals ttyv1 "/usr/libexec/getty Pc" cons25 on secure ttyv2 "/usr/libexec/getty Pc" cons25 on secure ttyv3 "/usr/libexec/getty Pc" cons25 on secure ttyv4 "/usr/libexec/getty Pc" cons25 on secure ttyv5 "/usr/libexec/getty Pc" cons25 on secure ttyv6 "/usr/libexec/getty Pc" cons25 on secure ttyv7 "/usr/libexec/getty Pc" cons25 on secure ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure 您能在这文件详细设置每行的参数,加载虚拟控制台启动所需要的物件。 请参考 &man.ttys.5; 联机手册。 单用户模式的控制台 关于 单用户模式 详细介绍在 这里可以找到。 当您运行单用户模式时只能使用一个控制台, 没有多个虚拟控制台可使用。 单用户模式的控制台同也可以在 /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 secure 这个 console 已经注释掉, 您可编辑这行把 secure 改为 insecure。 假如您这么做, 当用单用户进入 FreeBSD 时, 它仍然要求提供 root 用户的密码。 在把这个选项改为 insecure 的时候一定要小心, 如果您忘记了 root用户的密码, 进入单用户会有点麻烦。 尽管仍然能进入单用户模式, 但如果您不熟悉它就会非常令人头疼。 权限 UNIX FreeBSD,是 BSD &unix; 的延续, 并基于几个关键的 &unix; 观念。 从一开始就多处提到 FreeBSD 是一个多用户的操作系统, 它能分别处理几个同时工作的用户所分配的毫无关联任务。 并负责为每位用户的硬件设备、 外设、 内存和 CPU 处理时间作出合理安排。 因为系统有能力支持多用户, 在每一方面系统都会作出谁能读、 写和执行的资源权力限制。 这点权限以三个八位元的方式储存着, 一个是表示文件所属者, 一个是表示文件所属群组, 一个是表示其他人。 这些数字以下列方式表示: 权限 文件权限 数值 权限 目录列表 0 不能读,不能写,不能执行 --- 1 不能读,不能写,可执行 --x 2 不能读,可写,不能执行 -w- 3 不能读,可写,可执行 -wx 4 可读,不能写,不能执行 r-- 5 可读,不能写,可执行 r-x 6 可读,可写,不能执行 rw- 7 可读,可写,可执行 rwx ls 目录 使用命令的 (&man.ls.1;) 参数可以显示出文件的所属者、 所属组和其他人等属性。 请看以下的例子: &prompt.user; ls -l total 530 -rw-r--r-- 1 root wheel 512 Sep 5 12:31 myfile -rw-r--r-- 1 root wheel 512 Sep 5 12:31 otherfile -rw-r--r-- 1 root wheel 7680 Sep 5 12:31 email.txt ... 使用 ls -l 在每行的开始出现了: -rw-r--r-- 从左边起的第一个字,告诉我们这个文件是一怎样的文件: 普通文件?目录?特殊设备?套接字(socket)?或是pseudo-file device? 在这个例子,-表示一个普通文件。 接下来三个字是rw-是文件拥有者的权限。 再接下来的三个字是r--是文件所属群组的权限。 最後三个字是r--是其他人的权限。 以这一个文件为例,他的权限设定是拥有者可以读写这个文件、群组可以读取、 其他使用者也能读取这个文件。 根据上面的表格, 用数字表示这个文件其三部分的权限应该是 644 这样很好,但系统怎样对设备进行权限控制的? 事实上FreeBSD将大部份设备(的每一个设备)当作一个文件看待, 用程序能打开、读取、写入数据就如其他的文件一样。 而设备文件放在/dev 目录。 目录也视为一种文件,也有读取、写入、执行的权限。 但目录的执行权限意义并不与普通文件相同, 实际上执行权限是进入权限。 当一个目录是被标示可以执行的时候,那表示它可以被进入, 利用cd (变化目录位置)可以进入。 这意味着访问这些目录必须是谁才有权力 (当然目录下的文件也受到访问限制)。 详细方面,想读取一个目录的列表就必须设为可读权限, 同时想删除一个已知的文件,就必须把目录下这个文件设为可写 执行权限。 还有更多权限设定, 但是他们大多用在特殊状况下如一个setuid的执行文件和粘贴性目录, 如果想要得知有关文件权限和如何设定的更多资讯,请看手册&man.chmod.1;。 Tom Rhodes Contributed by 权限符号 权限符号 权限符号,某些时候就是指符号表达式, 使用八进制的字符给目录或文件分配权限。 权限符号的使用语法是 (谁) (作用) (权限)。 看看下列数值的在那些地方所起什么样的作用: 选项 字母 介绍 (谁) u 用户 (谁) g 所属群体 (谁) o 其他人 (谁) a 所有人 (全部) (作用) + 增加权限 (作用) - 减少权限 (作用) = 确定权限 (权限) r 可读 (权限) w 可写 (权限) x 执行 (权限) t 粘贴位 (权限) s 设置 UID 或 GID 这些数值 &man.chmod.1; 以习惯标定的。 举个例子,用以下命令阻止其他人访问 FILE文件: &prompt.user; chmod go= FILE 倘若对一个文件作太多的变化设置可用逗号分开, 在下面的例子里, 可以去掉FILE文件的群体和 全部 可写权限, 但所有人都可以有执行权限: &prompt.user; chmod go-w,a+x FILE 目录架构 目录层次 目录层次是理解一个系统的重要基础, 最重要的莫过于它的根目录 /, 这个目录在启动时就就挂上, 它包含了启动时所需的基本系统。 这个根目录同样包含了您想挂上的每一个文件系统。 挂接点 (mount point) 是新增的文件系统根目录接入现有文件系统的目录, 标准的挂接点包含 /usr/var/mnt/cdrom。 这些目录通常被纪录在 /etc/fstab 文件。 /etc/fstab 文件是一个纪录系统上的多样文件系统和挂接点的表格, /etc/fstab 文件会依据这一个脚本 &man.rc.8; 在开机的时候被自动挂上, 除非加上 (非自动) 这个选项。 请查阅手册 &man.fstab.5; 以了解 /etc/fstab 所用的格式和他包含的选项。 您可以由 &man.hier.7;得知 man page 提供了完整的目录架构的介绍。 现在,我们介绍一般目录以供参考。 目录 介绍 / 文件系统的根目录。 /bin/ 在单个用户和多用户环境下的基本工具目录。 /boot/ 在操作系统在启动加载期间所用的程序和配置。 /boot/defaults/ 默认每步引导启动的配置内容,请查阅&man.loader.conf.5;。 /dev/ 设备接点,请查阅 &man.intro.4;。 /etc/ 系统启动的配置和脚本。 /etc/defaults/ 系统默认的启动配置和脚本,请参考 &man.rc.8; 。 /etc/mail/ 关系到邮件系统运作的配置, 请参考 &man.sendmail.8;。 /etc/namedb/ named 配置文件,请参考 &man.named.8;。 /etc/periodic/ 每天、每星期和每月周期性地运行的脚本, 请通过 &man.cron.8;查阅 &man.periodic.8;。 /etc/ppp/ ppp配置文件,请查阅&man.ppp.8;。 /mnt/ 由管理员习惯使用挂接点的临时空目录。 /proc/ 运行中的文件系统,请参阅 &man.procfs.5; 和 &man.mount.procfs.8;。 /root/ root用户的Home(主)目录。 /sbin/ 在单个用户和多用户环境下的存放系统程序和管理所需的基本实用目录。 /stand/ 持久独一无二的程序环境。 /tmp/ 存放临时文件,通常存放一些系统重启后不需要保护的 &man.mfs.8; 基于内存的文件系统。 /usr/ 存放大多数用户的应用软件。 /usr/bin/ 存放实用命令,程序设计工具,和应用软件。 /usr/include/ 存放标准 C include 文件. /usr/lib/ 存放库文件。 /usr/libdata/ 存放各种实用工具的数据文件。 /usr/libexec/ 存放系统实用或后台程序 (从另外的程序启动执行)。 /usr/local/ 存放本地执行文件, 库文件等等, 同时也是 FreeBSD ports 安装的默认安装目录。 /usr/local/usr 总体布置请查阅 man.hier.7;。 man 目录例外, 它们直接放在 /usr/local 而不是 /usr/local/share 下, 而 ports 说明文档在 share/doc/port /usr/obj/ 通过联编 /usr/src 得到的目标文件。 /usr/ports 存放 FreeBSD 收集到的 ports (可选)。 /usr/sbin/ 存放系统后台程序 和 系统工具 (由用户执行)。 /usr/share/ 存放架构独立的文件。 /usr/src/ 存放 BSD 或者本地源码文件。 /usr/X11R6/ 存放 X11R6 可执行文件、 库文件、 配置文件等的目录(可选)。 /var/ 存放多用途记录、临时性、短期的和打印假脱机系统文件. /var/log/ 存放各种的系统记录文件。 /var/mail/ 存放用户mailbox(一种邮件存放格式)文件。 /var/spool/ 各种打印机和邮件系统spooling(回环)的目录。 /var/tmp/ 存放系统重启前受控制的临时文件。 /var/yp NIS 映射。 磁盘组织 FreeBSD 查找文件的最小单位是文件名。 而文件名区分大小写,这就意味着 readme.txtREADME.TXT 是两个不相同的文件。 FreeBSD 不凭文件扩展名 (.txt) 去识别这个文件是 程序、或是文档、或是其他格式的数据。 各种文件存放在目录里。 一个目录可以含有许许多多的文件, 允许含有其他的目录,同样允许您添加不同层次的目录在里面。 可以轻松地组织您的数据。 可以通过文件或目录名来指定文件和目录, 在目录名后面加上一个斜线, /, 如果需要的话。 如果您有一个名为 foo 的目录, 它包含另一个目录 bar, 后者重包括一个叫 readme.txt 的文件, 则全名, 或者说到文件的 路径 就是 foo/bar/readme.txt 在文件系统里目录和文件的作用是存储数据。 每一个文件系统都正确含有一个顶级目录根目录, 这个根目录包含其他目录。 您也许在其他的一些操作系统碰到类似这里的情况, 当然也有不同的情况。 举些例子, &ms-dos; 是用 \ 分隔文件名或目录名, 而 &macos; 则使用: FreeBSD在路径方面不使用驱动器名符号或驱动器名称, 在FreeBSD里您不能这样使用: c:/foo/bar/readme.txt 为了代替(驱动器名符号), 一个文件系统会指定 根 文件系统, 根文件系统的根目录是 /。 其他每一个文件系统 挂接在根文件系统下。 无论有多少磁盘在FreeBSD 系统里, 每个磁盘都会以目录的方式加上。 假设您有三个文件系统, 名为 ABC。 每个文件系统有一个根目录, 而各自含有两个其他的目录, 名为 A1, A2 ( B1, B2C1, C2)。 看看 A 这个根文件系统。 假如您用 ls 命令来查看这个目录您会见到两个子目录: A1A2。 这个目录树是这个样子: / | +--- A1 | `--- A2 一个文件系统必须挂到另一个文件系统的某一目录, 所以现在假设把 B 文件系统挂到 A1目录, 那 B 根目录因此代替 了 A1,而显示出 B 目录(的内容): / | +--- A1 | | | +--- B1 | | | `--- B2 | `--- A2 无论B1B2 目录在那里而延伸出来的路径必须为 /A1/B1/A1/B2。 而在 /A1 里原有的文件会临时隐藏。 想这些文件再出现把 B 从 A 挂接释放 B 挂接在 A2 那图表的样子就是这样子: / | +--- A1 | `--- A2 | +--- B1 | `--- B2 这个路径分别是 /A2/B1/A2/B2 文件系统能把顶部挂接上另一个文件系统上。 继续这个例子, 把 C 文件系统挂接在 B 文件系统里的 B1 目录, 排列如下: / | +--- A1 | `--- A2 | +--- B1 | | | +--- C1 | | | `--- C2 | `--- B2 或者把 C 文件系统挂接在 A 文件系统里的A1目录: / | +--- A1 | | | +--- C1 | | | `--- C2 | `--- A2 | +--- B1 | `--- B2 假如您熟悉 &ms-dos;并知到join 命令, 尽管不相同,其实是相似的。 这方面不是普通知识而且涉及到您自己所关心的, 当您安装FreeBSD并在以后添加新磁盘时, 您必须知到该如何新建文件系统和挂接上。 (FreeBSD系统)它有一个主要的根文件系统, 不需要另外新建立, 但当需要手工处理时,这是一个有用的知识。 多样性文件系统的益处 不同的文件系统可用不同的 挂接参数。 举些例子, 仔细想一下, 根文件系统能用只读的方的方式挂接上, 防止不经意删除或编辑到一个危险的文件。 把各用户能写入的文件系统分开, 像/home这样, 由另外的文件系统分别用 nosuid 参数挂接,这个参数防止 suid/guid 在执行这个文件系统中的文件时生效, 从而缓解了一些安全问题。 FreeBSD 对一个文件系统的文件布局自动优化, 并依赖文件系统的使用习惯。 所以一个文件系统应有一个针对大量小型文件频繁写入的优化, 另外大型文件系统的优化也应落实。 FreeBSD 的文件系统能够在断电时尽可能避免损失。 然而, 在关键点时的电源失效仍然可能会破坏文件系统的结构。 将您的文件系统分成多个有助于分散风险, 并方便备份和恢复。 统一文件系统的益处 文件系统是固定大小的。 当安装FreeBSD时新建一个文件系统并设定一个大小, 您会在稍后发觉到必须去建一个大的分区。 如果配置不当, 则需要备份、 重新创建文件系统, 然后再恢复数据。 FreeBSD 4.4 或更高的版本提供了 &man.growfs.8; 命令。 这使得能够实时地调整文件系统的大小, 因而不再受其限制。 文件系统是和分区一一对应的。 这里的分区和常用的术语分区 (例如, &ms-dos; 分区) 的意思并不一样, 这是由于 &os; 的 &unix; 传统造成的。 每一个分区使用一个从 ah 的字母来表示。 每个分区只能包含一个文件系统, 这意味着文件系统通常可以由它们在文件系统目录结构中的挂接点, 或对应的分区字母来表示。 FreeBSD 的 交换分区 也需要使用磁盘空间。 交换分区是给 FreeBSD 作 虚拟内存 使用的, 这样能令您的计算机有更多的内存可使用, 当FreeBSD在运行而内存不够的时候, 它会把其他一些可转移的数据转移到交换分区, 空出内存的位置以供使用。 某些 partitions 的用途是确定的。 分区 约定 a 通常指定为根文件系统 b 通常指定为交换分区 c 通常它和所在的 slice 大小相同。 c 分区上工作时必定会影响到事整个 slice (举个例子,坏块扫描器)。 您通常不愿意在这个partition建立文件系统。 d 分区 d 曾经有特殊的含义, 虽然(对我们来说)早已远离而去。 但直到今天,一些工具在 分区 d上运行会发生古怪事情, 所以 sysinstall 通常不建立分区 d 每一个包含了文件系统的分区被保存在 FreeBSD 称为 slice 的部分上。 Slice 是一个 FreeBSD 术语, 通常被叫做分区, 再次强调, 这是由于 FreeBSD 的 &unix; 背景。 Slices 有其编号, 从1到4。 slices partitions 专用 (dangerously dedicated) Slice 编号在设备名后面, 并有一个 s 前缀, 从 1 开始。 因此 da0s1 是第一个 SCSI 驱动器的第一个 slice。 每个磁盘上只能有四个物理的 slices, 但您可以在物理 slice 中使用适当的类型来创建逻辑 slice。 这些扩展 slice 编号从 5 开始, 因此 ad0s5 是第一个 IDE 磁盘中的第一个 扩展 slice。 文件系统所使用的设备应该占满 slice。 Slices, 专项指定 物理驱动器, 和其他驱动器都包含partitions, 那几个的partitions都是用字母 从 ah来标定的, 而这些字母都在驱动器名字之后,所以 da0a 是指首个da设备的 a partition, 而那个就是 专项指定ad1s3e 是指IDE磁盘第三个slice的第五个partition。 最终,每个磁盘都被系统识别。 一个磁盘名字是用磁盘类型代码和编号来标识的, 它不像slices,磁盘的编号是由0开始的。 对应代码请看这里所列出的 当提供一个partition名字给FreeBSD时, slice 和 磁盘所必须有这个partition,还应当提供所partition所涉及 到的slice和磁盘的名字。可这样列出: 磁盘名称,s,slice 编号,和partition标定字母。 例子请看这里 这里显示了一个磁盘的布局,有更清楚的帮助。 在安装FreeBSD时,您首先要配置好磁盘slices, 然后在FreeBSD使用的slice上建立partitions。 并在每个partition上建立一个文件系统(或交换分区), 和指定文件系统的挂接位置。 磁盘设备的代码 代码 说明 ad ATAPI (IDE) 磁盘 da SCSI 直接存取磁盘 acd ATAPI (IDE) 光驱 cd SCSI 光驱 fd 软驱
样例磁盘, Slice, 和 Partition 它们的命名 命名 说明 ad0s1a 在首个IDE磁盘(ad0)上的 第一个slice (s1)里的 第一个partition (a)。 da1s2e 在第二个SCSI磁盘(da1)上的 第二个slice(s2)里的 第五个partition(e)。 一个磁盘的布局 从在系统里的首个IDE磁盘图表可以显示出FreeBSD的见解。 假设磁盘大小为4 GB,它里面包含了两个2 GB 大小的slices (但在&ms-dos;叫partitions)。 首个slice是一个&ms-dos;磁盘叫C:, 而第二个slice是FreeBSD配置好的slice。 FreeBSD配置好的slice有三个partitions和另一个交换分区。 这三个partitions各自控制一个文件系。 partitiona用于根文件系统, partitione用于/var目录层, partitionf用于/usr目录层。 .-----------------. --. | | | | DOS / Windows | | : : > First slice, ad0s1 : : | | | | :=================: ==: --. | | | Partition a, mounted as / | | | > referred to as ad0s2a | | | | | :-----------------: ==: | | | | Partition b, used as swap | | | > referred to as ad0s2b | | | | | :-----------------: ==: | Partition c, no | | | Partition e, used as /var > filesystem, all | | > referred to as ad0s2e | of FreeBSD slice, | | | | ad0s2c :-----------------: ==: | | | | | : : | Partition f, used as /usr | : : > referred to as ad0s2f | : : | | | | | | | | --' | `-----------------' --'
文件系统的挂接和卸下 这种文件系统就像一棵树那样用/确立根部, 是比较理想的文件系统。 而/dev/usr和其他目录 就是根目录的分枝, 另外这些目录可以再分枝,例如/usr/local 根文件系统 应该考虑给某些目录一些空间从而分散文件系统。 /var 之下包含目录 log/,目录spool/, 和不同类型的临时文件,很可能把它塞满。 把什么都塞进根文件系统不是一个好主意, 好的做法是应该把 /var/分离出去。 另一个要考虑的是,给物理设备或虚拟磁盘这些自带空间的文件系统确定目录结构树。 例如 网络文件系统 或光驱的挂接。 <filename>fstab</filename> 文件 文件系统 使用fstab的挂接 导入处理期间, 自动挂上/etc/fstab所列出的文件系统。 (除非他们注明为 选项)。 /etc/fstab 文件包含的各行的列表格式如下: device /mount-point fstype options dumpfreq passno device 设备名称(设备必须存在), 说明在 . mount-point 目录 (目录必须存在), 用在那个挂接上的文件系统上。 fstype 文件系统类型,请通过&man.mount.8;查阅。 默认的FreeBSD文件系统类型是ufs options 设为可读写文件系统的选项, 或设为只读文件系统的选项, 或其他一些选项,可随意选一个。 一个常用的选项 用在不需在导入期间挂接的文件系统。 其他的选项在 &man.mount.8; 手册里列出。 dumpfreq &man.dump.8; 使用这项去决定那个 文件系统必须移贮。假如缺少这项,默认的数值为0。 passno 这一项决定文件系统的检查顺序, 文件系统想跳过检查应将passno设为0。 根文件系统(那个是在每方面开始之前必须检查的) 应该将它的 passno 设为1, 其他文件系统的 passno 必须把数值设到大于1。假如多个文件系统的passno的值相同, 那么&man.fsck.8; 在充许的情况下将尝试并行地去检查文件系统。 <command>mount</command> 命令 文件系统 挂接 这个 &man.mount.8; 命令是挂接文件系统的基本运用。 使用最多的基本格式: &prompt.root; mount device mountpoint 它的选项非常多,而&man.mount.8; 手册同样提及, 但常用的都在这里: 挂接的各种选项 挂接/etc/fstab里所有列出的文件系统。 除非标记为 noauto 或作了排除在外的 类型标记,或者在这之前已挂上。 除了实际上系统调用以外,可以完成任何事情,这个选项是和 参数一起连在一块使用,可以决定&man.mount.8;所做的事情。 强制去挂接一个未知的文件系统(会有危险), 或当把一个文件系统挂接状态由可读写降为只读时,强制撤消可写通道。 以只读的方式挂上文件系。 使用 选项加是一样的。 fstype 根据给出的文件系统类型挂接文件系统, 假如给于选项,仅挂接这个类型的文件系统。 ufs 是默认的文件系统类型。 在文件系统上修改挂接选项。 版本模式。 以可读写方式挂接文件系统。 The 选项采用一个逗号分开以下多个选项: nodev 拒绝把文件系统识别为特别的设备。这是一个有用的安全选项。 noexec 不允许文件系统上的二进制程序执行。这也是一个有用的安全选项。 nosuid 不允许文件系统上的 setuid 或 setgid 标记生效。这也是一个有用的安全选项。 <command>umount</command> 命令 文件系统 卸下 &man.umount.8; 命令同样采用一个参数、一个挂接点、一个设备名。 或采用选项,又或采用选项。 所有格式都可采用 去强行卸下, 或采用 用那适当的版本。 但警告,采用 并不是一个好主意, 强行卸下文件系统可能损坏计算机或破坏文件系统上的数据。 会卸下所有已挂接的文件系, 可能通过后面列出的文件系统进行修改, 但无论如何,都不会尝试去卸下根文件系统。 进程 FreeBSD 是一个多任务操作系统。 这就意味着好像一次可以运行一个以上的程序。 每个占用一定时间运行的程序就叫process。 每个程序启动运行时至少有一个新进程,并在所有运行的时候保持有一个系统进程的编号, 而一直由系统对它监管。 每个进程用来标识的一个编号就叫 进程 ID, 或叫 PID。 而且,就像文件那样,每个进程也有所属用户和所属群体。 所属用户和所属群体使用在这方面:确定这个进程可以打开那些文件和那些设备, 从而在初期使用文件的权限。 多数的进程都同样有一个父进程, 而进程是依靠父进程来启动的。 例如,假如您把命令输入到shell里那shell是一个进程,而您运行的各个命令同样是进程, 那么,shell就是您各个运行进程的父进程。 而这方面有一个例外的进程就叫&man.init.8;。 init始终是首个进程,,所以他的PID始终是1, 而init在FreeBSD起动时由内核自动启动。 在系统上,有两个命令对进程观察非常有用:&man.ps.1; 和 &man.top.1;。 这个ps命令作用是观察当前运行进程的状态, 显示他们的PID,使用了多少内存,它们启动的命令行。 而top命令则是显示所有运行进程,并在以秒计的短时内更新数据。 您能交互式的观察您计算机的工作。 默认情况下, ps仅显示出您自己所运行的命令。 例如: &prompt.user; ps PID TT STAT TIME COMMAND 298 p0 Ss 0:01.10 tcsh 7078 p0 S 2:40.88 xemacs mdoc.xsl (xemacs-21.1.14) 37393 p0 I 0:03.11 xemacs freebsd.dsl (xemacs-21.1.14) 48630 p0 S 2:50.89 /usr/local/lib/netscape-linux/navigator-linux-4.77.bi 48730 p0 IW 0:00.00 (dns helper) (navigator-linux-) 72210 p0 R+ 0:00.00 ps 390 p1 Is 0:01.14 tcsh 7059 p2 Is+ 1:36.18 /usr/local/bin/mutt -y 6688 p3 IWs 0:00.00 tcsh 10735 p4 IWs 0:00.00 tcsh 20256 p5 IWs 0:00.00 tcsh 262 v0 IWs 0:00.00 -tcsh (tcsh) 270 v0 IW+ 0:00.00 /bin/sh /usr/X11R6/bin/startx -- -bpp 16 280 v0 IW+ 0:00.00 xinit /home/nik/.xinitrc -- -bpp 16 284 v0 IW 0:00.00 /bin/sh /home/nik/.xinitrc 285 v0 S 0:38.45 /usr/X11R6/bin/sawfish 在这个例子里您可看到,从 &man.ps.1; 输出的每一列是有规律的。 PID 就是进程ID,这个较早前已讨论过了。 PID号的分配由 1一直上升直到99999, 当您运行到超过限制时,这些编号会回转分配。 TT这一列显示了程序运行所在的终端, 目前可以安全地忽略。 STAT 显示程序的状态,也可以安全地被忽略。 TIME是程序在CPU处理时间—运行的时间量, 并不是指您程序启动到现在的所用的时间。 许多程序碰巧遇到某方面在他们之前要花费大量CPU处理时间时,他们就必须等候。 Finally, COMMAND is the command line that was used to run the program. &man.ps.1;支持使用各种选项去改变显示出来的内容, 最有用的一个就是auxww。 - 选项显示出所有运行进程的内容,而且显示出进程的并一定是您的进程。 + 选项显示出所有运行进程的内容, 而不仅仅是您的进程。 选项显示出进程所归属的用户名字以及内存使用, 选项显示出后台进程。 而 选项表示为 &man.ps.1; 把整个命令行全部显示完, 而不是由于命令行过长就把它从屏幕上截去。 下面和从&man.top.1;输出是类似的,一个示例式对话就象这样子: &prompt.user; top last pid: 72257; load averages: 0.13, 0.09, 0.03 up 0+13:38:33 22:39:10 47 processes: 1 running, 46 sleeping CPU states: 12.6% user, 0.0% nice, 7.8% system, 0.0% interrupt, 79.7% idle Mem: 36M Active, 5256K Inact, 13M Wired, 6312K Cache, 15M Buf, 408K Free Swap: 256M Total, 38M Used, 217M Free, 15% Inuse PID USERNAME PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND 72257 nik 28 0 1960K 1044K RUN 0:00 14.86% 1.42% top 7078 nik 2 0 15280K 10960K select 2:54 0.88% 0.88% xemacs-21.1.14 281 nik 2 0 18636K 7112K select 5:36 0.73% 0.73% XF86_SVGA 296 nik 2 0 3240K 1644K select 0:12 0.05% 0.05% xterm 48630 nik 2 0 29816K 9148K select 3:18 0.00% 0.00% navigator-linu 175 root 2 0 924K 252K select 1:41 0.00% 0.00% syslogd 7059 nik 2 0 7260K 4644K poll 1:38 0.00% 0.00% mutt ... 这个输出分成两部份。 前面部份(起始前五行) 显示了:运行于最后进程的PID、 系统负载均衡 (那个是指系统繁忙时的调节方式)、 系统正常运行时间 ( 指从启动算起所用的时间) 和当前时间。 前面部份另外的图表 涉及:多少进程在运行(这个情况是47), 多少内存和多少交换分区在使用, 和在不同CPU状态里系统消耗多少时间。 在那下面一连串的纵列和从&man.ps.1;输出的的内存是相似的。 如以前&man.ps.1;一样,您能见到:PID、用户名、CPU处理时间合计、运行的命令。 &man.top.1;默认是显示您的进程所用内存空间的合计。 内存空间这里分成两列,一列为总体大小,另一列是必须请求驻留大小是多少内存—总体大小。 而驻留大小实际上是瞬间使用的多少。 在以上那个例子,您会看到那&netscape;总计需要30 MB内存, 但实际只用了9 MB。 &man.top.1; 每两秒自动刷新一次,您可以用改变刷新的秒数。 守护进程,信号和杀死进程 当您运行一个编辑器时它是很容易控制的,告诉它去加载文件它就加载。 您之所以能这样做,是因为编辑器提供这样便利去这样做,和因为有编辑器去附上的终端。 一些程序在运行中不需要连续的用户输入,一有机会就从终端里分离到后台去。 例如,一个web系统整天都在作web请求的响应,他不需要您输入任何东西就能完成, 这个类别的另一个例子就是把email的传送。 我们把那些程序叫守护进程。 守护神是希腊神话中的一些人物,非正非邪,他们是些守护小幽灵,大体上为人类作出贡献。 许多类似web系统或mail系统的系统对于今天仍有用途, 这就是为什么在那么长的时间里,BSD的吉祥物保持为一双鞋加一把钢叉的守护神模样。 守护进程的程序命名通常在最后加一个dBIND是伯克莱互联网络守护进程命名(and the actual program that executes is called named), Apacheweb系统的程序就叫httpd, 在行式打印机上的打印守护进程就是lpd。 这只是一种惯例,不是标准或硬性规定。 例如,为Sendmail而应用的主要mail守护进程就叫sendmail, 却不叫maild,这和您推测的一样。 有时您必须和一个守护进程的程序通信,这些通信就叫信号。 您能发送一个信号给守护进程(或有关的另一些运行进程)与它进行通信, 各个不同的信号各自就是一个数字编号,而您所发送的—数字编号各自有一个特殊的含义。 有些人把信号解悉为'请求',并在'请求'的文档里告诉您怎样把信号理解为请求。 您只能给所属于您的进程发信号,假如您给其他人的进程发信号, 进程就会用&man.kill.1; 或 &man.kill.2;权限进行拒绝。 当然,root 用户会例外,它能把各种信号发送给每个进程。 在某些案例里,FreeBSD也会向应用软件发送信号。 假如一个应用软件含有恶意写入并试图去访问内存,那是不可想象的,FreeBSD会向那个进程发送 段式违规 信号 (SIGSEGV)。 假如一个应用软件使用&man.alarm.3;系统去进行周期性调用闹钟功能,每当达到时间时, FreeBSD会向应用软件发送闹钟信号(SIGALRM)。 有两个信号可以停止进程:SIGTERMSIGKILLSIGTERM比较友好,进程能捕捉这个信号, 根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。 在一些案例里,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。 对于SIGKILL信号,进程是不能忽略的。 这是一个 '我不管您在做什么,立刻停止'的信号。 假如您发送SIGKILL信号给进程, FreeBSD就将进程停止在那里。 有点不正确—少数的东西是不能中断的。 例如,假如进程试图从网络上另一个计算机的一个文件读取, 而那个的计算机会因为某些原因拿走了这个文件,那这个进程从上术情况来看是不能中断。 最终这个进程会超时,典型的两分钟。一出现超时进程将被杀死。 . 您可能会去使用 SIGHUPSIGUSR1SIGUSR2信号。 这都是些通用的信号,各种应用程序都可以应用 在各方面的信号发送。 假如您改变了web系统的配置文件—并想web系统去重读它的配置, 您可以停止然后再启动httpd。但这样做web系统会导致一个短暂 的中断周期,那样是不受欢迎的。几乎所有的守护进程在编写时,都会指定对SIGHUP 信号进行响应从而重读配置文件。 所以最好的方法就是不去杀死并重启httpd,而是发一个SIGHUP信号给他。 因为在这方面没有一个标准,不同的守护进程有不同的用法,所以不了解时应读一下守护进程的文档。 发送信号可用&man.kill.1; 命令, 请参考&man.kill.1;所列出的例子。 发送一个信号给进程 这个例子显示了怎样去发一个信号给&man.inetd.8;。 inetd配置文件是/etc/inetd.conf, 如果想inetd 去重读文件系统的话,可以给它发一个SIGHUP 信号。 寻找您要发送信号的进程ID,可以用&man.ps.1; 加 &man.grep.1;来完成。 &man.grep.1;命令被用在搜索输出方面,搜索您指定的字符串。 这命令是由普通用户来执行的,而&man.inetd.8;是root用户运行的, 所以必须给&man.ps.1;带上选项。 &prompt.user; ps -ax | grep inetd 198 ?? IWs 0:00.00 inetd -wW 得出 &man.inetd.8; PID号是198。 有时 grep inetd 命令也出现在输出中, 这是因为在这方面 &man.ps.1; 也是寻找列表中运行进程。 使用 &man.kill.1; 去发送信号。 因为 &man.inetd.8; 是由 root启动的, 您必须使用 &man.su.1; 去 变为 root 用户。 &prompt.user; su Password: &prompt.root; /bin/kill -s HUP 198 和大多数 &unix; 命令一样, &man.kill.1; 完成任务之是没有内容输出的。 假如您发送信号给一个不属于您的进程, 您会看到 kill: PID: Operation not permitted. 假如输错了PID号,把信号发送到其他进程,那是坏事。 或者您侥幸,把信号发送到不存在的进程, 您会看见 kill: PID: No such process. 为什么使用 <command>/bin/kill</command>? 许多shell提供了内建kill命令, 这样, shell就能直接发送信号,而不是运行 /bin/kill。 这点非常有用, 但不同shell有不同的语法来指定发送信号的名字, 与其试图把它们学完倒不如简单地直接使用 /bin/kill ... 发送其他的信号也很相似,只要在命令行替换TERMKILL就行了。 在系统上随意杀死进程是个坏主意,特别是&man.init.8;,它的进程ID是1,它非常特殊。 可以运行 /bin/kill -s KILL 1 命令来让系统迅速关机。 当您按下 Return 键时, 始终 必须 去详细检查您所运行的 &man.kill.1;。 Shells shells 命令行 在FreeBSD里,每日有一大堆工作是在命令行的界面完成的,那就叫做shell。 一个shell的主要功能就是从输入是取得命令然后去执行他。 许多的shell同样能帮我们完成内建的每日功能,例如:文件管理、文件寻找、命令行编辑、 宏指令和环境变量。FreeBSD内含了一些shell,例如:sh、Bourne Shell、 tcsh和改良过的C-shell。 另外也有些shell也可在FreeBSD的Ports得到,例如:zshbash 您想使用那一种shell取决于您的喜好, 假如您是C程序设计师,您可能选择一个C-like shell例如tcsh。 假如您是从Linux过来的或是一个命令行的新手,您可能会试一下bash。 这一点告诉我们每一个shell都有各自的特性,可能适用于您的工作环境,也可能不适用于您的工作环境。 每个shell都有一个共通点就是文件名补全。 输入命令或文件名的前几个字,然后按Tab键,就能靠shell的自动补全功能得出 命令或文件名。这里有一个例子,假设您有两个文件叫 foobarfoo.bar,而您想删除 foo.bar, 可这样在键盘上输入 rm fo[Tab].[Tab] 那么shell就会输出 rm foo[BEEP].bar 这个[BEEP] 是这控制台铃声, 那个是告诉我们它不能完成文件名补全,因为有多个文件名符合。 foobarfoo.bar 都是以 fo开头, 它只可以补全到 foo。 输入 .并再按一次 Tab,shell才把其余的文件名全部显示出来。 环境变量 另一个特点就是shell利用环境变量运行。环境变量是贮存在shell环境空间上相对应的键和可变值, 这个空间能够补程序从shell里读出,而且包含了许多程序的配置。 这个一个常用环境变量列和其含义的列表: 环境变量 变量 说明 USER 当前登录进入的用户名。 PATH 搜索程序路径,以两点的冒号分隔开。 DISPLAY 假如有这个变量的话,就是X11显示器的网络名称。 SHELL 当前所用的shell。 TERM 用户终端的名字,通常用在确定终端的能力。 TERMCAP 各种终端功能所用终端分离编码的基本数据项目。 OSTYPE 操作系统类型,默认是FreeBSD。 MACHTYPE 是指系统上运行的CPU体系结构。 EDITOR 用户首选的文本编辑器。 PAGER 用户首选的文本页面调度程序 。 MANPATH 搜索联机手册路径,以两点的冒号分隔开。 Bourne shells 不同的shell设置环境变量也不相同。举个例子, 在如tcshcsh这样的C-Style shell, 您必须使用setenv去设置环境变量。 而在如shbash这样的Bourne shell, 您必须使用export去设置当前环境变量。 再举个例子,要去设置或改变EDITOR环境变量, 在cshtcsh下将EDITOR设为 /usr/local/bin/emacs: &prompt.user; setenv EDITOR /usr/local/bin/emacs 而在Bourne shell下,则是: &prompt.user; export EDITOR="/usr/local/bin/emacs" 您也可以在命令行上加一个$字符在变量之前从而取得环境变量。 举个例子,用echo $TERM 就会显示出$TERM的设定值, 其实就是shell取得$TERM并传给echo来显示的。 shell里有许多特别的字符代表着特别的资料,我们把叫做meta-characters。 最常用的就是*字符,它可代表文件名的任何字符。 这些特别字符应用到文件名全域方面。假如,输入 echo *和输入 ls的效果是相同的,其实就是 shell 取得了全部符合 *的文件名,并传给 echo 在命令行下显示出来。 为了防止shell去分析这些特别字符, 我们可在它之前加一个 \字符去说明它只是普通字符。 echo $TERM就会显示出您的终端情况, 而 echo \$TERM 就会显示出 $TERM 这几个字。 改变您用的Shell 改变您的Shell的最简单方法是使用 chsh 命令。 执行 chsh 将根据您设定的EDITOR 环境变量进入到那个编辑器,假如没有设定,就会进入vi编辑器。 请改变Shell:这行对应值。 您可使用chsh选项, 这样就能设置您的shell却又不用编辑器。假如您想把shell改为bash 可用下面的技巧。 &prompt.user; chsh -s /usr/local/bin/bash 运行chsh 不加参数只编辑shell也会达到相同的效果。 您使用的shells必须/etc/shells 文件里列出。 假如您从 ports里装一个shell, 那就不用做这步了。 假如您手工装一个shell,那就要手工添加进去。 举个例了子,假如您手工把 bash装到 /usr/local/bin里,您还要进行这一步: &prompt.root; echo "/usr/local/bin/bash" >> /etc/shells 然后运行chsh 文本编辑器 文本编辑器 编辑器 在FreeBSD里有许多的配置是依靠编辑文本文件来完成的, 正因为这样,最好就是去熟悉一种文本编辑器。 FreeBSD基本系统本身就自带有几种,还有许多已可在ports里得到。 ee 最容易学的而又简单的编辑器是 ee编辑器, 是个标准的简易编辑器。 要启动 ee,首先就要在命令行输入 ee filenamefilename 是一个要编辑的文件名。 例如,要编辑 /etc/rc.conf就要输入 ee /etc/rc.conf,在 ee的控制内, 编辑器所有功能的操作方法都显示在最上方。 这个^ 字符代表 键盘上的Ctrl 键, 所以^e 就是 Ctrle组合键。 假如想离开ee, 按Esc键,就可选择离开编辑器。 当您修改了内容的时候,编辑器会提示您保存。 vi 编辑器 vi emacs 编辑器 emacs FreeBSD本身也带许可多有强大功能的文本编辑器, 例如 vi。还有其他在FreeBSD Ports里几种, 像 emacsvim。 - 这些编辑器有着强大的功能但同时学习起来比较复习。 + 这些编辑器有着强大的功能,但同时学习起来比较复杂。 不管怎样,假如您从事文字编辑方面的工作, 学习如vimemacs 这些有强大功能的编辑器用法, 在长时间工作里会帮您节省不少的时间。 设备和设备节点 在一个系统里,硬件描述通常用法就是一个设备对应一个术语,包括磁盘、打印机、显卡和键盘。 当FreeBSD导入时,大多数的设备都能探测到并显示出来, 您也可以查阅/var/run/dmesg.boot, 导入时所有信息都在里面。 例如, acd0 就是 首个 IDE 光盘设备, 而 kbd0 则代表键盘。 在&unix;操作系统里,大多数设备存在的特殊访问文件就是叫做设备节点, 他们都定位在/dev目录里。 建立设备节点 - 当增加一个新设备或付加设备需要寻求支持时, + 当增加一个新设备或附加设备需要寻求支持时, 您也许需要在新设备上建立单个或多个的设备节点。 MAKEDEV 脚本 当系统缺少DEVFS (涉及的是FreeBSD 5.0之前的版本), 建立设备节点可以使用&man.MAKEDEV.8;,就如下面显示的那样: &prompt.root; cd /dev &prompt.root; sh MAKEDEV ad1 这个是一个例子,在安装等二个IDE设备时去建立设备节点。 <literal>DEVFS</literal> (DEVice 文件系统) 这个设备文件系统, 或叫 DEVFS, 为内核的设备命名在整体文件系统命名里提供通道, 并不是建立或更改设备节点, DEVFS只是为您的特别文件系统进行维护。 更多的资料请查 &man.devfs.5; 手册。 DEVFS在FreeBSD 5.0或更高的版本里是默认使用。 二进制文件格式 要理解为什么 &os; 使用 &man.elf.5; 格式, 您必须首先了解一些 &unix; 系统中的 三种 主要 可执行文件格式的有关知识: &man.a.out.5; 是最古老和经典的 &unix; 目标文件格式, 这种格式在其文件的开始处有一个短小而又紧凑的首部, 该首部带有一个魔幻数字,用来标识具体的格式(更多详情参见&man.a.out.5;)。 这种格式包含3个要装载入内存的段:.text, .data, 和 .bss,以及 一个符号表和一个字符串表。 COFF SVR3目标文件格式。其文件头现在包括一个区段表(section table), 因此除了.text,.data,和.bss区段以外,您还可以包含其它的区段。 &man.elf.5; COFF 的后继, 其特点是可以有多个区段, 并可以使用32位或64位的值。 它有一个主要的缺点: ELF 在其设计时假设每个系统体系结构只有一种 ABI。 这种假设事实上相当错误, 甚至在商业化的SYSV世界中都是错误的 (它们至少有三种ABI: SVR4, Solaris, SCO)。 FreeBSD试图在某种程度上解决这个问题,它提供一个工具,可以 对一个已知的ELF可执行文件 标识它所遵从的ABI的信息。 更多这方面的知识可以参见手册页&man.brandelf.1; FreeBSD从经典阵营中来,因此使用了&man.a.out.5;格式, 众多BSD版本的发行(直到3.X分支的开始)也证明了这种格式的有效性。 虽然在那以前的某段时间,在FreeBSD系统上创建和运行ELF格式 的二进制可执行文件(和内核)也是可能的,但FreeBSD一开始并不积极进步 到使用ELF作为其缺省的格式。为什么?噢,当Linux阵营完成了 转换到ELF格式的痛苦历程后,却发现并不足以由此而放弃 a.out可执行文件格式,因为正是由于它们不灵活的, 基于跳转表的共享库机制,使得销售商和开发者们构建共享库非常困难。 直到已有的ELF工具提供了一种解决共享库问题的办法, 并被普遍认为是前进方向以后,迁徙的代价在FreeBSD界才被接受, 并由此完成了迁徙。FreeBSD的共享库机制其基础更类似于Sun &sunos;的共享库机制, 并且正因为此,其易用性很好。 那么,为什么会有这么多不同的格式呢? 回溯到蒙昧和黑暗的过去,那时只有简单的硬件。这种简单的硬件支撑了一个简单 和小型的系统。在这样的简单系统上(PDP-11)a.out格式 足以胜任表达二进制文件的任务。当人们将&unix;从这种简单的系统中移植出来的时候, a.out格式被保留了下来,因为对于早期将&unix移植到 Motorola 68k,VAXen等系统来说,它还是足够可用的。 然后,一些聪明的硬件工程师认为,如果可以让软件完成一些简单的聪明操作, 那么他们就可以在硬件设计中减少若干门电路,并可以让CPU核心运行得更快。 当a.out格式用于这种新型的硬件系统时(现在我们叫它 RISC),显得并不合适。因此,人们设计了许多新的格式 以便在这样的硬件系统上能获得比简单的a.out格式更优越 的性能。诸如COFFECOFF,还有其它 一些晦涩难懂的格式正是在这个阶段被发明出来的,人们也研究了这些格式的局限性, 慢慢地最终落实到ELF格式。 同时,程序的大小变得越来越大,磁盘空间(以及物理内存)相对来说却仍然较小, 因此共享库的概念便产生了。VM系统也变得越来越复杂了。当所有这些进步都建立在 a.out格式的基础上的时候,它的可用性随着每个新特性 的产生就受到了严重考验。并且,人们还希望可以在运行时动态装载某些东西,或者 在初始化代码运行以后可以丢弃部分程序代码,以便节约主存储器和交换区。编程语言 也变得越来越复杂,人们希望可以在main()函数执行之前自动执行某些代码。为了实现 所有这些功能,人们对a.out格式作了很多改动(hack), 他们在某个阶段里基本也是可行的。随着时间的推移,a.out格式 不得不增加大量的代码和复杂度来满足这些需求。虽然ELF格式 解决了许多这样的问题,但是从一个可用的系统迁移到另一个系统却是痛苦的。因此 直到继续保留a.out格式的代价比迁移到ELF格式 的代价还大的时候,人们才会最终转换到ELF格式。 然而,随着时间的推移,FreeBSD系统本身的编译工具(特别是汇编器和装载器) 赖以派生的编译工具,其发展却形成了两个平行的分支。FreeBSD这个分支增加了共享库, 并修改了一些错误。而原先编写了这些工具的GNU人则重写了这些工具,并对交叉编译提供了 更简化的支持,还随意插入了不同格式的支持,等等。虽然很多人希望创建针对FreeBSD的 交叉编译器,但他们却并未如愿以偿,因为FreeBSD的asld的源代码更为老旧,所以无法完成这个任务。 新的GNU工具链(binutils)则确实支持交叉编译,ELF 格式,共享库,C++扩展,等等。并且,由于很多供应商都发布ELF格式的 二进制文件,因而让FreeBSD能够运行它们将是一个很好的事情。 ELF格式比a.out格式开销要大些,同时也 允许基础系统有更好的扩展性。ELF格式的有关工具有着更好的维护, 并且提供交叉编译支持,这对许多人来说是很重要的。ELF格式可能会稍微 慢一些,但很难测量出来。另外,在这两者之间,有许多细节也是不同的,比如它们映射页面的方式, 处理初始化代码的方式,等等。所有这些都不太重要,但这也确实是不同之处。在将来的适当时候, GENERIC内核将不再支持a.out格式,并且, 当不再需要运行遗留的a.out格式程序时,内核也将不再提供对其的支持。 取得更多的资讯 联机手册 联机手册 最详细的使用说明文档莫过于 FreeBSD 里的联机手册了。 几乎每一个程序都会附上一份简短说明, 以介绍这个程序的的基本功能以及参数的用法。 我们能通过 man 命令来阅读这些说明, 而使用 man 命令却是简单的事情: &prompt.user; man command command 就是您要了解的命令命称。 举个例子,想了解 ls 命令就输入: &prompt.user; man ls 这些在线手册分下列章节: 用户命令。 系统调用以及错误代码。 C 库文件里的函数说明。 设备驱动程序。 文件格式。 游戏以及其他娱乐。 各种资讯。 系统维护以及命令。 内核开发情况。 在某些情况下,同样的主题也会出现在在线手册的不同章节。 举个例子,系统里有chmod这个用户命令,而又有个 chmod() 系统调用。 在这种情形下,您应当向 man 命令指定需要的内容: &prompt.user; man 1 chmod 这样就会显示出手册里的用户 chmod 命令。 传统上,我们在写入文档时把特定详细参考内容在在线手册括号里注明。 所以 &man.chmod.1; 是指 chmod 用户命令, 而 &man.chmod.2; 是指系统调用。 如果您已经知道命令的名字,只是不知道要怎样使用的话,那就比较好办。 但您连名字都不知到呢?这个时候您就可以利用 man 的搜寻功能, 它会在手册的介绍部份找寻您要搜寻的关键字,它的选项是 &prompt.user; man -k mail 当您使用这个命令的时候,man会把介绍里含有mail关键字 的命令列出来,实际上这和apropos命令的功能是相同的。 有时您会看到/usr/bin 下有许多命令但不知他们的用途, 您只需这样做: &prompt.user; cd /usr/bin &prompt.user; man -f * 或者这样做 &prompt.user; cd /usr/bin &prompt.user; whatis * 两个命令是一样的。 GNU Info 文件 Free软件基金会 FreeBSD许多应用软件以及实用工具来自Free软件基金会(FSF)。 作为手册的扩充,这些程序提供了一种更具有活力的超文档说明info, 您可用info命令来阅读他们。 假如您装上emacs,也能利用emacs 的info模式来阅读。 使用 &man.info.1; 这个命令只需简单地输入: &prompt.user; info 想得到简单介绍, 请按 h。 想快速得到的命令说明, 请按 ?
diff --git a/zh_CN.GB2312/books/handbook/bibliography/chapter.sgml b/zh_CN.GB2312/books/handbook/bibliography/chapter.sgml index 4860c6a2d5..fcb48da334 100644 --- a/zh_CN.GB2312/books/handbook/bibliography/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/bibliography/chapter.sgml @@ -1,634 +1,634 @@ 参考文献 尽管手册页能够提供对于 FreeBSD 操作系统最为权威的参考资料,它们有时却不能告诉我们如何让整个系统很好地运转起来。 因此,一本关于 &unix; 系统管理的好书,以及一份好的用户手册是不可或缺的。 关于 FreeBSD 的专业书籍与杂志 非英文的书籍和杂志: FreeBSD 入门与应用 (繁体中文)。 FreeBSD 技术内幕(中译本), 机械工业出版社。ISBN 7-111-10201-0。 FreeBSD 使用大全 第一版, 机械工业出版社。ISBN 7-111-07482-3。 FreeBSD 使用大全 第二版, 机械工业出版社。ISBN 7-111-10286-X。 FreeBSD Handbook (第二版中译本), 人民邮电出版社。ISBN 7-115-10541-3。 FreeBSD 3.x Internet 高级服务器的架设与管理 清华大学出版社。ISBN 7-900625-66-6。 FreeBSD & Windows 集成组网实务,中国铁道出版社。ISBN 7-113-03845-X。 FreeBSD 网站架设实务,中国铁道出版社。ISBN 7-113-03423-3。 FreeBSD for PC 98'ers (日文, 出版商:SHUWA System Co, LTD. ISBN 4-87966-468-5 C3055 P2900E。 FreeBSD (日文, 出版商:CUTT. ISBN 4-906391-22-2 C3055 P2400E. Complete Introduction to FreeBSD (日文, 出版商:Shoeisha Co., Ltd. ISBN 4-88135-473-6 P3600E. Personal UNIX Starter Kit FreeBSD (日文, 出版商:ASCII. ISBN 4-7561-1733-3 P3000E. FreeBSD Handbook (日文译本, 出版商:ASCII. ISBN 4-7561-1580-2 P3800E. FreeBSD mit Methode (德文, 出版商:Computer und Literatur Verlag/Vertrieb Hanser, 1998. ISBN 3-932311-31-0. FreeBSD 4 - Installieren, Konfigurieren, Administrieren (德文, 出版商:Computer und Literatur Verlag, 2001. ISBN 3-932311-88-4. FreeBSD 5 - Installieren, Konfigurieren, Administrieren (德文), 出版商: Computer und Literatur Verlag, 2003. ISBN 3-936546-06-1. FreeBSD de Luxe (德文), 出版商: Verlag Modere Industrie, 2003. ISBN 3-8266-1343-0. FreeBSD Install and Utilization Manual (日文), 出版商: Mainichi Communications Inc.. Onno W Purbo, Dodi Maryanto, Syahrial Hubbany, Widjil Widodo Building Internet Server with FreeBSD (印尼文), 出版商: Elex Media Komputindo. 英文版的书籍和杂志: Absolute BSD: The Ultimate Guide to FreeBSD, 出版商: No Starch Press, 2002. ISBN: 1886411743 The Complete FreeBSD, 出版商: O'Reilly, 2003. ISBN: 0596005164 The FreeBSD Corporate Networker's Guide, 出版商: Addison-Wesley, 2000. ISBN: 0201704811 FreeBSD: An Open-Source Operating System for Your Personal Computer, 出版商: The Bit Tree Press, 2001. ISBN: 0971204500 Teach Yourself FreeBSD in 24 Hours, 出版商: Sams, 2002. ISBN: 0672324245 FreeBSD unleashed, 出版商: Sams, 2002. ISBN: 0672324563 FreeBSD: The Complete Reference, 出版商: McGrawHill, 2003. ISBN: 0072224096 用户指南 Computer Systems Research Group, UC Berkeley. 4.4BSD User's Reference Manual. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-075-9 Computer Systems Research Group, UC Berkeley. 4.4BSD User's Supplementary Documents. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-076-7 UNIX in a Nutshell. O'Reilly & Associates, Inc., 1990. ISBN 093717520X Mui, Linda. What You Need To Know When You Can't Find Your UNIX System Administrator. O'Reilly & Associates, Inc., 1995. ISBN 1-56592-104-6 Ohio State University 编写了一份 UNIX 介绍性课程 ,并提供在线的 HTML 和 PostScript 版本。 这份文档的意大利文 翻译 是 FreeBSD Italian Documentation Project 的一部分。 Jpman Project, Japan FreeBSD Users Group. FreeBSD User's Reference Manual (日文译本). Mainichi Communications Inc., 1998. ISBN4-8399-0088-4 P3800E. Edinburgh University has written an Online Guide for newcomers to the UNIX environment. 管理员指南 Albitz, Paul and Liu, Cricket. DNS and BIND, 4th Ed. O'Reilly & Associates, Inc., 2001. ISBN 1-59600-158-4 Computer Systems Research Group, UC Berkeley. 4.4BSD System Manager's Manual. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-080-5 Costales, Brian, et al. Sendmail, 2nd Ed. O'Reilly & Associates, Inc., 1997. ISBN 1-56592-222-0 Frisch, Æleen. Essential System Administration, 2nd Ed. O'Reilly & Associates, Inc., 1995. ISBN 1-56592-127-5 Hunt, Craig. TCP/IP Network Administration, 2nd Ed. O'Reilly & Associates, Inc., 1997. ISBN 1-56592-322-7 Nemeth, Evi. UNIX System Administration Handbook. 3rd Ed. Prentice Hall, 2000. ISBN 0-13-020601-6 Stern, Hal Managing NFS and NIS O'Reilly & Associates, Inc., 1991. ISBN 0-937175-75-7 Jpman Project, Japan FreeBSD Users Group. FreeBSD System Administrator's Manual (日文译本). Mainichi Communications Inc., 1998. ISBN4-8399-0109-0 P3300E. Dreyfus, Emmanuel. Cahiers de l'Admin: BSD 2nd Ed. (in French), Eyrolles, 2004. ISBN 2-212-11463-X 开发指南 Asente, Paul, Converse, Diana, and Swick, Ralph. X Window System Toolkit. Digital Press, 1998. ISBN 1-55558-178-1 Computer Systems Research Group, UC Berkeley. 4.4BSD Programmer's Reference Manual. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-078-3 Computer Systems Research Group, UC Berkeley. 4.4BSD Programmer's Supplementary Documents. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-079-1 Harbison, Samuel P. and Steele, Guy L. Jr. C: A Reference Manual. 4rd ed. Prentice Hall, 1995. ISBN 0-13-326224-3 Kernighan, Brian and Dennis M. Ritchie. The C Programming Language.. PTR Prentice Hall, 1988. ISBN 0-13-110362-9 Lehey, Greg. Porting UNIX Software. O'Reilly & Associates, Inc., 1995. ISBN 1-56592-126-7 Plauger, P. J. The Standard C Library. Prentice Hall, 1992. ISBN 0-13-131509-9 Spinellis, Diomidis. Code Reading: The Open Source Perspective. Addison-Wesley, 2003. ISBN 0-201-79940-5 Stevens, W. Richard. Advanced Programming in the UNIX Environment. Reading, Mass. : Addison-Wesley, 1992. ISBN 0-201-56317-7 Stevens, W. Richard. UNIX Network Programming. 2nd Ed, PTR Prentice Hall, 1998. ISBN 0-13-490012-X Wells, Bill. Writing Serial Drivers for UNIX. Dr. Dobb's Journal. 19(15), December 1994. pp68-71, 97-99. 操作系统原理 Andleigh, Prabhat K. UNIX System Architecture. Prentice-Hall, Inc., 1990. ISBN 0-13-949843-5 Jolitz, William. Porting UNIX to the 386. Dr. Dobb's Journal. 1991年1月 - 1992年6月 Leffler, Samuel J., Marshall Kirk McKusick, Michael J Karels and John Quarterman The Design and Implementation of the 4.3BSD UNIX Operating System. Reading, Mass. : Addison-Wesley, 1989. ISBN 0-201-06196-1 Leffler, Samuel J., Marshall Kirk McKusick, The Design and Implementation of the 4.3BSD UNIX Operating System: Answer Book. Reading, Mass. : Addison-Wesley, 1991. ISBN 0-201-54629-9 McKusick, Marshall Kirk, Keith Bostic, Michael J Karels, and John Quarterman. The Design and Implementation of the 4.4BSD Operating System. Reading, Mass. : Addison-Wesley, 1996. ISBN 0-201-54979-4 (这本书的第二章的 在线版本 是 FreeBSD Documentation Project的一部分, 此外,第九章可以在 这里找到.) - Marshall Kirk McKusick, George V. Neville-NeilThe Design - and Implementation of the FreeBSD UNIX Operating System. + Marshall Kirk McKusick, George V. Neville-Neil The Design + and Implementation of the FreeBSD Operating System. Boston, Mass. : Addison-Wesley, 2004. ISBN 0-201-70245-2 Stevens, W. Richard. TCP/IP Illustrated, Volume 1: The Protocols. Reading, Mass. : Addison-Wesley, 1996. ISBN 0-201-63346-9 Schimmel, Curt. Unix Systems for Modern Architectures. Reading, Mass. : Addison-Wesley, 1994. ISBN 0-201-63338-8 Stevens, W. Richard. TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP and the UNIX Domain Protocols. Reading, Mass. : Addison-Wesley, 1996. ISBN 0-201-63495-3 Vahalia, Uresh. UNIX Internals -- The New Frontiers. Prentice Hall, 1996. ISBN 0-13-101908-2 Wright, Gary R. and W. Richard Stevens. TCP/IP Illustrated, Volume 2: The Implementation. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-63354-X 信息安全方面的参考文献 Cheswick, William R. and Steven M. Bellovin. Firewalls and Internet Security: Repelling the Wily Hacker. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-63357-4 Garfinkel, Simson and Gene Spafford. Practical UNIX & Internet Security. 2nd Ed. O'Reilly & Associates, Inc., 1996. ISBN 1-56592-148-8 Garfinkel, Simson. PGP Pretty Good Privacy O'Reilly & Associates, Inc., 1995. ISBN 1-56592-098-8 硬件参考 Anderson, Don and Tom Shanley. Pentium Processor System Architecture. 2nd Ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-40992-5 Ferraro, Richard F. Programmer's Guide to the EGA, VGA, and Super VGA Cards. 3rd ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-62490-7 Intel 公司在他们的 开发人员网站上, 提供了关于他们的 CPU,芯片组,以及标准的文档。多数是PDF文件. Shanley, Tom. 80486 System Architecture. 3rd ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-40994-1 Shanley, Tom. ISA System Architecture. 3rd ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-40996-8 Shanley, Tom. PCI System Architecture. 4th ed. Reading, Mass. : Addison-Wesley, 1999. ISBN 0-201-30974-2 Van Gilluwe, Frank. The Undocumented PC, 2nd Ed. Reading, Mass: Addison-Wesley Pub. Co., 1996. ISBN 0-201-47950-8 Messmer, Hans-Peter. The Indispensable PC Hardware Book, 4th Ed. Reading, Mass: Addison-Wesley Pub. Co., 2002. ISBN 0-201-59616-4 &unix; 历史 Lion, John Lion's Commentary on UNIX, 6th Ed. With Source Code. ITP Media Group, 1996. ISBN 1573980137 Raymond, Eric S. The New Hacker's Dictionary, 3rd edition. MIT Press, 1996. ISBN 0-262-68092-0. 它也被称作 Jargon File Salus, Peter H. A quarter century of UNIX. Addison-Wesley Publishing Company, Inc., 1994. ISBN 0-201-54777-5 Simon Garfinkel, Daniel Weise, Steven Strassmann. The UNIX-HATERS Handbook. IDG Books Worldwide, Inc., 1994. ISBN 1-56884-203-1 Don Libes, Sandy Ressler Life with UNIX — special edition. Prentice-Hall, Inc., 1989. ISBN 0-13-536657-7 BSD 族谱. 或在任何一台较新的 FreeBSD 机器中的 /usr/share/misc/bsd-family-tree The BSD Release Announcements collection. 1997. Networked Computer Science Technical Reports Library. Old BSD releases from the Computer Systems Research group (CSRG). : The 4CD set covers all BSD versions from 1BSD to 4.4BSD and 4.4BSD-Lite2 (but not 2.11BSD, unfortunately). As well, the last disk holds the final sources plus the SCCS files. 各种期刊 The C/C++ Users Journal. R&D Publications Inc. ISSN 1075-2838 Sys Admin — The Journal for UNIX System Administrators Miller Freeman, Inc., ISSN 1061-2688 freeX — Das Magazin für Linux - BSD - UNIX (德文) Computer- und Literaturverlag GmbH, ISSN 1436-7033 diff --git a/zh_CN.GB2312/books/handbook/config/chapter.sgml b/zh_CN.GB2312/books/handbook/config/chapter.sgml index 512f6d29b9..c4983bd5b7 100644 --- a/zh_CN.GB2312/books/handbook/config/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/config/chapter.sgml @@ -1,2619 +1,2620 @@ Chern Lee Written by Mike Smith Based on a tutorial written by Matt Dillon Also based on tuning(7) written by 设置和调整 概述 系统配置 系统优化 &os; 的一个重要问题是系统配置。 正确地配置系统能充分地减少以后维护和升级系统所需的工作量。 这章将解释一些 &os; 的配置过程,包括一些可以调整的 &os; 系统的一些参数。 阅读完本章之后您将会知道: 怎样有效的利用文件系统和交换分区。 rc.conf 的基本设置和 /usr/local/etc/rc.d 启动体系。 怎样设置和测试一块网卡。 怎样在您的网络设备上设置虚拟主机。 怎样使用 /etc 下的各配置文件。 怎样使用 sysctl 来调整 &os; 系统变量。 怎样调整磁盘性能和修改内核限制。 在阅读本章之前,您应该了解: 了解 &unix; 和 &os; 的基础知识 ()。 熟悉内核配置编译的基础知识 ()。 初步配置 分区规划 分区规划 /etc /var /usr 基本分区 当使用 &man.disklabel.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: . 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 启动服务 服务 很多 &os; 用户选择用ports来安装第三方软件。 大多数情况下需要一种方式来配置软件, 这种方式可以让软件在系统初始化之后就启动。 很多软件需要在系统初始化时就启动,类似于其中的两个 mail/postfix 或者 www/apache13。 因此必须有一个行之有效的方法来配合第三方软件, 偶然的出错会导致程序不能正确启动。 &os; 包含的大多数服务,例如 &man.cron.8;, 就是通过系统启动脚本启动的。 这些脚本也许会有些不同, 这取决于 &os; 版本。 但是不管怎样, 需要考虑的一个重要方面是他们的启动配置文件要能被基本启动脚本识别捕获。 自从 rcNG 出现以来,系统为第三方软件初始化变得清晰而有条理了。 应用程序将会把一个简单的启动脚本放在 /usr/local/etc/rc.d 目录,系统初始化脚本会读取这个目录下面的脚本。 这些脚本在系统启动之后被执行。 当很多人花费时间把旧的配置格式融入到新系统的时候, 仍然残留有一些第三方软件需要把脚本放在上述目录中。 这些脚本中的细微差别依赖于 rcNG 是否被使用。 &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 - 这个脚本提供了一个 start - 和 stop 选项, - 这可以让应用程序被当作组件(utility)来引用。 - 可以在 /etc/rc.conf 写这么一行: + 这个脚本提供了一个 stop 和 + start 选项, 用于操作这里称之为 + utility 的应用程序。 可以在 + /etc/rc.conf 中加入这样一行: utility_enable="YES" 可以用如下方法来启动: &prompt.root; /usr/local/etc/rc.d/utility.sh start 现在不是所有第三方软件都需要在 rc.conf有这么一行, 不过几乎每天都有port被修改来接受这个配置。 对于一个特定的应用程序来说, 你可以查看安装的最终输出来获得更多信息。 一些第三方软件仍然提供一个脚本来供 rcNG 来使用, 这将在下一节介绍。 扩展应用程序配置 现在 &os; 包含rcNG,软件启动配置更加理想了, 当然也变得更深奥。 用 rcNG 这章介绍的关键字,应用程序现在被配置为可以在某一个服务之后启动, 例如DNS; 可能还要在 rc.conf 传递更多的参数给启动脚本。 一个基本的脚本看起来有点象下面这个样子: #!/bin/sh # # PROVIDE: utility # REQUIRE: DAEMON # BEFORE: LOGIN # KEYWORD: FreeBSD 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 能够在 login 服务之前, 并且在 daemon 服务之后启动。 它同时也提供了一个设置和跟踪 PID, 也称作进程 ID 文件的方法。 这个新方法也使得命令行参数、包含 /etc/rc.subr 中所提供的功能, 兼容 &man.rcorder.8; 工具并提供更简单的通过 rc.conf 文件来配置的方法。 实际上它甚至可以放到 /etc/rc.d 目录中。 当然, 在使用 &man.mergemaster.8; 来完成软件升级时这会带来一些麻烦。 使用服务来启动服务 其他服务, 例如 POP3 服务器, 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 配置 <command>cron</command> cron 配置 &os; 最有用的软件包(utilities)中的一个是 &man.cron.8;。 cron 软件在后台运行并且经常检查 /etc/crontab 文件。cron 软件也检查 /var/cron/tabs 目录,搜索新的 crontab 文件。这些 crontab 文件存储一些 cron 在特定时间执行任务的信息。 cron 程序使用两种不同类型的配置文件, 即系统 crontab 和用户 crontabs。 两种格式的唯一区别是第六个字段。 在系统 crontab 中,第六个字段是用于执行命令的用户名。 这给予了系统 crontab 以任意用户身份执行命令的能力。 在用户 crontab 中, 第六个字段是要执行的命令, 所有的命令都会以这个用户自己的身份执行; 这是一项重要的安全功能。 用户 crontabs 允许每一个用户在不需要 root 特权的前提下调度自己的任务。 在用户的 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 $ # # SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/var/log # # #minute hour mday month wday who command # # */5 * * * * root /usr/libexec/atrun 像大多数 &os; 配置文件一样,# 字符是注释。 作为什么和为什么要执行,可以加一个注释来描述以便将来提醒您。 注释不能跟命令一样在同一行上否则他们会被看成命令的一部分。 注释应该另起一行。空行将会被忽略。 首先应该定义环境变量。等号 (=) 字符用来定义任何环境变量,像这个例子用到了 SHELLPATHHOME 变量。如果 shell 行被忽略掉,cron 将会用默认值 sh。如果 变量被忽略, 那么就没有默认值并且需要指定文件绝对位置。如果 被忽略,cron 将用用执行者的 home 目录。 这一行定义了七个字段。它们是 minutehourmdaymonthwdaywhocommand。 它们差不多已经说明了各自的用处。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 In this example, crontab-file is the filename of a crontab that was previously created. 还有一个选项用来列出安装的 crontab 文件: 只要传递 选项给 crontab 然后看一下输出。 用户想不用模板(已经存在的文件)而直接安装他的 crontab 文件,用 crontab -e 选项也是可以的。 它将会启动一个编辑器并且创建一个新文件,当这个文件被保存的时候, 它会自动的用 crontab 来安装这个文件。 如果您稍后想要彻底删除自己的用户 crontab 可以使用 crontab 选项。 Tom Rhodes Contributed by 在 FreeBSD 5.X 下使用 rc rcNG &os; 最近整合了 NetBSD 的 rc.d 系统以完成系统初始化。用户要注意 /etc/rc.d 目录下的文件。这些文件中的很多都是可以接受 选项的基本服务。 例如,&man.sshd.8; 可以用下面的命令重启: &prompt.root; /etc/rc.d/sshd restart 其它的服务跟这个过程相似。当然,在 &man.rc.conf.5; 指定的服务通常可以自动启动。例如,让网络地址转换(NAT) 守护进程在系统启动的时候启动可以简单的在 /etc/rc.conf 中添加下面一行: natd_enable="YES" 如果 行已经存在, 只要简单的把 改成 即可。 rc 脚本在下次重新启动的时候会自动的装载所需要的服务, 像下面所描述的那样。 由于 rc.d 系统在系统启动/关闭时首先启动/停止服务,如果设置了适当的 /etc/rc.conf 变量,标准的 选项将会执行他们的动作。例如 sshd restart 命令只在 /etc/rc.conf 中的 sshd_enable 设置成 的时候工作。不管是否在 /etc/rc.conf 中设置了,要 或者 一个服务,命令前可以加上一个force前缀。例如要不顾当前 /etc/rc.conf 的设置重新启动 sshd,执行下面的命令: &prompt.root; /etc/rc.d/sshd forcerestart 用选项 可以简单来的检查 /etc/rc.conf 中用适当的 rc.d 脚本启动的服务是否被启用。从而管理员可以运行这样的程序来检查 sshd 是否真的在 /etc/rc.conf 中被启动了: &prompt.root; /etc/rc.d/sshd rcvar # sshd $sshd_enable=YES 第二行 (# sshd) 是从 sshd 命令中输出的,而不是 root 控制台。 为了确定一个服务是否真的在运行,可以用 选项。例如验证 sshd 是否真的启动了: &prompt.root; /etc/rc.d/sshd status sshd is running as pid 433. 一个服务也是可以的。 这将要尝试发送一个信号给一个单独的服务, 强制这个服务重新装载它的配置文件。大多数情况这意味着给服务发送一个 SIGHUP 信号。 rcNG 结构不仅仅是给网络服务提供的, 它也给很多系统初始化提供服务。例如,处理 bgfsck 文件。当这个脚本执行的时候,它会输出下列信息: Starting background file system checks in 60 seconds. 这个文件用做后台文件系统检查,系统初始化的时候完成。 很多系统服务依赖其他服务提供的相应功能。例如,NIS 和其他基于 RPC 的服务启动可能在 rpcbind 服务启动之前失败。 要解决这个问题,依赖关系信息和其他头信息当作注释被包含在每个启动脚本文件的前面。 程序在系统初始化时分析这些注释以决定调用其他系统服务来满足依赖关系。 下面的字句可能会包含在每个启动脚本文件的前面: PROVIDE: Specifies the services this file provides. REQUIRE: Lists services which are required for this service. This file will run after the specified services. BEFORE: Lists services which depend on this service. This file will run before the specified services. KEYWORD: &os; or NetBSD. This is used for *BSD dependent features. 通过这种方法,系统管理员可以容易的控制系统而不用像其他一些 &unix; 操作系统一样要用 runlevels 来控制。 &os;5.X 的附加信息: rc.d 系统可以在 &man.rc.8; 和 &man.rc.subr.8; 手册页中找到。 Marc Fonvieille Contributed by 设置网卡 网卡配置 现在我们不可想象一个计算机没有网络连接的情况。 添加和配置一块网卡是任何 &os; 系统管理员的一项基本任务。 查找正确的驱动程序 网卡配置 查找驱动程序 在开始之前,您应该知道您的网卡类型,它用的芯片和它是 PCI 还是 ISA 网卡。&os; 支持很多种 PCI 和 ISA 网卡。 可以查看您的版本硬件兼容性列表以确定您的网卡被支持。 现在您已经确信您的网卡被支持了,您需要为这块网卡选择正确的驱动程序。 /usr/src/sys/i386/conf/LINT 文件将会给您一些被支持的芯片/网卡驱动信息的列表。 如果您对哪个是正确的驱动有疑问,阅读驱动的使用手册。 手册会提供所支持硬件的更多信息和相关可能产生的问题。 如果您有一个普通的网卡,大多数时候您不需要为驱动浪费精力。 常用的网卡在 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; 驱动的网卡在系统中。 为了使用网卡,需要装载正确的驱动程序。这可能通过两种途径来完成。 最简单的方法是简单的用 &man.kldload.8; 来装载一个驱动该网卡的内核模块。 一个模块不是支持所有网卡驱动的(例如ISA 网卡用 &man.ed.4; 来驱动)。 另一种可选择的方法是您可以把支持您网卡的驱动静态的编译进内核。查看 /usr/src/sys/i386/conf/LINT 和手册中的驱动部分来了解把什么添加到您的内核配置文件中。可以查看 以获得更多的重新编译内核的信息。 如果您的网卡在启动时被您的内核 (GENERIC) 检测到了,那么就没有必要建立一个新内核了。 配置网卡 网卡配置 配置 现在正确的网卡驱动程序已经装载,那么就应该配置它了。 跟其他配置一样,网卡可以在安装时用 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; 后面接 选项,需要了解更多的 &man.ifconfig.8; 语法请查阅使用手册。注意所有关于 IPv6 (inet6 等等) 的记录在这个例子里都被忽略了。 在这个例子中,显示出了下列设备: dc0: The first Ethernet interface dc1: The second Ethernet interface lp0: The parallel port interface lo0: The loopback device tun0: The tunnel device used by ppp &os; 使用内核引导时检测到的网卡驱动顺序来命名网卡。例如 sis2 是系统中使用 &man.sis.4; 驱动的第三块网卡。 在这个例子中,dc0 设备启用了。主要表现在: UP 表示这块网卡已经配置完成准备工作。 这块网卡有一个 Internet (inet) 地址 (这个例子中是 192.168.1.3)。 它有一个有效的子网掩码 (netmask0xffffff00 等同于 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" 用自己正确的设备名和地址来替换例子中的 dc0dc1 等内容。您应该应该查阅网卡驱动和 &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.2550xffffffff 例如,假设 fxp0 连接到两个网段, 子网掩码是 255.255.255.010.1.1.0 和子网掩码是 255.255.255.240202.0.75.16。我们将要系统使用从 10.1.1.110.1.1.5 和从 202.0.75.17202.0.75.20 的地址)。 如前面说明的那样, 只有给定网络范围内的第一个地址 (在这个例子中, 10.0.1.1202.0.75.17) 需要有实际的子网掩码; 所有其它地址 (10.1.1.210.1.1.5 以及 202.0.75.18202.0.75.20) 必须配置为使用掩码 255.255.255.255 下面的记录会正确的设置这个适配器: 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" 配置文件 <filename>/etc</filename> 布局 在配置信息中有很多的目录,这些包括: /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 <filename>/etc/resolv.conf</filename> 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 只能使用一个 searchdomain 选项。 如果您在使用 DHCP,&man.dhclient.8; 经常使用从 DHCP 服务器接受来的信息重写 resolv.conf <filename>/etc/hosts</filename> 主机 /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; 以获得更多信息。 日志文件配置 日志文件 <filename>syslog.conf</filename> 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; 手册页以获得更多信息 <filename>newsyslog.conf</filename> newsyslog.conf newsyslog.conf 是一个通常用 &man.cron.8; 计划运行的 &man.newsyslog.8; 程序的配置文件。 &man.newsyslog.8; 指出了什么时候日志文件需要打包或者重新整理。 比如 logfile 被移动到 logfile.0logfile.0 被移动到 logfile.1 等等。另外,日志文件可以用 &man.gzip.1; 来压缩,它们是这样的命名格式: logfile.0.gzlogfile.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; 手册页以获得更多信息。 <filename>sysctl.conf</filename> sysctl.conf sysctl sysctl.conf 看起来很像 rc.conf。它用 variable=value 的形式来设定值。指定的值在系统进入多用户模式之后被设定。 并不是所有的变量都可以在这个模式下设定。 一个简单的例子举明了在 sysctl.conf 中关闭了重要的退出信号的日志并且让 Linux 程序知道他们其实运行在 &os; 下面: kern.logsigexit=0 # Do not log fatal signal exits (e.g. sig 11) compat.linux.osname=&os; compat.linux.osrelease=4.3-STABLE 用 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')。 If you want to set automatically some variables each time the machine boots, add them to the /etc/sysctl.conf file. For more information see the &man.sysctl.conf.5; manual page and the . 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 文件中。 修复上面的问题用户需要在刚才所说的文件中设置 。现在 &man.cardbus.4; 就会正常的工作了。 调整磁盘 Sysctl 变量 <varname>vfs.vmiodirenable</varname> vfs.vmiodirenable vfs.vmiodirenable sysctl 变量可以设置成0(关)或者1(开);默认是1。 这个变量控制目录是否被系统缓存。大多数目录是小的, 在系统中只使用单个片断(典型的是1K)并且在缓存中使用的更小 (典型的是512字节)。当这个变量设置为关闭 (0) 时, 缓存器仅仅缓存固定数量的目录,即使您有很大的内存。 而将其开启 (设置为1) 时, 则允许缓存器用 VM 页面缓存来缓存这些目录,让所有可用内存来缓存目录。 不利的是最小的用来缓存目录的核心内存是大于 512 字节的物理页面大小(通常是 4k)。 我们建议如果您在运行任何操作大量文件的程序时保持这个选项打开的默认值。 这些服务包括 web 缓存,大容量邮件系统和新闻系统。 尽管可能会浪费一些内存,但打开这个选项通常不会降低性能。 但还是应该检验一下。 <varname>vfs.write_behind</varname> vfs.write_behind vfs.write_behind sysctl 变量默认是 1 (打开)。 它告诉文件系统簇被收集满的时候把内容写进介质, 典型的是在写入大的连续的文件时。 主要的想法是, 如果可能对 I/O 性能会产生负面影响时, 应尽量避免让缓冲缓存被未同步缓冲区充满。 然而它可能降低处理速度并且在某些情况下您可能想要关闭它。 <varname>vfs.hirunningspace</varname> vfs.hirunningspace vfs.hirunningspace sysctl 变量决定了在任何场合多少写 I/O 被排进队列以给系统的磁盘控制器。 默认值一般是足够的,但是对有很多磁盘的机器来说您可能需要把它设置成 4M 或 5M。注意这个设置成很高的值(超过缓存器的写极限)会导致坏的性能。 不要盲目的把它设置太高!高的数值会导致同时发生的读操作的迟延。 sysctl 中还有许多与 buffer cache 和 VM页面 cache 有关的值, 一般不推荐修改它们。 从 &os; 4.3 开始,虚拟内存系统已经能够很好地进行自动调整了。 <varname>vm.swap_idle_enabled</varname> vm.swap_idle_enabled vm.swap_idle_enabled sysctl 变量在有很多用户进入、离开系统和有很多空闲进程的大的多用户系统中很有用。 这些系统注重在空闲的内存中间产生连续压力的处理。通过 vm.swap_idle_threshold1vm.swap_idle_threshold2 打开这个特性并且调整交换滞后 (在空闲时)允许您降低内存页中空闲进程的优先权,从而比正常的出页 (pageout)算法更快。这给出页守护进程带来了帮助。 除非您需要否则不要把这个选项打开,因为您所权衡的是更快地进入内存, 因而它会吃掉更多的交换和磁盘带宽。在小的系统上它会有决定性的效果, 但是在大的系统上它已经做了合适的页面调度这个选项允许 VM 系统容易的让全部的进程进出内存。 <varname>hw.ata.wc</varname> hw.ata.wc &os; 4.3 IDE 写缓存关掉了。这降低了到 IDE 磁盘的带宽但是保证了传进磁盘数据的严格完整性。这个问题是因为 IDE 驱动器当写完成的时候无所事事。IDE 写缓存打开的时候,IDE 驱动器不按顺序把数据写进磁盘。当有很重的磁盘负载的时候它有时迟延写入一些块。 当机或者掉电会引起严重的文件系统讹误。&os; 的默认值改变成安全的模式。 不幸的是结果是带来了很大的性能损失,所以我们在发行版之后把写缓存的默认值改成了 on。您应该注意 hw.ata.wc sysctl 变量来检查一下系统中的默认值。 如果 IDE 写缓存被关闭了,您可以通过设置内核变量为 1 来打开它。这必须在启动时通过 boot loader 来完成。在内核启动之后尝试这么做将会没有效果。 要了解更多的信息,请查阅 &man.ata.4;。 <literal>SCSI_DELAY</literal> (<varname>kern.cam.scsi_delay</varname>) SCSI_DELAY kern.cam.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 的最佳时机是在单用户模式下任何分区被被挂载前。 像 &os; 4.5,在文件系统创建时也可以打开 Soft Updates,通过 &man.newfs.8; 的 -U 选项。 Soft Updates 彻底的改善了数据描述(meta-data)的性能, 主要是文件创建和删除,通过内存缓存。我们建议您在所有的文件系统上使用 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 之后)。这可能在文件系统上安装大量数据时候引发问题, 没有足够的剩余空间来两次存储所有文件。 调整内核限制 调整 内核限制 文件/进程限制 <varname>kern.maxfiles</varname> kern.maxfiles kern.maxfiles 可以根据系统的需求加大或者减小。 这个变量指出了在系统上文件描述符的最大数量。当文件描述符表曼的时候, 用 dmesg 命令可以看到 file: table is full 将会在系统信息缓存里反复的出现。 每个打开的文件、套接字、fifo 都使用一个描述符。 一个大规模的服务器很容易使用上千个文件描述符, 这取决于系统中同时运行着的服务的数量和类型。 kern.maxfile 的默认值以系统配置文件中的 选项来决定。kern.maxfiles 的值成比例的增长。编译一个自定义内核的时候, 按照您系统中用户的数量来设置这个值是个好主意。 从这个数字可以确定内核很多先前定义的限制。即使一台机器不会真有 256 个用户同时连接,所需要的资源也可能跟一个高负荷的 web 服务器差不多。 像是 &os; 4.5,在您的内核配置中设置 为会通过系统中内存的数量来选择一个合适的值。 <varname>kern.ipc.somaxconn</varname> 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; 的 选项可以用来观察网络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 可用。 <varname>net.inet.ip.portrange.*</varname> net.inet.ip.portrange.* net.inet.ip.portrange.* sysctl 变量自动的控制绑定在 TCP 和 UDP 套接字上的端口范围。 这里有三个范围:一个低端范围,一个默认范围和一个高端范围。 大多数网络程序分别使用由 net.inet.ip.portrange.firstnet.inet.ip.portrange.last 控制的从 1024 到 5000 的默认范围。端口范围用作对外连接,并且某些情况可能用完系统的端口, 这经常发生在运行一个高负荷 web 代理服务器的时候。 这个端口范围不是用来限制主要的例如 web 服务器进入连接或者有固定端口例如邮件传递对外连接的。 有时您可能用完了端口,那就建议适当的增加 net.inet.ip.portrange.last1000020000 或者 30000 可能是适当的值。 更改端口范围的时候也要考虑到防火墙。一些防火墙会阻止端口的大部分范围 (通常是低范围的端口)并且用高端口进行对外连接(—)。 基于这个问题建议把 net.inet.ip.portrange.first 设置的小一点。 TCP 带宽迟延(Bandwidth Delay Product) TCP 带宽迟延限制 net.inet.tcp.inflight_enable The TCP Bandwidth Delay Product Limiting 类似于 NetBSD 的TCP/Vegas。 它可以通过设置 net.inet.tcp.inflight_enable sysctl 变量为 1 来启动。 系统将会为每个连接尝试带宽迟延并且限制发送到网络中的队列中的数据数量以维持适当的吞吐量。 如果您在使用调制解调器,千兆以太网或者高速的广域网连接 (或者其他有高的带宽迟延的产品)提供数据服务,这个特性就会很有用。 特别是您在使用窗口缩放或者配置一个大的发送窗口。如果启用了这个选项, 同时要确信设置 net.inet.tcp.inflight_debug0(关闭调试),对于生产用来说,设置 net.inet.tcp.inflight_min 至少为 6144 可能会受益。然而, 注意设置一个高的最小值能有效的关闭依赖连接的带宽限制。 这个限制特性减少了在路由和交换包队列的堵塞数据数量, 也减少了在本地主机接口队列阻塞的数据的数量。在少数的等候队列中、 交互式连接,尤其是通过慢速的调制解调器,也能用低的 往返时间操作。但是,注意这只影响到数据发送 (上载/服务端)。对数据接收(下载)没有效果。 调整 net.inet.tcp.inflight_stab 被建议的。这个参数的默认值是 20, 它代表两个最大的包被添加到带宽迟延窗口考虑。 另外的窗口是稳定算法和改善改变条件时的应答所需要的, 但是它也能导致通过慢速连接产生高的 ping 时间(虽然比您不用这个算法还慢)。 这些情况下,您可能想试着把这个参数减小到 15,10 或者 5; 并且也可能需要减小 net.inet.tcp.inflight_min (例如3500)来达到效果。减少这些参数应该是最后的唯一手段。 添加交换空间 不管您计划的如何好,有时候系统并不像您所期待的那样运行。 如果您发现需要更多的交换空间,添加它很简单。 有三种方法增加交换空间:添加一块新的硬盘驱动器、通过 NFS 使用交换空间和在一个现有的分区上创建一个交换文件。 在新的硬盘驱动器上使用交换空间 这是添加交换空间最好的方法, 当然为了达到这个目的需要添加一块硬盘。 毕竟您总是可以使用另一块磁盘。如果能这么做, 重新阅读一下手册中关于交换空间的 来了解如何最优地安排交换空间。 通过 NFS 交换 通过 NFS 来交换只在您没有本地硬盘交换的时候被建议。在 &os; 4.X 以前的版本中使用NFS交换速度很慢并且效率低下。4.0-RELEASE 和更新的版本中他的速度和效率还是可以接受的。即使使用新版本的 &os;,NFS 交换也会被可用的网络带宽限制并且增加 NFS 服务器的负担。 交换文件 您可以创建一个指定大小的文件用来当作交换文件。 在我们的例子中我们将会使用叫做 /usr/swap0 的 64MB 大小的文件。当然您也可以使用任何您所希望的名字。 在 &os; 4.X 上创建一个交换文件 确认您的内核配置包含了 vnode 驱动。 它不包含在最近版本的 GENERIC pseudo-device vn 1 #Vnode driver (turns a file into a device) 创建一个 vn-device 设备: &prompt.root; cd /dev &prompt.root; sh MAKEDEV vn0 创建一个交换文件 (/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; vnconfig -e /dev/vn0b /usr/swap0 swap 在 &os; 5.X 上创建一个交换文件: 确认您的内核配置包含虚拟磁盘(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 在 &os; 5.X 及以上的操作系统中作为一个默认的内核模块被支持。对于 &os; 4.9,ACPI 可以通过在内核配置文件中添加 device acpica 并且重新编译内核来启用。 什么是 ACPI? 高级配置和电源接口(ACPI) 是一个业界标准的硬件资源和电源管理接口(因此而得名)。它是 操作系统控制的配置和电源管理(Operating System-directed configuration and Power Management),也就是说, 它给操作系统(OS)提供了更多的控制和弹性。 现代操作系统延伸了当前即插即用接口(像是 &os;4.X 中使用的 APM)的限制,在 ACPI 的介绍之前。 ACPIAPM(高级电源管理) 的直接继承者。 高级电源管理 (APM) 的缺点 高级电源管理 (APM) 是一种基于系统目前的活动控制其电源使用的机制。 APM BIOS 由 (系统的) 制造商提供, 并且是硬件平台专属的。 在 OS 中的 APM 驱动作为中介来访问 APM 软件接口, 从而实现对电源使用的管理。 APM 有四个主要的问题。 首先, 电源管理是通过 (制造商专属的) BIOS 实现的, 而 OS 则完全不了解其细节。 例如, 用户在 APM BIOS 中设置了硬盘驱动器的空闲等待数值, 当超过这一空闲时间的限制时, 它 (BIOS) 将会减慢硬盘驱动器的速度, 而不会征求 OS 的同意。 第二, APM 逻辑是嵌入 BIOS 的, 因此它是在 OS 的控制之外运转的。 这意味着用户只能通过通过刷新他们 ROM 中的 APM BIOS - 才能够解决某些问题; 而这是一个很危险的操作, 一旦失败, - 则可能使系统进入一个无法恢复的状态。 第三, APM + 才能够解决某些问题; 而这是一个很危险的操作, + 因为它可能使系统进入一个无法恢复的状态。 第三, APM 是一种制造商专属的技术, 也就是说有很多第三方的 (重复的工作) 以及 bugs, 如果在一个制造商的 BIOS 中有, 也未必会在其他的产品中解决。 最后但绝不是最小的问题, APM BIOS 没有为实现复杂的电源策略提供足够的余地, 也无法实现能够非常适合具体机器的策略。 即插即用 BIOS (PNPBIOS) 在很多时候都是不可靠的。 PNPBIOS 是 16-位 的技术, 因此 OS 不得不使用 16-位 模拟才能够与 PNPBIOS 的方法 接口 &os; APM 驱动在 &man.apm.4; 手册页中有描述。 配置 <acronym>ACPI</acronym> acpi.ko 驱动默认的在启动时通过 &man.loader.8; 被加载并且 不应该 被编译进内核。原因是这个模块跟系统很容易的工作在一起,比方说不用为了 acpi.ko 而重新编译内核。 这对更简单的测试来说很有利。另一个原因是系统启动后再启动 ACPI 不是很有用,并且在一些情况下会失败。 拿不准的话只要全部禁止 ACPI 即可。 这个驱动不应该而且不能被卸载,因为系统通过它跟各种各样的硬件打交道。 ACPI 可以通过 &man.acpiconf.8; 来禁止。实际上通过 ACPI 的交互可以通过 &man.acpiconf.8; 来完成。 简单的说,如果任何关于 ACPI 的信息在 &man.dmesg.8; 的输出中,那么它很可能已经运行了。 ACPIAPM 不能共存并且应该份开始用。后来装载的如果注意到另一个在运行将会终止执行。 最简单的表现形式是,ACPI 可以通过 &man.acpiconf.8; 的 标志和一个 1-5 的选项来使系统进入休眠状态。 5 选项将会像下面动作一样让系统软关机: &prompt.root; halt -p 其他选项也是可行的。查看 &man.acpiconf.8; 手册页以获得更多信息。 Nate Lawson 撰写人: Peter Schultz 协力: Tom Rhodes 使用和调试 &os; <acronym>ACPI</acronym> - ACPI 是在本质上是一种发现设备、管理电源使用, + ACPI 是一种全新的发现设备、 管理电源使用, 提供过去由 BIOS 管理的访问不同硬件的标准化方法。 让 ACPI 在各种系统上都能正确使用的工作一直在进行, 但许多主板的 ACPI 机器语言 - (AML) 字节代码中的 bug, &os; 的内核中资系统设计的不完善, - 以及 Intel ACPI-CA 解释器中的 bug 仍然市场会出现。 + (AML) 字节代码中的 bug, &os; 的内核中资系统设计的不完善, + 以及 &intel; + ACPI-CA 解释器中的 bug 仍然不时会出现。 这份文档期望能够帮助您协助 &os; ACPI 的维护人员来找到您所观察到的问题的根源, 并通过调试找到其解决方法。 感谢您阅读这份文档, 我们也希望能够解决您的系统上的问题。 提交调试信息 在提交问题之前, 请确认您已经在运行最新的 BIOS 版本, 此外, 也包括嵌入式控制器的固件版本。 如果您希望提交一个问题, 请确保将下述信息法到 - freebsd-acpi@FreeBSD.org + freebsd-acpi@FreeBSD.org: 问题行为的描述, 包括系统类型、型号,以及任何触发问题的相关信息。 另外, 请注意尽可能准确地描述这一问题是否对您是陌生的。 boot - 之后得到的 dmesg 输出, 包括任何在重现 bug - 之后出现的错误信息。 + 之后得到的 &man.dmesg.8; 输出, 以及任何在重现 + bug 时出现的错误信息。 在禁用了 ACPI 之后的 boot - 的 dmesg 输出, 如果您发现禁用 ACPI + 的 &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 存在于采用 ia32 (x86)、 ia64 (安腾)、 以及 amd64 (AMD) 架构的所有现代计算机上。 完整的标准具有大量的各式功能, 包括 CPU 性能管理、 电源控制、 温度监控、 电池系统、 嵌入式控制器以及总线枚举。 绝大多数系统实现比完整标准的功能要少一些。 例如, 桌面系统通常只实现总线枚举部分, 而笔记本则通常支持降温和电源管理功能。 笔记本通常还提供休眠和唤醒支持, 并提供与此适应的复杂功能。 符合 ACPI 的系统中有许多组件。 BIOS 和芯片组制造商提供一些固定的表 (例如, FADT) 在存储器中, 以提供类似 APIC 映射 (用于 SMP)、 配置寄存器、 以及简单的配置值等等。 另外, 一个字节代码 (bytecode) 表 (系统区别描述表 DSDT) 则提供了通过树状命名空间来指定设备及其功能的方法。 ACPI 驱动必须要处理固定表, 实现字节码解释器, 并修改驱动程序和内核, 以接受来自 - ACPI 子系统的信息。 对于 &os;, Intel + 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 正常工作, 它的每一部分都必须工作正常。 这里是一些常见的问题, 按照出现的频繁程度顺序排序, 并提供了一些绕过或修正它们的方法。 休眠/唤醒 ACPI 提供了三种休眠到 RAM (STR) 的状态, S1-S3, 以及一个休眠到磁盘的状态 (STD), 称作 S4S5软关机 同时也是系统接好电源但没有开机时的正常状态。 S4 实际上可以用两种不同的方法来实现。 S4BIOS 是一种由 BIOS 辅助的挂起到磁盘方法, 而 S4OS 则是完全由操作系统实现的。 可以使用 sysctl 来查看与休眠有关的项目。 这里是我的 Thinkpad 上得到的结果。 hw.acpi.supported_sleep_state: S3 S4 S5 hw.acpi.s4bios: 0 这表示我可以使用 acpiconf -s 来测试 S3S4OS, 以及 S5。 如果 是一 (1), 则可以使用 S4BIOS 来代替 S4 OS 当测试休眠/唤醒时, 从 S1 开始, 如果它被支持的话。 这个状态是最可能正常工作的状态, 因为它不需要太多的驱动支持。 没有人实现 S2 但如果您有它的支持, 则应该和 S1 类似。 下一件值得尝试的是 S3。 这是最深的 STR 状态, 并需要一系列驱动的支持才能够正常地重新初始化您的硬件。 如果您在唤醒系统时遇到问题, 请不要吝惜发邮件给 &a.acpi.name; 邮件列表, 尽管不要指望问题一定会很快解决, 因为有许多驱动程序/硬件需要进行更多的测试和改进。 为了帮助隔离问题, 请在内核中删去尽可能多的驱动。 如果这样做能够解决问题, 请尝试逐个加载驱动直到问题再次出现。 通常预编译的驱动程序如 nvidia.koX11 显示驱动, 以及 USB 的问题最多, 而以太网卡的驱动则通常工作的很好。 如果您能够通过加载和卸载驱动使系统正常工作, 您可以通过将适当的命令放到 /etc/rc.suspend/etc/rc.resume 来将这个过程自动化。 在这两个文件中有一个注释掉的卸载和加载驱动程序的例子供您参考。 另外您还可以将 设置为零 (0), 如果您的显示在唤醒之后显得很混乱。 此外您还可以尝试更长或更短的 值看看是否有所助益。 另一件值得一试的事情是使用一个比较新的包含 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 ALTESC) 并输入 处理中断问题的救命稻草是尝试禁用 APIC 支持, 这是通过在 loader.conf 中加入 hint.apic.0.disabled="1" 完成的。 崩溃 崩溃对于 ACPI 是比较罕见的情况, 如果发现, 将会非常重视并很快修复。 您要做的第一件事是设法隔离出能够重现崩溃 (如果可能的话) 的操作并获取一份调用队战。 请启用 并设置串行控制台 (参见 ) 或配置一个 &man.dump.8; 分区。 您将在 DDB 中通过 得到调用队战。 如果您只能用手抄的方法记录它, 一定要记下头五 (5) 行和最后五 (5) 行。 然后, 尝试通过在启动时禁用 ACPI 来隔离故障。 如果这样做能够正常工作, 请通过设置 的那组数值来隔离具体是哪个 ACPI 子系统的问题。 请参见 &man.acpi.4; 联机手册中给出的那些例子。 系统在休眠或关机之后又启动了 首先请尝试在 &man.loader.conf.5; 中设置 0。 这将让 ACPI 不再在关机过程中禁用一些事件。 基于同样的原因, 一些系统需要把这个值设置为 1 (这是默认值)。 这通常能够修复在休眠或关机时立即再次启动的问题。 其他问题 如果您有 ACPI 的其他问题 (同 docking station 协同工作、 无法检测设备, 等等), 请把描述发给邮件列表; 不过, 这些问题也有可能和 ACPI 中尚未完成的部分有关, 它们可能需要时间才能被实现。 请保持耐心, 并准备测试我们可能会发给您的补丁。 <acronym>ASL</acronym>、<command>acpidump</command>, 以及 <acronym>IASL</acronym> 最常见的问题是 BIOS 制造商提供的不正确 (甚至完全错误的!) 字节代码。 这通常会以类似下面这样的内核消息显示在控制台上: ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\ (Node 0xc3f6d160), AE_NOT_FOUND 通常您可以通过将 BIOS 升级到最新版本来解决这类问题。 绝大多数控制台消息是无害的, 但如果您有其他问题例如电池工作不正常, 则从 AML 开始查找问题将是一条捷径。 字节代码, 或常说的 AML, 是从一种称作 ASL 语言的原代码编译得到的结果。 AMLDSDT 表中。 要得到您系统的 ASL, 需要使用 &man.acpidump.8;。 您应该使用 (显示固定表的内容) 和 (将 AML 反汇编成 ASL) 两个选项。 参考 如何提交调试信息 一节以获得示范用法。 您可以检查的第一件事是重新编译 ASL 来看看是否有错误。 警告通常都可以忽略, 而错误通常会使导致 ACPI 无法正常工作的原因。 要编译您的 ASL, 使用下面的命令: &prompt.root; iasl your.asl 修复 <acronym>ASL</acronym> 我们的长期目标是让每一个人都能够在不需要任何用户干预的情况下使用 ACPI。 然而, 目前我们仍然在开发绕过 BIOS 制造商常见错误的方法。 Microsoft 解释器 (acpi.sysacpiec.sys) 并不会严格地检查是否遵守了标准, 因此许多只在 Windows 中测试 ACPIBIOS 制造商很可能永远不会修正他们的 ASL。 我们希望不断地找出并用文档说明 Microsoft 的解释器到底允许那些不标准的行为, 并在 &os; 进行对应的修改使它能够正常工作而不需要用户修正 ASL。 作为一项临时缓解问题的方法, 并帮助我们确认其行为, 您可以手工修正 ASL。 如果这样能够解决问题, 请把新旧 ASL 的 &man.diff.1; 发给我们, 这样我们就有可能绕过 ACPI-CA 中的错误行为, 从而不再需要您来手工修正。 下面是一些常见的错误信息, 它们的原因, 以及如何修正。 _OS dependencies (_OS 依赖) 某些 AML 假定世界是由不同版本的 Windows 组成的。 您可以让 &os; 声称自己是任意 OS 来看一看是否能够修正问题。 比较简单的办法是设置 =Windows 2001/boot/loader.conf 中, 或使用您在 ASL 中找到的其他字符串。 Missing Return statements (缺少返回语句) 一些方法可能没按照标准要求的那样显式地返回值。 尽管 ACPI-CA 无法处理它, 但 &os; 提供了一个绕过它并允许其暗含地返回值的方法。 您也可以增加一个显式的 Return 语句, 如果您知道那里需要返回一个值的话。 要强制 iasl 编译 ASL, 需要使用 标志。 替换默认的 <acronym>AML</acronym> 在定制 your.asl 之后, 您可以通过下面的命令编译它: &prompt.root; iasl your.asl 可以使用 标志来强制创建 AML, 即使在编译过程中发生了错误。 请注意某些错误 (例如, 缺少 Return 语句) 会自动被解释器忽略掉。 DSDT.amliasl 命令的默认输出文件名。 可以加载它来取代您 BIOS 中存在问题的副本 (它仍然存在于闪存中), 其方法是按下面的说明编辑 /boot/loader.conf acpi_dsdt_load="YES" acpi_dsdt_name="/boot/DSDT.aml" 一定要把您的 DSDT.aml 复制到 /boot 目录中。 从 <acronym>ACPI</acronym> 中获取调试输出信息 ACPI 驱动程序提供了非常灵活的调试机制。 这允许您指定一组子系统, 以及所需要的详细信息。 需要调试的子系统可以按 layers(层) 来指定, 并分为 ACPI-CA 组件 (ACPI_ALL_COMPONENTS) 和 ACPI 硬件支持 (ACPI_ALL_DRIVERS)。 调试输出的详细程度可以通过 level(详细度) 来指定, 其范围是 ACPI_LV_ERROR (只报告错误) 到 ACPI_LV_VERBOSE (显示所有)。 level 是一个位掩码因此可以一次设置多个选项, 中间用空格分开。 实际使用中您应该考虑使用串行控制台来记录输出, 如果它太长以至于冲掉了控制台消息缓冲的话。 不同的层和输出详细度的完整列表可以在 &man.acpi.4; 联机手册中找到。 调试输出默认并不开启。 要起用它, 您需要在内核设置中添加 , 如果您的内核中编入了 ACPI 的话。 您还可以在 /etc/make.conf 中加入 来在全局起用它。 如果它只是模块, 您可以用下面的方法来重新编译 acpi.ko &prompt.root; cd /sys/modules/acpi/acpi && make clean && make ACPI_DEBUG=1 安装 acpi.ko/boot/kernel 并把所需的详细度和层在 loader.conf 中指定。 这个例子讲起用所有 ACPI-CA 组件以及所有 ACPI 硬件驱动 (CPULID, 等等) 的消息。 只输出错误信息, 也就是最低的详细度。 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/install/chapter.sgml b/zh_CN.GB2312/books/handbook/install/chapter.sgml index 5b8cfaab66..cbf911e174 100644 --- a/zh_CN.GB2312/books/handbook/install/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/install/chapter.sgml @@ -1,4751 +1,4751 @@ 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;,会分配给每个主分区及逻辑分区一个驱动器字符 (drive letter),从 C: 开始。 FreeBSD 必须安装在主分区。 FreeBSD 可以在这个分区上面存放系统数据 或是您建立的任何文件。然而,如果您有多个硬盘,您也可以在这些硬盘上(全部 或部分)建立 FreeBSD 分区。在您安装 FreeBSD 的时候,必须要有一个分区可以给 FreeBSD 使用。这个分区可以是尚未规划的分区或是已经划好,但是里面的数据 您都不想保存的分区。 如果您已经用完了您硬盘上的所有分区,那么您必须使用其它操作系统所 提供的工具(如 DOS 或 &windows; 下的 fdisk)来腾出一个分区 给 FreeBSD 使用。 如果您的某个分区有多余的空间,您可以使用它。但是使用前您需要先整理 一下这些分区。 FreeBSD 最小安装需要约 100 MB 的空间,但是这仅是 非常 基本的安装,几乎没有剩下多少空间可以建立您自己的文件。一个较理想的最小安装是 250 MB,不含图形界面;或是 350 MB 以上,包含图形界面。如果您还需要安装 其它的第三方厂商的套件,那么将需要更多的硬盘空间。 您可以使用商业软件,例如 &partitionmagic;(硬盘分区魔术师) 来建立给 FreeBSD 使用的空间。FreeBSD 光盘的 tools 目录包含两个免费的工具也可以完成这个工作:FIPS 以及 PResizer,它们的文档可以在同一目录中找到。FIPSPResizer,和 &partitionmagic; 能够改变 FAT16 以及 FAT32 分区大小— 在 &ms-dos; 方式下使用以及 &windows; ME。这些工具的说明文件可以在同一个目录下面找到 &partitionmagic; 是知道的唯一能改变 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;另外两个 是两个硬盘,分别叫做 DKC0DKC100 硬盘名称中有 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/<arch>/<version>-RELEASE/floppies/. 将 <arch><version> 替换为您使用的计算机体系结构和希望安装的版本号。 例如,用于安装 &i386; 上的 &os; &rel.current;-RELEASE 的文件的地址, 应该是 软盘映像文件的扩展名为 .flp。在 floppies/ 目录下包含了许多不同的映像文件,根据您 要安装的 FreeBSD 版本有不同的映像文件;有时候不同的硬件也需要不同的映像 文件, 在大部分的情形下,您需要两个文件: kern.flpmfsroot.flp。另处不同的系统可能需要额处的硬件 驱动程序。这些驱动程序在 drivers.flp 映像文件里 提供。查看同一目录下的 README.TXT 文件以获得最新 的软盘映像文件信息。 您的 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/fd1B: 驱动器,依此类推。其它的 &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 要按哪个键,常见的是 F2F10Del Alt S 。不论是要按哪个键,请按它进入 BIOS 设置画面。有时您的计算机 可能会显示一个图形画面,典型的做法是按 Esc 将关掉这个图形 画面,以使您能够看到必要的设置信息。 找到设置开机顺序的选项,它的标记为 Boot Order 通常会列出一些设备让您选择,例如:FloppyCDROMFirst 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 不论是从软盘或光盘引导,您都会看到下面这段信息: Hit [Enter] to boot immediately, or any other key for command prompt. Booting [kernel] in 9 seconds... _ 您可以等待10秒或是按 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 跳过。之后就会进入内核 设定菜单。 配置内核 从FreeBSD 5.0 版以后, 用户配置已经不赞成使用新的 &man.device.hints.5; 方法,更多的信息 &man.device.hints.5; 请访问 内核是操作系统最核心的部分。它负责很多工作, 包括存取系统上所有设备,如硬盘、网卡、声卡等等。每一个 FreeBSD 核心支持的设备都有其相对应的驱动程序。这些驱动程序的名称由两个或三个字母级成,譬如: sa 表示 SCSI 存取驱动程序;sio 表示串口 I/O 驱动程序(管理 COM 端口)。 当内核启动的时候,每个驱动程序会检查系统中是否有它所支持的设备。如果找到的话, 这些驱动程序就会配置这些设备的状态以代核心使用。 上述设备的检查我们称做 device probing(设备探测)。 但是很不幸地,这样做并不是完全安全的。因为有些硬件驱动程序没有办法想到共存, 有时找到这个设备却让另一个设备处在不稳定的状态。这是 PC 设计上的限制。 许多早期的称作 ISA 的设备—(相对于 PCI 设备而言)。ISA 设备的规格需要将硬件的某些数据写死在设备上,最具代表性的就是中断号(IRQ)以及 IO 端口号。这些设定值通常是通过改变设备上的 jumpers(跳线), 或是使用由厂商提供的 DOS 工具程序来改变。 这通常是问题的所在,因为这没办法让两个设备共同分享一个 IRQ 或是 IO 端口 地址。 新的设备都按照 PCI 规格设计,这些设备就没有上述限制;它们会参考 BIOS 中的设定然后动态分配 IRQ 及 IO 端口地址。 如果您的系统中有任何 ISA 设备,那么在设置 FreeBSD 驱动程序的时候您就 必须指定这些设备的 IRQ 及 IO 地址。这也是我们在 一节中希望您先准备一份设备清单的用意。 仍然很不幸地,预设给某些设备使用的 IRQ 会跟内存地址互相冲突。这是因为 有些 ISA 设备出厂的设定值就会跟其它的设备冲突。撇开这个不谈,FreeBSD 驱动 程序通常都会根据各制造商设备的出厂设定值来设定,这也是为什么许多设备可 以在 FreeBSD 顺利驱动的原因。 在跑 FreeBSD 的时候根本不会有上冲突的问题,因为当两个设备互相冲突的 时候,其中一个设备将被停用(不论您用的是哪种操作系统)。 通常在第一次安装 FreeBSD 的时候才会有问题,因为内核希望尽是多包含一 些驱动程序,这样才能支持许多不同设备的配置。这意味着在找到的这些设备中 有可能设定值会互相冲突。FreeBSD 在探测系统设备的时候会按照一的顺序,如 果您的某个设备在较后面探测到,但是跟前面找到的设备设定冲突,那么在安装 FreeBSD 的时候,这个设备不一定能正确雇用。 因为如此,当您在安装 FreeBSD 前,可以先看看在系统内核中包含了哪些驱 动程序,如果您没有某些设备,则可以将它们的驱动程序删除或是在稍后您也 可以确认您有的设备的设定值有没有问题。 这听起来好像很复杂,但不全然如此。 显示的是内核能设置的第一个配置菜单。 我们推荐您选择Start kernel configuration in full-screen visual mode 选项, 因为这对新手来说比较容易。
内核配置菜单 &txt.install.userconfig;
内核配置画面 (图) 被分成四个部分: active(可用)区域的展开式选择菜单分为四个群,例如 Storage(储存设备)Network(网络设备)。 每个设备会显示一个对应的说明、由二或三个字母组成的驱动程序名称以及驱动程序 所使用的IRQ和内存地址。另外,如果可用的驱动程序跟另一个可用的驱动程序有冲突, 它们的驱动程序名称之后会显示 CONF 字样。同时栏目标题也会 显示在可用的设备中总共有几个设备有冲突。 在 Inactive(停用)区域的驱动程序仍然保留在内核中,但当内核启动的时候 并不会探测这些设备。这个区域的分组方式跟可用区一样。 第三区(信息显示区)显示的是目前所选择设备的细节项目设置,包括 IRQ 及 IO 端口地址。 第四区告诉您这个画面的操作按键。
配置内核可视化视觉接口 &txt.install.userconfig2;
在这个阶段,您总是会看到有冲突的设备被列出。请不要担心,因为这是正 常的;前面提到在安装的时候所有的设备都会被启用,而其中的某些设备就会跟 其它的设备产生冲突。 现在您必须逐一检查这些设备驱动程序,然后解决冲突的问题。 解决驱动程序冲突 按下 X 键可以将所选择区域的驱动程序完全展开以方便您 检阅。您可以使用方向键在可用设备区前后移动。 显示按下 X 键 后的结果。
展开驱动程序清单
停用任何您没有的设备的驱动程序。要停用一个设备,用方向键移动将该 设备反白然后按下 Del 键,则此设备驱动程序就会被移到 Inactive Drivers(停用设备区) 列表。 如果您不小心将一个设备停用,那么请按 Tab 切换到 Inactive Drivers 区, 选择被停用的设备,然后按下 Enter 键将它移回可用设备区。 请不要移除 sc0。这个驱动程序是控制屏幕 用的,除非您是通过串行线进行安装,否则请不要移除它。 如果您用的是 USB 键盘才可以停用 atkbd0 用一般 的键盘请保留此 atkbd0 设备驱动程序。 如果现在显示没有冲突,那么您可以跳过这一步骤。否则,剩下的冲突还是必 须解决。如果在信息显示区没有看到 allowed conflict(允许冲突), 那么您必须改变这边显示的 IRQ 及内存地址, 必须变更设备 上面的 IRQ 及内存地址。 要改变设备驱动程序的 IRQ 及 IO 端口地址,选择要变更的驱动程序然后 按 Enter 键。之后等光标移到第三区(信息显示区)时候您就 可以理发这些设置。您应该输入之前做硬件清单列表的时候所记录的 IRQ 及 IO 端 口地址。要完成更改请按 Q 键并回到可用设备区。 如果您不确定该设定什么值,那么可以试试看 -1。 有些 FreeBSD 驱动程序在搜寻设备的时候可以安全找出设备的正确设定值;所以这里设置 -1 就是告诉这些驱动程序自行去尝试找出合适的设置。 如果要直接在设备硬件上改变设定值,设定的方法每种设备都不大相同。有些 设备您必须将它从电脑中拆下来然后调整路线或是DIP开关;其它的可能厂商会提供 DOS 工具软盘,里面有程序可以更改这些设定。不论是哪一种方式,您都应该参考设备所附 的使用手册。很明显地,改变这些设定值必须重新开机后才会生效,所以您必须重新进 入 FreeBSD 安装程序。 当所有的冲突都解决了以后,您会看到类似 的画面。
没有冲突的设备驱动程序状态画面
如您所见,可用设备列表变得干净多了,只列出您系统中有的设备。 现在您可以储存所做的改变,然后进到下一个安装步骤。按 Q 键离开设备配置界面,您会看到下面的信息: Save these parameters before exiting? ([Y]es/[N]o/[C]ancel) 回答 Y 保存配置到内存(安装完成后将后保存到磁盘)然后开始 探测设备。在设备探测完毕后,sysinstall 就会启动并且显 示它的主界面。()。
Sysinstall 主界面
查看设备探测的结果 前面屏幕显示的最后几百行字会存在缓冲区中以便您查阅。 要浏览缓冲区,您可以按下 Scroll Lock 键,这会开启画面的 卷动功能。然后您就可以使用方向键或 PageUpPageDown 键来上下翻阅。再按一次 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键。
选择说明文件菜单
这将会进入说明文件菜单。
Sysinstall 说明文件菜单
阅读这些说明文件很重要。 要阅读一篇文章,请用方向键选取要阅读的文章然后按 Enter 键。 阅读中再按一下 Enter 就会回到说明文件画面。 若要回到主菜单,用方向键选择 Exit 然后按下 Enter 键。
选择键盘对应(Keymap)菜单 如果要改变键盘按键的对应方式,请在主菜单选取 Keymap 然后按 Enter 键。一般情况下不改变引项,除非您使用了非标准键盘或非 美国键盘。
Sysinstall 主菜单
您可以使用上下键移动到您想使用的键盘对应方式,然后按下 Space 键以选取它;再按 Space 键可以取消选取。当您完成后,请选择 &gui.ok; 然后按 Enter 键。 这一屏幕只显示出部分列表。选择 &gui.cancel; 按 Tab 键将使用 默认的键盘对应,并返回到主菜单
Sysinstall 键盘对应菜单
安装选项设置画面 选择 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 硬盘开机。许多人发 现最简单而便宜备份系统的方式就是再去买一块一模一样的硬盘,然后定期将数据从第 一块硬盘复制到第二个硬盘,使用 GhostXCOPY。所以,当第一个硬盘死了,或者是被病毒破坏, 或者有坏轨道,他们可以调整 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 也从此了解o的重要… 虽然我们这里的例子使用 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 硬盘的情形,这两个硬盘分别为 ad0ad2
选择要分区的硬盘
您可能正在奇怪,为什么 ad1 没有列出来? 为什么遗失了呢? 试想,如果您有两个 IDE 硬盘,一个是在第一个 Primary master,一个是 Secondary master,这样会发生什么事呢?如果 FreeBSD 依照找到的顺序来为他们 命名,如 ad0ad1 那么就不会有什么问题。 但是,现在问题来了。如果您现在想在 primary slave 加装第三个硬盘, 那么这个硬盘的名称就会是 ad1,之前的 ad1 就会变成ad2。 这会造成什么问题呢?因为设备的名称(如ad1s1a) 是用来寻找文件系统的,因此您可能会发现,突然,您有些文件系统从此无法正确 地显示出来,必须修改 FreeBSD 配置文件(译注:/etc/fstab)才可以正确显示。 为了解决这些问题,在配置内核的时候可以叫 FreeBSD 直接用 IDE 设备所 在的位置来命名,而不是要据的到的顺序。使用这种方式的话,在 secondary master 的 IDE 设备就 永远是 ad2, 即使您的系统中没有ad0ad1 也不受影响。 此为 FreeBSD 内核的默认值,这也是为什么上面的画面只显示 ad0ad2的原因。 画面上这台机器的两颗硬盘是装在 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 键继续安装过程。
使用<application>Disklabel</application> 创建分区 您现在必须在刚刚建立好的分区中规划一些分区。请记住,每个分区代号是 ah, 并且分区 partitions 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键使用此功能。您会看到类似 的画面。根据您硬盘的大小,自动分配所配置 的大小不一定合适。但是没有关系,您并不一定要使用预设的大小。 从 FreeBSD 4.5开始,自动配置会给/tmp 目录一个独立分区,而不是附属在 / 之下。这样可以 避免将一些临时文件放到根目录中(译注:可能会用完根目录空间)。
Sysinstall Disklabel 编辑器-使用自动配置
如果要删除自动配置的分区,然后想自行建立,您可以使用方向键移到第一 个分区,然后按D 键删除它。重复此动作直到删除所有自动配置 的分区。 要建立第一个分区(a, 挂接点为/ — 根目录),先确定画现上方的硬盘slice有被选取(反蓝),然后按下 C 键。接着会出现一个对话框询问您要配置的分区大小(如 ) 您可以输入要的block数量或是(译注:通常会)输入想使用的大小,然后后面另上 M 表示MB、G GB或是 C 表示(柱面)。 从 FreeBSD 5.X版本开始,用户可以:选择 Custom Newfs 选项来使用UFS2 (Z) ,使用Auto Defaults 来创建 labels ,并使用 Custom Newfs选项来修改它们。 或是在创建时加上规则。如果您使用了Custom Newfs 标记不要忘了添加标记来升级它们。
根目录使用空间
显示在对话框中的默认大小是使用整个分区,您可以用 Backspace键删除这些数字然后按照上述方式输入您想要的 大小,如64M), 然后按&gui.ok;。
编辑要分区大小
输入完大小后接着部您要建立的分区是文件系统还是交换空间,如 所示。第一个分区是文件系统,所以 确认选择 FS后按Enter键。
选择根分区类型
最后,因为您要建立的是一个文件系统,所以必须告诉 Disklabel 这个文件系统要挂接在什么地方,如 所示。根文件系统的挂接点 /, 所以请输入 /,然后按 Enter键。
选择根挂接点
刚刚制作好的分区会显示在画面上。您应该重复上述的动作以建立其它的 分区。当建立交换空间的时候,系统不会问您要将它挂接在哪里,因为交换空间是不用 挂在系统上的。当您在建立最后一个分区/usr的时候,您可以 直接使用默认的大小,即所有此分区剩余的空间。 您最终的 FreeBSD DiskLabel 编辑器画面会类似 , 实际数字按您的选择而有所不同。按下 Q 键完成分区的建立。
Sysinstall Disklabel 编辑器
选择要安装的软件包 选择要安装的软件包 安装哪些软件包在很大程度上取决于系统将被用来做什么,以及有多少可用的磁盘空间。 内建的选项包括了运行所需要的最小系统,到把所有软件包全都装上的常用配置。 &unix; 或 FreeBSD 新手通常直接选择一个设定好的软件包就可以了, 而有经验的使用者则可以考虑自己订制安装哪些软件包。 按下 F1 可以看到有关软件包的更多选项信息, 以及它们都包含了哪些软件,之后,可以按 Enter 回到软件包选择画面。 如果您想要使用图形界面,您必须选择软件包名称开头是 X 的软件包。 &xfree86; 的配置以及选择其默认桌面管理 员必须等到安装完毕后再来做。 &xfree86; 的版本依赖于您正在安装的FreeBSD 的版本。如果您安装的是FreeBSD 4.6以前的版本,那么默认的情况下安装 &xfree86; 3.X 版本。如果您安装的 FreeBSD 4.6 以后的版本,那么默认情况下安装&xfree86; 4.X 版本。 您应该到&xfree86; 网站看看您的显卡有没有被您安装的FreeBSD所支持。您也可以选择不安装 图形界面,等安装完成后,再通过ports collection来安装和配置适合版本 的&xfree86; 如果您以后要自己编译内核,那么请您选择包含原始代码的软件包。如果您 想知道为什么要建立自订的内核或是如何建立自订的内核,请参考 很明显,安装容量最大的当然就是全部安装啦。如果您的硬盘够大,您 可以选择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 后会离开安装程序回到主安装界面。从主安装界面可以退出安装程序。 安装后的配置 如果安装成功,您将可以对一些基本的项目作安装后初步的配置。任何一项 配置在重新开机前都可以重新配置,系统会使用最后一次的配置值。重新开机后 如果再做配置,可以执行/stand/sysinstall 命令然后选择 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)。默认的子网掩码为 (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; 将允许您添加网络服务 (将相应网络服务每行开头的#除掉即呆。
编辑 <filename>inetd.conf</filename>配置文件
在加入您想启用的服务后,按下 Esc键会出现一个 对话框可以让您离开以及保存修改。
匿名 FTP 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 文件。
编辑 <filename>exports</filename>文件
按照指示加入真实输出的文件目录或是稍后用您喜爱的编辑器自行编辑。 请记下画面下方显示的文件名称及位置。 按下 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 为 极度或高度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 退回到系统安装完成后的配置画面。
配置额外的网络服务 配置网络服务总是让那些新手敬畏,因为他们缺乏在这个领域应有的基础知识。 网络,包括因特网有许多关于现代操作系统包括 &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 选项用来设置默认的挂接位置,这里使用的是 /.amd_mnt目录。 指定默认的 日志 文件;但是,当 syslogd 被指定用来接收所有的日志时,那么它们会被送到 系统日志程序。/host 被用来挂接远程 主机输出的一个文件系统,例子中/net 目录被用来挂接从IP输出的一个文件系统。 /etc/amd.map 文件定义了 AMD 的默认 输出选项。 Anon FTP 允许匿名 FTP 访问。 选中这个选项,可以使这台机器成为一台匿名 FTP 服务器。 要注意启用这个选项的安全风险。其它的菜单将说明一些安全问题和更深入的配置。 Gateway 配置菜单可以使本机器成为一台以前我们提到过 的网关。如果您在安装过程中偶尔选中了它,也可以在这里选中这个选项来取消。 Inetd 选项用来配置或完全禁止我们在上面讨论的 &man.inetd.8; 守护程序。 Mail 可以用来配置系统默认的 MTA 或邮件传输代理。选择这个选项将了出现下面的菜单:
选择默认的 MTA
这里给您提供了一个安装默认MTA 的机会。 MTA 用来投递本系统上用户邮件到因特网去。 选择 Sendmail 将会安装 &os;默认的 流行的的 sendmail 服务程序。 Sendmail local 选项用来设置sendmail 默认的MTA,也可以禁止它从Internet接收邮件的能力。 还有其它的一些选项如: PostfixExim 都类似于 Sendmail的角色。它们两者也可以投递邮件; 有些用户更喜欢选择使用SendmailMTA二者之一。 选择 MTA或不选择它之后,网络配置菜单的下一 个选项是 NFS client 客房端程序。 NFS client 客房端可以使系统通过 NFS 与服务器进行通信。 NFS 服务器通过NFS 协议可以使其它在网络上的机器来访问自己的文件系统。如果这台机器要作为一台 独立的服务器,这个选项可以保留不选。下面可能还有更多的配置,关于客户端和 服务器的配置请参阅 一节。 接下来的 NFS 服务器选项,可以允许您把系统设备成 为一台NFS 服务器。这需要更多的信息来启动远程过程调 用( RPC)服务。 RPC用来连接调 用两台机器上的程序。 下一项是 Ntpdate 选项,处理时间同步。当选择它后, 会出现一个像下面所似的菜单:
Ntpdate 配置
从这个菜单选择一个离您最近的服务器。在您连接这台服务器时,除去 连接时的反应时间,时间同步最精确的服务器。 下一个选项是 PCNFSD 。这个选项将从安装包中 安装net/pcnfsd 软件。这个程序 能够为不能提供它们自己,例如微软的 &ms-dos; 操作系统提供 NFS 的认证服务。 滚屏到下一页看一下其它选项:
网络配置之下层配置
&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程序的参数。 默认的是 参数。 接下来是 Rwhod 选项,选中它会启用 &man.rwhod.8; 程序 在系统初时化的时候。 rwhod程序通过网络周期性的广播系统 信息或以客户的身份来收集这些信息。更多的信息可以查看 &man.ruptime.1; 和&man.rwho.1; 手册页。 倒数第二个选项是&man.sshd.8; 程序。它可以通过使用 OpenSSH来提供安全的shell服务,我们推荐通过 使用它来使用 telnetFTP 服务。 sshd服务通过使用加密技术来创建从一台机器到另一台机 器的安全连接。 最后有一个 TCP 扩展选项。这可以用来扩展在 RFC 1323 和RFC 1644 里定义的TCP 功能。当许多主机以高速连接本机时,可 能会引起某些连接被丢弃。我们不推荐使用这个选项,但是当使用独立的主机 时可以从它上面得到一些好处。 现在您已经配置完成了网络服务,您可以滚动屏幕到顶部选择 Exit 项,退出进入下一个配置部分。
配置 X Server 为了使用图形化用户界面,例如KDE, GNOME,或其它窗口管理程序,您必须 配置 X server 。 为了以非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; 并且等到您有这些信息后再执行 /stand/sysinstall程序,选择 Configure 下的 XFree86来配置。这时如果配置X server 不正确的话系统会出现锁死。建议在安装完毕后再配置X server。 如果您有显卡和显示器的信息,请选择 &gui.yes; 并按 Enter 来配置 X-server。
选择配置方法菜单
您可以通过许多方法来配置 X server。在认真读了所有的说明后, 请使用方向键来选择一种配置方式,并按Enter。 键确认。 xf86cfgxf86cfg -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/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 -textmodexf86config 命令行配置程序来以 root 用户的身份进行配置。配置 &xfree86; 的另外一种方法 描述在 。如果您选择不配置&xfree86; 那么下一个菜单将让您选择要安装的软件包。 默认情况下可以使用组合键 CtrlAlt Backspace,在发生错误或在硬件损坏前退出 设置屏幕。 默认的显示模式可以使用X系统下的 CtrlAlt+ CtrlAlt- 来改变。 一旦有了可以运行的 &xfree86;, 就可以使用 xvidtune 来调整显示的高度和宽度以及显示器的中心位置。 一些不适当的配置可能会损坏您的设备。如果在使用它们前存在疑虑,请不要 安装它们。可以使用监视器的控制工具来调整X窗口的显示。与文本显示模式不同 它更容易损坏设备。 在调整这些参数前,请阅读 &man.xvidtune.1; 手册。 下面是一个配置 &xfree86; 的成功例子,它选择了 使用默认的桌面。
选择默认的桌面 有许多窗口管理器可以使用。它们从基本的桌面环境到全部的桌面应用,是 一个大型的软件集。一些人可能只希望使用一些占用磁盘空间少,内存低的窗口 管理器;而另外一些人则更倾向于使用有便多特性的桌面环境。选择使用那种桌 面的最好的方法就是尝试着试用一些不同的桌面环境。这些桌面都可以在安装 完成后通过ports收集或包管理器来进行安装。 您可以选择一个流行的桌面配置成为默认的桌面,可以使您在安装完 成后立刻启动它。
选择默认桌面
使用箭头选择一个桌面,然后键入Enter键。选择的桌面将被 安装。
安装软件包 这些软件包已经被预编译成二进制程序了,安装软件有一个很简单的方法。 为了说明问题,这里给您做了一个怎样来安装软件包的范例,额外的软件包 也可以在这时安装。您也可以在安装结束后使用 /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 中修改。 bash shell 是先前默认安装的shell。 不要使用一个不存在的或您不能登陆的shell。最通用的shell是使用 BSD-world 的 C shell,可以通过指定/bin/tcsh来修改。 用户也可以被添加到 wheel 组中成了一个超级用户, 从而拥有 root权限。 当您感觉满意时,键入 &gui.ok; 键,用户和组管理菜单将会重新出现。
退出用户和组管理
因特殊需要的组也可以在此时进行添加,也可以在安装完成后使用 /stand/sysinstall 来完成。 当您完成添加用户的时候,选择Exit 然后键入Enter 继续下面的安装。
设置 <username>root</username> 密码 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 : 密码成功键入后,安装将继续。 退出安装 如果您需要配置额外的网络设备或要做其它的配置,您可以在这时或以后 通过 /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和使用 PgUpPgDn来查看信息,再键入 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;。/para> 当您遇到错误时,应该怎么做? 由于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; 分区一分为二,保留原 原有的分区,让您安装到空出来的分区上。您首先要用 &windows;的 Disk DefragmenterNorton Disk Tools来对 &ms-dos; 分区进行碎片整理。然后, 就可以重新启动把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.msdos.8; 命令 (在 &os; 5.X版本,相应的命令为 &man.mount.msdosfs.8;) 最常使用的是: &prompt.root; mount_msdos /dev/ad0s1 /mnt 在此例子中, &ms-dos; 文件系统位于主硬盘的第一个分区。您的情况可能与引不同, 查看命令 dmesgmount 的输出。它们应该 可以让您得到足够的分区信息。 &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 disk 在这里指 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-arch/version 或最近的镜像站点下载。选择合适的 arch version 目录中包含下面一些映像文件: FreeBSD ISO映像文件名和含意 文件名 包含内容 version-mini.iso 您安装 FreeBSD所需要的最基本的东西。 version-disc1.iso 您安装 FreeBSD所需要的最基本的东西,和一些附加的第三方厂商的试用版软件包 version-disc2.iso live filesystem,它是用来在 sysinstall程序里用来 修复系统 用的。里面包含 FreeBSD CVS 树的一个拷贝,还有许多附加的第三方厂商的试用 版软件包。
必须 下载一个 mini-ISO 映像盘,或是disc one映像盘。 不要都下载下来,因为disc one 映像盘的内容包括了所有在 mini ISO映像盘中的内容。 如果您的网络费用很低,您可以使用 mini ISO 映像。它可以让您完成安装 FreeBSD的任务,如果您还想安装其它的软件包,可以下载它们并使用 ports/packages 系统来安装。(详细请看 如果您想适当的在安装介质上安装一些第三方的软件包,那么您可以使用 disc one映像盘。 其它的映像盘也是很有用的,但不是必须的,尤其是在您有高速的网络连接时。
刻录 CDs 您必须把这些映像文件刻录成光盘。如果您在其它的FreeBSD系统上完成 此项工作,请看 得到更多的信息,(特别是 如果您在其它的系统平台上执行,您需要相应的刻录软件。映像文件使用 的是标准的ISO格式,必须被您的刻录软件所支持。
使用FreeBSD磁盘作为本地端FTP站点 installation network FTP FreeBSD磁盘的配置跟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服务公开给外面的 网际网络(非本地用户),您的电脑必须承担被侵入或其它的风险。我们强烈建议您 要有完善的安全机制才这样做。 创建安装软盘 installation floppies 如果您从软盘安装(我们推荐那样做),或者是由于 不支持硬件或者更简单的理由是因为您坚持要使用软盘安装。您必须准备几张软盘。 至少这些软盘必须是 1.44 MB 或 1.2 MB 的,用来容纳所有在 bin (二进制软件包)目录下的文件。如果您在DOS操作系统 下准备就 MUST使用 &ms-dos;下的 FORMAT 命令来格式化软盘。如果您使用的是 &windows;操作系统,在文件浏览器中用右键 单击 A: 驱动器,并选择 Format 不要 指望厂家的预先格式化!最好还是亲自进行格式化。 过去用户报告的很多问题都是由于不正确地使用格式化设备所造成的,所以我们需要在这 儿着重提一下。 如果您在另外一台FreeBSD的机器上做了启动盘的话,进行格式化是一个不 错的主意。虽然您不需要把每张盘都做成DOS文件系统。您也可以使用 disklabelnewfs 命令来创建一个UFS文件系统,具体操作按下面的顺序进行: &prompt.root; fdformat -f 1440 fd0.1440 &prompt.root; disklabel -w -r fd0.1440 floppy3 &prompt.root; newfs -t 2 -u 18 -l 1 -i 65536 /dev/fd0 如果使用 5.25"软盘的话,需要使用 fd0.1200floppy5 来格式化 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/目录中找到。 在 4.X 和其它老版本的 &os; the base发行包被叫做 bin. 如果您使用这些版本的话,请调整上例中的命令和URLS. 对很多发行包来说,如果您希望从 &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 在您安装的时候,您要确定留有足够的空间给临时目录(允许您选择) 来容纳磁带安装时 全部 的内容。由于不是随机访问 磁带的,所以这种安装方法需要很多临时空间。 开始安装时,在从软盘启动before,磁带机 必须已经放在驱动设备中。否则,安装过程中可能会找不到它。 通过网络安装 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接口的以太网,在启动计算机 before, 确信已经把它插好了。目前,FreeBSD还不支持PCMCIA的热插拔。 通过网络安装,您可能需要知道IP地址,地址掩码,还有机器的字。如果您 通过PPP进行安装,就不需要静态的IP地址,IP地址会由ISP给您自动指派。您的系统 管理员会告诉您通过网络安装的细节。如果您通过主机名而不是IP地址来访问其它主 机,需要有一个域名服务器或一个网关地址(如果您使用PPP进行安装,那它就您的 的ISP的IP地址)。如果您要通过一个HTTP的代理服务器进行FTP安装,需要一个代理 服务器地址。如果您不知道这些,在安装 before可以询问 您的系统管理员或您的ISP服务商。 通过NFS安装之前 installation network NFS NFS安装方式是非常方便的。只需要简单地将FreeBSD文件拷贝到一台服务器上, 然后在安装时选择NFS介质。 如果这个服务器要特权端口才能支持(如SUN的工作站), 您需要在安装前在Options菜单中设置 如果您的一台网卡比较糟糕,速度很慢,则应考虑的选项。 为了达到NFS安装的目的,这个服务器必须支持 subdir 加载。例如,如果您的 FreeBSD &rel.current; 目录存在: ziggy:/usr/archive/stuff/FreeBSD,然后 ziggy 将必须允许直接挂上 /usr/archive/stuff/FreeBSD,而不仅仅是 /usr/usr/archive/stuff 在 FreeBSD的 /etc/exports 配置文件中,是由 选项来控制的。其它 NFS服务器也许有不同的方式。 如果您从服务器得到permission denied 这个信息,可能是因为您没有正确的启用它。
diff --git a/zh_CN.GB2312/books/handbook/introduction/chapter.sgml b/zh_CN.GB2312/books/handbook/introduction/chapter.sgml index e9cc4ad4c3..9f0a653650 100644 --- a/zh_CN.GB2312/books/handbook/introduction/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/introduction/chapter.sgml @@ -1,855 +1,854 @@ Jim Mock Restructured, reorganized, and parts rewritten by 介绍 概述 非常感谢您对 FreeBSD 感兴趣! 下面的章节覆盖了 FreeBSD 项目的各个方面, 比如它的历史、目标、开发模式,等等。 阅读完这章,您将了解: FreeBSD 与其它计算机操作系统的关系。 FreeBSD 项目的历史。 FreeBSD 项目的目标。 FreeBSD 开放源代码开发模式的基础。 当然还有:FreeBSD 这个名称的由来。 欢迎来到 FreeBSD 的世界! 4.4BSD-Lite FreeBSD 是一个支持 Intel (x86 和 &itanium;),AMD64,Alpha,Sun &ultrasparc; 计算机的基于 4.4BSD-Lite 的操作系统。 到其他体系结构的移植也在进行中。 您也可以阅读 FreeBSD 的历史, 或者最新的发行版本。 如果您有意捐助(代码, 硬件,不记名捐款),请看为 FreeBSD 做贡献这篇文章。 FreeBSD 能做些什么? FreeBSD有许多非凡的特性。其中一些是: 抢占式多任务 抢占式多任务与动态优先级调整确保在应用程序和用户之间平滑公正的分享计算机资源, 即使工作在最大的负载下。 多用户设备 多用户设备 使得许多用户能够同时使用同一 FreeBSD 系统做各种事情。 比如, 像打印机和磁带驱动器这样的系统外设可以完全的在系统或者网络上的所有用户之间共享, 可以对用户或者用户组进行个别的资源限制, 以保护临界系统资源不被滥用。 TCP/IP 网络 符合业界标准的强大 TCP/IP 网络 支持, 例如 SLIP,PPP,NFS,DHCP,还有 NIS。 这意味着您的 FreeBSD 主机可以很容易的和其他系统互操作, 也可以作为企业的服务器,提供重要的功能, 比如 NFS(远程文件访问)以及 email 服务, 或将您的组织接入 Internet 并提供 WWW,FTP,路由和防火墙(安全)服务。 内存保护 内存保护确保应用程序(或者用户)不会相互干扰。 一个应用程序崩溃不会以任何方式影响其他程序。 FreeBSD 是一个 32 位操作系统 (在 Alpha,&itanium;,AMD64,和 &ultrasparc; 上是64 位), 并且从开始就是如此设计的。 X Window 系统 XFree86 业界标准的 X Window 系统 (X11R6)为便宜的常见 VGA 显示卡和监视器提供了一个图形化的用户界面(GUI), 并且完全开放代码。 二进制代码兼容性 Linux 二进制代码兼容性 SCO 二进制代码兼容性 SVR4 二进制代码兼容性 BSD/OS 二进制代码兼容性 NetBSD 和许多 Linux,SCO,SVR4,BSDI 和 NetBSD 程序的二进制代码兼容性 数以千计的 ready-to-run 应用程序可以从 FreeBSD portspackages collection 中找到。您可以顺利的从这里找到, 何用搜索网络? 可以在 Internet 上找到成千上万其它 easy-to-port 的应用程序。 FreeBSD 和大多数流行的商业 &unix; 代码级兼容, 因此大多数应用程序不需要或者只要很少的改动就可以编译。 虚拟内存 页式请求虚拟内存集成的 VM/buffer 缓存设计有效的满足了应用程序巨大的内存需求并依然保持其他用户的交互式响应。 对称多处理器(SMP) SMP 提供对多处理器的支持。 编译器 C 编译器 C++ 编译器 FORTRAN CC++Fortran,和 Perl 开发工具的完整扩充。 许多附加的用于高级研究和开发的程序语言也可以在 ports 和 packages collection 中找到。 源代码 完整的系统源代码意味着您对您环境的最大程度的控制。 当您拥有了一个真正的开放系统时, 为什么还要受困于私有的解决方案, 任商业公司摆布呢? 丰富的在线文档 不仅如此! 4.4BSD-Lite 计算机系统研究组(CSRG) U.C. Berkeley FreeBSD 基于加州大学伯克利分校计算机系统研究组(CSRG)发布的 4.4BSD-Lite, 继承了 BSD 系统开发的优良传统。 除了 CSRG 优秀的工作之外, FreeBSD 项目花费了非常多的时间来优化调整系统, 使其在真实负载情况下拥有最好的性能和可靠性。 像许多商业巨人努力的增进 PC 操作系统的特性、性能和可靠性一样, FreeBSD 现在 就已经可以提供了! FreeBSD 可以提供的应用真的仅局限于您的想象力。 从软件开发到工厂自动化,从存货控制到遥远的人造卫星天线方位控制, 如果商业的 &unix; 产品可以做到,那么就非常有可能您也可以用 FreeBSD 来做! FreeBSD 也极大地受益于全世界的研究中心和大学开发的数以千计的高质量的应用程序, 这些程序通常只需要很少的花费甚至免费。 商业应用程序也是可用的,并且每天都有大量的出现。 因为 FreeBSD 自身的源代码是完全公开的, 所以对于特定的应用程序或项目,可以对系统进行最大限度的定制。 这对于大多数主流的商业生产商的操作系统来说几乎是不可能的。 以下是当前人们应用 FreeBSD 的某些程序的例子: Internet 服务:FreeBSD 内建的强大的 TCP/IP 网络让它成为各种 Internet 服务的理想平台,比如: FTP 服务器 FTP 服务器 web 服务器 World Wide Web 服务器(标准的或者安全的 [SSL]) 防火墙 IP 伪装 防火墙和 NAT(IP 伪装) 网关 电子邮件 电子邮件服务器 USENET USENET 新闻组和电子布告栏系统 还有许多... 使用 FreeBSD,您可以容易的从便宜的 386 类 PC 起步,并随着您的企业成长,一路升级到带有 RAID 存储的四路 Xeon 服务器。 教育:您是一名计算机科学或者相关工程领域的学生吗? 学习操作系统,计算机体系结构和网络没有比在 FreeBSD 可提供的体验下动手实践更好的办法了。许多可自由使用的 CAD、数学和图形设计包也使它对于那些主要兴趣是在计算机上完成其他工作的人非常有帮助。 研究:有完整的系统源代码, FreeBSD 对于操作系统研究以及其他计算机科学分支都是一个极好的平台。 FreeBSD 可自由获得的本性, 同样可以使处在不同地方的开发团队在开放的论坛上讨论问题、 交流想法与合作开发成为可能, 且不必担心特别的版权协定或者限制。 路由 DNS 服务器 网络:需要一个新的路由器? 一台名称服务器(DNS)?一个隔离您的内部网络的防火墙? FreeBSD 可以容易的把丢弃在角落不用的 386 或者 486 PC 变成一台完善的带包过滤能力的高级路由器。 X Window 系统 XFree86 X Window 系统 Accelerated-X X Window 工作站:FreeBSD 是一个便宜的 X 终端解决方案的好的选择, 不管是使用可免费获得的 &xfree86; 服务器还是 Xi Graphics 提供的一个优秀的商业服务器。 不像 X 终端,如果需要的话 FreeBSD 允许许多程序在本地运行, 从而减少中央服务器的负担。 FreeBSD 甚至可以无盘启动, 让个人工作站更便宜而且容易管理。 GNU Compiler Collection 软件开发: 基本的 FreeBSD 系统带有包括著名的 GNU C/C++ 编译器和调试工具在内的一整套开发工具。 FreeBSD 可以通过 CDROM、DVD, 以及匿名 FTP 以源代码和二进制方式获得。请查看 了解获取 FreeBSD 的更多细节。 谁在使用 FreeBSD? 用户 运行 FreeBSD 的大型站点 FreeBSD 用来支持 Internet 上一些最大的站点, 包括: Yahoo! Yahoo! Apache Apache Blue Mountain Arts Blue Mountain Arts Pair Networks Pair Networks Sony Japan Sony Japan Netcraft Netcraft Weathernews Weathernews Supervalu Supervalu TELEHOUSE America TELEHOUSE America Sophos Anti-Virus Sophos Anti-Virus JMA Wired JMA Wired 等等许多。 关于 FreeBSD 项目 下面的章节提供了项目的一些背景信息, 包括简要的历史、项目目标、以及项目开发模式。 Jordan Hubbard Contributed by FreeBSD 的简要历史 386BSD Patchkit Hubbard, Jordan Williams, Nate Grimes, Rod FreeBSD 项目 历史 FreeBSD 项目起源于 1993 年早期, 部分作为 Unofficial 386BSD Patchkit 的副产物,patchkit 的最后 3 个协调维护人是:Nate Williams,Rod Grimes 和我。 386BSD 我们最初的目标是做出一份 386BSD 的测试版以修正一些 Patchkit 机制无法解决的错误(bug)。 您们中的一些人可能还记得早期的项目名称叫做 386BSD 0.5 或者 386BSD Interim 就是这个原因。 Jolitz, Bill 386BSD 是 Bill Jolitz 的操作系统, 一直到忍受了激烈的将近一年的忽视。 由于 Patchkit 的急剧膨胀, 使得很难每天都能够消化吸收, 我们一致同意应该做些事情并决定通过提供这个临时的 cleanup 版本来帮助 Bill。 然而,Bill 却在事先没有指出这个项目应该如何开展下去的情况下, 突然决定退出这个项目,最终这个计划只好被迫停止。 Greenman, David Walnut Creek CDROM 没过多久,我们认为在没有 Bill 的支持下,项目仍有保留的价值, 因此,我们采用了 David Greenman 的意见,给其命名为 FreeBSD。在和当时的几个用户商量后, 我们提出了最初的目标, 而这件事明朗化后, 这个项目就走上了正轨,甚至可能成为现实。 为了增加 FreeBSD 的发行渠道,我抱着试试看的心态, 联系了光盘商 Walnut Creek CDROM, 以便那些上网不方便的用户得到 FreeBSD。 Walnut Creek CDROM 不仅支持发行 FreeBSD 光盘版的想法, 还为这个计划提供了所需的计算机和高速网络接入。 在那时,没有 Walnut Creek CDROM 对一个完全未知的项目的空前信任, FreeBSD 不太可能像它今天这样,影响如此深远,发展如此快速。 4.3BSD-Lite Net/2 U.C. Berkeley 386BSD Free Software Foundation 第一个 CDROM (以及在整个互连网范围内发行的) 发行版本是 FreeBSD 1.0,于 1993 年 10 月发布。这个版本基于 U.C. Berkeley 的 4.3BSD-Lite(Net/2)磁带, 也有许多组件是 386BSD 和自由软件基金会提供的。 对于第一次发行,这算是相当成功了。 在 1994 年 5 月,我们发布了更加成功的 FreeBSD 1.1 版。 Novell U.C. Berkeley Net/2 AT&T 然而此后不久,发生了一些意外的情况。 Novell 和 U.C. Berkeley 决定就 Berkeley Net/2 磁带的归属权问题打的那场马拉松式的官司达成和解。 判决的结果是, U.C. Berkeley 承认 Net/2 很大一部分代码是侵占来的 且这些代码归 Novell 公司所拥有。这些代码是 Novell 不久前从 AT&T 买来的。 Berkeley 得到了来自 Novell 的 祝福: 4.4BSD-Lite 发行后,将不认为是侵权, 且要求现存的 Net/2 的用户更换新版。 这也包括 FreeBSD,我们的项目被要求在 1994 年 6 月底停止发行基于 Net/2 的产品。在此协议允许的时间内, 本项目被允许发行最后一版,也就是 FreeBSD 1.1.5.1。 于是 FreeBSD 开始艰苦的从全新的而且不完整的 4.4BSD-Lite 中重新整合自己。Lite 版本是不完整的, 因为 Berkeley 的 CSRG 已经删除了大量的构建可启动运行的系统所需要的代码 (因为各种各样的版权问题),事实上 4.4 的 Intel port 是非常不完整的。 直到 1994 年 11 月项目才完成这个转换,这个时候才把 FreeBSD 2.0 通过网络和 CDROM(在 12 月)发布出来。 尽管系统很多地方还很粗糙,这个版本还是取得了重大的成功, 接下来在 1995 年 6 月发布了更强大和容易安装的 FreeBSD 2.0.5 版本。 我们于 1996 年 8 月发布了 FreeBSD 2.1.5 版本, 它在 ISP 和商业团体中非常流行。 随后, 2.1-STABLE 分支的另一个版本应运而生,它就是 FreeBSD 2.1.7.1,在 1997 年 2 月发布并停止了 2.1-STABLE 的主流开发。现在,它处于维护状态, 仅仅提供安全性的增强和其他严重的错误修补的维护(RELENG_2_1_0)。 FreeBSD 2.2 版作为 RELENG_2_2 分支,于 1996 年 11 月从开发主线 (-CURRENT)分出来。 它的第一个完整版(2.2.1)于 1997 年 4 月发布出来。 97 年夏秋之间,顺着 2.2 分支的更进一步的版本在开发。 其最后一版(2.2.8)于 1998 年 11 月发布出来。 第一个官方的 3.0 版本出现在 1998 年 10 月, 意味着 2.2 分支结束的开始。 1999 年 1 月 20 日又出现了新的分支,就是 4.0-CURRENT 和 3.X-STABLE 分支。从 3.X-STABLE 起,3.1 在 1999 年 2 月 15 日发行,3.2 在1999 年 5 月 15 日,3.3 在 1999 年 9 月 16 日,3.4 在 1999 年 12 月 20 日,3.5 在 2000 年 6 月 24 日,接下来几天后发布了很少的修补升级至 3.5.1,加入了对 Kerberos 安全性方面的修补。 这是 3.X 分支最后一个发行版本。 2000 年 3 月 13 日,有了另一个分支, 看到了 4.X-STABLE 分支的曙光,现在,采用了 current -stable 分支方法。从那时迄今为止已经有了几个发行版本: 4.0-RELEASE 在 2000 年 3 月发布, 最新的 &rel2.current;-RELEASE 在 &rel2.current.date; 发布。沿着 4.X-stable(RELENG_4)分支还会有几个后续版本,直到 2003 年。 期待已久的 5.0-RELEASE 在 2003 年 1 月 19 日发布。 它是将近三年工作的顶点,这个版本开始了 FreeBSD 对高级多处理器和应用程序线程的支持,并加入了对 &ultrasparc; 和 ia64 平台的支持。这个版本接下来就是 2003 年 6 月发布的 5.1 版。除了许多新的特性,5.X 版本也包含了许多正在进行的系统结构方面的主要进展。然而,随着这些先进的机制, 带给系统极大数量的新的未经过广泛测试的代码。 因为这个原因,5.X 版本被看作是新技术展示版本,而 4.X 系列则作为生产版本。5.X 会被及时的公布为 stable 并开始着手下一个开发分支,6.0-CURRENT。 现在,对 5.X-CURRENT(trunk)分支的长期开发计划仍在继续着。 5.x 的 SNAPshot 版本 CDROM(当然,还有网络)一直作为工作进程在 the snapshot server 上制作。 Jordan Hubbard Contributed by FreeBSD 项目目标 FreeBSD Project goals - FreeBSD 项目的目标是为那些不管出于什么目的, - 不需要有任何限制的人提供软件。 - 我们中的许多人对代码(和计划)都有非常大的投入和研究, - 当然也不介意一些资金上的补偿,不管是现在或者将来。 - 但是,我们确定不准备坚持这么做。 - 我们认为我们的首要使命是为任何人和新来者提供代码, - 不管他们出于什么目的。以便代码能得到最大限度的利用, - 带给使用者最大的好处。 - 我认为这是自由软件和我们的狂热支持者的一个最基本的目标。 + FreeBSD 项目的目标是无附加条件地提供能够用于任何目的的软件。 + 我们中的许多人对代码 (以及项目本身) 都有非常大的投入, + 因此当然不介意偶尔有一些资金上的补偿, + 但我们并没打算坚决地要求得到这类资助。 + 我们认为我们的首要 使命 是为任何人提供代码, + 不管他们打算用这些代码做什么, 因为这样代码将能够被更广泛地使用, + 从而最大限度地发挥其价值。 我认为这是自由软件最基本的, + 同时也是为我们所倡导的一个目标。 GNU General Public License (GPL) GNU Lesser General Public License (LGPL) BSD Copyright 我们源代码树中在 GNU 公共许可证(GPL) 或者 GNU 函数库公共许可证 (LGPL) 下发布的代码带有少许的附加限制, 还好只是强制性的要求开放代码而不是别的。 由于使用 GPL 的软件在商业用途上会增加若干复杂性, 因此,我们宁愿在可以选择的时候对提交的软件使用更宽松的 BSD 版权。 Satoshi Asami 撰写者 FreeBSD 开发模式 FreeBSD Project 开发模式 FreeBSD 的开发是一个非常开放且有有伸缩性的过程, 就像从我们的 贡献者列表里看到的,它是完全由来自全世界的数以百计的贡献者发展起来的。 FreeBSD 的开发基础结构允许数以百计的开发者通过互联网协同工作。 我们也经常关注着那些对我们的计划感兴趣的新开发者和新的创意, 那些有兴趣更进一步参与项目的人只需要在 &a.hackers; 联系我们。 &a.announce; 对那些希望了解我们工作所涉及到哪些领域的人也是有用的。 无论是独立地工作或者封闭式的团队工作, 了解FreeBSD计划和它的开发过程都是有益的: CVS 代码库 CVS 代码库 并行版本系统 CVS FreeBSD 的中央源代码树是由 CVS (并行版本控制系统)来维护的。CVS 是一个与 FreeBSD 捆绑的可自由获得的源代码控制工具。 主 CVS 代码库放置在美国加利福尼亚州圣克拉拉的一台机器上, 它被复制到全世界的大量镜像站上。CVS 中包括了 -CURRENT 和 -STABLE 树, 它同样可以很容易地复制到您的机器上。 请查阅 同步您的源代码树这一章节来了解更多信息。 committer 列表 committers committer 是那些对 CVS 树有权限的人, 他们被授权修改 FreeBSD 的源代码 (术语 committer 来自于 &man.cvs.1; 的 commit 命令,这个命令用来把新的修改提交给 CVS 代码库)。提交修正的最好方法是使用 &man.send-pr.1; 命令。如果您发现在系统中出现了一些问题的话, 您也可以通过邮件将它们发送至 &a.committers;。 FreeBSD 核心团队 core team 如果把 FreeBSD 项目看作一个公司,那么 FreeBSD 核心团队就相当于董事会。 核心团队的主要任务是提出总体上的发展计划,然后确定一个正确的方向。 邀请那些富有献身精神和可靠的开发者加入到 committer 队伍中来也是核心团队的工作之一, 这些新的成员将作为新核心团队成员和其他人一起继续前进。 当前的核心团队是 2004 年 7 月从 committer 中选举产生的。选举每两年一次。 一些核心团队的成员还负责特定的责任范围, 也就是说他们必须尽力确保某个子系统能工作正常。 FreeBSD 开发者的完整列表和他们的责任范围,请参见 贡献者列表 核心团队的大部分成员加入 FreeBSD 开发的时候都是志愿的, 并没有从项目中获得任何财政上的资助, 所以承诺不应该被理解为支持保证。 前面所述董事会的类推并不十分准确, 或许更好的说法是,他们是一群愿意放弃他们的生活, 投身于 FreeBSD 项目而非选择其个人更好的生活的人! 外围贡献者 contributors 事实上,最大的开发团队正是为我们提供反馈和错误修补的用户自己。 FreeBSD 的非集中式的开发者保持联系的主要方式就是预订 &a.hackers;,很多事情在那里讨论。查看了解众多 FreeBSD 邮件列表的更多信息。 FreeBSD 贡献者列表 很长并在不断增长, 为什么不加入它来为 FreeBSD 做贡献呢? 提供代码不是为这个计划做贡献的唯一方式; 有一个更完整的需要做的事情的列表,可以参见 FreeBSD 项目网站 总的来说,我们的开发模式好像是一组没有拘束的同心圆。 这种集中式的开发模式,主要是考虑到用户的方便, 同时让他们能很容易地维护同一份软件, 而不会把潜在的贡献者排除在外! 我们的目标是提供一个包含有大量具有一致性 应用程序的稳定的操作系统, 以利于用户的安装和使用,— 这种模式在完成目标的过程中工作得非常有效。 我们对于那些想要加入,成为FreeBSD开发者的期待是: 具有如同当前其他人一样的投入,来确保持续的成功! 最新的 FreeBSD 发行版本 NetBSD OpenBSD 386BSD Free Software Foundation U.C. Berkeley Computer Systems Research Group (CSRG) FreeBSD 是一个免费使用且带有完整源代码的基于 4.4BSD-Lite 的系统, 它广泛运行于 Intel &i386;、&i486;、&pentium;、 &pentium; Pro、 &celeron;、 &pentium; II、 &pentium; III、 &pentium; 4(或者兼容系统)、 &xeon;、DEC Alpha 和 Sun &ultrasparc; 的计算机系统上。 它主要以 加州大学伯克利分校 的 CSRG 研究小组的软件为基础,并加入了 NetBSD、OpenBSD、386BSD 以及来自 自由软件基金会 的一些东西。 自从 94 年末我们的 FreeBSD 2.0 发行以来, FreeBSD 的性能,可定制性,稳定性都有了令人注目的提高。 最大的变化是通过 整合虚拟内存/文件系统 中的高速缓存改进的虚拟内存系统, 它不仅提升了性能,而且减少了 FreeBSD 对内存的需要, 使得 5 MB 内存成为可接受的最小配置。 其他的改进包括完整的 NIS 客户端和服务器端的支持, 事务 TCP 协议支持,按需拨号的 PPP,集成的 DHCP 支持,改进的 SCSI 子系统, ISDN 的支持,ATM,FDDI,快速 Gigabit 以太网(1000 Mbit)支持, 提升了最新的 Adaptec 控制器的支持和修补了很多的错误。 除了最基本的系统软件,FreeBSD 还提供了一个拥有成千上万广受欢迎的程序组成的软件的 ports collection。 到本书付印时,已有超过 &os.numports; 个 ports (ports 包括从 http(WWW) 服务器到游戏、程序设计语言、编辑器以及您能想到的几乎所有的东西。 完整的 ports collection 大约需要 &ports.size; 的存储空间。所有的只提供对原始代码的 修正。这使得我们能够容易地更新软件, 而且减少了老旧的 1.0 ports collection 对硬盘空间的浪费。 要编译一个 port,您只要切换到您想要安装的程序的目录, 输入 make install,然后让系统去做剩下的事情。 您要编译的每一个程序完整的原始代码可以从 CDROM 或本地 FTP 获得,所以您只需要编译您想要软件的足够的磁盘空间。 几乎大多数的软件都提供了事先编译好的 package 以方便安装,对于那些不希望从源代码编译他们自己的 ports 的人只要使用一个简单的命令 (pkg_add)就可以安装。 有关 package 和 ports 的更多信息可以在中找到。 您可以在最近的 FreeBSD 主机的 /usr/share/doc 目录下找到许多有用的文件来帮助您安装及使用 FreeBSD。 您也可以用一个 HTML 浏览器来查阅本地安装的手册, 使用下面的 URL: FreeBSD 使用手册 /usr/share/doc/handbook/index.html FreeBSD FAQ /usr/share/doc/faq/index.html 您也可以查看在 http://www.FreeBSD.org/ 主站的副本(持续更新中)。 diff --git a/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml b/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml index 7dfb54ccf5..099d8a3dff 100644 --- a/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml @@ -1,1534 +1,1536 @@ Jim Mock Updated and restructured by Jake Hamby Originally contributed by 配置FreeBSD的内核 概述 内核 建立一个定制的内核 - 内核是&os;操作系统的核心。它用来管理内存,执行 - 安全控制,网络,磁盘访问等等。虽然现在&os;可以更多地 - 进行动态配置,但有时您还是需要重新配置和编译您的内核。 + 内核是 &os; 操作系统的核心。 它负责管理内存、 执行安全控制、 + 网络、 磁盘访问等等。 尽管 &os; 可以动态修改的现在已经越来越多, + 但有时您还是需要重新配置和编译您的内核。 - 读完这章,您将了解到: + 读完这章,您将了解: - 为什么需要建立一个定制的内核。 + 为什么需要建立定制的内核。 - 如何写一个内核配置文件,或修改已存在的配置文件。 + 如何编写内核配置文件,或修改已存在的配置文件。 - 如何使用内核配置文件创建和建立一个新的内核。 + 如何使用内核配置文件创建和联编新的内核。 - 如何安装一个新内核。 + 如何安装新内核。 - 如何在/dev中创建设备节点。 + 如何在 /dev 中创建设备节点。 如何出现问题怎么办。 这一章给出的命令应该以 root 身份执行, 否则可能会不成功。 - 为什么需要建立一个定制的内核? + 为什么需要建立定制的内核? 过去, &os; 采用称作 单片式 的内核。 这句话的意思是说内核是一个大的程序, 支持固定的设备, 如果您希望改变内核的行为则必须编译一个新的, 并重新启动计算机来引导它。 今天, &os; 已经迅速地转移到了一个新的模型, 其重要特征是内核功能可以由能够根据需要动态加载和卸载的模块来提供。 这是的内核能够迅速地适应硬件的调整 (例如笔记本电脑的 PCMICA), 或为内核增加在最初编译它时所不具备的新的功能。 这一模式成为模块化内核。 尽管如此, 一些功能仍然需要静态地连编进内核。 一些情况是因为这些功能于内核的结合十分紧密, 而不可能将它们做成可以动态加载的。 另一种情况是因为没有人有时间来编写实现那个功能的可以动态加载的内核模块。 建造定制的内核是几乎每一个 BSD 用户所必须经历的一关。 尽管这项工作可能比较耗时, 但它能够为使用 &os; 系统带来很多好处。 与必须支持大量各式硬件的 GENERIC 内核不同, 定制的内核可以只包含对于 您的 PC 硬件的支持。 这有很多好处, 例如: 更快地启动。 因为内核只需要检测您系统上的硬件, 启动时所花费的时间将大大缩短。 使用更少的内存。 定制的内核通常会比 GENERIC 内核使用更少的内存, 由于内核必须时刻处于物理内存中, 因此这就显得更加重要。 给予这样的原因, 对于内存较小的系统来说, 定制内核将发挥更大的作用。 支持更多的硬件。 定制的内核允许您增加类似声卡这样的 GENERIC 内核没有提供内建支持的硬件。 建立并安装一个定制的内核 内核 建立/安装 首先对内核构建目录做一个快速的浏览。 这里所提到的所有目录都在 /usr/src/sys 目录中; 也可以通过 /sys 来访问它。 这里的众多子目录包含了内核的不同部分, 但对我们所要完成的任务最重要的目录是 arch/conf, 您将在这里编辑定制的内核配置; 以及 compile, 编译过程中的文件将放置在这里。 arch 表示 i386alphaamd64ia64powerpcsparc64, 或 pc98 (在日本比较流行的另一种 PC 硬件开发分支)。 在特定硬件架构目录中的文件只和特定的硬件有关; 而其余代码则是与机器无关的, 则所有已经或将要移植并运行 &os; 的平台上都共享这些代码。 文件目录是按照逻辑组织的, 所支持的硬件设备、 文件系统, 以及可选的组件通常都在它们自己的目录中。 5.X 版之前的 &os; 只支持 i386alphapc98 这三种硬件架构。 这一章提供的例子假定您使用 i386 架构的计算机。 如果您的情况不是这样, 只需对目录名作相应的调整即可。 - 如果在您的系统上没有/usr/src/sys这个目录, - 那么内核源代码就没有被安装。最简单的方法是以root身份执行/stand/sysinstall, + 如果在您的系统上 没有 /usr/src/sys 这个目录, + 则说明没有安装内核源代码。 + 最简单的方法是以 root 身份执行 + /stand/sysinstall, 选择Configure, 接着是Distributions, 下来src, 最后sys。 如果您已经有一张官方&os;系统安装盘;并且您有权限使用 光驱,那么您也可以通过下面命令行来安装源代码: &prompt.root; mount /cdrom &prompt.root; mkdir -p /usr/src/sys &prompt.root; ln -s /usr/src/sys /sys &prompt.root; cat /cdrom/src/ssys.[a-d]* | tar -xzvf - 接下来, 进入 arch/conf 目录下面, 复制 GENERIC 配置文件, 并给这个文件起一个容易辨认的名称, 它就是您的内核名称。例如: &prompt.root; cd /usr/src/sys/i386/conf &prompt.root; cp GENERIC MYKERNEL 通常,这个名称是大写的,如果您正维护着多台不同硬件的&os;机器, 以您机器的域名来命名是非常好的主意。我们把它命名为MYKERNEL就是这个原因。 将您的内核配置文件直接保存在 /usr/src 可能不是一个好主意。 如果您遇到问题, 删掉 /usr/src 并重新开始很可能是一个诱人的选择。 一旦开始做这件事, 您可能几秒钟之后才会意识到您同时会删除定制的内核配置文件。 另外, 也不要直接编辑 GENERIC, 因为下次您 更新代码 时它会被覆盖, 而您的修改也就随之丢失了。 您可以考虑将内核配置文件放到别的地方, 然后在 i386 目录中建立一个符号连接指向它。 例如: &prompt.root; cd /usr/src/sys/i386/conf &prompt.root; mkdir /root/kernels &prompt.root; cp GENERIC /root/kernels/MYKERNEL &prompt.root; ln -s /root/kernels/MYKERNEL 必须以 root 身份执行这些和接下来命令, 否则就会得到 permission denied 的错误提示。 现在就可以用您喜欢的文本编辑器来编辑 MYKERNEL 了。 如果您刚刚开始使用 FreeBSD, 唯一可用的编辑器很可能是 vi, 它的使用比较复杂, 限于篇幅, 这里不予介绍, 您可以在 参考书目 一章中找到很多相关书籍。 不过, &os; 也提供了一个更好用的编辑器, 它叫做 ee, 对于新手来说, - 它很可能是一个不错的选择。 + 这很可能是一个不错的选择。 您可以修改配置文件中的注释以反映您的配置, 或其他与 GENERIC 不同的地方。 SunOS 如果您在&sunos;或者其他BSD系统下定制过内核,那这个文件中的绝大部分将对您非常熟悉。 如果您使用的是诸如DOS这样的系统,那GENERIC配置文件看起来就非常困难, 所以在下面的 配置文件章节将慢慢地、仔细地进行介绍。 如果您和 &os; project 进行了 代码同步, 则一定要在进行任何更新之前查看 /usr/src/UPDATING。 这个文件中描述了更新过的代码中出现的重大问题或需要注意的地方。 /usr/src/UPDATING 总是和您的 &os; 源代码对应, 因此能够提供比手册更具时效性的新内容。 现在应该编译内核的源代码了。 一共有两种方法来完成这项工作, 使用哪一种取决于您为什么要重新编译内核, 以及所运行的 &os; 版本。 如果您安装内核源代码,使用方法1。 如果您运行的是&os;4.0以前的版本的话,而且您升级到 &os; 4.0或更高版本,只要使用方法1。 如果您在没有升级源代码的情况下编译一个新内核(也许您只想为内核添加一个新的选项, 如IPFIREWALL),可以使用任何一种方法。 如果您正在重建的内核是作为make world进程的一部分,需要使用方法2。 cvsup 匿名 CVS CTM CVS 匿名 如果从上次成功地完成 buildworld-installworld 以来您还 没有 升级过代码 (也就是没有运行 CVSupCTM, 或使用 anoncvs), 则可以放心使用 configmake dependmakemake install 方法1. 用<quote>传统</quote>方法建立一个内核 运行&man.config.8;来产生内核源代码。 &prompt.root; /usr/sbin/config MYKERNEL 进入编译内核的目录。 &man.config.8; 将在像上面一样显示执行它所在的目录的名字。 &prompt.root; cd ../compile/MYKERNEL 对于 &os; 5.0 以及更早的版本, 使用下面的形式: &prompt.root; cd ../../compile/MYKERNEL 编译内核。 &prompt.root; make depend &prompt.root; make 安装新内核。 &prompt.root; make install 方法2. 用<quote>新的</quote>方法建立一个内核 切换到/usr/src 目录。 &prompt.root; cd /usr/src 编译内核。 &prompt.root; make buildkernel KERNCONF=MYKERNEL 安装新内核。 &prompt.root; make installkernel KERNCONF=MYKERNEL 在&os; 4.2老版本里面您必须用KERNEL= 来替换KERNCONF=。2001年2月2日以后生成的4.2-STABLE 就可以认出KERNCONF= /boot/kernel.old 新内核将会被复制到 /boot/kernel 目录中成为 /boot/kernel/kernel 而旧的则被移到 /boot/kernel.old/kernel。 现在关闭系统, 然后用新的内核启动计算机。 如果出现问题, 后面的一些 故障排除方法 将帮您摆脱困境。 如果您的内核 无法启动, 请参考那一节。 在 &os; 4.X 以及更早的版本中, 内核被安装到 /kernel 而模块则放到 /modules, 旧的内核则被备份到 /kernel.old。 其他与启动过程相关的文件, 如 &man.loader.8; 以及配置则放在 /boot。 第三方或定制的模块也可以放在 /modules, 不过应该注意保持模块和内核的同步时很重要的, 否则会导致不稳定和错误。 如果添加了新设备 (例如声卡) 并在运行 &os; 4.X 或更早的版本, 则可能好需要在 /dev 目录中添加它们的设备节点之后才能使用。 欲了解详情,请参考本章稍后的 制作设备节点 一节。 Joel Dahl Updated for &os; 5.X by 配置文件 内核 NOTES kernel LINT NOTES LINT 内核 配置文件 配置文件的格式是非常简单的。 每一行都包括一个关键词, 以及一个或多个参数。 实际上, 绝大多数行都只包括一个参数。 在 # 之后的内容会被认为是注释而忽略掉。 下面的每个小节,将依次介绍每个列在 GENERIC 中的选项, 当然, 一些相关的关键词 (如网络) 将被放在一起, 尽管在 GENERIC 中可能分散在各处。 如果需要与平台有关的选项和设备的详细列表, 请参考与 GENERIC 在同一个目录中的那个NOTES, 而平台无关的选项, 则可以在 /usr/src/sys/conf/NOTES 找到。 NOTES 在 &os; 4.X 中并不存在。 与此相反, 请参考 LINT 文件来获得关于 GENERIC 中的选项和设备详细介绍。 LINT 在 4.X 中完成了两项使命: 为构建定制内核提供可选的选项, 以及提供尽可能多的调整为非默认值的选项。 这么做背后的原因是这种配置文件能够帮助 (并且仍然能) 测试新代码以及现有代码的修改是否会造成与内核其他部分的冲突。 然而, 内核配置的架构在 5.X 中经历了巨大的变化; 其中的一个例子是设备驱动的选项被移到了 hints 中, 从而可以随时修改并在启动时动态加载, 而 LINT 不能再包含这些 hints 了。 由于这个以及许多其他原因, 决定将 LINT 改名为 NOTES, 而保留它的主要是为了前面所说的第一个原因: 给出可用的选项, 为用户提供方便。 在 &os; 5.X 和以后的版本中您仍然可以通过下面的命令生成 LINT 文件: &prompt.root; cd /usr/src/sys/i386/conf && make LINT 内核 配置文件例子 下面是一个 GENERIC 内核配置文件的例子, 它包括了一些需要解释的注释。 这个例子应该和您复制的 /usr/src/sys/i386/conf/GENERIC 非常接近。 # # GENERIC -- Generic kernel configuration file for &os;/i386 # # For more information on this file, please read the handbook section on # Kernel Configuration Files: # # http://www.&os;.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html # # The handbook is also available locally in /usr/share/doc/handbook # if you've installed the doc distribution, otherwise always see the # &os; World Wide Web server (http://www.FreeBSD.org/) for the # latest information. # # An exhaustive list of options and more detailed explanations of the # device lines is also present in the ../../conf/NOTES and NOTES files. # If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD: /repoman/r/ncvs/src/sys/i386/conf/GENERIC,v 1.413 2004/08/11 01:34:18 rwatson Exp $ 下面这个选项在每个中都要有: 内核选项 机器 machine i386 这是机器的架构, 他只能是 alpha, amd64, i386, ia64, pc98, powerpc, 或 sparc64 中的一种。 内核选项 cpu cpu I486_CPU cpu I586_CPU cpu I686_CPU 上面的选项指定了您系统中所使用的 CPU 类型。 您可以使用多个 CPU 类型 (例如, 您不确定是应该指定 I586_CPUI686_CPU)。 然而对于定制的内核, 最好能够只指定您使用的那种 CPU。 如果您对于自己使用的 CPU 类型没有把握, 可以通过查看 /var/run/dmesg.boot 中的启动信息来了解。 内核选项 cpu类型 在&os;的内核里面仍然支持I386_CPU,但是在-STABLE和 -CURRENT里面缺省已经被禁用了。这就意味着安装&os;在386-class的cpu, 一般有下面几种情况: 安装一个老的&os; release并且按照从源码重建系统. 在一个新的机器上构建用户和内核程序,然后用已经编译好的/usr/obj下的文件 安装到386的机器上(详细情况看)。 定制您自己的 &os; 发行版本, 其中的安装光盘包含 I386_CPU 支持。 第一种情况可能是最容易的, 但您需要大量的磁盘空间, 而 386-级别拥有这种配置的计算机可能很难找到。 内核选项 ident ident GENERIC 这是内核的名字。 您应该取一个自己的名字, 例如取名叫 MYKERNEL, 如果您一直在按照前面的说明做的话。 您放在 ident 后面的字符串在启动内核时会显示出来, 因此如果希望能够容易区分常用的内核和刚刚定制的内核, 就应该采取不同的名字 (例如, 您想定制一个试验性的内核)。 内核选项 maxusers maxusers n 这个 maxusers 选项设置了重要系统表的大小。 这个数值粗略地假设您的机器同时会有多少用户。 从&os; 4.5开始,如果手动设置这个值为0系统将会自动赋值。 自动赋值算法是设置maxusers等于系统的内存总量,最小到32,最大到384。 . 在&os;  5.X 和更高版本中,maxusers 如果没有定义,将缺省为 0。如果您使用的&os;早于4.5, 或者您想自己设置这个值, 那么您至少要设置maxusers为4, 特别是您要执行X Window或是编译程序。 原因是maxusers值决定了系统同时可有多少个进程(process), 其算法是20 + 16 * maxusers,所以如果您设置maxusers为1, 则您的系统只能同时存在36个进程,包括18个(或更多)系统启动要占去的进程。 如果您执行了X Window,则又要用掉15个以上。甚至阅读一个man page也会使用九个进程来过滤、解压缩、然后显示文件。 设置maxusers到64将允许您有1044个进程,对任何人应该都是足够的。 当您执行程序时, 得到像是proc table full这样的错误信息, 或者您要建一个同时会有很多人来访问的网站(比如ftp.FreeBSD.org)时, 您就要增加这个设置的值,然后重新编译内核。 maxusers不会 限制能够登录到您机器上的用户数量。 它只是简单地设置一些系统表的尺寸, 以适应您的系统中登录这样多的用户时能够执行的最大进程数。 确实 会限制同时能够登录的远程用户以及 X 终端窗口的关键字是 pseudo-device pty 16。 在 &os; 5.X 中, 您并不需要担心这个数值, 因为 &man.pty.4; 驱动提供了 自动克隆(auto-cloning) 的能力; 在配置文件中您只需简单地指定 device pty 就可以了。 # Floating point support - do not disable. device npx npx 是 &os; 中浮点运算单元的接口, 用于支持硬件的浮点运算协处理器, 以及软件仿真程序。 这个设置 不是 可有可无的。 # Pseudo devices device loop # Network loopback 这是 TCP/IP 的通用回环设备。 如果您 telnet 或 FTP 到 localhost (也就是 127.0.0.1) 则将通过这个设备回到本机。 这个设备是 必需的。 在 &os; 4.X 中, 则应使用 pseudo-device loop 接下来的那些项有一个或多个选项,关于每个选项的更多的信息参考下面注释。 #To statically compile in device wiring instead of /boot/device.hints #hints "GENERIC.hints" # Default places to look for devices. 在&os; 5.X和更新的版本里面,&man.device.hints.5;被用来配置设备驱动选项。 在启动的时候&man.loader.8;将会检查缺省位置/boot/devicehints。 使用hints选项您就可以把这些hints静态编译进内核。 这样就没有必要在/boot下创建devicehints #makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols 一般的 &os; 构建过程并不包括调试信息, 在构建内核时, 绝大多数符号会在最终的内核连接之后剔除出去, 以节省安装时所需的空间。 如果您打算测试 -CURRENT 分支的内核, 或开发您自己的 &os; 内核功能, 则可能会需要去掉这一行的注释。 这将启用 选项, 它会在 &man.gcc.1; 中打开调试信息。 如果您使用 传统 方法来构建内核, 也可以通过 &man.config.8; 的 选项来达到同样的目的 (参见 了解进一步的信息)。 options SCHED_4BSD # 4BSD scheduler 这是 &os; 的传统调度器。 取决于您系统的工作负荷, 使用新的 ULE 调度器通常可以获得更好的性能。 它是专门为 &os; 在 SMP 上运行而设计的调度器, 但在 UP 系统上也能工作得很好。 如果您想试验这个功能, 则应把配置文件中的 SCHED_4BSD 改为 SCHED_ULE options INET # InterNETworking 网络支持,即使您不打算连网,也请保留它,大部分的程序至少需要回环网络(就是和本机进行网络连接),所以强烈要求保留它。 options INET6 # IPv6 communications protocols 这将打开IPv6连接协议。 options FFS # Berkeley Fast Filesystem 这是最基本的硬盘文件系统,如果打算从本地硬盘启动,请保留它。 options UFS_ACL # Support for access control lists 这个选项只能在 &os; 5.X 和更高版本中使用, 它将启用内核中的访问控制表的支持。 这依赖于扩展属性以及 UFS2, 以及在 中所介绍的那些特性。 ACL 默认是启用的, 并且如果已经在文件系统上使用了这一特性, 就不应再关掉它, 因为这会去掉文件的访问控制表, 并以不可预期的方式改变受保护的文件的访问方式。 options UFS_DIRHASH # Improve performance on big directories 通过使用额外的内存,这个选项可以加速在大目录上的磁盘操作。 您应该在大型服务器和频繁使用的工作站上打开这个选项,而在磁盘操作不是很重要的 小型系统上关闭它,比如防火墙。 options SOFTUPDATES # Enable FFS Soft Updates support 这个选项将启用内核的 Soft Updates, 它有助于提高磁盘的写操作速度。 尽管这个功能是内核提供的, 仍然需要对具体的磁盘打开它。 请查看 &man.mount.8; 的输出以了解 Soft Updates 是否已经在您的系统磁盘上启用了。 如果您没有看到 soft-updates 挂接选项, 则需要通过使用 &man.tunefs.8; (对于已经存在的文件系统) 或 &man.newfs.8; (对于新的文件系统) 命令来激活它。 options MD_ROOT # MD is a potential root device 这个选项将打开以基于内存的虚拟磁盘作为根设备的支持。 内核选项 NFS 内核选项 NFS_ROOT options NFSCLIENT # Network Filesystem Client options NFSSERVER # Network Filesystem Server options NFS_ROOT # NFS usable as /, requires NFSCLIENT 网络文件系统。 如果您不打算通过 TCP/IP 挂接 &unix; 文件服务器的分区, 就可以注释掉它。 内核选项 MSDOSFS options MSDOSFS # MSDOS Filesystem &ms-dos; 文件系统。 只要您不打算在启动时挂接由 DOS 格式化的硬盘分区, 就可以把它注释掉。 如前面所介绍的那样, 在您第一次挂接 DOS 分区时, 内核会自动加载需要的模块。 此外, emulators/mtools 软件提供了一个很方便的功能, 通过它您可以直接访问 DOS 软盘而无需挂接或卸下它们 (而且也完全不需要 MSDOSFS)。 options CD9660 # ISO 9660 Filesystem 用于 CDROM 的 ISO 9660 文件系统。 如果没有 CDROM 驱动器或很少挂接光盘数据 (因为在首次使用数据 CD 时会自动加载), 就可以把它注释掉。 音乐 CD 并不需要这个选项。 options PROCFS # Process filesystem 进程文件系统。 这是一个挂接在 /proc 的一个 伪装的 文件系统, 允许类似 &man.ps.1; 这样的程序给出正在运行的进程的更多信息。 在 &os; 5.X 和更高版本中, 绝大多数情况下都不再需要 PROCFS, 因为绝大多数调试和监视工具都已经进行了修改, 不再需要 PROCFS: 与 &os; 4.X - 不同, 新安装的 &os; 5.X 默认情况下髌骨挂接它。 + 不同, 新安装的 &os; 5.X 默认情况下并不挂接它。 此外, 6.X-CURRENT 内核在使用 PROCFS 时还必须加入 PSEUDOFS 的支持: options PSEUDOFS # Pseudo-filesystem framework PSEUDOFS 在 &os; 4.X 上不可用。 options GEOM_GPT # GUID Partition Tables. 这个选项提供了在一个磁盘上使用大量的分区的能力。 options COMPAT_43 # Compatible with BSD 4.3 [KEEP THIS!] 使系统兼容4.3BSD。不要去掉这一行,不然有些程序将无法正常运行。 options COMPAT_FREEBSD4 # Compatible with &os;4 为了支持在旧版本的&os;下编译的程序,该选项在&os; 5.X &i386;和Alpha systems下需要打开。 最好在所有的&i386;和Alpha systems下打开这个选项,因为可能要运行老应用程序。 在5.X才开始支持的平台,比如ia64和&sparc64;,就不需要这个选项。 options SCSI_DELAY=15000 # Delay (in ms) before probing SCSI 这将让内核在探测每个 SCSI 设备之前等待 15 秒。 如果您只有 IDE 硬盘驱动器, 则可以不管它, 反之您可能会想降低这个数值, 可能减少到 5 秒, 以加速启动过程。 当然, 如果您这么做之后 &os; 在识别您的 SCSI 设备时遇到问题, 则您还需要再把它改回去。 options KTRACE # ktrace(1) support 这个选项打开内核进程跟踪,在调试时很有用。 options SYSVSHM # SYSV-style shared memory - 提供System V共享内存(SHM)的支持,最常用到SHM的应该是X Window的XSHM延伸, + 提供System V共享内存(SHM)的支持,最常用到SHM的应该是X Window的XSHM延伸, 不少绘图相关程序会自动使用SHM来提供额外的速度。如果您要使用X Window,您最好加入这个选项。 options SYSVSEM # SYSV-style semaphores - 支持System V semaphores,不常用到,只在kernel中占用几百个字节的空间。 + 支持System V 信号量,不常用到,只在kernel中占用几百个字节的空间。 options SYSVMSG # SYSV-style message queues - 支持 System V 消息。 同样地, 这只会在内核中增加数百字节的空间占用。 + 支持 System V 消息。 同样地, 这只会在内核中增加数百字节的空间占用。 &man.ipcs.1; 命令的 选项可以显示出任何用到这些 - System V 机制的进程。 + System V 机制的进程。 options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions 在1993年&posix;添加的实时扩展. 在ports collection中某些应用程序会用到这些 (比如&staroffice;)。 options KBD_INSTALL_CDEV # install a CDEV entry in /dev 这个选项与键盘有关。 它在 /dev 中安装一个 CDEV 项。 options AHC_REG_PRETTY_PRINT # Print register bitfields in debug # output. Adds ~128k to driver. options AHD_REG_PRETTY_PRINT # Print register bitfields in debug # output. Adds ~215k to driver. 这个选项主要用于帮助调试, 它能够给出更容易阅读的寄存器数值。 options ADAPTIVE_GIANT # Giant mutex is adaptive. 这个选项使得内核全局锁 (Giant) 按照和其它 mutex 类似的方式自适应地自旋。 内核选项 SMP # To make an SMP kernel, the next two are needed options SMP # Symmetric MultiProcessor Kernel device apic # I/O APIC 上述两个选项是 SMP 支持所必需的, 在单处理器的机器上可以去掉它们。 device isa 所有为 &os; 所支持的 PC 都需要这个设置, 即使没有 ISA 插槽也是一样。 如果您使用 IBM PS/2 (微通道架构) 的计算机, &os; 目前只能提供有限的支持。 要了解关于 MCA 支持的详情, 请参考 /usr/src/sys/i386/conf/NOTES device eisa 如果您的主机板上有EISA总线,加入这个设置。使用这个选项可以自动扫描并设置所有连接在EISA总线上的设备。 device pci 如果您的主板有PCI总线,就加入这个选项。使用这个选项可以自动扫描PCI卡,并在PCI到ISA之间建立通路。 device agp 如果您有图形加速卡(AGP card),这个选项将打开图形加速支持。 # Floppy drives device fdc 这是软驱控制器。 # ATA and ATAPI devices device ata 这个驱动器支持所有ATA和ATAPI设备。您只要在内核中加入device ata选项, 就可以让内核支持现代计算机上的所有PCI ATA/ATAPI设备。 device atadisk # ATA disk drives 这个是ATAPI 磁盘驱动器所必须的。 device ataraid # ATA RAID drives 这个选项需要 device ata, 它用于 ATA RAID 驱动。 device atapicd # ATAPI CDROM drives 这个是ATAPI CDROM驱动器所必须的。 device atapifd # ATAPI floppy drives 这个是ATAPI 磁盘驱动器所必须的。 device atapist # ATAPI tape drives 这个是ATAPI 磁带机驱动器所必须的. options ATA_STATIC_ID # Static device numbering 这指定对控制器使用其静态的编号; 如果没有这个选项, 则会动态地分配设备的编号。 # SCSI Controllers device ahb # EISA AHA1742 family device ahc # AHA2940 and onboard AIC7xxx devices device ahd # AHA39320/29320 and onboard AIC79xx devices device amd # AMD 53C974 (Teckram DC-390(T)) device isp # Qlogic family device mpt # LSI-Logic MPT-Fusion #device ncr # NCR/Symbios Logic device sym # NCR/Symbios Logic (newer chipsets) device trm # Tekram DC395U/UW/F DC315U adapters device adv # Advansys SCSI adapters device adw # Advansys wide SCSI adapters device aha # Adaptec 154x SCSI adapters device aic # Adaptec 15[012]x SCSI adapters, AIC-6[23]60. device bt # Buslogic/Mylex MultiMaster SCSI adapters device ncv # NCR 53C500 device nsp # Workbit Ninja SCSI-3 device stg # TMC 18C30/18C50 SCSI控制器。可以注释掉您系统中没有的设备。如果您只有IDE设备,您可以把这些一起删掉。 # SCSI peripherals device scbus # SCSI bus (required for SCSI) device ch # SCSI media changers device da # Direct Access (disks) device sa # Sequential Access (tape etc) device cd # CD device pass # Passthrough device (direct SCSI access) device ses # SCSI Environmental Services (and SAF-TE) SSCSI外围设备。也可以像上面一样操作。 目前系统提供的 USB &man.umass.4; 驱动 (以及少量其它驱动) 使用了 SCSI 子系统, 尽管它们并不是真的 SCSI 设备。 因此, 如果在内核配置使用了这类驱动程序, 请务必不要删除 SCSI 支持。 # RAID controllers interfaced to the SCSI subsystem device amr # AMI MegaRAID device asr # DPT SmartRAID V, VI and Adaptec SCSI RAID device ciss # Compaq Smart RAID 5* device dpt # DPT Smartcache III, IV - See NOTES for options device iir # Intel Integrated RAID device ips # IBM (Adaptec) ServeRAID device mly # Mylex AcceleRAID/eXtremeRAID device twa # 3ware 9000 series PATA/SATA RAID # RAID controllers device aac # Adaptec FSA RAID device aacp # SCSI passthrough for aac (requires CAM) device ida # Compaq Smart RAID device mlx # Mylex DAC960 family device pst # Promise Supertrak SX6000 device twe # 3ware ATA RAID 支持RAID控制器。如果您没有这些,可以把它们注释掉或是删掉。 # atkbdc0 controls both the keyboard and the PS/2 mouse device atkbdc # AT keyboard controller 键盘控制器(atkbdc)提供AT键盘输入以及PS/2指针设备的I/O服务。 键盘驱动程序(atkbd)与PS/2鼠标驱动程序(psm)需要这个控制器,所以不要删除它。 device atkbd # AT keyboard atkbd驱动程序,与atkbdc控制器一起使用, 提供连接到AT键盘控制器的AT 84键盘与AT加强型键盘的访问服务。 device psm # PS/2 mouse 如果您的鼠标连接到PS/2鼠标端口,就使用这个设备驱动程序。 device vga # VGA video card driver 显卡驱动。 # splash screen/screen saver device splash # Splash screen and screen saver support 启动时出现了 splash 画面!屏幕保护程序也需要它。 在 &os; 4.X 中,应写作 pseudo-device splash # syscons is the default console driver, resembling an SCO console device sc sc 是默认的控制台驱动程序, 类似 SCO 控制台。 由于绝大部分全屏幕程序都通过类似 termcap 这样的终端数据库函数库赖访问控制台, 因此无论您使用这个或与 VT220 兼容的 vt 都没有什么关系。 如果您在运行这种控制台时使用全屏幕程序时发生问题, 清在登录之后将 TERM 变量设置为 scoansi # Enable this for the pcvt (VT220 compatible) console driver #device vt #options XSERVER # support for X server on a vt console #options FAT_CURSOR # start with block cursor 这是一个兼容 VT220 的控制台驱动, 它同时能够向下兼容 VT100/102。 在同 sc 硬件不兼容的一些笔记本上它能够运行的很好。 当然, 登录系统时请把 TERM 变量设置为 vt100vt220。 此驱动在连接网络上大量不同的机器时也被证明非常有用, 因为此时 termcapterminfo 通常没有可用的 sc 设备 — 而 vt100 则几乎每种平台都支持。 # Power management support (see NOTES for more options) #device apm Advanced Power Management support. Useful for laptops, although in &os; 5.X and above this is disabled in GENERIC by default. # Add suspend/resume support for the i8254. device pmtimer 用于电源管理事件, 例如 APM 和 ACPI 的时钟设备驱动。 # PCCARD (PCMCIA) support # PCMCIA and cardbus bridge support device cbb # cardbus (yenta) bridge device pccard # PC Card (16-bit) bus device cardbus # CardBus (32-bit) bus PCMCIA支持。如果您使用膝上型计算机,您需要这个。 # Serial (COM) ports device sio # 8250, 16[45]50 based serial ports 这些串口在 &ms-dos;/&windows; 的世界中称为 COM 口。 如果使用内置式的调制解调器, 并占用 COM4 而您另有一个串口在 COM2, 则必须把调制解调器的 IRQ 改为 2 (由于晦涩的技术原因, IRQ2 = IRQ 9) 才能够在 &os; 中访问它。 如果有多口的串口卡, 请参考 &man.sio.4; 以了解需要在 /boot/device.hints 中进行的设置。 某些显卡 (特别是基于 S3 芯片的卡) 使用形如 0x*2e8 的 IO 地址, 而许多廉价的串口卡不能够正确地对 16-位 IO 地址空间进行解码, 因此它们会产生冲突, 并造成 COM4 实际上无法使用。 每一个串口都需要有一个唯一的 IRQ (除非您使用支持中断分享的串口卡), 因此默认的 COM3COM4 IRQ 是不能使用的。 # Parallel port device ppc ISA-bus并行接口。 device ppbus # Parallel port bus (required) 提供并行总线的支持。 device lpt # Printer 提供并口打印机的支持。 要使用并口打印机,就必须同时加入上面三行设置。 device plip # TCP/IP over parallel 这是针对并行网络接口的驱动器。 device ppi # Parallel port interface device 普通用途的I/O (geek port) + IEEE1284 I/O. #device vpo # Requires scbus and da zip drive 这是针对Iomega Zip驱动器的。它要求scbusda的支持。 最好的执行效果是工作在EPP 1.9模式。 #device puc - 如果您有由 &man.puc.4 支持的 + 如果您有由 &man.puc.4; 支持的 串行或并行 PCI 卡, 则应去掉这一行的注释。 # PCI Ethernet NICs. device de # DEC/Intel DC21x4x (Tulip) device em # Intel PRO/1000 adapter Gigabit Ethernet Card device ixgb # Intel PRO/10GbE Ethernet Card device txp # 3Com 3cR990 (Typhoon) device vx # 3Com 3c590, 3c595 (Vortex) 多种PCI网卡驱动器。注释或删除您系统中没有的设备. # PCI Ethernet NICs that use the common MII bus controller code. # NOTE: Be sure to keep the 'device miibus' line in order to use these NICs! device miibus # MII bus support MII总线支持对于一些PCI 10/100 Ethernet NIC来说是必需的。 device dc # DEC/Intel 21143 and various workalikes device miibus # MII bus support device bfe # Broadcom BCM440x 10/100 Ethernet device bge # Broadcom BCM570xx Gigabit Ethernet device dc # DEC/Intel 21143 and various workalikes device fxp # Intel EtherExpress PRO/100B (82557, 82558) device pcn # AMD Am79C97x PCI 10/100 (precedence over 'lnc') device re # RealTek 8139C+/8169/8169S/8110S device rl # RealTek 8129/8139 device sf # Adaptec AIC-6915 (Starfire) device sis # Silicon Integrated Systems SiS 900/SiS 7016 device sk # SysKonnect SK-984x & SK-982x gigabit Ethernet device ste # Sundance ST201 (D-Link DFE-550TX) device ti # Alteon Networks Tigon I/II gigabit Ethernet device tl # Texas Instruments ThunderLAN device tx # SMC EtherPower II (83c170 EPIC) device vr # VIA Rhine, Rhine II device wb # Winbond W89C840F device xl # 3Com 3c90x (Boomerang, Cyclone) 使用MII总线控制器代码的驱动器。 # ISA Ethernet NICs. pccard NICs included. device cs # Crystal Semiconductor CS89x0 NIC # 'device ed' requires 'device miibus' device ed # NE[12]000, SMC Ultra, 3c503, DS8390 cards device ex # Intel EtherExpress Pro/10 and Pro/10+ device ep # Etherlink III based cards device fe # Fujitsu MB8696x based cards device ie # EtherExpress 8/16, 3C507, StarLAN 10 etc. device lnc # NE2100, NE32-VL Lance Ethernet cards device sn # SMC's 9000 series of Ethernet chips device xe # Xircom pccard Ethernet # ISA devices that use the old ISA shims #device le ISA 以太网卡驱动。 参见 /usr/src/sys/i386/conf/NOTES 以了解关于哪个驱动程序能够驱动您的网卡的细节。 # Wireless NIC cards device wlan # 802.11 support device an # Aironet 4500/4800 802.11 wireless NICs. device awi # BayStack 660 and others device wi # WaveLAN/Intersil/Symbol 802.11 wireless NICs. #device wl # Older non 802.11 Wavelan wireless NIC. Support for various wireless cards. device mem # Memory and kernel memory devices The system memory devices. device io # I/O device This option allows a process to gain I/O privileges. This is useful in order to write userland programs that can handle hardware directly. This is required to run the X Window system. device random # Entropy device Cryptographically secure random number generator. device ether # Ethernet support ether 只有在使用以太网卡时才需要。 它包含了通用的以太网协议代码。在 &os; 4.X 中应写作 pseudo-device ether. device sl # Kernel SLIP sl 用以提供 SLIP 支持。 目前它几乎已经完全被 PPP 取代了, 因为后者更容易配置, 而且更适合调制解调器之间的连接, 并提供了更强大的功能。 在 &os; 4.X 中, 这一行应写作 pseudo-device sl. device ppp # Kernel PPP 这一选项用以提供内核级的 PPP 支持, 用于拨号连接。 也有以用户模式运行的 PPP 实现, 使用 tun 并提供包括按需拨号在内的更为灵活的功能。 在 &os; 4.X 中应写作 pseudo-device ppp. device tun # Packet tunnel. 它会被用户模式的 PPP 软件用到。 参考本书的 PPP 以了解更多的细节。 在 &os; 4.X 中则应使用 pseudo-device tun device pty # Pseudo-ttys (telnet etc) 这是一个 pseudo-terminal 或模拟登入端口。 它用来接收连入的 telnet 以及 rlogin 会话、 xterm, 以及一些其它程序如 Emacs 等。 在 &os; 4.X 中, 您应该使用 pseudo-device pty numberpty 后面的 number 用于指定要创建的 pty 数量。 如果您需要多于默认的同时 16 个 xterm 窗口或远程登录会话, 则应相应的提高这个值, 其上限是 256。 device md # Memory disks Memory disk pseudo-devices. With &os; 4.X use the line pseudo-device md. device gif # IPv6 and IPv4 tunneling 它实现了在 IPv4 上的 IPv6 隧道、 IPv6 上的 IPv4 隧道、 IPv4 上的 IPv4 隧道、 以及IPv6 上的 IPv6隧道。 从 &os; 4.4 开始 gif 设备具有了 自动克隆 能力, 因此只需指定 pseudo-device gif。 更早版本的 &os; 4.X 需要手工指定一个数字, 例如 pseudo-device gif 4 device faith # IPv6-to-IPv4 relaying (translation) 这个伪设备能捕捉发给它的数据包,并把它们转发给 IPv4/IPv6 翻译服务程序。在 &os; 4.X 中,应写作 pseudo-device faith 1 # The `bpf' device enables the Berkeley Packet Filter. # Be aware of the administrative consequences of enabling this! device bpf # Berkeley packet filter 这是 Berkeley 包过滤器。这个伪设备允许网络接口被置于混杂模式, 从而,截获广播网 (例如,以太网) 上的每一个数据包。 截获的数据报可以保存到磁盘上,也可以使用 &man.tcpdump.1; 程序来分析。 在 &os; 4.X 中,应写作 pseudo-device bpf &man.bpf.4; 设备也被用于 &man.dhclient.8; 来获取默认路由器(网关)的 IP 地址。如果使用DHCP,就不要注释掉这行。 # USB support #device uhci # UHCI PCI->USB interface #device ohci # OHCI PCI->USB interface device usb # USB Bus (required) #device udbp # USB Double Bulk Pipe devices device ugen # Generic device uhid # Human Interface Devices device ukbd # Keyboard device ulpt # Printer device umass # Disks/Mass storage - Requires scbus and da device ums # Mouse device urio # Diamond Rio 500 MP3 player device uscanner # Scanners # USB Ethernet, requires mii device aue # ADMtek USB Ethernet device axe # ASIX Electronics USB Ethernet device cue # CATC USB Ethernet device kue # Kawasaki LSI USB Ethernet device rue # RealTek RTL8150 USB Ethernet 支持各类 USB 设备。 # FireWire support device firewire # FireWire bus code device sbp # SCSI over FireWire (Requires scbus and da) device fwe # Ethernet over FireWire (non-standard!) 支持各类火线设备。 要了解 &os; 所支持的设备的其他情况, 请参考 /usr/src/sys/i386/conf/NOTES 大内存支持(<acronym>PAE</acronym>) 物理地址扩展 (PAE) 大内存支持的配置 大内存配置的机器需要超过4GB的虚拟地址。 因为4GB的限制,Intel在&pentium;及后续的CPUs上增加了36位物理地址的支持。 &intel; &pentium; Pro和后续的CPUs允许内存地址扩展到64GB.(PAE) &os;通过选项来支持这个能力。 在&os; 4.X系列里面,4.9-RELEASE开始支持,&os; 5.X系列里面,从5.1-RELEASE开始支持。 in the 4.X series of &os; beginning with 4.9-RELEASE and in the 5.X series of &os; beginning with 5.1-RELEASE。因为Intel架构的限制, 高于或低于4GB都没有什么区别,内存分配到大于4GB仅仅是增加了可利用的内存池。 为了让内核支持PAE,只要增加下面这一行到配置文件: options PAE PAE在&os;里面现在只能支持 &intel; IA-32处理器。 同时,还应该注意,&os;的PAE支持没有经过广泛的测试, 和其他稳定的特性相比只能当作是beta版。 PAE在&os;下有如下的一些限制: 进程不能接触大于4GB的VM空间。 KLD 模块不能加载到一个打开了PAE支持的内核里面, 这是因为内核模块和内核的建立框架不一样。 没有使用&man.bus.dma.9;界面的设备驱动程序在打开了PAE支持的内核里面 会导致数据腐化(corruption)。因为这个原因,&os; 5.X的PAE内核配置文件 把所有在打开了PAE的内核上不能工作的驱动程序排除在外。 一些系统打开了探测系统内存资源使用能力的功能,因为打开了 PAE支持,这些功能可能会被覆盖掉。 其中一个例子就是内核参数,它是控制 内核能使用的最大vnodes数目的,建议重新调整它及其他类似参数到合适的值。 为了避免KVA的消耗,很有必要增加系统的内核虚拟地址, 或者减少很耗系统资源的内核选项的总量(看上面)。选项 可以用来增加KVA空间。 为了稳定和高性能,建议查看&man.tuning.7;手册页。&man.pae.4;手册页包含 &os;'sPAE支持的最新信息。 创建设备节点 设备节点 MAKEDEV 如果您在运行 &os; 5.0 或更高版本, 则可以略过这节。 新版本使用 &man.devfs.5; 来分配设备节点, 这一过程对用户是透明的。 内核中的几乎每个设备在 /dev 目录中都有对应的 节点 项。 这些节点看上去像是普通的文件, 但事实上却是程序在使用对应的设备时, 与内核联系的入口。 Shell 脚本 /dev/MAKEDEV 在首次安装操作系统时会创建几乎所有能够支持的设备节点。 然而, 它并不会创建 所有的 节点, 因此当您增加了某些设备的支持时, 就需要检查这个目录中是否有对应的项了, 如果没有, 就应该添加它们。 这有一个简单的例子: 假定在内核中加入了IDE CD-ROM的支持。可以这样加入: device acd0 这意味着您应当在/dev目录下找一些以acd0为起点的入口, 通常后面有一个字母,像是以c,或者r开头,表示这是一个raw设备。 如果那些文件不在那儿,就必须改变到/dev目录然后键入: MAKEDEV &prompt.root; sh MAKEDEV acd0 这些脚本完成后,您要在/dev目录下确认有acd0cracd0c等几个入口,这表示程序已经正确执行。 以下是加入声卡节点的例子: &prompt.root; sh MAKEDEV snd0 当创建完诸如声卡这样的设备节点时,如果其他人有权访问您的机器, 可能有必要在/etc/fbtab文件中添加这些节点来保护系统安全。 更多的信息参考&man.fbtab.5; 依上述的简单程序,建立任何不在GENERIC里的硬件设备节点 所有的SCSI控制器都使用一样的设备节点,所以您无须重新建立节点。 另外,网卡与SLIP/PPP虚拟设备并没有任何设备节点,所以您不必担心怎么建立节点。 如果出现问题怎么办 在定制一个内核时,可能会出现五种问题。它们是: config失败: 如果 &man.config.8; 在给出您的内核描述时失败, 则可能在某些地方引入了一处小的错误。 幸运的是, &man.config.8; 会显示出它遇到问题的行号, 这样您就能够迅速地定位错误。 例如, 如果您看到: config: line 17: syntax error 可以通过与 GENERIC 或其他参考资料对比, 来确定这里的关键词是否拼写正确。 make失败: 如果 make 命令失败, 它通常表示内核描述中发生了 &man.config.8; 无法找出的的错误。 同样地, 仔细检查您的配置, 如果仍然不能解决问题, 发一封邮件到 &a.questions; 并附上您的内核配置, 则问题应该很快就能解决。 安装新内核失败: 如果内核编译得很顺利, 但安装失败 (即 make installmake installkernel 命令失败), 第一件事是检查您的系统是否是以 1 或更高的安全级运行的 (参见 &man.init.8;)。 内核安装过程将尝试去掉原有内核的 immutable (不可改) 标志, 并在新的内核上设置它。 由于安全级 1 或更高的安全级会阻止修改系统中任何文件的这个标志, 因此安装内核需要 0 或者更低的安全级。 不过这只对 &os; 4.X 以及更早的版本有效。 &os; 5.X 以及之后的版本并不会给内核设置不可改标志, 因此安装失败可能说明发生了更深层次的问题。 内核无法启动: 如果您的内核无法启动, 或不识别您的设备, 千万别慌! 非常幸运的是, &os; 有一个很好的机制帮助您从不兼容的内核恢复。 在 &os; 启动加载器那里简单地选择一下要启动的内核就可以了。 当系统在引导菜单的 10 秒倒计时时进入它。 按下除了 Enter 之外的任意键, unload 然后输入 boot /boot/kernel.old/kernel, 或者其他任何一个可以正确引导的内核即可。 当重新配置内核时, 保持一个已经证明能够正常启动的内核永远是一个好习惯。 当使用好的内核启动之后您可以检查配置文件并重新尝试编译它。 比较有用的资源是 /var/log/messages 文件, 它会记录每次成功启动所产生的所有内核消息。 此外, &man.dmesg.8; 命令也会显示这次启动时产生的内核消息。 如果在编译内核时遇到麻烦, 请务必保留一个 GENERIC 或已知可用的其他内核, 并命名为别的名字以免在下次启动时被覆盖。 不要依赖 kernel.old 因为在安装新内核时, kernel.old 会被上次安装的那个可能不正常的内核覆盖掉。 另外, 尽快把可用的内核挪到 /boot/kernel 否则类似 &man.ps.1; 这样的命令可能无法正常工作。 为了完成这一点, 需要修改目录的名字: &prompt.root; mv /boot/kernel /boot/kernel.bad -mv /boot/kernel.good /boot/kernel +&prompt.root; mv /boot/kernel.good /boot/kernel 对于 &os; 5.X 之前的版本, 正确的 解除 make 所实施的保护的命令 (为了把另一个内核永久性地挪回来) 是: &prompt.root; chflags noschg /kernel 如果您发现您不能这样做,您的系统的安全级别可能大于0了。在/etc/rc.conf里面编辑 kern_securelevel并把它设置为-1然后重启。 当您很满意这个内核的时候,您可以再把设置改回去。 另外,如果您要锁住内核或其他文件,以致它不能被移动或修改, 可以用下面的命令: &prompt.root; chflags schg /kernel 内核工作,但是&man.ps.1;根本不工作: 如果您安装了一个与系统中内建工具版本不同的内核, 例如在 4.x 系统上安装了 5.x 的内核, 许多用于检查系统状态的工具如 &man.ps.1; 和 &man.vmstat.8; 都将无法正常使用。 您应该 重新编译一个和内核版本一致的系统。 这也是为什么一般不鼓励使用与系统其他部分版本不同的内核的一个主要原因。 diff --git a/zh_CN.GB2312/books/handbook/mail/chapter.sgml b/zh_CN.GB2312/books/handbook/mail/chapter.sgml index 28c42a506b..704674ee18 100644 --- a/zh_CN.GB2312/books/handbook/mail/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/mail/chapter.sgml @@ -1,1594 +1,1594 @@ Bill Lloyd Original work by Jim Mock Rewritten by 电子邮件 概述 email 电子邮件 电子邮件,或通常所说的 email,是现今使用最广泛的通信方式之一。 本章将对如何在 &os; 上运行邮件服务,以及如何使用 &os; 来收发电子邮件作基本的介绍; 然而,它并不是一份完整的参考手册,实际上,许多需要考虑的重要事项都没有提及。 我们推荐读者阅读 中的参考书籍,以获得对于这部分的全面认识。 读完这章,您将了解: 那些软件与收发电子邮件有关。 &os; 下的基本 sendmail 配置文件在哪里。 本地和远程邮箱之间的区别。 如何阻止垃圾邮件制造者非法地使用您的邮件服务器作为转发中继。 如何安装和配置用于替代 sendmail 的其他邮件传输代理。 如何处理常见的邮件服务器问题。 如何使用 SMTP 和 UUCP。 如何设置系统使其只能发送邮件。 如何在拨号连接时使用邮件。 如何配置 SMTP 验证以增加安全性。 如何安装并使用用户邮件代理,如 mutt 来收发邮件。 如何从远程的 POPIMAP 服务器上下载邮件。 如何在进入的邮件上自动地应用过滤器和规则。 阅读本章之前,您需要: 正确地配置您的网络连接 (). - + - + 正确地为您的邮件服务器配置 DNS 信息 - ()。 - + (). + - + 知道如何安装第三方软件 (). - + 使用电子邮件 POP IMAP DNS 邮件交换可以分为 5 部分。它们是: 用户端程序、服务端守护进程、DNS、远程或本地的邮箱、 当然,还有邮件主机自己。 用户端程序 这包括一些基于命令行的程序,例如 muttpineelmmail,以及类似 balsaxfmail 这样的 GUI 程序。 此外,还有我们更熟悉的WWW 浏览器这样的程序。 这些程序简单地通过调用服务守护进程把邮件事务交给本地的 邮件主机,或者通过 TCP 把邮件发出去。 邮件主机上使用的服务程序 邮件服务程序 sendmail 邮件服务程序 postfix 邮件服务程序 qmail 邮件服务程序 exim &os; 默认情况下采用 sendmail, 但它也支持为数众多的其它邮件服务程序, 这其中包括: exim; postfix; qmail. 邮件服务器后台守护程序通常有两个功能 — 接收外面发来的邮件和把邮件传送出去。 但它 负责使用类似 POPIMAP 这样的协议来帮您阅读邮件, 也不负责连接到本地的 mbox 或 Maildir 信箱。 您可能需要其它的 服务程序 来完成这些任务。 较早版本的 sendmail 有一些严重的安全问题, 他们可能导致攻击者从本地和/或远程操作您的电脑。 您应该确认自己使用的是最新版本以避免这些问题。 另外, 也可以从 &os; Ports Collection 来安装其它的 MTA Email 和 DNS 域名系统 (DNS) 及其服务程序 named 在email的投递过程当中扮演着很重要的角色。 为了能够从您的站点向其它的站点传递邮件, 服务程序需要通过 DNS 查找接收邮件的远程站点的位置。 类似地, 在远程站点向您的主机投递邮件时也会发生这样的查找。 MX 记录 DNS 负责将主机名映射为 IP 地址, 同时, 也需要保存递送邮件时所需要的信息, 这些信息称作 MX 记录。 MX (Mail eXchanger,邮件交换) 记录指定了哪个, 或哪些主机能够接收特定域下的邮件。 如果您没有为主机名或域名设置 MX 记录, 则邮件将被直接递交给主机名对应 IP 所在的主机。 您可以通过 &man.host.1; 命令来查找任何域或主机名对应的 MX 记录, 如下面的例子所示: &prompt.user; host -t mx FreeBSD.org FreeBSD.org mail is handled (pri=10) by mx1.FreeBSD.org 接收邮件 电子邮件 接收 为您的域接收邮件是通过邮件服务器来完成的。 它收集发送给您的域的那些邮件,并保存到 mbox (存储邮件默认的方法) 或 Maildir 格式, 这取决于您采用的配置。 一旦邮件被保存下来, 就可以在本地通过类似 &man.mail.1; 或 mutt 这样的程序, 或在远程通过 POPIMAP 这样的协议来读取了。 简单地说, 如果您只在本地阅读邮件,那就没有必要安装 POPIMAP 服务。 通过 <acronym>POP</acronym> 和 <acronym>IMAP</acronym> 访问远程的邮件 POP IMAP 如果希望在远程访问邮箱, 就需要访问 POPIMAP 服务器。 这些协议允许用户从远程方便地访问他们的信箱。 尽管 POPIMAP 都允许用户从远程访问信箱, 但 IMAP 有很多优点, 这包括: IMAP 既可以从远程服务器上抓取邮件, 也可以把邮件放上去。 IMAP 支持并发更新。 IMAP 对于使用低速网络的用户尤为有用, 因为它能够让这些用户把邮件的结构下载下去, 而无需立即下载整个邮件。 它还可以在服务器端执行类似查找这样的操作, 以减少客户机和服务器之间的通讯量。 您可以按照下面的步骤来安装和配置 POPIMAP 服务器: 选择一个最符合需要的 IMAPPOP 服务器。 下列 POPIMAP 服务器是最著名的, 而且都有很多成功案例: qpopper; teapop; imap-uw; courier-imap; 通过 ports collection 安装 POPIMAP 服务。 根据需要修改 /etc/inetd.conf 来加载 POPIMAP 服务。 此外还应注意的是 POPIMAP 传递的信息, 包括用户名和口令等等, 通常都是明文的。 这意味着如果您希望加密传输过程中的信息, 可能需要考虑使用 &man.ssh.1; 隧道。 关于如何实施隧道在 中进行了详细阐述。 操作本地的信箱 信箱可以在邮件服务器本地直接用 MUA 来进行操作。 这通常是通过 mutt 或 &man.mail.1; 这样的用用程序实现的。 邮件服务器 邮件服务器 邮件服务器是通过服务器给的一个名字,这也正是它能在您的主机和网络上发送和接收邮件的原因. Christopher Shumway 作者: <application>sendmail</application> 配置 sendmail &man.sendmail.8; 是 &os; 中的默认邮件传输代理 (MTA)。 sendmail 的任务是从邮件用户代理 (MUA) 接收邮件然后根据配置文件的定义把它们送给配置好的的寄送程序。 sendmail 也能接受网络连接, 并且发送邮件到本地邮箱或者发送它到其它程序。 sendmail 使用下列配置文件: /etc/mail/access /etc/mail/aliases /etc/mail/local-host-names /etc/mail/mailer.conf /etc/mail/mailertable /etc/mail/sendmail.cf /etc/mail/virtusertable 文件名 功能 /etc/mail/access sendmail 访问数据库文件 /etc/mail/aliases 邮箱别名 /etc/mail/local-host-names sendmail 接收邮件主机列表 /etc/mail/mailer.conf 邮寄配置程序 /etc/mail/mailertable 邮件分发列表 /etc/mail/sendmail.cf sendmail的主配置文件 /etc/mail/virtusertable 虚拟用户和域列表 <filename>/etc/mail/access</filename> 访问数据库定义了什么主机或者 IP 地址可以访问本地邮件服务器和它们是哪种类型的访问。 主机可能会列出 或者简单的通过 sendmail 的出错处理程序检测一个给定的邮件错误。 主机默认列出 ,允许传送邮件到主机, 只要邮件的最后目的地是本地主机。列出 将拒绝所有的邮件连接。如果带有 选项的主机将被允许通过这个邮件服务器发送邮件到任何地方。 配置<application>sendmail</application> 访问数据库 cyberspammer.com 550 We don't accept mail from spammers FREE.STEALTH.MAILER@ 550 We don't accept mail from spammers another.source.of.spam REJECT okay.cyberspammer.com OK 128.32 RELAY 在上面的例子中我们有 5 条记录。 与左边列表匹配的发件人受到右边列表动作的影响。 前边的两个例子给出了 sendmail 的出错处理程序检测到的错误代码。 当一个邮件与左边列表相匹配时,这个信息会被打印到远程主机上。 下一条记录拒绝来自 Internet 上的一个特别主机的邮件 another.source.of.spam。接下来的记录允许来自 okay.cyberspammer.com 的邮件连接, 这条记录比上面那行 cyberspammer.com 更准确。更多的准确匹配使不准确的匹配无效。最后一行允许电子邮件从主机和 128.32 开头的 IP 地址转发。 这些主机将被允许通过这台邮件服务器前往其它邮件服务器发送邮件。 当这个文件被升级的时候,您必须在 /etc/mail/ 运行 make 升级数据库。 <filename>/etc/mail/aliases</filename> 别名数据库包含一个扩展到用户,程序或者其它别名的虚拟邮箱列表。 下面是一些在 /etc/mail/aliases 中使用的例子: 邮件别名 root: localuser ftp-bugs: joe,eric,paul bit.bucket: /dev/null procmail: "|/usr/local/bin/procmail" 文件格式比较简单:邮箱名在冒号左边,右边是扩展的目标。 第一个例子简单的扩展邮箱 root 到邮箱 localuser,它可以在别名数据库中被找到。 如果没有找到匹配的,那么这个信息会被发送给本地用户 localuser。接下来的例子显示了一个邮件列表。 发送到 ftp-bugs 邮箱的邮件会被扩展为三个本地邮箱 joeericpaul。注意 一个远程邮箱可以用 user@example.com 的形式指定。 下个例子显示将邮件写到 /dev/null 文件。 最后一个例子向您展示了传送邮件到一个程序,在这个例子里邮件通过 &unix; 管道被写到 /usr/local/bin/procmail 标准输入里。 当这个文件被升级时, 您必须在/etc/mail/运行 make来升级数据库. <filename>/etc/mail/local-host-names</filename> 这是一个 &man.sendmail.8; 被接受为一个本地主机名的主机名列表。 可以放入任何 sendmail 将从那里收发邮件的域名或主机。例如,如果这个邮件服务器从域 example.com 和主机 mail.example.com 接收邮件,它的 local-host-names 文件,可以看起来象如下这样: example.com mail.example.com 当这个文件被升级,&man.sendmail.8; 必须重新启动,以便更新设置。 <filename>/etc/mail/sendmail.cf</filename> sendmail的主配置文件 sendmail.cf 控制着 sendmail 的所有行为, 包括从重写邮件地址到打印拒绝远程邮件服务器信息等所有事。 当然,作为一个不同的角色,这个配置文件是相当复杂的, 它的细节部分已经超出了本节的范围。幸运的是, 这个文件对于标准的邮件服务器来说很少需要被改动。 sendmail 主配置文件可以用 &man.m4.1; 宏定义 sendmail 的特性和行为。它的细节请看 /usr/src/contrib/sendmail/cf/README 当这个文件被修改时, sendmail 必须重新启动以便对新修改生效。 <filename>/etc/mail/virtusertable</filename> virtusertable 映射虚拟域名和邮箱到真实的邮箱。 这些邮箱可以是本地的、远程的、/etc/mail/aliases 中定义的别名或一个文件。 虚拟域邮件映射的例子 root@example.com root postmaster@example.com postmaster@noc.example.net @example.com joe 在上面这个例子里,我们映射了一个域 example.com。 这个文件用一个最初匹配的文件处理。第一项映射 root@example.com 到本地邮箱 root。下一项映射 postmaster@example.comnoc.example.net 主机的 postmaster 邮箱。最后,如果域 example.com 没有被什么匹配,它将与最后一个映射匹配,在 example.com 域,每个其它邮件信息地址到某一个主机被匹配。 在这里被映射到本地邮箱 joe Andrew Boothman Written by Gregory Neil Shapiro Information taken from e-mails written by 改变您的邮件传输代理程序 邮件 改变mta 先前已经提到,FreeBSD 中的 sendmail 已经安装了您的 MTA (邮件传输代理程序)。因此它它负责着您的收发邮件的工作。 然而,基于不同的理由,一些系统管理员想要改变他们系统的 MTA。这些理由从简单的想要尝试另一个 MTA,到需要一个特殊的特性或者 package 依赖某个邮寄程序等等。幸运的是,不管是什么理由,FreeBSD 都能容易的改变它。 安装一个新的 MTA 对于可用的 MTA 您有很多的选择。一个好的出发点是 FreeBSD Ports Collection,在那里您能找到很多。 当然您可以从任何位置不受任何限制的使用 MTA,只要您能让它运行在 FreeBSD 下。 开始安装您的新 MTA。一旦它被安装, 它可以让您有机会决定它是否能满足您的需要和在接管 sendmail 之前让您有机会配置您的新软件。 当完成这些之后,您应该确信安装的新软件不会尝试更改系统的二进制文件例如象 /usr/bin/sendmail。除此以外, 您的新邮件软件启用之前要已经配置好它。 具体配置请参考您所选择的 MTA 软件的配置文档或其它相关资料。 停用 <application>sendmail</application> 值得注意的是启动 sendmail 在 4.5-RELEASE 版本和 4.6-RELEASE 版本之间有些不同。因此,停用它的过程也稍有不同。 FreeBSD 4.5-STABLE 版本 2002/4/4 之前和更早前版本 (包括 4.5-RELEASE 及更早版本) 输入: sendmail_enable="NO" /etc/rc.conf 文件。它将停用 sendmail 接收邮件服务, 但是如果 /etc/mail/mailer.conf 文件(见下文) 没有被改变,sendmail 将仍然可以发送邮件。 FreeBSD 4.5-STABLE 版本 2002/4/4 之后和以后的版本 (包括 4.6-RELEASE 及后续版本) 为了完全的停用 sendmail,您必须在 /etc/rc.conf 文件里使用 sendmail_enable="NONE" 如果用这个方法停止 sendmail 的发送邮件服务,那么就必须有一个能够完全正常地工作的邮件发送系统。 如果不这样做的话,类似 &man.periodic.8; 这样的系统功能将无法正确地通过电子邮件将它们的执行结果送到通常希望的地方去。 系统中的很多部分都要求有和 sendmail 在功能上兼容的系统。 如果应用程序在您禁用之后仍然继续使用 sendmail 的执行文件来发送文件, 则这些邮件可能会进入睡眠的 sendmail 队列,并永远无法到达目的地。 如果只是想要停止 sendmail 的接收邮件服务, 您应该在 /etc/rc.conf 文件中设置 sendmail_enable="NO" 更多的有关 sendmail 可用的启动选项,参看 &man.rc.sendmail.8; 联机手册. 机器引导时运行您的新 MTA 您也许有两种方法在机器引导时运行您的新 MTA,这个也倚赖您所运行的 FreeBSD 版本。 FreeBSD 4.5-STABLE 版本 2002/4/11 以前 (包括 4.5-RELEASE 及更早版本) /usr/local/etc/rc.d/ 中添加一个以 .sh 为后缀的脚本文件, 并可以用 root 身份运行。这个脚本应该接受 startstop 参数。用如下命令启动这个脚本 /usr/local/etc/rc.d/supermailer.sh start 您也可以手工启动这个服务。如果想要停止它, 系统脚本将使用 stop 选项,运行如下命令 /usr/local/etc/rc.d/supermailer.sh stop 您也可以手工停止正在系统运行的服务。 FreeBSD 4.5-STABLE 版本 2002/4/11 以后 (包括 4.6-RELEASE 及后续版本) 在 FreeBSD 较后来的版本, 您可以使用上面的方法或者在 /etc/rc.conf 文件做如下设置 mta_start_script="filename" filename 是您想要在引导时执行的 MTA 脚本文件的名字。 替换系统默认的邮寄程序 <application>sendmail</application> 因为 sendmail 程序是一个在 &unix; 系统下普遍存在的一个标准的软件,一些软件就假定它已经被安装并且配置好。 基于这个原因,许多其它的 MTA 提供者都提供了兼容 sendmail 的命令行界面来执行。 这使它们象混入sendmail 一样变的很容易掌握。 因此,如果您使用其它的邮寄程序, 您必须确定这个软件是去尝试运行标准的 sendmail 二进制,就象 /usr/bin/sendmail,还是运行您自己选择的替换邮寄程序。 幸运的是,FreeBSD 提供了一个系统调用 &man.mailwrapper.8;,它能为您做这件工作。 sendmail 安装后被运行,您可以在 /etc/mail/mailer.conf 中找到如下行: sendmail /usr/libexec/sendmail/sendmail send-mail /usr/libexec/sendmail/sendmail mailq /usr/libexec/sendmail/sendmail newaliases /usr/libexec/sendmail/sendmail hoststat /usr/libexec/sendmail/sendmail purgestat /usr/libexec/sendmail/sendmail 这个的意思就是当这些公共命令 (例如 sendmail 它本身) 运行时, 系统实际上调用了一个 sendmail 指定的 mailwrapper 的副本,它检查 mailer.conf 并且运行 /usr/libexec/sendmail/sendmail 做为替代。当默认的 sendmail 功能被调用, 系统将很容易的改变实际上运行的二进制文件。 因此如果您想要 /usr/local/supermailer/bin/sendmail-compat 替换 sendmail 被运行,您应该改变 /etc/mail/mailer.conf 文件为: sendmail /usr/local/supermailer/bin/sendmail-compat send-mail /usr/local/supermailer/bin/sendmail-compat mailq /usr/local/supermailer/bin/mailq-compat newaliases /usr/local/supermailer/bin/newaliases-compat hoststat /usr/local/supermailer/bin/hoststat-compat purgestat /usr/local/supermailer/bin/purgestat-compat 最后 一旦做完您想要配置的每件事,您应该杀掉 sendmail 进程并且启动属于您的新软件的进程, 或者简单的重启。重启也将给您机会保证您正确的配置您的系统, 在引导的时候自动的运行您新的 MTA。 疑难解答 邮件 疑难解答 为什么必须在我的站点的主机上使用 FQDN? 您可能会发现主机实际上是在另外一个域里面, 例如,如果您是在 foo.bar.edu 里,而您要找一台叫 mumble 的主机,它在 bar.edu 域里,您就必须用完整的域名 mumble.bar.edu,而不是用 mumble BIND 传统上,这在 BSD BIND resolvers 中是可行的。 然而目前随 FreeBSD 附带的 BIND 已不为同一域外提供缩写服务。所以,这个不完整的主机名 mumble 必须以 mumble.foo.bar.edu 这种形式才能被找到, 或者将在根域中搜索它。 这跟以前的处理是不同的,以前版本将会继续寻找 mumble.bar.edumumble.edu。 如果您想要了解这种方式是否是好,或者它有什么安全方面的漏洞, 请参阅 RFC 1535 文档。 如果您想要一个好的工作环境,您可以使用如下行: search foo.bar.edu bar.edu 替换先前旧的版本: domain foo.bar.edu 把这行放在您的 /etc/resolv.conf 文件中。然而,请一定要确定这样的搜寻顺序不会造成 RFC 1535 里提到的boundary between local and public administration 问题。 MX record sendmail 提示信息 mail loops back to myself 下面是 sendmail FAQ 中的回答: 我得到了如下的信息: 553 MX list for domain.net points back to relay.domain.net 554 <user@domain.net>... Local configuration error 我如何解决这个问题? 您已经通过 MX 记录指定把发送给特定的域 (例如,domain.net) 的邮件被转寄到指定的主机 (在这个例子中,relay.domain.net), 而这台机器并不认为它自己是 domain.net。请把 domain.net 添加到 /etc/mail/local-host-names 文件中 [在 8.10 版之前是 /etc/sendmail.cw] (如果您使用 FEATURE(use_cw_file) 的话) 或者在 /etc/mail/sendmail.cf 中添加Cw domain.net sendmail 的 FAQ 可以在 找到, 如果您想要对您的邮件做任何的调整, 则推荐首先看一看它。 PPP 我如何在一个拨号主机上运行一个邮件服务? 您想要把局域网上的 FreeBSD 主机连接到互连网上,而这台 FreeBSD 主机将会成为这个局域网的邮件网关, 这个拨号连接不必一直保持在连接状态。 UUCP MX record 最少有两种方法可以满足您的要求。一种方法就是使用 UUCP。 另一种方法是找到一个专职的服务器来为您的域提供副 MX 主机服务。 例如,如果您公司的域名是 example.com,您的互连网服务提供者把 example.net 作为您域的副 MX 服务: example.com. MX 10 example.com. MX 20 example.net. 只有一台主机被指定当做您的最终收信主机 (在 example.com 主机的 /etc/mail/sendmail.cf 文件中添加 Cw example.com)。 sendmail 试图分发邮件的时候, 它会尝试通过 modem 连接到您 (example.com)。 因为您并不在线,所以总是会得到一个超时的错误。 sendmail 将会把邮件发送到副 MX 主机,也就是说,您的互连网服务提供者 (example.net)。副 MX 主机将周期性的尝试连接并发送邮件到您的主机 (example.com)。 您也许想要使用下面的这个登录脚本: #!/bin/sh # Put me in /usr/local/bin/pppmyisp ( sleep 60 ; /usr/sbin/sendmail -q ) & /usr/sbin/ppp -direct pppmyisp 如果您想要为一个用户建立一个分开登录的脚本, 您可以使用 sendmail -qRexample.com 替换上面的脚本。这样将使所有的邮件按照您的 example.com 队列立即被处理。 更深入的方法可以参考下面这段: 这段信息是从 &a.isp; 拿来的。 > 我们为用户提供副 MX 主机服务。用户每天都会上线好几次 > 并且自动把信件取回主 MX 主机 > (当有他们的邮件时我们并没有通知他们)。 > 我们的 mailqueue 程序每 30 分钟清一次邮件队列。那段时间他们 > 就必须上线 30 分钟以确保他们的信件送达他们的主 MX 主机。 > > 有任何指令可以用 sendmail 寄出所有邮件么? > 普通用户在我们的机器上当然没有 root 权限。 在 sendmail.cf 的privacy flags部分,有这样的设定 Opgoaway,restrictqrun 移除 restrictqrun 可以让非 root 用户启动队列处理的程序。 您可能也要重新安排您的 MX 设定。我们是用户的 MX 主机, 而且我们还设定了这个: # If we are the best MX for a host, try directly instead of generating # local config error. OwTrue 这样的话远程机器会直接把信送给您,而不会尝试连接您的用户的机器。 然后您就可以把邮件发送到您的用户。这个设定只对 主机有效,所以您必须要让您的用户在 DNS 中把他们的邮件主机设置为 customer.com或者 hostname.customer.com。只要为customer.com在 DNS 里添加一个 A 记录就可以了。 为什么当我发送邮件到其它主机总是有 Relaying Denied 出错信息? 默认的 FreeBSD 安装中, sendmail 会配置为只发送来自它所在主机上的邮件。 例如,如果有可用的 POP 服务器,则用户将可以从学校、 公司或其他什么别的地方检查邮件,但他们仍然无法从远程直接发送邮件。 通常,在几次尝试之后, MAILER-DAEMON 将发出一封包含 5.7 Relaying Denied 错误信息的邮件。 有很多方法可以避免这种现象。 最直截了当的方法是把您的 ISP 的地址放到 /etc/mail/relay-domains 文件中。 完成这项工作的简单的方法是: &prompt.root; echo "your.isp.example.com" > /etc/mail/relay-domains 建立或编辑这个文件以后您必须重新启动 sendmail。 如果您是一个管理员并且不希望在本地发送邮件, 或者想要在其它的机器甚至其它的 ISP 上使用一个客户端系统, 这个方法是很方便的。如果您仅有一到两个邮件帐户它也非常的有用。 如果有大量的地址需要添加, 您可以很简单的使用您喜欢的文本编辑器打开这个文件添加域名, 每行一个: your.isp.example.com other.isp.example.net users-isp.example.org www.example.org 现在邮件可以通过您的系统传送, 这个列表中存在的主机 (前提是用户在您的系统上已经有一个帐户) 将可以成功的发送。这是一个允许正常的远程用户从您的系统发送邮件, 并且阻止其它非法用户通过您系统发送垃圾邮件的好方法。 高级主题 下面这节将介绍邮件配置和为整个域安装邮件。 基本配置 邮件 配置 在邮箱外,只要您设置 /etc/resolv.conf 或者运行您自己的名字服务器,您就可以发送邮件到外部的主机。 如果您想要您的邮件发送给某个特定的 MTA(例如, sendmail) 在您的 FreeBSD 主机上,有两个方法: 运行您自己的域名服务器和您自己的域。例如, FreeBSD.org 获得直接分发给您主机的邮件。您可以直接使用您当前的 DNS 名称。例如,example.FreeBSD.org SMTP 不管您选择上面那种方法,为了直接在您的主机上发送邮件, 必须有一个静态的 IP 地址(不是象 PPP 拨号一样的动态地址)。 如果您在防火墙后面,它必须让 SMTP 协议通过。 如果您想要在您的主机上直接的收取邮件, 您必须确定两件事: MX 记录 确定在您 DNS 中的 MX 记录(最小编号的)指向您的 IP 地址。 确定在您 DNS 中的 MX 记录没有禁止您的主机。 上面的每条记录都允许您在您的主机直接接收邮件。 试试这个: &prompt.root; hostname example.FreeBSD.org &prompt.root; host example.FreeBSD.org example.FreeBSD.org has address 204.216.27.XX 如果您看到这些,直接使用 yourlogin@example.FreeBSD.org 应该没有问题 (假定 sendmail 已经 正确的运行在 example.FreeBSD.org)。 如果您看到这些: &prompt.root; host example.FreeBSD.org example.FreeBSD.org has address 204.216.27.XX example.FreeBSD.org mail is handled (pri=10) by hub.FreeBSD.org 所有发送到主机 (example.FreeBSD.org) 的邮件在相同的用户名下将会被 hub 终止的收集,而不是直接发送到您的主机。 上面的信息是通过您的 DNS 服务器来处理的。支持邮件路由信息的 DNS 记录是 邮件 交换 记录。如果 MX 记录不存在,邮件将通过它自己的 IP 地址被直接的发送到主机。 freefall.FreeBSD.org的MX记录如下所示: freefall MX 30 mail.crl.net freefall MX 40 agora.rdrop.com freefall MX 10 freefall.FreeBSD.org freefall MX 20 who.cdrom.com 正如您说看到的,freefall 有很多 MX 记录。 最小编号的 MX 记录是直接接收邮件的主机。如果因为一些原因它不可用,其它 (有时会访问backup MXes)接收信息将会暂时接替并做临时的排列。 为了有效的使用交换式 MX 站点,应当从您的机器上分离一些 Internet 连接。您的 ISP 或者其它友好的站点可以没有任何问题的为您提供这个服务。 Mail for Your Domain 为了设置一个邮件主机(又称邮件服务器) 您必须要把许多邮件发送到与它相连的几个工作站中。 基本上,您想要要求在您域的每个主机的所有邮件 (在这个例子里是 *.FreeBSD.org) 转向到您的邮件服务器,从而使您的用户可以在主邮件服务器里接收他们的邮件。 DNS 要使工作最简单,带有同样 用户名 的帐户应该同时存在于两台机器上。使用 &man.adduser.8; 来这样做。 您将使用的邮件主机必须为每个工作站指定一个邮件交换。您可以在 DNS 中这样配置: example.FreeBSD.org A 204.216.27.XX ; Workstation MX 10 hub.FreeBSD.org ; Mailhost 无论 A 记录指向哪,这将为工作站重新定位到邮件主机。邮件将被发送到 MX 主机。 您不能自己这样做除非您运行着一个 DNS 服务器。 如果不是这样,或者不能运行您自己的 DNS 服务器,告诉您的 ISP 或者给您提供 DNS 服务的人。 如果您正在使用虚拟邮件主机,下面的信息将会对您有用。 在这个例子里,我们假定您有一个客户并且他有自己的域, 这个例子中是 customer1.org,您要把 customer1.org 所有的邮件发送到您的邮件主机 mail.myhost.com。 您的 DNS 记录应该是这样: customer1.org MX 10 mail.myhost.com 需要有个 A 记录, 如果您只为域 customer1.org 处理邮件。 必须清楚 customer1.org 将不能工作,除非存在一个 A 记录。 最后一件您必须要做的事是告诉 sendmail 接受邮件的是什么域和(或)主机名。 这里有好几种方法。下面方法可以任选一种: 添加您的主机到 /etc/mail/local-host-names 文件中,如果您使用的是 FEATURE(use_cw_file)。如果您使用 sendmail 8.10 或者更高版本,文件是 /etc/sendmail.cw 添加一行 Cwyour.host.com 到您的 /etc/sendmail.cf/etc/mail/sendmail.cf 文件,如果您使用 sendmail 8.10 或者更高版本。 SMTP 与 UUCP sendmail 的配置,在 FreeBSD 中已经配置好为您的站点直接的连接 Internet。 如果站点希望他们的邮件通过 UUCP 交换,则必须安装其它的 sendmail 配置文件。 手工的配置 /etc/mail/sendmail.cf 是一个高级主题。sendmail 8 版本通过 &man.m4.1; 预处理生成一个配置文件,实际上这个配置发生在一个比较高的抽象层。 &man.m4.1; 配置文件可以在 /usr/src/usr.sbin/sendmail/cf 下找到。 如果您没有在系统上安装全部源码,则可以从单独的压缩文件中提取 sendmail 配置文件。假定您的 FreeBSD 源码 CDROM 已经被 mount: &prompt.root; cd /cdrom/src &prompt.root; cat scontrib.?? | tar xzf - -C /usr/src/contrib/sendmail 这个提取只有几百 K 字节。cf 目录中的 README 文件能够为您提供一个到 &man.m4.1; 配置的基本的介绍。 最好的支持 UUCP 传送的方法是使用 mailertable 的特点。建立一个资料库让 sendmail 可以使用它自己的路由决策。 首先,您必须建立您自己的 .mc 文件。 /usr/src/usr.sbin/sendmail/cf/cf 目录包含一些例子。 假定您已经命名自己的文件叫做 foo.mc, 您要做的只是把它转换成一个有效的 sendmail.cf &prompt.root; cd /usr/src/usr.sbin/sendmail/cf/cf &prompt.root; make foo.cf &prompt.root; cp foo.cf /etc/mail/sendmail.cf 一个典型的 .mc 文件看起来可能象这样: VERSIONID(`Your version number') OSTYPE(bsd4.4) FEATURE(accept_unresolvable_domains) FEATURE(nocanonify) FEATURE(mailertable, `hash -o /etc/mail/mailertable') define(`UUCP_RELAY', your.uucp.relay) define(`UUCP_MAX_SIZE', 200000) define(`confDONT_PROBE_INTERFACES') MAILER(local) MAILER(smtp) MAILER(uucp) Cw your.alias.host.name Cw youruucpnodename.UUCP accept_unresolvable_domainsnocanonifyconfDONT_PROBE_INTERFACES 特性将避免在传送邮件时使用DNS的机会。UUCP_RELAY 项是支持 UUCP 传送所必须的。简单的放入一个 Internet 上可以处理 UUCP 虚拟域地址的主机名。通常,您在这里填入您 ISP 邮件的回复处。 一旦您做完这些,您还需要这个 /etc/mail/mailertable 文件。 如果您只有一个用来传递所有邮件的对外通道的话, 以下的文件就足够了: # # makemap hash /etc/mail/mailertable.db < /etc/mail/mailertable . uucp-dom:your.uucp.relay 一个更复杂点的例子象这样: # # makemap hash /etc/mail/mailertable.db < /etc/mail/mailertable # horus.interface-business.de uucp-dom:horus .interface-business.de uucp-dom:if-bus interface-business.de uucp-dom:if-bus .heep.sax.de smtp8:%1 horus.UUCP uucp-dom:horus if-bus.UUCP uucp-dom:if-bus . uucp-dom: 头三行处理域地址邮件,不应该被传送出默认的路由, 而由某些 UUCP 邻居取代的特殊情况,这是为了走捷径。 下一行处理本地网的邮件让它可以使用 SMTP 来传送。 最后,UUCP 邻居提起。UUCP 虚拟域的记载, 允许一个 uucp-neighbor !recipient 推翻默认规则。最后一行则以一个单独的句点最为结束, 以 UUCP 传送到提供您所有的邮件网关的 UUCP 邻居。 所有在 uucp-dom: 关键字里的节点名称必须是有效的 UUCP 邻居,您可以用 uuname 去确认。 提醒您这个文件在使用前必须被转换成 DBM 数据库文件。最好在 mailertable 最上面用注解写出命令行来完成这个工作。 当您每次更换您的 mailertable 后您总是需要执行这个命令。 最后提示:如果您不确定某个特定的路径可用, 记得把 选项加到 sendmail。这会将 sendmail 启动在 地址检测模式。只要按下 3,0,接着输入您希望测试的邮件路径位置。 最后一行告诉您使用邮件代理程序, 代理程序会通知目的主机以及 (可能转换) 地址。 要离开此模式请按 CtrlD &prompt.user; sendmail -bt ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> > 3,0 foo@example.com canonify input: foo @ example . com ... parse returns: $# uucp-dom $@ your.uucp.relay $: foo < @ example . com . > > ^D Bill Moran Contributed by Setting Up to Send Only ** 翻译进行中 ** 拨号连接时使用邮件传送 如果您有静态的 IP 地址, 就应该不用修改任何默认的配置。 将主机名设置为分配给您的 Internet 名称,其他的事情 sendmail 都会替您做好。 如果您的 IP 地址是动态分配的, 并使用 PPP 连接拨入 Internet, 则您可能会从 ISP 的邮件服务器上得到一个信箱。 这里我们假设您的 ISP 的域名是 example.net, 您的用户名是 user, 您把自己的机器称作 bsd.home, 而您的 ISP 告诉您可以使用 relay.example.net 来转发邮件。 为了从邮箱收取邮件, 需要安装一个收信代理。 fetchmail 是一个能够支持许多种不同协议的不错的选择。 这个程序可以通过 package 或 ports collection (mail/fetchmail) 来安装。 通常, 您的 ISP 会提供 POP。 如果您使用用户 PPP,您还可以在 Internet 连接建立时自动地抓取邮件, 这可以通过在 /etc/ppp/ppp.linkup 中增加如下的项来实现: MYADDR: !bg su user -c fetchmail 如果您正使用sendmail (如下所示) 传送邮件到非本地帐户,这会强迫 sendmail 在连接网络后马上处理邮件进程队列,它在 /etc/ppp/ppp.linkup 文件执行 fetchmail 命令。 !bg su user -c "sendmail -q" 假设您有一个 user 帐户,在 bsd.home机器上。在 bsd.home 机器上的 user 目录里建立一个 .fetchmailrc文件: poll example.net protocol pop3 fetchall pass MySecret 这个文件除了 user 外不应该被任何人读取, 因为它包含了 MySecret 这个密码。 为了在发信时有正确的抬头 from:,您必须告诉 sendmail 使用 user@example.net 而非 user@bsd.home。您可能会希望告诉 sendmailrelay.example.net 发送所有邮件,加快邮件的传送。 以下的 .mc 文件应该可以满足您的需求: VERSIONID(`bsd.home.mc version 1.0') OSTYPE(bsd4.4)dnl FEATURE(nouucp)dnl MAILER(local)dnl MAILER(smtp)dnl Cwlocalhost Cwbsd.home MASQUERADE_AS(`example.net')dnl FEATURE(allmasquerade)dnl FEATURE(masquerade_envelope)dnl FEATURE(nocanonify)dnl FEATURE(nodns)dnl define(`SMART_HOST', `relay.example.net') Dmbsd.home define(`confDOMAIN_NAME',`bsd.home')dnl define(`confDELIVERY_MODE',`deferred')dnl 如何转换这个 .mc 文件到 sendmail.cf 文件的细节,请参考前面的章节。 另外,在更新 sendmail.cf 文件后, 不要忘记重启 sendmail James Gorham 作者: SMTP 验证 在您的邮件服务器上启用 SMTP 验证有很多好处。 SMTP 验证可以让 sendmail 多一重安全保障, 而且也使得使用不同机器的漫游用户能够使用同一个邮件服务器, 而不需要每次都修改它们的邮件客户端配置。 从 ports 中安装 security/cyrus-sasl。 您可以从 security/cyrus-sasl 找到它。 security/cyrus-sasl 有一系列编译时可选的选项, 包括我们将要使用的验证方式等等。请务必选择 安装完 security/cyrus-sasl 之后, 编辑 /usr/local/lib/sasl/Sendmail.conf (如果不存在则建立) 并在其中增加: pwcheck_method: passwd 这个方法将允许sendmail 依照您的 FreeBSD passwd 数据库进行验证。 这将为每个用户建立一个新用户名设置和口令使用 SMTP 验证减少麻烦,并且保证登录和邮件口令是相同的。 现在编辑 /etc/make.conf 文件,添加如下行: SENDMAIL_CFLAGS=-I/usr/local/include/sasl1 -DSASL SENDMAIL_LDFLAGS=-L/usr/local/lib SENDMAIL_LDADD=-lsasl 这些行将给 sendmail 合适的配置选项, 为在编译时间链接到 cyrus-sasl。 确定 cyrus-sasl 被安装之前重新编译 sendmail 重新编译 sendmail 运行如下命令: &prompt.root; cd /usr/src/usr.sbin/sendmail &prompt.root; make cleandir &prompt.root; make obj &prompt.root; make &prompt.root; make install 如果 /usr/src 和共享库没有大的变化并且它们都必须可用,sendmail 编译应该没有任何问题。 sendmail 被重新编译和安装后, 编辑您的 /etc/mail/freebsd.mc 文件 (或者无论您选择使用的您的哪个 .mc 文件。许多管理员选择使用跟 &man.hostname.1; 一样的唯一的 .mc 文件输出)。添加这些行在这个文件: dnl set SASL options TRUST_AUTH_MECH(`GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN')dnl define(`confAUTH_MECHANISMS', `GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN')dnl define(`confDEF_AUTH_INFO', `/etc/mail/auth-info')dnl 这些选项配置有不同的方法,对于 sendmail 验证用户。 如果您想要使用除 pwcheck 之外的方法,请参考相关文档。 最后,在 /etc/mail 运行 &man.make.1;。 它将建立您的新 .mc 文件并建立一个 .cf 文件命名为 freebsd.cf (或者您想使用您的其它名字的 .mc文件)。接着使用命令 make install restart,这将复制文件到 sendmail.cf,并且正确的重新启动 sendmail。 更多有关这个过程的信息,您可以参考 /etc/mail/Makefile 文件。 如果所每个步骤都做对了, 您应该可以通过您的邮件客户端进入您的登录信息并且传送一个测试信息。 更多的分析,设置 sendmail 到 13 并且查看 /var/log/maillog 中的信息。 您也许希望添加如下行到 /etc/rc.conf 文件, 这将允许服务在重起之后自动运行: sasl_pwcheck_enable="YES" sasl_pwcheck_program="/usr/local/sbin/pwcheck" 这将保证 SMTP_AUTH 初始化在系统启动时自动运行。 更多的信息,请参看 sendmail 相关页 SMTP 验证 Marc Silver Contributed by Mail User Agents ** 翻译进行中 ** Mail User Agents ** 翻译进行中 ** mail ** 翻译进行中 ** mutt ** 翻译进行中 ** pine ** 翻译进行中 ** Marc Silver Contributed by Using fetchmail ** 翻译进行中 ** Using fetchmail Marc Silver Contributed by Using procmail ** 翻译进行中 ** Using procmail diff --git a/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml b/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml index 05b3034231..5693d1dd0b 100644 --- a/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml @@ -1,2701 +1,2708 @@ 获取 FreeBSD CDROM 和 DVD 发行商 零售盒装产品 可以从下面几个零售商那里买到 FreeBSD 的盒装产品(FreeBSD CD, 附加软件,印刷文档):
CompUSA WWW:
Frys Electronics WWW:
CD 和 DVD 光盘 FreeBSD CD 和 DVD 光盘可以从许多在线零售商那里买到: + +
+ BSD-Systems + Email: info@bsd-systems.co.uk + WWW: +
+
+
Daemon News Mall 560 South State Street, Suite A2 Orem, UT 84058 USA Phone: +1 800 407-5170 Fax: +1 1 801 765-0877 Email: sales@bsdmall.com 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:
FreeBSD Services Ltd 11 Lapwing Close Bicester OX26 6XR United Kingdom 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:
Ingram Micro 1600 E. St. Andrew Place Santa Ana, CA 92705-4926 USA Phone: 1 (800) 456-8000 WWW:
JMC Software Ireland Phone: 353 1 6291282 WWW:
The Linux Emporium Hilliard House, Lester Way Wallingford OX10 9TA United Kingdom Phone: +44 1491 837010 Fax: +44 1491 837016 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:
UNIXDVD.COM LTD 57 Primrose Avenue Sheffield S5 6FS United Kingdom WWW:
发行人 如果您是销售商并且想销售 FreeBSD CDROM 产品, 请和发行人联系:
Cylogistics 2672 Bayshore Parkway, Suite 610 Mountain View, CA 94043 USA Phone: +1 650 694-4949 Fax: +1 650 694-4953 Email: sales@cylogistics.com WWW:
FreeBSD Services Ltd 11 Lapwing Close Bicester OX26 6XR United Kingdom 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 <anchor id="anoncvs-intro">概述 匿名 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 几乎是您唯一的选择。 <anchor id="anoncvs-usage">使用匿名 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.se.FreeBSD.org:/home/ncvs (仅 ssh - 无口令) 美国: freebsdanoncvs@anoncvs.FreeBSD.org:/home/ncvs (仅 ssh - 无口令) CVS 实际上允许检出 曾经存在的(或者,某种情况下将会存在)的 FreeBSD 源代码的任意版本,您需要熟悉 &man.cvs.1; 的修订()标签以及 在 FreeBSD 项目仓库中的一些许可值。 有两种标签,修订标签和分支标签。 修订标签特指一个特定的修订版本。含义始终是不变的。 分支标签,另一方面, 指代给定时间给定开发分支的最新修订, 因为分支标签不涉及特定的修订版本, 它明天所代表的含义就可能和今天的不同。 包括了用户可能感兴趣的 修订标签。 另外,这里面没有一个是对 ports collection 可用的因为 ports collection 没有多个修订版本。 当您指定一个分支标签,您通常会得到那个开发分支的文件的最新版本。 如果您希望得到一些旧的版本,您可以用 标记制定一个日期。 察看 &man.cvs.1; 手册页了解更多细节。 示例 在这之前强烈建议您通读 &man.cvs.1; 的手册页, 这里有一些简单的例子来展示如何使用匿名 CVS: 从 -CURRENT 检出些东西(&man.ls.1;) 然后再删除: &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.FreeBSD.org:/home/ncvs &prompt.user; cvs login 在提示符处,输入密码 anoncvs. &prompt.user; cvs co ls &prompt.user; cvs release -d ls &prompt.user; cvs logout 检出 &man.ls.1; 在 3.X-STABLE 分支 中的版本: &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.FreeBSD.org:/home/ncvs &prompt.user; cvs login 在提示符处,输入密码 anoncvs. &prompt.user; cvs co -rRELENG_3 ls &prompt.user; cvs release -d ls &prompt.user; cvs logout 创建 &man.ls.1; 的变化列表(用标准的 diff) &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.FreeBSD.org:/home/ncvs &prompt.user; cvs login 在提示符处,输入密码 anoncvs. &prompt.user; cvs rdiff -u -rRELENG_3_0_0_RELEASE -rRELENG_3_4_0_RELEASE ls &prompt.user; cvs logout 找出可以使用的其它的模块名: &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.FreeBSD.org:/home/ncvs &prompt.user; cvs login 在提示符处,输入密码 anoncvs. &prompt.user; cvs co modules &prompt.user; more modules/modules &prompt.user; cvs release -d modules &prompt.user; cvs logout 其他资源 下面附加的资源可能对学习 CVS 有帮助: CVS 指南 来自 Cal Poly。 CVS 主页, CVS 开发和支持论坛。 CVSweb 是 FreeBSD 项目的 CVS web 界面。 使用 CTM CTM 是保持远程目录树和中央服务器目录树同步的一种方法。 它被开发用于 FreeBSD 的源代码树,虽然其他人随着时间推移会发现它可以用于其他目的。 当前几乎没有,也或者只有很少的文档讲述创建 deltas 的步骤, 所以如果您希望使用 CTM 去做其它事情, 请联系 &a.ctm-users.name; 邮件列表了解更多信息。 为什么我该使用 <application>CTM</application>? CTM 会给您一份 FreeBSD 源代码树的本地拷贝。代码树有很多的 flavors 可用。不管您是希望跟踪完整的 CVS 树还是只是一个分支, CTM 都会给您提供信息。 如果您是 FreeBSD 上的一个活跃的开发者,但是缺乏或者不存在 TCP/IP 连接,或者只是希望把变化自动发送给您, CTM 就是适合您的。对于最积极的分支 您将会每天获得三个以上的 deltas。 然而,您应该考虑通过邮件来自动发送。 升级的大小总是保证尽可能的小。 通常小于 5K,也偶然(十分之一可能)会有 10-50K,也不时地有个大的 100K+ 甚至更大的。 您也需要让自己了解直接和开发代码而不是预发行版本打交道的各种警告。这种情况会很显著, 如果您选择了 current 代码的话。强烈建议您阅读和 FreeBSD 保持同步。 使用 <application>CTM</application> 我需要做什么? 您需要两样东西:CTM 程序,还有初始的 deltas 来 feed it(达到 current 级别)。 CTM 程序从版本 2.0 发布以来 已经是 FreeBSD 的一部分了,如果您有一份源代码拷贝的话它位于 /usr/src/usr.sbin/ctm 如果您再运行一个比 2.0 版本早的 FreeBSD 系统, 可以直接从下面下载最新的 CTM 源代码: 您喂给 CTMdeltas 可以有两种方式,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 系统的操作的公告。 点击上面的邮件列表名并按照指示订阅邮件列表。 第一次使用 <application>CTM</application> 在您开始使用 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。 在您的日常生活中使用 <application>CTM</application> 要应用 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 不会涉及到您的代码树的。您也可以使用 标记来校验 delta, 这样 CTM 就不会涉及代码树; 它会只校验 delta 的完整性看看是否可以安全的用于您的当前代码树。 CTM 还有其他的一些参数, 查看手册页或者源代码了解更多信息。 这真的就是全部的事情了。每次得到一个新的 delta,就通过 CTM 运行它来保证您的代码是最新的。 如果这些 deltas 很难重新下载的话不要删除它们。 有些东西坏掉的时候您会想到保留它们的。 即使您只有软盘,也请考虑使用 fdwrite 来做一份拷贝。 维持您本地的变动 作为一名开发者喜欢实验,改动代码树中的文件。 CTM 用一种受限的方式支持本地修改:再检查文件 foo 存在之前,首先查找 foo.ctm。如果这个文件存在, CTM 会对它操作而不是 foo 这种行为给我们提供了一种简单的方式来维持本地的改动: 只要复制您计划修改的文件并用 .ctm 的后缀重新命名。 然后就可以自由的修改代码了,CTM 会更新 .ctm 文件到最新版本。 其他有趣的 <application>CTM</application> 选项 正确的找出哪些将被更新 您可以确定变动列表, CTM 可以做到,在您的代码库上使用 CTM 选项。 这很有用如果您想要保存改动的日志, pre- 或者 post- 用各种风格处理修改的文件的纪录, 或者仅仅是想感受一下孩子般的疯狂。 在升级前制作备份 有时您可能想备份将要被 CTM 升级所改动的所有文件。 指定 选项会导致 CTM 备份将要被给定的 CTM delta 改动的所有文件到 backup-file 限定受升级影响的文件 有时您可能对限定一个给定的 CTM 升级的范围感兴趣,也有可能想知道怎样从一列 deltas 中解压缩一部分文件。 您可以通过使用 选项指定过滤规则表达式来控制 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 中指定的文件, 选项按照命令行给定的顺序应用。 文件只有在所有的 被应用之后标记为合格之后 才能被 CTM 操作。 <application>CTM</application> 未来的计划 其中几项: 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 文档和邮件列表时,您可能会看见 supSupCVSup 的前身,有着相似的目的。 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 GUInet/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= 值字段 指定一个您想要的版本。 仔细的正确指定任何 tag= 字段。有一些 tag 只对特定的 collection 文件合法。 如果您指定了一个不正确的或者 拼写错误的 tag,CVSup 会删除您可能不想删除的文件。 特别地,对 ports-* collection 使用 tag=. tag= 字段在仓库中表示为一个符号标签。 有两种标签,修订标签和分支标签。 修订标签代表一个特定的修订版本。 它的含义是一成不变的。 分支标签,另一方面,代表给定开发线上给定时间的最新修订。 因为分支标签不代表一个特定的修订版本, 它明天的含义就可能和今天的有所不同。 包含了用户可能感兴趣的分支标签。 当在 CVSup 的配置文件中指定标签的时候,必须用 tag= 开头 (RELENG_4 会变成 tag=RELENG_4)。 记住只有 tag=. 是 ports collection 相适应的。 注意像看到的那样正确的输入标签名。 CVSup 不能辨别合法和不合法标签。 如果您拼写错了标签名, CVSup 会像您指定了一个没有任何文件的合法标签一样工作, 那会删除您已经存在的代码。 当您指定一个分支标签的时候,您通常会收到开发线上文件的最新版本。 如果您希望接收一些过时的版本,您可以通过用 值字段指定一个日期来做到。 &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 运行的特定时刻, 您都可以在命令行上使用 选项来覆盖主机设置。 您想把它们放在 您自己机器的什么地方? prefix= 字段告诉 cvsup 把接收的文件放在哪里。 在这个例子里,我们把源代码文件直接放进我们的主源代码树, /usr/srcsrc 目录已经隐含在我们选择接收的 collection 里了, 所以正确的写法是: *default prefix=/usr cvsup 在哪里维护它的状态文件? CVSup 客户端在被叫做 base 的目录里维护了几个状态文件。 这些文件帮助 CVSup 更有效的工作, 通过跟踪您已经接收到哪些更新的方式。 我们将使用标准的 base 目录, /var/db *default base=/var/db 这个设置如果没有在 supfile 中指定的话就会被使用, 所以实际上我们不需要上面这行。 如果您的 base 目录还不存在,现在最好创建它。 如果 base 目录不存在,cvsup 客户端会拒绝工作。 其他的 supfile 设置: supfile 中有一些其他选项需要介绍一下: *default release=cvs delete use-rel-suffix compress release=cvs 显示服务器应该从 FreeBSD 的主 CVS 仓库中获取信息。 事实上总是这样的,但是也有可能会超出这个讨论的范围。 deleteCVSup 权限删除文件。 您应该总是指定这个,这样 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 <filename>refuse</filename> 文件 像上面提到的,CVSup 使用一种 pull 方法。基本上,这意味着您要连接到 CVSup 服务器,服务器说, 这有些您能下载的东西 ...,然后您的客户端反应好,我要这个, 这个,这个,还有这个。在默认的配置中, CVSup 客户端会取回您在配置文件中选定的 collection 和标签的每个文件。 然而,并不总是您想要的, 尤其是您在同步 docports,或者 www 树 — 大部分人都不能阅读四种或者五种 语言,因此他们不需要下载特定语言的文件。 如果您在 CVSup ports collection,您 可以通过单独指定每个 collection 来避免这个 (比如,ports-astrologyports-biology,等等取代简单的说明 ports-all)。然而,因为 docwww 树没有特定语言的 collection,您必须 使用 CVSup 许多极好的特性之一: refuse 文件。 refuse 文件本质上是告诉 CVSup 它不应该从 collection 中取得某些文件;换句话说,它告诉客户端 拒绝 来自服务器的特定的文件。 refuse 文件可以在 base/sup/ 中找到(或者,如果您没有,应该创建一个)。 base 在您的 supfile 中定义; 默认情况下,base 就是 /var/db, 这意味着默认的 refuse 文件就是 /var/db/sup/refuse refuse 文件的格式很简单; 它仅仅包含您不希望下载的文件和目录名。 例如,如果您除了英语和一些德语之外不会讲其他语言, 而且感觉不需要使用德语应用程序(或者除了英语之外任何语言的应用程序), 您可以把下面这些放在您的 refuse 文件里: ports/arabic ports/chinese ports/french ports/german ports/hebrew ports/hungarian ports/japanese ports/korean ports/polish ports/portuguese ports/russian ports/ukrainian ports/vietnamese 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/zh_* 等等其他语言(您可以通过浏览 FreeBSD CVS 仓库找到完整的列表)。 有这个非常有用的特性,那些慢速连接或者要为他们的 Internet 连接按时付费的用户就可以节省宝贵的时间因为他们不再需要 下载那些从来不用的文件。要了解 refuse 文件的更多信息以及其它 CVSup 的优雅的特性,请浏览它的 手册页。 运行 <application>CVSup</application> 您现在准备尝试升级了。命令很简单: &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 告诉 CVSup 不要使用 GUI。如果您 没在运行 X11 这个是自动的,否则您必须指定它。 告诉 CVSup 输出所有正在升级的文件的细节。 有三个等级可以选择,从 。默认是 0,意味着除了错误消息 什么都不输出。 还有许多其它的选项可用。想要一个简短的列表, 输入 cvsup -H。要查看更详细的描述, 请查看手册页。 一旦您对升级工作的方式满意了,您就 可以使用 &man.cron.8; 来安排规则的运行 CVSup。 很显然的,您不应该让 CVSup 通过 &man.cron.8; 运行的时候使用它的 GUI。 <application>CVSup</application> 文件 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-archivers release=cvs 存档工具。 ports-astro release=cvs 天文相关的 ports。 ports-audio release=cvs 声音支持。 ports-base release=cvs Ports Collection 构建下部构造 - 位于 /usr/portsMk/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-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-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-security release=cvs 安全工具。 ports-shells release=cvs 命令行 shell。 ports-sysutils release=cvs 系统实用工具。 ports-textproc 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 X11 服务器。 ports-x11-wm X11 窗口管理器。 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; CVS 标签 当使用 cvs 或者 CVSup 获取和升级源代码的时候,必须指定一个修订标签。 修订标签代表 &os; 开发的一个特定分支, 或者一个特定的时间点。第一种叫做 分支标签,第二种叫做 版本标签 分支标签 所有这些,除了 HEAD (这个总是 合法标签)以外,只适用于 src/ 树。ports/doc/,和 www/ 树没有分支。 HEAD 主线的符号名,或者说 FreeBSD-CURRENT。 当没有指定修订版本的时候也是默认的。 CVSup 里,这个标签通过 一个 . 来反映出来(不是标点,而是一个 . 字符)。 在 CVS 里,当没有修订标签指定时这是默认的。 在一台 STABLE 机器上检出或者升级到 CURRENT 源代码 通常不是 一个好主意,除非这是您的本意。 RELENG_5 FreeBSD-5.X 的开发分支, 在 FreeBSD-5.3 之后, 它将成为 FreeBSD-STABLE。 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_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 InformationRelease Process 文档中被详细描述。 src 树使用 以 RELENG_ 开头的标签。 portsdoc 树使用以 RELEASE 开头的标签。 最后,www 树没有 任何特定发行名称的标记。 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/3/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/network-servers/chapter.sgml b/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml index fa85b95a6a..cfea8fff63 100644 --- a/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml @@ -1,1146 +1,2304 @@ Murray Stokely Reorganized by - Network Servers + 网络服务器 概要 本章将覆盖某些在 &unix; 系统上常用的网络服务。话题将会涉及 如何安装、配置、测试和维护多种不同类型的网络服务。本章节中将提 供大量配置文件的样例,期望能够对您有所裨益。 在读完本章之后,您将会知道: 如何管理inetd 如何设置运行一个网络文件系统。 如何配置一个网络信息服务器以共享用户帐号。 如何通过DHCP自动配置网络。 如何配置一个域名服务器。 如何设置Apache HTTP 服务器。 如何设置文件传输(FTP)服务器。 如何使用Samba为 &windows; 客户端设置文件和打印服务。 如何同步时间和日期,以及如何设置使用NTP协议的时间服务器。 在阅读此章节之前,您应当: 理解有关/etc/rc中脚本的基本知识。 熟悉基本网络术语。 懂得如何安装额外的第三方软件()。 Chern Lee Contributed by <application>inetd</application> <quote>超级服务器</quote> 总览 &man.inetd.8; 被称为Internet Super-Server, 因为它管理几个守护程序的链接。提供网络 服务的程序被称为守护进程。inetd 作为一个为其他服务的管理服务器,当一个被inetd 收到后,它将决定连接将前往哪个程序,然后拉起对应的守护进程, 并将socket转交过去。 比起来将所有守护进程以stand-alone模式 运行,运行单个inetd实例可以降低 系统开销。 一般说来,inetd 被用来拉起 其他守护进程,不过有些细碎的协议被直接接管,比如chargenauth,和 daytime 这一部分将通过命令行选项和/etc/inetd.conf 文件来介绍配置inetd 的基础知识。 设置 inetd 通过 /etc/rc.conf 系统进行初始化。inetd_enable 选项默认被设定为 NO,不过可以通过sysinstall打开, 如果选用中等安全的模板。在/etc/rc.conf中设定: inetd_enable="YES"inetd_enable="NO" 可以激活或者禁止inetd在启动时加载。 此外,可以通过inetd_flags把不同的 命令行参数传给inetd 命令行选项 inetd 语法: -d 打开调试选项。 -l - 纪录成功的连接 + 记录成功的连接 -w 为外部服务打开TCP Wrapping(默认)。 -W inetd的内置服务打开TCP Wrapping (默认)。 -c maximum 指定单个服务的最大并发访问数量,默认为不限。 也可以在此服务的具体配置里面通过改掉。 -C rate 指定单个服务一分钟内能被单个IP地址调用的最大次数, 默认不限。也可以在此服务的具体配置里面通过 改掉。 -R rate 指定单个服务一分钟内能被调用的最大次数,默认为256。 设为0 则允许不限次数调用。 -a 指定绑定的IP地址。此外,可以使用主机名,这样系统就 可以根据主机名对应的IPV4或者IPV6来选择绑定地址。通常当 inetd 在 &man.jail.8; 中运行 的时候指定主机名,这种情况下主机名来自 &man.jail.8; 环 境变量 当使用主机名方式时,如果IPV4和IPV6都会被绑定到服务, 那么,需要在/etc/inetd.conf.中为该服务 - 的每个对应协议添加一条记录。比如,一个TCP服务需要两条纪录, + 的每个对应协议添加一条记录。比如,一个TCP服务需要两条记录, 一条使用tcp4,另一条使用tcp6 -p 指定用来存放进程ID的文件。 以上选项在/etc/rc.conf中将可以 被inetd_flags开关传递给inetd。 默认情况下,inetd_flags 被置为 -wW,也既是对inetd的内置或外部服务打开TCP wrapping. 对于新手,通常不用去动这些参数,就算它们出现在/etc/rc.conf里头。 inetd而言,所谓外部服务是当 连接请求到来时,被调用并接受连接,启动于inetd之外的守护进程。 反之,内置服务则是那些inetd自己可 以完全处理的了。 <filename>inetd.conf</filename> inetd的配置通过 /etc/inetd.conf文件进行控制。 /etc/inetd.conf内容发生改变,可以 对inetd进程发送一个HangUP信号,以强制 inetd重新读取配置文件,如下所示: 对 <application>inetd</application>发送HangUP信号 &prompt.root; kill -HUP `cat /var/run/inetd.pid` 配置文件中的每一行都是一个独立服务。如果要注释掉该服务,可以在行首加上 #/etc/inetd.conf的格式如下: service-name socket-type protocol {wait|nowait}[/max-child[/max-connections-per-ip-per-minute]] user[:group][/login-class] server-program server-program-arguments ftpd使用IPv4的例子: ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l service-name 指明各个服务的服务名。其服务名必须与/etc/services中列出的一致。 这将决定inetd会监听哪个port。 一旦有新的服务需要添加,必须先在/etc/services里面添加。 socket-type 可以是streamdgramraw或者 seqpacketstream 用在基于连接的,TCP 服务;而dgram被用于服务用于UDP传输协议。 protocol 下列之一: 协议 说明 tcp, tcp4 TCP IPv4 udp, udp4 UDP IPv4 tcp6 TCP IPv6 udp6 UDP IPv6 tcp46 Both TCP IPv4 and v6 udp46 Both UDP IPv4 and v6 {wait|nowait}[/max-child[/max-connections-per-ip-per-minute]] 指明从inetd 里头调用的服务是否可以自己处理socket. socket类型必须使用, 而stream socket daemons, 由于通常使用多线程方式,应当使用 . 通常usually 把多个socket丢给单个服务进程, 而 则 会为每个新的socket生成一个子进程。 使用选项可以设定针对服务, inetd可以派生出来的最大子进程数量。 如果某特定服务需要限定最高10个实例,把/10 放到后头就可以了。 之外,还有一个开关可以限制 来自同一个地方,针对某个服务的最大连接数。这个开关就是: 。 比如,设定该值为10就可以限定单个IP地址去向某服务的连接最大 为每分钟十个。这个对于防止有意或者无意的资源耗尽或者拒绝服 务(DoS)颇有用处。 在这部分,必须选择 则为可有可无。 一个stream-type多线程的服务,如果没有 或者 需要, 一般使用: nowait 同样的服务,如果需要限制最大连接数,则如下: nowait/10 此外,如果要限制每分钟单个IP来访连接为20个,同时最多 派生10个进程,可以如下: nowait/10/20 以上开关都默认被使用在fingerd服务上面, 如下所示: finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -s user 该开关指定服务将以什么用户身份运行。一般而言,服务运行身份是 root。基于安全目的,可以看到有些服务以 daemon身份,或者是最小特权的 nobody身份运行。 server-program 当连接到来时,执行服务程序的全路径。如果服务是由 inetd内置提供的,以代替。 server-program-arguments 调用到时,该开关 的值通过argv[0]通过传递给服务而工作。 如果命令行为:mydaemon -d,则 mydaemon -d 开关的值。同样的,如果服务是由inetd 内置提供的,这里还是 Security 随安装时候选择的安全模式不同,部分inetd的服务 会被设为默认打开。如果没有确实的需要,禁止它们!只要在/etc/inetd.conf里头 需要禁止的服务前头加上#,然后 对inetd发送hangup信号。某些服务,比如fingerd, 由于对攻击者提供太多信息,可能对任何人都应该禁止。 某些服务在安全上没有考虑,并且有一些连接超时检测设得很长或没有检测机制。 这回允许攻击者慢慢地发送连接,这样可以导致可用资源的消耗。在某些服务上面加上 的限制似乎不错。 默认情况下,TCP wrapping 是打开的。参考 &man.hosts.access.5; 手册,以获得更多关于在各种inetd 调用的服务上设置TCP限制的信息。 杂项 daytimetimeechodiscardchargen, 和 auth 都是inetd内置的服务。 auth服务提供 identity (identidentd)网络服务,并且某种程度上可配置。 参考 &man.inetd.8; 手册获得更多信息。 Tom Rhodes Reorganized and enhanced by Bill Swingle Written by 网络文件系统(NFS) NFS 网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS. NFS允许一个系统在网络上与它人共享目录和文件。通过使用NFS,用户和程序可以象访问本地文件 一样访问远端系统上的文件。 以下是NFS最显而易见的好处: 本地工作站使用更少的磁盘空间,因为通常的数据可以存放在一 台机器上而且可以通过网络访问到。 用户不必在每个网络上机器里头都有一个home目录。Home目录 可以被放在NFS服务器上并且在网络上处处可用。 诸如软驱,CDROM,和 &iomegazip; 之类的存储设备可以在网络上面被别的机器使用。 这可以减少整个网络上的可移动介质设备的数量。 <acronym>NFS</acronym>是如何工作的 NFS至少有两个主要部分:一台服务器和一 台(或者更多)客户机。客户机远程访问存放在服务器上的数据。为了 正常工作,一些进程需要被配置并运行。 在 &os; 5.X上面,portmaprpcbind替换了。而且,在&os; 5.X上面, the user is required to replace every instance of portmap with rpcbind in the forthcoming examples。 服务器必须运行以下服务: NFS server file server unix clients portmap mountd nfsd 服务 描述 nfsd NFS,为来自NFS客户端的 请求服务。 mountd NFS挂载服务,处理&man.nfsd.8;递交过来的请求。 portmap portmap服务允许 NFS客户端查看NFS服务在用的端口。 客户端同样运行一些进程,比如 nfsiodnfsiod处理来自NFS的请求。 这是可选的,而且可以提高性能,对于普通和正确的操作来说并不是必须的。 参考&man.nfsiod.8;手册获得更多信息。 配置<acronym>NFS</acronym> NFS configuration NFS的配置过程相对简单。这个过程只需要 对/etc/rc.conf文件作一些简单修改。 NFS服务器这端,确认/etc/rc.conf 文件里头以下开关都配上了: portmap_enable="YES" nfs_server_enable="YES" mountd_flags="-r" 只要NFS服务被置为enable,mountd 就能自动运行。 在客户端一侧,确认下面这个开关出现在 /etc/rc.conf里头: nfs_client_enable="YES" /etc/exports文件指定了哪个文件系统 NFS应该输出(有时被称为共享)。 /etc/exports里面每行指定一个输出的文件系统和 哪些机器可以访问该文件系统。在指定机器访问权限的同时,访问选项 开关也可以被指定。有很多开关可以被用在这个文件里头,不过不会在这 里详细谈。您可以通过阅读&man.exports.5; 手册来发现这些开关。 以下是一些/etc/exports的例子: NFS export examples 紧接着的这个例子说明了如何输出一个文件系统,尽管具体设定和您 的环境以及网络配置有关。作为实例,为了输出/cdrom 到三个的例子机器,它们有同样域名(因此他们的域名不大对)或者在您的 - /etc/hosts文件里头有纪录。 + /etc/hosts文件里头有记录。 标志将被输出的文件系统置为只读。由于这个标志,远程系统将无法在被输出 的文件系统上写入任何变动。 /cdrom -ro host1 host2 host3 下面的例子可以输出/home给三个以IP地址方式表示的主机。 对于在没有配置DNS服务器的私有网络里头,这很有用。 此外,the /etc/hosts 文件也可以用以配置主机名;参看 &man.hosts.5; 。 标记允许子目录被作为挂载点。 也就是说,客户端可以根据需要挂载需要的目录。 /home -alldirs 10.0.0.2 10.0.0.3 10.0.0.4 下面几行输出 /a ,以便两个来自不同域的客户端可以访问文件系统。 标记授权远端系统上的 root 用户在被输出的文件系统上以root身份进行读写。 如果没有特别指定 -maproot=root 标记, 则即使用户在远端系统上是 root 身份, 也不能修改被输出文件系统上的文件。 /a -maproot=root host.example.com box.example.org 为了能够访问到被输出的文件系统,客户端必须被授权。 请确认客户端在您的 /etc/exports 被列出。 /etc/exports 里头,每一行里面,输出信息和文件系统一一对应。 一个远程主机每次只能对应一个文件系统。而且只能有一个默认入口。比如,假设 /usr 是独立的文件系统。这个 /etc/exports 就是无效的: /usr/src client /usr/ports client 一个文件系统,/usr, 有两行指定输出到同一主机, client. 解决这一问题的正确的格式是: /usr/src /usr/ports client The properties of one filesystem exported to a given host must all occur on one line. Lines without a client specified are treated as a single host. This limits how you can export filesystems, but for most people this is not an issue. 下面是一个有效输出列表的例子, /usr and /exports 是本地文件系统: # Export src and ports to client01 and client02, but only # client01 has root privileges on it /usr/src /usr/ports -maproot=root client01 /usr/src /usr/ports client02 # The client machines have root and can mount anywhere # on /exports. Anyone in the world can mount /exports/obj read-only /exports -alldirs -maproot=root client01 client02 /exports/obj -ro 一旦修改 /etc/exports 了之后, 为了让变动生效,您必须重启 mountd。 可以通过对mountd 进程发送HUP信号重启: &prompt.root; kill -HUP `cat /var/run/mountd.pid` 另外,系统重启动可以让FreeBSD把一切都弄好。尽管如此,重启不是必须的。 以 root 身份执行下面的命令可以搞定一切。 NFS 服务器端: &prompt.root; portmap &prompt.root; nfsd -u -t -n 4 &prompt.root; mountd -r NFS 客户端: &prompt.root; nfsiod -n 4 现在每件事情都应该就绪,以备挂载一个远端文件系统。 在这些例子里头, 服务器名字将是:server ,而客户端的名字将是: client。 如果您只打算临时挂载一个远端文件系统或者只是打算作测试配置正确与否, 只要在客户端以 root 身份执行下面的命令: NFS mounting &prompt.root; mount server:/home /mnt 这条命令会把服务端的 /home 目录挂载到客户端的 /mnt 上。 如果配置正确,您应该可以进入客户端的 /mnt 目录并且看到所有服务端的文件。 如果您打算让系统每次在重启动的时候都自动挂载远端的文件系统,把那个文件系统加到 /etc/fstab 文件里头去。下面是例子: server:/home /mnt nfs rw 0 0 &man.fstab.5; 手册里有所有可用的开关。 实际应用 NFS 有很多实际应用。下面是比较常见的一些: NFS uses 多个机器共享一台CDROM或者其他设备。这对于在多台机器中安装软件来说更加便宜跟方便。 在大型网络中,配置一台中心 NFS 服务器用来放置所有用户的home目录可能会带来便利。 这些目录能被输出到网络以便用户不管在哪台工作站上登录,总能得到相同的home目录。 几台机器可以有通用的/usr/ports/distfiles 目录。 这样的话,当您需要在几台机器上安装port时,您可以无需在每台设备上下载而快速访问源码。 Wylie Stilwell Contributed by Chern Lee Rewritten by 使用 <application>amd</application> 自动挂载 ** 翻译进行中 ** John Lind Contributed by Problems Integrating with Other Systems ** 翻译进行中 ** Bill Swingle Written by Eric Ogren Enhanced by Udo Erdelhoff Network Information System (NIS/YP) ** 翻译进行中 ** Udo Erdelhoff Contributed by Using Netgroups ** 翻译进行中 ** Important Things to Remember ** 翻译进行中 ** NIS Servers That Are Also NIS Clients ** 翻译进行中 ** Greg Sutter Written by 网络自动配置 (DHCP) 安装和配置 DHCP 服务器 这一章包含哪些内容 这一章提供了关于如何在 FreeBSD 系统上使用 ISC (Internet 软件协会) 的 DHCP 实现套件来架设 DHCP 服务器的信息。 DHCP 套件中的服务器部分并没有作为 FreeBSD 的一部分来提供, 因此您需要安装 net/isc-dhcp3-server port 才能提供这个服务。 请参见 以了解关于如何使用 ports collection 的进一步详情。 安装 DHCP 服务器 DHCP 安装 为了在您的 FreeBSD 系统上进行配置以便作为 DHCP 服务器来使用, 需要把 &man.bpf.4; 设备编译进内核。 要完成这项工作, 需要将 device bpf (如果使用 &os; 4.X 的话, 则写作 pseudo-device bpf) 加入到您的内核配置文件中, 并重新联编内核。 要得到关于如何联编内核的进一步信息, 请参见 bpf 设备是 FreeBSD 所附带的 GENERIC 内核中已经联入的组件, 因此您并不需要为了让 DHCP 正常工作而特地定制内核。 如果您有较强的安全意识, 应该注意 bpf 同时也是让听包程序能够正确工作的设备 (尽管这类程序仍然需要以特权用户身份运行)。 bpf 使用 DHCP 所必需的, 但如果您对安全非常敏感, 您可能会不希望将 bpf 放进内核, 直到您真的认为 DHCP 是必需的为止。 接下来要做的是编辑示范的 dhcpd.conf, 它由 net/isc-dhcp3-server port 安装。 默认情况下, 它的名字应该是 /usr/local/etc/dhcpd.conf.sample, 在开始修改之前, 您需要把它复制为 /usr/local/etc/dhcpd.conf 配置 DHCP 服务器 DHCP dhcpd.conf dhcpd.conf 包含了一系列关于子网和主机的定义, 下面的例子可以帮助您理解它: option domain-name "example.com"; option domain-name-servers 192.168.4.100; option subnet-mask 255.255.255.0; default-lease-time 3600; max-lease-time 86400; ddns-update-style none; subnet 192.168.4.0 netmask 255.255.255.0 { range 192.168.4.129 192.168.4.254; option routers 192.168.4.1; } host mailhost { hardware ethernet 02:03:04:05:06:07; fixed-address mailhost.example.com; } 这个选项指定了提供给客户机作为默认搜索域的域名。 请参考 &man.resolv.conf.5; 以了解关于这一概念的详情。 这个选项用于指定一组客户机使用的 DNS 服务器, 它们之间以逗号分隔。 提供给客户机的子网掩码。 客户机可以请求租约的有效期, 而如果没有, 则服务器将指定一个租约有效期, 也就是这个值 (单位是秒)。 这是服务器允许租出地址的最大时长。 如果客户机请求了更长的租期, 则它将得到一个地址, 但其租期仅限于 max-lease-time 秒。 这个选项用于指定 DHCP 服务器在一个地址被接受或释放时是否应对应尝试更新 DNS。 在 ISC 实现中, 这一选项是 必须指定的 指定地址池中可以用来分配给客户机的 IP 地址范围。 在这个范围之间, 以及其边界的 IP 地址将分配给客户机。 定义客户机的默认网关。 主机的硬件 MAC 地址 (这样 DHCP 服务器就能够在接到请求时知道请求的主机身份)。 指定总是得到同一 IP 地址的主机。 请注意在此处使用主机名是对的, 因为 DHCP 服务器会在返回租借地址信息之前自行解析主机名。 一旦您撰写完 dhcpd.conf, 就可以用下面的命令来启动服务: &prompt.root; /usr/local/etc/rc.d/isc-dhcpd.sh start 如果未来您需要修改服务器的配置, 请务必牢记发送 SIGHUP 信号给 dhcpd不会 导致配置文件的重新加载, 而这在其他服务程序中则是比较普遍的约定。 您需要发送 SIGTERM 信号来停止进程, 然后使用上面的命令来重新启动它。 文件 DHCP 配置文件 /usr/local/sbin/dhcpd dhcpd 是静态连接的, 并安装到 /usr/local/sbin 中。 随 port 安装的 &man.dhcpd.8; 联机手册提供了关于 dhcpd 更为详尽的信息。 /usr/local/etc/dhcpd.conf dhcpd 需要配置文件, 即 /usr/local/etc/dhcpd.conf 才能够向客户机提供服务。 这个文件需要包括应提供给客户机的所有信息, 以及关于服务器运行的其他信息。 此配置文件的详细描述可以在随 port 安装的 &man.dhcpd.conf.5; 联机手册上找到。 /var/db/dhcpd.leases DHCP 服务器会维护一个它签发的租用地址数据库, 并保存在这个文件中, 这个文件是以日志的形式保存的。 随 port 安装的 &man.dhcpd.leases.5; 联机手册提供了更详细的描述。 /usr/local/sbin/dhcrelay dhcrelay 在更为复杂的环境中, 可以用来支持使用 DHCP 服务器转发请求给另一个独立网络上的 DHCP 服务器。 如果您需要这个功能, 需要安装 net/isc-dhcp3-relay port。 &man.dhcrelay.8; 联机手册提供了更为详尽的介绍。 Chern Lee Contributed by - Domain Name System (DNS) + 域名系统 (DNS) + + + 纵览 + BIND + + FreeBSD 在默认情况下使用一个版本的 BIND (Berkeley + Internet Name Domain), 这是目前最为流行的 DNS 协议实现。 + DNS 是一种协议, 可以通过它将域名同 IP 地址相互对应。 + 例如, 查询 www.FreeBSD.org + 将得到 FreeBSD Project 的 web 服务器的 IP 地址, 而查询 ftp.FreeBSD.org 则将得到响应的 FTP 机器的 + IP 地址。 类似地, 也可以做相反的事情。 查询 IP + 地址可以得到其主机名。 当然, 完成 DNS + 查询并不需要在系统中运行域名服务器。 + + + DNS + DNS 在 Internet 上通过一组略显复杂的权威根域名服务器来组织, + 它的其余部分则由较小规模的域名服务器组成, + 这些服务器提供少量的域名解析服务, 并对域名信息进行缓存。 + + + + 这份文档介绍了 BIND 8.x, 它是 FreeBSD 先前版本所采用的稳定版本。 + BIND 9.x 可以通过 net/bind9 + port 来安装到 FreeBSD 上, 而从 5.3-RELEASE 开始, + 它成为了基本系统的一部分。 + + + + RFC1034 和 RFC1035 定义了 DNS 协议。 + + + + 目前, BIND 由 + Internet Software Consortium + 维护。 + + + + + 术语 + + 要理解这份文档, 需要首先了解一些相关的 DNS 术语。 + + 解析器 (resolver) + 反向 DNS (reverse DNS) + 根域 (root zone) + + + + + + + + 术语 + 定义 + + + + + + 正向 DNS (Forward DNS) + 将域名映射到 IP 地址 + + + + 原点 (Origin) + 表示特定域文件所在的域 + + + + named, BIND, 域名服务器(name server) + 在 FreeBSD 中 BIND 域名服务器软件包的常见叫法 + + + + 解析器 (Resolver) + 计算机用以向域名服务器查询域名信息的一个系统进程 + + + + 反向 DNS (Reverse DNS) + 与正向 DNS 相对; 将 IP 地址映射为主机名 + + + + 根域 + + Internet 域层次的起点。 所有的域都在根域之下, + 类似文件系统中, 文件都在根目录之下那样。 + + + + 域 (Zone) + 独立的域, 子域, 或者由同一机构管理的 DNS 的一部分。 + + + + + + + + 例子 + + + 域的例子: + + + + . 是根域。 + + + org. 是一个根域下的域。 + + + example.org 是 + org. 域之下的域。 + + + foo.example.org. 是 + example.org. 域的子域。 + + + + 1.2.3.in-addr.arpa 是用于表达 3.2.1.* IP 地址空间之下所有 + IP 地址的域。 + + + + + 如您所见, 域名中最细节的部分在它的左边。 + 举例来说, example.org. 要比 + org. 更小, 就像 org. + 要比根域更小一样。 主机名的格局和文件系统类似: + /dev 目录在根目录中, 等等。 + + + + + + 运行域名服务器的理由 + + 域名服务器通常会有两种形式: 权威域名服务器, + 以及缓存域名服务器。 + + 下列情况需要有权威域名服务器: + + + + 想要向全世界提供 DNS 信息, + 并对请求给出权威应答。 + + + 注册了类似 example.org + 的域, 而需要将 IP 指定到其下的主机名上。 + + + 某个 IP 地址块需要反向 DNS 项 (IP 到主机名)。 + + + 需要备份服务器, 或常说的从 (slave) 服务器, + 在主服务器出现问题或无法访问时来应答查询请求。 + + + + 下列情况需要有缓存域名服务器: + + + + 本地的 DNS 服务器能够缓存, + 并比直接向外界的域名服务器请求更快地得到应答。 + + + 减少所需的总体网络流量 (DNS + 流量通常占全部 Internet 流量的 5% 或更多)。 + + + + 当有人查询 www.FreeBSD.org 时,解析器通常会向上级 + ISP 的域名服务器发出请求, 并获得回应。 如果有本地的缓存 DNS + 服务器, 查询只有在第一次被缓存 DNS 服务器发到外部世界。 + 其他的查询不会发向局域网外, 因为它们已经有在本地的缓存了。 + + + + + DNS 如何运作 + 在 FreeBSD 中, BIND 服务程序被称为 + named, 其原因显而易见。 + + + + + + 文件 + 描述 + + + + + + named + BIND 服务程序 + + + + ndc + 域名服务控制程序 + + + + /etc/namedb + BIND 存放域名信息的位置 + + + + /etc/namedb/named.conf + 域名服务配置文件 + + + + + + + 域文件通常被放在 + /etc/namedb + 目录中, 它们包含域名服务器所提供的 DNS 域的信息。 + + + + + 启动 BIND + + BIND + 启动 + + + 由于 BIND 会在默认情况下安装, 因此配置它相对而言很简单。 + + + 要确保 named 服务程序在引导时被自动启动, + 把下面的行加到 /etc/rc.conf 中: + + named_enable="YES" + 要手工启动服务 (在完成配置之后): + &prompt.root; ndc start + + + + 配置文件 + + BIND + 配置文件 + + + 使用 <command>make-localhost</command> + 一定要: + + &prompt.root; cd /etc/namedb +&prompt.root; sh make-localhost + 以便创建正确的本地 DNS 反向解析域文件 + /etc/namedb/localhost.rev。 + + + + + <filename>/etc/namedb/named.conf</filename> + + // $FreeBSD$ +// +// Refer to the named(8) manual page for details. If you are ever going +// to setup a primary server, make sure you've understood the hairy +// details of how DNS is working. Even with simple mistakes, you can +// break connectivity for affected parties, or cause huge amount of +// useless Internet traffic. + +options { + directory "/etc/namedb"; + +// In addition to the "forwarders" clause, you can force your name +// server to never initiate queries of its own, but always ask its +// forwarders only, by enabling the following line: +// +// forward only; + +// If you've got a DNS server around at your upstream provider, enter +// its IP address here, and enable the line below. This will make you +// benefit from its cache, thus reduce overall DNS traffic in the +Internet. +/* + forwarders { + 127.0.0.1; + }; +*/ + + + 如注视所说, 要从上级的缓存中受益, 可以在此处启用 + forwarders。 在一般情况下, 域名服务器会逐级地查询 + Internet 来找到特定的域名服务器, 直到得到答案为止。 + 启用这个将让它首先查询上级域名服务器 (或另外提供的域名服务器), + 从而从它们的缓存中得到结果。 如果上级域名服务器的负载很重, + 在更快的域名服务器上启用它将有助于改善服务品质。 + + + 127.0.0.1 + 不会 正常工作。 + 一定要把地址改为您上级服务器的 IP 地址。 + + + /* + * If there is a firewall between you and name servers you want + * to talk to, you might need to uncomment the query-source + * directive below. Previous versions of BIND always asked + * questions using port 53, but BIND 8.1 uses an unprivileged + * port by default. + */ + // query-source address * port 53; + + /* + * If running in a sandbox, you may have to specify a different + * location for the dumpfile. + */ + // dump-file "s/named_dump.db"; +}; + +// Note: the following will be supported in a future release. +/* +host { any; } { + topology { + 127.0.0.0/8; + }; +}; +*/ + +// Setting up secondaries is way easier and the rough picture for this +// is explained below. +// +// If you enable a local name server, don't forget to enter 127.0.0.1 +// into your /etc/resolv.conf so this server will be queried first. +// Also, make sure to enable it in /etc/rc.conf. + +zone "." { + type hint; + file "named.root"; +}; + +zone "0.0.127.IN-ADDR.ARPA" { + type master; + file "localhost.rev"; +}; + +zone +"0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.INT" { + type master; + file "localhost.rev"; +}; + +// NB: Do not use the IP addresses below, they are faked, and only +// serve demonstration/documentation purposes! +// +// Example secondary config entries. It can be convenient to become +// a secondary at least for the zone where your own domain is in. Ask +// your network administrator for the IP address of the responsible +// primary. +// +// Never forget to include the reverse lookup (IN-ADDR.ARPA) zone! +// (This is the first bytes of the respective IP address, in reverse +// order, with ".IN-ADDR.ARPA" appended.) +// +// Before starting to setup a primary zone, better make sure you fully +// understand how DNS and BIND works, however. There are sometimes +// unobvious pitfalls. Setting up a secondary is comparably simpler. +// +// NB: Don't blindly enable the examples below. :-) Use actual names +// and addresses instead. +// +// NOTE!!! FreeBSD runs BIND in a sandbox (see named_flags in rc.conf). +// The directory containing the secondary zones must be write accessible +// to BIND. The following sequence is suggested: +// +// mkdir /etc/namedb/s +// chown bind:bind /etc/namedb/s +// chmod 750 /etc/namedb/s + + For more information on running BIND in a sandbox, see + Running named in a sandbox. + + + /* +zone "example.com" { + type slave; + file "s/example.com.bak"; + masters { + 192.168.1.1; + }; +}; + +zone "0.168.192.in-addr.arpa" { + type slave; + file "s/0.168.192.in-addr.arpa.bak"; + masters { + 192.168.1.1; + }; +}; +*/ + named.conf 中, 这是一些转发用的从域以及反向域的例子。 + + 对于每一个新域, 域对应的项必须加到 + named.conf 中。 + + 例如, 最简单的用于 + example.org 域的条目类似下面的样子: + + zone "example.org" { + type master; + file "example.org"; +}; + + 这是一个主域, 它由 语句标识出来, + 而信息则在 + /etc/namedb/example.org 域文件中, + 这是由 语句指定的。 + + zone "example.org" { + type slave; + file "example.org"; +}; + + 在从域的例子中, 域的信息从该域的某个主服务器传送过来, + 并保存在指定的文件中。 如果主服务器死掉了或不可达, + 从域名服务器将使用这些传过来的域信息, 从而完成应答。 + + + + 域信息文件 + + 以下是一个用于 example.org 域的主域文件 (保存为 + /etc/namedb/example.org): + + + $TTL 3600 + +example.org. IN SOA ns1.example.org. admin.example.org. ( + 5 ; Serial + 10800 ; Refresh + 3600 ; Retry + 604800 ; Expire + 86400 ) ; Minimum TTL + +; DNS Servers +@ IN NS ns1.example.org. +@ IN NS ns2.example.org. + +; Machine Names +localhost IN A 127.0.0.1 +ns1 IN A 3.2.1.2 +ns2 IN A 3.2.1.3 +mail IN A 3.2.1.10 +@ IN A 3.2.1.30 + +; Aliases +www IN CNAME @ + +; MX Record +@ IN MX 10 mail.example.org. + + + 请注意以 . 结尾的主机名是全称主机名, 而结尾没有 + . 的则是相对于原点的主机名。 例如, + www 将被转换为 + www.原点. + 在这个假想的域信息文件中, 我们的原点是 + example.org., 因此 www + 将被当作 www.example.org.。 + + + + 域信息文件的格式如下: + + 记录名 IN 记录类型 值 + + + DNS + 记录 + + + 最常用的 DNS 记录: + + + + + SOA + + 域权威开始 + + + + NS + + 权威域名服务器 + + + + A + + 主机地址 + + + + CNAME + + 别名对应的正规名称 + + + + MX + + 邮件传递服务器 + + + + PTR + + 域名指针 (用于反向 DNS) + + + + + +example.org. IN SOA ns1.example.org. admin.example.org. ( + 5 ; Serial + 10800 ; Refresh after 3 hours + 3600 ; Retry after 1 hour + 604800 ; Expire after 1 week + 86400 ) ; Minimum TTL of 1 day + + + + + + example.org. + + 域名, 同时也是这个域信息文件的原点。 + + + + ns1.example.org. + + 该域的主/权威域名服务器。 + + + + admin.example.org. + + 此域的负责人的电子邮件地址, + 其中 @ 被换掉了。 + (admin@example.org 对应 + admin.example.org) + + + + + 5 + + 文件的序号。 每次修改域文件时都必须增加这个数字。 + 现今, 许多管理员会考虑使用 + yyyymmddrr 这样的格式来表示序号。 + 2001041002 通常表示上次修改于 + 04/10/2001, 而后面的 + 02 则表示在那天的第几次修改。 + 序号非常重要, 它用于通知从域服务器更新数据。 + + + + + +@ IN NS ns1.example.org. + + + 这是一个 NS 项。 每个准备提供权威应答的服务器都必须有一个对应项。 + 这里的 @ 表示 + example.org.。 + @ 会被理解为原点。 + + + +localhost IN A 127.0.0.1 +ns1 IN A 3.2.1.2 +ns2 IN A 3.2.1.3 +mail IN A 3.2.1.10 +@ IN A 3.2.1.30 + + + A 记录代表及其名。 如上面看到的, + ns1.example.org 将解析为 + 3.2.1.2。 在此再次使用了原点符, + @, 它表示 + example.org 应解析为 + 3.2.1.30。 + + + +www IN CNAME @ + + + 正规名记录通常用于对某台机器的别名给出对应的正式名字。 + 在这个例子中, www 是名字为原点, 或者说 + example.org + (3.2.1.30) 那台机器的别名。 + CNAMEs 可以用来提供主机的别名, 或将同一名字在多台机器上作轮询。 + + + + MX 记录 + + + +@ IN MX 10 mail.example.org. + + + MX 记录表示哪个邮件服务器负责接收发到这个域的邮件。 + mail.example.org 是邮件服务器的主机名, + 而 10 则是它的优先级。 + + + + 可以有多台邮件服务器, 其优先级分别是 3, 2, + 1。 向 example.org 进行投递的邮件服务器首先会尝试优先级最高 + (数字最小) 的 MX, 然后是较低优先级的, 等等, 直到成功地投递了邮件为止。 + + + + 对于 in-addr.arpa 域名信息文件 (反向 DNS), 使用了同样的格式, + 只是 PTR 项代替了 A 或 CNAME 的位置。 + + + $TTL 3600 + +1.2.3.in-addr.arpa. IN SOA ns1.example.org. admin.example.org. ( + 5 ; Serial + 10800 ; Refresh + 3600 ; Retry + 604800 ; Expire + 3600 ) ; Minimum + +@ IN NS ns1.example.org. +@ IN NS ns2.example.org. + +2 IN PTR ns1.example.org. +3 IN PTR ns2.example.org. +10 IN PTR mail.example.org. +30 IN PTR example.org. + + 这个文件给出了上述假想域中 IP 地址到域名的映射关系。 + + + + + 缓存域名服务器 + + BIND + 缓存域名服务器 + + + 缓存域名服务器是对任何域都不提供权威解析的域名服务器。 + 它自己简单地完成查询, 并记住这些查询以备后续使用。 + 要建立这样的服务器, 只需像平时一样配置一个域名服务器, + 而不配置域就可以了。 + - Running <application>named</application> in a Sandbox ** 翻译进行中 ** + 在沙盒中运行 <application>named</application> BIND - running in a sandbox + 在沙盒中运行 - + + chroot + + 要更安全地运行 &man.named.8;, 应该以非特权用户来运行它, + 并配置为 &man.chroot.8; 到一个沙盒目录中。 + 这使得 named 服务无法访问任何沙盒外面的东西。 + 假如 named 被攻破, + 这将减少它所能带来的破坏。 默认情况下, FreeBSD 提供了名为 + bind 的用户和组来完成这样的目的。 + + 许多人建议不这样做, 而 + named 配置为 chroot, + 您应该在一个 &man.jail.8; 中运行 named。 + 这一节并不涵盖这种情形。 + + + 由于 named 没有办法访问沙盒外面的任何东西 + (例如共享库, 日志 socket 等等), 您需要做许多事情来让 + named 正常工作。 下面的清单假定沙盒是 + /etc/namedb 而您没有事先改过这个目录中的内容。 + 以 root 的身份完成下列步骤: + + + + 创建 named + 需要访问的所有目录: + + &prompt.root; cd /etc/namedb +&prompt.root; mkdir -p bin dev etc var/tmp var/run master slave +&prompt.root; chown bind:bind slave var/* + + + + + + named 只需要写这些目录, + 这也是我们赋予它的全部权限。 + + + + + + 重新组织基本的域和配置文件: + &prompt.root; cp /etc/localtime etc +&prompt.root; mv named.conf etc && ln -sf etc/named.conf +&prompt.root; mv named.root master + +&prompt.root; sh make-localhost && mv localhost.rev localhost-v6.rev master +&prompt.root; cat > master/named.localhost +$ORIGIN localhost. +$TTL 6h +@ IN SOA localhost. postmaster.localhost. ( + 1 ; serial + 3600 ; refresh + 1800 ; retry + 604800 ; expiration + 3600 ) ; minimum + IN NS localhost. + IN A 127.0.0.1 +^D + + + + 这使得 named 能够将正确的时间传递给 + &man.syslogd.8;。 + + + + + + + syslog + 日志 + DNS + + 如果您在运行 &os; 在 4.9-RELEASE 之前的版本, 需要联编一个静态连接的 + named-xfer, 并将其复制到沙盒中: + + &prompt.root; cd /usr/src/lib/libisc +&prompt.root; make cleandir && make cleandir && make depend && make all +&prompt.root; cd /usr/src/lib/libbind +&prompt.root; make cleandir && make cleandir && make depend && make all +&prompt.root; cd /usr/src/libexec/named-xfer +&prompt.root; make cleandir && make cleandir && make depend && make NOSHARED=yes all +&prompt.root; cp named-xfer /etc/namedb/bin && chmod 555 /etc/namedb/bin/named-xfer + + 在把静态连接的 + named-xfer 装好之后需要清理一下, + 以免将过时的库或程序留在您的源代码副本中: + + &prompt.root; cd /usr/src/lib/libisc +&prompt.root; make cleandir +&prompt.root; cd /usr/src/lib/libbind +&prompt.root; make cleandir +&prompt.root; cd /usr/src/libexec/named-xfer +&prompt.root; make cleandir + + + + 据说这一步有时会失败。 如果您遇到这样的问题, 执行下面的命令: + + &prompt.root; cd /usr/src && make cleandir && make cleandir + + 并删除 /usr/obj 目录: + + &prompt.root; rm -fr /usr/obj && mkdir /usr/obj + + 这将把任何 垃圾 从您的源代码目录中删除, + 而后续工作将得以正常进行。 + + + + 如果您运行 &os; 的 4.9-RELEASE 或更新的版本, 则默认情况下 + /usr/libexec 中的 named-xfer + 副本已经是静态连接的了。 您可以简单地把它用 &man.cp.1; 复制到沙盒中。 + + + + 做一个 named + 能够看到并写入的 dev/null + + &prompt.root; cd /etc/namedb/dev && mknod null c 2 2 +&prompt.root; chmod 666 null + + + + /var/run/ndc 符号链接到 + /etc/namedb/var/run/ndc + + &prompt.root; ln -sf /etc/namedb/var/run/ndc /var/run/ndc + + + 这主要是避免每次都不得不指定 &man.ndc.8; + 的选项。 由于 + /var/run 会在每次启动时删除, + 如果您发现这是您在每次启动时都需要做的事情, + 则可以在 root 的 + crontab 中增加相应的条目, 并使用 + 选项。 参见 &man.crontab.5; + 以了解更多细节。 + + + + + + + syslog + 日志 + named + + 配置 &man.syslogd.8; 来创建一个 named + 可以写的 log socket。 要完成它, 需要将 + -l /etc/namedb/dev/log 加到 + /etc/rc.conf 的 + syslogd_flags 变量中。 + + + + + chroot + + 启动 named 并让它自动地把自己 + chroot 到沙盒中, 方法是把下面的内容加到 + /etc/rc.conf + + named_enable="YES" +named_flags="-u bind -g bind -t /etc/namedb /etc/named.conf" + + + 请注意配置文件 + /etc/named.conf 是以 + 相对于沙盒 的完整路径来指定的, + 例如上面那一行, 文件所在的目录实际上是 + /etc/namedb/etc/named.conf + + + + + 下一步是编辑 + /etc/namedb/etc/named.conf 让 + named 直到需要加载哪些域, + 以及它们在磁盘上的位置。 您可以用注释掉的那个例子 + (没有明确地注释掉的哪些和不在沙盒中运行 DNS 服务器时的配置无异): + + options { + directory "/"; + named-xfer "/bin/named-xfer"; + version ""; // Don't reveal BIND version + query-source address * port 53; +}; +// ndc control socket +controls { + unix "/var/run/ndc" perm 0600 owner 0 group 0; +}; +// Zones follow: +zone "localhost" IN { + type master; + file "master/named.localhost"; + allow-transfer { localhost; }; + notify no; +}; +zone "0.0.127.in-addr.arpa" IN { + type master; + file "master/localhost.rev"; + allow-transfer { localhost; }; + notify no; +}; +zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.int" { + type master; + file "master/localhost-v6.rev"; + allow-transfer { localhost; }; + notify no; +}; +zone "." IN { + type hint; + file "master/named.root"; +}; +zone "private.example.net" in { + type master; + file "master/private.example.net.db"; + allow-transfer { 192.168.10.0/24; }; +}; +zone "10.168.192.in-addr.arpa" in { + type slave; + masters { 192.168.10.2; }; + file "slave/192.168.10.db"; +}; + + + + + directory 语句被指定为 + /, 因为所有的 + named 需要在这个文件中 + (这相当于在 普通 模式下运行时的 + /etc/namedb)。 + + + + 指定到 named-xfer 执行文件的完整路径 (相对 + named 的参照系)。 这是必须的步骤, + 因为 named 在默认情况下会从 + /usr/libexec 查找 named-xfer + + 指定文件名 (相对于前面的 + directory 语句指定的目录), + named 将在这里查找域信息文件。 + + 指定文件名 (相对于前面的 + directory 语句指定的目录), + named 将在这里写入成功地从主服务器拿到的域信息文件副本。 + 这使为什么我们在前面的步骤中将 slave 的属主改为 + bind 的原因。 + + + + 完成这些配置之后, 您可以重新启动服务器, 或重启 + &man.syslogd.8; 服务并启动 &man.named.8;, 以确认 + syslogd_flags 和 + named_flags 的新值生效了。 + 现在您应该已经在沙盒中运行 named 了! + + + + + 安全 + + 尽管 BIND 是最为常用的 DNS 实现, 但它总是有一些安全问题。 + 时常会有人发现一些可能的甚至可以利用的安全漏洞。 + + + + 经常阅读 CERT 的安全公告并订阅 + &a.security-notifications; 会是一个帮助您时刻了解最新 + Internet 和 FreeBSD 安全问题的好习惯。 + + + 如果出现了问题, 将代码升级到最新版本并重新联编 + named 不会带来任何麻烦。 + + + + 进一步阅读 + + BIND/named 联机手册: + &man.ndc.8; &man.named.8; &man.named.conf.5; + + + + 官方的 ISC BIND + 页面 + + + + + BIND FAQ + + + + O'Reilly + DNS 和 BIND 第4版 + + + + RFC1034 + - 域名 - 概念和工具 + + + + RFC1035 + - 域名 - 实现及其标准 + + + + + + + + + + Tom + Rhodes + 撰写者 + + + + <acronym>BIND</acronym>9 和 &os; + + + + bind9 + 安装 + + &os; 5.3 将 + BIND9 DNS 服务软件引入了发行包。 + 与此同时, 这带来了新的安全特性, 文件布局, 以及自动的 + &man.chroot.8; 配置。 这一节包含两部分, + 第一部分讨论了新特性以及如何配置它们, 而后一部分则介绍了升级的步骤, + 它将帮您顺利地迁移到 &os; 5.3。 从此开始, 服务器将被简写为 + &man.named.8; 而不是 BIND。 + 这一节跳过了前一节中所介绍的术语以及一些理论上的讨论, 因此, + 建议您阅读前一节然后再看这一节。 + + named 的配置文件目前存放在 + /var/named/etc/namedb/, + 在使用前需要进行一些修改。 这也是绝大多数配置所在的位置。 + + + 配置主域 + + 要配置主域您需要进入 + /var/named/etc/namedb/ + 并执行下面的命令: + + &prompt.root; sh make-localhost + + 如果一切正常, 则将在 + master 目录中建立两个新的文件。 + 它们的文件名是 localhost.rev 和 + localhost-v6.rev, 分别用来解析本地的名字和 + IPv6 配置中的名字。 作为默认的配置文件, + 它们已经在 named.conf 文件中进行了定义。 + + + + 配置从域 + + 可以通过配置从域来提供额外的域或子域的解析。 + 多数情况下, master/localhost.rev + 可以复制到 slave + 中并进行修改。 一旦完成, 这些文件就可以加入到 + named.conf 类似 + example.com 的配置中: + + zone "example.com" { + type slave; + file "slave/example.com"; + masters { + 10.0.0.1; + }; +}; + +zone "0.168.192.in-addr.arpa" { + type slave; + file "slave/0.168.192.in-addr.arpa"; + masters { + 10.0.0.1; + }; +}; + + 请注意在这个例子中, 主服务器的 + IP 地址指明了我们要从哪里把域传过来; + 那台服务器本身并不一定要作为对外的 + DNS 服务器来用。 + + + + 系统的初始配置 + + 为了让 named 服务能够在系统启动时自动加载, + 需要把下面的选项加到 rc.conf 文件中: + + named_enable="YES" + + 尽管还有其他的一些可用选项, 这是运行域名服务器所需要的最小配置。 + 请参考 &man.rc.conf.5; 联机手册了解更多的选项。 在 + rc.conf 中进行了这些配置之后, + 可以通过下面的命令行来启动 named + + &prompt.root; /etc/rc.d/named start + + + + <acronym>BIND</acronym>9 的安全 + + 尽管 &os; 会自动地将 named 放到一个 + &man.chroot.8; 环境中, 您仍然可以采取一些更严密的措施来防止可能的针对 + DNS 服务的攻击。 + + + 查询访问控制表 + + 查询访问控制表可以用来限制对于域的查询。 + 这些配置通过在 acl 语句中列出的 + IP 地址来发挥作用。 要允许一个子网查询 + example.org 中的主机, 可以做下面的定义: + + acl "example.com" { + 192.168.0.0/24; +}; + +zone "example.com" { + type slave; + file "slave/example.com"; + masters { + 10.0.0.1; + }; + allow-query { example.com; }; +}; + +zone "0.168.192.in-addr.arpa" { + type slave; + file "slave/0.168.192.in-addr.arpa"; + masters { + 10.0.0.1; + }; + allow-query { example.com; }; +}; + + + + 限制版本查询 + + 允许查询 DNS 服务的版本, + 可能会给攻击者敞开方便之门。 + 心存恶意的用户能够利用这一信息找到存在已知漏洞的服务器, + 并对其实施攻击。 在 named.conf + 的 options 小节中可以伪造版本字符串: + + options { + directory "/etc/namedb"; + pid-file "/var/run/named/pid"; + dump-file "/var/dump/named_dump.db"; + statistics-file "/var/stats/named.stats"; + version "None of your business"; + + Murray Stokely Contributed by Apache HTTP Server ** 翻译进行中 ** web server setting up Apache Murray Stokely Contributed by File and Print Services for µsoft.windows; clients (Samba) ** 翻译进行中 ** Samba server Microsoft Windows file server Windows clients print server Windows clients Overview ** 翻译进行中 ** Tom Hukins Contributed by Clock Synchronization with NTP ** 翻译进行中 ** diff --git a/zh_CN.GB2312/books/handbook/pgpkeys/chapter.sgml b/zh_CN.GB2312/books/handbook/pgpkeys/chapter.sgml index 97b5c70cfe..9290602717 100644 --- a/zh_CN.GB2312/books/handbook/pgpkeys/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/pgpkeys/chapter.sgml @@ -1,873 +1,888 @@ PGP公钥 pgp keys 有些时候,您可能需要校验签名或者发送加密的邮件给官员或者开发者, 这里为了方便您而提供了一些密钥。完整的 FreeBSD.org 用户密钥可以在 http://www.FreeBSD.org/doc/pgpkeyring.txt 下载。 官员 &a.security-officer; &pgpkey.security-officer; &a.core-secretary; &pgpkey.core-secretary; 核心团队成员 &a.jhb; &pgpkey.jhb; &a.kuriyama; &pgpkey.kuriyama; &a.scottl; &pgpkey.scottl; &a.imp; &pgpkey.imp; &a.wes; &pgpkey.wes; &a.murray; &pgpkey.murray; &a.peter; &pgpkey.peter; 开发者 &a.will; &pgpkey.will; &a.mat; &pgpkey.mat; &a.asami; &pgpkey.asami; &a.dougb; &pgpkey.dougb; &a.tobez; &pgpkey.tobez; &a.mbr; &pgpkey.mbr; &a.harti; &pgpkey.harti; &a.obraun; &pgpkey.obraun; &a.jmb; &pgpkey.jmb; &a.brueffer; &pgpkey.brueffer; &a.markus; &pgpkey.markus; &a.wilko; &pgpkey.wilko; &a.perky; &pgpkey.perky; &a.jon; &pgpkey.jon; &a.luoqi; &pgpkey.luoqi; &a.ache; &pgpkey.ache; &a.seanc; &pgpkey.seanc; &a.cjh; &pgpkey.cjh; &a.cjc; &pgpkey.cjc; &a.marcus; &pgpkey.marcus; &a.nik; &pgpkey.nik; &a.ceri; &pgpkey.ceri; &a.brooks; &pgpkey.brooks; + + &a.gnn; + &pgpkey.gnn; + + &a.pjd; &pgpkey.pjd; &a.bsd; &pgpkey.bsd; &a.danfe; &pgpkey.danfe; &a.dd; &pgpkey.dd; &a.ale; &pgpkey.ale; &a.peadar; &pgpkey.peadar; &a.josef; &pgpkey.josef; &a.ue; &pgpkey.ue; &a.ru; &pgpkey.ru; &a.le; &pgpkey.le; &a.stefanf; &pgpkey.stefanf; &a.jedgar; &pgpkey.jedgar; &a.green; &pgpkey.green; &a.lioux; &pgpkey.lioux; &a.fanf; &pgpkey.fanf; &a.blackend; &pgpkey.blackend; &a.petef; &pgpkey.petef; &a.billf; &pgpkey.billf; &a.patrick; &pgpkey.patrick; &a.gioria; &pgpkey.gioria; &a.jmg; &pgpkey.jmg; &a.dannyboy; &pgpkey.dannyboy; &a.dhartmei; &pgpkey.dhartmei; &a.jhay; &pgpkey.jhay; &a.sheldonh; &pgpkey.sheldonh; &a.mikeh; &pgpkey.mikeh; + + &a.mheinen; + &pgpkey.mheinen; + + &a.ghelmer; &pgpkey.ghelmer; &a.mux; &pgpkey.mux; &a.mich; &pgpkey.mich; &a.foxfair; &pgpkey.foxfair; &a.jkh; &pgpkey.jkh; &a.trevor; &pgpkey.trevor; &a.phk; &pgpkey.phk; &a.joe; &pgpkey.joe; &a.vkashyap; &pgpkey.vkashyap; &a.kris; &pgpkey.kris; &a.keramida; &pgpkey.keramida; &a.fjoe; &pgpkey.fjoe; &a.andreas; &pgpkey.andreas; &a.sergei; &pgpkey.sergei; &a.maxim; &pgpkey.maxim; &a.jkoshy; &pgpkey.jkoshy; &a.rik; &pgpkey.rik; &a.rushani; &pgpkey.rushani; &a.clement; &pgpkey.clement; &a.mlaier; &pgpkey.mlaier; &a.alex; &pgpkey.alex; &a.erwin; &pgpkey.erwin; &a.leeym; &pgpkey.leeym; &a.netchild; &pgpkey.netchild; &a.lesi; &pgpkey.lesi; &a.glewis; &pgpkey.glewis; &a.delphij; &pgpkey.delphij; &a.ijliao; &pgpkey.ijliao; &a.clive; &pgpkey.clive; &a.clsung; &pgpkey.clsung; &a.arved; &pgpkey.arved; &a.pav; &pgpkey.pav; &a.bmah; &pgpkey.bmah; &a.mtm; &pgpkey.mtm; &a.dwmalone; &pgpkey.dwmalone; - + &a.kwm; &pgpkey.kwm; &a.matusita; &pgpkey.matusita; &a.ken; &pgpkey.ken; &a.dinoex; &pgpkey.dinoex; &a.sanpei; &pgpkey.sanpei; &a.jim; &pgpkey.jim; &a.marcel; &pgpkey.marcel; &a.marck; &pgpkey.marck; &a.tmm; &pgpkey.tmm; &a.rich; &pgpkey.rich; &a.knu; &pgpkey.knu; &a.max; &pgpkey.max; &a.yoichi; &pgpkey.yoichi; &a.bland; &pgpkey.bland; &a.simon; &pgpkey.simon; &a.anders; &pgpkey.anders; &a.obrien; &pgpkey.obrien; &a.philip; &pgpkey.philip; &a.hmp; &pgpkey.hmp; &a.mp; &pgpkey.mp; &a.roam; &pgpkey.roam; &a.den; &pgpkey.den; &a.pirzyk; &pgpkey.pirzyk; &a.jdp; &pgpkey.jdp; &a.krion; &pgpkey.krion; &a.markp; &pgpkey.markp; &a.thomas; &pgpkey.thomas; &a.hq; &pgpkey.hq; &a.dfr; &pgpkey.dfr; &a.trhodes; &pgpkey.trhodes; &a.benno; &pgpkey.benno; &a.paul; &pgpkey.paul; &a.roberto; &pgpkey.roberto; &a.guido; &pgpkey.guido; &a.niklas; &pgpkey.niklas; &a.marks; &pgpkey.marks; &a.hrs; &pgpkey.hrs; &a.wosch; &pgpkey.wosch; &a.das; &pgpkey.das; &a.schweikh; &pgpkey.schweikh; &a.gshapiro; &pgpkey.gshapiro; &a.arun; &pgpkey.arun; &a.vanilla; &pgpkey.vanilla; &a.cshumway; &pgpkey.cshumway; &a.demon; &pgpkey.demon; &a.jesper; &pgpkey.jesper; &a.scop; &pgpkey.scop; &a.glebius; &pgpkey.glebius; &a.kensmith; &pgpkey.kensmith; &a.ben; &pgpkey.ben; &a.des; &pgpkey.des; &a.sobomax; &pgpkey.sobomax; &a.dcs; &pgpkey.dcs; &a.brian; &pgpkey.brian; &a.nsouch; &pgpkey.nsouch; &a.ssouhlal; &pgpkey.ssouhlal; &a.vs; &pgpkey.vs; &a.gsutter; &pgpkey.gsutter; &a.metal; &pgpkey.metal; &a.nyan; &pgpkey.nyan; &a.mi; &pgpkey.mi; &a.gordon; &pgpkey.gordon; &a.lth; &pgpkey.lth; &a.thierry; &pgpkey.thierry; &a.viny; &pgpkey.viny; + + &a.ups; + &pgpkey.ups; + + &a.nectar; &pgpkey.nectar; &a.adamw; &pgpkey.adamw; &a.nate; &pgpkey.nate; &a.wollman; &pgpkey.wollman; &a.joerg; &pgpkey.joerg; &a.bz; &pgpkey.bz; &a.phantom; &pgpkey.phantom; diff --git a/zh_CN.GB2312/books/handbook/security/chapter.sgml b/zh_CN.GB2312/books/handbook/security/chapter.sgml index e4f9313acc..49ba535915 100644 --- a/zh_CN.GB2312/books/handbook/security/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/security/chapter.sgml @@ -1,5053 +1,5053 @@ Matthew Dillon 这一章的许多内容来自 security(7) 联机手册,其作者是 安全 security 概述 这一章将对系统安全的基本概念进行介绍,除此之外,还将介绍一些好的习惯,以及 &os; 下的一些更深入的话题。这章的许多内容对于一般的系统和Internet安全也适用。如今, Internet已经不再像以前那样是一个人人都愿意与您作好邻居的 友善 的地方。 让系统更加安全,将保护您的数据、智力财产、时间, 以及其他很多东西不至于被入侵者或类似人员所窃取。 &os;提供了大量的工具和机制来确保您的系统和网络的安全。 读完这章,您将了解: 基本的 &os; 系统安全概念。 &os; 中众多可用的密码学设施,例如 DESMD5 如何设置一次性口令验证机制。 如何配置 TCP Wrappers 以便与 inetd 配合使用。 如何在 &os; 5.0 以前的版本上设置 KerberosIV 如何在 &os; 5.0 或更高版本上设置 Kerberos5 如何使用 IPFW 来创建防火墙。 如何配置 IPsec 并在 &os;/&windows; 间建立 VPN 如何配置并使用 OpenSSH,以及 &os; 的 SSH 执行方式。 系统 ACL 的概念,以及如何使用它们。 如何从 &os; 的安全公告中获得有用信息并采取相应措施。 在开始阅读这章之前,您需要: 理解基本的 &os; 和 Internet 概念。 介绍 安全是系统管理至始至终最基本的要求。由于所有的 BSD &unix; 多用户系统都有它自身内在的安全性,建立和维护额外的安全机制, 确保用户的 诚实 大概是系统管理最艰巨的工作之一。 机器仅保持着建立时最原始的安全性,而安全性必须要考虑到用户使用的便利性。 通常, &unix; 系统能够支持巨大的并发用户处理, 而这些处理中绝大部分是以服务器形式处理的 — 这意味着外部的实体能够与它们互连和互动。 昨天的小型计算机和主机变成了今天的桌面机,计算机已连到局域网和互联网, 安全就成了一个非常严峻的问题。 通过像 洋葱 那样分层的方法,能够很好地实现安全。 简而言之,您所要做的就是创建很多的安全层,然后仔细地监视系统以防入侵。 不过,过多地创建安全层可能会出现问题,您可能不希望大量地阅读检测结果, 因为检测是所有安全机制中最重要的一环。例如,在所有的系统可执行文件上都设置 schg 标记 (参考 &man.chflags.1;) 的意义就不大,因为尽管这也许能够暂时地保护那些执行文件, 它阻止了攻击者轻易地闯入并作一个容易被检测出来的修改, 却很可能最终导致您的安全机制根本检测不到入侵者。 系统安全也涉及到许多攻击方式,包括试图摧毁或使系统无法使用, 但并不试图窃取 root 帐号 (干掉 root)。 安全问题主要分成以下几类: 拒绝服务攻击。 窃取其他用户的帐户。 通过可访问服务窃取root帐户。 通过用户帐户窃取root帐户。 建立后门。 DoS 攻击 拒绝服务攻击 (DoS) 安全 DoS 攻击 拒绝服务攻击 (DoS) 拒绝服务攻击 (DoS) 拒绝式服务攻击是侵占机器所需资源的一种行为。 通常, DoS 攻击采用暴力(brute-force)手段通过压倒性的流量来破坏服务器和网络栈, 以使机器崩溃或无法使用。 某些 DoS 攻击则利用在网络栈中的错误, 仅用一个简单的信息包就可以让机器崩溃, 这类情况通常只能通过给内核打补丁来修复。 在一些不利的条件下, 对服务器的攻击能够被修复, 只要适当地修改一下系统的选项来限制系统对服务器的负荷。 顽强的网络攻击是很难对付的。 例如,一个欺骗性信息包的攻击, 无法阻止入侵者切断您的系统与Internet的连接。 它不会使您的机器死掉,但它会把Internet连接占满。 security 窃取用户帐户 窃取用户帐户要比D.o.S.攻击更加普遍。 许多系统管理员仍然在他们的服务器上运行着基本的 telnetdrlogindrshdftpd 服务。 这些服务在默认情况下不会以加密连接来操作。 结果是如果您的系统有中等规模大小的用户群, 在通过远程登录的方式登录到您系统的用户中, 一些人的口令会被人窃取。 仔细的系统管理员会从那些成功登录系统的远程访问日志中寻找可疑的源地址。 通常必须假定,如果一个入侵者已经访问到了一个用户的帐户, 那么它就可能使自己成为 root。 然而, 事实是在一个安全和维护做得很好的系统中, 访问用户的帐户不一定会让入侵者成为 root。 这个差别是很重要的,因为没有成为 root 则入侵者通常是无法隐藏它的轨迹的, 而且, 如果走运的话, 除了让用户的文件乱掉和系统崩溃之外, 它不能做什么别的事情。 窃取用户帐户是很普遍的事情, 因为用户往往不会对系统管理员的警告采取措施。 security 后门 系统管理员必须牢牢记住,可能有许多潜在的方法会使他们机器上的 root 用户受到威胁。入侵者可能知道 root 的口令,而如果在以 root 权限运行的服务器上找到一个缺陷 (bug), 就可以通过网络连接到那台服务器上达到目的;另外, 一旦入侵者已经侵入了一个用户的帐户, 可以在自己的机器上运行一个 suid-root 程序来发现服务器的漏洞, 从而让他侵入到服务器并获取 root。 攻击者找到了入侵一台机器上 root 的途径之后, 他们就不再需要安装后门了。许多 root 漏洞被发现并修正之后, 入侵者会想尽办法去删除日志来消除自己的访问痕迹, 所以他们会安装后门。 后门能给入侵者提供一个简单的方法来重新获取访问系统的 root 权限, 但它也会给聪明的系统管理员一个检测入侵的简便方法。 让入侵者无法安装后门事实上对您的系统安全是有害的, 因为这样这样并不会修复那些侵入系统的入侵者所发现的新漏洞。 安全的管理方法应当使用像 洋葱皮 一样多层次的方法来实现, 这些措施可以按下面的方式进行分类: 确保 root 和维护人员帐户的安全。 确保 root – 以root用户权限运行的服务器和suid/sgid可执行程序的安全。 确保用户帐户的安全。 确保口令文件的安全。 确保内核中核心组件、直接访问设备和文件系统的安全。 快速检测系统中发生的不适当的变化。 做个偏执狂。 这一章的下一节将比较深入地讲述上面提到的每一个条目。 确保FreeBSD的安全 security 确保FreeBSD的安全 命令与协议 在这份文档中,我们使用 粗体 来表示应用程序, 并使用 单倍距 字体来表示命令。 这样的排版区分能够有效地区分类似 ssh 这样的概念, 因为它既可以表示命令,又可以表示协议。 下面几节中的内容将包括 前一节 中提到的那些加强 FreeBSD 安全性的方法。 确保 <username>root</username> 和维护人员帐户的安全 su 首先,如果您没有确保 root 帐户的安全, 就没必要先劳神确保用户帐户的安全了。绝大多数系统都会指派一个口令给 root 帐户。 我们的第一个假定是,口令 总是 不安全的。 这并不意味着您要把口令删掉。 口令通常对访问机器的控制台来说是必须的。 也就是说, 您不应当让它用到控制台以外的口令, 即使是使用 &man.su.1; 命令。 例如,确信您的 pty 终端在 /etc/ttys 文件中被指定为 insecure (不安全),这将使直接通过 telnetrlogin 登录 root 会不被接受。 如果使用如 sshd 这样的其他登录服务, 也要确认直接登录 root 是关闭的。您可以通过编辑 /etc/ssh/sshd_config 文件来做到这一点,确信 PermitRootLogin 被设置成 NO。 考虑到每一种访问方法 — 如FTP这样的服务, 以免因为它们而导致安全性的损失。 直接登录 root 只有通过系统控制台才被允许。 wheel 当然, 作为一个系统管理员, 您应当获得 root身份, 因此, 我们开了一些后门来允许自己进入。 但这些后门只有在经过了额外的口令确认之后才能使用。 一种让 root 可访问的方法是增加适当的用户帐户到 wheel 组 (在 /etc/group 中)。wheel 组中的用户成员可以使用 su 命令来成为 root。 绝对不应该通过在口令项中进行设置来赋予维护人员天然的 wheel 组成员身份。 维护人员应被放置在 staff 组中,然后通过 /etc/group 文件加入到 wheel 组。事实上,只有那些需要以 root 身份进行操作的用户才需要放进 wheel 组中。 当然,也可以通过 某种其它的验证手段,例如 Kerberos,可以通过 root 帐户中的 .k5login 文件来允许执行 &man.ksu.1; 成为 root ,而不必把它们放进 wheel 组。 这可能是一种更好的解决方案, 因为 wheel 机制仍然可能导致入侵者获得 root ,如果他拿到了口令文件,并能够进入职员的帐户。 尽管有 wheel 比什么都没有要强一些, 但它并不是一种绝对安全的办法。 一种间接地提高员工帐号,以及 root 访问的方法,使采用其他的登录访问方式,并使用 星号 替代员工加密的口令。使用 &man.vipw.8; 命令, 可以把每一个加密的口令替换成一个 * 符。 这将更新 /etc/master.passwd 文件,以及 用户名/口令数据库,以禁用口令登录。 如下面的员工帐号 foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh 应被改为: foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh 这一更改将阻止一般的登录,因为加密的口令永远不会与 * 匹配。一旦这么做之后, 任何员工都必须使用其他的方式来完成登录,例如,使用 &man.kerberos.1; 或者通过 &man.ssh.1; 利用 公钥/密钥对 的方式来完成登录。当使用 Kerberos 这样的工具时,通常必须加强运行 Kerberos 的服务器,以及桌面工作站的安全性。当使用 公钥/密钥对以 ssh 登录时,通常必须加固用户 开始 登录的那台机器的安全 (通常这是他们的工作站)。 在这之上还可以增加一层安全性,即在使用 &man.ssh-keygen.1; 生成它的时候,使用口令来保护它们。 如果能够用 星号 替换掉所有员工的口令, 那么,这也就保证了他们只能通过您设置的安全的方法来登录。 这将迫使所有的员工使用安全的、经过加密的连接来完成他们的会话, 而这将使得入侵者通过监听网络通讯, 从某些不相关的、 不太安全的机器上窃取口令成为不可能。 另一钟间接的安全机制则是, 从严格受限的机器向限制更宽松的机器上登录。 例如, 如果您的服务器运行了所有的服务,那么,工作站应该什么都不运行。 为了让工作站尽可能地安全,应该避免运行任何没有必要的服务, 甚至不运行任何服务。 另外, 也应该考虑使用带口令保护功能的屏幕保护程序。 毋庸置疑, 如果攻击者能够物理地接触您的工作站, 那么他就有能力破坏任何安全设施,这确实是我们需要考虑的一个问题,但同样地, 真正能够物理接触您的工作站或服务器并实施攻击的人在现实生活中并不常见, 绝大多数攻击来自于网络, 而攻击者往往无法物理地接触服务器或工作站。 KerberosIV 使用类似 Kerberos 这样的工具,也为我们提供了使用一个工具来禁用某个用户, 或修改他们口令并在所有机器上立即生效的方法。如果员工的帐号被窃取, 能够在所有的其他机器上生效的口令变更将很有意义。如果口令分散地保存在多个机器上, 一次修改 N 台机器上的口令很可能是一件痛苦的事情。 此外, Kerberos 还能够提供更多的限制,除了 Kerberos 令牌有很好的过期机制之外, 它还能够强制用户在某个特定的期限内修改口令(比如说,每月一次). 确保以root用户权限运行的服务器和suid/sgid可执行程序的安全 ntalk comsat finger sandboxes sshd telnetd rshd rlogind 谨慎的管理员只运行它们需要的服务,不多,不少。 要当心第三方的服务程序很可能有更多的问题。例如,运行旧版的 imapd 或者 popper 无异于将 root 令牌拱手送给全世界的攻击者。 永远不要运行那些您没有仔细检查过的服务程序,许多服务程序并不需要以 root 身份运行。例如,ntalkcomsat,以及 finger 服务程序都能够以一种称作 沙盒 的特殊用户身份运行。除非您解决了大量的麻烦, 否则沙盒远不是一个完美的策略,但洋葱规则仍然成立, 如果某个人设法攻破了在沙盒中运行的程序,那么他们还必须冲出沙盒才能够做的更多。 攻击者需要冲破的层次越多,他成功的机会就越小。root漏洞曾经在几乎所有的以 root 身份运行的程序中存在,包括基本的系统服务。 另外,如果您只通过 sshd 登录,而不打算使用 telnetdrshdrlogind,那么,毫不犹豫地关闭这些服务! FreeBSD 现在默认在沙盒中运行 ntalkd, comsat, 以及 finger。此外, &man.named.8; 也可以这样运行。 /etc/defaults/rc.conf 中包括了如何如此运行 named 的方法,只是这些内容被注释掉了。 如何升级或安装系统将决定这些沙盒所使用的特殊用户是否被自动安装。 谨慎的系统管理员将根据需要研究并实现沙盒。 sendmail 此外,还有一些服务通常并不在沙盒中运行: sendmail, popper, imapd, ftpd, 以及一些其他的服务。当然,它们有一些替代品,但安装那些服务可能需要做更多额外的工作。 可能必须以 root 身份运行这些程序, 并通过其他机制来检测入侵。 系统中另一个比较大的 root 漏洞 是安装在其中的 suid-root 和 sgid 的可执行文件。绝大多数这类程序, 例如 rlogin, 被存放于 /bin, /sbin, /usr/bin, 或 /usr/sbin 中。 尽管并没有 100% 的安全保证,但系统默认的 suid 和 sgid 可执行文件通常是相对安全的。 当然,偶尔也会发现一些存在于这些可执行文件中的 root 漏洞。1998年,Xlib 中发现了一处 root 漏洞,这使得 xterm (通常是做了suid的) 变得可以入侵。 安全通常比时候沮丧更好,因此,谨慎的管理员通常会限制 suid 可执行文件, 并保证只有员工帐号能够执行它们,或只开放给特定的用户组,甚至彻底干掉 (chmod 000) 任何 suid 可执行文件, 以至于没有人能够执行它们。没有显示设备的服务器通常不会需要 xterm 可执行文件。 sgid 可执行文件通常同样地危险。 一旦入侵者攻克了sgid-kmem,那么他就能够读取 /dev/kmem 并进而读取经过加密的口令文件, 从而窃取任何包含口令的帐号。另外,攻破了 kmem 的入侵者能够监视通过 pty 传送的按键序列,即使用户使用的是安全的登录方式。 攻破了 tty 组的用户则能够向几乎所有用户的 tty 写入数据。如果用户正在运行一个终端程序,或包含了键盘模拟功能的终端仿真程序, 那么,入侵者能够以那个用户的身份执行任何命令。 确保用户帐户的安全 用户帐号的安全通常是最难保证的。虽然您可以为您的员工设置严苛的登录限制, 并用 星号 替换掉他们的口令,但您可能无法对普通的用户这么做。 如果有足够的决策权,那么在保证用户帐号安全的斗争中或许会处于优势, 但如果不是这样,您能做的只是警惕地监控这些帐号的异动。 让用户使用 ssh 或 Kerberos 可能会有更多的问题, 因为需要更多的管理和技术支持,尽管如此,与使用加密的口令文件相比, 这仍不失为一个好办法。 确保口令文件的安全 尽可能使用 * 替换掉口令是保证口令文件安全唯一的解决方法, 如果能够用 ssh 或 Kerberos 的话。即使只有 root 用户能够读取加密过的口令文件 (/etc/spwd.db) 入侵者仍然可能设法读到它,即使他暂时还无法写入这个文件。 您的安全脚本应该经常检查并报告口令文件的异动 (参见后面的 检查文件完整性 一节)。 确保内核中内核设备、直接访问设备和文件系统的安全 如果攻击者已经拿到了 root 那么他就有能力作任何事情, 当然, 有一些事情是他们比较喜欢干的。 例如, 绝大多数现代的内核都包括一个内建的听包设备。 在 FreeBSD 中,这个设备被称作 bpf 。攻击者通常会尝试在攻克的系统上运行它。 如果您不需要 bpf 设备提供的功能,那么,就不要把它编入内核。 sysctl 但即使已经关掉了 bpf 设备,您仍然需要担心 /dev/mem/dev/kmem 。 就事论事地说,攻击者仍然能够通过直接访问的方式写入磁盘设备。同样地, 还有一个被称作模块加载器, &man.kldload.8; 的机制,也会包含潜在的危险。 尝试入侵企业网络的入侵者会尝试在正在运行的内核上安装他自己的 bpf 设备,或其他听包设备。为了防止这些问题, 需要抬高内核安全级,至少调整到1。可以通过对 kern.securelevel 执行 sysctl 来完成这个任务。一旦把安全级调整到1, 对于直接访问设备的写入操作将被拒绝,而特殊的 chflags 标记,如 schg ,将被强制执行。一定要在重要的启动执行文件、 目录和脚本文件上设置 schg 标记 — 在安全级生效之前的所有文件。这可能做得有些过火, 并将导致在较高安全级上运行时升级系统变得困难。 此外, 运行于较高安全级上,而没有正确设置 schg 标记的系统仍然是存在弱点的。另一种方法是把 //usr 以只读方式挂接。 此外,请注意过于严苛的安全设置将使得入侵检测同样无法进行。 检查文件完整性: 可执行文件,配置文件和其他文件 当实施严格的限制时,往往会在使用的方便性上付出代价。例如,使用 chflags 来把 schg 标记 应用到 //usr 中的绝大多数文件上可能会起到反作用, 因为尽管它能够保护那些文件,但同样关掉了一个很好的监测机制。 层次化安全的最后一层可能是最重要的 — 检测。 安全的其他部分可能相对来讲意义并不那么大 (或者,更糟糕的事情是, 那些措施会给您安全的假象), 加入您无法检测潜在的入侵事件。 层次化安全最重要的功能是减缓入侵者, 而不是彻底不让他们入侵,这能够让检测起到作用,并更好地捕捉入侵行为。 检测入侵的一种好办法是查找那些被修改、删除或添加的文件。 检测文件修改的最佳方法是与某个 (通常是中央的) 受限访问的系统上的文件进行比对。 在一台严格限制访问的系统上撰写您的安全脚本通常不能够被入侵者察觉, 因此,这非常重要。为了最大限度地发挥这一策略的优势,通常会使用只读的 NFS, 或者设置 ssh 钥匙对以便为其他机器提供访问。除了网络交互之外, NFS可能是一种很难被察觉的方法 — 它允许您监控每一台客户机上的文件系统, 而这种监控几乎是无法察觉的。如果一台严格受限的服务器和客户机是通过交换机连接的, 那么 NFS 将是一种非常好的方式。 不过,如果那台监控服务器和客户机之间通过集线器 (Hub),或经过许多层的路由来连接,则这种方式就很不安全了, 此时,应考虑使用 ssh ,即使这可以在审计记录中查到。 一旦为这个受限的机器赋予了至少读取它应监控的客户系统的权限, 就应该为实际的监控撰写脚本。以 NFS 挂接为例,可以用类似 &man.find.1; 和 &man.md5.1; 这样的命令为基础来完成我们所需的工作。 最好能够每天对被控机的所有执行文件计算一遍 md5,同时,还应以更高的频率测试那些 /etc/usr/local/etc 中的控制文件。一旦发现了不匹配的情形,监控机应立即通知系统管理员。 好的安全脚本也应该检查在系统分区,如 //usr 中是否有新增或删除的可执行文件,以及不适宜的 suid 。 如果打算使用 ssh 来代替 NFS,那么撰写安全脚本将变得困难许多。 本质上,需要在脚本中使用 scp 在客户端复制文件, 另一方面,用于检查的执行文件 (例如 find) 也需要使用 scp 传到客户端,因为 ssh 客户程序很可能已经被攻陷。 总之,在一条不够安全的链路上 ssh 可能是必须的, 但也必须应付它所带来的难题。 安全脚本还应该检查用户以及职员成员的权限设置文件: .rhosts.shosts.ssh/authorized_keys 等等。 … 这些文件可能并非通过 MD5 来进行检查。 如果您的用户磁盘空间很大, 检查这种分区上面的文件可能非常耗时。 这种情况下, 采用标志来禁止使用 suid 可执行文件和设备在这些文件系统上出现将是一个好主意。 您可能会想看看 nodevnosuid 这两个选项 (参见 &man.mount.8;)。 尽管如此, 这些扫描仍然应该至少每周进行一次, 这样做的意义并不是检测有效的攻击, 而是检查攻击企图。 进程记帐 (参见 &man.accton.8;) 是一种相对成本较低的, 可以帮助您在被入侵后评估损失的机制。 对于找出入侵者是如何进入系统的这件事情来说, 它会非常的有所助益,特别是当入侵者什么文件都没有修改的情况下。 最后, 安全脚本应该处理日志文件, 而日志文件本身应该通过尽可能安全的方法生成 — 远程 syslog 可能非常有用。 入侵者会试图掩盖他们的踪迹, 而日志文件对于希望了解入侵发生时间的系统管理员来说则显得尤为重要。 保持日志文件的永久性记录的一种方法是在串口上运行系统控制台, 并持续不断地在一台安全的机器上收集这些信息。 偏执 带点偏执不会带来伤害。作为一种惯例, 系统管理员在不影响使用的便利的前提下可以启用任何安全特性,此外, 在经过深思熟虑之后,也可以增加一些 确实会 让使用变得不那么方便的安全特性。 更重要的是,有安全意识的管理员应该学会混合不同的安全策略 — 如果您逐字逐句地按照这份文档来配置您的机器, 那无异于向那些同样能得到这份文档的攻击者透露了更多的信息。 拒绝服务攻击 拒绝服务 (DoS) 这一节将介绍拒绝服务攻击。 DoS 攻击通常是基于数据包的攻击, 尽管几乎没有任何办法来阻止大量的伪造数据包耗尽网络资源, 但通常可以通过一些手段来限制这类攻击的损害,使它们无法击垮服务器。 限制服务进程 fork. 限制 springboard 攻击 (ICMP 响应攻击, ping 广播,等等)。 内核路由缓存 对于通过复制进程 (fork) 来进行服务的服务器的一种很常见的攻击是想办法耗尽其进程、 文件描述符或者内存, 直到机器彻底死掉。 inetd (参见 &man.inetd.8;) 提供了许多选项来限制这类攻击。 需要注意的是, 尽管能够阻止一台机器彻底垮掉, 但通常无法防止服务本身被击垮。 请仔细阅读 inetd 的联机手册, 特别是它的 以及 这三个选项。 伪造 IP 攻击能够绕过 inetd 选项, 因此, 这些选项需要配合使用。 某些独立的服务器也有类似的限制参数。 例如, Sendmail 就提供了自己的 选项, 它通常比 sendmail 的负载限制选项更为有效, 因为服务器负载的计算有滞后性。 您可以在启动 sendmail 时指定一个 MaxDaemonChildren 参数, 把它设的足够高以便承载您所需要的负荷, 当然, 不要高到足以让运行 sendmails 的机器死掉。 此外, 以队列模式 () 并把服务程序 (sendmail -bd) 和队列执行程序分别执行 (sendmail -q15m) 也是一个好主意。 如果您希望保证队列的实时性, 可以考虑使用更短的间隔, 例如 , 但同时也需要指定一个合理的子进程数, 也就是通过 MaxDaemonChildren 选项以免 那个 sendmail 造成重叠的故障。 Syslogd 可以被直接地攻击,因此, 强烈建议只要可行,就在启动它的时候加上 参数, 其他情况下,则至少应该加上 对于基于连接的服务,例如 tcpwrapper 的 reverse-identd, 都应该格外的小心, 因为它们都可能直接遭受攻击。 一般情况下, 基于安全考虑, 不应使用 tcpwrappers 所提供的 reverse-ident 这样的功能。 此外, 将内部服务保护起来, 阻止来自其他主机的访问也十分重要, 这些工作可以通过设置边界路由器来完成。 主要的想法, 是阻止来自您的 LAN 以外的访问, 这有助于避免 root 受到攻击。 尽可能配置排他式的防火墙, 例如, 用防火墙阻止所有的网络流量 除了 端口 A、B、 C、D,以及 M-Z。 通过采用这种方法, 您可以很容易地将低端口的访问阻止在外, 而又不难配置使防火墙放过那些明确需要开放的服务, 例如 named (如果您的机器准备作为域的主要解析服务器), ntalkdsendmail,以及其他可以从 Internet 访问的服务。 如果您尝试以其他方式配置防火墙 — 采用比较宽松的策略, 那么您将很有可能忘记 关掉 一两个服务, 或者在增加了一些服务之后忘记更新防火墙策略。 尽管如此, 仍然可以考虑允许段口号较高的那一部分端口进入数据, 这将保证那些需要这样特性的服务能够正常工作, 而又不影响低端口服务的安全性。 此外, 还应注意到 FreeBSD 允许您来控制动态绑定的端口的范围, 即一系列 net.inet.ip.portrange 变量,通过 sysctl 来完成设置。 (sysctl -a | fgrep portrange)。 这使得您完成较复杂的防火墙策略变得易如反掌。 例如, 您可能希望普通的高段端口的起止范围是 4000 到 5000, 而更高范围则是 49152 到 65535, 随后在防火墙中阻止低于 4000 的所有端口 (当然, 除了那些特地为 Internet 访问而开设的端口)。 ICMP_BANDLIM 另一种常被称作 springboard 的攻击也是非常常见的 DoS 攻击 — 它通过使服务器产生其无法处理的响应来达到目的。 最常见的攻击就是 ICMP ping 广播攻击。 攻击者通过伪造 ping 包, 将其源 IP 设置为希望攻击的机器的 IP。 如果您的边界路由器没有进行禁止 ping 广播地址的设置, 则您的网络将最终陷于响应伪造的 ping 之中, 特别是当攻击者同时使用了多个不同的网络时。 广播攻击能够产生超过 120 兆位的瞬时流量。 另一种常见的针对 ICMP 错误报告系统的 springboard 攻击, 通过建立可以生成 ICMP 出错响应的包, 攻击者能够攻击服务器的网络下行资源, 并导致其上行资源耗尽。 这种类型的攻击也可以通过耗尽 mbuf 来使得使得被攻击的服务器崩溃,特别是当这些服务器无法足够快地完成 ICPM 响应的时候。 可以通过为 FreeBSD 内核配置称为 的编译时选项来使这类攻击变得不那么有效。 最后一类主要的 springboard 是针对某些 inetd 的内部服务, 例如 udp echo 服务进行的。 攻击者简单地伪造一个来自服务器 A 的 echo 口的 UDP 包, 然后将这个包发到 B 的 echo 口。 于是, 两台服务器将不停地将包弹给对方。 攻击者能够将两台服务器的这种服务都耗竭, 并且通过这种方式, 之需要很少的包就可以让 LAN 超载。 类似的问题对 chargen 口也是存在的。 好的系统管理员应该关闭这些 inetd 的测试服务。 伪造的包攻击也可以用来使内核的路由缓存过载。 请参考 net.inet.ip.rtexpirertminexpire, 以及 rtmaxcache sysctl 参数。 伪造的包可以用随机的源 IP 攻击, 使得内核在路由表中产生一个临时的缓存项, 它可以通过 netstat -rna | fgrep W3 看到。 这些路由通常需要 1600 秒才会过期。 如果内核发现路由表变得太大, 它会动态地降低 rtexpire 但以 rtminexpire 为限。 这引发了两个问题: 在访问量不大的服务器上, 内核对于突然袭击的反应不够快。 rtminexpire 的值没有低到让内核在此类攻击时活下去的程度。 如果您的服务器通过 T3 或更快的线路接入 Internet, 那么通过 &man.sysctl.8; 来手动地降低 rtexpirertminexpire 就非常必要。 当然,绝不要把它们设置为零 (除非您想让机器崩溃) 将这两个参数设置为 2 通常已经足以抵御这类攻击了。 Kerberos 和 SSH 的访问问题 ssh KerberosIV 如果您打算使用, 那么 Kerberos 和 ssh 都有一些需要解决的问题。 Kerberos V 是一个很棒的验证协议, 但使用了它的 telnetrlogin 应用程序有一些 bug, 使得它们不适合处理二进制流。 而且, 除非使用了 选项, 否则默认情况下 Kerberos 并不加密会话。 ssh 在默认时加密所有的会话内容。 除了默认转发加密密钥, ssh 在所有的其他方面都做得很好。 这意味着如果您持有供您访问系统其他部分密钥的工作站作了很好的安全防护, 而您连到了一台不安全的机器上, 则您的密钥可能被别人获得。 尽管实际的密钥并没有被泄漏, 但由于 ssh 会在您登录的过程中启用一个转发端口, 如果攻击者拿到那台不安全的机器上的 root 那么他将能够利用那个端口来使用您的密钥, 从而访问您能够访问的那些机器。 我们建议您在使用 ssh 时配合 Kerberos 来完成工作人员的登录过程。 ssh 在编译时可以加入 Kerberos 支持。 在减少了潜在地暴露 ssh 密钥的机会的同时, 它还能够通过 Kerberos 来保护口令。 ssh 密钥只有在做过安全防护的机器上执行自动操作时才应使用 (这是 Kerberos 不适合的情形)。 此外,我们还建议您要么在 ssh 配置中关闭密钥转发, 要么在 authorized_keys 中增加 from=IP/DOMAIN 选项, 来限制这些密钥能够登录的来源机器。 Bill Swingle 部分重写、更新来自 DES,MD5,以及Crypt 安全 密码 crypt DES MD5 &unix; 系统上的每个用户都有一个与其帐户关联的口令。很显然, 密码只需要被这个用户和操作系统知道。为了保证口令的私密性, 使用了一种容易加密,却很难解密的被称作 单向散列 的方法来处理口令。换言之,我们刚刚说的那句话并不十分确切: 操作系统本身并不 真的 知道您的口令。 它只知道口令 经过加密的形式。 获取口令对应 明文 的唯一办法是采用暴力在口令可能的区间内穷举。 不幸的是,当 &unix; 刚刚出现时,安全地加密口令的唯一方法基于DES, 数据加密标准 ( the Data Encryption Standard )。 于是这给那些非美国居民带来了问题, 因为 DES 的源代码在当时不能被出口到美国以外的地方, FreeBSD 必须找到符合美国法律,但又要与其他那些使用 DES 的 &unix; 版本兼容的办法。 解决方案是把加密函数库分割为两个, 于是美国的用户可以安装并使用 DES 函数库, 而国际用户则使用另外一套库提供的一种可以出口的加密算法。 这就是 FreeBSD 为什么使用 MD5 作为它的默认加密算法的原因。 MD5 据信要比 DES 更安全,因此,安装 DES 更多地是出于兼容目的。 识别您采用的加密算法 在 FreeBSD 4.4 之前,libcrypt.a 曾经是 一个指向相应加密算法的符号连接。FreeBSD 4.4 开始,把 libcrypt.a 变成了一个可以配置的密码验证散列库。 现在这个库支持 DES,MD5和Blowfish散列函数。默认情况下,FreeBSD 使用 MD5 来加密口令。 可以很容易地识别 FreeBSD 使用哪种加密方法。 检查 /etc/master.passwd 文件中的加密密码是一种方法。 用 MD5 散列加密的密码通常要比用 DES 散列得到的长一些, 并且以 $1$ 字符开始。 以 $2a$ 开始的口令是通过 Blowfish 散列函数加密的。 DES 密码字符没有任何可以用于鉴别的特征, 但他们要比 MD5 短, 并且以不包括 $ 在内的 64 个可显示字符来表示, 因此相对比较短的、没有以美元符号开头的字符串很可能是一个 DES 口令。 新口令锁使用的密码格式是由 /etc/login.conf 中的 passwd_format 来控制的, 可供选择的算法包括 des, md5blf。 请参考 &man.login.conf.5; 联机帮助以获得更进一步的详情。 一次性口令 一次性口令 安全 一次性口令 S/Key 是基于单向 hash 功能的一次性密码管理方式。 为了考虑兼容性而使用了 MD4 散列, 而其他系统则使用了 MD5 和 DES-MAC。 S/Key 从 1.1.5 版之后就一直是 FreeBSD 基本系统的一部分, 包含这一特性的操作系统也日益增多。 S/Key 是 Bell Communications Research, Inc. 的注册商标。 从 FreeBSD 的 5.0 版开始, S/Key 被功能相同的 OPIE (One-time Passwords In Everything) 取代了。 OPIE 默认使用 MD5 散列。 下面将介绍三种不同的口令。 第一种是您常用的 &unix; 风格或 Kerberos 口令; 我们在后面的章节中将称其为 &unix; 口令。 第二种是使用 S/Key key 程序或 OPIE &man.opiekey.1; 程序生成, 并为 keyinit 或 &man.opiepasswd.1; 以及登录提示所接受的一次性口令,我们称其为 一次性口令。 最后一类口令是您输入给 key/opiekey 程序 (有些时候是 keyinit/opiepasswd 程序) 用以产生一次性口令的秘密口令,我们称其为 秘密口令 或简称为 秘密口令 秘密口令和您的 &unix; 口令毫无关系, 尽管可以设置为相同的, 但不推荐这么做。 S/Key 和 OPIE 秘密口令并不像旧式的 &unix; 口令那样只能限于8位以内在 &os; 中标准的登录口令最长可达 128 个字符那么长。。 您想要用多长的口令都可以。 有六、七个词的短句是很常见的选择。 在绝大多数时候, S/Key 或 OPIE 系统和 &unix; 口令系统完全相互独立地工作。 除了口令之外, 对于 S/Key 和 OPIE 还有两组至关重要的数据。 其一被称作 种子key, 它包括两个字符和五个数字。 另一个被称作 迭代轮数, 这是一个 1 到 100 之间的数字。 S/Key 通过将种子加到秘密口令后面, 并执行迭代轮数那么多次的 MD4/MD5 散列运算来得到结果, 并将结果表示为 6 个短的英文单词。 这 6 个英文单词就是您的一次性口令。 验证系统 (主要是 PAM) 会记录上次使用的一次性口令, 如果用户提供的口令的散列值与上次一致, 则可以通过身份验证。 由于使用了单向的散列函数, 因此即使截获了上次使用的口令, 也没有办法恢复出下次将要使用的口令; 每次成功登录都将导致迭代轮数递减, 这样用户和登录程序将保持同步。 每当迭代轮数减少到 1 时, 都必须重新初始化 S/Key 和 OPIE。 接下来将讨论和每个系统有关的三个程序。 keyopiekey 程序能够接收带迭代计数, 种子和秘密口令, 并生成一个一次性口令, 或一张包含所有有关口令的表格。 keyinitopiepasswd 程序分别用于初始化 S/Key 和 OPIE, 并修改口令、 迭代次数、种子和一次性口令。 keyinfoopieinfo 程序可以用于检查相应的验证数据文件 (/etc/skeykeys/etc/opiekeys) 并显示执行命令的用户当前的迭代轮数和种子。 我们将介绍四种不同的操作。 在安全的连接上通过 keyinitopiepasswd 来第一次设置一次性口令, 或修改口令及种子。 第二类操作是在不安全的连接上使用 keyinitopiepasswd 辅以在安全连接上执行的 keyopiekey 来完成同样的工作。 第三类操作是在不安全的连接上使用 key/opiekey 来登录。 最后一类操作是采用 keyopiekey 来生成大批的密码, 以便抄下来或打印出来,在没有安全连接的地方使用。 安全连接的初始化 第一次初始化 S/Key, 修改口令或种子需要在安全的连接 (例如, 在那台机器的控制台上或者通过 ssh) 登录来完成。 以自己的身份登录并执行不带参数的 keyinit 命令: &prompt.user; keyinit Adding unfurl: Reminder - Only use this method if you are directly connected. If you are using telnet or rlogin exit with no password and use keyinit -s. Enter secret password: Again secret password: ID unfurl s/key is 99 to17757 DEFY CLUB PRO NASH LACE SOFT 对于 OPIE, 则使用 opiepasswd &prompt.user; opiepasswd -c [grimreaper] ~ $ opiepasswd -f -c Adding unfurl: Only use this method from the console; NEVER from remote. If you are using telnet, xterm, or a dial-in, type ^C now or exit with no password. Then run opiepasswd without the -c parameter. Using MD5 to compute responses. Enter new secret pass phrase: Again new secret pass phrase: ID unfurl OTP key is 499 to4268 MOS MALL GOAT ARM AVID COED Enter new secret pass phrase:Enter secret password: 提示之后, 应输入一个密码或口令字。 请留意, 这并不是您用于登录的口令, 它用于生成一次性的登录密钥。 ID 这一行给出了所需的参数: 您的登录名, 迭代轮数, 以及种子。 登录系统时, 它能够记住这些参数并呈现给您, 因此无需记忆它们。 最后一行给出了与您的秘密口令对应的、用于登录的一个一次性口令; 如果您立即重新登录, 则它将是您需要使用的那个口令。 不安全连接初始化 如果您需要通过一个不安全的连接来初始化, 则应首先在安全连接上执行过一次 keyopiekey; 这可以在 &macintosh; 的桌面附件, 或是在可信的机器的 shell 上面完成。 此外还需要指定一个迭代轮数 (100 也许是一个较好的选择) 也可以选择一个自己的种子, 或让计算机随机生成一个。 在不安全的连接上 (当然是连到您希望初始化的机器上),使用 keyinit -s 命令: &prompt.user; keyinit -s Updating unfurl: Old key: to17758 Reminder you need the 6 English words from the key command. Enter sequence count from 1 to 9999: 100 Enter new key [default to17759]: s/key 100 to 17759 s/key access password: s/key access password:CURE MIKE BANE HIM RACY GORE 对于 OPIE, 则需要使用 opiepasswd &prompt.user; opiepasswd Updating unfurl: You need the response from an OTP generator. Old secret pass phrase: otp-md5 498 to4268 ext Response: GAME GAG WELT OUT DOWN CHAT New secret pass phrase: otp-md5 499 to4269 Response: LINE PAP MILK NELL BUOY TROY ID mark OTP key is 499 gr4269 LINE PAP MILK NELL BUOY TROY 为了接受默认的种子 ( keyinit 程序令人困惑地将其称作 key), 按下 Return。 在输入访问口令之前, 到一个有安全连接或 S/Key 桌面附件的机器上, 并给它同样的参数: &prompt.user; key 100 to17759 Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: <secret password> CURE MIKE BANE HIM RACY GORE 对于 OPIE: &prompt.user; opiekey 498 to4268 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: GAME GAG WELT OUT DOWN CHAT 现在回到不安全的连接, 并将生成的一次性口令粘贴到相应的应用程序中。 产生一个一次性密码 一旦初始化过 S/Key 或 OPIE, 当您登录时将看到类似这样的提示: &prompt.user; telnet example.com Trying 10.0.0.1... Connected to example.com Escape character is '^]'. FreeBSD/i386 (example.com) (ttypa) login: <username> s/key 97 fw13894 Password: 对于 OPIE 则是: &prompt.user; telnet example.com Trying 10.0.0.1... Connected to example.com Escape character is '^]'. FreeBSD/i386 (example.com) (ttypa) login: <username> otp-md5 498 gr4269 ext Password: 另外, S/Key 和 OPIE 提示有一个很有用的特性 (这里没有表现出来): 如果您在口令提示的地方按下 Return 则将开启提示返显, 您可以藉此看到自己所键入的内容。 如果试图手工键入一个一次性密码, 这会非常有用。 MS-DOS Windows MacOS 此时您需要生成一个一次性密码来回答这一提示。 这项工作必须在一个可信的系统上执行 keyopiekey 来完成。 (也可以找到 DOS、 &windows; 以及 &macos; 等操作系统上运行的版本)。 这个程序需要将迭代轮数和种子提供给它。 您可以从登录提示那里复制和粘贴它们。 在可信的系统上: &prompt.user; key 97 fw13894 Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: WELD LIP ACTS ENDS ME HAAG 对于 OPIE: &prompt.user; opiekey 498 to4268 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: GAME GAG WELT OUT DOWN CHAT 现在使用刚刚生成的一次性口令登录: login: <username> s/key 97 fw13894 Password: <return to enable echo> s/key 97 fw13894 Password [echo on]: WELD LIP ACTS ENDS ME HAAG Last login: Tue Mar 21 11:56:41 from 10.0.0.2 ... 产生多个一次性口令 有时,会需要到不能访问可信的机器或安全连接的地方。 这中情形下, 可以使用 keyopiekey 命令来一次生成许多一次性口令。 例如: &prompt.user; key -n 5 30 zz99999 Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: <secret password> 26: SODA RUDE LEA LIND BUDD SILT 27: JILT SPY DUTY GLOW COWL ROT 28: THEM OW COLA RUNT BONG SCOT 29: COT MASH BARR BRIM NAN FLAG 30: CAN KNEE CAST NAME FOLK BILK 对于 OPIE: &prompt.user; opiekey -n 5 30 zz99999 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: <secret password> 26: JOAN BORE FOSS DES NAY QUIT 27: LATE BIAS SLAY FOLK MUCH TRIG 28: SALT TIN ANTI LOON NEAL USE 29: RIO ODIN GO BYE FURY TIC 30: GREW JIVE SAN GIRD BOIL PHI 按顺序请求 5 个口令, 则指定了最后一个迭代轮数应该是多少。 注意这些将按按与使用相反的顺序显示。 如果您比较偏执, 可以手工写下这些结果; 一般来说把它粘贴到 lpr 就可以了。 注意,每一行都显示迭代轮数机器对应的一次性的密码; 一些人建议用完一个就划掉一个。 限制使用 &unix; 口令 S/Key 可以对 &unix; 口令的使用实施基于主机名、 用户名、 终端端口或登录会话的 IP 地址的各种限制。 这些限制可以在配置文件 /etc/skey.access 中找到。 &man.skey.access.5; 联机帮助提供了关于文件格式的详细资料, 并给出了更详细的使用这一配置文件时在安全方面需要注意的事项。 如果没有 /etc/skey.access 这个文件 (在 FreeBSD 4.X 系统上这是默认的), 那么所有的用户都可以使用 &unix; 口令。 然而如果它存在, 所有的用户将被要求使用 S/Key, 除非明确地在 skey.access 中配置允许这样做。 无论如何, &unix; 在控制台上总是可用的。 下面是一个示例的 skey.access 配置文件, 它展示了最常用的三类配置语句: permit internet 192.168.0.0 255.255.0.0 permit user fnord permit port ttyd0 第一行 (permit internet) 允许来自这些 IP 的用户 (这类 IP 很容易伪造) 使用 &unix; 口令。 这不应被认为是一种安全的机制, 因为使用不安全的网络的用户需要使用 S/Key 验证。 第二行 (permit user) 允许指定的用户, 在本例中是 fnord, 在任何时候使用 &unix; 口令。 一般说来, 只应为无法使用 key 程序, 例如使用哑终端的那些人, 或无法学会如何使用它的人来使用。 第三行 (permit port) 允许通过指定终端线的用户使用 &unix; 口令; 这可以被用于拨号用户。 OPIE 可以像 S/Key 一样对 &unix; 口令的使用进行基于 IP 的登录限制。 对应的文件是 /etc/opieaccess, 在 FreeBSD 5.0 以及更新一些的系统中它是缺省存在的。 请参阅 &man.opieaccess.5; 以了解关于这个文件进一步的情况, 以及安全方面需要进行的一些考虑。 这是一个示范的 opieaccess 文件: permit 192.168.0.0 255.255.0.0 这行允许指定 IP 地址的用户 (再次强调这种地址容易被伪造) 在任何时有使用 &unix; 口令登录。 如果 opieaccess 中没有匹配的规则, 则将默认拒绝任何非 OPIE 登录。 Tom Rhodes 作者: TCP Wrappers TCP Wrappers 任何熟悉 &man.inetd.8; 都应该听说过 TCP Wrappers, 但几乎没有人对它在网络环境中的作用有全面的理解。 几乎每个人都会安装防火墙来处理网络连接, 然而虽然防火墙有非常广泛的用途, 它却不是万能的, 例如它无法处理类似向连接发起者发送一些文本这样的任务。 而 TCP 软件能够完成它以及更多的其他事情。 接下来的几段中将讨论许多 TCP Wrappers 提供的功能, 并且, 还给出了一些配置实例。 TCP Wrappers 软件扩展了 inetd 为受其控制的服务程序实施控制的能力。 通过使用这种方法, 它能够提供日志支持、 返回消息给联入的连接、 使得服务程序只接受内部连接, 等等。 尽管防火墙也能够完成其中的某些功能, 但这不仅增加了一层额外的保护, 也提供了防火墙所不能提供的功能。 TCP Wrappers 所增加的功能不应被看作好的防火墙的替代品; 它应该与防火墙以及其他安全设施一道, 作为系统的一层额外的安全防护来看待。 由于这些配置是对于 inetd 配置的扩展, 因此读者应首先阅读 配置 inetd 一节。 初始配置 在 &os; 中使用 TCP Wrappers 的唯一要求是确保 inetd 在从 rc.conf 中启动时包含了 选项; 这是默认的设置。 当然, 还需要对 /etc/hosts.allow 进行适当的配置, 但 &man.syslogd.8; 在配置不当时会在系统日志中记录相关消息。 与其它的 TCP Wrappers 实现不同, 使用 hosts.deny 在这里被认为是不推荐和过时的做法。 所有的配置选项应放到 /etc/hosts.allow 中。 在最简单的配置中, 服务程序的连接策略是根据 /etc/hosts.allow 允许或阻止。 &os; 中的默认配置是允许一切发到由 inetd 所启动的服务的连接请求。 在基本配置之后将讨论更复杂的情况。 基本配置的形式通常是 - 服务 : 主机选项 : 动作。 + 服务 : 地址 : 动作。 这里 服务 是从 inetd 启动的服务程序的名字。 而 地址 可以使任何有效的主机名、 一个 IP 或由方括号 ([ ]) 括起来的 IPv6 地址。 动作字段可以使 allow 或 deny, 分别用于允许和禁止相应的访问。 在配置时您需要注意所有的配置都是按照第一个匹配的规则运转的, 这表示配置文件将按照顺序查找匹配规则, 而一旦找到匹配, 则搜索也就停止了。 另外也有许多其他选项, 这些将在后面介绍。 简单的配置行从上面这些描述之中可以很容易得出。 例如, 允许 POP3 连接通过 mail/qpopper 服务, 应把下面的行添加到 hosts.allow # This line is required for POP3 connections: qpopper : ALL : allow 增加这样之后, 需要重新启动 inetd。 可以通过使用 &man.kill.1; 命令来完成这项工作, 或使用 /etc/rc.d/inetdrestart parameter 参数。 高级配置 TCP Wrappers 也有一些高级的配置选项; 它们能够用来对如何处理连接实施更多的控制。 一些时候, 返回一个说明到特定的主机或请求服务的连接可能是更好的办法。 其他情况下, 记录日志或者发送邮件给管理员可能更为适合。 另外, 一些服务可能只希望为本机提供。 这些需求都可以通过使用 通配符, 扩展字符以及外部命令来实现。 接下来的两节将介绍这些。 外部命令 假设由于发生了某种状况, 而导致连接应该被拒绝掉, 而将其原因发送给发起连接的人。 如何完成这样的任务呢? 这样的动作可以通过使用 选项来实现。 当发起了连接请求时, 将调用一个命令或脚本。 在 hosts.allow 文件中已经给出了一个例子: # The rest of the daemons are protected. ALL : ALL \ : severity auth.info \ : twist /bin/echo "You are not welcome to use %d from %h." 这个例子将把消息 You are not allowed to use daemon from hostname. 返回给访问先前没有配置过允许访问的服务客户。 对于希望把消息反馈给连接发起者, 然后立即切断这样的需求来说, 这样的配置非常有用。 请注意所有反馈信息 必须 被引号 " 包围; 这一规则是没有例外的。 如果攻击者向服务程序发送大量的连接请求, 则可能发动一次成功的拒绝服务攻击。 另一种可能是针对这种情况使用 。 类似 也暗含拒绝连接, 并可以用来执行外部命令或服务。 与 不同的是, 不会向连接发起者发送回应。 考虑下面的配置: # We do not allow connections from example.com: ALL : .example.com \ : spawn (/bin/echo %a from %h attempted to access %d >> \ /var/log/connections.log) \ : deny 浙江拒绝来自 *.example.com 域的所有连接; 同时还将记录主机名, IP 地址, 以及对方所尝试连接的服务名字到 /var/log/connections.log 文件中。 除了前面已经介绍过的转义字符, 例如 %a 之外, 还有一些其它的转义符。 参考 &man.hosts.access.5; 联机手册可以获得完整的列表。 通配符选项 前面的例子都使用了 ALL。 其它选项能够将功能扩展到更远。 例如, ALL 可以被用来匹配每一个服务、 域,或 IP 地址。 另一些可用的通配符包括 PARANOID, 它可以用来匹配任何来自可能被伪造的 IP 地址的主机。 换言之, paranoid 可以被用来定义来自 IP 与其主机名不符的客户。 下面的例子将给您更多的感性认识: # Block possibly spoofed requests to sendmail: sendmail : PARANOID : deny 在这个例子中, 所有连接 sendmailIP 地址与其主机名不符的主机都将被拒绝。 如果服务器和客户机有一方的 DNS 配置不正确, 使用 PARANOID 可能会严重地削弱服务。 在设置之前, 管理员应该谨慎地考虑。 要了解关于通配符和他们的功能, 请参考 &man.hosts.access.5; 联机手册。 为了使设置能够生效, 应该首先把 hosts.allow 的第一行配置注释掉。 这节的开始部分已经说明了这一点。 Mark Murray 撰写者 Mark Dapoz 初稿 <application>KerberosIV</application> Kerberos 是一个网络附加系统/协议, 它使得用户能够通过一个安全服务器的服务来验证身份。 象远程登录,远程拷贝,系统间的相互文件拷贝和其他完成高风险任务的服务将被变得相当安全和可控制。 下面将具体介绍如何配置随 FreeBSD 发行的 Kerberos。 不过, 您还是应该阅读相应的联机手册以获得完整的说明。 安装 <application>KerberosIV</application> MIT KerberosIV 安装 Kerberos 是 &os; 的一项可选组件。 安装该软件最简单的办法就是 在使用 sysinstall 安装 FreeBSD 时选择 krb4krb5。 这样将会安装 eBones (KerberosIV) 或 Heimdal (Kerberos5) 的 Kerberos 实现。 采用实现的原因是它们在美国/加拿大 以外的地区开发, 因此这些国家之外的人使用, 而不必受美国的加密代码出口管制的限制。 此外, 您可以从 security/krb5 获取 Kerberos 的 MIT 实现。 创建最初的数据库 这项工作只需要在 Kerberos 服务器上完成。 首先确认没有旧的 Kerberos 数据库存在。 您应该进入到 /etc/kerberosIV 目录中并检查下述文件是否已经存在: &prompt.root; cd /etc/kerberosIV &prompt.root; ls README krb.conf krb.realms 如果您发现了除此之外的其它文件 (例如 principal.*master_key) 已经存在, 请使用 kdb_destroy 命令来销毁旧的数据库, 或者, 如果 Kerberos 没有在运行,简单地删除掉那些多余的文件。 现在必须编辑 krb.confkrb.realms 文件来定义您的 Kerberos 领域。 在本例中, 这个领域将是 EXAMPLE.COM 而其服务器是 grunt.example.com。 我们编辑或创建如下的 krb.conf 文件: &prompt.root; cat krb.conf EXAMPLE.COM EXAMPLE.COM grunt.example.com admin server CS.BERKELEY.EDU okeeffe.berkeley.edu ATHENA.MIT.EDU kerberos.mit.edu ATHENA.MIT.EDU kerberos-1.mit.edu ATHENA.MIT.EDU kerberos-2.mit.edu ATHENA.MIT.EDU kerberos-3.mit.edu LCS.MIT.EDU kerberos.lcs.mit.edu TELECOM.MIT.EDU bitsy.mit.edu ARC.NASA.GOV trident.arc.nasa.gov 在这个例子中, 除此之外的其它领域并不时必须的。 把他们在这里一并展示是为了演示如何让机器了解多个领域的存在。 简单起见, 在实际的配置中可以省略它们。 第一行命名了这个系统工作的领域。 其它行包含了领域/主机的记录。 每行的第一项是一个领域, 其后是在这个领域中充当 密钥分发中心 的主机名。 其后的 admin server 表示该主机同时还提供管理数据库服务。进一步的详细说明请参考 Kerberos 联机手册。 现在应该添加 grunt.example.comEXAMPLE.COM 领域, 同时追加一项以便将出现在 EXAMPLE.COM 领域中 .example.com 域的所有主机也加入进来。 krb.realms 这个文件需要按照下面的方法修改: &prompt.root; cat krb.realms grunt.example.com EXAMPLE.COM .example.com EXAMPLE.COM .berkeley.edu CS.BERKELEY.EDU .MIT.EDU ATHENA.MIT.EDU .mit.edu ATHENA.MIT.EDU 再次强调, 其它领域并不时必需的。 在这里只是要展示如何使用多个领域。 可以删掉它们以简化配置。 第一行将 指定的 系统置于所指名字的领域内。 这一行的其它部分则指明了特定子域内的主机应该默认属于哪个领域。 接下来我们就可以创建数据库了。 只有在 Kerberos 服务器上 (或密钥分发中心上) 才需要它。 可以通过 kdb_init 命令来完成这一步: &prompt.root; kdb_init Realm name [default ATHENA.MIT.EDU ]: EXAMPLE.COM You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter Kerberos master key: 现在我们应该保存密钥, 这样本机上运行的其他服务就能够了解这一变化。 用 kstash 命令来完成这一步: &prompt.root; kstash Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! 这一操作将把主口令保存到 /etc/kerberosIV/master_key 让一切运转起来 KerberosIV 初始配置 有两个主要的东西需要被添加到要用 Kerberos 来确保安全的 每一个 系统上。 它们的名字是 kpasswdrcmd。 这些程序允许另外系统改变 Kerberos 的密码, 在不同的系统上可能有不同的名字。 服务程序 kpasswdrcmd 使得其他系统能够修改 Kerberos 口令, 以及执行类似 &man.rcp.1;, &man.rlogin.1; 和 &man.rsh.1; 这样的命令。 我们添加下面这些记录: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: passwd Instance: grunt <Not found>, Create [y] ? y Principal: passwd, Instance: grunt, kdc_key_ver: 1 New Password: <---- enter RANDOM here Verifying password New Password: <---- enter RANDOM here Random password [y] ? y Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: rcmd Instance: grunt <Not found>, Create [y] ? Principal: rcmd, Instance: grunt, kdc_key_ver: 1 New Password: <---- enter RANDOM here Verifying password New Password: <---- enter RANDOM here Random password [y] ? Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <---- null entry here will cause an exit 创建服务器文件 现在需要分析在每台机器上定义的服务的所有情况。 为了做到这一点, 可以使用 ext_srvtab 命令。 这将创建一个文件, 它需要被 通过安全的途径 复制或移动到每一个 Kerberos 客户端的 /etc/kerberosIV 目录中。 在每一台服务器上都必须存在这个文件, 它对 Kerberos 的运行至关重要。 &prompt.root; ext_srvtab grunt Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Generating 'grunt-new-srvtab'.... 现在,这个命令只产生一个临时文件,必须被重命名为 srvtab 以便所有的服务可以识别它。 用 &man.mv.1; 命令把它挪到原系统的这个位置: &prompt.root; mv grunt-new-srvtab srvtab 如果文件是针对客户系统的, 而且网络可能会不安全, 则应把 client-new-srvtab 复制到可移动的介质上, 并通过物理上安全的方式拿走。 将其改名为 srvtab 并放到客户机的 /etc/kerberosIV 目录中, 并赋予 mode 600: &prompt.root; mv grumble-new-srvtab srvtab &prompt.root; chmod 600 srvtab 复制数据库 现在添加一些用户记录到数据库。 首先为用户 jane 创建其对应的项。 使用 kdb_edit 命令来完成此项工作: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: jane Instance: <Not found>, Create [y] ? y Principal: jane, Instance: , kdc_key_ver: 1 New Password: <---- enter a secure password here Verifying password New Password: <---- re-enter the password here Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <---- null entry here will cause an exit 测试全部相关信息 首先必须启动 Kerberos 的服务程序。 这里需要指出, 如果您正确地修改了 /etc/rc.conf 则系统在启动时会自动完成这个工作。 只有在 Kerberos 服务器上才需要这么做。 Kerberos 客户程序将自动地从 /etc/kerberosIV 目录中的文件或去所需要的信息。 &prompt.root; kerberos & Kerberos server starting Sleep forever on error Log file is /var/log/kerberos.log Current Kerberos master key version is 1. Master key entered. BEWARE! Current Kerberos master key version is 1 Local realm: EXAMPLE.COM &prompt.root; kadmind -n & KADM Server KADM0.0A initializing Please do not use 'kill -9' to kill this job, use a regular kill instead Current Kerberos master key version is 1. Master key entered. BEWARE! 接下来应使用 kinit 命令来获取与我们刚刚创建的 ID jane 对应的 ticket: &prompt.user; kinit jane MIT Project Athena (grunt.example.com) Kerberos Initialization for "jane" Password: 尝试使用 klist 列出句柄以了解是否真的拥有它们: &prompt.user; klist Ticket file: /tmp/tkt245 Principal: jane@EXAMPLE.COM Issued Expires Principal Apr 30 11:23:22 Apr 30 19:23:22 krbtgt.EXAMPLE.COM@EXAMPLE.COM 现在可以试试看用 &man.passwd.1; 来修改口令, 以验证 kpasswd 服务程序是否能够从 Kerberos 数据库中获得需要的授权: &prompt.user; passwd realm EXAMPLE.COM Old password for jane: New Password for jane: Verifying password New Password for jane: Password changed. 授予 <command>su</command> 特权 Kerberos 使我们能够给予 每一个 需要使用 root 特权的用户使用他们自己 s单独的 &man.su.1; 口令。 现在我们追加一个被授予 &man.su.1; 到 root 权限的 ID。 这件事是由与 root 相关联的一个 principal 实例来控制的。使用 kdb_edit 可以在 Kerberos 数据库中建立一个 jane.root 条目: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: jane Instance: root <Not found>, Create [y] ? y Principal: jane, Instance: root, kdc_key_ver: 1 New Password: <---- enter a SECURE password here Verifying password New Password: <---- re-enter the password here Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? 12 <--- Keep this short! Attributes [ 0 ] ? Edit O.K. Principal name: <---- null entry here will cause an exit 现在试试看获得相应的句柄, 以确认它已经正常工作了: &prompt.root; kinit jane.root MIT Project Athena (grunt.example.com) Kerberos Initialization for "jane.root" Password: 接下来我们需要把用户添加到 root.klogin 文件里: &prompt.root; cat /root/.klogin jane.root@EXAMPLE.COM 试试看 &man.su.1;: &prompt.user; su Password: 然后看看我们拥有哪些句柄: &prompt.root; klist Ticket file: /tmp/tkt_root_245 Principal: jane.root@EXAMPLE.COM Issued Expires Principal May 2 20:43:12 May 3 04:43:12 krbtgt.EXAMPLE.COM@EXAMPLE.COM 使用其它命令 在前文给出的粒子中, 我们创建了一个称为 jane 的用户, 以及一个 root 实例。 此处的用户名和它的 principal 相同, 这是 Kerberos 默认的; 一个形如 <username>.root<principal>.<instance> 将允许 <username> 使用 &man.su.1; 成为 root, 只要所需的那些条目在 root home 目录中的 .klogin 中存在的话: &prompt.root; cat /root/.klogin jane.root@EXAMPLE.COM 类似地, 如果用户的 home 目录中有这样的设置: &prompt.user; cat ~/.klogin jane@EXAMPLE.COM jack@EXAMPLE.COM 则表明在 EXAMPLE.COM 领域的经过身份验证的 jane 或者 jack (通过 kinit, 详情见前文) 能够使用 jane 的身份或系统 (grunt) 中的文件, 无论通过 &man.rlogin.1;, &man.rsh.1; 或是 &man.rcp.1;。 举例来说, jane 现在通过 Kerberos 登入了其它系统: &prompt.user; kinit MIT Project Athena (grunt.example.com) Password: &prompt.user; rlogin grunt Last login: Mon May 1 21:14:47 from grumble Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995 Or jack logs into jane's account on the same machine (jane having set up the .klogin file as above, and the person in charge of Kerberos having set up principal jack with a null instance): &prompt.user; kinit &prompt.user; rlogin grunt -l jane MIT Project Athena (grunt.example.com) Password: Last login: Mon May 1 21:16:55 from grumble Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995 Tillman Hodgson 撰写者 Mark Murray 原文来自 <application>Kerberos5</application> 在 &os;-5.1 之后的每一个 &os; 版本都只包含 Kerberos5 支持了, 因而, Kerberos5 是它们所包含的唯一的 Kerberos 版本, 其配置在绝大多数方面和 KerberosIV 非常类似。 下述信息只适用于 &os;-5.0 之后版本中的 Kerberos5。 希望使用 KerberosIV 的用户可以安装 security/krb4 port。 Kerberos 是一组附加的网络系统/协议, 用以让用户通过一台安全服务器提供的服务来验证身份。 包括远程登录、远程复制、在系统间安全地复制文件, 以及其它高危险性的操作, 由于其存在而显著地提高了安全型并且更加可控。 Kerberos 可以理解为一种身份验证代理系统。 它也被描述为一种受信第三方玮主导的身份验证系统。 Kerberos 只提供一种功能 — 在网络上安全地完成用户的身份验证。 它并不提供授权功能 (也就是说用户能够做什么操作) 或审计功能 (记录用户作了什么操作)。 一旦客户和服务器都使用了 Kerberos 来证明各自的身份之后, 他们还可以加密全部的通讯以保证业务数据的私密性和完整性。 因此, 强烈建议将 Kerberos 同其它提供授权和审计服务的安全手段联用。 接下来的说明可以用来指导如何安装 &os; 所附带的 Kerberos。 不过, 您仍然需要参考相应的联机手册以获得完整的描述。 为了展示 Kerberos 的安装过程, 我们约定: DNS 域 (zone) 为 example.org。 Kerberos 领域是 EXAMPLE.ORG。 在安装 Kerberos 时请使用实际的域名即使您只是想在内部网上用一用。 这可以避免 DNS 问题并保证了同其它 = Kerberos 之间的互操作性。 历史 Kerberos5 历史 Kerberos 最早由 MIT 作为解决网络安全问题的一个方案提出。 Kerberos 协议采用了枪加密, 因此客户能够在不安全的网络上向服务器 (以及相反地) 验证自己的身份。 Kerberos 是网络验证协议名字, 同时也是用以表达实现了它的程序的形容词。 (例如 Kerberos telnet)。 目前最新的协议版本是 5,在 RFC 1510 中有所描述。 该协议有许多免费的实现, 这些实现涵盖了许多种不同的操作系统。 最初研制 Kerberos 的麻省理工学院 (MIT) 也仍然在继续开发他们的 Kerberos 软件包。 在 US 它被作为一种加密产品使用, 因而历史上曾经受到 US 出口管制。 MIT Kerberos 可以通过 port (security/krb5) 来安装和使用。 Heimdal Kerberos 是另一种第 5 版实现, 并且明确地在 US 之外的地区开发, 以避免出口管制 (因此在许多非商业的类 &unix; 系统中非常常用。 Heimdal Kerberos 软件包可以通过 port (security/heimdal) 安装, 最新的 &os; 的最小安装也会包含它。 为使尽可能多的受众受益, 这份说明以 &os; 附带的 Heimdal 软件包为准。 配置 Heimdal <acronym>KDC</acronym> Kerberos5 密钥分发中心配置 密钥分发中心 (KDC) 是 Kerberos 提供的集中式验证服务 — 它是签发 Kerberos tickets 的那台计算机。 KDCKerberos 领域中的其它机器看来是 受信的, 因此必须格外注意其安全性。 需要说明 Kerberos 服务器只需要非常少的计算资源, 尽管如此, 基于安全理由仍然推荐使用独占的机器来扮演 KDC 的角色。 要开始配置 KDC, 首先请确认您的 /etc/rc.conf 文件包含了作为一个 KDC 所需的设置 (您可能需要适当地调整路径以适应自己系统的情况): kerberos5_server_enable="YES" kadmind5_server_enable="YES" kerberos_stash="YES" 只在 &os; 4.X 上使用。 接下来需要修改 Kerberos 的配置文件, /etc/krb5.conf [libdefaults] default_realm = EXAMPLE.ORG [realms] EXAMPLE.ORG = { kdc = kerberos.example.org } [domain_realm] .example.org = EXAMPLE.ORG 请注意这个 /etc/krb5.conf 文件假定您的 KDC 有一个完整的主机名, 即 kerberos.example.org。 如果您的 KDC 主机名与它不同, 则应添加一条 CNAME (别名) 项到 zone 中去。 对于有正确地配置过的 BIND DNS 服务器的大型网络, 上述例子可以精简为: [libdefaults] default_realm = EXAMPLE.ORG 将下面的内容加入到 example.org zone 数据文件中: _kerberos._udp IN SRV 01 00 88 kerberos.example.org. _kerberos._tcp IN SRV 01 00 88 kerberos.example.org. _kpasswd._udp IN SRV 01 00 464 kerberos.example.org. _kerberos-adm._tcp IN SRV 01 00 749 kerberos.example.org. _kerberos IN TXT EXAMPLE.ORG. 接下来需要创建 Kerberos 数据库。 这个数据库包括了使用主密码加密的所有实体的密钥。 您并不需要记住这个密码, 它会保存在一个文件 (/var/heimdal/m-key) 中。 要创建主密钥, 需要执行 kstash 并输入一个口令。 主密钥一旦建立, 您就可以用 kadmin 程序的 -l 参数 (表示 local) 来初始化数据库了。 这个选项让 kadmin 直接地修改数据库文件而不是通过 kadmind 的网络服务。 这解决了在数据库创建之前连接它的鸡生蛋的问题。 进入 kadmin 提示符之后, 用 init 命令来创建领域的初始数据库。 最后, 仍然在 kadmin 中, 使用 add 命令来创建第一个 principal。 暂时使用全部的默认设置, 随后可以在任何时候使用 modify 命令来修改这些设置。 另外, 也可以用 ? 命令来了解可用的选项。 下面是一个典型的数据库创建过程: &prompt.root; kstash Master key: xxxxxxxx Verifying password - Master key: xxxxxxxx &prompt.root; kadmin -l kadmin> init EXAMPLE.ORG Realm max ticket life [unlimited]: kadmin> add tillman Max ticket life [unlimited]: Max renewable life [unlimited]: Attributes []: Password: xxxxxxxx Verifying password - Password: xxxxxxxx 现在是启动 KDC 服务的时候了。 运行 /etc/rc.d/kerberos start 以及 /etc/rc.d/kadmind start 来启动这些服务。 尽管此时还没有任何正在运行的 Kerberos 服务, 但您仍然可以通过获取并列出您刚刚创建的那个 principal (用户) 的 ticket 来验证 KDC 确实在正常工作, 使用 KDC 本身的功能: &prompt.user; k5init tillman tillman@EXAMPLE.ORG's Password: &prompt.user; k5list Credentials cache: FILE:/tmp/krb5cc_500 Principal: tillman@EXAMPLE.ORG Issued Expires Principal Aug 27 15:37:58 Aug 28 01:37:58 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG 为 <application>Kerberos</application> 启用 Heimdal 服务 Kerberos5 启用服务 首先我们需要一份 Kerberos 配置文件 /etc/krb5.conf 的副本。 只需简单地用安全的方式 (使用类似 &man.scp.1; 的网络工具, 或通过软盘) KDC 上的版本覆盖掉客户机上的对应文件就可以了。 接下来需要一个 /etc/krb5.keytab 文件。 这是提供 Kerberos 服务的服务器和工作站的一个主要区别 — 服务器必须有 keytab 文件。 这个文件包括了服务器的主机密钥, 这使得 KDC 得以验证它们的身份。 此文件必须以安全的方式传到服务器上, 因为如果密钥被公之于众, 则安全也就毁于一旦。 也就是说, 通过明文的通道, 例如 FTP 是非常糟糕的想法。 一般来说, 您会希望使用 kadmin 程序来把 keytab 传到服务器上。 由于也需要使用 kadmin 来为主机建立 principal (KDC 一端的 krb5.keytab), 因此这并不复杂。 注意您必须已经获得了一个 ticket 而且这个 ticket 必须许可使用 kadmind.acl 中的 kadmin 接口。 请参考 Heimdal info 中的 Remote administration(远程管理) 一节 (info heimdal) 以了解如何设计访问控制表。 如果不希望启用远程的 kadmin 操作, 则可以简单地采用安全的方式连接 KDC (通过本机控制台, &man.ssh.1; 或 Kerberos &man.telnet.1;) 并使用 kadmin -l 在本地执行管理操作。 安装了 /etc/krb5.conf 文件之后, 您就可以使用 Kerberos 上的 kadmin 了。 add --random-key 命令可以用于添加主机 principal, 而 ext 命令则允许导出服务器的主机 principal 到它的 keytab 中。 例如: &prompt.root; kadmin kadmin> add --random-key host/myserver.example.org Max ticket life [unlimited]: Max renewable life [unlimited]: Attributes []: kadmin> ext host/myserver.example.org kadmin> exit 注意 ext 命令 (这是 extract 的简写) 默认时会把导出的密钥放到 /etc/krb5.keytab 中。 如果您由于没有在 KDC 上运行 kadmind (例如基于安全理由) 因而无法远程地使用 kadmin 您可以直接在 KDC 上添加主机 principal (host/myserver.EXAMPLE.ORG) 随后将其导出到一个临时文件中 (以免覆盖 KDC 上的 /etc/krb5.keytab), 方法是使用下面的命令: &prompt.root; kadmin kadmin> ext --keytab=/tmp/example.keytab host/myserver.example.org kadmin> exit 随后需要把 keytab 复制到服务器上 (例如使用 scp 或软盘)。 一定要指定一个不同于默认的 keytab 名字以免覆盖 KDC 上的 keytab。 到现在您的服务器已经可以同 KDC 通讯了 (因为已经配置了 krb5.conf 文件), 而且它还能够证明自己的身份 (由于配置了 krb5.keytab 文件)。 现在可以启用一些 Kerberos 服务。 在这个例子中, 我们将在 /etc/inetd.conf 中添加下面的行来启用 telnet 服务, 随后用 /etc/rc.d/inetd restart 重启 &man.inetd.8; 服务来使设置生效: telnet stream tcp nowait root /usr/libexec/telnetd telnetd -a user 关键的部分是 -a (表示验证) 类型设置为用户 (user)。 请参考 &man.telnetd.8; 联机手册以了解细节。 使用 Heimdal 来启用客户端 <application>Kerberos</application> Kerberos5 客户端配置 设置客户机是非常简单的。 在正确配置了 Kerberos 的网络中, 只需要将位于 /etc/krb5.conf 的配置文件进行一下设置就可以了。 这一步骤可以简单地通过安全的方式将文件从 KDC 复制到客户机上来完成。 尝试在客户机上执行 kinitklist, 以及 kdestroy 来测试获取、 显示并删除 刚刚为 principal 建立的 ticket 是否能够正常进行, 如果能, 则用其它的 Kerberos 应用程序来连接启用了 Kerberos 的服务。 如果应用程序不能正常工作而获取 ticket 正常, 则通常是服务本身, 而非客户机或 KDC 有问题。 在测试类似 telnet 的应用程序时, 应考虑使用抓包程序 (例如 &man.tcpdump.1;) 来确认您的口令没有以明文方式传输。 尝试使用 telnet-x 参数, 它将加密整个数据流 (类似 ssh)。 核心的 Kerberos 客户端应用 (按照传统命名, 包括了 kinitklistkdestroy, 以及 kpasswd) 已经随 基本的 &os; 安装到了系统上。 请注意 5.0 之前的 &os; 版本将它们改名为 k5initk5listk5destroyk5passwd, 以及 k5stash (尽管这些命令通常只会用到一次)。 许多非核心的 Kerberos 客户应用程序也是默认安装的。 在 Hemidal 的 最小 安装理念下, telnet 是唯一一个采用了 Kerberos 的服务。 Heimdal port 则提供了一些默认不安装的客户应用程序, 例如启用了 Kerberos 版本的 ftprshrcprlogin 以及一些更不常用的程序。 MIT port 也包括了一整套 Kerberos 客户应用程序。 用户配置文件: <filename>.k5login</filename> 和 <filename>.k5users</filename> Kerberos5 用户配置文件 在某个领域中的用户往往都有自己的 Kerberos principal (例如 tillman@EXAMPLE.ORG) 并映射到本机用户帐户 (例如本机上名为 tillman 的帐户)。 客户端应用程序, 如 telnet 通常并不需要用户名或 principal。 不过, 有时您可能会需要赋予某些没有匹配 Kerberos principal 的人使用本地用户帐户的权限。 例如 tillman@EXAMPLE.ORG 可能需要访问本地的 webdevelopers 用户帐号。 其它 principal 可能也会需要访问这个本地帐号。 用户 home 目录中的 .k5login.k5users 这两个文件可以配合 .hosts.rhosts 来有效地解决这个问题。 例如, 如果 .k5login 中有如下内容: tillman@example.org jdoe@example.org 并放到了本地用户 webdevelopers 的 home 目录中, 则列出的两个 principals 都可以使用那个帐号, 而无须共享口令。 建议您在开始实施之前首先阅读这些命令的联机帮助。 特别地, ksu 的联机手册包括了 .k5users 的相关内容。 <application>Kerberos</application> 提示、技巧和故障排除 Kerberos5 故障排除 当使用 Heimdal 或 MIT Kerberos ports 时, 需要确认 PATH 环境变量把 Kerberos 客户应用列在系统自带的版本之前。 同一领域内的所有计算机的时间设置是否同步? 如果不是的话, 则身份验证可能会失败。 描述了如何使用 NTP 来同步时钟。 MIT 和 Heimdal 能够很好地互操作。 一个例外是 kadmin, 因为这个协议没有被标准化。 如果您改变了主机名, 您还需要修改您的 host/ principal 并更新 keytab。 这一规律也适用于类似 Apache 的 www/mod_auth_kerb 所使用的 www/ principal 这样的特殊 keytab 项。 您的领域中的每一台主机必须在 DNS (或至少在 /etc/hosts 中) 可以解析 (同时包括正向和反向)。 CNAME 能够正常使用, 但必须有正确的对应 A 和 PTR 记录。 此时给出的错误信息可能很让人困惑: Kerberos5 refuses authentication because Read req failed: Key table entry not found 某些作为客户使用您的 KDC 的操作系统可能没有将 ksu 设置为 setuid root 的权限。 这意味着 ksu 将不能够正常工作, 从安全角度说这是一个不错的主意, 但可能令人烦恼。 这类问题并不是 KDC 的错误。 使用 MIT Kerberos 时, 如果希望允许一个 principal 拥有超过默认的十小时有效期的 ticket 则必须使用 kadmin 中的 modify_principal 来修改 principal 本身以及 krbtgt 的 maxlife(最大有效期)。 此后, principal 可以使用 kinit-l 参数来请求一个有更长有效期的 ticket。 如果在 KDC 上运行了听包程序, 并在工作站上执行 kinit, 您可能会注意到 TGT 是在 kinit 一开始执行的时候就发出了的 — 甚至在您输入口令之前! 关于这个现象的解释是 Kerberos 服务器可以无限制地收发 TGT (Ticket Granting Ticket) 给任何未经授权的请求; 但是, 每一个 TGT 都是使用用户的口令派生出来的密钥进行加密的。 因此, 当用户输入口令时它并不会发送给 KDC, 而是直接用于解密 kinit 所拿到的 TGT。 如果解密过程得到了一个包含合法的时间戳的有效 ticket, 则说明用户的 Kerberos 凭据有效。 这些凭据包含了一个会话密钥用以在随后建立 Kerberos 服务器的加密通讯, 传递由服务器自己的私钥加密的实际的 ticket-granting ticket。 这个第二层加密对于用户来说是看不到的, 但它使得 Kerberos 服务器能够验证每一个 TGT 的真实性。 如果需要有效期更长的 ticket (例如一周) 而且您使用 OpenSSH 连接保存您的 ticket 的机器, 请确认 sshd_config 中的 Kerberos 被设置为 no 否则在注销时会自动删除所有的 ticket。 切记主机的 principals 的 ticket 有效期一定要比用户的长。 如果您的用户 principal 的有效期是一周, 而所连接的主机的有效期是九个小时, 则缓存的主机 principal 将先行过期, 结果是 ticket 缓存无法正常工作。 当配置 krb5.dict 文件来防止使用特定的简单口令 (kadmind 的联机手册中简要介绍了它), 请切记只有指定了口令策略的 principals 才会使用它们。 krb5.dict 文件的格式很简单: 每个串占一行。 创建一个到 /usr/share/dict/words 的符号连接会很有用。 与 <acronym>MIT</acronym> port 的区别 MIT 和 Heimdal 主要的区别在于 kadmin 程序使用不同 (尽管等价) 的命令和协议。 如果您的 KDCMIT 的, 则其影响是不能使用 Heimdal 的 kadmin 程序来远程管理 KDC (或相反)。 完成同样工作的命令可能会有些许的不同。 推荐按照 MIT Kerberos 的网站 () 上的说明来操作。 请小心关于路径的问题, MIT port 会默认安装到 /usr/local/, 您因此可能会执行 普通的 系统应用程序而非 MIT, 如果您的 PATH 环境变量把 把系统目录放在前面的话。 如果使用 &os; 提供的 MIT security/krb5 port, 一定要仔细阅读 port 所安装的 /usr/local/share/doc/krb5/README.FreeBSD, 如果您想知道为什么通过 telnetdklogind 登录时会出现一些诡异的现象的话。 最重要地, incorrect permissions on cache file(缓存文件权限不正确) 行为需要使用 login.krb5 来进行验证, 才能够正确地修改转发凭据的属主。 缓解 <application>Kerberos</application> 的限制 Kerberos5 限制和不足 <application>Kerberos</application> 是一种 all-or-nothing 方式 在网络上启用的每个服务都必须进行修改以便让其能够配合 Kerberos 工作 (否则就只能使用其它方法来保护它们不受网络攻击的侵害), 如果不是这样, 则用户的凭据就有可能被窃取并再次使用。 一个例子是对所有的远程 shell (例如通过 rshtelnet) 启用了 Kerberos 但没有将使用明文验证的 POP3 邮件服务器 Kerberos化。 <application>Kerberos</application> 是为单用户工作站设计的 在多用户环境中 Kerberos 的安全性会被削弱。 这是因为它把 ticket 保存到 /tmp 目录中, 而这个目录可以被任何用户读取。 如果有用户与其它人同时共享一台计算机 (也就是 multi-user), 则这个用户的 ticket 就可能被其它用户窃取 (复制)。 可以通过使用 -c 文件名 这样的命令行选项, 或者(推荐的)改变 KRB5CCNAME 环境变量来避免这个问题, 但很少有人这么做。原则上, 将 ticket 保存到用户的 home 目录并简单地设置权限就能够缓解这个问题。 KDC 会成为单点崩溃故障点 根据设计, KDC 必须是安全的, 因为主密码数据库保存在它上面。 决不应该在 KDC上面运行其它服务, 而且还应确保它的物理安全。 由于 Kerberos 使用同一个密钥 (传说中的那个 密钥) 来加密所有的密码, 而将这个文件保存在 KDC, 因此其安全尤为重要 不过, 主密钥的泄露并没有想象中的那么可怕。 主密钥只用来加密 Kerberos 数据库以及产生随机数发生器的种子。 只要 KDC 是安全的, 即使攻击者拿到了主密钥也做不了什么。 另外, 如果 KDC 不可用 (例如由于拒绝服务攻击或网络故障) 则网络服务将由于验证服务无法进行而不能使用, 从而导致更大范围的拒绝服务攻击。 通过部署多个 KDC (一个主服务器, 配合一个或多个从服务器) 并采用经过仔细设计和实现的备用验证方式可以避免这种问题 (PAM 是一个不错的选择)。 <application>Kerberos</application> 的不足 Kerberos 允许用户、主机和服务之间进行相互认证。 但它并没有提供机制来向用户、主机或服务验证 KDC。 这意味着种过木马的程序,例如 kinit 有可能记录用户所有的用户名和密码。 尽管如此, 可以用类似 security/tripwire 这样的文件系统完整性检查工具来避免此类情况的发生。 相关资源和其它资料 Kerberos5 外界的资源 The Kerberos FAQJ Designing an Authentication System: a Dialog in Four Scenes RFC 1510, The Kerberos Network Authentication Service (V5) MIT Kerberos home page Heimdal Kerberos home page Gary Palmer 作者 Alex Nash 防火墙 防火墙 安全 防火墙 对于接入 Internet 的人来说, 防火墙是一个越来越让人感兴趣的领域。 人们甚至在设法寻找一些能够在私有网络中使用并提供更好安全型的应用程序。 这节将介绍防火墙是什么, 如何使用它们, 以及如何利用 &os; 内核提供的机制来实现它。 人们经常认为在内部网络与 硕大无朋而臭名昭著的 Internet 之间建立一个防火墙能够解决所有的安全问题。 这可能会有所帮助, 但糟糕的防火墙设置可能要比没有防火墙更加危险。 防火墙可以为系统增加另一个安全层, 但不可能完全阻止一些入侵高手侵入系统。 如果觉得防火墙能够完全阻止入侵而放松了安全设置, 那可能会让黑客侵入系统变得更加容易。 防火墙是什么? 目前常见的 Internet 防火墙主要有两种类型。 第一种类型正式的名字叫 包过滤路由器, 这类防火墙通过一台接入多个网段的机器, 以及一组规则来决定转发或阻止数据包的传输。 第二种类型被称为 代理服务器, 依赖服务程序来完成包的转发, 而内核的包转发则可能被禁用。 有时,一些站点同时使用两种类型的防火墙, 这样只有某个特定的机器 (称为 bastion host) 能够通过包过滤路由器将包发给内网。 代理服务器在 bastion host 上运行, 这通常比一般的验证机制更安全。 FreeBSD 有一个内核数据包过滤程序 (也就是人们熟悉的 IPFW), 本节余下的部分将集中介绍它。 可以在 FreeBSD 上通过安装第三方软件来建立代理服务器, 但限于篇幅, 这里将不予介绍。 包过滤路由器 路由器是负责在网络之间转发数据的机器。 包过滤路由器通过将每一个包与一组规则表对比, 然后决定是否转发它来完成其功能。 多数现代的 IP 路由软件都包括了包过滤功能, 并默认转发所有的包。 为了启用过滤器, 需要您定义一组规则。 为了确定一个包是否应该通过, 防火墙需要便利其规则集中所有于包头匹配的规则。 一旦发现一个匹配, 则会采取规则所指定的动作。 规则动作可以是丢弃包, 转发包, 甚至给发包的人发送一个 ICMP 消息。 只有第一个匹配是有效的, 因为规则是按顺序进行搜索的。 因此, 规则表也可以称作 规则链 包的匹配规则随所使用的软件的不同而不同, 但基本上典型的包过滤防火墙都允许基于源 IP 地址、 目的 IP 地址、 源端口号、 目的端口号 (对于那些支持端口号的协议), 甚至协议类型 (UDP, TCP, ICMP, etc) 的过滤。 代理服务器 代理服务器上的那些普通的系统服务 (telnetdftpd等等) 换成了一些特别的服务。 这些服务被称为 代理服务, 因为它们只允许进行一个方向的连接。 这使得您可以在作为防火墙的机器上运行 (举例来说) 一个代理的 telnet 服务, 而人们可以从外面 telnet 到防火墙上, 并通过适当的验证之后, 就能够访问内网 (另外, 代理服务器也可以用来让内网能够访问外网)。 一般而言代理服务器较之普通的服务器更为安全, 而且能够使用更多的验证方式, 包括 一次性 口令系统等等, 因此即使有人拿到了您的口令, 他们也没有办法用这个口令做什么,因为口令在第一次用过之后马上就过期了。 由于并没有授予用户使用代理本身的权限, 因此在防火墙上做后门并进而进行更多的破坏会变得困难许多。 代理服务器通常有更多的限制访问的方法, 例如可以设置只有从特定主机才能够访问到服务器。 许多代理服务软件也允许管理员来指定哪些用户可以访问哪些机器。 当然, 能够使用哪些机制很大程度上取决于采用了什么代理软件。 IPFW 能用来做什么? ipfw FreeBSD 提供的 IPFW 软件, 是一个内核级的包过滤和审计系统, 它同时还提供了一个用户界面的控制工具, 即 &man.ipfw.8;。 这两部分配合使用, 您可以轻松地定义和查询内核在进行路由决策时所采用的规则。 IPFW 有两个相关的部分。 防火墙部分实施的是包过滤。 另一部分是 IP 审计, 它将记录路由器的使用, 并采用与防火墙部分类似的规则。 这样, 管理员就能够监视从特定机器上使用了多少路由资源, 举例来说, 它转发了多少了多少 WWW 的访问流量。 由于 IPFW 的这种设计, 您也可以把 IPFW 用在非路由的哪些机器上, 以便对进入和送出的连接进行包过滤。 这是 IPFW 更为普遍的用法中的一个特例, 而此时您仍然可以使用相同的命令和技巧。 在 FreeBSD 上启用 IPFW ipfw 启用 由于 IPFW 的主要部分是在内核中运行的, 因此会需要在内核配置文件中添加一些选项, 这取决于您需要使用哪些机制, 随后是重新编译内核。 请参见 "Reconfiguring your Kernel" () 一节来了解如何重新编译内核。 IPFW 的默认策略是 deny ip from any to any。 因此如果您没有在启动时增加其他策略来允许一些包进入, 则如果使用了启用过防火墙的内核, 则您将把自己挡在服务器外面。 我们建议您在第一次使用时在 /etc/rc.conf 中设置 firewall_type=open, 然后再到 /etc/rc.firewall 中慢慢微调它。 保险起见, 您可能会考虑在本地控制台上, 而不是通过 ssh 来完成防火墙的配置。 另一种方法是同时启用 IPFIREWALLIPFIREWALL_DEFAULT_TO_ACCEPT 两个选项,这时 IPFW 的默认规则将是 allow ip from any to any 从而避免了将自己锁在外面的尴尬局面。 - 目前一共有五个与 IPFW 有关的内核选项: - + 目前一共有四个与 IPFW 有关的内核选项: + options IPFIREWALL 将包过滤部分的代码编译进内核。 options IPFIREWALL_VERBOSE 启用通过 &man.syslogd.8; 记录的日志。 如果没有指定这个选项, 即使您在过滤规则中指定记录包, 也不会真的记录它们。 options IPFIREWALL_VERBOSE_LIMIT=10 限制通过 &man.syslogd.8; 记录的每项包规则的记录条数。 在恶劣的环境中如果您想记录防火墙的活动, 而又不想由于 syslog 洪水一般的记录而导致拒绝服务攻击, 那么这个选项将会很有用。 当规则链中的某一项达到这一限制数值时, 它所对应的日志将不再记录。 如果需要恢复, 则需要使用 &man.ipfw.8; 工具来复位对应的计数器: &prompt.root; ipfw zero 4500 这里 4500 是希望继续记录日志的规则在链中的编号。 options IPFIREWALL_DEFAULT_TO_ACCEPT 这将把默认的规则动作从 deny 改为 allow。 这可以防止在没有配置防火墙之前使用启用过 IPFIREWALL 支持的内核重启时把自己锁在外面。 另外, 如果您经常使用 &man.ipfw.8; 来解决一些问题时它也非常有用。 尽管如此, 在使用时应该小心, 因为这将使防火墙敞开, 并改变它的行为。 - + 先前版本的 FreeBSD 包括了一个 - IPFIREWALL_ACCT 选项。 它现在已经过时了, + IPFIREWALL_ACCT 选项。 它现在已经过时了, 因为新的防火墙代码已经包括了审计机制。 配置 IPFW ipfw 配置 对于 IPFW 软件的配置是通过 &man.ipfw.8; 来完成的。 它的命令看上去很复杂, 但只要您理解了其结构, 就会感到很简单。 目前这个工具有四种不同的命令: 添加/删除、 列表、 清空规则链以及让审计项归零。 添加删除类的命令主要用来建立控制如何接受、拒绝和记录包的规则。 列表类命令用于检视目前的规则集 (有时也称作规则链) 和包计数器 (审计)。 清空规则链则删除链中的所有规则, 而审计项归零则可以让一些审计项重新从零开始计数。 改变 IPFW 的规则 这类命令的格式是: ipfw -N 命令 编号 动作 log(日志) 协议 地址 其它选项 当使用这种形式的命令时,有一个可用的参数: -N 在输出中解析地址和服务的名字。 给出的 命令 可以简写为能够为一分辨它们的最短形式。 可用的 命令 包括: add 添加一个防火墙/审计规则到规则链中。 delete 从规则链中删除一项防火墙/审计规则。 先前版本的 IPFW 使用分别的防火墙和审计规则项。 目前的版本则为每一个防火墙规则项进行审计。 如果给出了 编号 值, 则它将决定规则项在链中的位置。 如果没有指定, 则系统会自动分配一个比链的最后一项大 100 的编号 (当然, 不包括默认规则, 即 65535 号规则, deny)。 选项 log 则将使匹配规则的包输出到控制台上, 当然前提是把 IPFIREWALL_VERBOSE 编译进内核。 可用的 动作 包括: reject 丢掉包, 并回应一个(相应的) ICMP 主机或端口不可达消息给包的来源地址。 allow 让包通过。 (等价的别名: passpermit、 以及 accept) deny 丢弃包。 但源地址并不会得到相关的 ICMP 消息通知 (因此对它来说就像包没有到达目的地址一样)。 count 更新包过滤启但并不执行允许/丢弃的动作。 此后将会继续查找规则链中的下一条规则。 每一个 动作 都可以使用其无二义性的最短前缀来代替。 可以指定的 协议 是: all 匹配任何的 IP 包 icmp 匹配 ICMP 包 tcp 匹配 TCP 包 udp 匹配 UDP 包 可以指定的 地址 是: from 地址/掩码端口 to 地址/掩码端口 via 网络接口名 只有在使用支持 端口协议 (UDP and TCP) 时才能指定端口。 是一个可选的选项, 它可以通过指定来自某个本地网络接口的 IP 地址或名字 (例如 ed0) 来匹配来自那个接口的包。 接口的单元号可以用通配符来指定。例如, 使用 ppp* 来匹配所有的内核 PPP 接口。 指定 地址/掩码 的语法是: 地址 或者 地址/掩码位数 或者 地址:掩码模式 可以在 IP 地址的位置指定一个有效的主机名。 是一个十进制的数, 用以表达地址掩码中的前多少位应当被置一。 例如, 指定 192.216.222.1/24 将建立一个匹配对应 C 类子网的掩码 (在本例中, 192.216.222)。 是一个将与之执行逻辑与操作的 IP 地址。 此外, 还可以用 any 来指定 任意 IP 地址 端口地址范围可以指定为: 端口,端口,端口 如果想指定一组不连续的端口。 用 端口-端口 来指定一组连续的端口。 这两种格式可以在同一规则中使用, 但连续端口必须先于单个端口指定。 可用的 其它选项 是: frag 匹配数据报中非第一分片的所有分片。 in 匹配进入的包。 out 匹配送出的包。 ipoptions 标志 匹配 IP 头包含逗号分隔的 标志 的包。 支持的 IP 选项包括: ssrr (严格使用源路由)、 lsrr (使用松散的源路由)、 rr (记录包路由)、 以及 ts (时间戳)。 如果想指定不包括某个标志, 则在选项前加入一个 ! established 匹配属于已经建立的 TCP 连接的包 (也就是说其 RST 或 ACK 是置1的)。 您可以通过在规则链中较早的位置上放置 established 规则来优化防火墙性能。 setup 匹配尝试建立 TCP 连接的包 (SYN 置位而 ACK 没有)。 tcpflags 标志 匹配 TCP 报头包括指定的 标志 的包。 支持的标志是 finsyn, rstpsh, ack, 以及 urg。 如果需要匹配某一位为0, 则在对应的标志前面加 ! icmptypes 类型 匹配 ICMP 类型在 类型 表中的包。 这个表使用逗号分隔, 可以指定任何范围和/或单个的类型。 常见的 ICMP 类型包括: 0 原样回应 (ping 响应), 3 目的不可达、 5 重定向、 8 原样回应请求 (ping 请求), 以及 11 超时 (在 &man.traceroute.8; 这样的程序中用来追踪 TTL超时)。 列出 IPFW 规则 这类命令的格式是: ipfw -a -c -d -e -t -N -S list 七个标志的意义分别是: -a 当列条目时,显示计数器的值。这个选项是可以看到计数器值的唯一方法。 -c 以紧凑的形式列出规则。 -d 除了静态规则之外, 还列出动态的规则。 -e 如果指定了 , 同时列出已经过期的动态规则。 -t 列出每一规则的最后匹配时间。 显示的格式和 &man.ipfw.8; 使用的时间语法并不兼容。 -N 解析地址和服务的名字。 -S 显示每个规则所述的规则集。 如果没有指定标志, 则不会列出已经禁用的规则。 清空 IPFW 规则 用于清空规则链的语法是: ipfw flush 这将导致防火墙规则链中除了由内核强制的默认规则 (编号是 65535) 的所有规则都被清除。 这么做时需要格外的孝心; 默认 deny 的策略将切断网络连接, 直到新的规则添加进来为止。 将 IPFW 包计数器归零 将某个或某些包计数器归零的命令语法是: ipfw zero 编号 当不带 编号 参数使用时, 所有的包计数器都会归零。 如果指定了 编号 参数, 则归零操作只影响那个规则。 与 <application>ipfw</application> 有关的命令示范 下面的命令将丢弃所有来自主机 evil.crackers.org 到主机 nice.people.org 端口的包: &prompt.root; ipfw add deny tcp from evil.crackers.org to nice.people.org 23 下一个例子则将拒绝并记录来自整个 crackers.org 网络 (C类) 到 nice.people.org 机器的流量 (任何端口)。 &prompt.root; ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org 如果不希望人们发送 X 到您的内网 (一个 C 类子网), 则可以使用下面的规则: &prompt.root; ipfw add deny tcp from any to my.org/28 6000 setup 察看审计记录: &prompt.root; ipfw -a list 或者以简写的形式 &prompt.root; ipfw -a l 可以通过下面的方法察看每个规则上次匹配的时间: &prompt.root; ipfw -at l 建立包过滤的防火墙 注意:下面的建议仅仅是:建议。 每个防火墙的要求是不同的, 我们不能告诉如何建构符合特殊要求的防火墙。 当一开始设置防火墙时, 除非有一个测试平台来在可控的环境中测试防火墙主机, 否则强烈建议使用启用了日志的命令, 并启用内核中的日志功能。 这将帮助您快速地确定问题所在并加以修复。 即使初始安装已经完成, 仍然建议记录 `deny' 因为它能够记录攻击企图, 并帮助您在必要时在事后调整防火墙规则。 如果使用了带日志的 accept 命令, 则可能产生 大量的 日志数据。 通过防火墙的所有包都会被记录, 因此大的 FTP/http 传输等等, 都会让系统变得很慢。 由于在数据包通过之前会要求内核做更多的工作, 因此这些更大的延迟。 另外, syslogd 将会使用更多的处理器时间来吧所有那些额外的数据记录到磁盘上, 这也很容易把 /var/log 所在的分区填满。 一般情况下应该从 /etc/rc.conf.local/etc/rc.conf 启动防火墙。 相关的联机手册会解释如何设置和列出当前的防火墙配置。 如果不使用当前的配置, ipfw list 列表将输出当前的规则设置, 您可以把这些设置放到 rc.conf 中。 如果不想用 /etc/rc.conf.local/etc/rc.conf 来启用防火墙, 则确认防火墙是在任何 IP 接口之前已经配置好就很重要了。 下一个问题是防火墙实际上 做了 些什么! 着很大程度上取决于您希望外界如何访问您的网络, 以及允许什么样的访问被发到外网。 下面是一些通用的规则: 阻止所有低于 1024 的 TCP 端口。 很多对安全最敏感的服务都在这些端口上运行, 例如 finger、 SMTP (mail) 以及 telnet。 阻止 所有 进入的 UDP 传输。 使用 UDP 的有用的服务很少, 而每一个有用的服务往往都同时伴随着安全威胁 (例如 Sun 的 RPC 和 NFS 协议)。 还有其他一些缺点, 由于 UDP 是一种无连接的协议, 阻止 UDP 传输同时也就阻止了对发出 UDP 传输的回应。 这可能会给人们 (在内网上工作的那些) 访问外部的 archie (prospero) 服务器造成问题。 想要允许访问 archie, 就需要允许来自 191 和 1525 到任何内部 UDP 端口的数据通过防火墙。 ntp 是另一种可能需要允许通过防火墙的服务, 它使用的端口号是 123。 阻止来自外界到端口 6000 的访问。 这个端口主要用来访问 X11 服务器, 着很可能是对安全的威胁 (特别是对那些有在他们工作站上做 xhost + 癖好的人)。 X11 实际上可以使用从 6000 开始的端口, 其上限取决于机器上运行了多少个 X 显示。 由 RFC 1700 (Assigned Numbers) 所定义的上限是 6063。 检查内部服务器使用什么服务 (例如 SQL 服务等等)。 同时阻止到这些端口的访问可能也是很好的习惯, 因为它们往往不在前面所指定的 1-1024 的端口范围内。 另外可以到 CERT 的网站去查看一下防火墙配置的推荐步骤, 其网址是 如前面提到的, 这些只是 指导原则。 必须根据具体情况决定使用什么过滤规则。 即使按照上面提到的方法做了, 也没办法保证一定没有人能够侵入您的网络。 IPFW 的开销和优化 许多人希望知道 IPFW 会给系统增加多少开销。 答案很大程度上取决于您的规则集大小以及处理器速度。 对于运行在一台网上的绝大多数应用和小规则集来说, 这种开销是 可忽略的。 如果您仍然像知道实际的大小来满足好奇心, 则请继续读下去。 下面的测试是在 486-66 上运行的 2.2.5-STABLE 上完成的。 (虽然 IPFW 在之后版本的 FreeBSD 上有很多小规模的修改, 但它们的速度仍然接近)。 IPFW 经过了修改以给出在 ip_fw_chk 子程序上消耗的时间, 并在每处理1000个数据包之后在控制台上打出结果。 使用两个各包含 1000 条规则的规则集进行了测试。 第一个规则集是用来展现最差情况的, 它重复下面的规则: &prompt.root; ipfw add deny tcp from any to any 55555 通过使绝大多数 IPFW 的包检查子程序被执行之后才能完成决策, 这样做将会展现最差情况, 因为所有的包都不可能匹配这些规则 (因为端口号)。 在重复 999 之有一条 allow ip from any to any规则。 第二组规则用于在规则的开始就停止判断: &prompt.root; ipfw add deny ip from 1.2.3.4 to 1.2.3.4 由于源 IP 地址不匹配上述规则将很快被挑过。 像之前一样, 第 1000 条规则也是 allow ip from any to any 第一个情况下处理大约需要 2.703 毫秒/包, 大致相当于每条规则 2.7 毫秒。 这种情况下最大的包处理能力达约是每秒 370 个包。 假设在 10 Mbps 以太网上, 包的大小大致是 ~1500  字节, 则只能达到 55.5% 的带宽利用率。 对于后一种情况每个包的处理大约需要 1.172 毫秒, 大致相当于每条规则 1.2 毫秒。 理论上每秒大约能够处理 853 个包, 能够完全占满 10 Mbps 以太网的带宽。 测试中这些过多的规则数目和规则本身是无法模拟实际的情况的 -- 它们只是用来产生这里需要的计时信息。 在建立规则时请牢记下面一些技巧: 在尽可能早的地方放一个 established 规则来处理主要的 TCP 传输。 不要在这条规则之前写任何其它的 allow tcp 语句。 将常用的规则放在规则集尽可能早的位置, 而将不太常用的放在后面 (当然, 不要改变防火墙的性质)。 您可以通过 ipfw -a l 统计包的计数。 Tom Rhodes 作者 OpenSSL 安全 OpenSSL 许多用户可能并没有注意到 &os; 所附带的 OpenSSL 工具包的功能。 OpenSSL 提供了建立在普通的通讯层基础上的加密传输层; 这些功能为许多网络应用和服务程序所广泛使用。 OpenSSL 的一些常见用法包括加密邮件客户的身份验证过程, 基于 Web 的交易如信用卡等等。 许多 ports 如 www/apache13-ssl, 以及 mail/sylpheed-claws 等等都提供了编译进 OpenSSL 支持的方法。 绝大多数情况下 ports collection 会试图使用 security/openssl 除非明确地将 WITH_OPENSSL_BASE make 变量设置为 yes &os; 中附带的 OpenSSL 版本能够支持 安全套接字层 v2/v3 (SSLv2/SSLv3) 和 安全传输层 v1 (TLSv1) 三种网络协议, 并可作为通用的密码学函数库用于应用程序。 尽管 OpenSSL 支持 IDEA 算法, 但由于美国专利, 它在默认情况下是不编译的。 如果想使用它, 请查阅相应的授权, 如果认为授权可以接受, 则可以在 make.conf 中设置 MAKE_IDEA 为应用软件创建和提供证书可能是 OpenSSL 最为常用的功能。 证书是一种确保公司或个人身份有效性的凭据。 如果证书没有被权威发证机构, 即 CA 验证, 则通常会收到一个警告。 权威发证机构是通过签署证书来证明个人或公司凭据有效性的公司, 如 VeriSign。 这个过程是需要收费的, 并且也不是使用证书时必须的工作; 不过, 这可以让那些比较偏执的用户感到轻松。 生成证书 OpenSSL 生成证书 为了生成证书, 需要使用下面的命令: &prompt.root; openssl req -new -nodes -out req.pem -keyout cert.pem Generating a 1024 bit RSA private key ................++++++ .......................................++++++ writing new private key to 'cert.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:PA Locality Name (eg, city) []:Pittsburgh Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Organizational Unit Name (eg, section) []:Systems Administrator Common Name (eg, YOUR name) []:localhost.example.org Email Address []:trhodes@FreeBSD.org Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:SOME PASSWORD An optional company name []:Another Name 请注意在回答 Common Name 时使用的是一个域名。 这个提示要求输入服务器的名字, 以完成验证过程; 如果在这里填入其他内容, 则证书就没有什么意义了。 其他选项主要是关于证书有效期和使用的算法。 &man.openssl.1; 联机手册中包括了更详细的信息。 上述命令执行完之后应该会生成一个 cert.pem 到当前目录中。 这个证书可以发给一个 CA 进行签名。 如果不需要由 CA 签名, 也可以使用自签名的证书。 首先需要生成 CA 密钥: &prompt.root; openssl gendsa -des3 -out \ myca.key 1024 然后用这个密钥来创建证书: &prompt.root; openssl req -new -x509 -days 365 -key \ myca.key -out new.crt 上述步骤将在当前目录中生成两个新文件: 一个是权威发证机构的签名文件, myca.key 另一个则是证书本身, new.crt。 这些文件应放到一个目录中, 通常推荐放在 - /etc 下, 且只能被 root 读取。 + /etc 下, 且只能被 root 读取。 0600 这样的权限应该就足够了, 您可以用 chmod 来完成修改。 使用证书的一个例子 那么有了这些文件可以做些什么呢? 一个比较典型的用法是用来加密 Sendmail MTA 的通讯连接。 这可以解决用户通过本地 MTA 发送邮件时使用明文进行身份验证的问题。 这个用法可能并不完美, 因为某些 MUA 会由于没有在本地安装证书而向用户发出警告。 请参考那些软件的说明了解关于安装证书的信息。 下面的设置应添加到本地的 .mc 文件 dnl SSL Options define(`confCACERT_PATH',`/etc/certs')dnl define(`confCACERT',`/etc/certs/new.crt')dnl define(`confSERVER_CERT',`/etc/certs/new.crt')dnl define(`confSERVER_KEY',`/etc/certs/myca.key')dnl define(`confTLS_SRV_OPTIONS', `V')dnl 这里 /etc/certs/ 是准备用来在本地保存证书和密钥的位置。 最后需要重新生成本地的 .cf 文件。 这个工作可以很容易地通过在 /etc/mail 目录中执行 make install 来完成。 然后可以执行 make restart 来重新启动 Sendmail 服务程序。 如果一切正常, 则 /var/log/maillog 中不会出现错误提示, Sendmail 也应该出现在进程列表中。 做一个简单的测试, 使用 &man.telnet.1; 来连接邮件服务器: &prompt.root; telnet example.com 25 Trying 192.0.34.166... Connected to example.com. Escape character is '^]'. 220 example.com ESMTP Sendmail 8.12.10/8.12.10; Tue, 31 Aug 2004 03:41:22 -0400 (EDT) ehlo example.com 250-example.com Hello example.com [192.0.34.166], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 250-DSN 250-ETRN 250-AUTH LOGIN PLAIN 250-STARTTLS 250-DELIVERBY 250 HELP quit 221 2.0.0 example.com closing connection Connection closed by foreign host. 如果输出中出现了 STARTTLS 则说明一切正常。 Nik Clayton
nik@FreeBSD.org
撰写者
在 IPsec 上的 VPN 使用 FreeBSD 网关在两个被 Internet 分开的网络之间架设 VPN。 Hiten M. Pandya
hmp@FreeBSD.org
撰写者
理解 IPsec 这一节将指导您完成架设 IPsec, 并在一个包含了 FreeBSD 和 µsoft.windows; 2000/XP 机器的网络中使用它来进行安全的通讯的全过程。 为了配置 IPsec, 您应当熟悉如何编译一个定制的内核的一些概念 (参见 )。 IPsec 是一种建立在 Internet 协议 (IP) 层之上的协议。 它能够让两个或更多主机以安全的方式来通讯 (并因此而得名)。 FreeBSD IPsec 网络协议栈 基于 KAME 的实现, 它支持两种协议族, IPv4 和 IPv6。 FreeBSD 5.X 包括了采用 硬件加速的 IPsec 协议栈, 也称作 Fast IPsec, 它来自 OpenBSD。 它能够通过 &man.crypto.4; 子系统来利用加密硬件 (只要可能) 优化 IPSec 的性能。 这个子系统是新的, 暂时还不支持 KAME 版本的 IPsec 的全部功能。 此外, 为了启用硬件加速的 IPsec, 必须把下面的选项加入到内核配置中: options FAST_IPSEC # new IPsec (cannot define w/ IPSEC) 请注意, 目前还不能把 Fast IPsec 子系统同 KAME 的 IPsec 实现同时混用。 请参考 &man.fast.ipsec.4; 联机手册以了解进一步的信息。 IPsec 包括了两个子协议: Encapsulated Security Payload (ESP), 保护 IP 包数据不被第三方介入, 通过使用对称加密算法 (例如 Blowfish、 3DES)。 Authentication Header (AH), 保护 IP 包头不被第三方介入和伪造, 通过计算校验和以及对 IP 包头的字段进行安全散列来实现。 随后是一个包含了散列值的附加头, 以便能够验证包。 ESPAH 根据环境的不同, 和以分别或一同使用。 IPsec 既可以用来直接加密主机之间的网络通讯 (也就是 传输模式); 也可以用来在两个子网之间建造 虚拟隧道 用于两个网络之间的安全通讯 (也就是 隧道模式)。 后一种更多的被称为是 虚拟专用网 (VPN)。 &man.ipsec.4; 联机手册提供了关于 FreeBSD 中 IPsec 子系统的详细信息。 为了把 IPsec 支持放进内核, 需要在配置文件中加入下面的选项: options IPSEC #IP security options IPSEC_ESP #IP security (crypto; define w/ IPSEC) 如果需要 IPsec 的调试支持, 还需要增加: options IPSEC_DEBUG #debug for IP security
问题 由于对如何建立 VPN 并不存在标准, 因此 VPN 可以采用许多种不同的技术来实现, 每种技术都有其长处和弱点。 这篇文章讲展现一个具体的应用情景, 并为它设计了适合的 VPN。 情况: 两个网络都接入了 Internet, 希望像一个网络那样工作 前提如下: 至少有两个不同的站点 每个站点都使用内部的 IP 两个站点都通过运行 FreeBSD 的网关接入 Internet。 每个网络上的网关至少有一个公网的 IP 地址。 网络的内部地址可以是公网或私有的 IP 地址, 这并不是问题。 如果需要,您可以在网关上运行 NAT。 两个网络上的 IP 地址 不冲突。 虽然理论上可以通过 VPN 和 NAT 连用来使这种情况能够正常工作, 但那毫无疑问将是管理的噩梦。 如果您发现您正打算连接两个内网使用同样私有 IP 地址范围的网络 (例如它们都使用 192.168.1.x), 则建议改掉其中一个网络的地址。 网络的拓扑结构如下: 网络 #1 [ 内部主机 ] 私有网络,192.168.1.2-254 [ Win9x/NT/2K ] [ UNIX ] | | .---[fxp1]---. 私有 IP, 192.168.1.1 | FreeBSD | `---[fxp0]---' 公网 IP, A.B.C.D | | -=-=- Internet -=-=- | | .---[fxp0]---. 公网 IP, W.X.Y.Z | FreeBSD | `---[fxp1]---' 私有 IP, 192.168.2.1 | | 网络 #2 [ Internal Hosts ] [ Win9x/NT/2K ] 私有网络, 192.168.2.2-254 [ UNIX ] 请注意两个公网 IP 地址。 在这篇文章的其余部分我将用这些字母来表示它们。 在文章中看到这些字母的时候, 请把它们换成自己的公网 IP 地址。 另外, 在内部, 两个网关都是使用的 .1 的 IP地址, 而两个网络使用了不同的私有 IP 地址 (相应地, 192.168.1.x192.168.2.x)。 所有私有网络上的机器都被配置为使用 .1 这台机器作为它们的网关。 我们希望, 从网络的观点看, 每一个网络上的机器都应该能够像在直接连接到同一路由器上一样看到对方网络上的机器 -- 尽管可能比路由器略慢一些, 并且有时会有丢包的现象。 这意味着 (举例来说), 主机 192.168.1.20 应该能够运行 ping 192.168.2.34 并且这能够透明地工作。 &windows; 机器应该能够看到其他网络上的机器, 浏览文件共享, 等等, 就像在本地网络上一样。 而且这些事情必须是安全的, 也就是说两个网络之间的通讯必须加密。 在两个网络之间建立 VPN 可以分为几步。 这些步骤包括: 在两个网络之间, 通过 Internet 建立一个 虚拟的 网络连接。 使用类似 &man.ping.8; 这样的工作来验证它是否正常工作。 在两个网络之间应用安全策略以保证它们之间的通讯被透明地加密盒解密。 可以使用 &man.tcpdump.1; 或类似的工具来验证这一点。 在 FreeBSD 网关上配置其他软件, 让 &windows; 机器能够通过 VPN 看到另一个网络中的机器。 步骤 1: 建立并测试 <quote>虚拟的</quote> 网络连接 假设您目前已经登录到了网络 #1 的网关机上 (其公网 IP 地址是 A.B.C.D, 私网 IP 地址是 192.168.1.1), 则您可以执行 ping 192.168.2.1, 这是公网 IP 为 W.X.Y.Z 的私网地址。 需要做什么实现上述功能呢? 作为网关的机器需要知道如何能够到达 192.168.2.1。 换言之, 它需要一条通往 192.168.2.1 的路由。 私网 IP 地址, 例如 192.168.x 这样的地址是不应在 Internet 上面大量出现的。 于此相反, 发送到 192.168.2.1 的数据包将会封装到另外的包中。 这样的包对外展现的应该是来自 A.B.C.D, 并被发到 W.X.Y.Z 去。 这个过程称为 封装 一旦包到达了 W.X.Y.Z 就需要对其 拆封, 并传递给 192.168.2.1 可以把上述过程理解为在两个网络间建立了一个 隧道。 两个 隧道口 是 IP 地址 A.B.C.DW.X.Y.Z, 而隧道必须被告知哪些私有地址可以自由地在其中通过。 隧道被用来在公共的 Internet 上传递私有的 IP 数据。 在 FreeBSD 上, 隧道可以通过一般的网络接口, 或 gif 来建立。 您也许已经猜到了, 每一台网关机的 gif 接口需要配置四个 IP 地址; 两个是公网 IP 地址, 另两个则是私网 IP 地址。 对于 gif 设备的支持必须在两台网关机上编译进内核。 可以通过添加下面的设置: pseudo-device gif 到两边的内核配置文件中, 并重新编译、 安装和启动它们。 配置隧道可以分为两步来完成。 首先隧道必须被告知外部的 (或公网的) IP 地址, 可以通过 &man.gifconfig.8; 来完成这步。 私网 IP 地址则必须使用 &man.ifconfig.8; 来配置。 在 &os; 5.X 中, &man.gifconfig.8; 的功能已经并入 &man.ifconfig.8;。 在网络 #1 的网关机上可以通过下面的两个命令来配置隧道。 gifconfig gif0 A.B.C.D W.X.Y.Z ifconfig gif0 inet 192.168.1.1 192.168.2.1 netmask 0xffffffff 在另一边也需要做类似的设置, 只是 IP 地址的顺序是反过来的。 gifconfig gif0 W.X.Y.Z A.B.C.D ifconfig gif0 inet 192.168.2.1 192.168.1.1 netmask 0xffffffff 随后执行: gifconfig gif0 可以查看当前的配置情况。 例如, 在网络 #1 的网关上您应该能够看到: &prompt.root; gifconfig gif0 gif0: flags=8011<UP,POINTTOPOINT,MULTICAST> mtu 1280 inet 192.168.1.1 --> 192.168.2.1 netmask 0xffffffff physical address inet A.B.C.D --> W.X.Y.Z 如您所见, 虽然到已经在物理地址 A.B.C.DW.X.Y.Z 之间建立起来, 而允许通过隧道的地址则是 192.168.1.1192.168.2.1 这个范围。 这同时会在两边机器的路由表中加入一项, 可以通过 netstat -rn 来观察。 来自网络 #1的网关机的输出如下。 &prompt.root; netstat -rn Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire ... 192.168.2.1 192.168.1.1 UH 0 0 gif0 ... 正如 Flags 的值所显示的那样, 这是一个主机路由, 这意味着每一个网关都知道如何到达另一端的网关, 但它们现在还不知道如何到达对方的网络。 我们接下来立刻解决这个问题。 您很可能在两台机器上都在运行防火墙。 这需要作一些变动, 以便适应 VPN 的需要。 一般来说会希望两个网络相互传递数据包, 或者通过防火墙来隔离两边的危险。 如果您将防火墙配置为允许两边的网络传输通过, 则测试工作会简单不少。 随后您可以随时将限制变得更严格一些。 假如您在网关上使用 &man.ipfw.8; 则下面的命令 ipfw add 1 allow ip from any to any via gif0 将允许两端点的 VPN 数据通过, 而不影响其他防火墙策略。 很显然, 您需要在两个网关上都执行上述命令。 现在已经可以让两台机器相互 ping 了。 在 192.168.1.1 您应该能够正常执行 ping 192.168.2.1 并得到回应。 对于另一台网关来说也是一样。 然而, 到目前为止仍然还无法连上另一网络上的内部主机。 原因是路由 -- 尽管网关机知道如何到达对方那里, 但它们都不知道如何到达对方后面的网络。 要解决这个问题, 就必须在两边都添加一条静态路由。 可以在第一台网关上执行: route add 192.168.2.0 192.168.2.1 netmask 0xffffff00 这相当于是说 为了到达 192.168.2.0 子网的机器, 需要把包发给 192.168.2.1。 您需要在另一个网关上也执行类似的命令, 但使用 192.168.1.x 的地址。 来自一个网络上的 IP 访问现在能够抵达对面的网络了。 在两个网络之间建立 VPN 的过程已经完成了三分之二, 它现在已经是 虚拟的 网络, 然而它还不够专用。 您可以使用 &man.ping.8; 和 &man.tcpdump.1; 来进行测试, 并记录两边收发的数据包 tcpdump dst host 192.168.2.1 接下来登录到本机的另一个会话 ping 192.168.2.1 您将在输出中发现 16:10:24.018080 192.168.1.1 > 192.168.2.1: icmp: echo request 16:10:24.018109 192.168.1.1 > 192.168.2.1: icmp: echo reply 16:10:25.018814 192.168.1.1 > 192.168.2.1: icmp: echo request 16:10:25.018847 192.168.1.1 > 192.168.2.1: icmp: echo reply 16:10:26.028896 192.168.1.1 > 192.168.2.1: icmp: echo request 16:10:26.029112 192.168.1.1 > 192.168.2.1: icmp: echo reply 如您所见, ICMP 消息在收发的过程中都没有加密。 如果使用了 参数来运行 &man.tcpdump.1;, 甚至可以得到包中的更多信息以及其中的数据。 很明显这是不能接受的。 下一节将讨论如何让两个网络之间的连接更安全, 这件事是通过对通讯实施加密来完成的。 小结: 使用 pseudo-device gif 配置两边的内核。 编辑网关 #1 上的 /etc/rc.conf 并将下面的行添加进去 (根据需要改 IP )。 gifconfig_gif0="A.B.C.D W.X.Y.Z" ifconfig_gif0="inet 192.168.1.1 192.168.2.1 netmask 0xffffffff" static_routes="vpn" route_vpn="192.168.2.0 192.168.2.1 netmask 0xffffff00" 在两台机器上编辑防火墙脚本 (/etc/rc.firewall, 或类似的名字) 在其中加入 ipfw add 1 allow ip from any to any via gif0 在网络 #2 的网关机上也对 /etc/rc.conf 做同样的修改, 注意把 IP 地址倒过来。 步骤 2: 对连接实施安全加固 为了加密连接通讯将用到 IPsec。 IPsec 提供了一种机制, 使得两台主机协商一个加密密钥, 并使用它加密之间的通讯。 在配置时有两个地方需要考虑。 必须有能够让两台主机协商所采用的加密方式的机制。 一旦双方确认了这机制, 则称他们之间建立了 安全关联 必须采用某种机制来指定哪些通讯需要加密。 很明显地, 通常并不需要所有的发出数据都被加密 -- 一般只需要加密在 VPN 上传输的那些数据。 这类决定哪些数据被加密的规则被称为 安全策略 安全关联和安全策略都是由内核来维护的, 并可以通过用户态的程序来修改。 在能够这样做之前, 首先需要配置内核来让它支持 IPsec 和安全载荷封装 (ESP) 协议。 配置下面的内核选项 options IPSEC options IPSEC_ESP 然后重新编译、 安装最后重新启动新的内核。 在继续进行设置之前, 您需要在两台网关上都进行同样的设置。 在建立安全关联时有两种选择。 一种方法是完全手工地在两台主机之间选择加密算法、 密钥等等, 另一种方法是使用实现了 Internet 密钥交换协议 (IKE) 的服务程序来帮您完成这些任务。 我们推荐后者。 不说别的, 它配置起来要容易得多。 用 &man.setkey.8; 可以编辑和显示安全策略。 打个比方, setkey 之于内核的安全策略表, 就相当于 &man.route.8; 之于内核中的路由表。 setkey 还可以显示当前的安全关联, 这一点和 netstat -r 类似。 FreeBSD 上用于管理安全关联的可供选择的服务程序有很多。 这篇文章将介绍如何使用其中的一种, racoon。 racoon 可以从 FreeBSD ports collection 安装, 它位于 security/ 分类下。 安装方法与其他软件无异。 racoon 需要在两台网关机上都运行。 需要配置 VPN 另一端的 IP, 以及一个密钥 (这个密钥可以任意选择, 但两个网关上的密钥必须一致)。 两端的服务程序将相互通讯, 并确认它们各自的身份 (使用刚刚配置的密钥) 然后服务程序将生成一个新的密钥, 并用它来加密 VPN 上的数据通讯。 它们定期地改变密钥, 因此即使供给者破解了一个密钥 (虽然这在理论上并不十分可行) 他也得不到什么 -- 破解密钥的时候, 已经产生一组新的密钥了。 racoon 的配置保存在 ${PREFIX}/etc/racoon 中。 在那里应该能够找到一个配置文件, 不需要修改太多的设置。 raccon 配置的另一部分, 也就是需要修改的内容, 是 预先配置的共享密钥 默认的 racoon 配置文件应该可以在 ${PREFIX}/etc/racoon/psk.txt 这个文件中找到。 需要强调的是, 这个密钥 并非 用于加密 VPN 连接的密钥, 他们只是密钥管理服务程序用以信任对方的一种凭据。 psk.txt 包含了需要打交道的每一个远程站点。 在本例中一共有两个站点, 每一个 psk.txt 都只有一行 (因为每个 VPN 接入点都只和一个端点连接)。 在网关机 #1 上应该是: W.X.Y.Z secret 这包括了远程站点的 公网 IP 地址, 空格, 以及提供秘密的字符串。 很明显不应使用 secret 作为实际的密钥 -- 通常的口令选择策略应该应用到这里。 在网关 #2 上对应的配置是 A.B.C.D secret 也就是说, 对面端的公网 IP 地址, 以及同样的密钥。 psk.txt 的权限必须是 0600 (也就是说, 只有 root 能够读写) 否则 racoon 将不能运行。 两边的机器上都必须执行 racoon。 另外, 还需要增加一些防火墙规则来允许 IKE 通讯通过, 它是通过 UDP 在 ISAKMP (Internet 安全关联密钥管理协议) 端口上运行的协议。 再次强调, 这个规则应该在规则集尽可能早的位置出现。 ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp 一旦 racoon 开始运行, 就可以开始测试让网关进行相互的 ping 了。 此时连接还没有进行加密, 但 racoon 将在两个主机之间建立安全关联 -- 这可能需要一段时间, 对您来说, 具体的现象则是在 ping 命令开始响应之前会有短暂的延迟。 一旦安全关联建立之后, 就可以使用 &man.setkey.8; 来查看它了。 在两边的网关上执行 setkey -D 就可以看到安全关联的相关信息了。 现在只完成了一半的工作。 另一半是设置安全策略。 想要完成一个有判断力的安全策略, 首先要看我们已经完成的步骤。 接下来的讨论针对连接的两端。 您所发出的每一个 IP 包都包括一个包头, 其内容是和这个包有关的描述性数据。 包头包括了包的来源和目的的 IP 地址。 正如我们所了解的那样, 私有 IP 地址, 例如 192.168.x.y 这样的地址范围, 不应该出现在 Internet 的公网上。 于此相反, 他们必须首先封装到别的包中。 包的来源或目的如果是私有 IP 地址, 则必须替换成公网 IP 地址。 因此如果发出的包类似下面这样: .-------------------. | Src: 192.168.1.1 | | Dst: 192.168.2.1 | | <其他头信息 > | +-------------------+ | <包数据 > | `-------------------' 随后它将被封装进另一个包中, 像下面这样: .--------------------------. | Src: A.B.C.D | | Dst: W.X.Y.Z | | <附加头信息 > | +--------------------------+ | .----------------------. | | | Src: 192.168.1.1 | | | | Dst: 192.168.2.1 | | | | <附加头信息 > | | | +----------------------+ | | | <包数据 > | | | `----------------------' | `--------------------------' 封装过程是在 gif 设备上完成的。 如上图所示, 包现在有了外部的实际 IP 地址, 而原始的包则被封装到里面作为数据。 这个包将通过 Internet 传递。 很明显地, 我们希望 VPN 之间的通讯是加密的。 用语言来描述大致是: 如果包从 A.B.C.D 发出且其目的地是 W.X.Y.Z, 则通过必要的安全关联进行加密。 如果包来自 W.X.Y.Z 且其目的地是 A.B.C.D, 则通过必要的安全关联进行解密。 这已经很接近了, 但还不够正确。 如果这么做的话, 所有来自和发到 W.X.Y.Z 的包, 无论是否属于 VPN 通讯都会被加密。 这可能并不是您所希望的, 因此正确的安全策略应该是 如果包从 A.B.C.D 发出, 且封装了其他的包, 其目的地是 W.X.Y.Z, 则通过必要的安全关联进行加密。 如果包来自 W.X.Y.Z, 且封装了其他的包, 其目的地是 A.B.C.D, 则通过必要的安全关联进行解密。 一个很小, 但却必要的改动。 安全策略也是通过 &man.setkey.8; 设置的。 &man.setkey.8; 提供了一种用于配置策略的语言。 可以直接在 stdin 上输入策略, 或通过 选项来指定一个包含配置命令的文件。 网关 #1 上的配置 (其 IP 地址是 A.B.C.D) 强制将所有到 W.X.Y.Z 的通讯进行加密的配置是: spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; 把这些命令放到一个文件 (例如 /etc/ipsec.conf) 然后执行 &prompt.root; setkey -f /etc/ipsec.conf 会告诉 &man.setkey.8; 我们希望把规则加入到安全策略数据库中。 命令的其它部分指定了什么样的包能够匹配这规则。 A.B.C.D/32W.X.Y.Z/32 是用于指定规则能够匹配的网络或主机的 IP 地址和掩码。 本例中, 希望应用到两个主机之间的通讯上。 则告诉内核这规则只应被用于封装其他包的那些数据包。 表示策略是针对发出的包的, 而 则表示需要对数据包进行加密。 第二行指定了如何加密。 是将要使用的协议, 而 则表示包应该进一步封装进一个 IPsec 包里面。 反复使用 A.B.C.DW.X.Y.Z 用来选择所用的安全关联 而最后的 则强制所有匹配这规则的包都被加密。 上面的规则只匹配了发出的包。 接下来需要配置类似的匹配进入包的规则。 spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; 请注意本例中 代替了 并且 IP 地址的顺序也相反。 在另一个网关上 (其公网 IP 地址是 W.X.Y.Z) 也需要类似的规则。 spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; 最后是添加允许 ESP 和 IPENCAP 包进出的防火墙规则。 这些规则需要在两边分别设置。 ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D 由于规则的对称性, 因此可以在两台网关上使用同样的规则。 发出的包如下图所示: .------------------------------. --------------------------. | Src: A.B.C.D | | | Dst: W.X.Y.Z | | | <other header info> | | Encrypted +------------------------------+ | packet. | .--------------------------. | -------------. | contents | | Src: A.B.C.D | | | | are | | Dst: W.X.Y.Z | | | | completely | | <other header info> | | | |- secure | +--------------------------+ | | Encap'd | from third | | .----------------------. | | -. | packet | party | | | Src: 192.168.1.1 | | | | Original |- with real | snooping | | | Dst: 192.168.2.1 | | | | packet, | IP addr | | | | <other header info> | | | |- private | | | | +----------------------+ | | | IP addr | | | | | <packet data> | | | | | | | | `----------------------' | | -' | | | `--------------------------' | -------------' | `------------------------------' --------------------------' 当 VPN 数据被远端接到时, 它将首先被解密 (使用 racoon 协商得到的安全关联)。 然后它们将进入 gif 接口, 并在那里展开第二层, 直到只剩下最里层的包, 并将其转发到内网上。 可以通过与之前同样的 &man.ping.8; 命令来测试安全性。 首先登录到 A.B.C.D 网关上并执行: tcpdump dst host 192.168.2.1 在同一主机上登录另一会话, 执行 ping 192.168.2.1 此时的输出应该是: XXX tcpdump output 如您看到的, &man.tcpdump.1; 给出的将是 ESP 包。 假如您想查看它们的内容可以使用 option 选项, 您将 (显然地) 看到一些乱码, 因为传输过程实施了加密。 祝贺您。 您已经完成了两个远程站点之间的 VPN 的架设工作。 小结 将两边的内核配置加入: options IPSEC options IPSEC_ESP 安装 security/racoon。 编辑两台网关上的 ${PREFIX}/etc/racoon/psk.txt 并添加远程主机的 IP 和共享的密钥。 文件的权限应该是 0600。 将下面的设置加入两台主机的 /etc/rc.conf 中: ipsec_enable="YES" ipsec_file="/etc/ipsec.conf" 在两个网关上都建立 /etc/ipsec.conf 并添加必要的 spdadd。 在网关 #1 上是: spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; 在网关 #2 上则是: spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; 添加防火墙规则以允许 IKE, ESP, 和 IPENCAP 通讯能够到达各自的主机: ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D 前面的两部应该足以让 VPN 运转起来了。 两个网络上的机器都应该能通过 IP 来访问对方, 而所有的通讯都被自动地进行加密。
Chern Lee 原著 OpenSSH OpenSSH 安全 OpenSSH OpenSSH 是一组用于安全地访问远程计算机的连接工具。 它可以作为 rloginrsh rcp 以及 telnet 的直接替代品使用。 更进一步, 其他任何 TCP/IP 连接都可以通过 SSH 安全地进行隧道/转发。 OpenSSH 对所有的传输进行加密, 从而有效地阻止了窃听、 连接劫持, 以及其他网络级的攻击。 OpenSSH 由 OpenBSD project 维护, 它基于 SSH v1.2.12 并包含了最新的错误修复和更新。 它同时兼容 SSH 协议的 1 和 2 两个版本。 从 FreeBSD 4.0 开始, OpenSSH 成为了基本系统的一部分。 使用 OpenSSH 的好处 通常,当使用 &man.telnet.1; 或 &man.rlogin.1; 时, 数据是以明码的形式发送的,并没有加密。 在客户机和服务器之间的网络上运行的听包程序可以在会话中偷窃到传输的用户名/密码和数据。 OpenSSH 提供了多种的身份验证和加密方法来防止这种情况的发生。 启用 sshd OpenSSH 启用 确信已将下面这行加入了 rc.conf 文件: sshd_enable="YES" 将在下次启动系统时加载 OpenSSH 的 &man.sshd.8; 服务程序。 另外, 也可以简单地使用 sshd 来直接启动 sshd 服务。 SSH 客户 OpenSSH 客户 &man.ssh.1; 的工作方式和 &man.rlogin.1; 非常类似。 &prompt.root; ssh user@example.com Host key not found from the list of known hosts. Are you sure you want to continue connecting (yes/no)? yes Host 'example.com' added to the list of known hosts. user@example.com's password: ******* 登录过程和使用 rlogintelnet 建立的会话非常类似。 在连接时, SSH 会利用一个密钥指纹系统来验证服务器的真实性。 只有在第一次连接时, 用户会被要求输入 yes。 之后的连接将会验证预先保存下来的密钥指纹。 如果保存的指纹与登录时接收到的不符, 则将会给出警告。 指纹保存在 ~/.ssh/known_hosts 中, 对于 SSH v2 指纹, 则是 ~/.ssh/known_hosts2 默认情况下 OpenSSH 服务器的配置会接受 SSH v1 和 SSH v2 的连接。 然而, 客户端则可以选择两者之一。 一般认为, 第2版更加健壮和安全。 通过 参数, 可以强制 &man.ssh.1; 使用 v1 或 v2 的协议。 安全复制 OpenSSH 安全复制 scp &man.scp.1; 命令和 &man.rcp.1;; 的用法类似, 它用于将文件复制到远程的机器上, 或复制过来, 区别是它是安全的。 &prompt.root; scp user@example.com:/COPYRIGHT COPYRIGHT user@example.com's password: ******* COPYRIGHT 100% |*****************************| 4735 00:00 &prompt.root; 由于先前的例子中已经保存了指纹, 使用 &man.scp.1; 时会自动地加以验证。 &man.scp.1; 使用的参数同 &man.cp.1; 类似。 第一个参数是一个或一组文件, 然后是复制的目标。 由于文件是通过 SSH 在网上传递的, 因此某些文件的名字需要写成 配置 OpenSSH 配置 针对 OpenSSH 服务程序和客户端的系统级配置文件在 /etc/ssh 目录中。 ssh_config 用于配置客户端的设定, 而 sshd_config 则用于配置服务器端。 另外 (默认是 /usr/sbin/sshd), 以及 这两个 rc.conf 选项提供了更多的配置选择。 ssh-keygen &man.ssh-keygen.1; 可以被用来生成 RSA 密钥对来代替使用口令验证用户的身份: &prompt.user; ssh-keygen -t rsa1 Initializing random number generator... Generating p: .++ (distance 66) Generating q: ..............................++ (distance 498) Computing the keys... Key generation complete. Enter file in which to save the key (/home/user/.ssh/identity): Enter passphrase: Enter the same passphrase again: Your identification has been saved in /home/user/.ssh/identity. ... &man.ssh-keygen.1; 将产生一个公私密钥对来用于验证身份。 私钥被保存到 ~/.ssh/identity, 而公钥则保存到 ~/.ssh/identity.pub。 远程机器上的 ~/.ssh/authorized_keys 中必须有对应的公钥, 才能够完成身份验证过程。 这将允许从远程以基于 RSA 的验证来代替口令验证连接到本机上。 使用 这个选项将创建用于 第1版 SSH 协议的 RSA 密钥对。 如果您希望使用用于 SSH 第2版协议的 RSA密钥对, 则应使用 ssh-keygen -t rsa 这个命令。 如果在 &man.ssh-keygen.1; 中使用了通行字, 则每次使用私钥时都需要输入它。 另外, 还可以使用 ssh-keygen -t dsa 来创建一个用于第2版 SSH 协议的 DSA 密钥。 这将生成一对 DSA 公/私钥, 并且只能用于第2版的 SSH 协议会话。 公钥将保存为 ~/.ssh/id_dsa.pub, 而私钥保存为 ~/.ssh/id_dsa DSA 公钥也应该放到远程主机的 ~/.ssh/authorized_keys 里面。 &man.ssh-agent.1; 和 &man.ssh-add.1; 是用于管理多个受密码保护的私钥的工具。 随版本的不同, OpenSSH 可能会使用不同的文件和选项。 为了避免出现问题, 请参考 &man.ssh-keygen.1; 联机手册。 SSH 隧道 OpenSSH 隧道 OpenSSH 能够创建隧道以便用加密的会话来封装其他协议。 下面的命令告诉 &man.ssh.1; 为 telnet 创建一个隧道: &prompt.user; ssh -2 -N -f -L 5023:localhost:23 user@foo.example.com &prompt.user; 上述 ssh 命令使用了下面这些选项: 强制 ssh 使用第2版的协议 (如果需要和较老的 SSH 一同工作请不要使用这个选项)。 表示不使用命令行, 或者说只使用隧道。 如果省略, ssh 将同时初始化会话。 强制 ssh 在后台执行。 表示产生一条 本地端口:远程主机:远程端口 形式的隧道。 远程 SSH 服务器。 SSH 隧道通过监听 localhost 上面指定端口来完成工作。 它将把本机主机/端口上街道的连接通过 SSH 连接转发到远程主机/端口。 本例中, 位于 localhost5023 端口 被用于转发 localhost 的连接到远程主机的 23 端口。 由于 23telnet 使用的, 因此它将通过 SSH 隧道完成 telnet 会话。 这可以用来封装任意不安全的 TCP 协议, 例如 SMTP、 POP3、 FTP等等。 使用 SSH 为 SMTP 创建安全隧道 &prompt.user; ssh -2 -N -f -L 5025:localhost:25 user@mailserver.example.com user@mailserver.example.com's password: ***** &prompt.user; telnet localhost 5025 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mailserver.example.com ESMTP 这可以与 &man.ssh-keygen.1; 以及额外的用户帐号配合来建立一个更透明的 SSH 隧道环境。 密钥可以被用在需要输入口令的地方, 而且可以为不同的用户配置不同的隧道。 实用的 SSH 通道例子 加强 POP3 服务的安全 工作时, 有一个允许外来连接的 SSH 服务器。 同一个办公网络中有一个邮件服务器提供 POP3 服务。 这个网络, 或从您家到办公室的网络可能不, 或不完全可信。 基于这样的原因, 您需要以安全的方式来察看邮件。 解决方法是创建一个到办公室 SSH 服务器的连接, 并通过这个连接来访问 POP3 服务: &prompt.user; ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com user@ssh-server.example.com's password: ****** 当这个通道连上时, 您可以把 POP3 请求发到 localhost 端口 2110。 这个连接将通过通道安全地转发到 mail.example.com 绕过严厉的防火墙 一些大脑长包的网络管理员会使用一些极端的防火墙策略, 不仅过滤进入的连接, 而且也过滤连出的连接。 一些时候您可能只能连接远程机器 22 端口,以及 80 端口用来进行 SSH 和网页浏览。 您可能希望访问一些其它的 (也许与工作无关的) 服务, 例如提供流式音乐的 Ogg Vorbis 服务器。 如果 Ogg Vorbis server 在 22 或 80 端口以外的端口播放音乐, 则您将无法访问它。 解决方法是建立一个到您的网络的防火墙之外的网络上的 SSH 服务器, 并通过它提供的通道连接到 Ogg Vorbis 服务器上。 &prompt.user; ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.org user@unfirewalled-system.example.org's password: ******* 现在您可以把客户程序指定到 localhost 的 8888 端口, 它将把请求转发给 music.example.com 的 8000 端口, 从而绕过防火墙。 进一步的资料 OpenSSH &man.ssh.1; &man.scp.1; &man.ssh-keygen.1; &man.ssh-agent.1; &man.ssh-add.1; &man.sshd.8; &man.sftp-server.8; Tom Rhodes 作者 ACL 文件系统访问控制表 与文件系统在其他方面的加强, 如快照等一道, FreeBSD 5.0 及更高版本提供了通过文件系统访问控制表 (ACLs) 实现的安全机制。 访问控制表以高度兼容 (&posix;.1e) 的方式扩展了标准的 &unix; 权限模型。 这一特性使得管理员能够利用其优势设计更为复杂的安全模型。 如果想为 UFS 文件系统启用 ACL 支持, 则需要添加下列选项: options UFS_ACL 并重新编译内核。 如果这个选项没有编译进内核, 则在挂接支持 ACL 的文件系统时将会收到警告。 这个选项在 GENERIC 内核中已经包含了。 ACL 依赖于在文件系统上启用扩展属性。 在新一代的 &unix; file system, UFS2 中内建了这种支持。 UFS1 上配置扩展属性需要比 UFS2 更多的管理开销。 在 UFS2 上的扩展属性的性能也要高不少。 因此, 如果想要使用访问控制表, 推荐使用 UFS2 而不是 UFS1 ACL 可以在挂接时通过选项 来启动, 它可以加入 /etc/fstab。 另外, 也可以通过使用 &man.tunefs.8; 修改超级块中的 ACL 标记来持久性地设置自动的挂接属性。 一般而言, 后一种方法是推荐的做法, 其原因是: 挂接时的 ACL 标记无法被重挂接 (&man.mount.8; ) 改变, 只有完整地 &man.umount.8; 并做一次新的 &man.mount.8; 才能改变它。 这意味着 ACLs 状态在系统启动之后就不可能在 root 文件系统上发生变化了。 另外也没有办法改变正在使用的文件系统的这个状态。 在超级块中的设置将使得文件系统总被以启用 ACLs 的方式挂接, 即使在 fstab 中的对应项目没有作设置, 或设备顺序发生变化时也是如此。 这避免了不慎将文件系统以没有启用 ACLs 的状态挂接, 从而避免没有强制 ACLs 这样的安全问题。 可以修改 ACL 行为, 以允许在没有执行一次全新的 &man.mount.8; 的情况下启用它, 但我们认为不鼓励在不启用 ACL 的时候这么做是有必要的, 因为如果启用了 ACL, 然后关掉它, 然后在没有刷新扩展属性的情况下重新启用它是很容易造成问题的。 一般而言, 一旦启用了文件系统的 ACLs 就不应该再关掉它, 因为此时的文件系统的保护措施可能和用户所期待的样子不再兼容, 而重新启用 ACL 将重新把先前的 ACL 附着到文件上, 而由于它们的权限发生了变化, 就很可能造成无法预期的行为。 在察看目录时, 启用了 ACLs 的文件将在通常的属性后面显示 + (加号)。 例如: drwx------ 2 robert robert 512 Dec 27 11:54 private drwxrwx---+ 2 robert robert 512 Dec 23 10:57 directory1 drwxrwx---+ 2 robert robert 512 Dec 22 10:20 directory2 drwxrwx---+ 2 robert robert 512 Dec 27 11:57 directory3 drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html 这里我们看到了 directory1, directory2, 以及 directory3 目录使用了 ACLs。 而 public_html 则没有。 使用 <acronym>ACL</acronym> 文件系统 ACL 可以使用 &man.getfacl.1; 工具来查看。 例如, 如果想查看 testACL 设置, 所用的命令是: &prompt.user; getfacl test #file: #owner:1001 #group:1001 user::rw- group::r-- other::r-- 要修改这个文件上的 ACL 设置, 则需要使用 &man.setfacl.1; 工具。 例如: &prompt.user; setfacl -k test 参数将把所有当前定义的 ACL 从文件或文件系统中删除。 一般来说应该使用 因为它会保持让 ACL 正常工作的那些项不变。 &prompt.user; setfacl -m u:trhodes:rwx,group:web:r--,o::--- test 在前面的命令中, -m 选项被用来修改默认的 ACL 项。由于已经被先前的命令 删除,因此没有预先定义的项,于是默认的选项被恢复,并附加上指定的选项。 请小心地检查,如果您加入了一个不存在的用户或组,那么将会在 stdout 得到一条 Invalid argument 的错误提示。 Tom Rhodes 作者 FreeBSD 安全公告 &os; 安全公告 像其它具有产品级品质的操作系统一样, &os; 会发布 安全公告。 通常这类公告会只有在在相应的发行版本已经正确地打过补丁之后发到安全邮件列表并在勘误中说明。 本节将介绍什么是安全公告, 如何理解它, 以及为系统打补丁的具体步骤。 安全公告看上去是什么样子? &os; 安全公告的样式类似下面的范例, 这一例子来自 &a.security-notifications.name; 邮件列表。 ============================================================================= &os;-SA-XX:XX.UTIL Security Advisory The &os; Project Topic: denial of service due to some problem Category: core Module: sys Announced: 2003-09-23 Credits: Person@EMAIL-ADDRESS Affects: All releases of &os; &os; 4-STABLE prior to the correction date Corrected: 2003-09-23 16:42:59 UTC (RELENG_4, 4.9-PRERELEASE) 2003-09-23 20:08:42 UTC (RELENG_5_1, 5.1-RELEASE-p6) 2003-09-23 20:07:06 UTC (RELENG_5_0, 5.0-RELEASE-p15) 2003-09-23 16:44:58 UTC (RELENG_4_8, 4.8-RELEASE-p8) 2003-09-23 16:47:34 UTC (RELENG_4_7, 4.7-RELEASE-p18) 2003-09-23 16:49:46 UTC (RELENG_4_6, 4.6-RELEASE-p21) 2003-09-23 16:51:24 UTC (RELENG_4_5, 4.5-RELEASE-p33) 2003-09-23 16:52:45 UTC (RELENG_4_4, 4.4-RELEASE-p43) 2003-09-23 16:54:39 UTC (RELENG_4_3, 4.3-RELEASE-p39) &os; only: NO For general information regarding FreeBSD Security Advisories, including descriptions of the fields above, security branches, and the following sections, please visit http://www.FreeBSD.org/security/. I. Background II. Problem Description III. Impact IV. Workaround V. Solution VI. Correction details VII. References Topic(标题) 一栏说明了问题到底是什么。 它基本上是对所发现的安全问题及其所涉及的工具的描述。 Category(分类) 是指系统的哪一部分受到影响, 这一栏可能是 corecontrib,或 ports 之一。 core 分类表示安全弱点影响到了 &os; 操作系统的某个核心组件。 contrib 分类表示弱点存在于某个捐赠给 &os; Project 的软件, 例如 sendmail。 最后是 ports, 它表示该弱点影响了 ports collection 中的某个第三方软件。 Module(模块) 一栏给出了组件的具体位置, 例如 sys。 在这个例子中, 可以看到 sys 模块是存在问题的; 因此, 这个漏洞会影响某个在内核中的组件。 Announced(发布时间) 一栏反映了与安全公告有关的数据是什么时候公之于众的。 这说明安全团队已经证实问题确实存在, 而补丁已经写入了 &os; 的代码库。 Credits(作者) 一栏给出了注意到问题存在并报告它的个人或团体。 The Affects(影响范围) 一栏给出了 &os; 的那些版本存在这个漏洞。 对于内核来说, 检视受影响的文件上执行的 ident 输出可以帮助确认文件版本。 对于 ports, 版本号在 /var/db/pkg 里面的 port 的名字后面列出。 如果系统没有与 &os; CVS 代码库同步并每日构建, 它很可能是有问题的。 Corrected(修正时间) 一栏给出了发行版本中修正问题的具体日期、时间和时差。 &os; only(仅 &os;) 一栏说明了漏洞是否只影响 &os;, 还是也影响一些其它操作系统。 Background(技术背景) 一栏提供了受影响的组件的作用。 多数时候这一部分会说明为什么 &os; 中包含了它, 它的作用, 以及它的一些原理。 Problem Description(问题描述) 一栏深入阐述安全漏洞的技术细节。 这部分有时会包括有问题的代码相关的详细情况, 甚至是这个部件如何能够被恶意利用并打开漏洞的细节。 Impact(影响) 一栏描述了问题能够造成的影响类型。 例如, 可能导致拒绝服务攻击, 权限提升, 甚至导致得到超级用户的权限。 Workaround(应急方案) 一栏给出了系统管理员在暂时无法升级系统时可以采取的临时性对策。 这些原因可能包括时间限制, 网络资源的限制, 或其它因素。 不过无论如何, 安全不能够被轻视, 有问题的系统要么应该打补丁, 要么应该实施这种应急方案。 Solution(解决方案) 一栏提供了如何给有问题的系统打补丁的方法。 这是经过逐步测试和验证过的给系统打补丁并让其安全地工作的方法。 =Correction Details(修正细节) 一栏展示了针对 CVS 分支或某个发行版的修正特征。 同时也提供了每个分支上相关文件的版本号。 References(文献) 一栏通常会给出其它信息的来源。 这可能包括 URL, 书籍、 邮件列表以及新闻组。
diff --git a/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml b/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml index 00bdbda953..de65efba07 100644 --- a/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml @@ -1,2301 +1,2301 @@ 串口通讯 概述 串口通讯 &unix; 一直都是支持串口通讯的。事实上, 早期的 &unix; 系统就是利用串行线来输入和输出数据的。 那时常见的 终端 包括一个每秒10个字符的串行打印机和键盘, 现在这些已经发生了很大的变化。 这章将介绍一些利用 FreeBSD 进行串行通讯的方法。 读完这章,您将了解到: 如何通过终端连接到您的FreeBSD系统。 如何使用modem拨号到远程主机。 如何允许远程用户通过modem登录到您的系统。 如何从串行控制台引导您的系统。 阅读这章之前,您应当了解: 如何配置和安装一个新的内核。()。 理解UNIX的权限和进程()。 准备您打算使用的串行设备 (modem或多插口卡) 的技术参考手册。 介绍 术语 bits-per-second bps 每秒位— 数据的传输速度 DTE DTE 数据终端设备 — 如您的计算机 DCE DCE 数据通讯设备 — 如您的modem RS-232 RS-232C cables 用于硬件串行通讯的EIA标准 当讨论通讯数据速度的时候,这节不会使用术语 baud。Baud指电气标准传输率,它已经使用了很长时间, 而 bps (bits per second) 才是正确使用的术语 (至少它不会打扰那些爱争吵的家伙)。 线缆和端口 要连接 modem 或终端到您的 FreeBSD 系统, 您需要有一个串口以及连接到您串行设备所需的线缆。 如果您比较熟悉硬件和它要求的线缆, 则可以跳过这节。 线缆 有好几种不同的串行线缆。 两个最普通的类型是 null-modem 线缆和标准RS-232线缆。 您硬件的规格说明会有详细描述。 Null-modem线缆 null-modem cable 一根null-modem线缆会直接通过像 地信号 这样的信号,而转换其他的信号。 例如, 数据发送 连到对端的 数据接收 引脚上。 如果需要, 您可以自己做一个null-modem的线缆。 下面这个表列出了这个线缆 DB-25 头上的 RS-232C 信号名和引脚标号。 信号 引脚 # 引脚 # 信号 SG 7 连接到 7 SG TD 2 连接到 3 RD RD 3 连接到 2 TD RTS 4 连接到 5 CTS CTS 5 连接到 4 RTS DTR 20 连接到 6 DSR DCD 8 6 DSR DSR 6 连接到 20 DTR 在连接头里面连接好数据发送就绪 (DSR)和 载波检测 (DCD) 两个信号,然后连接到对端的 数据终端就绪 (DTR)。 标准RS-232C线缆 RS-232C cables 一个标准的串行线缆会直接通过所有的RS-232C信号。 这是连接一个modem到您的 FreeBSD 系统的线缆类型, 线缆的类型需要针对一些终端。 端口 串行端口是FreeBSD主机与终端传输数据的设备。 这节描述了端口的种类和它们在 FreeBSD 上是如何编址的。 端口的种类 存在好几种端口。 在购买和做线缆之前, 您需要确定它是否适合您机器的终端。 绝大多数的终端有DB25端口。个人计算机, 也包括运行 FreeBSD 的PC机, 通常都会有 DB25 或 DB9 插口。 如果您的计算机有一个多插口的串口卡, 则可以使用RJ-12 或RJ-45端口。 请仔细看看硬件的说明, 此外您也可以通过外观了解是什么插口。 端口名称Port Names 在FreeBSD中,您可以通过 /dev 目录中的一个记录来访问每个串行端口。有两种不同的记录: 呼入端口被命名为/dev/ttydN, 这里 N 是端口号,从零开始。 通常,您使用呼入端口作为终端。呼入端口要求数据线使用载波检测 (DCD) 信号来工作。 呼出端口被命名为 /dev/cuaaN。 您通常不使用呼出端口作为终端, 只使用modem。 如果串行线或终端不支持载波检测数据传输, 您可以使用呼出端口。 如果您已经连接一个终端到第一个串行端口 (在 &ms-dos; 上是COM1), 则可以使用 /dev/ttyd0 来作为终端。 如果它是在第二个串行端口 (COM2), 那就是 /dev/ttyd1,等等。 内核配置 FreeBSD默认支持4个串行端口。在&ms-dos;下,这些是 COM1COM2COM3, 和 COM4。FreeBSD当前支持 dumb 多插口串行接口卡,如 BocaBoard 1008 和 2016,与许多 Digiboard 和 Stallion Technologies 制造的智能多接口卡一样好。 然而, 默认的内核只会寻找标准的COM端口。 要看看您的内核是否支持您的串口,只要在内核启动时查看一下启动信息, 或使用 /sbin/dmesg 命令重新检测内核启动信息。 特别的,寻找以sio字符启动的信息。 提示:要看看带有sio字符的信息, 可以使用下面的命令: &prompt.root; /sbin/dmesg | grep 'sio' 例如,在一个带有4个串口的系统上,这些是串口特定的内核启动信息: sio0 at 0x3f8-0x3ff irq 4 on isa sio0: type 16550A sio1 at 0x2f8-0x2ff irq 3 on isa sio1: type 16550A sio2 at 0x3e8-0x3ef irq 5 on isa sio2: type 16550A sio3 at 0x2e8-0x2ef irq 9 on isa sio3: type 16550A 如果您的内核没有认出您的所有串口,您需要为您的系统定制内核。 更多有关配置内核的细节,可以看看第9章 在您的内核配置文件中相关的设备行是这样的,FreeBSD 4.X: device sio0 at isa? port port IO_COM1 irq 4 device sio1 at isa? port port IO_COM2 irq 3 device sio2 at isa? port IO_COM3 irq 5 device sio3 at isa? port IO_COM4 irq 9 FreeBSD 5.X: device sio 您可以注释掉或完全删除您没有的设备。 FreeBSD 5.X 需要修改 /boot/device.hints文件。请看看 &man.sio.4; 的有关如何为您的多插口主板写入配置信息的联机手册。 如果您使用了一个不同版本的 FreeBSD 的配置文件,请小心点, 因为设备的标记在两个版本之间已经改变了。 这里端口 IO_COM1 代替了 0x3f8,端口 IO_COM2 代替了 0x2f8,端口 IO_COM3 代替了 0x3e8,端口 IO_COM4 代替了 0x2e8,这些都是各自端口相应的端口地址。 中断4,3,5,9都是经常用的中断。也要注意有些正常的串行端口可能 无法 在一些ISA总线的PC上共享中断 (多插口板卡有板载的电子设备,允许在板上所有 16550A 的设备共享一个或两个中断请求)。 设备指定文件 内核中的绝大多数设备可以通过 设备特殊文件 来访问, 它就在/dev目录下。 sio 设备通过 /dev/ttydN (拨入)和 /dev/cuaaN (拨出) 设备来访问。 FreeBSD 也提供了初始化的设备 (/dev/ttyidN/dev/cuaiaN) 以及锁定的设备 (/dev/ttyldN/dev/cualaN)。 初始化的设备在每次端口被打开时被用来初始化设备通讯端口参数。 例如使用 RTS/CTS 的流控制信号的 crts的调制解调器。 锁定设备用来锁定端口的标记以阻止用户或程序改变某个参数。 参见 &man.termios.4;、&man.sio.4; 以及 &man.stty.1; 联机手册了解更多信息。 编译设备指定文件 从 FreeBSD 5.0 开始, &man.devfs.5; 文件系统将根据需要创建设备节点。 如果您在运行启用 devfs 的FreeBSD版本, 您就可以跳过这一节。 一个在/dev 目录下的叫做 MAKEDEV 的 shell 脚本管理着设备指定文件。 要使用 MAKEDEV 来建立拨号设备指定文件, 可以使用 COM1: (port 0), cd 进入 /dev, 然后执行命令 MAKEDEV ttyd0。 同样地,要建立拨号设备指定文件以使用 COM2: (port 1), 可以执行 MAKEDEV ttyd1 MAKEDEV 不仅仅创建 /dev/ttydN 设备指定文件,也创建 /dev/cuaaN/dev/cuaiaN/dev/cualaN/dev/ttyldN, 以及 /dev/ttyidN节点。 建立完新设备指定文件后, 需要检查文件的权限来确定谁可以在这些文件上读写 — 您可能不想让普通的用户使用您的 modem 吧。 在/dev/cua*文件上的默认权限应该是足够了: crw-rw---- 1 uucp dialer 28, 129 Feb 15 14:38 /dev/cuaa1 crw-rw---- 1 uucp dialer 28, 161 Feb 15 14:38 /dev/cuaia1 crw-rw---- 1 uucp dialer 28, 193 Feb 15 14:38 /dev/cuala1 这些许可允许用户uucp和在组dialer 上的用户使用呼出设备。 串行端口配置 ttyd cuaa ttydN (或cuaaN) 设备是您将要打开的应用程序的一般设备。 当进程打开某个设备时, 它将有一个终端 I/O 设置的默认配置。 您可以在命令行看看这些设置: &prompt.root; stty -a -f /dev/ttyd1 当您修改了这个设备的设置,这个设置会生效,除非设备被关闭。 当它被重新打开时,它将回到默认设置。 要修改默认设置,您可以打开和调整 初始状态 设备的设置。例如, 要为ttyd5 打开 模式,8位通讯和默认的 流控制, 输入: &prompt.root; stty -f /dev/ttyid5 clocal cs8 ixon ixoff rc files rc.serial 串行设备的系统初始化是用/etc/rc.serial文件类控制的。 这个文件会影响串行设备的默认设置。 要防止某个设置被一个应用程序所修改,需要调整 锁状态设备。 例如,要锁定ttyd5 的速度为57600 bit/s, 键入: &prompt.root; stty -f /dev/ttyld5 57600 现在,一个打开ttyd5 和设法改变端口速度的应用程序将被固定在57600bit/s。很自然地, 您需要确定初始状态,然后用root帐户锁定状态设备的写入功能。 MAKEDEV 很显然,您应该只让 root 用户可以初始化或锁定设备的状态。 Sean Kelly Contributed by 终端 终端 当您在计算机控制台或是在一个连接的网络上时, 终端提供了一个方便和低成本的访问FreeBSD系统的方法。 这节描述了如何在FreeBSD上使用终端。 终端的用法和类型 早期的 &unix; 系统没有控制台。 人们通过将终端连接到计算机的串口来登录和使用程序。 它很像用 modem 和一些终端软件来拨号进入一个远程的系统, 只能执行文本的工作。 今天的 PC 已经可以使用高质量的图形了, 但与今天的其他&unix;操作系统一样,建立一个登录会话的能力仍然存在。 通过使用一个终端连接到一个没有使用的串口, 您就能登录和运行任何文本程序或在 X 视窗系统中运行一个 xterm 窗口程序。 对于商业用户,您可以把任何终端连接到 FreeBSD 系统, 然后把它们放在员工的桌面上。 对于家庭用户,则可以使用一台比较老的 IBM PC 或 Macintosh 运行一个终端连接到一台运行 FreeBSD 的高性能机器上。 对于FreeBSD,有三种终端: 哑终端 充当终端的PC X 终端 下面一小节将描述每一种终端。 哑终端 哑终端需要专门的好几种硬件,让您通过串行线连接到计算机。 它们被叫做 是因为它们只能够用来显示, 发送和接收文本。 您不能在它上面运行任何程序。 有好几百种哑终端,包括Digital Equipment Corporation 的VT-100和Wyse的WY-75。只有几种可以在FreeBSD上工作。 一些高端的终端可以显示图形,但只有某些软件包可以使用这些高级特性。 哑终端被广泛用于那些不需要图形应用的工作中。 充当终端的PC 如果一个 哑终端 有足够的能力来显示,发送和接收文本, 那任何个人计算机都可以作为一个哑终端。 您所需要的只是适当的线缆和一些终端模拟软件。 这样一个配置被广泛运用于家庭。例如,如果您的妻子忙于在您的 FreeBSD 系统控制台上工作,您也可以从一台低档的个人计算机登录到 FreeBSD 系统执行一些文本的工作。 X 终端 X终端是最复杂的终端系统。它们通常需要使用以太网来连接。 它们能显示任何X应用程序。 我们介绍X终端只是为了感兴趣。然而, 这章不会涉及X终端的安装,配置或使用。 配置 这节描述了您在一个终端上启用一个登录会话,需要在 FreeBSD 系统上配置些什么。假设您已经配置好了内核来支持串行端口,您就可以连接了。 中曾经提到, init 进程依赖于系统启动时所有的处理控制和初始化。 通过 init 来执行的一些任务将先读取 /etc/ttys文件, 然后在可用的终端上启用一个 getty 进程。 getty 进程可用来阅读一个登录名和启动 login程序。 然而,要为您的FreeBSD系统配置终端,您需要以 root 身份执行下面的步骤: 如果它不在那儿,您需要为串行端口在 /dev目录下添加一行记录到 /etc/ttys 指定 /usr/libexec/getty 在端口上运行, 然后从 /etc/gettytab 文件指定适当的 getty 类型。 指定默认的终端类型。 设置端口为 on 确定端口是否为 secure 迫使init 重新读取 /etc/ttys文件。 作为可选的步骤,您可以通过在 /etc/gettytab 中建立一个记录,在第2步创建一个定制的 getty 类型来使用。这章不会介绍如何做。 您可以参考 &man.gettytab.5; 和 &man.getty.8; 的联机手册了解更多信息。 添加一个记录到<filename>/etc/ttys</filename> /etc/ttys文件列出了您 FreeBSD系统上允许登录的所有端口。 例如, 第一个虚拟控制台 ttyv0 在这个文件中有一个记录。 您可以使用这个记录登录进控制台。 这个文件也包含其他虚拟控制台的记录,串口,和伪 ttys 终端。 对于一个硬连线的终端, 只要列出串行端口的 /dev 记录而不需要 /dev部分 (例如, /dev/ttyv0 可以被列为 ttyv0)。 默认的 FreeBSD 安装包括一个支持最初四个串口 ttyd0ttyd3/etc/ttys 文件。 如果您从那些端口中某一个使用终端,您不需要添加另一个记录。 添加终端记录到<filename>/etc/ttys</filename> 假设我们连接两个终端给系统: 一个 Wyse-50 和一个老的运行 Procomm 终端软件模拟一个 VT-100 终端的286IBM PC。 在 /etc/ttys 文件中的相应的记录是这样的: ttyd1 "/usr/libexec/getty std.38400" wy50 on insecure ttyd5 "/usr/libexec/getty std.19200" vt100 on insecure 第一部分指定了终端指定文件的名称, 它可以在 /dev中找到。 第二部分是在这行执行的命令,通常是 &man.getty.8;。 getty 初始化然后打开一行,设置速度, 用户名的命令和执行登录程序。 getty 程序在它的命令行接收一个参数 (可选), getty 类型。 一个 getty 类型会在终端行描述一个特征, 像波特率和奇偶校验。 getty 程序从 /etc/gettytab 文件读取这些特征。 文件/etc/gettytab 包含了许多老的和新的终端行记录。 在很多例子中,启动文本 std 的记录将用硬连线终端来工作。 这些记录忽略了奇偶性。 这是一个从110到115200 bit/s的 std 记录。 当然,您可以添加您自己的记录到这个文件。 gettytab 的联机手册提供了更多的信息。 当在/etc/ttys中设置 getty 类型的时候, 确信在终端上的通讯设置匹配。 在我们的例子中, Wyse-50 不使用奇偶性, 用38400 bit/s 来连接。286 PC不使用奇偶性,用19200bit/s来连接。 第三部分是通常连接到那个tty行的终端类型。对于拨号端口, unknowndialup 通常被用在这个地方。 对于硬连线的终端,终端类型不会改变, 所以您可以从termcap数据库文件中放一个真正的终端类型。 在我们的例子中, Wyse-50 使用真正的终端类型, 而运行 Procomm 的286 PC将被设置成在VT-100上的模拟。 如果端口被启用,可以指定第四个部分。在第二部分, 把它放在这儿将执行初始化进程来启动程序 getty。如果您在这部分拖延, 将没有getty,在端口上因此就没有登录。 最后部分被用来指定端口是否安全。 标记一个安全的端口意味着您信任它允许用 root 帐户从那个端口登录。 不安全的端口不允许 root登录。 在一个不安全的端口上, 用户必须用无特权的帐户登录, 然后使用 su 或一个相似的机制来获得超级用户的权限。 重新读取<filename>/etc/ttys</filename>来强制<command>init</command> /etc/ttys文件做一个必要的修改后,您必须发送一个 SIGHUP 信号给初始化进程来迫使它重新读取配置文件,例如: &prompt.root; kill -HUP 1 init 总是系统运行时的第一个进程,因此它总是PID 1。 如果能够正确设置,所有的线缆都是适当的,终端将可以启用了, 然后一个 getty 进程将在每个终端运行, 您将在您的终端上看到登录命令行。 您的连接可能出现的问题 即使您小心翼翼地注意细节,您仍然可能会在设置终端时出错。 这有一个有关问题和解决办法的列表: 没有登录命令出现: 确定终端被嵌入和打开了。如果把一台个人计算机充当一个终端, 确信终端模拟软件运行在正确的串口上。 确信线缆被稳固地连接在终端和 FreeBSD 计算机上。 确信用了正确的电缆。 确定终端和 FreeBSD 的传输速度和奇偶设置已经一致了。 如果您有一个图像显示终端,确信对比度已经调节好了。 如果它是一个可打印的终端,确信纸张和墨水已经就绪了。 确定一个 getty 进程正在运行和服务终端。 例如, 可以用ps 命令得到运行 getty 程序的列表,键入: &prompt.root; ps -axww|grep getty 您将看到一个终端的记录。例如,下面的显示表明一个getty 正在第二个串行端口 ttyd1 运行, 正在/etc/gettytab中使用 std.38400 的记录: 22189 d1 Is+ 0:00.03 /usr/libexec/getty std.38400 ttyd1 如果没有 getty 进程运行, 确信您已经在/etc/ttys中启用了端口。 在修改完/etc/ttys文件后,记得运行 kill -HUP 1 如果 getty 进程确实在运行, 但终端上仍然没有显示出登录提示, 或者虽然显示了单缺不允许您输入, 您的终端或电缆可能不支持硬件握手。 请尝试将 /etc/ttys 中的 std.38400 改为 3wire.38400 并一定能够记得在改完 /etc/ttys 之后 kill -HUP 1)。 3wire 记录和 std 类似, 但忽略硬件握手。 您可能需要在使用 3wire 时减少波特率或启用软件流控制以避免缓冲区溢出。 出现一个 <quote>垃圾</quote> 而不是一个登录命令行 确信终端和 FreeBSD 使用相同的 bit/s 传输率和奇偶校验设置。 检查一下 getty 进程确信当前使用正确的 getty 类型。 如果没有, 编辑/etc/ttys然后运行kill -HUP 1 当键入密码时,字符两个两个出现 将终端 (或终端模拟软件) 从 半双工本地回显 换成 全双工 Guy Helmer Contributed by Sean Kelly Additions by 拨入服务 拨入服务 为拨入服务配置FreeBSD系统与连接到终端是非常相似的,除非您正在使用 modem来拨号而不是终端。 外置vs.内置modem 外置modem看起来很容易拨号。 因为,外置 modem 可以通过储存在非易失性的RAM中的参数来配置, 它们通常提供指示器来显示重要的RS-232信号的状态。 不停闪光的信号灯能给用户留下比较深刻的印象, 而且指示器也可以用来查看modem是否正常地工作。 内置modem通常缺乏非易失性的RAM, 所以对它们的配置可能会限制在通过 DIP 开关来设置。 如果您的内置modem有指示灯,您也很难看得到。 Modem和线缆 modem 如果您使用一个外置的 modem,那您将需要适当的电缆线。 一个标准的串行线应当足够长以至普通的信号能够连接上: Transmitted Data (TD) Received Data (RD) Request to Send (RTS) Clear to Send (CTS) Data Set Ready (DSR) Data Terminal Ready (DTR) Carrier Detect (CD) Signal Ground (SG) FreeBSD需要对速度超过2400bit/s的RTSCTS信号进行流控制, 当一个呼叫被回复或线路被挂起的时候, CD 信号就会被侦测到,一个会话完成之后,DTR 信号就会刷新modem。 一些线缆不需要任何信号就可以连接, 所以如果您有问题, 当线路被挂断时, 一个登录任务就会丢失, 您可能会在线缆上有问题。 像其他 &unix; 类的操作系统一样, FreeBSD 使用硬件信号来寻找出一个呼叫什么时候会回复或一个线路会被挂起。 FreeBSD 避免发送命令给 modem 或监视 modem 的状况。 如果您熟悉连接 modem 到基于 PC 的 BBS,这可能看起来有点笨拙。 串行接口的考虑 FreeBSD支持基于 NS8250, NS16450, NS16550 和 NS16550A 的EIA RS-232C通讯接口。 8250和16450设备有单字符缓冲。 16550设备提供了一个 16 个字符的缓冲, 可以提高更多的系统性能。 因为单字符缓冲设备比 16 个字符的缓冲需要更多的系统资源来工作, 所以基于16550A的接口卡可能更好。 如果系统没有活动的串口, 或有较大的负载, 16 字符缓冲的卡对于低错误率的通讯来说更好。 快速预览 getty 对于终端, init 会在每个配置串口上为每个拨入连接产生一个 getty 进程。 例如, 如果一个 modem 被附带在 /dev/ttyd0 中,用命令ps ax可以显示下面这些: 4850 ?? I 0:00.09 /usr/libexec/getty V19200 ttyd0 当用户拨上modem, 并使用它进行连接时, CD 线就会被 modem 认出。 内核注意到载波信号已经被检测到, 需要完成 getty 端口的打开。 getty 发送一个登录:在指定的初始线速度上的命令行。 Getty 会检查合法的字符是否被接收, 在典型的配置中, 如果发现 垃圾getty 就会设法调节线速度,直到它接收到合理的字符。 /usr/bin/login 用户在键入他/她的登录名称后, getty执行/usr/bin/login, 这会要求用户输入密码来完成登录, 然后启动用户的shell。 配置文件 /etc 目录中,有三个您将需要编辑的系统配置文件, 来允许拨号访问到您的 FreeBSD 系统。 第一, /etc/gettytab 包含了针对 /usr/libexec/getty 守护程序的配置信息。 第二, 保存信息来告诉 /sbin/init 什么 tty 设备将有运行在它们系统上的 getty进程。 最后, 您可以把端口初始化命令放在 /etc/rc.serial 脚本中。 在 &unix; 上, 关于拨号 modem 的想法主要有两种。 一种是把本地接口配置成一个固定速度, 以至一个远程用户拨号进入时都保持一个固定速度。 这样配置的好处是远程用户总是可以立即看到一个系统的登录界面。 这种下降趋势是系统不知道一个用户真正的数据速度是多少, 所以像 Emacs 全屏程序将不会调节屏幕刷新来确保对比较慢的连接有比较好的回应。 另一所学校将他们的 modem 所在的 RS-232 设置为自动适应远程用户的连接速度。 例如, V.32bis (14.4 Kbps) 的连接将让 modem 所在的 RS-232 接口运行在 19.2 Kbps, 而 2400 bps 的连接则会使 modem 的 RS-232 以 2400 bps 运行。 由于 getty 并不知道任何一个特定的 modem 的连接速率, 因此 getty 会以初始的速率给出一个 login: 消息并监视用户回应的字符。 如果用户看到一些乱码, 则他们应该知道连续按 Enter 键直到能够看到可以识别的提示为止。 如果数据传输速率不匹配, getty 将把用户输入的任何信息看作 乱码, 并尝试下一个速度并再次给出 login: 提示。 这个过程可以令人作呕地继续下去, 但用户通常只需按一两次键盘就可以看到正常的提示了。 很明显, 这个登录过程看起来可能没有前面所介绍的 锁定速率 方法那样脉络清晰, 但在低速连接上的用户应该能够从全屏幕程序中得到更好的交互响应。 这一节将尽量给出较为公平的配置信息, 但更偏向于使用遵守连接速率的 modem。 <filename>/etc/gettytab</filename> /etc/gettytab /etc/gettytab是一个用来配置 getty 信息的 termcap 风格的文件。 请看看 gettytab 的联机手册了解完整的文件格式和功能列表。 锁定速度的配置 如果您把您的modem的数据通讯率锁定在一个特殊的速度上, 您不需要对 /etc/gettytab 文件作任何变化。 匹配速度的配置 您将需要在 /etc/gettytab 中设置一个记录来告诉 getty 您希望在 modem 上使用的速度。 如果您的 modem 的速率是 2400 bit/s, 则可以使用现有的 D2400 的记录。 # # Fast dialup terminals, 2400/1200/300 rotary (can start either way) # D2400|d2400|Fast-Dial-2400:\ :nx=D1200:tc=2400-baud: 3|D1200|Fast-Dial-1200:\ :nx=D300:tc=1200-baud: 5|D300|Fast-Dial-300:\ :nx=D2400:tc=300-baud: 如果您有一个更高速度的 modem, 必须在 /etc/gettytab 中添加一个记录。 下面是一个让您可以以最高 19.2 Kbit/s 的用在 14.4 Kbit/s的modem上的接口记录: # # Additions for a V.32bis Modem # um|V300|High Speed Modem at 300,8-bit:\ :nx=V19200:tc=std.300: un|V1200|High Speed Modem at 1200,8-bit:\ :nx=V300:tc=std.1200: uo|V2400|High Speed Modem at 2400,8-bit:\ :nx=V1200:tc=std.2400: up|V9600|High Speed Modem at 9600,8-bit:\ :nx=V2400:tc=std.9600: uq|V19200|High Speed Modem at 19200,8-bit:\ :nx=V9600:tc=std.19200: 这样做的结果是 8-数据位, 没有奇偶校验的连接。 上面使用19.2 Kbit/s的连接速度的例子,也可以使用 9600 bit/s (for V.32), 2400 bit/s, 1200 bit/s,300 bit/s, 直到 19.2 Kbit/s。 通讯率的调节使用 nx= (next table) 来实现。 每条线使用一个 tc= (table continuation) 的记录来加速对于一个特殊传输率的标准设置。 如果您有28.8 Kbit/s的modem,或您想使用它的 14.4Kbit/s 模式, 就需要使用一个更高的超过 19.2 Kbit/s 的通讯速度的 modem。 这是一个启动 57.6 Kbit/s 的 gettytab 记录的例子: # # Additions for a V.32bis or V.34 Modem # Starting at 57.6 Kbps # vm|VH300|Very High Speed Modem at 300,8-bit:\ :nx=VH57600:tc=std.300: vn|VH1200|Very High Speed Modem at 1200,8-bit:\ :nx=VH300:tc=std.1200: vo|VH2400|Very High Speed Modem at 2400,8-bit:\ :nx=VH1200:tc=std.2400: vp|VH9600|Very High Speed Modem at 9600,8-bit:\ :nx=VH2400:tc=std.9600: vq|VH57600|Very High Speed Modem at 57600,8-bit:\ :nx=VH9600:tc=std.57600: 如果您的 CPU 速度较低, 或系统的负荷很重, 而且没有 16550A的串行端口,您可能会在57.6 Kbit/s上得到 sio silo错误。 <filename>/etc/ttys</filename> /etc/ttys /etc/ttys文件的配置在 中介绍过。 配置 modem 是相似的, 但我们必须指定一个不同的终端类型。 锁定速度和匹配速度配置的通用格式是: ttyd0 "/usr/libexec/getty xxx" dialup on 上面的第一条是这个记录的设备特定文件 — ttyd0 表示 /dev/ttyd0 是这个 getty 将被监视的文件。 第二条 "/usr/libexec/getty xxx" 是将运行在设备上的进程 init。 第三条,dialup,是默认的终端类型。 第四个参数, on, 指出了线路是可操作的 init。 也可能会有第五个参数, secure, 但它将只被用作拥有物理安全的终端 (如系统终端)。 默认的终端类型可能依赖于本地参考。 拨号是传统的默认终端类型, 以至用户可以定制它们的登录脚本来注意终端什么时候拨号, 和自动调节它们的终端类型。 然而, 作者发现它很容易在它的站点上指定 vt102 作为默认的终端类型, 因为用户刚才在它们的远程系统上使用的是VT102模拟器。 您对/etc/ttys作修改之后,您可以发送 init 进程给一个 HUP 信号来重读文件。您可以使用下面的命令来发送信号: &prompt.root; kill -HUP 1 如果这是您的第一次设置系统, 您可能要在发信号 init 之前等一下, 等到您的 modem 正确地配置并连接好。 锁定速度的配置 对于一个锁定速度的配置,您的 ttys 记录必须有一个为 getty 提供固定速度的记录。 对于一个速度被锁定在 19.2kbit/s 的 modem, ttys 记录是这样的: ttyd0 "/usr/libexec/getty std.19200" dialup on 如果您的 modem 被锁定在一个不同的数据速度, 为 std.speed 使用适当的速度来代替 std.19200。 确信您使用了一个在 /etc/gettytab 中列出的正确的类型。 匹配速度的设置 在一个匹配速度的设置中,您的 ttys 录需要参考在 /etc/gettytab 适当的起始 auto-baud 记录。 例如, 如果您为一个以 19.2 Kbit/s 开始的可匹配速度的 modem 添加上面建议的记录, 您的 ttys 记录可能是这样的: ttyd0 "/usr/libexec/getty V19200" dialup on <filename>/etc/rc.serial</filename> rc files rc.serial 高速modem, 像 V.32,V.32bis,和 V.34 modem,需要使用硬件 (RTS/CTS) 流控制。 您可以在 /etc/rc.serial 中添加 stty 命令来设置硬件流控制标记。 例如,在拨入和拨出初始设备的第一个 (COM2) 串行端口上设置termios标记crtscts, 下面这些行会被添加到 /etc/rc.serial中: # Serial port initial configuration stty -f /dev/ttyid1 crtscts stty -f /dev/cuaia1 crtscts Modem设置 如果您有一个 modem, 它的参数能被存储在非易失性的 RAM 中, 您将必须使用一个终端程序来设置参数。 使用同样的通讯速度来连接 modem 作为初始速度 getty 将使用和配置 modem 的非易失性RAM来匹配这些要求: CD asserted when connected DTR asserted for operation; dropping DTR hangs up line and resets modem CTS transmitted data flow control Disable XON/XOFF flow control RTS received data flow control Quiet mode (no result codes) No command echo 请读读您的 modem 的文档找到您需要用什么命令和 DIP 接口设置。 例如,要在一个 USRobotics Sportster 14400 的外置 modem 上设置上面的参数,可以用下面这些命令: ATZ AT&C1&D2&H1&I0&R2&W 您也可能想要在 modem 上寻找机会调节这个设置, 例如它是否使用 V.42bis 和 MNP5 压缩。 外置 modem 也有一些用来设置的 DIP 开关, 也许您可以使用这些设置作为一个例子: Switch 1: UP — DTR Normal Switch 2: N/A (Verbal Result Codes/Numeric Result Codes) Switch 3: UP — Suppress Result Codes Switch 4: DOWN — No echo, offline commands Switch 5: UP — Auto Answer Switch 6: UP — Carrier Detect Normal Switch 7: UP — Load NVRAM Defaults Switch 8: N/A (Smart Mode/Dumb Mode) 在拨号 modem 上的结果代码应该被 禁用/抑制, 以避免当 getty 在 modem 处于命令模式并回显输入时错误地给出 login: 提示时可能造成的问题。 这样可能导致 getty 与 modem 之间产生更长的不必要交互。 锁定速度的配置 对于锁定速度的配置, 您需要配置 modem 来获得一个不依赖于通讯率的稳定的 modem到计算机 的传输率。 在一个 USR Sportster 14400 外置 modem 上, 这些命令将锁定 modem到计算机 的传输率: ATZ AT&B1&W 匹配速度的配置 对于一个变速的配置, 您需要配置 modem 调节它的串行端口传输率匹配接收的传输率。 在一个 USR Sportster 14400 的外置 modem 上, 这些命令将锁定 modem 的错误修正传输率适合命令要求的速度, 但允许串行端口速度适应没有纠错的连接: ATZ AT&B2&W 检查modem的配置 大多数高速的modem提供了用来查看当前操作参数的命令。 在USR Sportster 14400外置modem上, 命令 ATI5 显示了存储在非易失性RAM中的设置。 要看看正确的 modem 操作参数, 可以使用命令 ATZ 然后是 ATI4 如果您有一个不同牌子的 modem, 检查 modem 的使用手册看看如何双重检查您的 modem 的配置参数。 问题解答 这儿是几个检查拨号modem的步骤。 检查FreeBSD系统 把您的modem连接到FreeBSD系统, 启动系统, 然后, 如果您的 modem 有一个指示灯, 当登录时看看 modem 的 DTR 指示灯是否亮: 会在系统控制台出现命令行——如果它亮, 意味着 FreeBSD 已经在适当的通讯端口启动了一个 getty 进程, 等待 modem 接收一个呼叫。 如果DTR指示灯不亮, 通过控制台登录到 FreeBSD系统,然后执行一个 ps ax 命令来看 FreeBSD 是否正在正确的端口运行 getty进程。 您将在进程显示中看到像这样的一行: 114 ?? I 0:00.10 /usr/libexec/getty V19200 ttyd0 115 ?? I 0:00.10 /usr/libexec/getty V19200 ttyd1 如果您看到是这样的: 114 d0 I 0:00.10 /usr/libexec/getty V19200 ttyd0 modem 不接收呼叫, 这意味着 getty 已经在通讯端口打开了。 这可以指出线缆有问题或 modem 错误配置, 因为 getty 无法打开通讯端口。 如果您没有看到任何 getty 进程等待打开想要的 ttydN 端口, 在 /etc/ttys 中双击您的记录看看那儿是否有错误。 另外,检查日志文件 /var/log/messages 看看是否有一些来自 initgetty 的问题日志。 如果有任何信息, 仔细检查配置文件 /etc/ttys/etc/gettytab,还有相应的设备文件 /dev/ttydN, 是否有错误,丢失记录,或丢失了设备指定文件。 尝试接入Try Dialing In 设法拨入系统。 确信使用8位, 没有奇偶检验, 在远程系统上的1阻止位。 如果您不能立刻得到一个命令行, 试试每隔一秒按一下 Enter。 如果您仍没有看到一个登录: 设法发送一个 BREAK。 如果您正使用一个高速的 modem 来拨号, 请在锁定拨号 modem 的接口速度后再试试。 如果您不能得到一个登录:prompt,再检查一下 /etc/gettytab,重复检查: /etc/ttys 中指定的初始可用的名称与 /etc/gettytab 的一个可用的相匹配。 每个 nx= 记录与另一个 gettytab 可用名称匹配。 每个 tc= 记录与另一个 gettytab可用名称相匹配。 如果您拨号但 FreeBSD 系统上的 modem 没有回应, 确信 modem 能回应电话。 如果 modem 看起来配置正确了, 通过检查 modem 的指示灯来确认 DTR 线连接正确。 如果您做了好几次,它仍然无法工作,打断一会,等会再试试。 如果还不能工作, 也许您应该发一封电子邮件给 &a.questions; 寻求帮助。 拨出设备 dial-out service 下面将让您的主机通过 modem 连接到另一台计算机上。 这只要适当地建立一个终端作为远程主机就可以。 这可以用来登录进一个BBS。 如果您用 PPP 有问题, 那这种连接可以用来从 Internet 上下载一个文件。 如果您必须 FTP 一些东西, 而 PPP 断了, 使用终端会话来 FTP 它们。 然后使用 zmodem 来把它们传输到您的机器上。 我的Stock Hayes Modem不被支持,我该怎么办? 事实上, 联机手册对于这个的描述已经过时了。 一个通用的 Hayes拨号已经内建其中。 只要在您的 /etc/remote 文件中使用 at=hayes Hayes 驱动不够 聪明 只能认出一些比较新的 modem 的高级特性 — 如 BUSYNO DIALTONE, 或 CONNECT 115200 的信息将被搞乱。 当您使用的时候, 您必须把这些信息关掉。(通过 ATX0&W)。 另外,拨号的延迟是 60 秒。 您的 modem 可能使用另外的时间或提示认为有其他的通讯问题。 试试 ATS7=45&W 注意: 实际上 tip 不支持所有的 Hayes modems。 解决方法是编辑 /usr/src/usr.bin/tip/tip 目录中的 tipconf.h 文件。很明显, 您需要它的源代码才能这样做。 把行#define HAYES 0 改为 #define HAYES 1。 然后 makemake install就可以了。 我如何输入这些 AT 命令? /etc/remote /etc/remote 文件中编译一个叫做 direct 的记录。 例如, 如果您的 modem 连接在第一个串行端口, /dev/cuaa0, 就添加下面这行: cuaa0:dv=/dev/cuaa0:br#19200:pa=none 使用 br 命令来启用您 modem 支持的最高传输速度。 然后键入 tip cuaa0, 您就可以连到您的 modem 上了。 如果在您的系统上没有 /dev/cuaa0,可以这样: &prompt.root; cd /dev &prompt.root; sh MAKEDEV cuaa0 或以 root 使用 cu, 执行下面的命令: &prompt.root; cu -lline -sspeed line line是串行端口 (例如 /dev/cuaa0), speed 是速度 (如57600)。 键入 ~. 退出。 现在pn <literal>@</literal>标记不能工作? 在电话号码中的 @ 标记告诉计算机在 /etc/phones 文件中查找一个电话号码。 但 @ 标记也是一个在像 /etc/remote 这样的可用文件中的特殊字符。 用一个反斜线符号退出: pn=\@ 我如何在命令行拨电话号码? 在您的 /etc/remote 文件中通常放着一个叫做 generic 的记录。 例如: tip115200|Dial any phone number at 115200 bps:\ :dv=/dev/cuaa0:br#115200:at=hayes:pa=none:du: tip57600|Dial any phone number at 57600 bps:\ :dv=/dev/cuaa0:br#57600:at=hayes:pa=none:du: 然后,您可以这样: &prompt.root; tip -115200 5551234 如果您更喜欢cu而不是tip,使用一个通用的cu记录: cu115200|Use cu to dial any number at 115200bps:\ :dv=/dev/cuaa1:br#57600:at=hayes:pa=none:du: 然后键入: &prompt.root; cu 5551234 -s 115200 这么做时是否每次都需要重新输入 bps 速率? 添加一项 tip1200cu1200, 并将 bps 速率换成更合适的值。 tip 的默认值是1200  bps, 也就是为什么会有 tip1200 这条记录的原因。 虽然您并不需要使用 1200 bps。 我通过一个终端服务器访问了很多主机。 除非每次都要等到您连接到主机然后键入 CONNECT <host>, 否则使用 tipcm 功能。 例如, 在 /etc/remote 中的这些记录: pain|pain.deep13.com|Forrester's machine:\ :cm=CONNECT pain\n:tc=deep13: muffin|muffin.deep13.com|Frank's machine:\ :cm=CONNECT muffin\n:tc=deep13: deep13:Gizmonics Institute terminal server:\ :dv=/dev/cuaa2:br#38400:at=hayes:du:pa=none:pn=5551234: 将让您键入 tip paintip muffin 连接到主机pain或muffin, 和 tip deep13 连接到终端服务器。 <command>tip</command>能为每个站点试用多个线路吗? 经常有一个问题, 一个大学有几个modem线路, 几千个学生设法使用它们。 /etc/remote 中为您的大学添加一个记录, 然后为 pn 功能使用 @ 标记: big-university:\ :pn=\@:tc=dialout dialout:\ :dv=/dev/cuaa3:br#9600:at=courier:du:pa=none: 接着, 在 /etc/phones 中列出大学的电话号码: big-university 5551111 big-university 5551112 big-university 5551113 big-university 5551114 tip 将按顺序试用每一个,然后就停止。 如果想继续测试, 隔一段时间再运行 tip 为什么我必须键入 <keycombo action="simul"> <keycap>Ctrl</keycap> <keycap>P</keycap> </keycombo> 两次才能发出 <keycombo action="simul"> <keycap>Ctrl</keycap> <keycap>P</keycap> </keycombo> 一次? CtrlP是默认的强制字符,被用来告诉tip下一个字符是文字的数据。您可以用~s给任何其他的字符设置强制字符,这意思是设置一个变量 在新的一行键入 ~sforce=single-charsingle-char 是任何简单的字符。 如果您遗漏了 single-char, 那强制字符就是空字符, 这可以键入 Ctrl2 CtrlSpace 来完成。 更好的 single-char Shift Ctrl 6 , 这只用在一些终端服务器上。 通过在您的 $HOME/.tiprc 文件中指定下面这行, 就可以得到您想要的任何强制字符: force=<single-char> 突然我键入的每一样东西都变成了大写?? 您一定是键入了 Ctrl A , 即 tipraise character, 会临时地指定成坏掉的 caps-lock键。 使用上面的 ~s 来合理地设置各种 raisechar。 事实上, 如果您不想使用这些特性的话,您可以用同样的方法设置强制字符。 这儿有一个很好的示例 .tiprc 文件, 对 Emacs用户来说,需要经常按 Ctrl2 CtrlA force=^^ raisechar=^^ The ^^ is ShiftCtrl6 . 如何用 <command>tip</command> 做文件传输? 如果您正在与另一台 &unix; 系统对话, 您可以用 ~p(put) 和 ~t (take) 发送和接收文件。 这些命令可以在远程系统上运行 catecho 来接收和发送文件。 语法是这样的: ~p local-file remote-file ~t remote-file local-file 由于没有错误校验, 所以您需要使用其他协议, 如 zmodem。 我如何用<command>tip</command>运行zmodem? 要接收这些文件,可以在远程终端启动发送程序。然后,键入 ~C rz 在本地开始接收它们。 要发送文件, 可以在远程终端启动接收程序。 然后, 键入 ~C sz files 把它们发送到远程系统。 Kazutaka YOKOTA Contributed by Bill Paul Based on a document by 设置串行控制台 serial console Introduction FreeBSD可以通过一个串口只使用一个哑 (dumb) 终端就可以启动一个系统。 这样一种配置只有两种人能使用: 希望在机器上安装 FreeBSD 的系统管理员, 他没有键盘或显示器, 还有就是要调试内核或设备驱动程序的开发人员。 就象 描述的, FreeBSD 采用一个三步的启动过程。 最先两步储存在 FreeBSD 启动磁盘的启动 slice 的启动代码块中。 引导块然后就被加载, 接着运行第三步启动引导器 (/boot/loader)。 为了设置串行控制台, 您必须配置启动代码块, 启动引导器代码和内核。 串行控制台的配置, 简明版 本节假定您使用默认的配置, 了解如何连接串口, 并且希望快速地了解一下串行控制台。 如果您在采取这些步骤时遇到问题, 请参考 中关于高级设置的详细介绍。 连接串口。 串行控制台将出现在 COM1 上。 使用 echo -h > /boot.config 来启用引导加载器和内核的串口控制台。 编辑 /etc/ttys 并把 ttyd0off 改为 on。 这将在串口控制台上启用一个登录提示, 其内容和普通的控制台一样。 shutdown -r now 将重启系统并启用串行控制台。 串行控制台的设置S 准备一个串行线缆。 null-modem cable 您需要使用一个 null-modem 的线缆或标准的串行线和一个 null-modem 适配器。 请参考 中有关串行线的讨论。 拔掉键盘。 绝大多数的PC在开机检测的时候会检测到键盘, 如果没有检测到键盘, 则会出现错误。 一些机器会提示缺少键盘, 就不会继续引导系统。 如果您的计算机出现错误, 但仍能继续启动, 您可以不必理它。 如果您的计算机没有键盘拒绝启动, 那您需要配置 BIOS 来避免它。 请参考您的主板的使用说明了解更多细节。 在 BIOS 中设置键盘 Not installed 并不意味着您不能使用键盘。 这样做只是告诉 BIOS 不要在机器开机检测时检测键盘以至提示您系统找不到键盘。 即使您设置了 Not installed, 只要把键盘插上去仍然可以使用。 如果系统有 PS/2 鼠标, 如果幸运的话, 您也可以象键盘一样把它拔下来, 这是因为 PS/2 鼠标与键盘的一些硬件是共享的, 您的鼠标插上去, 系统会认为键盘仍在那儿。 插一个哑 (dumb) 终端到COM1:(sio0)。 如果您没有哑终端, 可以使用一个比较老的带有一个 modem 程序的PC/XT机器, 或在其他 &unix; 机器上的串口。 如果您没有 COM1: (sio0), 去找一个。 这时, 您就不能只能选择 COM1:来启动系统。 如果您已经在另一台设备上使用 COM1, 您必须临时删除那个设备, 然后安装一个新的系统引导块和内核。 确信您的内核配置文件已经为 COM1: (sio0) 设置了适当的标记: 有关的标记是: 0x10 启用控制台支持。 如果没有设置它, 则其他的控制台标记都会被忽略。 现在, 绝大多数的设置都有控制台的支持。 这个标记的第一个就是首选的。 这个单独选项是不能确保串口适用于控制台的, 设置下面的标记或加上下面描述的 选项, 和这个放在一起。 0x20 不管下面有没有讨论, 都强制这个选项支持控制台。 这个标记在 FreeBSD 2.X 中取代了 COMCONSOLE选项。 标记 0x20 必须和 一起使用。 0x40 预留这个单元 (配合 0x10) 并让它不能用于普通的使用。 您不应在希望作为控制台的串口单元上设置这个标志。 这一标志是为内核远程调试准备的。 参见 开发者手册 以了解关于远程调试更进一步的情况。 在FreeBSD 4.0-CURRENT和以后的版本中,标记 0x40通常是不同的, 有另一个标记可以来指定一个串口用于远程调试。 例如: device sio0 at isa? port IO_COM1 flags 0x10 irq 4 看看 &man.sio.4; 的联机手册了解更多信息。 如果标记没有被设置, 您必须运行UserConfig或重新编译内核。 在启动磁盘的 a 分区的根目录创建 boot.config 文件。 这个文件将指导引导块代码如何启动系统。 为了激活串行控制台, 您必须有一个或多个下面的选项——如果您要多个选项, 在同一行必须都包含它们: 切换内部和串行控制台。 您使用这个来交换控制台设备。 例如, 如果您从内部控制台启动, 您可以使用 来直接使用启动引导器和内核来使用串口作为它的控制台设备。 另外, 如果您从串口启动, 您可以使用 - 来告诉启动引导器和内核使用显示设备作为控制台。/para> + 来告诉启动引导器和内核使用显示设备作为控制台。 切换单一和双重控制台配置。 在单一配置中, 控制台将是本机的控制台 (显示设备) 或串口。 在双重控制台配置中, 显示设备和串口将同时成为控制台, 无论 的选项的情形。 然而, 双控制台配置只在引导块运行的过程中起作用。 一旦启动引导器获得控制, 由 选项指定的控制台将成为唯一的控制台。 在启动时,探测键盘。如果键盘找不到, 选项会自动设置。 由于当前版本引导块的空间限制, 选项只能探测扩展的键盘。 少于101键的键盘将无法被探测到。 如果您碰到这个情况, 您必须避免使用 选项。 目前还没有绕过这个问题的办法。 使用 选项来自动选择控制台, 或使用 选项来激活控制台。 您也可以使用boot联机文档中所描述的其他选项。 除了 选项, 所有选项将被传给启动引导器 (/boot/loader)。 启动引导器将通过检查 选项的状态来决定是显示设备成为控制台, 还是串口成为控制台。 这表示如果您指定 选项, 但在 /boot.config 中没有 选项, 您在启动代码块时使用串口作为控制台。 启动引导器将使用内部显示设备作为控制台。 启动机器 当您启动您的FreeBSD时,引导块将把 /boot.config 的内容发给控制台。例如: /boot.config: -P Keyboard: no 如果您把 放在 /boot.config 中并指出键盘存在或不存在, 那将只出现第二行。 这些信息会被定位到串口或内部控制台, 或两者同时, 这完全取决于 /boot.config 中的选项。 选项 定位信息 none 内部控制台 串行控制台 串行控制台和内部控制台 串行控制台和内部控制台 , 有键盘 内部控制台 , 无键盘 串行控制台 出现上面信息后,在引导块加载启动引导器和更多信息被映到屏幕之前将有一个小小的停顿。 在通常情况下, 您不需要打断启动进程, 但为了确信设置是否正确, 您也可以这样做。 在控制台上按 Enter 以外的任意键就能打断启动进程。 引导块将进入命令行模式。 您将看到: >> FreeBSD/i386 BOOT Default: 0:ad(0,a)/boot/loader boot: 检验上面出现的信息, 可能是串口, 或内部控制台, 或两个同时, 完全取决于您在 /boot.config 中的选项。 如果信息出现在正确的控制台, 按 Enter 继续启动进程。 如果您要使用串行控制台, 但您没有看到命令行, 那可能设置有问题。 这时, 输入 然后按 Enter/Return 来告诉引导块 (然后是启动引导器和内核) 选择串口作为控制台。 一旦系统起来了, 就可以回去检查一下是什么出了问题。 启动引导器加载完后, 您将进入启动进程的第三步, 您仍然可以在启动引导器通过设定您喜欢的环境来切换内部控制台和串行控制台。 参考 摘要 这是几个在这章要讨论的几个设置和选择的控制台的摘要。 例1: 您为 <devicename>sio0</devicename> 设置标记 0x10 device sio0 at isa? port IO_COM1 flags 0x10 irq 4 在/boot.config中的选项 引导块过程中的控制台 启动引导器过程中的控制台 内核中的控制台 内部 内部 内部 串行 串行 串行 串行和内部 内部 内部 串行和内部 串行 串行 , 有键盘 内部 内部 内部 , 没有键盘 串行和内部 串行 串行 例2:您为sio0设置标记为0x30 device sio0 at isa? port IO_COM1 flags 0x30 irq 4 在/boot.config中的选项 引导块过程中的控制台 启动引导器过程中的控制台 内核中的控制台 内部 内部 串行 串行 串行 串行 串行和内部 内部 串行 串行和内部 串行 串行 , 有键盘 内部 内部 串行 , 没有键盘 串行 and internal 串行 串行 串行控制台的提示 设置一个快速的串口速度 默认的串口被设置成9600波特,8数据位, 无奇偶校验, 1个停止位。 如果您希望改变速度, 就必须重新编译引导块。在 /etc/make.conf 中添加下面一行, 然后编译新的引导块: BOOT_COMCONSOLE_SPEED=19200 参见 以了解如何编译和安装新的引导块。 如果串行控制台用其他方法来配置而不是在启动时用 , 或内核使用的串行控制台与引导块使用的不同, 就必须在内核配置中加入下面这行,并重新编译内核: options CONSPEED=19200 使用 <devicename>sio0</devicename> 以外的串口 作为控制台 使用串口而不是 sio0 作为控制台需要做一些重编译。 如果您无论如何都要使用另一个串口, 重新编译引导块, 启动引导器和内核。 取得内核源代码 (参考 )。 编辑 /etc/make.conf 文件, 然后设置 BOOT_COMCONSOLE_PORT作为您要使用 (0x3f80x2f8、 0x3E8 或 0x2E8) 端口的地址。 只有 sio0sio3 (COM1COM4) 都可以使用; 但多口串行卡将不会工作。 不需要任何中断设置。 创建一个定制的内核配置文件, 在您要使用的串口添加合适的标记。 例如, 如果要将 sio1 (COM2) 作为控制台: device sio1 at isa? port port IO_COM2 flags 0x10 irq 3 or device sio1 at isa? port port IO_COM2 flags 0x30 irq 3 其他端口的控制台标记也不要设。 重新编译和安装引导块: &prompt.root; cd /sys/boot &prompt.root; make clean &prompt.root; make &prompt.root; make install 重建和安装内核。 用 &man.disklabel.8; 将引导块写到启动盘上,然后从新内核启动。 通过串行线进入DDB调试器 options BREAK_TO_DEBUGGER options DDB 在串行控制台上得到一个登录命令行 您可能希望通过串行线进入登录提示, 现在您可以看到启动信息, 通过串行控制台键入内核调试信息。可以这样做。 用一个编辑器打开 /etc/ttys 文件, 然后找到下面的行: ttyd0 "/usr/libexec/getty std.9600" unknown off secure ttyd1 "/usr/libexec/getty std.9600" unknown off secure ttyd2 "/usr/libexec/getty std.9600" unknown off secure ttyd3 "/usr/libexec/getty std.9600" unknown off secure ttyd0ttyd3 相当于 COM1COM4。 可以打开或关闭某个端口。 如果您已经改变了串口的速度, 还必须改掉标准的 9600 与当前的例如 19200 相匹配。 您也可以改变终端的类型从不知名的到您串行终端的真实类型。 编辑完这个文件, 您必须 kill -HUP 1 来使这个修改生效。 从启动引导器修改控制台 前面一节描述了如何通过调整引导块来设定串行控制台。 这节将讲到在启动引导器中通过键入一些命令和环境变量来指定控制台。 由于启动引导器会被启动进程的第三步所调用, 引导块以后, 在启动引导器中的设置将忽略在引导块中的设置。 配置串行控制台 您可以很容易地指定启动引导器和内核来使用串行控制台, 只需要在 /boot/loader.rc中写入下面这行: set console=comconsole 无论前一节中的引导块如何配置, 这个设置都会生效。 您最好把上面一行放在文件的第一行, 以便尽早地在启动时看到串行控制台的启动信息。 同样地,您可以指定内部控制台为: set console=vidconsole 如果您不设置启动引导环境变量控制台, 启动引导器和内核将使用在引导块时用 选项指定的控制台。 在 3.2 以及更新的版本中,您可以在 /boot/loader.conf.local/boot/loader.conf 中, 而不是在 /boot/loader.rc 指定控制台。 用这种方法, 您的 /boot/loader.rc 文件将是这样的: include /boot/loader.4th start 然后, 创建 /boot/loader.conf.local 并加入下面的行。 console=comconsole console=vidconsole 看看 &man.loader.conf.5; 的联机手册了解更多信息。 目前, 引导块还没有与引导加载器的 选项等价的选项, 此外也没有在存在键盘时自动选则使用什么控制台的能力。 使用串口而不是<devicename>sio0</devicename>作为控制台 要使用一个串口而不是 sio0 作为串行控制台 需要重新编译启动引导器。下面的步骤跟 描述的相似。 警告 这篇文章本意是想告诉人们如何设定没有显示设备或键盘的专用服务器。 不幸的是, 绝大多数系统没有键盘可以让您启动, 而没有显示设备就不让您启动。 使用 AMI BIOS 的机器可以通过在 CMOS 中将 graphics adapter 项设为 Not installed 来在启动时不要求显示适配器。 然而, 许多机器并不支持这个选项, 如果您的系统没有显示硬件就拒绝启动。 对于这些机器, 即使您没有显示器, 也必须在机器上插上显示适配器。 建议您试试采用 AMI BIOS 的机器。 diff --git a/zh_CN.GB2312/books/handbook/users/chapter.sgml b/zh_CN.GB2312/books/handbook/users/chapter.sgml index 5260329caf..4bcd03f5e9 100644 --- a/zh_CN.GB2312/books/handbook/users/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/users/chapter.sgml @@ -1,973 +1,973 @@ Neil Blakey-Milner Contributed by 用户和基本的帐户管理 概述 FreeBSD允许多个用户同时使用计算机. 当然,这些用户中不是很多人同时坐在同一台计算机前. Well, 除非您连接多个终端设备,这种情况我们在讨论. ,而是其他用户可以通过网络来使用同一台计算机以完成他们的工作.要使用系统,每个人都应该有一个帐户. 读完这章,您将了解到: 在一个FreeBSD系统上不同用户帐户之间的区别. 如何添加用户帐户. 如何删除用户帐户. 如何改变帐户细节,如用户的全名,或首选的shell. 如何在每个帐户基础上设置限制,来控制像内存,CPU时钟这样的资源. 如何使用组来使帐户管理更容易. 在阅读这章之前,您应当了解: 了解&unix;和FreeBSD的基础知识 (). 介绍 所有访问系统的用户都是通过帐户完成的,所以用户和帐户管理是FreeBSD系统不可或缺的重要部分. 每个FreeBSD系统的帐户都有一些和它相对应的信息去验证它. 用户名 用户名在login: 提示符的后面键入。 用户名对于一台计算机来讲是唯一的; 您不可以使用两个相同的用户名来登录。 有很多用来创建正确用户名的规则, 具体请参考 &man.passwd.5;; 您使用的用户名通常需要8个或更少的小写字母。 口令 每个帐户都有一个口令与它对应。 口令可以是空的, 这样不需要口令就可以访问系统。 这通常不是一个好主意; 每个帐户都应该有口令。 用户 ID (UID) UID是系统用来识别用户的数字,传统上它的范围是0到65536之间 可以使用的 UID/GID 的最大值是 4294967295, 但这可能会给采用上述假定的软件造成严重的问题。 ,用以唯一地标识用户。 FreeBSD在内部使用UID来识别用户 — 在工作以前。 任何允许您指定一个用户名的 FreeBSD 命令都会把它转换成UID。 这意味着您可以用不同的用户名使用多个帐户, 但它们的UID是一样的。 FreeBSD 会把这些帐户认定是同一个用户。 组ID (GID) GID是用来识别用户所在的组的, 传统上范围在0到65536之间的数字。 组是一种基于用户GID而不是它们的UID的用来控制用户访问资源的机制。 这可以减少一些配置文件的大小。 一个用户也可以属于多个组。 登录类 登录类是对组机制的扩展,当把系统分配给不同用户时,它提供了额外的灵活性. 口令的定期更改 默认情况下, FreeBSD 并不强制用户去改变他们的口令。 您可以以用户为单位强制要求一些或所有的用户定期改变他们的口令。 帐户的到期时间 默认情况下 FreeBSD 不会自动完成帐户过期操作。 如果您正在创建帐户, 您应该知道一个帐户的有效使用期限。 例如, 在学校里您会为每个学生建立一个帐户, 您可以指定它们何时过期。 帐户过期后, 虽然帐户的目录和文件仍然存在, 但帐户已经不能继续使用了。 用户的全名 用户名可以唯一地识别FreeBSD的帐户, 但它不会反映用户的全名。 这些信息可能与帐户是相关的。 主目录 主目录是用户用来启动的目录的完全路径。 一个通常的规则是把所有用户的主目录都放在 /home/username 下,或者 /usr/home/username 下。 用户将把他们的个人文件放在自己的主目录下, 他们可以在那里创建任何目录. 用户 shell Shell提供了用户用来操作系统的默认环境。 有很多不同的shell, 有经验的用户会根据他们的经验来选择自己喜好的shell。 有三种类型的帐户: 超级用户, 系统用户, 以及 普通用户。 超级用户帐户通常叫做 root, 可以没有限制地管理系统。 系统用户运行服务。 最后, 普通用户给那些登录系统以及阅读邮件的人使用。 超级用户帐户 帐户 超级用户 (root) 超级用户帐户, 通常叫做 root, 可以重新配置和管理系统, 在收发邮件, 系统检查或编程这样的日常工作中, 尽量不要使用root权限。 这是因为不象普通用户帐户, 超级用户能够无限制地操作系统, 超级用户帐户的滥用可能会引起无法想象的灾难。 普通的用户帐户不会由于出错而破坏系统, 所以要尽可能的使用普通帐户, 除非您需要额外的特权。 在使用超级用户命令时要再三检查, 因为一个额外的空格或缺少某个字符的命令都可能会引起数据丢失。 所以, 在阅读完这章后您第一件要做的事就是, 在平时使用的时候, 创建一个没有特权的用户帐户。 无论您使用的是单用户还是多用户系统这样的申请都是相同的。 在这章的后面, 我们将讨论如何创建一个额外的帐户和如何在普通用户和超级用户之间进行切换。 系统帐户 帐户 系统 系统用户是那些要使用诸如DNS、 邮件, web等服务的用户。 使用帐户的原因就是安全; 如果所有的用户都由超级用户来运行, 那它们就可以不受约束地做任何事情。 帐户 daemon 帐户 operator 系统帐户可以是daemon, operatorbind (供域名服务使用),和news。 系统管理员经常创建 httpd 来运行 web 服务器。 帐户 nobody nobody 是普通的没有特权的系统用户。 然而, 大多数与用户联系很密切的服务是使用 nobody的, 记的这点非常重要, 这样可能使用户变的非常有特权。 用户帐户 帐户 用户 用户帐户是让真实的用户访问系统的主要方式, 这些帐户把用户和环境隔离, 能阻止用户损坏系统和其他用户, 在不影响其他用户的情况之下定制自己的环境。 任何人访问您的系统必须要有他们自己唯一的帐户。 这可以让您找到谁做了什么事, 并且阻止人们破坏其他用户的设置和阅读其他人的邮件等等。 每个用户能够设置他们自己的环境, 以利于他们通过改变shell, 编辑器, 键盘绑定和语言等适应并且更好的使用这个系统。 修改帐户 帐户 修改 在&unix; 的处理用户帐户的环境中有很多不同的命令可用. 最普通的命令如下, 接下来是详细使用它们的例子。 命令 摘要 &man.adduser.8; 在命令行添加新用户. &man.rmuser.8; 在命令行删除用户. &man.chpass.1; 一个灵活的用于修改用户数据库信息的工具. &man.passwd.1; 一个用于修改用户口令的简单的命令行工具. &man.pw.8; 一个强大灵活修改用户帐户的工具. <command>添加用户</command> 帐户 添加 添加用户 /usr/share/skel skeleton directory &man.adduser.8; 是一个简单的添加新用户的命令. 它为用户创建 passwdgroup 文件。 它也为新用户创建一个主目录, 它拷贝一个默认的配置文件 (dotfiles) 从 /usr/share/skel 这个目录, 然后给新用户发送一封带欢迎信息的邮件。 在&os; 5.0版本, &man.adduser.8;命令从Perl脚本改写为shell脚本, 起包装&man.pw.8;的作用, 所以它的用法在 &os; 4.X 上和 &os; 5.X 上略有不同。 建立初始化配置文件, 使用 adduser -s -config_create. 选项&man.adduser.8; 是。 当我们想要改变默认设置可以使用选项 接下来, 我们配置 &man.adduser.8; 的默认设置, 并建立第一个普通用户帐户, 因为将 root 用于日常使用会带来很多潜在问题。 配置 <command>adduser</command> 和添加一个新用户,在&os; 4.X版本 &prompt.root; adduser -v Use option ``-silent'' if you don't want to see all warnings and questions. Check /etc/shells Check /etc/master.passwd Check /etc/group Enter your default shell: csh date no sh tcsh zsh [sh]: zsh Your default shell is: zsh -> /usr/local/bin/zsh Enter your default HOME partition: [/home]: Copy dotfiles from: /usr/share/skel no [/usr/share/skel]: Send message from file: /etc/adduser.message no [/etc/adduser.message]: no Do not send message Use passwords (y/n) [y]: y Write your changes to /etc/adduser.conf? (y/n) [n]: y Ok, let's go. Don't worry about mistakes. I will give you the chance later to correct any input. Enter username [a-z0-9_-]: jru Enter full name []: J. Random User Enter shell csh date no sh tcsh zsh [zsh]: Enter home directory (full path) [/home/jru]: Uid [1001]: Enter login class: default []: Login group jru [jru]: Login group is ``jru''. Invite jru into other groups: guest no [no]: wheel Enter password []: Enter password again []: Name: jru Password: **** Fullname: J. Random User Uid: 1001 Gid: 1001 (jru) Class: Groups: jru wheel HOME: /home/jru Shell: /usr/local/bin/zsh OK? (y/n) [y]: y Added user ``jru'' Copy files from /usr/share/skel to /home/jru Add another user? (y/n) [y]: n Goodbye! &prompt.root; 总体而言, 我们把默认的shell设置成 zsh (一个可以在 Ports Collection 找到的 shell), 关闭欢迎邮件。 然后保存配置, 接着创建一个名为 jru的帐户, 并且确信 jruwheel 组里 (这样它就能够通过 &man.su.1; 转变为 root。) 口令不会被回显, 也不会用星号来显示。 两次输入的口令必须一致。 从现在起, 使用 &man.adduser.8; 不再需要改变默认设置。 如果您要求改变默认设置, 先退出程序, 然后使用 选项。 添加一个新用户在&os; 5.X版本 &prompt.root; adduser Username: jru Full name: J. Random User Uid (Leave empty for default): Login group [jru]: Login group is jru. Invite jru into other groups? []: wheel Login class [default]: Shell (sh csh tcsh zsh nologin) [sh]: zsh Home directory [/home/jru]: Use password-based authentication? [yes]: Use an empty password? (yes/no) [no]: Use a random password? (yes/no) [no]: Enter password: Enter password again: Lock out the account after creation? [no]: Username : jru Password : **** Full Name : J. Random User Uid : 1001 Class : Groups : jru wheel Home : /home/jru Shell : /usr/local/bin/zsh Locked : no OK? (yes/no): yes adduser: INFO: Successfully added (jru) to the user database. Add another user? (yes/no): no Goodbye! &prompt.root; <command>删除用户</command> rmuser 帐户 删除 您可以使用&man.rmuser.8; 从系统中完全删除一个用户. &man.rmuser.8; 执行如下步骤: 删除用户的 &man.crontab.1; 记录 (如果有的话). 删除属于用户的&man.at.1; 工作. 杀掉属于用户的所有进程. 删除本地口令文件中的用户. 删除用户的主目录 (如果他有自己的主目录). 删除来自 /var/mail属于用户的邮件. 删除所有诸如 /tmp的临时文件存储区中的文件. 最后, 删除 /etc/group中所有属于组的该用户名. 如果一个组变成空,而组名和用户名一样,组将被删除. &man.adduser.8;命令建立每个用户唯一的组. &man.rmuser.8; 不能用来删除超级用户的帐户, 因为那样做是对系统极大的破坏. 默认情况下, 使用交互模式, 这样能够让您清楚的知道您在做什么. <command>删除用户</command> 交互模式下的帐户删除 &prompt.root; rmuser jru Matching password entry: jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh Is this the entry you wish to remove? y Remove user's home directory (/home/jru)? y Updating password file, updating databases, done. Updating group file: trusted (removing group jru -- personal group is empty) done. Removing user's incoming mail file /var/mail/jru: done. Removing files belonging to jru from /tmp: done. Removing files belonging to jru from /var/tmp: done. Removing files belonging to jru from /var/tmp/vi.recover: done. &prompt.root; <command>chpass</command> chpass &man.chpass.1; 可以改变用户的口令, shells, 和包括个人信息在内的数据库信息. 只有系统管理员, 既超级用户, 才可以用&man.chpass.1;改变其他用户口令和信息. 除了可选择的用户名, 不需要任何选项, &man.chpass.1; 将显示一个包含用户信息的编辑器. 可以试图改变用户在数据库中的信息. 在 &os; 5.X版本, 编辑退出后,您应该索要您的口令,如果您不是超级用户的话. 以超级用户交互执行 <command>chpass</command> 命令 #Changing user database information for jru. Login: jru Password: * Uid [#]: 1001 Gid [# or name]: 1001 Change [month day year]: Expire [month day year]: Class: Home directory: /home/jru Shell: /usr/local/bin/zsh Full Name: J. Random User Office Location: Office Phone: Home Phone: Other information: 普通用户只能改变他们自己很少的一部分信息. 以普通用户交互执行 <command>chpass</command> 命令 #Changing user database information for jru. Shell: /usr/local/bin/zsh Full Name: J. Random User Office Location: Office Phone: Home Phone: Other information: &man.chfn.1; 和 &man.chsh.1; 只是到 &man.chpass.1; 的符号连接, 类似地, &man.ypchpass.1;, &man.ypchfn.1; 以及 &man.ypchsh.1; 也是这样。 NIS 是自动支持的, 不一定要在命令前指定 yp。 如果这让您有点不太明白, 不必担心, - NIS 将在 介绍。 + NIS 将在 介绍。 <command>passwd命令</command> passwd命令 帐户 改变口令 &man.passwd.1; 是改变您自己作为一个普通用户口令或者作为超级用户口令常用的方法. 用户改变口令前必须键入原来的口令, 防止用户离开终端时非授权的用户进入改变合法用户的口令。 改变您的口令 &prompt.user; passwd Changing local password for jru. Old password: New password: Retype new password: passwd: updating the database... passwd: done 改变其他用户的口令同超级用户的一样 &prompt.root; passwd jru Changing local password for jru. New password: Retype new password: passwd: updating the database... passwd: done 就象 &man.chpass.1;一样, &man.yppasswd.1; 只是一个到 &man.passwd.1;的连接, 所以NIS用任何一个命令都可以正常工作. <command>pw命令</command> pw命令 &man.pw.8; 是一个用来创建、删除、修改、显示用户和组的命令行工具。 它还有系统用户和组文件编辑器的功能。 &man.pw.8; 有一个非常强大的命令行选项设置, 但新用户可能会觉得它比这里讲的其它命令要复杂很多。 限制用户使用系统资源 限制用户使用系统资源 帐户 限制 如果您有一些用户, 并想要对他们所使用的系统资源加以限制, FreeBSD 提供了一些系统管理员限制用户访问系统资源的方法。 这些限制通常被分为两种: 磁盘配额, 以及其它资源限制。 配额 限制用户使用系统资源 配额 磁盘配额 磁盘配额限制用户对磁盘的使用, 而且它还提供一种快速检查用户使用磁盘数量而不需要时刻计算的方法。 配额将在 讨论. 其它资源限制包括CPU、 内存以及用户可能会使用的其它资源。 这些是通过对登录进行分类完成的, 下面将做讨论。 /etc/login.conf 登录的类由 /etc/login.conf 文件定义。 比较精确的描述超出了本章的范围, 但 &man.login.conf.5; 联机手册会有比较详细的描述。 可以说每个用户都分配到一个登录类 (默认是 defalut), 每个登录类都有一套和它相对应的功能。 登录功能是 名字= 这样的一对值, 其中名字 是一个众所周知的标识符, 是一个根据名字经过处理得到的任意字符串。 设置登录类和功能相当简单, 在 &man.login.conf.5; 联机手册会有比较详细的描述。 系统并不直接读取 /etc/login.conf 中的配置, 相反, 它读取数据库文件 /etc/login.conf.db。 为了从 /etc/login.conf 生成 /etc/login.conf.db, 需要执行下面的命令: &prompt.root; cap_mkdb /etc/login.conf 资源限制与普通登录限制是有区别的。 首先, 对于每种限制, 有软限制 (比较常见) 和硬限制之分。 一个软限制可能被用户调整过, 但不会超过硬限制。 越往后可能越低, 但不会升高。 其次, 绝大多数资源限制会分配特定用户的每个进程, 而不是该用户的全部进程。 注意, 这些区别是资源限制的特殊操作所规定的, 不是登录功能框架的完成 (也就是说, 他们实际上 不是一个登录功能的特例)。 不再罗嗦了, 下面是绝大多数资源限制的例子 (您可以在 &man.login.conf.5; 找到其它与登录功能相关的内容)。 coredumpsize coredumpsize 限制用户使用系统资源 coredumpsize 很明显, 由程序产生的核心文件大小的限制在磁盘使用上是属于其它限制的 (例如, 文件大小, 磁盘配额)。 不过, 由于用户自己无法产生核心文件, 而且通常并不删除它们, 设置这个可以尽量避免由于一个大型应用程序的崩溃所造成的大量磁盘空间的浪费。 (例如, emacs) 崩溃。 cputime cputime 限制用户使用系统资源 cputime 这是一个用户程序所能消耗掉的最大CPU时钟数量. 一些不理想的进程会被内核杀掉. 这是一个有关CPU消耗的时钟 限制, 不是&man.top.1; 和 &man.ps.1; 命令时屏幕上显示的CPU消耗的百分比。 在写此说明时, 后者的限制是是不太可能和没有价值的: 编译器 — 编译一个可能是合法的工作 — 可以在某一时刻轻易的用掉 100% 的 CPU。 filesize filesize 限制用户使用系统资源 filesize 这是用户可以处理一个文件的最大值。 不象 磁盘配额, 这个限制是对单个文件强制执行的, 不是用户自己的所有文件。 maxproc maxproc 限制用户使用系统资源 maxproc 这是一个用户可以运行的最大进程数。 这包括前台和后台进程。 很明显, 这不可能比系统指定 kern.maxproc &man.sysctl.8; 的限制要大。 同时也要注意, 设置的过小会妨碍用户的处理能力: 可能需要多次登录或执行多个管道。 一些任务, 例如编译一些大的程序, 也可能会产生很多进程 (例如, &man.make.1;, &man.cc.1; 以及其它一些预处理程序)。 memorylocked memorylocked 限制用户使用系统资源 memorylocked 这是一个进程可能会被锁定到主存中的最大内存数量 (参见 &man.mlock.2;)。 大型程序, 例如像 &man.amd.8; 在遇到问题时, 它们得到的巨大交换量无法传递给系统进行处理。 memoryuse memoryuse 限制用户使用系统资源 memoryuse 这是在给定时间内一个进程可能消耗的最大内存数量。 它包括核心内存和交换内存。 在限制内存消耗方面, 这不是一个完全的限制,但它是一个好的开始。 openfiles openfiles 限制用户使用系统资源 openfiles 这是一个进程可以打开的最大文件数。 在FreeBSD中, 文件可以被表现为套接字和IPC通道; 注意不要把这个数设置的太小。 系统级的限制是由 kern.maxfiles 定义的, 详情参见 &man.sysctl.8;。 sbsize sbsize 限制用户使用系统资源 sbsize 这是网络内存数量的限制, 这主要是针对通过创建许多套接字的老式 DoS 攻击的, 但也可以用来限制网络通信。 stacksize stacksize 限制用户使用系统资源 stacksize 这是一个进程堆栈可能达到的最大值。 它不能单独的限制一个程序可能使用的内存数量; 所以, 需要与其它的限制手段配合使用。 在设置资源限制时, 有一些其他的事需要注意。 下面是一些通常的技巧、 建议和注意事项。 系统启动的进程/etc/rc会被指派给 守护程序 的登录类. 虽然 /etc/login.conf 文件是一个对绝大多数限制做合理配置的资源文件, 但只有您也就是系统管理员,才知道什么最适合您的系统。 设置的太高可能会因为过于开放而造成系统的被人滥用, 设置的过低则会降低效率。 使用 X Window 的用户可能要比其他用户使用更多的资源。 因为X11本身就使用很多资源, 而且它鼓励用户同时运行更多的程序。 要记得许多限制会被用于单个进程, 不是用户的所有进程。 例如, 将 openfiles 设置为 50 意味着每个用户进程最高只能打开 50 个文件。 然而, 用户可以打开的文件的总的大小是根据 maxproc 值逐步增加的 openfiles 值。 同样的规则也适用于内存相关的限制。 有关资源限制,登录类的更深入信息可以查看相关联机手册: &man.cap.mkdb.1;, &man.getrlimit.2;, &man.login.conf.5;. 个性化用户设置 本地化是由系统管理员或用户设置的的一个环境, 它可以用来调整不同的语言、 字符设置、 时钟时区等等。 这将在 本地化 一章做详细讨论。 /etc/groups 帐户 组简单的讲就是一个用户列表. 组通过组名和GID (组 ID) 来识别。 在 FreeBSD (以及绝大多数其他 &unix; 系统) 中, 内核用以决定一个进程是能够完成一项动作的两个因素是它所属的用户 ID 和组 ID。 与用户 ID 不同, 每个进程都有一个和它相关联的组的列表。 您可能听说过用户或进程的 组 ID; 大多数情况下, 这表示列表中的第一个组。 与组ID对应的组名在/etc/group中。 这是一个由冒号来界定的文本文件。 第一部分是组名, 第二部分是加密后的口令, 第三部分是组ID, 第四部分是以逗号相隔的成员列表。 它可以用手工方式进行编辑 (当然, 如果您能保证不出语法错误的话!)。 对于更完整的语法描述, 参见 &man.group.5; 联机手册. 假如您想要手工编辑/etc/group, 您可以使用 &man.pw.8; 添加和编辑组。 例如, 要添加一个叫 teamtwo 的组, 确定它存在: 使用&man.pw.8;添加一个组 &prompt.root; pw groupadd teamtwo &prompt.root; pw groupshow teamtwo teamtwo:*:1100: 上面的数字 1100 是组 teamtwo 的组 ID。 目前, teamtwo 还没有成员, 因此也就没有多大用处。 接下来, 把 jru 加入到 teamtwo 组。 使用 &man.pw.8; 在组中添加用户 &prompt.root; pw groupmod teamtwo -M jru &prompt.root; pw groupshow teamtwo teamtwo:*:1100:jru 所需的参数是一个用逗号分隔的组中用户成员的列表。 在前面我们已经每个用户在口令文件中也包含了一个组。 之后用户被自动地添加到组列表里; 当我们使用 命令时 &man.pw.8; 用户列表不被显示出来。 但当通过 &man.id.1; 或者类似工具查看时, 就会看到用户列表。 换言之, &man.pw.8; 命令只能读取 /etc/group 文件; 它从不尝试从 /etc/passwd 文件读取更多信息。 使用&man.id.1;来决定组成员 &prompt.user; id jru uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo) 正如您所看到的, jru 是组 jru 和组 teamtwo的成员. 有关&man.pw.8;的更多信息, 请参看其它联机手册。 更多的关于 /etc/group 文件格式的信息, 请参考 &man.group.5; 联机手册。 diff --git a/zh_CN.GB2312/books/handbook/x11/chapter.sgml b/zh_CN.GB2312/books/handbook/x11/chapter.sgml index b61d47af4d..2e5e1a6514 100644 --- a/zh_CN.GB2312/books/handbook/x11/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/x11/chapter.sgml @@ -1,1619 +1,1619 @@ Ken Tom Updated for X.Org's X11 server by Marc Fonvieille X Window 系统 概述 FreeBSD 使用 X11 来为用户提供功能强大的图形用户界面。 X11 是一种开放源代码的 X Window 系统实现, 它包括 &xorg;&xfree86;。 &os; 在包括 &os; 4.10-RELEASE 和 &os; 5.2.1-RELEASE 以前的版本中默认安装 &xfree86;, 一种由 The &xfree86; Project, Inc. 发行的 X11 服务。 从 &os; 5.3-RELEASE 开始, 默认并且为官方支持的 X11 改为了 &xorg;, 它是由 X.Org Foundation 开发的 X11 服务。 这章将介绍 X11 的安装和配置, 并着重强调 &xorg; 欲了解 X11 所支持的显示卡等硬件, 请访问 &xorg;&xfree86; 的网站。 在阅读完这一章后,您将会了解: X 视窗系统的不同组件,它们是如何协同工作的。 如何安装和配置 X11。 如何安装和使用不同的窗口管理器。 如何在 X11 中使用 &truetype; 字体。 如何为您的系统设置图形登陆 (XDM)。 在阅读这一章之前,您应该: 知道如何安装额外的第三方应用程序()。 这一章介绍了 &xorg;&xfree86; 两种 X11 服务的安装和配置。 绝大多数时候, 配置文件、 命令句法是完全一样的。 当存在差异时, &xorg;&xfree86; 的写法都会有所体现。 理解 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 也是可以的,在它们上面也有很多免费的和商业化的应用程序。 从 &os; 5.3-RELEASE 开始, 随 &os; 一同安装的 X 服务改成了 &xorg;, 它在类似 FreeBSD 的授权下可以免费使用。 此外, 也有一些针对 FreeBSD 的商业 X 服务器。 窗口管理器 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 分类目录里找到。 另外,KDEGNOME 桌面环境都有他们自己的窗口管理器 与桌面集成。 每个窗口管理器也有不同的配置机制;有些需要手工来写配置文件, 而另外一些则可以使用 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; 的窗口风格),OpenLook, 和其他一些窗口部件集。 今天,绝大多数比较新的 X 应用程序将使用一个现代风格的窗口设计, 像 Qt, 用来设计 KDE, 或 GTK+,用来设计 GNOME。 在这样一种窗口系统下,&unix; 桌面的一些所见即所得特性作了一些收敛,以使 初学者感到更容易一些。 安装 X11 &xorg;&xfree86; 都可以安装到 &os; 上。 从 &os; 5.3-RELEASE 开始, &xorg; 成为了 &os; 上的默认 X11 实现。 &xorg; 是由 X.Org Foundation 发行的 X11R6.7 实现。 X11R6.7 基于 &xfree86 4.4RC2 和 X11R6.6 的代码。 The X.Org Foundation 于 2004 年 4月正式发行了 X11R6.7。 如果需要从 ports collection 编译和安装 &xorg; &prompt.root; cd /usr/ports/x11/xorg &prompt.root; make install clean 要完整地编译 &xorg; 则需要至少 4 GB 的剩余磁盘空间。 如果想从 ports collection 中编译和安装 &xfree86; &prompt.root; cd /usr/ports/x11/XFree86-4 &prompt.root; make install clean 另外 X11 也可以直接从 package 来安装。 我们提供了可以与 &man.pkg.add.1; 工具配合使用的 X11 安装包。 如果从远程下载并安装时, &man.pkg.add.1; 请不要指定版本号。 &man.pkg.add.1; 会自动地下载最新版本的安装包。 想要从 package 安装 &xorg;, 简单地输入下面的命令: &prompt.root; pkg_add -r xorg &xfree86; 4.X 也可以用类似的办法安装: &prompt.root; pkg-add -r XFree86 上面的例子介绍了如何安装完整的 X11 软件包, 包括服务器端,客户端,字体等等。 此外, 也有一些单独的 X11 的 ports 和 packages. 这一章余下的部分将会讲解如何配置 X11, 以及如何设置一个高效的桌面环境。 从 <application>&xfree86;</application> 转移到 <application>&xorg;</application> 任何 port 都一样,您应该检查 /usr/ports/UPDATING 文件看看有哪些改变。 这个文件中包含了把您的系统从 &xfree86; 转换到 &xorg; 的说明。 在尝试任何转换之前请使用 CVSup 来更新您的 ports tree。在转换您的 X11 安装前您还需要安装 sysutils/portupgrade /etc/make.conf 中您需要添加变量 X_WINDOW_SYSTEM=xorg。 这样做确保您的系统知道正在使用哪种 X11。 旧的 XFREE86_VERSION 变量已经过时并被 X_WINDOW_SYSTEM 变量所取代。 然后,使用下面的命令: &prompt.root; pkg_delete -f /var/db/pkg/imake-4* /var/db/pkg/XFree86-* &prompt.root; cd /usr/ports/x11/xorg &prompt.root; make install clean &prompt.root; pkgdb -F &man.pkgdb.1; 命令是 portupgrade 软件的一部分, 会更新各种软件包的依赖关系。 要联编完整的 &xorg;, 请确保至少有 4 GB 的剩余磁盘空间。 Christopher Shumway Contributed by 配置 X11 &xfree86; 4.X &xfree86; &xorg; X11 开始之前 在配置 X11 之前, 您需要了解所安装的系统的下列信息: 显示器规格 显示卡的芯片类型 显示卡的显存容量 水平刷新率 垂直刷新率 显示器的规格被 X11 用来决定显示的分辨率和刷新率。 这些规格通常可以从显示器所带的文档中, 以及制造商的网站找到。 需要知道两个数字范围: 垂直刷新率和水平刷新率。 显示卡的芯片类型将决定 X11 使用什么模块来驱动图形硬件。 绝大多数的硬件都能被自动检测, 但是了解它在自动检测出错的时候还是很有用处的。 显示卡的显存大小决定了系统支持的分辨率和颜色深度。 了解这些限制非常重要。 配置 X11 配置 X11 需要几步。 第一步是以超级用户的身份建立初始的配置文件: &prompt.root; Xorg -configure 在使用 &xfree86; 的情况下键入: &prompt.root; XFree86 -configure 这会在 /root 中生成一个叫做 xorg.conf.new 的配置文件 (无论您使用 &man.su.1; 或直接登录, 都会改变默认的 $HOME 目录变量)。 对于 &xfree86; 来说, 配置文件的名字是 XF86Config.new。 X11 程序将尝试探测系统中的图形硬件并写包含检测到的硬件的配置文件, 以便加载正确的驱动程序。 下一步是测试现存的配置文件, 以确认 &xorg; 能够同系统上的图形设备正常工作。 要完成这个任务,只需: &prompt.root; Xorg -config xorg.conf.new &xfree86; 用户应: &prompt.root; XFree86 -xf86config XF86Config.new 如果用户看到一个黑灰的格子和一个 X 形的鼠标指针,那么配置就是成功 的。要退出测试,只要同时键入 Ctrl Alt Backspace 如果鼠标工作不正常, 请首先配置它。 请查看 &os; 安装一章 微调 X11 - 接下来是调整 xorg.conf.new (或 XF86Config.new, 如果运行 &xfree86 的话) + 接下来是调整 xorg.conf.new (或 XF86Config.new, 如果运行 &xfree86; 的话) 配置文件并作测试。 用文本编辑器如 &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 HorizSyncVertRefresh 在配置文件中可能没有。 如果是这样的话, 就需要添加它们, 并在 HorizSync 以及 VertRefresh 后面设置合适的数值。 在上面的例子中, 给出了相应的显示其的参数。 X 能够利用显示器所支持的 DPMS (能源之星) 功能。 &man.xset.1; 程序可以控制超时时间, 并强制待机、挂起或关机。 如果希望启用显示器的 DPMS 功能, 则需要把下面的设置添加到 monitor 节中: Option "DPMS" xorg.conf XF86Config 关闭 xorg.conf.new (或 XF86Config.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; (或 &man.XFree86.1;) 的 命令行开关来替代配置文件中的设置。 Modes 关键字描述了给定颜色深度下屏幕的分辨率。 需要说明的是, 目标系统的图形硬件只支持由 VESA 定义的标准模式。 前面的例子中, 默认色深是使用 24位色。 在采用这个色深时, 允许的分辨率是 1024x768。 最后就是将配置文件存盘, 并使用前面介绍的测试模式测试一下。 在发现并解决问题的过程中可以帮助您的工具之一就是 X11 的日志文件,包含了与 X11 服务器相关的每个设备的信息。 &xorg; 日志的文件名是 /var/log/Xorg.0.log 这样的格式 (&xfree86; 日志文件名是 XFree86.0.log 这样的格式)。日志的准确的名字 可以从 Xorg.0.logXorg.8.log 等等。 如果一切准备停当, 就可以把配置文件放到公共的目录中了。 您可以在 &man.Xorg.1; (或 &man.XFree86.1;) 里面找到具体位置。 这个位置通常是 /etc/X11/xorg.conf/usr/X11R6/etc/X11/xorg.conf (对于 &xfree86; 它应该是 /etc/X11/XF86Config/usr/X11R6/etc/X11/XF86Config)。 &prompt.root; cp xorg.conf.new /etc/X11/xorg.conf For &xfree86;: &prompt.root; cp XF86Config.new /etc/X11/XF86Config 现在已经完成了 X11 的配置全过程。 为了使用 &man.startx.1; 来启动 &xfree86; 4.X 需要安装 x11/wrapper port。 &xorg; 已经包含了 wrapper 代码, 因此并不需要安装 wrapper port。 X11 服务器也可以用 &man.xdm.1; 来启动。 有一个图形配置工具, &man.xorgcfg.1; (对于 &xfree86; 来说, 是 &man.xf86cfg.1;), 随 X11 软件包一同安装。 它可以通过选择合适的驱动和设置交互式地定义配置。 这个程序可以从控制台通过命令 xorgcfg -textmode 来直接启动。 与了解详情, 请参考 &man.xorgcfg.1; 和 &man.xf86cfg.1; 的联机手册。 另外还有一个叫做 &man.xorgconfig.1; 的文本界面配置工具 (对于 &xfree86; 是 &man.xf86config.1;), 这是一个控制台工具因此对用户显得不太友好, 不过当其他工具无法工作时, 它仍然可能可以使用。 高级配置主题 配置 &intel; i810 显示芯片组 Intel i810 显示芯片 配置Intel i810芯片组的显示卡需要有针对 X11 的能够用来驱动显示卡的 agpgart AGP程序接口。 自从发行版本 4.8-RELEASE 和 5.0-RELEASE 发行以来 &man.agp.4; 驱动程序就包含在 GENERIC 内核配置里面了。 在以前的发行版里,您必须要在您的内核配置文件里添加下面的一行: device agp 然后重新编译一个新的内核。 或者,您可以在启动的时候使用 &man.loader.8; 自动加载 agp.ko 内核模块。 简单的添加下面这行到 /boot/loader.conf 文件里: agp_load="YES" 接下来,如果您正在运行 FreeBSD 4.X 或者更早的版本, 需要创建一个设备节点作为程序接口。 要创建 AGP 设备节点,在 /dev 下运行 &man.MAKEDEV.8;: &prompt.root; cd /dev &prompt.root; sh MAKEDEV agpgart FreeBSD 5.X 和以后的版本会使用 &man.devfs.5; 来半透明的分配 设备节点,因此 &man.MAKEDEV.8; 这一步是不必要的。 这也适用于其他的图形卡硬件配置。 注意如果系统没有将 &man.agp.4; 驱动程序编译进内核,尝试用 &man.kldload.8; 加载模块是无效的。 这个驱动程序必须编译进内核或者使用 /boot/loader.conf 在启动时加载进入内核。 如果您正在使用 &xfree86; 4.1.0 (或者以后的 版本) 并且出现了像 fbPictureInit 这样未解决的符号提示, 试着在 X11 配置文件里的 Driver "i810" 一行后面加入下面这行: Option "NoDDC" Murray Stokely Contributed by 在 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;xorg.conf&xfree86; 则是 XF86Config) 中增加下面的配置: 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 fonts TrueType &xfree86; 4.X&xorg; 都已经内建了对 &truetype; 字体的支持。有两个不同的模块能够启用这个功能。 在这个例子中使用 freetype 这个模块,因为它与其他的字体描绘后端 是兼容的。要启用 freetype 模块,只需要将下面这行添加到 /etc/X11/XF86Config 文件的 "Module" 部分。 Load "freetype" 对于 &xfree86; 3.3.X,需要额外的 &truetype; 字体服务器。 Xfstt 通常被用于这个目的。 要安装 Xfstt, 只要简单的安装 port x11-servers/Xfstt. 现在,为 &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 现在把 &truetype; 字体目录添加到字体路径中。 这和上面 Type1 字体的步骤是一样的, 那就是,使用 &prompt.user; xset fp+ /usr/X11R6/lib/X11/fonts/TrueType &prompt.user; xset fp rehash 或者把 FontPath 这行加到 xorg.conf (或 XF86Config) 文件中。 就是这样。现在 &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 格式的。注意确保所有的标签都完全的关闭掉。 这个文件用一个 DOCTYPE 定义的普通的 XML 头开始, 然后是 <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 会让字体边缘有些模糊,这样增加了非常小的文本的可读性, 然后从大文本字体中删除 staircases 但如果使用普通的文本,可能会引起眼疲劳。 要将字体大小范围控制在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, vrgbvbgr:实验一下 看看那个更好。 Mozilla web browsers Mozilla Mozilla Anti-aliasing 在您下次启动系统时就能用了。 然而,注意您的程序必须知道如何使用它。现在,Qt 工具包做到了, 所以整个 KDE 环境能够使用 anti-aliased 字体 (查看 KDE 上的 了解细节)。 GTK+ 和 GNOME 也可以被编译为使用 anti-aliasing 通过 Font capplet (查看 了解细节)。默认情况下, Mozilla 1.2 以及更高版本都会自动的使用 anti-aliasing。要禁用它,使用 -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 server输出。如果一个 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 安装 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以代替默认的窗口管理器。 如果在适当的位置已经定制好了文件.xinitrc, 简单地将启动当前窗口管理器的那行替换为 /usr/X11R6/bin/gnome-session。 如果对配置文件不想添加任何特殊改动,只需简单地键入: &prompt.user; echo "/usr/X11R6/bin/gnome-session" > ~/.xinitrc 接着,键入startxGNOME桌面环境就启动了。 如果已经使用了一个像 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 细节 会解释如何使用kdmKDE显示管理器来做。 在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 有一个以 KDEKParts 技术为基础的办公套件。 它包括电子表格,幻灯片,日程管理和新闻等软件。 KDE 也包含一个与当前 &unix; 系统上其他Web浏览器相竞争的叫做 Konqueror 的浏览器。 systems. 关于 KDE 的更多信息可以在 KDE 网站上找到。 KDE 上关于 FreeBSD 的特定信息和资源,可以参考 FreeBSD-KDE team的网站。 安装 KDE GNOME 或其他桌面环境一样,安装 KDE 的最容易的方法是通过 第 2 章所描绘的 FreeBSD 安装过程的 Desktop Configuration 菜单来安装。 另外,它也可以很容易地从packages或ports collection安装: 要从网络安装 KDE 只需要: &prompt.root; pkg_add -r kde &man.pkg.add.1; 就回自动的下在最新版本的应用程序。 要从源代码编译 KDE, 可以使用 port 树: &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, 它看起来很吸引人,还包含很多登陆选项。 特别的,用户可以很容易地(通过一个菜单) 选择登陆后使用哪个桌面环境 (KDEGNOME或其他)。 首先,以 root 用户身份运行 KDE 控制面板,kcontrol。 通常情况下,以 root 身份运行 X 环境是很不安全的。 您应当以普通用户来使用窗口管理器, 打开一个终端窗口(例如 xterm 或者 KDEkonsole),用 su 来切换成 root(这个用户必须首先在 /etc/groupwheel 组里),然后再键入 kcontrol 点击左边标记 系统的图标,然后选择登陆管理器 。在右面,有几个配置选项, KDE 手册会解释的更加详细一些。 点击右边的会话。 点击新类型来添加几个窗口管理器或桌面环境。 这些只是标签,所以它们用 KDEGNOME要比用 startkde或者 gnome-session来得好。 也可以是failsafe 也可以用同样方法定制其他菜单,它们主要是起修饰和自我解释用的。 完成之后,键入Apply按钮,退出控制中心。 要确信kdm理解标签 (KDEGNOME等)的意思,需要编辑一些 xdm用的文件。 KDE 2.2中,这有些变化: kdm现在使用它自己的配置文件。 请看看KDE 2.2的文档。 在一个终端窗口,作为root用户,要编辑 /usr/X11R6/lib/X11/xdm/Xsession文件, 中间有一部分是这样的: case $# in 1) case $1 in failsafe) exec xterm -geometry 80x24-0-0 ;; esac esac 需要在这部分加几行。 假定使用的标签是KDEGNOME, 就像下面这样: case $# in 1) case $1 in kde) exec /usr/local/bin/startkde ;; GNOME) exec /usr/X11R6/bin/gnome-session ;; failsafe) exec xterm -geometry 80x24-0-0 ;; esac esac 为了加上KDE 的登陆桌面背景, 需要在 /usr/X11R6/lib/X11/xdm/Xsetup_0中加入下面这行: /usr/local/bin/kdmdesktop 现在,确信kdm/etc/ttys中列出来了,并且将被启动。 要这样做,只要跟着先前有关 XDM用法,用 /usr/X11R6/bin/xdm 程序的用法替换/usr/local/bin/kdm的用法就可以了。 Anti-aliased字体 KDE anti-aliased fonts X11 通过它的 RENDER扩展来支持anti-aliasing,从2.3版本开始, Qt (被KDE使用的工具包)也支持 这个扩展。在有关anti-aliasing X11字体的节描述到了如何配置这些。 所以,对于现在的软件,anti-aliasing也可以用在 KDE桌面上。只需要到KDE 菜单,到 Preferences Look and Feel Fonts,然后点击 Use Anti-Aliasing for Fonts and Icons。 对于一个不是 KDE的一部分的Qt应用程序,环境变量 QT_XFT需要在启动程序前被设置成true 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/share/sgml/authors.ent b/zh_CN.GB2312/share/sgml/authors.ent index ccd23d01ae..68ed0ad20a 100644 --- a/zh_CN.GB2312/share/sgml/authors.ent +++ b/zh_CN.GB2312/share/sgml/authors.ent @@ -1,69 +1,69 @@ clive@FreeBSD.org"> clsung@FreeBSD.org"> davidxu@FreeBSD.org"> delphij@FreeBSD.org"> foxfair@FreeBSD.org"> hsu@FreeBSD.org"> ijliao@FreeBSD.org"> keichii@FreeBSD.org"> kevlo@FreeBSD.org"> leeym@FreeBSD.org"> pat@FreeBSD.org"> vanilla@FreeBSD.org"> -alu@FreeBSD.org.cn"> +alu@FreeBSD.org.cn"> delphij@FreeBSD.org.cn"> gavin@FreeBSD.org.cn"> ld@FreeBSD.org.cn"> wjf@FreeBSD.org.cn"> yarshure@FreeBSD.org.cn">