diff --git a/zh_CN.GB2312/books/handbook/Makefile b/zh_CN.GB2312/books/handbook/Makefile index 21702ea6f8..b5360d43cf 100644 --- a/zh_CN.GB2312/books/handbook/Makefile +++ b/zh_CN.GB2312/books/handbook/Makefile @@ -1,277 +1,290 @@ # # $FreeBSD$ # # Build the FreeBSD Handbook (Simplified Chinese). # -# Original revision: 1.107 +# Original revision: 1.108 # ------------------------------------------------------------------------ # # Handbook-specific variables # # WITH_PGPKEYS The print version of the handbook only prints PGP # fingerprints by default. If you would like for the # entire key to be displayed, then set this variable. # This option has no affect on the HTML formats. # # Handbook-specific targets # # pgpkeyring This target will read the contents of # pgpkeys/chapter.sgml and will extract all of # the pgpkeys to standard out. This output can then # be redirected into a file and distributed as a # public keyring of FreeBSD developers that can # easily be imported into PGP/GPG. # # ------------------------------------------------------------------------ .PATH: ${.CURDIR}/../../share/sgml/glossary MAINTAINER= doc@FreeBSD.org DOC?= book FORMATS?= html-split HAS_INDEX= true USE_PS2PDF= yes INSTALL_COMPRESSED?= gz INSTALL_ONLY_COMPRESSED?= IMAGES_EN = advanced-networking/isdn-bus.eps IMAGES_EN+= advanced-networking/isdn-twisted-pair.eps IMAGES_EN+= advanced-networking/natd.eps IMAGES_EN+= advanced-networking/net-routing.pic IMAGES_EN+= advanced-networking/static-routes.pic IMAGES_EN+= geom/striping.pic IMAGES_EN+= install/adduser1.scr IMAGES_EN+= install/adduser2.scr IMAGES_EN+= install/adduser3.scr IMAGES_EN+= install/boot-loader-menu.scr IMAGES_EN+= install/boot-mgr.scr IMAGES_EN+= install/config-country.scr IMAGES_EN+= install/console-saver1.scr IMAGES_EN+= install/console-saver2.scr IMAGES_EN+= install/console-saver3.scr IMAGES_EN+= install/console-saver4.scr IMAGES_EN+= install/disklabel-auto.scr IMAGES_EN+= install/disklabel-ed1.scr IMAGES_EN+= install/disklabel-ed2.scr IMAGES_EN+= install/disklabel-fs.scr IMAGES_EN+= install/disklabel-root1.scr IMAGES_EN+= install/disklabel-root2.scr IMAGES_EN+= install/disklabel-root3.scr IMAGES_EN+= install/disk-layout.eps IMAGES_EN+= install/dist-set.scr IMAGES_EN+= install/dist-set2.scr IMAGES_EN+= install/docmenu1.scr IMAGES_EN+= install/ed0-conf.scr IMAGES_EN+= install/ed0-conf2.scr IMAGES_EN+= install/edit-inetd-conf.scr IMAGES_EN+= install/fdisk-drive1.scr IMAGES_EN+= install/fdisk-drive2.scr IMAGES_EN+= install/fdisk-edit1.scr IMAGES_EN+= install/fdisk-edit2.scr IMAGES_EN+= install/ftp-anon1.scr IMAGES_EN+= install/ftp-anon2.scr IMAGES_EN+= install/hdwrconf.scr IMAGES_EN+= install/keymap.scr IMAGES_EN+= install/main1.scr IMAGES_EN+= install/mainexit.scr IMAGES_EN+= install/main-std.scr IMAGES_EN+= install/main-options.scr IMAGES_EN+= install/main-doc.scr IMAGES_EN+= install/main-keymap.scr IMAGES_EN+= install/media.scr IMAGES_EN+= install/mouse1.scr IMAGES_EN+= install/mouse2.scr IMAGES_EN+= install/mouse3.scr IMAGES_EN+= install/mouse4.scr IMAGES_EN+= install/mouse5.scr IMAGES_EN+= install/mouse6.scr IMAGES_EN+= install/mta-main.scr IMAGES_EN+= install/net-config-menu1.scr IMAGES_EN+= install/net-config-menu2.scr IMAGES_EN+= install/nfs-server-edit.scr IMAGES_EN+= install/ntp-config.scr IMAGES_EN+= install/options.scr IMAGES_EN+= install/pkg-cat.scr IMAGES_EN+= install/pkg-confirm.scr IMAGES_EN+= install/pkg-install.scr IMAGES_EN+= install/pkg-sel.scr IMAGES_EN+= install/probstart.scr IMAGES_EN+= install/routed.scr IMAGES_EN+= install/security.scr IMAGES_EN+= install/sysinstall-exit.scr IMAGES_EN+= install/timezone1.scr IMAGES_EN+= install/timezone2.scr IMAGES_EN+= install/timezone3.scr IMAGES_EN+= install/userconfig.scr IMAGES_EN+= install/userconfig2.scr IMAGES_EN+= mail/mutt1.scr IMAGES_EN+= mail/mutt2.scr IMAGES_EN+= mail/mutt3.scr IMAGES_EN+= mail/pine1.scr IMAGES_EN+= mail/pine2.scr IMAGES_EN+= mail/pine3.scr IMAGES_EN+= mail/pine4.scr IMAGES_EN+= mail/pine5.scr IMAGES_EN+= install/example-dir1.eps IMAGES_EN+= install/example-dir2.eps IMAGES_EN+= install/example-dir3.eps IMAGES_EN+= install/example-dir4.eps IMAGES_EN+= install/example-dir5.eps IMAGES_EN+= security/ipsec-network.pic IMAGES_EN+= security/ipsec-crypt-pkt.pic IMAGES_EN+= security/ipsec-encap-pkt.pic IMAGES_EN+= security/ipsec-out-pkt.pic IMAGES_EN+= vinum/vinum-concat.pic IMAGES_EN+= vinum/vinum-mirrored-vol.pic IMAGES_EN+= vinum/vinum-raid10-vol.pic IMAGES_EN+= vinum/vinum-raid5-org.pic IMAGES_EN+= vinum/vinum-simple-vol.pic IMAGES_EN+= vinum/vinum-striped-vol.pic IMAGES_EN+= vinum/vinum-striped.pic IMAGES_EN+= virtualization/parallels-freebsd1.png IMAGES_EN+= virtualization/parallels-freebsd2.png IMAGES_EN+= virtualization/parallels-freebsd3.png IMAGES_EN+= virtualization/parallels-freebsd4.png IMAGES_EN+= virtualization/parallels-freebsd5.png IMAGES_EN+= virtualization/parallels-freebsd6.png IMAGES_EN+= virtualization/parallels-freebsd7.png IMAGES_EN+= virtualization/parallels-freebsd8.png IMAGES_EN+= virtualization/parallels-freebsd9.png IMAGES_EN+= virtualization/parallels-freebsd10.png IMAGES_EN+= virtualization/parallels-freebsd11.png IMAGES_EN+= virtualization/parallels-freebsd12.png IMAGES_EN+= virtualization/parallels-freebsd13.png +IMAGES_EN+= virtualization/virtualpc-freebsd1.png +IMAGES_EN+= virtualization/virtualpc-freebsd2.png +IMAGES_EN+= virtualization/virtualpc-freebsd3.png +IMAGES_EN+= virtualization/virtualpc-freebsd4.png +IMAGES_EN+= virtualization/virtualpc-freebsd5.png +IMAGES_EN+= virtualization/virtualpc-freebsd6.png +IMAGES_EN+= virtualization/virtualpc-freebsd7.png +IMAGES_EN+= virtualization/virtualpc-freebsd8.png +IMAGES_EN+= virtualization/virtualpc-freebsd9.png +IMAGES_EN+= virtualization/virtualpc-freebsd10.png +IMAGES_EN+= virtualization/virtualpc-freebsd11.png +IMAGES_EN+= virtualization/virtualpc-freebsd12.png +IMAGES_EN+= virtualization/virtualpc-freebsd13.png # Images from the cross-document image library IMAGES_LIB= callouts/1.png IMAGES_LIB+= callouts/2.png IMAGES_LIB+= callouts/3.png IMAGES_LIB+= callouts/4.png IMAGES_LIB+= callouts/5.png IMAGES_LIB+= callouts/6.png IMAGES_LIB+= callouts/7.png IMAGES_LIB+= callouts/8.png IMAGES_LIB+= callouts/9.png IMAGES_LIB+= callouts/10.png IMAGES_LIB+= callouts/11.png IMAGES_LIB+= callouts/12.png IMAGES_LIB+= callouts/13.png IMAGES_LIB+= callouts/14.png IMAGES_LIB+= callouts/15.png # # SRCS lists the individual SGML files that make up the document. Changes # to any of these files will force a rebuild # # SGML content SRCS+= audit/chapter.sgml SRCS+= book.sgml SRCS+= colophon.sgml SRCS+= freebsd-glossary.sgml SRCS+= advanced-networking/chapter.sgml SRCS+= basics/chapter.sgml SRCS+= bibliography/chapter.sgml SRCS+= boot/chapter.sgml SRCS+= config/chapter.sgml SRCS+= cutting-edge/chapter.sgml SRCS+= desktop/chapter.sgml SRCS+= disks/chapter.sgml SRCS+= eresources/chapter.sgml SRCS+= firewalls/chapter.sgml SRCS+= geom/chapter.sgml SRCS+= install/chapter.sgml SRCS+= introduction/chapter.sgml SRCS+= jails/chapter.sgml SRCS+= kernelconfig/chapter.sgml SRCS+= l10n/chapter.sgml SRCS+= linuxemu/chapter.sgml SRCS+= mac/chapter.sgml SRCS+= mail/chapter.sgml SRCS+= mirrors/chapter.sgml SRCS+= multimedia/chapter.sgml SRCS+= network-servers/chapter.sgml SRCS+= pgpkeys/chapter.sgml SRCS+= ports/chapter.sgml SRCS+= ppp-and-slip/chapter.sgml SRCS+= preface/preface.sgml SRCS+= printing/chapter.sgml SRCS+= security/chapter.sgml SRCS+= serialcomms/chapter.sgml SRCS+= users/chapter.sgml SRCS+= vinum/chapter.sgml SRCS+= virtualization/chapter.sgml SRCS+= x11/chapter.sgml # Entities SRCS+= chapters.ent SYMLINKS= ${DESTDIR} index.html handbook.html # Turn on all the chapters. CHAPTERS?= ${SRCS:M*chapter.sgml} SGMLFLAGS+= ${CHAPTERS:S/\/chapter.sgml//:S/^/-i chap./} SGMLFLAGS+= -i chap.freebsd-glossary pgpkeyring: pgpkeys/chapter.sgml @${JADE} -V nochunks ${OTHERFLAGS} ${JADEOPTS} -d ${DSLPGP} -t sgml ${MASTERDOC} DOC_PREFIX?= ${.CURDIR}/../../.. # # Handbook-specific variables # .if defined(WITH_PGPKEYS) JADEFLAGS+= -V withpgpkeys .endif URL_RELPREFIX?= ../../../.. DOC_PREFIX?= ${.CURDIR}/../../.. # # rules generating lists of mirror site from XML database. # XMLDOCS= mirrors-ftp:::mirrors.sgml.ftp.inc.tmp \ mirrors-cvsup:::mirrors.sgml.cvsup.inc.tmp \ eresources:::eresources.sgml.www.inc.tmp DEPENDSET.DEFAULT= transtable mirror XSLT.DEFAULT= ${XSL_MIRRORS} XML.DEFAULT= ${XML_MIRRORS} NO_TIDY.DEFAULT= yes PARAMS.mirrors-ftp+= --param 'type' "'ftp'" \ --param 'proto' "'ftp'" \ --param 'target' "'handbook/mirrors/chapter.sgml'" PARAMS.mirrors-cvsup+= --param 'type' "'cvsup'" \ --param 'proto' "'cvsup'" \ --param 'target' "'handbook/mirrors/chapter.sgml'" PARAMS.eresources+= --param 'type' "'www'" \ --param 'proto' "'http'" \ --param 'target' "'handbook/eresources/chapter.sgml'" SRCS+= mirrors.sgml.ftp.inc \ mirrors.sgml.cvsup.inc \ eresources.sgml.www.inc CLEANFILES+= mirrors.sgml.ftp.inc mirrors.sgml.ftp.inc.tmp \ mirrors.sgml.cvsup.inc mirrors.sgml.cvsup.inc.tmp \ eresources.sgml.www.inc eresources.sgml.www.inc.tmp .include "${DOC_PREFIX}/share/mk/doc.project.mk" .for p in ftp cvsup mirrors.sgml.${p}.inc: mirrors.sgml.${p}.inc.tmp ${SED} -e 's,<\([^ >]*\)\([^>]*\)/>,<\1\2>,;s,,,'\ < $@.tmp > $@ || (${RM} -f $@ && false) .endfor eresources.sgml.www.inc: eresources.sgml.www.inc.tmp ${SED} -e 's,<\([^ >]*\)\([^>]*\)/>,<\1\2>,;s,,,'\ < $@.tmp > $@ || (${RM} -f $@ && false) diff --git a/zh_CN.GB2312/books/handbook/basics/chapter.sgml b/zh_CN.GB2312/books/handbook/basics/chapter.sgml index 91c8a64368..1176bb2535 100644 --- a/zh_CN.GB2312/books/handbook/basics/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/basics/chapter.sgml @@ -1,2341 +1,2341 @@ Chris Shumway Rewritten by UNIX 基础 概述 下列章节的命令和功能适用于FreeBSD操作系统。 同时这里许多内容和一些 类-&unix; 操作系统相关。 假如您已经熟悉这些内容可跳过不阅读。 假如您是FreeBSD新手, 那您应该认真详细地从头到尾读一遍这些章节。 读取这些内容,您将了解: 怎样在FreeBSD使用 虚拟控制台 在 &unix; 中文件权限如何运作, 以及理解 &os; 中的文件标志。 &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 并登录到 &os; 系统中。 接下来的一节, 将介绍如何登录系统。 进入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?或是设备文件? 在这个例子, - 表示一个普通文件。 接下来三个字是 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 Tom Rhodes Contributed by &os; 文件标志 在前面所介绍的文件权限的基础之上, &os; 还支持使用 文件标志。 这些标志为文件提供了进一步的安全控制机制, 但这些控制并不适用于目录。 这些文件标志提供了针对文件的进一步控制, 帮助确保即使是 root 用户也无法删除或修改文件。 文件标志可以通过使用 &man.chflags.1; 工具来修改, 其用户界面很简单。 例如, 要在文件 file1 上应用系统禁删标志, 应使用下述命令: &prompt.root; chflags sunlink file1 要禁用系统禁删标志, 只需在前述命令中的 标志前加 no。 例如: &prompt.root; chflags nosunlink file1 要显示文件上的标志, 应使用命令 &man.ls.1; 的 参数: &prompt.root; ls -lo file1 输出结果应类似于: -rw-r--r-- 1 trhodes trhodes sunlnk 0 Mar 1 05:54 file1 许多标志只可以由 root 用户来增加, 而另一些, 则可以由文件的所有者来增加。 建议管理员仔细阅读 &man.chflags.1; 和 &man.chflags.2; 联机手册, 以对其加深理解。 目录架构 目录层次 理解 FreeBSD 的目录层次结构对于建立对系统整体的理解十分重要的基础。 其中, 最重要的概念是根目录, /。 这个目录是系统引导时挂借的第一个目录, 它包含了用以准备多用户操作所需的操作系统基础组件。 根目录中也包含了用于在启动时转换到多用户模式之前挂接其他文件系统所需的挂接点。 挂接点 (mount point) 是新增的文件系统在接入现有系统时的起点位置 (通常是根目录)。 在 对此进行了详细的阐述。 标准的挂接点包括 /usr/var/tmp/mnt, 以及 /cdrom。 这些目录通常会在 /etc/fstab 文件中提及。 /etc/fstab 是一张包含系统中各个文件系统及挂接点的表。 在 /etc/fstab 中的绝大多数文件系统都会在启动时由 &man.rc.8; 脚本自动挂接, 除非特别指定了 选项。 更多细节请参考 您可以通过 &man.hier.7; 来了解完整的文件系统层次说明。 现在, 让我们先来看一看绝大多数的常见的目录以供参考。 目录 介绍 / 文件系统的根目录。 /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;。 /rescue/ 用于紧急恢复的一组静态联编的程序; 参见 &man.rescue.8;。 /root/ root用户的Home(主)目录。 /sbin/ 在单个用户和多用户环境下的存放系统程序和管理所需的基本实用目录。 /tmp/ 临时文件。 /tmp 目录中的内容, 一般不会在系统重新启动之后保留。 通常会将基于内存的文件系统挂在 /tmp 上。 这一工作可以用一系列 tmpmfs 相关的 &man.rc.conf.5; 变量来自动完成。 (或者, 也可以在 /etc/fstab 增加对应项; 参见 &man.mdmfs.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 Collection (可选)。 /usr/sbin/ 存放系统后台程序 和 系统工具 (由用户执行)。 /usr/share/ 存放架构独立的文件。 /usr/src/ 存放 BSD 或者本地源码文件。 /usr/X11R6/ 存放 X11R6 可执行文件、 库文件、 配置文件等的目录(可选)。 /var/ 多用途日志、 临时或短期存放的, 以及打印假脱机系统文件。 有时会将基于内存的文件系统挂在 /var 上。 这一工作可以通过在 &man.rc.conf.5; 中设置一系列 varmfs 变量 (或在 /etc/fstab 中加入一行配置; 参见 &man.mdmfs.8;) 来完成。 /var/log/ 存放各种的系统记录文件。 /var/mail/ 存放用户mailbox(一种邮件存放格式)文件。 /var/spool/ 各种打印机和邮件系统spooling(回环)的目录。 /var/tmp/ 临时文件。 这些文件在系统重新启动时通常会保留, 除非 /var 是一个内存中的文件系统。 /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 提供了 &man.growfs.8; 命令。 这使得能够实时地调整文件系统的大小, 因而不再受其限制。 文件系统是和分区一一对应的。 这里的分区和常用的术语分区 (例如, &ms-dos; 分区) 的意思并不一样, 这是由于 &os; 的 &unix; 传统造成的。 每一个分区使用一个从 ah 的字母来表示。 每个分区只能包含一个文件系统, 这意味着文件系统通常可以由它们在文件系统目录结构中的挂接点, 或对应的分区字母来表示。 FreeBSD 的 交换分区 也需要使用磁盘空间。 交换分区是给 FreeBSD 作 虚拟内存 使用的, 这样能令您的计算机有更多的内存可使用, 当FreeBSD在运行而内存不够的时候, 它会把其他一些可转移的数据转移到交换分区, 空出内存的位置以供使用。 某些 partitions 的用途是确定的。 分区 约定 a 通常指定为根文件系统 b 通常指定为交换分区 c 通常它和所在的 slice 大小相同。 c 分区上工作时必定会影响到事整个 slice (举个例子,坏块扫描器)。 您通常不愿意在这个partition建立文件系统。 d 分区 d 曾经有特殊的含义, 不过这种意义在现时的系统上已不再适用, 因此 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开始的。 对应代码请看这里所列出的 当在 FreeBSD 中指定 partition 名字时, 必须同时包含这个分区的 slice 和磁盘的名字; 类似地, 在指定 slice 时, 也应该给出包含该 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 > file system, 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; 在允许的情况下将尝试并行地去检查文件系统。 请参阅 &man.fstab.5; 联机手册, 以获得关于 /etc/fstab 文件格式, 以及其中所包含的选项的进一步信息。 <command>mount</command> 命令 文件系统 挂接 这个 &man.mount.8; 命令是挂接文件系统的基本运用。 使用最多的基本格式: &prompt.root; mount device mountpoint 它的选项非常多,而&man.mount.8; 手册同样提及, 但常用的都在这里: 挂接的各种选项 挂接/etc/fstab里所有列出的文件系统。 除非标记为 noauto 或作了排除在外的 类型标记,或者在这之前已挂上。 除了实际上系统调用以外,可以完成任何事情,这个选项是和 参数一起连在一块使用,可以决定&man.mount.8;所做的事情。 强制去挂接一个未知的文件系统(会有危险), 或当把一个文件系统挂接状态由可读写降为只读时,强制撤消可写通道。 以只读方式挂接文件系统。 这和在指定了 选项配合 (对于 &os; 5.2 之前的版本来说, 则是 ) 参数的效果是一样的。 fstype 根据给出的文件系统类型挂接文件系统, 假如给于选项,仅挂接这个类型的文件系统。 ufs 是默认的文件系统类型。 在文件系统上修改挂接选项。 版本模式。 以可读写方式挂接文件系统。 The 选项采用一个逗号分开以下多个选项: 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, 当您运行到超过限制时,这些编号会回转分配 (仍在使用中的 PID 不会分配给其他进程)。 TT这一列显示了程序运行所在的终端, 目前可以安全地忽略。 STAT 显示程序的状态,也可以安全地被忽略。 TIME是程序在CPU处理时间—运行的时间量, 并不是指您程序启动到现在的所用的时间。 许多程序碰巧遇到某方面在他们之前要花费大量CPU处理时间时,他们就必须等候。 最后, COMMAND 是运行程序时使所用的命令行。 &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 是伯克利互联网域名服务 (而实际执行的程序名称则是 named), Apache web系统的程序就叫 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里读出,而且包含了许多程序的配置。 这个一个常用环境变量列和其含义的列表: environment variables (环境变量) 变量 说明 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 您使用的shells必须/etc/shells 文件里列出。 假如您从 ports里装一个shell, 那就不用做这步了。 假如您手工装一个shell,那就要手工添加进去。 举个例了子,假如您手工把 bash装到 /usr/local/bin里,您还要进行这一步: &prompt.root; echo "/usr/local/bin/bash" >> /etc/shells 然后运行chsh 文本编辑器 文本编辑器 编辑器 FreeBSD 的很多配置都可以通过编辑文本文件来完成。 因此, 最好能熟悉某种文本编辑器。 FreeBSD 基本系统中提供了一些, 您也可以从 Ports Collection 安装其它编辑器。 ee editors 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目录里。 建立设备节点 当在系统中添加新设备或将附加设备的支持编译进内核之后, 都必须为其建立设备节点。 <literal>DEVFS</literal> (DEVice 文件系统) 这个设备文件系统, 或叫 DEVFS, 为内核的设备命名在整体文件系统命名里提供通道, 并不是建立或更改设备节点, DEVFS只是为您的特别文件系统进行维护。 请参见 &man.devfs.5; 联机手册以了解更多细节。 二进制文件格式 要理解为什么 &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 的搜寻功能, + 但您连名字都不知道呢?这个时候您就可以利用 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 9e3601438f..60e1e78b80 100644 --- a/zh_CN.GB2312/books/handbook/bibliography/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/bibliography/chapter.sgml @@ -1,645 +1,672 @@ 参考文献 尽管手册页能够提供对于 FreeBSD 操作系统最为权威的参考资料,它们有时却不能告诉我们如何让整个系统很好地运转起来。 因此,一本关于 &unix; 系统管理的好书,以及一份好的用户手册是不可或缺的。 关于 FreeBSD 的专业书籍与杂志 非英文的书籍和杂志: FreeBSD 入门与应用 (繁体中文)。 - - + url="http://jdli.tw.FreeBSD.org/publication/book/freebsd2/index.htm">FreeBSD 入门与应用 (繁体中文), + 出版商: Drmaster, + 1997. ISBN 9-578-39435-7. - FreeBSD 技术内幕(中译本), + FreeBSD 技术内幕(简体中文译本), 机械工业出版社。ISBN 7-111-10201-0。 - FreeBSD 使用大全 第一版, + FreeBSD 使用大全 第一版 (简体中文), 机械工业出版社。ISBN 7-111-07482-3。 - FreeBSD 使用大全 第二版, + FreeBSD 使用大全 第二版 (简体中文), 机械工业出版社。ISBN 7-111-10286-X。 - FreeBSD Handbook (第二版中译本), + FreeBSD Handbook (第二版简体中文译本), 人民邮电出版社。ISBN 7-115-10541-3。 - - FreeBSD 3.x Internet 高级服务器的架设与管理 + FreeBSD 3.x Internet 高级服务器的架设与管理 (简体中文), 清华大学出版社。ISBN 7-900625-66-6。 - FreeBSD & Windows 集成组网实务,中国铁道出版社。ISBN 7-113-03845-X。 + FreeBSD & Windows 集成组网实务 (简体中文), + 中国铁道出版社。 + ISBN 7-113-03845-X。 - FreeBSD 网站架设实务,中国铁道出版社。ISBN 7-113-03423-3。 + 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. + + 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. + url="http://www.ascii.co.jp/pb/book1/shinkan/detail/1322785.html"> + Personal UNIX Starter Kit FreeBSD (日文), + 出版商:ASCII. ISBN 4-7561-1733-3 P3000E. - FreeBSD Handbook (日文译本, 出版商:ASCII. ISBN 4-7561-1580-2 + 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 mit Methode (德文), 出版商:Computer und Literatur Verlag/Vertrieb Hanser, 1998. ISBN 3-932311-31-0. FreeBSD 4 - Installieren, Konfigurieren, Administrieren - (德文, 出版商:Computer und Literatur Verlag, 2001. + url="http://www.cul.de/freebsd.html">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. + url="http://www.cul.de/freebsd.html">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.. + url="http://www.pc.mycom.co.jp/FreeBSD/install-manual.html">FreeBSD + Install and Utilization Manual (日文), 出版商: + Mainichi Communications + Inc.,1998. ISBN 4-8399-0112-0. Onno W Purbo, Dodi Maryanto, Syahrial Hubbany, Widjil Widodo - - Building Internet Server with - FreeBSD (印尼文), 出版商: Elex Media Komputindo. + Building Internet + Server with FreeBSD (印尼文), + 出版商: Elex Media + Komputindo. + + + + Absolute BSD: The Ultimate Guide to FreeBSD (繁体中文) + 出版商: GrandTech Press, 2003. + ISBN 986-7944-92-5. + + + + The FreeBSD 6.0 Book + (繁体中文), 出版商:Drmaster, 2006. + ISBN 9-575-27878-X. 英文版的书籍和杂志: Absolute BSD: The Ultimate Guide to FreeBSD, 出版商: No Starch Press, 2002. ISBN: 1886411743 - The Complete FreeBSD, 出版商: - O'Reilly, 2003. - ISBN: 0596005164 + url="http://www.freebsdmall.com/cgi-bin/fm/bsdcomp"> + 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 6 Unleashed,出版商: Sams, 2006. ISBN: 0672328755 FreeBSD: The Complete Reference, 出版商: McGrawHill, 2003. ISBN: 0072224096 用户指南 Computer Systems Research Group, UC Berkeley. 4.4BSD - User's Reference Manual. O'Reilly & Associates, + 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 & + 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 & + 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. + 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. + 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, + 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, + 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 + 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 + 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. + 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 & + 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 & + 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. 4th ed. Prentice Hall, 1995. + Reference Manual. 4th ed. Prentice Hall, 1995. ISBN 0-13-326224-3 Kernighan, Brian and Dennis M. Ritchie. The C - Programming Language. 2nd Ed. PTR Prentice Hall, 1988. + Programming Language. 2nd Ed. PTR Prentice Hall, 1988. ISBN 0-13-110362-8 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 Spinellis, Diomidis. Code Quality: The Open Source Perspective. Addison-Wesley, 2006. ISBN 0-321-16607-8 Stevens, W. Richard and Stephen A. Rago. Advanced Programming in the UNIX - Environment. 2nd Ed. - Reading, Mass. : Addison-Wesley, 2005. + Environment. 2nd Ed. + Reading, Mass. : Addison-Wesley, 2005. ISBN 0-201-43307-9 Stevens, W. Richard. UNIX Network - Programming. 2nd Ed, PTR Prentice Hall, 1998. ISBN + 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 + 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. : + 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 + 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. : + 4.4BSD Operating System. Reading, Mass. : Addison-Wesley, 1996. ISBN 0-201-54979-4 (这本书的第二章的 在线版本 是 FreeBSD Documentation Project 的一部分, 另外, 第九章可以在 这里 找到。) - 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 + 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, + The Protocols. Reading, Mass. : Addison-Wesley, 1996. ISBN 0-201-63346-9 Schimmel, Curt. Unix Systems for Modern - Architectures. Reading, Mass. : Addison-Wesley, 1994. + 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. + 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 + Frontiers. Prentice Hall, 1996. ISBN 0-13-101908-2 Wright, Gary R. and W. Richard Stevens. TCP/IP - Illustrated, Volume 2: The Implementation. Reading, + 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. + 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 + Privacy O'Reilly & Associates, Inc., 1995. ISBN 1-56592-098-8 硬件参考 Anderson, Don and Tom Shanley. Pentium Processor - System Architecture. 2nd Ed. Reading, Mass. : + 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. : + VGA, and Super VGA Cards. 3rd ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-62490-7 Intel 公司在他们的 开发人员网站上, + url="http://developer.intel.com/">开发人员网站上, 提供了关于他们的 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 + 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. + 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 + Source Code. ITP Media Group, 1996. ISBN 1573980137 Raymond, Eric S. The New Hacker's Dictionary, 3rd - edition. MIT Press, 1996. ISBN + edition. MIT Press, 1996. ISBN 0-262-68092-0. 它也被称作 Jargon - File + url="http://www.catb.org/~esr/jargon/html/index.html">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., + UNIX-HATERS Handbook. IDG Books Worldwide, Inc., 1994. ISBN 1-56884-203-1. Out of print, but available - online. + url="http://research.microsoft.com/~daniel/unix-haters.html"> + online. 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. + 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). The last disk also 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 + 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 d8df6db959..365992ea55 100644 --- a/zh_CN.GB2312/books/handbook/config/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/config/chapter.sgml @@ -1,2882 +1,2882 @@ Chern Lee 原作: Mike Smith 这份文档基于一份教程, 其作者是 Matt Dillon 此外, 也参考了 tuning(7), 其作者是 设置和调整 概述 系统配置 系统优化 使用 &os; 的一个重要问题是系统配置。 正确地配置系统能充分地减少以后维护和升级系统所需的工作量。 这章将解释一些 &os; 的配置过程,包括一些可以调整的 &os; 系统的一些参数。 读完本章, 您将了解: 如何有效地利用文件系统和交换分区。 rc.conf 的基本设置以及 /usr/local/etc/rc.d 启动体系。 如何设置和测试网卡。 如何在您的网络设备上配置虚拟主机。 如何使用 /etc 下的各配置文件。 如何通过 sysctl 变量来对 &os; 系统进行调优。 怎样调整磁盘性能和修改内核限制。 在阅读本章之前,您应该了解: 了解 &unix; 和 &os; 的基础知识 ()。 熟悉内核配置编译的基础知识 ()。 初步配置 分区规划 分区规划 /etc /var /usr 基本分区 当使用 &man.bsdlabel.8; 或者 &man.sysinstall.8; 来分割您的文件系统的时候, 要记住硬盘驱动器外磁道传输数据要比从内磁道传输数据快。 因此应该将小的和经常访问的文件系统放在驱动器靠外的位置, 一些大的分区比如 /usr 应该放在比较靠里的位置。 以类似这样的顺序建立分区是一个不错的主意:root,swap, /var/usr /var 的大小能反映您的机器使用情况。 它用来存储邮件,日志文件和打印队列缓存, 特别是邮箱和日志文件可能会达到无法预料的大小, 这主要取决于在您的系统上有多少用户和您的日志文件可以保存多长时间。 一般大多数用户不需要一个 G 以上的空间,但要记住 /var/tmp 应该足够大来以便存储一些 packages。 /usr 分区存储很多用来系统运行所需要的文件例如 &man.ports.7; (建议这样做) 和源代码 (可选的)。安装的时候这两项都是可选的。 这个分区至少要保留两个 G 的可用空间。 当选择分区大小的时候,记住保留一些空间。 用完了一个分区的空间而在另一个分区上还有很多, 可能会导致出现一些错误。 一些用户会发现 &man.sysinstall.8; 的 Auto-defaults 自动分区有时会分配给 /var/ 较小的分区空间。 分区应该精确一些并且大一些。 交换分区 交换分区分配 交换分区 一般来讲,交换分区应该大约是系统内存 (RAM) 的两倍。 例如,如果机器有 128M 内存,交换文件应该是 256M。 较小内存的系统可以通过多一点地交换分区来提升性能。 不建议小于 256 兆的交换分区,并且扩充您的内存应该被考虑一下。 当交换分区最少是主内存的两倍的时候,内核的 VM (虚拟内存) 页面调度算法可以将性能调整到最好。如果您给机器添加更多内存, 配置太小的交换分区会导致 VM 页面扫描的代码效率低下。 在使用多块SCSI磁盘(或者不同控制器上的IDE磁盘)的大系统上, 建议在每个驱动器上建立交换分区(直到四个驱动器)。 交换分区应该大约一样大小。内核可以使用任意大小, 但内部数据结构则是最大交换分区的 4 倍。保持交换分区同样的大小, 可以允许内核最佳地调度交换空间来访问磁盘。 即使不太使用,分配大的交换分区也是好的, 在被迫重启之前它可以让您更容易的从一个失败的程序中恢复过来。 为什么要分区? 一些用户认为一个单独的大分区将会很好, 但是有很多原因会证明为什么这是个坏主意。首先, 每个分区有不同的分区特性,因此分开可以让文件系统调整它们。 例如,根系统和 /usr 一般只是读取,写入很少。 很多读写频繁的被放在 /var/var/tmp中。 适当的划分一个系统, 在其中使用较小的分区, 这样, 那些以写为主的分区将不会比以读为主的分区付出更高的代价。 将以写为主的分区放在靠近磁盘的边缘, 例如放在实际的大硬盘的前面代替放在分区表的后面,将会提高您需要的分区的 I/O 性能。现在可能也需要在比较大的分区上有很好的 I/O 性能, 把他们移动到磁盘外围不会带来多大的性能提升,反而把 /var 移到外面会有很好的效果。最后涉及到安全问题。 一个主要是只读的小的、整洁的根分区可以提高从一个严重的系统崩溃中恢复过来的机会。 核心配置 rc 文件 rc.conf 系统的配置信息主要位于 /etc/rc.conf。 这个文件包含了配置信息很大的一部分,主要在系统启动的时候来配置系统, 这个名字直接说明了这点;它也是 rc* 文件的配置信息。 系统管理员应该在 rc.conf 文件中建立记录来覆盖 /etc/defaults/rc.conf 中的默认设置。 这个默认文件不应该被逐字的复制到 /etc —— 它包含的是默认值而不是一个例子。 所有特定的改变应该在 rc.conf 中。 在集群应用中,为了降低管理成本, 可以应用多种策略把涉及全站范围的设置从特定于系统的设置中分离出来。 建议的方法是将全站范围的设置放在另一个文件中,例如 /etc/rc.conf.site, 并且把它包含进然后把这个文件包括进只包含系统指定信息的 /etc/rc.conf 由于 rc.conf 可以被 &man.sh.1; 阅读,所以达到这个目的很简单,例如: rc.conf: . /etc/rc.conf.site hostname="node15.example.com" network_interfaces="fxp0 lo0" ifconfig_fxp0="inet 10.1.1.1" rc.conf.site: defaultrouter="10.1.1.254" saver="daemon" blanktime="100" rc.conf.site 文件可以使用 rsync 或类似程序分发给各个系统, 同时各系统的 rc.conf 文件仍保持独立。 使用 &man.sysinstall.8; 或者 make world 来升级系统不会覆盖 rc.conf 文件, 所以系统配置信息不会丢失。 应用程序配置 典型的,被安装的应用程序有他自己的配置文件、语法等等。 从基本系统中分开他们是很重要的以至于他们可以容易的被 package 管理工具定位和管理 /usr/local/etc 一般来说,这些文件被安装在 /usr/local/etc。这个例子中, 一个应用程序有很多配置文件并且创建了一个子目录来存放他们。 通常,当一个 port 或者 package 被安装的时候, 配置文件示例也同样被安装了。它们通常用 .default 的后缀来标识。如果不存在这个应用程序的配置文件, 它们会通过复制 .default 文件来创建。 例如,看一下这个目下的内容 /usr/local/etc/apache -rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf -rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf.default -rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf -rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf.default -rw-r--r-- 1 root wheel 12205 May 20 1998 magic -rw-r--r-- 1 root wheel 12205 May 20 1998 magic.default -rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types -rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types.default -rw-r--r-- 1 root wheel 7980 May 20 1998 srm.conf -rw-r--r-- 1 root wheel 7933 May 20 1998 srm.conf.default 文件大小显示了只有 srm.conf 改变了。以后 Apache 的升级就不会改变这个文件。 Tom Rhodes Contributed by 启动服务 服务 许多用户会选择使用 Ports Collection 来在 &os; 上安装第三方软件。 很多情况下这可能需要进行一些配置以便让这些软件能够在系统初始化的过程中启动。 服务, 例如 mail/postfixwww/apache13 就是这些需要在系统初始化时启动的软件包中的两个典型代表。 这一节解释了启动第三方软件所需要的步骤。 &os; 包含的大多数服务,例如 &man.cron.8;, 就是通过系统启动脚本启动的。 这些脚本也许会有些不同, 这取决于 &os; 版本。 但是不管怎样, 需要考虑的一个重要方面是他们的启动配置文件要能被基本启动脚本识别捕获。 rc.d 出现之前, 应用程序会把一个简单的启动脚本放到 /usr/local/etc/rc.d 目录中, 这个目录中的脚本会被系统初始化脚本读取。 尽管很多人已经花费了相当多的时间来把旧的配置方式融入到新系统中, 仍然有许多第三方软件需要把脚本放到上面提到的目录中。 是否使用 rc.d 会对这些脚本的执行带来一些变化。 在 &os; 5.1 之前采用的是旧式的配置, 当然, 绝大多数情况下, 新式的脚本也会工作的很好。 每个脚本都应该遵守 &os; 版本所需求的一些规定: 每个脚本必须在文件名最后添加一个 .sh 的扩展名,并且这个脚本能被系统执行。 后者可以通过 chmod 命令把权限设置为 755来实现。 它还应该能接受 start 选项来启动程序并且接受 stop 选项来结束程序。 一个简单的脚本看起来可能会像这样: #!/bin/sh echo -n ' utility' case "$1" in start) /usr/local/bin/utility ;; stop) kill -9 `cat /var/run/utility.pid` ;; *) echo "Usage: `basename $0` {start|stop}" >&2 exit 64 ;; esac exit 0 这个脚本提供了 stopstart 两个选项, 用以操作 utility 可以用如下方法来启动: &prompt.root; /usr/local/etc/rc.d/utility.sh start 现在不是所有第三方软件都需要在 rc.conf 中进行如此的配置, 不过几乎每天都有新的 port 被修改来采用这种配置方法。 您应在安装的最后阶段查看所显示的信息, 以了解某个具体的应用是否需要这样的配置。 某些第三方软件会提供启动脚本, 以便与 rc.d 配合使用; 这些内容将在下一节介绍。 扩展应用程序配置 现在 &os; 提供了 rc.d, 这使得对应用软件的启动进行配置变得更加方便, 并提供了更多的其他功能。 例如, 使用在 rc.d 一节中所介绍的关键字, 应用程序就可以设置在某些其他服务, 例如 DNS 之后启动; 除此之外, 还可以通过 rc.conf 来指定一些额外的启动参数, 而不再需要将它们硬编码到启动脚本中。 基本的启动脚本如下所示: #!/bin/sh # # PROVIDE: utility # REQUIRE: DAEMON # KEYWORD: shutdown # # DO NOT CHANGE THESE DEFAULT VALUES HERE # SET THEM IN THE /etc/rc.conf FILE # utility_enable=${utility_enable-"NO"} utility_flags=${utility_flags-""} utility_pidfile=${utility_pidfile-"/var/run/utility.pid"} . /etc/rc.subr name="utility" rcvar=`set_rcvar` command="/usr/local/sbin/utility" load_rc_config $name pidfile="${utility_pidfile}" start_cmd="echo \"Starting ${name}.\"; /usr/bin/nice -5 ${command} ${utility_flags} ${command_args}" run_rc_command "$1" 这个脚本将保证 utility 能够在 daemon 服务之后启动。 它同时也提供了设置和跟踪 PID, 也就是进程 ID 文件的方法。 可以在 /etc/rc.conf 中加入: utility_enable="YES" 这个新方法也使得命令行参数、包含 /etc/rc.subr 中所提供的功能, 兼容 &man.rcorder.8; 工具并提供更简单的通过 rc.conf 文件来配置的方法。 用服务来启动服务 其他服务, 例如 POP3 服务器, IMAP, 等等, 也可以通过 &man.inetd.8; 来启动。 这一过程包括从 Ports Collection 安装相应的应用程序, 并把配置加入到 /etc/inetd.conf 文件, 或去掉当前配置中的某些注释。 如何使用和配置 inetdinetd 一节中进行了更为深入的阐述。 一些情况下, 通过 &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 中, 第六个字段是要执行的命令, 所有的命令都会以这个用户自己的身份执行; 这是一项重要的安全功能。 同其他用户一样, 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 在前面的例子中, crontab-file 是一个事先写好的 crontab 还有一个选项用来列出安装的 crontab 文件: 只要传递 选项给 crontab 然后看一下输出。 用户想不用模板(已经存在的文件)而直接安装他的 crontab 文件,用 crontab -e 选项也是可以的。 它将会启动一个编辑器并且创建一个新文件,当这个文件被保存的时候, 它会自动的用 crontab 来安装这个文件。 如果您稍后想要彻底删除自己的用户 crontab 可以使用 crontab 选项。 Tom Rhodes Contributed by 在 &os; 中使用 rc 在 2002 年, &os; 整合了来自 NetBSD 的 rc.d 系统, 并通过它来完成系统的初始化工作。 用户要注意在 /etc/rc.d 目录下的文件。 这里面的许多文件是用来管理基础服务的, 它们可以通过 , 以及 选项来控制。 举例来说, &man.sshd.8; 可以通过下面的命令来重启: &prompt.root; /etc/rc.d/sshd restart 对其它服务的操作与此类似。 当然, 这些服务通常是在启动时根据 &man.rc.conf.5; 自动启动的。 例如, 要配置使系统启动时启动网络地址转换服务, 可以简单地通过在 /etc/rc.conf 中加入如下设置来完成: natd_enable="YES" 如果 行已经存在, 只要简单的把 改成 即可。 rc 脚本在下次重新启动的时候会自动的装载所需要的服务, 像下面所描述的那样。 由于 rc.d 系统在系统启动/关闭时首先启动/停止服务,如果设置了适当的 /etc/rc.conf 变量,标准的 选项将会执行他们的动作。例如 sshd restart 命令只在 /etc/rc.conf 中的 sshd_enable 设置成 的时候工作。不管是否在 /etc/rc.conf 中设置了,要 或者 一个服务,命令前可以加上一个one前缀。例如要不顾当前 /etc/rc.conf 的设置重新启动 sshd,执行下面的命令: &prompt.root; /etc/rc.d/sshd onerestart 用选项 可以简单来的检查 /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 信号。 并非所有服务都支持这一功能。 rc.d 系统不仅用于网络服务, 它也为系统初始化中的多数过程提供支持。 比如 bgfsck 文件, 当它被执行时, 将会给出下述信息: Starting background file system checks in 60 seconds. 这个文件用做后台文件系统检查,系统初始化的时候完成。 很多系统服务依赖其他服务提供的相应功能。例如,NIS 和其他基于 RPC 的服务启动可能在 rpcbind 服务启动之前失败。 要解决这个问题,依赖关系信息和其他头信息当作注释被包含在每个启动脚本文件的前面。 程序在系统初始化时分析这些注释以决定调用其他系统服务来满足依赖关系。 下面的字句可能会包含在每个启动脚本文件的前面: PROVIDE: 指定此文件所提供的服务的名字。 REQUIRE: 列出此服务启动之前所需要的其他服务。 此脚本提供的服务会在指定的那些服务 之后 启动。 BEFORE: 列出依赖此服务的其他服务。 此脚本提供的服务将在指定的那些服务 之前 启动。 通过这种方法,系统管理员可以容易的控制系统而不用像其他一些 &unix; 操作系统一样要用 runlevels 来控制。 更多关于 rc.d 系统的信息, 可以在 &man.rc.8; 和 &man.rc.subr.8; 联机手册中找到。 如果您有意撰写自己的 rc.d 脚本, 或对现有的脚本进行一些改进, 也可以参考 这篇文章 Marc Fonvieille Contributed by 设置网卡 网卡 配置 现在我们不可想象一台计算机没有网络连接的情况。 添加和配置一块网卡是任何 &os; 系统管理员的一项基本任务。 查找正确的驱动程序 网卡 驱动程序 在开始之前,您应该知道您的网卡类型,它用的芯片和它是 PCI 还是 ISA 网卡。&os; 支持很多种 PCI 和 ISA 网卡。 可以查看您的版本硬件兼容性列表以确定您的网卡被支持。 确认系统能够支持您的网卡之后, 您还需要为它选择合适的驱动程序。 /usr/src/sys/conf/NOTES/usr/src/sys/arch/conf/NOTES 将为您提供所支持的一些网卡和芯片组的信息。 如果您怀疑驱动程序是否使所要找的那一个, 请参考驱动程序的联机手册。 联机手册将提供关于所支持的硬件更详细的信息, 甚至还包括可能发生的问题。 如果您的网卡很常见的话, 大多数时候您不需要为驱动浪费精力。 常用的网卡在 GENERIC 内核中已经支持了, 所以您的网卡在启动时就会显示出来,像是: dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38 000ff irq 15 at device 11.0 on pci0 dc0: Ethernet address: 00:a0:cc:da:da:da miibus0: <MII bus> on dc0 ukphy0: <Generic IEEE 802.3u media interface> on miibus0 ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30 000ff irq 11 at device 12.0 on pci0 dc1: Ethernet address: 00:a0:cc:da:da:db miibus1: <MII bus> on dc1 ukphy1: <Generic IEEE 802.3u media interface> on miibus1 ukphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto 在这个例子中,我们看到有两块使用 &man.dc.4; 驱动的网卡在系统中。 如果您的网卡没有出现在 GENERIC 中, 则需要手工加载合适的驱动程序。 要完成这项工作可以使用下面两种方法之一: 最简单的办法是用 &man.kldload.8; 加载网卡对应的内核模块。 除此之外, 通过在 /boot/loader.conf 文件中加入适当的设置, 也可以让系统在引导时自动加载这些模块。 不过, 并不是所有的网卡都能够通过这种方法提供支持; ISA 网卡是比较典型的例子。 另外, 您也可以将网卡的支持静态联编进内核。 察看 /usr/src/sys/conf/NOTES/usr/src/sys/arch/conf/NOTES 以及驱动程序的联机手册以了解需要在您的内核配置文件中加一些什么。 要了解关于重新编译内核的进一步细节, 请参见 。 如果您的卡在引导时可以被内核 (GENERIC) 识别, 您应该不需要编译新的内核。 使用 &windows; NDIS 驱动程序 NDIS NDISulator &windows; 驱动程序 Microsoft Windows Microsoft Windows device drivers (设备驱动) KLD (kernel loadable object) 不幸的是, 许多厂商由于认为驱动程序会涉及许多敏感的商业机密, 至今仍不愿意将把驱动程序作为开放源代码形式发布列入他们的时间表。 因此, &os; 和其他操作系统的开发者就只剩下了两种选择: 要么经历长时间的痛苦过程来对驱动进行逆向工程, 要么使用现存的为 µsoft.windows; 平台提供的预编译版本的驱动程序。 包括参与 &os; 开发的绝大多数开发人员, 都选择了后一种方法。 得益于 Bill Paul (wpaul) 的工作, 从 &os; 5.3-RELEASE 开始, 已经可以 直接地 支持 网络驱动接口标准 (NDIS, Network Driver Interface Specification) 了。 &os; NDISulator (也被称为 Project Evil) 可以支持二进制形式的 &windows; 驱动程序, 并让它相信正在运行的是 &windows;。 由于 &man.ndis.4; 驱动使用的是用于 &windows; 的二进制形式的驱动, 因此它只能在 &i386; 和 amd64 系统上使用。 &man.ndis.4; 驱动在设计时主要提供了 PCI、 CardBus 和 PCMCIA 设备的支持, 而 USB 设备目前则没有提供支持。 要使用 NDISulator, 您需要三件东西: 内核的源代码 二进制形式的 &windowsxp; 驱动程序 (扩展名为 .SYS) &windowsxp; 驱动程序配置文件 (扩展名为 .INF) 您需要找到用于您的卡的这些文件。 一般而言, 这些文件可以在随卡附送的 CD 或制造商的网站上找到。 在下面的例子中, 我们用 W32DRIVER.SYSW32DRIVER.INF 来表示这些文件。 不能在 &os;/amd64 上使用 &windows;/i386 驱动程序。 必须使用 &windows;/amd64 驱动才能在其上正常工作。 接下来的步骤是将二进制形式的驱动程序组装成内核模块。 要完成这一任务, 需要以 root 用户的身份执行 &man.ndisgen.8;: &prompt.root; ndisgen /path/to/W32DRIVER.INF /path/to/W32DRIVER.SYS &man.ndisgen.8; 是一个交互式的程序, 它会提示您输入所需的一些其他的额外信息; 这些工作完成之后, 它会在当前目录生成一个内核模块文件, 这个文件可以通过下述命令来加载: &prompt.root; kldload ./W32DRIVER.ko 除了刚刚生成的内核模块之外, 还必须加载 ndis.koif_ndis.ko 这两个内核模块, 在您加载需要 &man.ndis.4; 的模块时, 通常系统会自动完成这一操作。 如果希望手工加载它们, 则可以使用下列命令: &prompt.root; kldload ndis &prompt.root; kldload if_ndis 第一个命令会加载 NDIS 袖珍端口驱动封装模块, 而第二条命令则加载实际的网络接口。 现在请查看 &man.dmesg.8; 来了解是否发生了错误。 如果一切正常, 您会看到类似下面的输出: ndis0: <Wireless-G PCI Adapter> mem 0xf4100000-0xf4101fff irq 3 at device 8.0 on pci1 ndis0: NDIS API version: 5.0 ndis0: Ethernet address: 0a:b1:2c:d3:4e:f5 ndis0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps ndis0: 11g rates: 6Mbps 9Mbps 12Mbps 18Mbps 36Mbps 48Mbps 54Mbps 这之后, 就可以像使用其它网络接口 (例如 dc0) 一样来使用 ndis0 设备了。 与任何其它模块一样, 您也可以配置系统, 令其在启动时自动加载 NDIS 模块。 首先, 将生成的模块 W32DRIVER.ko 复制到 /boot/modules 目录中。 接下来, 在 /boot/loader.conf 中加入: W32DRIVER_load="YES" 配置网卡 网卡 配置 现在正确的网卡驱动程序已经装载,那么就应该配置它了。 跟其他配置一样,网卡可以在安装时用 sysinstall 来配置。 要显示您系统上的网络接口的配置,输入下列命令: &prompt.user; ifconfig dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255 ether 00:a0:cc:da:da:da media: Ethernet autoselect (100baseTX <full-duplex>) status: active dc1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255 ether 00:a0:cc:da:da:db media: Ethernet 10baseT/UTP status: no carrier lp0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500 lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet 127.0.0.1 netmask 0xff000000 tun0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500 老版本的 &os; 可能需要在 &man.ifconfig.8; 后面接 选项,需要了解更多的 &man.ifconfig.8; 语法请查阅使用手册。注意所有关于 IPv6 (inet6 等等) 的记录在这个例子里都被忽略了。 在这个例子中,显示出了下列设备: dc0: 第一个以太网接口 dc1: 第二个以太网接口 lp0: 并行端口网络接口 lo0: 回环设备 tun0: 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 连接到两个网络, 分别是 10.1.1.0, 其子网掩码为 255.255.255.0, 以及 202.0.75.16, 其子网掩码为 255.255.255.240。 我们希望从 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 作为子网掩码。 下面是根据上述描述所进行的 /etc/rc.conf 配置: ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0" ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255" ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255" ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255" ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255" ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240" ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255" ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255" ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255" 配置文件 <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.confrc.conf 这两个文件的风格很接近。 其中的配置均为 变量=值 这样的形式。 在这个文件中配置的值, 均会在系统进入多用户模式之后进行实际的修改操作。 需要注意的是, 并不是所有的变量都能够在多用户模式下修改。 如果希望关闭对收到致命的信号退出的进程进行记录, 并阻止普通用户看到其他用户的进程, 可以在 sysctl.conf 中进行下列配置: # 不记录由于致命信号导致的进程退出 (例如信号 11,访问越界) kern.logsigexit=0 # 阻止用户看到以其他用户 UID 身份执行的进程。 security.bsd.see_other_uids=0 用 sysctl 进行调整 sysctl 调整 以 sysctl &man.sysctl.8; 是一个允许您改变正在运行中的 &os; 系统的接口。它包含一些 TCP/IP 堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用 &man.sysctl.8; 可以读取设置超过五百个系统变量。 基于这点,&man.sysctl.8; 提供两个功能:读取和修改系统设置。 查看所有可读变量: &prompt.user; sysctl -a 读一个指定的变量,例如 kern.maxproc &prompt.user; sysctl kern.maxproc kern.maxproc: 1044 要设置一个指定的变量,直接用 variable=value 这样的语法: &prompt.root; sysctl kern.maxfiles=5000 kern.maxfiles: 2088 -> 5000 sysctl 变量的设置通常是字符串、数字或者布尔型。 (布尔型用 1 来表示'yes',用 0 来表示'no')。 如果你想在每次机器启动时自动设置某些变量, 可将它们加入到文件 /etc/sysctl.conf 之中。更多信息,请参阅手册页 &man.sysctl.conf.5; 及 Tom Rhodes Contributed by 只读的 &man.sysctl.8; 有时可能会需要修改某些只读的 &man.sysctl.8; 的值。 尽管有时不得不这样做, 但只有通过(重新)启动才能达到这样的目的。 例如一些膝上型电脑的 &man.cardbus.4; 设备不会探测内存范围,并且产生看似于这样的错误: cbb0: Could not map register memory device_probe_and_attach: cbb0 attach returned 12 像上面的错误通常需要修改一些只读的 &man.sysctl.8; 默认设置。要实现这点,用户可以在本地的 /boot/loader.conf.local 里面放一个 &man.sysctl.8; OIDs。那些设置定位在 /boot/defaults/loader.conf 文件中。 修复上面的问题用户需要在刚才所说的文件中设置 。现在 &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 有关的值, 一般不推荐修改它们。 虚拟内存系统已经能够很好地进行自动调整了。 <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; 的默认配置改成了更为安全的禁用 IDE 写入缓存。 然而不幸的是, 这样做导致了性能的大幅降低, 因此在后来的发行版中这个配置又改为默认启用了。 您可以通过观察 hw.ata.wc sysctl 变量, 来确认您的系统中所采用的默认值。 如果 IDE 写缓存被禁用, 您可以通过将内核变量设置为 1 来启用它。 这一操作必须在启动时通过 boot loader 来完成。 在内核启动之后尝试这么做是没有任何作用的。 要了解更多的信息,请查阅 &man.ata.4;。 <literal>SCSI_DELAY</literal> (<varname>kern.cam.scsi_delay</varname>) kern.cam.scsi_delay kernel options SCSI_DELAY SCSI_DELAY 内核配置会缩短系统启动时间。 默认值在系统启动过程中有 15 秒的迟延时间, 这是一个足够多且可靠的值。把它减少到 5 通常也能工作(特别是现代的驱动器)。新一些的 &os; (5.0 或更高版本) 应该用启动时刻可调整 kern.cam.scsi_delay。 这个可调整的和内核配置选项接受的值是 毫秒 不是 Soft Updates Soft Updates tunefs &man.tunefs.8; 程序能够用来很好的调整文件系统。 这个程序有很多不同的选项,但是现在只介绍 Soft Updates 的打开和关闭,这样做: &prompt.root; tunefs -n enable /filesystem &prompt.root; tunefs -n disable /filesystem 在文件系统被挂载之后不能用 &man.tunefs.8; 来修改。打开 Soft Updates 的最佳时机是在单用户模式下任何分区被被挂载前。 Soft Updates 极大地改善了元数据修改的性能, 主要是文件创建和删除,通过内存缓存。我们建议您在所有的文件系统上使用 Soft Updates。应该知道 Soft Updates 的两点:首先, Soft Updates 保证了崩溃后的文件系统完整性,但是很可能有几秒钟 (甚至一分钟!) 之前的数据没有写到物理磁盘。如果您的系统崩溃了您可能会丢失很多工作。 第二,SoftUpdates 推迟文件系统块的释放时间。如果在文件系统 (例如根文件系统)快满了的情况下对系统进行大规模的升级比如 make installworld, 可能会引起磁盘空间不足从而造成升级失败。 Soft Updates 的详细资料 Soft Updates 详细资料 有两种传统的方法来把文件系统的元数据 (meta-data) 写入磁盘。 (Meta-data更新是更新类似 inodes 或者目录这些没有内容的数据) 从前,默认方法是同步更新这些元数据(meta-data)。 如果一个目录改变了,系统在真正写到磁盘之前一直等待。 文件数据缓存(文件内容)在这之后以非同步形式写入。 这么做有利的一点是操作安全。如果更新时发生错误,元数据(meta-data) 一直处于完整状态。文件要不就被完整的创建要不根本就不创建。 如果崩溃时找不到文件的数据块,&man.fsck.8; 可以找到并且依靠把文件大小设置为 0 来修复文件系统。 另外,这么做既清楚又简单。缺点是元数据(meta-data)更新很慢。例如 rm -r 命令,依次触及目录下的所有文件, 但是每个目录的改变(删除一个文件)都要同步写入磁盘。 这包含它自己更新目录,inode 表和可能对文件分散的块的更新。 同样问题出现大的文件操作上(比如 tar -x)。 第二种方法是非同步元数据更新。这是 Linux/ext2fs 和 *BSD ufs 的 mount -o async 默认的方法。所有元数据更新也是通过缓存。 也就是它们会混合在文件内容数据更新中。 这个方法的优点是不需要等待每个元数据更新都写到磁盘上, 所以所有引起元数据更新大的操作比同步方式更快。同样, 这个方法也是清楚且简单的,所以代码中的漏洞风险很小。 缺点是不能保证文件系统的状态一致性。如果更新大量元数据时失败 (例如掉电或者按了重启按钮),文件系统会处在不可预知的状态。 系统再启动时没有机会检查文件系统的状态;inode 表更新的时候可能文件的数据块已经写入磁盘了但是相关联的目录没有,却不能用 fsck 命令来清理(因为磁盘上没有所需要的信息)。 如果文件系统修复后损坏了,唯一的选择是使用 &man.newfs.8; 并且从备份中恢复它。 这个问题通常的解决办法是使用 dirty region logging 或者 journaling 尽管它不是一贯的被使用并且有时候应用到其他的事务纪录中更好。 这种方法元数据更新依然同步写入,但是只写到磁盘的一个小区域。 过后他们将会被移动到正确的位置。因为纪录区很小, 磁盘上接近的区域磁头不需要移动很长的距离,所以这些比写同步快一些。 另外这个方法的复杂性有限,所以出现错误的机会也很少。缺点是元数据要写两次 (一次写到纪录区域,一次写到正确的区域)。正常情况下, 悲观的性能可能会发生。从另一方面来讲, 崩溃的时候所有未发生的元数据操作可以很快的在系统启动之后从记录中恢复过来。 Kirk McKusick,伯克利 FFS 的开发者,用 Soft Updates 解决了这个问题:元数据更新保存在内存中并且按照排列的顺序写入到磁盘 (有序的元数据更新)。这样的结果是,在繁重的元数据操作中, 如果先前的更新还在内存中没有别写进磁盘,后来的更新就会捕捉到。 所以所有的目录操作在写进磁盘的时候首先在内存中执行 (数据块按照它们的位置来排列,所以它们不会在元数据前被写入)。 如果系统崩溃了这将导致一个固定的 日志回朔: 所有不知如何写入磁盘的操作都像没有发生过一样。文件系统的一致性保持在 30 到 60 秒之前。它保证了所有正在使用的资源被标记例如块和 inodes。崩溃之后, 唯一的资源分配错误是一个实际是空闲的资源的资源被标记为使用。 &man.fsck.8; 可以认出这种情况并且释放不再使用的资源。它对于忽略崩溃后用 mount -f 强制挂上的文件系统的错误状态是安全的。 为了释放可能没有使用的资源,&man.fsck.8; 需要在过后的时间运行。一个主意是用 后台 fsck:系统启动的时候只有一个文件系统的 快照 被记录下来。fsck 可以在过后运行。所有文件系统可以在有错误的时候被挂接, 所以系统可以在多用户模式下启动。接着,后台 fsck 可以在所有文件系统需要的时候启动来释放可能没有使用的资源。 (尽管这样,不用 Soft Updates 的文件系统依然需要通常的 fsck。) 它的优点是元数据操作几乎跟非同步一样快 (也就是比需要两次元数据写操作的 logging 更快)。缺点是代码的复杂性(意味着对于丢失用户敏感数据有更多的风险) 和高的内存使用量。另外它有些特点需要知道。崩溃之后, 文件系统状态会落后一些。同步的方法用 fsck 后在一些地方可能产生一些零字节的文件, 这些文件在用 Soft Updates 文件系统之后不会存在, 因为元数据和文件内容根本没有写进磁盘(可能发生在运行 rm 之后)。这可能在文件系统上安装大量数据时候引发问题, 没有足够的剩余空间来两次存储所有文件。 调整内核限制 调整 内核限制 文件/进程限制 <varname>kern.maxfiles</varname> kern.maxfiles kern.maxfiles 可以根据系统的需要适当增减。 这个变量用于指定在系统中允许的文件描述符的最大数量。 当文件描述符表满的时候, file: table is full 会在系统消息缓冲区中反复出现, 您可以使用 dmesg 命令来观察这一现象。 每个打开的文件、 套接字和管道, 都会占用一个文件描述符。 在大型生产服务器上, 可能会轻易地用掉数千个文件描述符, 具体用量取决于服务的类型和并行启动的服务数量。 在早期版本的 &os; 中, kern.maxfiles 的默认值, 是根据您内核配置文件中的 选项计算的。 kern.maxfiles 这个数值, 会随 成比例地增减。 当编译定制的内核时, 按照您系统的用途来修改这个值是个好主意。 这个数字同时还决定内核的许多预设的限制值。 有时, 尽管并不会真的有 256 个用户同时连接一台生产服务器, 但对于高负载的 web 服务器而言, 却可能需要与之类似的资源。 从 FreeBSD 4.5 开始, kern.maxusers 会在系统启动时, 根据可用内存的尺寸进行计算, 在内核开始运行之后, 可以通过只读的 kern.maxusers sysctl 变量值来进行观察。 有些情况下, 可能会希望使用更大或更小一些的 kern.maxusers, 它可以以加载器变量的形式进行配置; 类似 64、 128 和 256 这样的值都并不罕见。 我们不推荐使用超过 256 的值, 除非您需要巨量的文件描述符; 根据 kern.maxusers 推算默认值的那些变量, 一般都可以在引导甚至运行时通过 /boot/loader.conf (请参见 &man.loader.conf.5; 联机手册或 /boot/defaults/loader.conf 文件来获得相关的指导) 或这篇文档的其余部分所介绍的方式来调整。 而在 FreeBSD 4.4 之前的版本, 则只能通过内核的 &man.config.8; 选项 来加以调整。 在较早的版本中, 如果您明确地将 maxusers 设置为 0, 则系统会自动地根据硬件配置来确定这个值。 自动调整算法会将 maxusers 设置为与主存的数量一样, 或者取其下限 32 或上限 384。 。 在 &os; 5.X 和更高版本中, maxusers 如果不指定的话, 就会取默认值 0。 如果希望自行管理 maxusers, 则应配置一个不低于 4 的值, 特别是使用 X Window System 或编译软件的时候。 这样做的原因是, maxusers 所决定的一个最为重要的表的尺寸会影响最大进程数, 这个数值将是 20 + 16 * maxusers。 因此如果将 maxusers 设置为 1, 您就只能同时运行 36 个进程, 这还包括了 18 个左右的系统引导时启动的进程, 以及 15 个左右的, 在您启动 X Window System 时所引发的进程。 即使是简单的任务, 如阅读联机手册, 也需要启动多至九个的进程, 用以过滤、 解压缩, 并显示它。 将 maxusers 设为 64 将允许您同时执行最多 1044 个进程, 这几乎足以满足任何需要了。 不过, 如果您看在启动其它程序, 或运行用以支持大量用户的服务 (例如 ftp.FreeBSD.org) 时, 看到令人担忧的 proc table full 错误, 就应该提高这一数值, 并重新联编内核。 maxusers不能 限制实际能够登录到您系统上来的用户的数量。 它的主要作用是根据您可能支持的用户数量来为一系列系统数据表设置合理的尺寸, 以便提供支持他们所需运行的进程资源。 而 能够 限制并发远程以及 X 终端窗口数量的变量则是 pseudo-device pty 16。 对于 &os; 5.X, 您不再需要为这一数字而担心, 因为 &man.pty.4; 驱动已经是 自动复制的 了; 您只需在配置文件中指定 device pty 即可。 <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 限制 TCP 带宽延迟积和 NetBSD 的 TCP/Vegas 类似。 它可以通过将 sysctl 变量 net.inet.tcp.inflight.enable 设置成 1 来启用。 系统将尝试计算每一个连接的带宽延迟积, 并将排队的数据量限制在恰好能保持最优吞吐量的水平上。 这一特性在您的服务器同时向使用普通调制解调器, 千兆以太网, 乃至更高速度的光与网络连接 (或其他带宽延迟积很大的连接) 的时候尤为重要, 特别是当您同时使用滑动窗缩放, 或使用了大的发送窗口的时候。 如果启用了这个选项, 您还应该把 net.inet.tcp.inflight.debug 设置为 0 (禁用调试), 对于生产环境而言, 将 net.inet.tcp.inflight.min 设置成至少 6144 会很有好处。 然而, 需要注意的是, 这个值设置过大事实上相当于禁用了连接带宽延迟积限制功能。 这个限制特性减少了在路由和交换包队列的堵塞数据数量, 也减少了在本地主机接口队列阻塞的数据的数量。在少数的等候队列中、 交互式连接,尤其是通过慢速的调制解调器,也能用低的 往返时间操作。但是,注意这只影响到数据发送 (上载/服务端)。对数据接收(下载)没有效果。 调整 net.inet.tcp.inflight.stab 推荐的。 这个参数的默认值是 20, 表示把 2 个最大包加入到带宽延迟积窗口的计算中。 额外的窗口似的算法更为稳定, 并改善对于多变网络环境的相应能力, 但也会导致慢速连接下的 ping 时间增长 (尽管还是会比没有使用 inflight 算法低许多)。 对于这些情形, 您可能会希望把这个参数减少到 15, 10, 或 5; 并可能因此而不得不减少 net.inet.tcp.inflight.min (比如说, 3500) 来得到希望的效果。 减少这些参数的值, 只应作为最后不得已时的手段来使用。 虚拟内存 <varname>kern.maxvnodes</varname> vnode 是对文件或目录的一种内部表达。 因此, 增加可以被操作系统利用的 vnode 数量将降低磁盘的 I/O。 一般而言, 这是由操作系统自行完成的, 也不需要加以修改。 但在某些时候磁盘 I/O 会成为瓶颈, 而系统的 vnode 不足, 则这一配置应被增加。 此时需要考虑是非活跃和空闲内存的数量。 要查看当前在用的 vnode 数量: - &prompt.root; sysctl vfs.numvnodes -vfs.numvnodes: 91349 + &prompt.root; sysctl vfs.numvnodes +vfs.numvnodes: 91349 要查看最大可用的 vnode 数量: - &prompt.root; sysctl kern.maxvnodes -kern.maxvnodes: 100000 + &prompt.root; sysctl kern.maxvnodes +kern.maxvnodes: 100000 如果当前的 vnode 用量接近最大值, 则将 kern.maxvnodes 值增大 1,000 可能是个好主意。 您应继续查看 vfs.numvnodes 的数值, 如果它再次攀升到接近最大值的程度, 仍需继续提高 kern.maxvnodes。 在 &man.top.1; 中显示的内存用量应有显著变化, 更多内存会处于活跃 (active) 状态。 添加交换空间 不管您计划得如何好,有时候系统并不像您所期待的那样运行。 如果您发现需要更多的交换空间,添加它很简单。 有三种方法增加交换空间:添加一块新的硬盘驱动器、通过 NFS 使用交换空间和在一个现有的分区上创建一个交换文件。 要了解关于如何加密交换区, 相关配置, 以及为什么要这样做, 请参阅手册的 在新的硬盘驱动器上使用交换空间 这是添加交换空间最好的方法, 当然为了达到这个目的需要添加一块硬盘。 毕竟您总是可以使用另一块磁盘。如果能这么做, 重新阅读一下手册中关于交换空间的 来了解如何最优地安排交换空间。 通过 NFS 交换 除非没有可以用作交换空间的本地硬盘时, 否则不推荐您使用 NFS 来作为交换空间使用。 NFS 交换会受到可用网络带宽限制并且增加 NFS 服务器的负担。 交换文件 您可以创建一个指定大小的文件用来当作交换文件。 在我们的例子中我们将会使用叫做 /usr/swap0 的 64MB 大小的文件。当然您也可以使用任何您所希望的名字。 在 &os; 中创建交换文件 确认您的内核配置包含虚拟磁盘(Memory disk)驱动 (&man.md.4;)。它在 GENERIC 内核中是默认的。 device md # Memory "disks" 创建一个交换文件(/usr/swap0): &prompt.root; dd if=/dev/zero of=/usr/swap0 bs=1024k count=64 赋予它(/usr/swap0)一个适当的权限: &prompt.root; chmod 0600 /usr/swap0 /etc/rc.conf 中启用交换文件: swapfile="/usr/swap0" # Set to name of swapfile if aux swapfile desired. 通过重新启动机器或下面的命令使交换文件立刻生效: &prompt.root; mdconfig -a -t vnode -f /usr/swap0 -u 0 && swapon /dev/md0 Hiten Pandya Written by Tom Rhodes 电源和资源管理 BIOS 接口管理,例如可插拔 BIOS (PNPBIOS)或者高级电源管理(APM) 等等。电源和资源管理是现代操作系统的关键组成部分。 例如您可能当系统温度过高的时候让您的操作系统能监视到 (并且可能提醒您)。 以有效的方式利用硬件资源是非常重要的。 在引入 ACPI 之前, 管理电源使用和系统散热对操作系统是很困难的。 硬件由 BIOS 进行管理, 因而用户对电源管理配置的控制和查看都比较困难。 一些系统通过 高级电源管理 (APM) 提供了有限的配置能力。 电源和资源管理是现代操作系统的一个关键组件。 例如, 您可能希望操作系统监视系统的一些限制, 例如系统的温度是否超出了预期的增长速度 (并在需要时发出警告)。 在 &os; 使用手册的这一章节,我们将提供 ACPI 全面的信息。 参考资料会在末尾给出。 什么是 ACPI? ACPI APM 高级配置和电源接口 (ACPI) 是一个业界标准的硬件资源和电源管理接口 (因此而得名) 。它是 操作系统控制的配置和电源管理(Operating System-directed configuration and Power Management),也就是说, 它给操作系统(OS)提供了更多的控制和弹性。 在引入 ACPI 之前, 现代操作系统使得目前即插即用接口的局限性更加 凸现 出来。 ACPIAPM(高级电源管理) 的直接继承者。 高级电源管理 (APM) 的缺点 高级电源管理 (APM) 是一种基于系统目前的活动控制其电源使用的机制。 APM BIOS 由 (系统的) 制造商提供, 并且是硬件平台专属的。 在 OS 中的 APM 驱动作为中介来访问 APM 软件接口, 从而实现对电源使用的管理。 在 2000 年或更早的时期生产的计算机系统, 仍需要使用 APM。 APM 有四个主要的问题。 首先, 电源管理是通过 (制造商专属的) BIOS 实现的, 而 OS 则完全不了解其细节。 例如, 用户在 APM BIOS 中设置了硬盘驱动器的空闲等待数值, 当超过这一空闲时间的限制时, 它 (BIOS) 将会减慢硬盘驱动器的速度, 而不会征求 OS 的同意。 第二, APM 逻辑是嵌入 BIOS 的, 因此它是在 OS 的控制之外运转的。 这意味着用户只能通过通过刷新他们 ROM 中的 APM BIOS 才能够解决某些问题; 而这是一个很危险的操作, 因为它可能使系统进入一个无法恢复的状态。 第三, APM 是一种制造商专属的技术, 也就是说有很多第三方的 (重复的工作) 以及 bugs, 如果在一个制造商的 BIOS 中有, 也未必会在其他的产品中解决。 最后但绝不是最小的问题, APM BIOS 没有为实现复杂的电源策略提供足够的余地, 也无法实现能够非常适合具体机器的策略。 即插即用 BIOS (PNPBIOS) 在很多时候都是不可靠的。 PNPBIOS 是 16-位 的技术, 因此 OS 不得不使用 16-位 模拟才能够与 PNPBIOS 的方法 接口 &os; APM 驱动在 &man.apm.4; 手册页中有描述。 配置 <acronym>ACPI</acronym> 默认情况下, acpi.ko 驱动, 会在系统引导时由 &man.loader.8; 加载, 而 不应 直接联编进内核。 这样做的原因是模块操作起来更方便, 例如, 无需重新联编内核就可以切换到另一个 acpi.ko 版本。 这样可以让测试变得更简单一些。 另一个原因是, 许多时候在启动已经启动之后再启动 ACPI 可能会有些问题。 如果您遇到了问题, 可以全面禁用 ACPI。 这个驱动不应, 目前也无法卸载, 因为系统总线通过它与许多不同的硬件进行交互。 ACPI 可以通过在 /boot/loader.conf 中配置或在 &man.loader.8; 提示符处配置 hint.acpi.0.disabled="1" 来禁用。 ACPIAPM 不能共存, 相反, 它们应分开使用。 后加载的驱动如果发现系统中已经执行了其中的一个, 便会停止执行。 ACPI 可以用来让系统进入休眠模式, 方法是使用 &man.acpiconf.8; 的 参数, 加上一个 1-5 的数字。 多数用户会希望使用 13 (挂起到 RAM)。 而 5 则会让系统执行与下列命令效果类似的软关机: &prompt.root; halt -p 除此之外, 还有一些通过 &man.sysctl.8; 提供的选项。 请参见联机手册 &man.acpi.4; 和 &man.acpiconf.8; 以获得更多信息。 Nate Lawson 撰写人: Peter Schultz 协力: Tom Rhodes 使用和调试 &os; <acronym>ACPI</acronym> ACPI problems ACPI 是一种全新的发现设备、 管理电源使用、 以及提供过去由 BIOS 管理的访问不同硬件的标准化方法。 让 ACPI 在各种系统上都能正确使用的工作一直在进行, 但许多主板的 ACPI 机器语言 (AML) 字节代码中的 bug, &os; 的内核中子系统设计的不完善, 以及 &intel; ACPI-CA 解释器中的 bug 仍然不时会出现。 这份文档期望能够帮助您协助 &os; ACPI 的维护人员来找到您所观察到的问题的根源, 并通过调试找到其解决方法。 感谢您阅读这份文档, 我们也希望能够解决您的系统上的问题。 提交调试信息 在提交问题之前, 请确认您已经在运行最新的 BIOS 版本, 此外, 也包括嵌入式控制器的固件版本。 如果您希望提交一个问题, 请确保将下述信息发到 freebsd-acpi@FreeBSD.org: 问题行为的描述, 包括系统类型、型号,以及任何触发问题的相关信息。 另外, 请注意尽可能准确地描述这一问题是否对您是陌生的。 boot -v 之后得到的 &man.dmesg.8; 输出, 以及任何在重现 bug 时出现的错误信息。 在禁用了 ACPI 之后的 boot -v 的 &man.dmesg.8; 输出, 如果您发现禁用 ACPI 能够帮助消除问题。 来自 sysctl hw.acpi的输出。 这也是找到您的系统所提供的功能的一种好办法。 能够得到您的 ACPI Source Language (ASL) 的 URL不要ASL 直接发到邮件列表中, 因为它们可能非常大。 为了得到 ASL 您可以运行这个命令: &prompt.root; acpidump -dt > name-system.asl (把 name 改为您的登录名, 并把 system 改为您的硬件制造商及其型号。 例如: njl-FooCo6000.asl) 许多开发者也会订阅 &a.current; 但还是请发到 &a.acpi.name; 这样它会被更多人看到。 请耐心等待, 因为我们都有全职的其他工作。 如果您的 bug 不是显而易见的, 我们可能会要求您通过 &man.send-pr.1; 来提交一个 PR。 在输入 PR 时,请将同样的信息包含进去。 这将帮助我们来追踪和解决问题。 不要在给 &a.acpi.name; 写信之前发送 PR 因为我们把它当作已知文体的备忘录而不是报告机制。 您的问题很可能已经被其他人报告过了。 背景 ACPI ACPI 存在于采用 ia32 (x86)、 ia64 (安腾)、 以及 amd64 (AMD) 架构的所有现代计算机上。 完整的标准具有大量的各式功能, 包括 CPU 性能管理、 电源控制、 温度监控、 电池系统、 嵌入式控制器以及总线枚举。 绝大多数系统实现比完整标准的功能要少一些。 例如, 桌面系统通常只实现总线枚举部分, 而笔记本则通常支持降温和电源管理功能。 笔记本通常还提供休眠和唤醒支持, 并提供与此适应的复杂功能。 符合 ACPI 的系统中有许多组件。 BIOS 和芯片组制造商提供一些固定的表 (例如, FADT) 在存储器中, 以提供类似 APIC 映射 (用于 SMP)、 配置寄存器、 以及简单的配置值等等。 另外, 一个字节代码 (bytecode) 表 (系统区别描述表 DSDT) 则提供了通过树状命名空间来指定设备及其功能的方法。 ACPI 驱动必须要处理固定表, 实现字节码解释器, 并修改驱动程序和内核, 以接受来自 ACPI 子系统的信息。 对于 &os;, &intel; 提供了一个解释器 (ACPI-CA), 它在 Linux 和 NetBSD 也可以使用。 ACPI-CA 源代码可以在 src/sys/contrib/dev/acpica 找到。 用于在 &os; 中允许 ACPI-CA 正确运转的代码则在 src/sys/dev/acpica/Osd。 最后, 用于实现 ACPI 设备的驱动可以在 src/sys/dev/acpica 找到。 常见问题 ACPI problems 要让 ACPI 正常工作, 它的每一部分都必须工作正常。 下面是一些常见的问题, 按照出新的频繁程度排序, 并给出了一些绕过或修正它们的方法。 鼠标问题 某些时候, 唤醒操作会导致鼠标不再正常工作。 已知的绕过这一问题的方法, 是在 /boot/loader.conf 文件中添加 hint.psm.0.flags="0x3000" 设置。 如果这样做不能解决问题, 请考虑按前面介绍的方法提交问题报告。 休眠/唤醒 ACPI 提供了三种休眠到 RAM (STR) 的状态, S1-S3, 以及一个休眠到磁盘的状态 (STD), 称作 S4S5软关机 同时也是系统接好电源但没有开机时的正常状态。 S4 实际上可以用两种不同的方法来实现。 S4BIOS 是一种由 BIOS 辅助的挂起到磁盘方法, 而 S4OS 则是完全由操作系统实现的。 可以使用 sysctl hw.acpi 来查看与休眠有关的项目。 这里是我的 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.ko、 X11 显示驱动, 以及 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) 并输入 show interrupts APIC 禁用 处理中断问题的救命稻草是尝试禁用 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> ACPI ASL 最常见的问题是 BIOS 制造商提供的不正确 (甚至完全错误的!) 字节代码。 这通常会以类似下面这样的内核消息显示在控制台上: ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\ (Node 0xc3f6d160), AE_NOT_FOUND 许多时候, 您可以通过将 BIOS 升级到最新版本来解决此类问题。 绝大多数控制台消息是无害的, 但如果您有其他问题例如电池工作不正常, 则从 AML 开始查找问题将是一条捷径。 字节代码, 或常说的 AML, 是从一种叫做 ASL 的语言写成的源代码进行编译得到的结果。 AML 一般存放在 DSDT 表中。 要得到您系统的 ASL, 需要使用 &man.acpidump.8;。 需要同时指定 (显示固定标的内容) 和 (将 AML 反编译成 ASL) 两个选项。 请参见 如何提交调试信息 一节了解如何使用它。 最方便的初步检查是尝试重新编译 ASL 来看看是否有错误。 通常可以忽略这一过程中产生的警告, 但错误一般就都是 bug, 它们通常就是导致 ACPI 无法正常工作的原因。 要重新编译您的 ASL, 可以使用下面的命令: &prompt.root; iasl your.asl 修复 <acronym>ASL</acronym> ACPI ASL 我们的长期目标是让每一个人都能够在不需要任何用户干预的情况下使用 ACPI。 然而, 目前我们仍然在开发绕过 BIOS 制造商常见错误的方法。 µsoft; 解释器 (acpi.sysacpiec.sys) 并不会严格地检查是否遵守了标准, 因此许多只在 &windows; 中测试 ACPIBIOS 制造商很可能永远不会修正他们的 ASL。 我们希望不断地找出并用文档说明 µsoft; 的解释器到底允许那些不标准的行为, 并在 &os; 进行对应的修改使它能够正常工作而不需要用户修正 ASL。 作为一项临时缓解问题的方法, 并帮助我们确认其行为, 您可以手工修正 ASL。 如果这样能够解决问题, 请把新旧 ASL 的 &man.diff.1; 发给我们, 这样我们就有可能绕过 ACPI-CA 中的错误行为, 从而不再需要您来手工修正。 ACPI error messages 下面是一些常见的错误信息, 它们的原因, 以及如何修正。 _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 问题 ACPI 调试 ACPI 驱动程序提供了非常灵活的调试机制。 这允许您指定一组子系统, 以及所需要的详细信息。 需要调试的子系统可以按 layers(层) 来指定, 并分为 ACPI-CA 组件 (ACPI_ALL_COMPONENTS) 和 ACPI 硬件支持 (ACPI_ALL_DRIVERS)。 调试输出的详细程度可以通过 level(详细度) 来指定, 其范围是 ACPI_LV_ERROR (只报告错误) 到 ACPI_LV_VERBOSE (显示所有)。 level 是一个位掩码因此可以一次设置多个选项, 中间用空格分开。 实际使用中您应该考虑使用串行控制台来记录输出, 如果它太长以至于冲掉了控制台消息缓冲的话。 不同的层和输出详细度的完整列表可以在 &man.acpi.4; 联机手册中找到。 调试输出默认并不开启。 要起用它, 您需要在内核设置中添加 options ACPI_DEBUG, 如果您的内核中编入了 ACPI 的话。 您还可以在 /etc/make.conf 中加入 ACPI_DEBUG=1 来在全局起用它。 如果它只是模块, 您可以用下面的方法来重新编译 acpi.ko &prompt.root; cd /sys/modules/acpi/acpi && make clean && make ACPI_DEBUG=1 安装 acpi.ko/boot/kernel and add your 并把所需的详细度和层在 loader.conf 中指定。 这个例子将启用所有 ACPI-CA 组件以及所有 ACPI 硬件驱动 (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/disks/chapter.sgml b/zh_CN.GB2312/books/handbook/disks/chapter.sgml index 3e1af01de9..d3cd89e62f 100644 --- a/zh_CN.GB2312/books/handbook/disks/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/disks/chapter.sgml @@ -1,3676 +1,3676 @@ 存储 概述 这章介绍了 FreeBSD 中磁盘的使用方法。包括内存盘, 网络附属磁盘和标准的 SCSI/IDE 存储设备,以及使用 USB 的设备。 读完这章,您将了解到: FreeBSD 中用来描述硬盘上数据组织的术语 (partitions and slices)。 如何在您的系统上增加硬盘。 如何配置 &os; 来使用 USB 存储设备。 如何设置虚拟文件系统,例如内存磁盘。 如何使用配额来限制磁盘空间的使用。 如何增加磁盘安全来预防功击。 如何刻录 CD 和 DVD 。 用于备份的多种存储媒介。 如何在 FreeBSD 上使用备份程序。 如何备份到软磁盘。 文件系统快照是什么, 以及如何有效地使用它们。 在读这章之前,您应该: 知道怎样去配置和安装新的 FreeBSD 内核 (). 设备命名 下面是在 FreeBSD 上被支持的物理存储设备和它们被分配的设备名。 物理磁盘命名规则 驱动器类型 驱动设备命名 IDE 硬盘驱动器 ad IDE CDROM 驱动器 acd SCSI 硬盘以及 USB 大容量存储设备 da SCSI CDROM 驱动器 cd 各类非标准 CDROM 驱动器 用于 Mitsumi CD-ROM 的 mcd 以及用于 Sony CD-ROM 驱动器的 scd Floppy drives fd SCSI tape drives sa IDE tape drives ast Flash drives fla for &diskonchip; Flash device RAID drives aacd for &adaptec; AdvancedRAID, mlxd and mlyd for &mylex;, amrd for AMI &megaraid;, idad for Compaq Smart RAID, twed for &tm.3ware; RAID.
David O'Brien Originally contributed by 添加磁盘 磁盘 添加 假设我们要给一台只有一个磁盘的机器增加一个新的 SCSI 磁盘。首先 需要关掉计算机,然后按操作规程来安装驱动器,控制器和驱动程序。由于 各厂家生产的产品各不相同,具体的安装细节不在此文档介绍之内。 root 用户登录。安装完驱动后,检查一下 /var/run/dmesg.boot 有没有找到新的磁盘。在我们 的例子中新增加的磁盘就是 da1,我们从 /1 挂上它。 (如果您正添加 IDE 驱动器, 则设备名应该是 ad1)。 partitions slices fdisk 因为 FreeBSD 运行在 IBM-PC 兼容机上,它必须遵循 PC BIOS 分区规范。 这与传统的 BSD 分区是不同的。一个 PC 的磁盘最高只能有四个 BIOS 主分区。如果磁盘只安装 FreeBSD 您可以使用 dedicated 模式。另外, FreeBSD 必须安装在 PC BIOS 支持的分区内。FreeBSD 把分区叫作 slices 这可能会把人搞糊涂。您也可以在只安装 FreeBSD 的磁盘上使用 slices,也可以在安装有其它操作系统的磁盘上使用 slices。这不会影响其它操作系统的 fdisk 分区工具。 在 slice 方式表示下,驱动器被添加到 /dev/da1s1e。 可以读作:SCSI 磁盘,编号为 1 (第二个SCSI 磁盘), slice 1 (PC BIOS 分区 1), 的 BSD 分区 e 。在有些例子中,也可以简化为 /dev/da1e 由于 &man.bsdlabel.8; 使用 32-位 的整数来表示扇区号, 因此在多数情况下它的表现力限于每个磁盘 2^32-1 个扇区或 2TB。 &man.fdisk.8; 格式允许的起始扇区号不能高于 2^32-1 而分区长度也不能大于 2^32-1, 通常情况下这限制了分区大小最大为 2TB 而磁盘大小则是 4TB。 &man.sunlabel.8; 格式的限制是每个分区 2^32-1 个扇区, 但允许 8 个分区因此最大支持 16TB 的磁盘。 要使用更大的分区, 则应使用 &man.gpt.8;。 使用 &man.sysinstall.8; sysinstall adding disks su 使用 <application>Sysinstall</application> 您可以使用 sysinstall 命令的菜单来分区和标记一个新的磁盘。 这一操作需要有 root 权限, 您可以直接使用 root 账户登录或者使用 su 命令来切换到 root 用户。运行 sysinstall ,然后选择 Configure 菜单。在 FreeBSD Configuration Menu 下,上下滚动, 选择 Fdisk 条目。 <application>fdisk</application> 分区编辑器 进入 fdisk 分区编辑器后,选择 A ,FreeBSD 将使用全部的磁盘。当被告知 remain cooperative with any future possible operating systems时,回答 YES。使用 W 保存刚才的修改。现在使用 q 退出 FDISK 编辑器。下面会看到有关 主引导区 的信息。 现在您已经在运行的系统上添加了一个磁盘, 因此应该选择 None Disk Label 编辑器 BSD partitions 接下来,您应该退出 sysinstall 并且再次启动它,并按照上面的步骤直接进入 Label 选项。进入 磁盘标签编辑器。 这就是您要创建的 BSD 分区。一个磁盘最多可以有 8 个分区,标记为 a-h。有几个分区标签有特殊的用途。 a 分区被用来作为根分区(/)。 系统磁盘(例如:从那儿启动的分区)必须有一个 a 分区。b 分区被用作交换分区,可以用很多磁盘用作交 换分区。 c 分区代表整个硬盘,或在 FreeBSD slice 模式下代表整个 slice。其它分区作为一般分区来使用。 sysinstall 的标签编辑器用 e 表示非 root 和非 swap 分区。在标签编辑器中,可以使用键入C 创建一个文件系统。当提示这是否是一个 FS(文件系统)或 swap 时,选择 FS,然后给出一个加载点(如: /mnt)。 当在 post-install 模式时添加一个磁盘, sysinstall 不会在 /etc/fstab 中创建记录,所以是否指定加载点并不重要。 现在已经准备把新标签写到磁盘上,然后创建一个文件系统,可以按下 W。出现任何错误都会不能创建新的分区。可以退出标签编辑 器然后重新执行 sysinstall 完成 下面一步就是编辑 /etc/fstab,为您的磁盘添加一个新 记录。 使用命令行工具 使用 Slices 这步安装将允许磁盘与可能安装在您计算机上的其它操作系统一起 正确工作,而不会搞乱其它操作系统的分区。推荐使用这种方法来安装 新磁盘,除非您有更好的理由再使用 dedicated 模式! &prompt.root; dd if=/dev/zero of=/dev/da1 bs=1k count=1 &prompt.root; fdisk -BI da1 #初始化新磁盘 -&prompt.root; bsdlabel -B -w -r da1s1 auto #加上标签 +&prompt.root; bsdlabel -B -w da1s1 auto #加上标签 &prompt.root; bsdlabel -e da1s1 # 现在编辑您刚才创建的磁盘分区 &prompt.root; mkdir -p /1 &prompt.root; newfs /dev/da1s1e # 为您创建的每个分区重复这个操作 &prompt.root; mount /dev/da1s1e /1 # 挂上分区 &prompt.root; vi /etc/fstab # 完成之后,添加合适的记录到您的 /etc/fstab文件。 如果有一个 IDE 磁盘,记得要用 ad 替换前面的 da 专用模式 OS/2 如果您并没有安装其它的操作系统,可以使用 dedicated 模式。记住这种模式可能会弄乱 Microsoft 的操作系统,但不会对它进行破坏。 它不识别找到的 IBM &os2 的 appropriate 分区。 &prompt.root; dd if=/dev/zero of=/dev/da1 bs=1k count=1 -&prompt.root; bsdlabel -Brw da1 auto +&prompt.root; bsdlabel -Bw da1 auto &prompt.root; bsdlabel -e da1 # 创建 `e' 分区 &prompt.root; newfs -d0 /dev/da1e &prompt.root; mkdir -p /1 &prompt.root; vi /etc/fstab # 为 /dev/da1e添加一个记录 &prompt.root; mount /1 另一种方法: &prompt.root; dd if=/dev/zero of=/dev/da1 count=2 -&prompt.root; bsdlabel /dev/da1 | bsdlabel -BrR da1 /dev/stdin +&prompt.root; bsdlabel /dev/da1 | bsdlabel -BR da1 /dev/stdin &prompt.root; newfs /dev/da1e &prompt.root; mkdir -p /1 &prompt.root; vi /etc/fstab # 为 /dev/da1e添加一个记录 &prompt.root; mount /1 RAID 软件 RAID Christopher Shumway Original work by Jim Brown Revised by RAIDsoftware RAIDCCD 连接磁盘驱动器配置 (CCD) 选择一个大容量存储比较好的解决方案,最重要的因素是产品的速度、 性能和成本。 通常这三者不可能都满足;要获得比较快和可靠的大容量存储设备, 就比较昂贵。但如果将成本降下来,那它的速度或可靠性就会打折扣。 在设计下面描述的系统时, 价格被选为最重要的因素, 接下来是速度和性能。 这个系统的数据传输速度基本上受限于网络。 性能也非常重要, CCD 驱动器上的所有数据都被备份到了 CD-R 盘, 可以很容易地对数据进行恢复。 在选择一个大容量的存储解决方案时,第一步是要设计您自己的需求。 如果您的需求更偏重于速度和性能,那么您的解决方案将就不同于上面的设计。 安装硬件 除了 IDE 系统磁盘外,还有三个 Western Digital 30GB、5400 RPM 的 IDE 磁盘构成了大约 90G 的连接磁盘驱动存储空间。 理想情况是每个 IDE 硬盘都独占 IDE 控制器和数据线, 但为了尽可能降低成本, 通常并不会安装更多的控制器, 而是通过配置跳线,使每个 IDE 控制器都管理一个主盘和一个从盘。 重启动后,系统 BIOS 被配置成自动检测硬盘。FreeBSD 检测到它们: ad0: 19574MB <WDC WD205BA> [39770/16/63] at ata0-master UDMA33 ad1: 29333MB <WDC WD307AA> [59598/16/63] at ata0-slave UDMA33 ad2: 29333MB <WDC WD307AA> [59598/16/63] at ata1-master UDMA33 ad3: 29333MB <WDC WD307AA> [59598/16/63] at ata1-slave UDMA33 如果 FreeBSD 没有检测到它们,请确定它们的跳线是否设置 正确。大多数 IDE 磁盘有一个 Cable Select 跳线。这个 不是 设置 master/slave 硬盘的跳线。查阅文档 信息来确定正确的跳线设置。 接下来考虑的是,如何创建文件系统。应该好好研究一下 &man.vinum.8; ()和 &man.ccd.4; 两种方式,在这里我们选择 &man.ccd.4; 安装 CCD &man.ccd.4; 允许用户将几个相同的的磁盘通过一个逻辑文件系统 连接起来。要使用 &man.ccd.4;,您需要在内核中配置 &man.ccd.4; 支持选项。把这行加入到内核配置文件中,然后重建内核: device ccd 对 &man.ccd.4; 的支持也可以内核模块的形式载入。 要安装 &man.ccd.4;, 首先需要使用 &man.bsdlabel.8; 来编辑硬盘: - bsdlabel -r -w ad1 auto -bsdlabel -r -w ad2 auto -bsdlabel -r -w ad3 auto + bsdlabel -w ad1 auto +bsdlabel -w ad2 auto +bsdlabel -w ad3 auto 此处将整个硬盘创建为 ad1c, ad2cad3c 下一步是改变 disklable 的类型。也可以使用 &man.bsdlabel.8; 来编辑: bsdlabel -e ad1 bsdlabel -e ad2 bsdlabel -e ad3 这儿在每个已经设置了 EDITOR 环境变量的磁盘上打开了 disklable,在我我例子中使用的是 &man.vi.1;。 可以看到: 8 partitions: # size offset fstype [fsize bsize bps/cpg] c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597) 添加一个新的 e 分区给 &man.ccd.4; 用。这可以是 c 分区的一个副本, 但 必须4.2BSD。做完之后,您会看到一面这些: 8 partitions: # size offset fstype [fsize bsize bps/cpg] c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597) e: 60074784 0 4.2BSD 0 0 0 # (Cyl. 0 - 59597) 建立文件系统 现在已给每个磁盘都加上了标签,下面需要建立 &man.ccd.4;。要这样做, 需要使用 &man.ccdconfig.8; 工具,同时要提供类似下面的选项: ccdconfig ccd0 32 0 /dev/ad1e /dev/ad2e /dev/ad3e 每个选项的意义和用法如下所示: 配置设备的第一个参数,在这是 /dev/ccd0c/dev/ 部分是任选项。 下一个参数是文件系统的插入页(interleave)。插入页定义了一个 磁盘块中一个分段或条带(stripe)的大小,通常是 512 个字节。所以一个为 32 的插入页将是 16,384 字节。 插入页为 &man.ccdconfig.8; 附带了标记。如果您要启用驱动器镜像, 需要在这儿指定它。在这个配置中没有做 &man.ccd.4; 的镜像,所以把它 设为 0 (zero)。 &man.ccdconfig.8; 的最后配置是设备的排列问题。使用完整的设备 路径名。 运行 &man.ccdconfig.8; 后 &man.ccd.4; 就配置好了。现在要创建文件 系统了,参考 &man.newfs.8; 选项,执行下同的命令: newfs /dev/ccd0c 自动创建 最后,要挂上 &man.ccd.4; ,需要先配置它。把当前的配置文件写入 /etc/ccd.conf 中,使用下面的命令: ccdconfig -g > /etc/ccd.conf 当重新启动系统时,如果 /etc/ccd.conf 存在, 脚本 /etc/rc 就运行 ccdconfig -C。 这样就能自动配置 &man.ccd.4; 以到它能被挂上。 如果启动进入了单用户模式,在 &man.mount.8; 上 &man.ccd.4; 之前,需要执行下面的命令来配置队列: ccdconfig -C 要自动挂接 &man.ccd.4;,需要为 &man.ccd.4; 在 /etc/fstab 中配置一个记录,以便在启动时它能被挂上。 如下所示: /dev/ccd0c /media ufs rw 2 2 Vinum 卷管理 RAIDsoftware RAID Vinum Vinum 卷管理是一个实现虚拟磁盘的块驱动设备工具。它使磁盘从 块设备的接口和数据映射中独立出来。与传统的存储设备相比,增加了 灵活性、性能和可靠性。 &man.vinum.8; 实现了 RAID-0、RAID-1 和 RAID-5 三种模式,它们既可以独立使用,也可组合使用。 参考 得到更多 &man.vinum.8; 的信息。 硬件 RAID RAID hardware FreeBSD 支持很多硬件 RAID 控制器。 这些硬件不需要 FreeBSD 指定软件来管理 RAID 系统。 使用 BIOS 支持的硬件,一般情况下这些硬件可以自行操作。 下面是一个简明的描述设置一个 Promise IDE RAID 控制器。 当硬件设备装好且系统重启后,屏幕上显示一个询问信息。接着进入硬件设置屏幕。在这里, 您可以把所有的磁盘联合在一起使用。这样 FreeBSD 将磁盘看作一个驱动器。其它 级别的 RAID 也可以相应的进行设置。 重建 ATA RAID1 阵列 FreeBSD 允许您热插拔阵列中损坏的磁盘。 在您重新启动系统之前请注意这一点。 您可能会在 /var/log/messages 或者在 &man.dmesg.8; 的输出中看到类似下面这些的内容: ad6 on monster1 suffered a hard error. ad6: READ command timeout tag=0 serv=0 - resetting ad6: trying fallback to PIO mode ata3: resetting devices .. done ad6: hard error reading fsbn 1116119 of 0-7 (ad6 bn 1116119; cn 1107 tn 4 sn 11)\\ status=59 error=40 ar0: WARNING - mirror lost 使用 &man.atacontrol.8;,查看更多的信息: &prompt.root; atacontrol list ATA channel 0: Master: no device present Slave: acd0 <HL-DT-ST CD-ROM GCR-8520B/1.00> ATA/ATAPI rev 0 ATA channel 1: Master: no device present Slave: no device present ATA channel 2: Master: ad4 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5 Slave: no device present ATA channel 3: Master: ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5 Slave: no device present &prompt.root; atacontrol status ar0 ar0: ATA RAID1 subdisks: ad4 ad6 status: DEGRADED 首先您应将包含故障盘的 ata 通道卸下, 以便安全地将其拆除: &prompt.root; atacontrol detach ata3 换上磁盘 重新挂接 ata 通道: &prompt.root; atacontrol attach ata3 Master: ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5 Slave: no device present 将新盘作为热备盘加入阵列: &prompt.root; atacontrol addspare ar0 ad6 重建阵列: &prompt.root; atacontrol rebuild ar0 可以通过下面的命令来查看进度: &prompt.root; dmesg | tail -10 [output removed] ad6: removed from configuration ad6: deleted from ar0 disk1 ad6: inserted into ar0 disk1 as spare &prompt.root; atacontrol status ar0 ar0: ATA RAID1 subdisks: ad4 ad6 status: REBUILDING 0% completed 等待操作完成。 Marc Fonvieille Contributed by USB 存储设备 USB disks 到目前为止,有许多外部外部存储解决方案, 例如:通用串行总线 (USB):硬盘、USB thumbdrives、CD-R burners 等等。 &os; 为这些设备提供了支持。 配置 USB 大容量存储设备驱动,在 &man.umass.4;, 中提供了对 USB 存储设备的支持。如果您使用 GENERIC 内核,您不必要改变配置文件里的任何内容。 如果您使用了定制的内核,就要确定下面的行出现在您的内核配置文件里: device scbus device da device pass device uhci device ohci device usb device umass &man.umass.4; 驱动程序使用 SCSI 子系统来访问 USB 存储设备, 您的 USB 设备将被系统看成为一个 SCSI 设备。依靠您主板上的 USB 芯片, 您只须选择 device uhcidevice ohci 二者之一即可, 但是两者都加入内核配置文件当中也没有坏外。 不要忘了如果您加入了上面的几行要重新编译和安装内核。 如果您的 USB 设备是一个 CD-R 或 DVD 刻录机, SCSI CD-ROM 驱动程序, &man.cd.4;, 就必须加入内核中通过下面这行: device cd 由于刻录机被视为 SCSI 设备, 因此, 不应该在内核配置文件中使用 &man.atapicam.4; 驱动程序。 在 &os; 中已经提供了对 USB 2.0 控制器的内建支持; 然而, 您必须在编译内核时在配置中加入: device ehci 注意, 如果需要 USB 1.X 的支持, 您仍需要使用 &man.uhci.4; 和 &man.ohci.4; 驱动程序。 测试配置 配置好后准备进行测试:插入您的 USB 设备, 在系统信息中 (&man.dmesg.8;), 应该会出现像下面的设备: umass0: USB Solid state disk, rev 1.10/1.00, addr 2 GEOM: create disk da0 dp=0xc2d74850 da0 at umass-sim0 bus 0 target 0 lun 0 da0: <Generic Traveling Disk 1.11> Removable Direct Access SCSI-2 device da0: 1.000MB/s transfers da0: 126MB (258048 512 byte sectors: 64H 32S/T 126C) 当然啦,商标,设备标识 (da0) 和其它的细节信息会根据您的配置不同 而有所不同。 因为 USB 设备被看作 SCSI 设备中的一个, camcontrol 命令也能够用来列出 USB 存储设备和系统的关联: &prompt.root; camcontrol devlist <Generic Traveling Disk 1.11> at scbus0 target 0 lun 0 (da0,pass0) 如果设备上已经包含了文件系统, 现在应该就可以挂接它了。 如果需要, 请参阅 来了解如何在 USB驱动器上格式化和创建分区。 如果希望设备能够被普通用户挂接, 还需要做一些其它操作。 首先, 在 USB 存储设备连接到计算机上时, 系统自动生成的设备文件, 必须是该用户能够读写的。 一种做法是让所有属于 operator 组的用户都可以访问该设备。 要完成这项工作, 首先需要用 &man.pw.8; 来给用户指定组。 其次, 在生成设备文件时, operator 组应能读写它们。 这可以通过在 /etc/devfs.rules 中增加一些相应的设置来实现: [localrules=1] add path 'da*' mode 0660 group operator 如果系统中已经有其它 SCSI 磁盘, 则上述操作必须做一些变化。 例如, 如果系统中已经存在了设备名为 da0da2 的磁盘, 则第二行应改为: add path 'da[3-9]*' mode 0660 group operator 这会将系统中已经存在的磁盘, 排除在属于 operator 组的设备之外。 另外, 您还需要在 /etc/rc.conf 文件中, 启用 &man.devfs.rules.5; 规则集: devfs_system_ruleset="localrules" 接下来, 需要配置内核, 令普通用户能够挂接文件系统。 最简单的方法是将下面的配置加入到 /etc/sysctl.conf vfs.usermount=1 注意, 这个设置只有在下次重启系统时才会生效。 另外, 您也可以使用 &man.sysctl.8; 来设置这个变量。 最后一步是创建将要挂接文件系统的目录。 这个目录必须是属于将要挂接文件系统的用户的。 以 root 身份为用户建立属于该用户的 /mnt/$USER (此处 $USER 应替换成用户的登录名): &prompt.root; mkdir /mnt/$USER &prompt.root; chown $USER:$USER /mnt/$USER 假设已经插入了一个 USB 读卡设备, 并且系统将其识别为 /dev/da0s1, 由于这些设备通常是 FAT 文件系统, 用户可以这样挂接它们: - &prompt.user; mount_msdosfs -m 644 -M 755 /dev/da0s1 /mnt/$USER + &prompt.user; mount -t msdosfs -m 644 -M 755 /dev/da0s1 /mnt/$USER 如果拔出设备 (必须首先将其对应的磁盘卷卸下), 则您会在系统消息缓冲区中看到类似下面的信息: umass0: at uhub0 port 1 (addr 2) disconnected (da0:umass-sim0:0:0:0): lost device (da0:umass-sim0:0:0:0): removing device entry GEOM: destroy disk da0 dp=0xc2d74850 umass0: detached 深入阅读 除了 Adding Disks 和 Mounting and Unmounting File Systems 章之外,阅读 &man.umass.4;, &man.camcontrol.8;, 和 &man.usbdevs.8; 也是很有益的。 Mike Meyer Contributed by 创建和使用光学介质(CD) CDROMs creating 介绍 CD 与普通的磁盘相比有很多不同的特性。最初它们是不能被用户写入的。 由于没有磁头和磁道移动时的延迟,所以它们可以连续的进行读取。 方便的在两个系统之间进行数据的传输,比起相同大小的存储介质来说。 CD 有磁道,这关系到数据读取时的连续性而不是物理磁盘的性能。 要在 FreeBSD 中制作一个 CD,您要准备好要写到 CD 上的数据文件, 然后根据每个 tracks 写入到 CD。 ISO 9660 文件系统 ISO 9660 ISO 9660 文件系统被设计用来处理这些差异。 但令人遗憾的是, 它也有一些其他文件系统所没有的限制, 不过幸运的是, 它提供了一项扩展机制, 使得正确写入的 CD 能够超越这些限制, 而又能在不支持这些扩展的系统上正常使用。 sysutils/cdrtools sysutils/ port 包括了 &man.mkisofs.8;, 这是一个可以用来生成包含 ISO 9660 文件系统的数据文件的程序。 他也提供了对于一些扩展的支持选项,下面将详细介绍。 CD burner (刻录机) ATAPI 使用哪个工具来刻录 CD 取决于您的 CD 刻录机是 ATAPI 的, 还是其他类型的。 对于 ATAPI CD 刻录机, 可以使用基本系统附带的 burncd 程序。 SCSI 和 USB CD 刻录机, 则需要配合 cdrecord 程序使用, 它可以通过 sysutils/cdrtools port 安装。 除此之外, 在 ATAPI 接口的刻录机上, 也可以配合 ATAPI/CAM 模块 来使用 cdrecord 以及其它为 SCSI 刻录机撰写的工具。 如果您想使用带图形界面的 CD 刻录软件, 可以考虑一下 X-CD-RoastK3b。 这些工具可以通过使用预编译安装包, 或通过 sysutils/xcdroastsysutils/k3b ports 来安装。 X-CD-RoastK3b 需要 ATAPI/CAM 模块 配合 ATAPI 硬件。 mkisofs &man.mkisofs.8; 程序作为 sysutils/cdrtools port 的一部分, 将生成 ISO 9660 文件系统,其中包含 &unix; 命名空间中的文件名。 最简单的用法是: &prompt.root; mkisofs -o imagefile.iso /path/to/tree 文件系统 ISO 9660 这个命令将创建一个包含 ISO9660 文件系统的 imagefile.iso 文件,它是目录树 /path/to/tree 的一个副本。 在处理过程中, 它将文件名称映射为标准的 ISO9660 文件系统的文件名,将排除那些不典型的 ISO 文件系统的文件。 文件系统 HFS 文件系统 Joliet 有很多选项能够用来克服那些限制。特别的, 选项能够启用 Rock Ridge 扩展一般的 &unix; 系统, 选项能启用用于 Microsoft 系统的 Joliet 扩展, 选项能用来创建用于 &macos; 系统的 HFS 文件系统。 对于那些即将要在 FreeBSD 系统中使用 CD 的人来说, 选项能用来消除所有文件名的限制。当使用 选项时,它会产生一个 文件系统映像,它与您从那儿启动 FreeBSD 树是一样的,虽然它在许多方面也违反了 ISO 9660 的标准。 CDROMs 创建启动光盘 最后一个常用的选项是 。 它用来指定启动映像的位置, 用以生成 El Torito 启动 CD。 这个选项使用一个参数, 用以指定将写入 CD 的目录的根。 默认情况下, &man.mkisofs.8; 会以常说的 软盘模拟 方式来创建 ISO, 因此它希望引导映像文件的尺寸恰好是 1200, 1440 或 2880 KB。 某些引导加载器, 例如 FreeBSD 发行版磁盘, 并不使用模拟模式; 这种情况下, 需要使用 选项。 因此, 如果 /tmp/myboot 是一个包含了启动映像文件 /tmp/myboot/boot/cdboot 的可引导的 FreeBSD 系统, 您就可以使用下面的命令生成 ISO 9660 文件系统映像 /tmp/bootable.iso &prompt.root; mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot 完成这些工作之后, 如果您的内核中配置了 md, 就可以用下列命令来挂接文件系统了: &prompt.root; mdconfig -a -t vnode -f /tmp/bootable.iso -u 0 &prompt.root; mount -t cd9660 /dev/md0 /mnt 可以发现 /mnt/tmp/myboot 是一样的。 还可以使用 &man.mkisofs.8; 的其它选项来调整它的行为。特别是修改 ISO 9660 的划分格式,创建 Joliet 和 HFS 格式的磁盘。查看 &man.mkisofs.8; 联机手册得到更多的帮助。 burncd CDROMs burning 如果用的是 ATAPI 的 CD 刻录机,可以使用 burncd  命令来刻录您的 CD ISO 映像文件。 burncd 命令是基本  系统的一部分,中以使用 /usr/sbin/burncd 来安装。  用法如下: &prompt.root; burncd -f cddevice data imagefile.iso fixate cddevice 上刻录一份 imagefile.iso 的副本。 默认的设备是 /dev/acd0。 请参考 &man.burncd.8; 以了解设置写入速度的参数,如何在刻录完成之后自动弹出CD,以及刻录音频数据。 cdrecord 如果没有一个 ATAPI CD 刻录机,必须使用 cdrecord 来刻录您的 CD 。 cdrecord 不是基本系统的一部分;必须 从 sysutils/cdrtools 或适当的 package 安装它。基本系统的变化可能会引起这个程序的错误。可能是由 coaster 引起的。当升级系统时,同时需要升级 port, 或者如果您 使用 -STABLE, 那么在升级到新版本时也要升级 port。 cdrecord 有许多选项,基本用法与 burncd 相似。刻录一个 ISO 9660 映像文件只需这样做: &prompt.root; cdrecord dev=device imagefile.iso 使用 cdrecord 的比较巧妙的方法是找到使用的 。要找到正确的设置,可以使用 cdrecord 标记,这会产生这样的结果: CDROMs burning &prompt.root; cdrecord -scanbus Cdrecord-Clone 2.01 (i386-unknown-freebsd7.0) Copyright (C) 1995-2004 Jörg Schilling Using libscg version 'schily-0.1' scsibus0: 0,0,0 0) 'SEAGATE ' 'ST39236LW ' '0004' Disk 0,1,0 1) 'SEAGATE ' 'ST39173W ' '5958' Disk 0,2,0 2) * 0,3,0 3) 'iomega ' 'jaz 1GB ' 'J.86' Removable Disk 0,4,0 4) 'NEC ' 'CD-ROM DRIVE:466' '1.26' Removable CD-ROM 0,5,0 5) * 0,6,0 6) * 0,7,0 7) * scsibus1: 1,0,0 100) * 1,1,0 101) * 1,2,0 102) * 1,3,0 103) * 1,4,0 104) * 1,5,0 105) 'YAMAHA ' 'CRW4260 ' '1.0q' Removable CD-ROM 1,6,0 106) 'ARTEC ' 'AM12S ' '1.06' Scanner 1,7,0 107) * 这个列表列出了设备的的适当的 值。找到您的 CD burner ,使用三个用逗号分隔的数值来表示 .在 这个例子中,CRW 是 ,所以正确的输入应是 dev=1,5,0 。有一个很容易的方法可以指定这个值;看看 &man.cdrecord.1; 的介绍了解有关音轨,控制速度和其他的东西。 复制音频 CD 您可以这样复制 CD,把 CD 上面的音频数据解压缩出一系列的文件, 再把这些文件写到一张空白 CD 上。 这个过程对于 ATAPI 和 SCSI 驱动器来说有些微的不同。 SCSI 驱动器 使用 cdda2wav 来解压缩音频。 &prompt.user; cdda2wav -v255 -D2,0 -B -Owav 使用 cdrecord 来写 .wav 文件。 &prompt.user; cdrecord -v dev=2,0 -dao -useinfo *.wav 确保 2,0 被适当地设置了, 具体方法在 中有所描述。 ATAPI 驱动器 ATAPI CD 驱动用 /dev/acddtnn表示每个轨道, 这里 d 是驱动器号, nn 是轨道号,由两位小数位组成,省略前缀零。 所以第一个盘片上的第一个轨道就是 /dev/acd0t01,第二个就是 /dev/acd0t02,第三个就是 /dev/acd0t03,等等。 请务必确认在 /dev 中出现了对应的文件。 如果您发现有某些项目缺失, 则应强制系统重新识别介质: &prompt.root; dd if=/dev/acd0 of=/dev/null count=1 使用 &man.dd.1; 解压缩每个轨道。当解压缩文件的时候您也必须使用 一个特殊的块大小。 &prompt.root; dd if=/dev/acd0t01 of=track1.cdr bs=2352 &prompt.root; dd if=/dev/acd0t02 of=track2.cdr bs=2352 ... 使用 burncd 把解压缩的文件刻录到光盘上。您必须指定 这些文件是音频文件,这样 burncd 会在刻录完成时 结束光盘。 &prompt.root; burncd -f /dev/acd0 audio track1.cdr track2.cdr ... fixate 复制数据 CD 您可以把数据 CD 复制成一个与之等价的映像文件, 可以使用 &man.mkisofs.8; 创建这种文件, 或使用它来复制任何数据 CD。 这里给出的例子假定您的 CDROM 设备是 acd0, 您应将其替换为您实际使用的 CDROM 设备。 &prompt.root; dd if=/dev/acd0 of=file.iso bs=2048 现在您有一个映像文件了,您可以像上面描述的那样把它刻录成 CD。 使用数据 CD 现在您已经创建了一张标准的数据 CDROM,您或许想要 挂载来读取上面的设备。 默认情况下,&man.mount.8; 假定文件系统是 ufs 类型的。如果您尝试下面的命令: &prompt.root; mount /dev/cd0 /mnt 您会得到一条 Incorrect super block 的错误信息,没有挂载成功。CDROM 不是 UFS 文件系统,所以试图这样挂载它是 是不行的。您需要告诉 &man.mount.8; 文件系统是 ISO9660 类型的,这样 就可以了。只需要指定 &man.mount.8; 的 选项。例如, 如果您想要挂载 CDROM 设备, /dev/cd0/mnt 目录,您需要执行: &prompt.root; mount -t cd9660 /dev/cd0 /mnt 注意您的设备名 (在这个例子中是 /dev/cd0)可能 有所不同,取决于您的 CDROM 使用的接口。另外, 选项等同于执行 &man.mount.cd9660.8;。上面的例子可以缩短 为: &prompt.root; mount_cd9660 /dev/cd0 /mnt 用这种方法您基本可以使用任何买到的数据 CDROM。 然而某些有 ISO 9660 扩展的光盘可能会行为古怪。 例如,joliet 光盘用两个字节的 unicode 字符存储所有的文件名。 FreeBSD 内核并不使用 Unicode, 但 &os; CD9660 驱动可以将 Unicode 字符自动转换为内核可以识别的形式。 如果您发现有些非英文字符显示为问号, 就绪要使用 选项来指定字符集了。 欲了解进一步的详情, 请参见联机手册 &man.mount.cd9660.8;。 如果希望通过 选项来进行字符集转换, 则内核会需要加载 cd9660_iconv.ko 模块。 这项工作可以通过在 loader.conf 中加入下列配置: cd9660_iconv_load="YES" 并重新启动计算机来完成, 除此之外, 也可以通过 &man.kldload.8; 来手动加载。 有时候,当您试图挂载 CDROM 的时候,会得到一条 Device not configured 的错误信息。这通常 表明 CDROM 驱动认为托盘里没有光盘, 或者驱动器在总线上不可见。 需要几秒钟时间等待 CDROM 驱动器辨别已经接到反馈的信息, 请耐心等待。 有时候,SCSI CDROM 可能会找不到,因为没有足够的 时间来应答总线的 reset 信号。如果您有一个 SCSI CDROM 请将下面的选项添加到您的内核 配置文件并重建您的内核。 options SCSI_DELAY=15000 这个告诉您的 SCSI 总线启动时暂停 15 秒钟, 给您的 CDROM 驱动器足够的机会来应答 总线 reset 信号。 刻录原始数据 CD 您可以选择把一个文件目录刻录到 CD 上而不用 创建 ISO 9660 文件系统。有些人这么做是为了备份的 目的。这个运行的比刻录一个标准 CD 速度要快得多: &prompt.root; burncd -f /dev/acd1 -s 12 data archive.tar.gz fixate 要重新找回这样刻录到 CD 上的数据, 您必须从原始设备节点读取数据: &prompt.root; tar xzvf /dev/acd1 您不能像挂载一个通常的 CDROM 一样挂载这张光盘。 这样的 CDROM 也不能在除了 FreeBSD 之外的任何操作系统上读出。 如果您想要可以挂载 CD,或者 和另一种操作系统共享数据,您必须像上面描述的那样使用 &man.mkisofs.8;。 Marc Fonvieille Contributed by CD burner ATAPI/CAM driver 使用 ATAPI/CAM 驱动 这个驱动允许 ATAPI 设备(CD-ROM, CD-RW, DVD 驱动器等...)通过 SCSI 子系统访问, 这样允许使用像 sysutils/cdrdao 或者 &man.cdrecord.1; 这样的程序。 要使用这个驱动, 您需要把下面这行添加到 /boot/loader.conf 文件中: atapicam_load="YES" 接下来, 重新启动计算机。 如果您希望将 &man.atapicam.4; 以静态联编的形式加入内核, 则需要在内核配置文件中加入这行: device atapicam 此外还需要在内核配置文件中加入: device ata device scbus device cd device pass 这些应该已经有了。 然后, 重新联编并安装新内核, 并重新启动计算机。 在引导过程中, 您的刻录机将会出现在内核的提示信息中, 就像这样: acd0: CD-RW <MATSHITA CD-RW/DVD-ROM UJDA740> at ata1-master PIO4 cd0 at ata1 bus 0 target 0 lun 0 cd0: <MATSHITA CDRW/DVD UJDA740 1.00> Removable CD-ROM SCSI-0 device cd0: 16.000MB/s transfers cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closed 驱动器现在可以通过 /dev/cd0 设备名访问了,例如要 挂载 CD-ROM 到 /mnt,只需要键入下面的 命令: &prompt.root; mount -t cd9660 /dev/cd0 /mnt 作为 root,您可以运行下面的 命令来得到刻录机的 SCSI 地址: &prompt.root; camcontrol devlist <MATSHITA CDRW/DVD UJDA740 1.00> at scbus1 target 0 lun 0 (pass0,cd0) 这样 1,0,0 就是 SCSI 地址了,可以被 &man.cdrecord.1; 和其他的 SCSI 程序使用。 有关 ATAPI/CAM 和 SCSI 系统的更多信息, 可以参阅 &man.atapicam.4; 和 &man.cam.4; 手册 页。 Marc Fonvieille Contributed by Andy Polyakov With inputs from 创建和使用光学介质(DVD) DVD burning 介绍 和 CD 相比,DVD 是下一代光学存储介质技术。 DVD 可以容纳比任何 CD 更多的数据,已经成为现今视频出版业的标准。 我们称作可记录 DVD 的有五种物理记录格式: DVD-R:这是第一种可用的 DVD 可记录格式。 DVD-R 标准由 DVD Forum 定义。 这种格式是一次可写的。 DVD-RW:这是 DVD-R 标准的可覆写版本。 一张 DVD-RW 可以被覆写大约 1000 次。 DVD-RAM:这也是一种被 DVD Forum 所支持的可覆写格式。 DVD-RAM 可以被看作一种可移动硬盘。 然而,这种介质和大部分 DVD-ROM 驱动器以及 DVD-Video 播放器不兼容; 只有少数 DVD 刻录机支持 DVD-RAM。 请参阅 以了解关于如何使用 DVD-RAM 的进一步详情。 DVD+RW:这是一种由 DVD+RW Alliance 定义的可覆写格式。一张 DVD+RW 可以被覆写大约 1000 次。 DVD+R:这种格式是 DVD+RW 格式的一次可写变种。 一张单层的可记录 DVD 可以存储 4,700,000,000  字节,相当于 4.38 GB 或者说 4485 MB (1 千字节等于 1024 字节)。 必须说明一下物理介质与应用程序的分歧。 例如 DVD-Video 是一种特殊的文件系统, 可以被覆写到任何可记录的 DVD 物理介质上: DVD-R、DVD+R、DVD-RW 等等。在选择介质类型之前, 您一定要确认刻录机和 DVD-Video 播放器 (一种单独的播放器或者计算机上的 DVD-ROM 驱动器) 是和这种介质兼容的。 配置 &man.growisofs.1; 将被用来实施 DVD 刻录。 这个命令是 dvd+rw-tools 工具集 (sysutils/dvd+rw-tools) 的一部分。 dvd+rw-tools 支持所有的 DVD 介质类型。 这些工具将使用 SCSI 子系统来访问设备,因此 ATAPI/CAM 支持 必须加入内核。 如果您的刻录机采用 USB 接口则不需要这么做,请参考 来了解 USB 设备配置的进一步详情。 此外,还需要启用 ATAPI 设备的 DMA 支持。 这一工作可以通过在 /boot/loader.conf 文件中加入下面的行来完成: hw.ata.atapi_dma="1" 试图使用 dvd+rw-tools 之前您应该参考 dvd+rw-tools 硬件兼容性列表 是否有与您的 DVD 刻录机有关的信息。 如果您想要一个图形化的用户界面,您应该看一看 K3b (sysutils/k3b),它提供了 &man.growisofs.1; 的一个友好界面和许多其他刻录工具。 刻录数据 DVD &man.growisofs.1; 命令是 mkisofs 的前端,它会调用 &man.mkisofs.8; 来创建文件系统布局,完成到 DVD 上的刻录。 这意味着您不需要在刻录之前创建数据映像。 要把 /path/to/data 目录的数据刻录到 DVD+R 或者 DVD-R 上面,使用下面的命令: &prompt.root; growisofs -dvd-compat -Z /dev/cd0 -J -R /path/to/data 选项传递给 &man.mkisofs.8; 用于文件系统创建 (这表示创建带有带有 joliet 和 Rock Ridge 扩展的 ISO 9660 文件系统), 参考 &man.mkisofs.8; 联机手册了解更多细节。 选项 用来在任何情况下初始刻录会话: 不管多会话与否。 DVD 设备,/dev/cd0, 必须依照您的配置做出改变。 参数会结束光盘, 光盘成为不可附加的。这会提供更多的和 DVD-ROM 驱动器的介质兼容性。 也可以刻录成一个 pre-mastered 映像, 例如记录一个映像文件 imagefile.iso, 我们可以运行: &prompt.root; growisofs -dvd-compat -Z /dev/cd0=imagefile.iso 刻录的速度可以被检测到并自动进行调整, 根据介质和驱动器的使用情况。如果您想强制改变速度, 可以使用 参数。更多的信息,请看 &man.growisofs.1; 联机手册。 DVD DVD-Video 刻录 DVD-Video DVD-Video 是一种特殊的基于 ISO 9660 和 micro-UDF (M-UDF) 规范的文件系统。 DVD-Video 也呈现了一个特殊的数据格式, 这就是为什么您需要一个特殊的程序像 multimedia/dvdauthor 来制作 DVD 的原因。 如果您已经有了 DVD-Video 文件系统的映像, 就可以以同样的方式制作另一个映像,可以参看前面章节的例子。 如果您想制作 DVD 并想放在特定的目录中,如在目录 /path/to/video 中, 可以使用下面的命令来刻录 DVD-Video: &prompt.root; growisofs -Z /dev/cd0 -dvd-video /path/to/video 选项将传递给 &man.mkisofs.8; 并指示它创建一个 DVD-Video 文件系统布局。 除此之外。 选项也包含了 &man.growisofs.1; 选项。 DVD DVD+RW 使用 DVD+RW 不像 CD-RW, 一个空白的 DVD+RW 在每一次使用前必须先格式化。 &man.growisofs.1; 程序将会适时的自动对其进行适当的处理, 这是 recommended 的方式。您也可以使用 dvd+rw-format 来对 DVD+RW 进行格式化: &prompt.root; dvd+rw-format /dev/cd0 您只需要执行这样的操作一次,牢记只有空白的 DVD+RW 介质才需要格式化。您可以以前面章节同样的方式来刻录 DVD+RW。 如果您想刻录新的数据 (刻录一个新的完整的文件系统 而不仅仅是追加一些数据) 到 DVD+RW,您不必再将其格式化成空白盘, 您只须要直接覆盖掉以前的记录即可。 (执行一个新的初始化对话), 像这样: &prompt.root; growisofs -Z /dev/cd0 -J -R /path/to/newdata DVD+RW 格式化程序为简单的向以前的记录追加数据提供了可能性。 这个操作有一个新的会话和一个已经存在的会话合并而成。 它不需要多个写会话过程, &man.growisofs.1; 将在介质上 增加 ISO 9660 文件系统。 例如,我们想追加一些数据到到我们以前的 DVD+RW 上,我们可以使用下面的命令: &prompt.root; growisofs -M /dev/cd0 -J -R /path/to/nextdata 在以后的写操作时, 应使用与最初的刻录会话时相同的 &man.mkisofs.8; 选项。 如果您想获得与 DVD-ROM 驱动更好的兼容性,可以使用 选项。 在 DVD+RW 这种情况下, 这样做并不妨碍您添加数据。 如果出于某种原因您真的想要空白介质盘, 可以执行下面的命令: &prompt.root; growisofs -Z /dev/cd0=/dev/zero DVD DVD-RW 使用 DVD-RW DVD-RW 接受两种光盘格式:增补顺序写入和受限式覆写。默认的 DVD-RW 盘是顺序写入格式。 空白的 DVD-RW 能够直接进行刻录而不需要格式化操作, 然而非空的顺序写入格式的 DVD-RW 需要格式化才能写入新的初始区段。 要格式化一张 DVD-RW 为顺序写入模式,运行: &prompt.root; dvd+rw-format -blank=full /dev/cd0 一次完全的格式化 () 在 1x 倍速的介质上将会花费大约 1 个小时。快速格式化可以使用 选项来进行,如果 DVD-RW 要以 Disk-At-Once (DAO) 模式刻录的话。要以 DAO 模式刻录 DVD-RW,使用命令: &prompt.root; growisofs -use-the-force-luke=dao -Z /dev/cd0=imagefile.iso 选项不是必需的, 因为 &man.growisofs.1; 试图最低限度的检测 (快速格式化) 介质并进行 DAO 写入。 事实上对于任何 DVD-RW 都应该使用受限式覆写模式, 这种格式比默认的增补顺序写入更加灵活。 在一张顺序 DVD-RW 上写入数据,使用和其他 DVD 格式相同的指令: &prompt.root; growisofs -Z /dev/cd0 -J -R /path/to/data 如果您想在您以前的刻录上附加数据,您必须使用 &man.growisofs.1; 的 选项。然而, 如果您在一张增补顺序写入模式的 DVD-RW 上附加数据, 将会在盘上创建一个新的区段,结果就是一张多区段光盘。 受限式覆写格式的 DVD-RW 在新的初始化区段前不需要格式化, 您只是要用 选项覆写光盘,这和 DVD+RW 的情形是相似的。也可以用和 DVD+RW 同样方式的 选项把现存的 ISO 9660 文件系统写入光盘。 结果会是一张单区段 DVD。 要把 DVD-RW 置于受限式覆写格式, 必须使用下面的命令: &prompt.root; dvd+rw-format /dev/cd0 更改回顺序写入模式使用: &prompt.root; dvd+rw-format -blank=full /dev/cd0 多区段 几乎没有哪个 DVD-ROM 驱动器支持多区段 DVD,它们大多数时候都只读取第一个区段。 顺序写入格式的 DVD+R、DVD-R 和 DVD-RW 可以支持多区段, DVD+RW 和 DVD-RW 受限式覆写格式不存在多区段的概念。 在 DVD+R、DVD-R 或者 DVD-RW 的顺序写入格式下, 一次初始化 (未关闭) 区段之后使用下面的命令, 将会在光盘上添加一个新的区段: &prompt.root; growisofs -M /dev/cd0 -J -R /path/to/nextdata 对 DVD+RW 或者 DVD-RW 在受限式覆写模式下使用这条命令, 会合并新区段到存在的区段中来附加数据。 结果就是一张单区段光盘。 这是在这些介质上用于在最初的写操作之后添加数据的方式。 介质上的一些空间用于区段之间区段的开始与结束。 因此,应该用大量的数据添加区段来优化介质空间。 对于 DVD+R 来说区段的数量限制为 154, 对于 DVD-R 来说大约是 2000,对于双层 DVD+R 来说是 127。 更多的信息 要获得更多的关于 DVD 的信息 dvd+rw-mediainfo /dev/cd0 命令可以运行来获得 更多的信息。 更多的关于 dvd+rw-tools 的信息可以在 &man.growisofs.1; 联机手册找到,在 dvd+rw-tools web sitecdwrite mailing list 联接中也可找到。 dvd+rw-mediainfo 命令的输出结果记录, 以及介质的问题会被用来做问题报告。 如果没有这些输出, 就很难帮您解决问题。 使用 DVD-RAM DVD DVD-RAM 配置 DVD-RAM 刻录机通常使用 SCSI 或 ATAPI 两种接口之一。 对于 ATAPI 设备, DMA 传输模式必须手工启用。 这一工作可以通过在 /boot/loader.conf 文件中增加下述配置来完成: hw.ata.atapi_dma="1" 初始化介质 如本章前面的介绍所言, DVD-RAM 可以视为一移动硬盘。 与任何其它型号的移动硬盘类似, 首次使用它之前, 应首先 初始化 DVD-RAM。 在下面的例子中, 我们将在全部空间上使用标准的 UFS2 文件系统: &prompt.root; dd if=/dev/zero of=/dev/acd0 count=2 &prompt.root; bsdlabel -Bw acd0 &prompt.root; newfs /dev/acd0 您应根据实际情况将 acd0 改为您所使用的设备名。 使用介质 一旦您在 DVD-RAM 上完成了前面的操作, 就可以像普通的硬盘一样挂接它了: &prompt.root; mount /dev/acd0 /mnt 然后就可以正常地对 DVD-RAM 进行读写了。 Julio Merino 原作 Martin Karlsson 重写 创建和使用软盘 把数据存储在软盘上有时也是十分有用的。 例如, 在没有其它可靠的存储介质, 或只需将少量数据传到其他计算机时。 这一章将介绍怎样在 FreeBSD 上使用软盘。 在使用 DOS 3.5 英寸软盘时首要要涉及的就是格式化, 但其概念与其它的软盘格式化极为类似。 格式化软盘 设备 软盘的访问像其它设备一样是通过在 /dev 中的条目来实现的。 直接访问软盘时, 只需简单地使用 /dev/fdN 来表示。 格式化 一张软盘在使用这前必须先被低级格式化。 通常卖主已经做过了,但格式化是检测介质完整性的一种好方法。 尽管这有可能会强取大量(或少量)的硬盘大小,但 大部分磁盘都能被格式化设计为 1440kB 。 低级格式化软盘你需要使用 &man.fdformat.1; 命令。这个程序需要设备名作为参数。 要留意一切错误信息,这些信息能够帮助你确定 磁盘的好与坏。 软盘的格式化 使用 /dev/fdN 设备来格式化软盘。插入一张新的 3.5 英寸的软盘在你的设备中: &prompt.root; /usr/sbin/fdformat -f 1440 /dev/fd0 磁盘标签 经过低级格式化后, 你需要给它分配一个标签。 这个磁盘标签以后会被删去, 但系统需要使用它来确定磁盘的尺寸。 新的磁盘标签将会接管整个磁盘,会包括所有合适的关于软盘的 geometry 信息。 磁盘标签的 geometry 值列在 /etc/disktab中。 现在可以用下面的方法来使用 &man.bsdlabel.8; 了: - &prompt.root; /sbin/bsdlabel -B -r -w /dev/fd0 fd1440 + &prompt.root; /sbin/bsdlabel -B -w /dev/fd0 fd1440 文件系统 现在对软盘进行高级格式化。 这会在它上面安置一个新的文件系统,可使 FreeBSD 来对它进行读写。 在创建完新的文件系统后,磁盘标签将被消毁,所以如果你想重新格式化磁盘, 你必须重新创建磁盘标签。 软盘的文件系统可以选择 UFS 或 FAT 。 FAT 是通常情况下软盘比较好的选择。 要制作新的文件系统在软盘上,可以使用下面的命令: &prompt.root; /sbin/newfs_msdos /dev/fd0 现在磁盘已经可以进行读取和使用。 使用软盘 要使用软盘,需要先使用 &man.mount.msdosfs.8; 挂接它。 除此之外, 也可以使用在 ports 套件中的 emulators/mtools 程序。 用磁带机备份 tape media 主流的磁带机有 4mm, 8mm, QIC, mini-cartridge 和 DLT。 4mm (DDS: Digital Data Storage) tape media DDS (4mm) tapes tape media QIC tapes 4mm 磁带机正在逐步取代 QIC 成为工作站备份数据的首选设备。 在 Conner 收购了 QIC 磁带机领域领先的制造商 Archive 之后不久, 即不再生产这种磁带机, 这使得这一趋势变得愈加明显。 4mm 的驱动器更加小和安静,但对于数据保存的可靠性仍不及 8mm 驱动器。它要比 8mm 的便宜和小得多 (3 x 2 x 0.5 inches, 76 x 51 x 12 mm) 。和 8mm 的一样,读写关的寿命都不长,因为它们同样使用螺旋式 的方式来读写。 这些设备的数据传输的速度约在 ~150 kB/s 到 ~500 kB/s 之间, 存储空间从 1.3 GB 到 2.0 GB 之间,硬件压缩可使空间加倍。磁带库 单元可以有 6 台磁带机,120 个磁带匣,以自动切换的方式使用同一个磁带柜, 磁带库的容量可达 240 GB 。 DDS-3 标准现在支持的磁带机容量最高可达到 12 GB (或压缩的 24 GB )。 4mm 和 8mm 同样都使用螺旋式读写的方式,所有螺旋式读写的优点及缺点, 都可以在 4mm 和 8mm 磁带机上看到。 磁带在经过 2,000 次的使用或 100 次的全部备份后,就该退休了。 8mm (Exabyte) tape media Exabyte (8mm) tapes 8mm 磁带机是最常见的 SCSI 磁带机,也是磁带交换的最佳选择。几乎每个 工作站都有一台 2 GB 8mm 磁带机。8mm 磁带机可信度高、方便、安静。 卡匣小 (4.8 x 3.3 x 0.6 inches; 122 x 84 x 15 mm)而且不贵。8mm 磁带机 的下边是一个短短的读写头,而读写头的寿命取决于磁带经过读写头时,相对高 速运动情况。 数据传输速度约在 250 kB/s 到 500 kB/s 之间,可存储的空间从 300 MB 到 7 GB,硬件压缩可使空间加倍。磁带库单元可以有 6 台磁 带机,120 个磁带匣,以自动切换的方式使用同一个磁带柜,磁带库的容量可达 840+ GB。 Exabyte Mammoth 模型支持 12 GB 的容量在一个磁带 上(压缩后可达 24 GB )相当于普通磁带的二倍。 数据是使用螺旋式读写的方式记录在磁带上的,读写头和磁带约相差 6 度, 磁带以 270 度缠绕着轴,并抵住读写头,轴适时地旋转,使得磁带具有高密度, 从一端到另一端并可使磁道紧密地分布。 QIC tape media QIC-150 QIC-150 磁带和磁带机可能是最常见的磁带机和介质了。 QIC 磁带机是最便宜的 正规 备份设备。 它的缺点在于介质的价格较高。 QIC 磁带要比 8mm 或 4mm 磁带贵, 每 GB 的数据存储价格可能最高高出 5 倍。 但是, 如果您的需求能够为半打磁带所满足的话, 那么 QIC 可能是明智之选。 QIC 是 常见的磁带机。 每个站点都会有某种密度的 QIC。 这有时是一种麻烦, QIC 有很多在外观上相似(有时一样),但是密度不同的磁带。 QIC 磁带机噪音很大。 它们在寻址以及读写时都会发出声音。 QIC 磁带的规格是 6 x 4 x 0.7 英寸 (152 x 102 x 17 毫米)。 数据传输的速度介于 150 kB/s 到 500 kB/s 之间,可存储的空间 从 40 MB 到 15 GB。较新的 QIC 磁带机具有硬件压缩的功能。 QIC 的使用率愈来愈低,渐渐被 DAT 所取代。 数据以磁道的方式记录在磁带上,磁道数及磁道的宽度会根据容量而有所不同。 通常新的磁带机具有的向后兼容的读取功能(通常也具备写入的功能)。对于数据 的安全性,QIC 具有不错的评价。 磁带机在经过 5,000 次的使用后,就该退休了。 DLT tape media DLT 在这一章列出的磁带机中 DLT 具有最快的数据传输率。 1/2" (12.5mm) 的 磁带包含在单轴的磁带匣 (4 x 4 x 1 inches; 100 x 100 x 25 mm)中。磁带匣 的一边是一个旋转匣道,通过匣道的开合,可以让磁带卷动。磁带匣内只有一个 轴,而本章中所提到的其他磁带匣都是有两个轴的(9磁道磁带机例外)。 数据传输的速度约 1.5 MB/s,是 4mm, 8mm, 或 QIC 磁带机的三倍。 可存储的空间从 10 GB 到 20 GB,具有磁带机数据库。磁带机数据库 单元可以有 1 to 20 台磁带机,5 到 900 个磁带匣,磁带机数据库的容量可达 50 GB 到 9 TB 。 如果要压缩的话,DLT 型 IV 格式的磁带机最高可支持 70 GB 的存储 容量。 数据存储在平行于磁带运行方向的磁道上(就像 QIC 磁带),一次写入两个 磁道。读写头的寿命相当长,每当磁带停止前进,磁带与读写头之间没有相对运动。 AIT tape media AIT AIT 是 Sony 开发的一种新格式,每个磁带最高可以存储 50 GB。磁带 机使用内存芯片来保存磁带上的索引内容。这个索引能够被磁带机驱动器快速阅读 来搜索磁带机上文件所处的位置,而不像其他的磁带机需要花几分钟的时间才能找 到文件。像 SAMS:Alexandria 这样的软件:能够操 作四十或者更多的 AIT 磁带库,直接使用内存芯片来进行通信把内容显示在屏幕上, 以决定把什么文件备份到哪个磁带上,加载和恢复数据。 像这样的库成本大概在 $20,000 美元左右,零售市场可能还要贵一点。 第一次使用新的磁带机 当在一块完全空白的磁带上尝试定入数据时,会得到类似下面这样的错误信息: sa0(ncr1:4:0): NOT READY asc:4,1 sa0(ncr1:4:0): Logical unit is in process of becoming ready 信息指出这块磁带没有块编号 (block 编号为 0)。在 QIC-525 之后的所有 QIC 磁带,都采用 QIC-525 标准,必须写入一个 Identifier Block 。对于这种问题, 有以下两种解决的办法: mt fsf 1 可以让磁带机对磁带写入 Identifier Block 。 使用面板上的按钮磁带。 再插入一次,并存储 dump 数据到磁带上。 这时dump 将传回 DUMP: End of tape detected ,然后您会得到这样的错误信息: HARDWARE FAILURE info:280 asc:80,96 这时用 mt rewind 来倒转磁带。 磁带操作的后续操作就完成了。 用软盘备份 能够使用软盘来备份数据吗 backup floppies floppy disks 软磁盘通常是用来备份的设备中不太合适的设备: 这种设备不太可靠,特别是长期使用。 备份和恢复都很慢 它们只有非常有限的存储容量。 然而,如果没有其它的备份数据的方法,那软盘备份总比没有备份要好。 如果必须使用软盘的话,必须确保盘片的质量。软盘在办公室中使用已经有许多 年了。最好使用一些名牌厂商的产品以确保质量。 如何备份数据到软盘 最好的备份数据到软盘的方法是使用 &man.tar.1; 程序加上 选项, 它可以允许数据备份到多张软盘上。 要备份当前目录中所有的文件可以使用这个命令 (需要有 root权限): &prompt.root; tar Mcvf /dev/fd0 * 当第一张盘满的时候, &man.tar.1; 会指示您插入下一张盘,插入第二张盘之后就按回车。 Prepare volume #2 for /dev/fd0 and hit return: 这个步骤可能需要重复很多次,直到这些文件备份完成为止。 可以压缩备份吗 tar gzip compression 不幸的是,&man.tar.1; 在为多卷文件作备份时是不允许使用 选项的。当然,可以用 &man.gzip.1; 压缩所有的文件,把它们打包到磁盘,以后在用 &man.gunzip.1; 解开。 如何恢复备份 要恢复所有文件: &prompt.root; tar Mxvf /dev/fd0 有两种方法来恢复软盘中的个别文件。首先,就要用第一张软盘启动: &prompt.root; tar Mxvf /dev/fd0 filename &man.tar.1; 程序会提示您插入后面的软盘,直到它找到所需要的文件。 如果您知道哪个文件在哪个盘上,您就可以插入那张盘,然后使用上同同样的命令。 如果软盘上的第一个文件与前面的文件是连续的,那 &man.tar.1; 命令会警告您它无法 恢复,即使您不要求它这样做。 Lowell Gilbert 原作 备份策略 设计备份计划的第一要务是确认以下问题皆已考虑到: 磁盘故障 文件的意外删除 随机的文件损毁 机器完全损毁 (例如火灾), 包括破坏全部在线备份。 针对上述的每个问题采用完全不同的技术来解决是完全可行的。 除了只包含少量几乎没有价值数据的个人系统之外, 一般来说很少有一种技术能够同时兼顾前面所有的需要。 可以采用的技术包括: 对整个系统的数据进行存档, 备份到永久性的离线介质上。 这种方法实际上能够提供针对前面所有问题的保护, 但这样做通常很慢, 而且恢复时会比较麻烦。 您可以将备份置于近线或在线的状态, 然而恢复文件仍然是一个难题, 特别是对没有特权的那些用户而言。 文件系统快照。 这种技术实际上只对无意中删除文件这一种情况有用, 但在这种情况下它会提供 非常大 的帮助, 而且访问迅速, 操作容易。 直接复制整个文件系统和/或磁盘 (例如周期性地对整个机器做 &man.rsync.1;)。 通常这对于在网络上的单一需求最为适用。 要为磁盘故障提供更为通用的保护, 通常这种方法要逊于 RAID。 对于恢复无意中删除的文件来说, 这种方法基本上与 UFS 快照属于同一层次, 使用哪一个取决于您的喜好。 RAID。 它能够最大限度地减少磁盘故障导致的停机时间。 其代价是需要处理更为频繁的磁盘故障 (因为磁盘的数量增加了), 尽管这类故障不再需要作为非常紧急的事项来处理。 检查文件的指纹。 &man.mtree.8; 工具对于这种操作非常有用。 尽管这并不是一种备份的技术, 但它能够确保您有机会注意到那些您需要求助于离线备份的事情。 这对于离线备份非常重要, 而且应有计划地加以检查。 很容易列举更多的技术, 它们中有许多实际上是前面所列出的方法的变种。 特别的需求通常会需要采用特别的技术 (例如, 备份在线运行的数据库, 往往需要数据库软件提供某种方法来完成中间步骤) 来满足。 最重要的事情是, 一定要了解需要将数据保护起来免受何种风险, 以及发生问题时应该如何处理。 备份程序 有三个主要的备份程序 &man.dump.8;、&man.tar.1; 和 &man.cpio.1;。 Dump 和 Restore 备份软件 dump / restore dump restore dumprestore 是 &unix; 传统的备份程序。它以 block 而不是以文件为单位来备份数据、链接或目录。 dump 备份的是设备上的整个文件系统,不能只备份一 一个文件系统的部分或是用到两个以上文件系统的目录树。 dump 不会写文件和目录到磁带机,而是写入包含文件 和目录的原始数据块。 如果在您的 root 目录使用 dump ,将不需要 备份 /home/usr 或其他目录, 因为这些是典型的其他文件系统或符号连接到那些文件系统的加载点。 dump 是最早出现于 AT&T UNIX 的 Version 6 (约 1975)。 默认的参数适用于 9-track 磁带(6250 bpi),所以如果要用高密度的磁带(最高可达 62,182 ftpi),就不能用默认的参数,而要另外指定参数。这些默认值必须在命令行被 修改以更好地利用当前磁带机的功能。 .rhosts rdumprrestore 可以通过网络在另一 台计算机的磁带机上备份数据。这两个程序都是依靠 &man.rcmd.3; 和 &man.ruserok.3; 来访问远程的磁带机。因此,运行备份的用户必须要有远程 主机的 .rhosts 访问权。rdumprrestore 的参数必须适用于远程主机(例如,当您从 FreeBSD 连到 一台 SUN 工作站 knomodo 去使用磁带机时,使用: &prompt.root; /sbin/rdump 0dsbfu 54000 13000 126 komodo:/dev/nsa8 /dev/da0a 2>&1 要注意的是:必须检查您在使用 .rhosts 时的安全情况。 也可以通过使用 ssh 用一个更安全的方式来使用 dumprestore 通过 <application>ssh</application> 使用 <command>dump</command> &prompt.root; /sbin/dump -0uan -f - /usr | gzip -2 | ssh -c blowfish \ targetuser@targetmachine.example.com dd of=/mybigfiles/dump-usr-l0.gz 或使用 dump 的 built-in 方法, 设置环境变量 RSH 通过设置 <application>ssh</application> 环境变量 <envar>RSH</envar> 使用 <command>dump</command> &prompt.root; RSH=/usr/bin/ssh /sbin/dump -0uan -f targetuser@targetmachine.example.com:/dev/sa0 /usr <command>tar</command> 备份软件 tar &man.tar.1; 也同样是在第 6 版 AT&T UNIX (大约是 1975 前后) 出现的。 tar 对文件系统直接操作; 其作用是把文件和目录写入磁带。 tar 并不支持 &man.cpio.1; 所提供的全部功能, 但也不需要 cpio 所需要使用的诡异的命令行管道。 tar 在 FreeBSD 5.3 和更高版本中, 同时提供了 GNU tar 和默认的 bsdtar。 GNU 的版本可以通过 gtar 来使用。 它通过与 rdump 一样的语法来支持远程设备。 要 tar 到连接在名为 komodo 的 Sun 机器上的 Exabyte 磁带机, 可以使用: &prompt.root; /usr/bin/gtar cf komodo:/dev/nsa8 . 2>&1 您也可以让 bsdtar 通过管道和 rsh 将数据发送到远程的磁带机上。 &prompt.root; tar cf - . | rsh hostname dd of=tape-device obs=20b 如果您担心通过网络备份会有安全问题,应当使用 ssh , 而不是 rsh <command>cpio</command> backup software cpio &man.cpio.1; 是 &unix; 最早用来作文件交换的磁带机程序。它有执行字节 交换的选项,可以用几种不同的格式写入,并且可以将数据用管道传给其他程序。 cpio 没办法自动查找目录树内的文件列表,必须通过标准 输入 stdin 来指定。 cpio cpio 不支持通过网络的备份方式。可以使用 pipeline 和 rsh 来传送数据给远程的磁带机。 &prompt.root; for f in directory_list; do find $f >> backup.list done &prompt.root; cpio -v -o --format=newc < backup.list | ssh user@host "cat > backup_device" 这里的 directory_list 是要备份的目录列表, user@host 结合了将 要执行备份的用户名和主机名,backup_device 是写 入备份的设备(如 /dev/nsa0)。 <command>pax</command> backup software pax pax POSIX IEEE &man.pax.1; 是符合 IEEE/&posix; 标准的程序。多年来各种不同版本 的 tarcpio 间有些不兼容。 为了防止这种情况,并使其标准化,&posix; 出了这套新的工具程序。 pax 尝试可以读写各种 cpiotar 的格式,并可以自己增加新的格式。它的命令 集比 tar 更接近 cpio <application>Amanda</application> backup software Amanda Amanda Amanda (Advanced Maryland Network Disk Archiver) 并非单一的程序,而是一个客户机/服务器模式的备份系统 。一台 Amanda 服务器可以备份任意数量执行 Amanda 的客户机或是将连上 Amanda 服务器的计算机上的数据备份到一台磁带机上。一个常见的问题是,数据写入磁带机的时间将超 过取行数据的时间,而 Amanda 解决了这个问题。它使用一个 holding disk 来同时备份几个文件系统。 Amanda 建立 archive sets 的一组磁带,用来备份在 Amanda 的配置文件中所列出的完整的文件系统。 Amanda 配置文件提供完整的备份控制及 Amanda 产生的网络传输。 Amanda 可以使用上述任何一个设备程序来向磁带写入数据。Amanda 可以从 port 或 package 取得,它并非系统默认安装的。 Do Nothing 备份策略 Do nothing 不是一个程序,而是被广泛使用的备份策略。 不需要预算,不需要备份的计划表,全部都不用。如果您的数据发生了什么问题, 忽略它! 如果您的时间和数据不值得您做这些事,那么 Do nothing 将是最好的备份程序。要注意的是,&unix; 是相当好用的工具,您可能在几个月 内,就发现您已经收集了不少对您来说相当具有价值的文件和程序。 Do nothing 对于像 /usr/obj 和其他 可由您的计算机产生的文件来说,是最好的方法。例如这本手册包含有 HTML 或 &postscript; 格式的文件。这些文档格式是从 SGML 输入文件创建的。创建 HTML 或 &postscript; 格式的文件的备份就没有必要了。只要经常备份 SGML 文件就够了。 哪个备份程序最好? LISA 在&man.dump.8; 时期 Elizabeth D. Zwicky 测试了所有以上列出的备份程序。在各种各样怪异的文件系统中, dump 是您明智的选择。Elizabeth 建立起各种各样、 奇怪或常见的文件系统,并用各种备份程序,测试在各种文件系统上备份 及恢复数据。这些怪异之处包括:具有 holes 和一个 nulls block 的文件, 文件名具有有趣字符,无法读写的文件及设备,在备份时改变文件大小,在 备份时建立或删除的文件。她将结果刑在: LISA V in Oct. 1991. See torture-testing Backup and Archive Programs. 应急恢复程序 在出现灾难前 在遇到灾难前,只需要执行以下四个步骤: bsdlabel 第一,打出您的每个磁盘驱动器的磁盘标签 (例如: bsdlabel da0 | lpr),文件系统表, (/etc/fstab) ,以及所有启动信息, 并将其复制两份。 fix-it floppies 第二,确定遇到的情况时,用来启动及修复的软盘 (boot.flpfixit.flp) 具有您所有的设备代号。最简单的方法是用软盘启动,然后检查启动信息, 如果设备都被列出,并且可以正常使用,就可以跳到第三步。 否则,必须建立两张传统的可启动软盘,并包含: fdisk, bsdlabel, newfs, mount, 以及所有使用的 备份程序。这些程序必须被静态的连接。如果使用的是 dump, 那么这张软盘就必须包含 restore 第三,定期将数据备份到磁带。任何在上次备份后的改变都无法恢复。记得将 磁盘写保护。 第四,测试在第二步所建立的软盘及备份的磁带,将过程记录下来,并和这张 可启动的软盘和磁带放在一起。也许您在恢复时会想要,而这份记录将防止您破坏 您的磁带 (怎么说呢?因为您可能将 tar xvf /dev/sa0 打成 tar cvf /dev/sa0 而重写了备份磁带)。 为了安全,您可以每次都做两份备份磁带及一张启动磁盘,并将其中 一份备份磁带存放在其它地方。其它地方不是指同一栋办公大楼的地下室 (世贸中心的一些公司应该学到了一些教训),而是真的要让人的磁带离您 的的计算机远远的。 一个建立启动磁盘的 shell 脚本例子: /mnt/sbin/init gzip -c -best /sbin/fsck > /mnt/sbin/fsck gzip -c -best /sbin/mount > /mnt/sbin/mount gzip -c -best /sbin/halt > /mnt/sbin/halt gzip -c -best /sbin/restore > /mnt/sbin/restore gzip -c -best /bin/sh > /mnt/bin/sh gzip -c -best /bin/sync > /mnt/bin/sync cp /root/.profile /mnt/root cp -f /dev/MAKEDEV /mnt/dev chmod 755 /mnt/dev/MAKEDEV chmod 500 /mnt/sbin/init chmod 555 /mnt/sbin/fsck /mnt/sbin/mount /mnt/sbin/halt chmod 555 /mnt/bin/sh /mnt/bin/sync chmod 6555 /mnt/sbin/restore # # create the devices nodes # cd /mnt/dev ./MAKEDEV std ./MAKEDEV da0 ./MAKEDEV da1 ./MAKEDEV da2 ./MAKEDEV sa0 ./MAKEDEV pty0 cd / # # create minimum file system table # cat > /mnt/etc/fstab < /mnt/etc/passwd < /mnt/etc/master.passwd < 出现灾难后 关键问题是: 您的硬件是否幸免于难? 由于已经做好了定期的备份工作, 因此并不需要担心软件的问题。 如果硬件已经损毁, 这些部分应该在尝试使用计算机之前换掉。 如果硬件还能用, 检查一下您的软盘。 如果使用定制的引导软盘, 启动单用户模式 (在 boot: 提示后输入 -s)。 跳过下面一段。 如果您使用 boot.flpfixit.flp 软盘, 请继续阅读。 将 boot.flp 软盘插到计算机的第一个软驱并启动机器。 此时, 最初的安装菜单将显示在屏幕上。 选择 Fixit--Repair mode with CDROM or floppy. 选项。 在得到提示后插入 fixit.flprestore 以及其他需要的程序, 可以在 /mnt2/rescue (对于 &os; 5.2 之前的版本, 则是 /mnt2/stand)。 分别恢复每一个文件系统 mount root partition bsdlabel newfs 试着 mount 上您的第一个磁盘的 root 分区(例如: mount /dev/da0a /mnt)。假如这个磁盘标签已经损坏,使用 bsdlabel 来重新分割并分配磁盘标签(利用您以前保留下来的数据)。使用 newfs 来建立文件系统,并重新挂上软盘读写的 root 分区 (mount -u -o rw /mnt)。然后使用备份程序及备份磁带来修复文件系统 (例如: restore vrf /dev/sa0)。最后 Unmount 这个文件系统 (例如: umount /mnt)。对于每个损坏的文件系统都重复一次。 当您的系统正常启动后,将您的数据备份到新的磁带。任何造成数据丢失的 的灾难都可能再次发生。现在花一些时间,也许可以使您免于下次的灾难。 * I Did Not Prepare for the Disaster, What Now? ]]> Marc Fonvieille Reorganized and enhanced by 网络、内存和 和以及映像文件为介质的虚拟文件系统 virtual disks 磁盘 虚拟 除了插在您计算机上的物理磁盘: 软盘、 CD、 硬盘驱动器, 等等之外, FreeBSD 还能识别一些其他的磁盘形式 - 虚拟磁盘 NFS Coda disks memory 这还包括, 如 网络文件系统 (Network File System) 和 Coda一类的网络文件系统、 内存以及映像文件为介质的虚拟文件系统。 随运行的 FreeBSD 版本不同, 用来创建和使用以映像文件介质文件系统和内存文件系统的工具也不尽相同。 系统会使用 &man.devfs.5; 来创建设备节点, 这对用户来说是透明的。 以映像文件为介质的文件系统 disks (磁盘) file-backed (采用文件作为介质) 在 FreeBSD 系统中, 可以用 &man.mdconfig.8; 程序来配置和启用内存磁盘, &man.md.4;。 要使用 &man.mdconfig.8;, 就需要在内核配置文件中添加 &man.md.4; 模块来支持它: device md &man.mdconfig.8; 命令支持三种类型的虚拟文件系统: 使用 &man.malloc.9;,来分配内存文件系统,内存文件系统作为文件或作为 备用的交换分区。一种使用方式是在文件中来挂载一个软盘和 CD 镜像。 将一个暨存的映像文件作为文件系统挂载: 使用 <command>mdconfig</command> 挂载已经存在的映像文件 &prompt.root; mdconfig -a -t vnode -f diskimage -u 0 &prompt.root; mount /dev/md0 /mnt 使用 &man.mdconfig.8; 来创建新的映像文件: 使用 <command>mdconfig</command> 将映像文件作为文件系统挂载 &prompt.root; dd if=/dev/zero of=newimage bs=1k count=5k 5120+0 records in 5120+0 records out &prompt.root; mdconfig -a -t vnode -f newimage -u 0 &prompt.root; bsdlabel -w md0 auto &prompt.root; newfs md0a /dev/md0a: 5.0MB (10224 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 1.25MB, 80 blks, 192 inodes. super-block backups (for fsck -b #) at: 160, 2720, 5280, 7840 &prompt.root; mount /dev/md0a /mnt &prompt.root; df /mnt Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/md0a 4710 4 4330 0% /mnt 如果没有通过 选项指定一个标识号 &man.mdconfig.8; 将使用 &man.md.4; 为它自动选择一个未用的设备标识号。 分配给它的标识名将被输出到标准输出设备, 其形式是与 md4 类似。 如果希望了解更多相关信息, 请参见联机手册 &man.mdconfig.8;。 &man.mdconfig.8; 功能很强大, 但在将映像文件作为文件系统挂载时, 仍需使用许多行的命令。 为此 FreeBSD 也提供了一个名为 &man.mdmfs.8; 的工具, 该程序使用 &man.mdconfig.8; 来配置 &man.md.4; 设备, 并用 &man.newfs.8; 在其上创建 UFS 文件系统, 然后用 &man.mount.8; 来完成挂载操作。 例如, 如果想创建和挂接像上面那样的文件系统映像, 只需简单地执行下面的步骤: 使用 <command>mdmfs</command> 命令配置和挂载一个映像文件为文件系统 &prompt.root; dd if=/dev/zero of=newimage bs=1k count=5k 5120+0 records in 5120+0 records out &prompt.root; mdmfs -F newimage -s 5m md0 /mnt &prompt.root; df /mnt Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/md0 4718 4 4338 0% /mnt 如果你使用没有加标识号的 选项, &man.mdmfs.8; 将使用 &man.md.4; 的自动标示号特性来自动为其 选择一个未使用的设备。更详细的 &man.mdmfs.8;,请参考联机手册。 以内存为介质的文件系统 disks (磁盘) 内存文件系统 一般来说, 在建立以内存为介质的文件系统时, 应使用 交换区作为介质 (swap backing)。 使用交换区作为介质, 并不意味着内存盘将被无条件地换出到交换区, 它只是表示将根据需要从可换出的内存池中分配内存。 此外, 也可以使用 &man.malloc.9; 创建以内存作为介质的文件系统。 不过在内存不足时, 这种方式可能引致系统崩溃。 用 <command>mdconfig</command> 创建新的内存盘设备 &prompt.root; mdconfig -a -t swap -s 5m -u 1 &prompt.root; newfs -U md1 /dev/md1: 5.0MB (10240 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 1.27MB, 81 blks, 192 inodes. with soft updates super-block backups (for fsck -b #) at: 160, 2752, 5344, 7936 &prompt.root; mount /dev/md1 /mnt &prompt.root; df /mnt Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/md1 4718 4 4338 0% /mnt 使用 <command>mdmfs</command> 来新建内存介质文件系统 &prompt.root; mdmfs -s 5m md2 /mnt &prompt.root; df /mnt Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/md2 4846 2 4458 0% /mnt 从系统中移除内存盘设备 磁盘 移除内存盘设备 当不再使用内存盘设备时, 应将其资源释放回系统。 第一步操作是卸下文件系统, 然后使用 &man.mdconfig.8; 把虚拟磁盘从系统中分离, 以释放资源。 例如, 要分离并释放所有 /dev/md4 使用的资源, 应使用命令: &prompt.root; mdconfig -d -u 4 mdconfig -l 命令可以列出关于配置 &man.md.4; 设备的信息。 Tom Rhodes Contributed by 文件系统快照 文件系统 快照 FreeBSD 提供了一个和 Soft Updates 关联的新功能: 文件系统快照 快照允许用户创建指定文件系统的映像,并把它们当做一个文件来对待。 快照文件必须在文件系统正在使用时创建,一个用户对每个文件系统创建的 快照不能大于20个。活动的快照文件被记录在超级块中,所以它们可以在系统 启动的时候一块进行挂接后摘掉。当一个快照不再需要时,可以使用标准的 &man.rm.1; 使用来使其删除。快照可以以任何顺序进行移除,但所有使用 的快照不可能同时进行移除,因为其它的快照将有可能互相引用一些块。 不可改的 文件标志, 是由 &man.mksnap.ffs.8; 在完成创建快照文件时设置的。 &man.unlink.1; 命令是一个特例, 以允许删除快照文件。 快照可以通过 &man.mount.8; 命令创建。 将文件系统 /var 的快照放到 /var/snapshot/snap 可以使用下面的命令: &prompt.root; mount -u -o snapshot /var/snapshot/snap /var 作为选择,你也可以使用 &man.mksnap.ffs.8; 来创建一个快照: &prompt.root; mksnap_ffs /var /var/snapshot/snap 可以查找文件系统中的快照文件 (例如 /var), 方法是使用 &man.find.1; 命令: &prompt.root; find /var -flags snapshot 当快照文件被创建好后,可以用于下面一些目的: 有些管理员用文件快照来进行备份, 因为快照可以被转移到 CD 或磁带上。 文件系统一致性检查程序 &man.fsck.8; 可以用来检查快照文件。 如果文件系统在挂接前是一致的, 则检查结果也一定是一致的 (也就是不会做任何修改)。 实际上这也正是后台 &man.fsck.8; 的操作过程。 在快照上运行 &man.dump.8; 程序。 dump 将返回包含文件系统和快照的时间戳。&man.dump.8; 也能够抓取快照,使用 标志可以首先创建快照, 完成 dump 映像之后再自动删除它。 用 &man.mount.8; 来挂接快照作为文件系统的一个冻结的镜像。 要 &man.mount.8; 快照 /var/snapshot/snap 运行: &prompt.root; mdconfig -a -t vnode -f /var/snapshot/snap -u 4 &prompt.root; mount -r /dev/md4 /mnt 现在你就可以看到挂接在 /mnt 目录下的 /var 文件系统的快照。 每一样东西都保存的像它创建时的状态一样。 唯一例外的是更早的快照文件将表现为长度为 0 的文件。 用完快照文件之后可以把它卸下,使用: &prompt.root; umount /mnt &prompt.root; mdconfig -d -u 4 想了解更多关于 和 文件系统快照的信息, 包括技术说明, 可以访问 Marshall Kirk McKusick 的 WWW 站点 文件系统配额 accounting disk space disk quotas 配额是操作系统的一个可选的功能, 它允许管理员以文件系统为单元, 限制分派给用户或组成员所使用的磁盘空间大小或是使用的总文件数量。 这经常被用于那些分时操作的系统上, 对于这些系统而言, 通常希望限制分派到每一个用户或组的资源总量, 从而可以防止某个用户占用所有可用的磁盘空间。 配置系统来启用磁盘配额 在决定使用磁盘配额前,确信磁盘配额已经在内核中配置好了。只要在在内核 中配置文件中添加下面一行就行了: options QUOTA 在默认情况下 GENERIC 内核是不会启用这个功能的, 所以必须配置、重建和安装一个定制的内核。请参考 FreeBSD 内核配置 这章了解更多有关内核配置的信息。 接下来,需要在 /etc/rc.conf 中启用磁盘配额。可以 通过添加下面这行来完成: enable_quotas="YES" disk quotas checking 为了更好的控制配额时的启动,还有另外一个可配置的变量。通常 启动时,集成在每个文件系统上的配额会被配额检查程序 &man.quotacheck.8; 自动检查。配额检查功能能够确保在配额数据库中 的数据正确地反映了文件系统的数 据情况。这是一个很耗时间的处理进程,它会影响系统的启动时间。如果 想跳过这一步,可以在文件 /etc/rc.conf 加入 下面这一行来达到目的: check_quotas="NO" 最后,要编辑 /etc/fstab 文件,以在每一个 文件系统基础上雇用磁盘配额。这是启用用户和组配额,或同时启用用户 和组配额的地方。 要在一个文件系统上启用每个用户的配额,可以在 /etc/fstab 里添加 选项在要雇用配额文件的系统上。例如: /dev/da1s2g /home ufs rw,userquota 1 2 同样的,要启用组配额,使用 选项来代替 选项。要同时启用用户和组配额,可以这样做: /dev/da1s2g /home ufs rw,userquota,groupquota 1 2 默认情况下,配额文件是存放在文件系统的以 quota.userquota.group 命名的根目录下。可以查看 &man.fstab.5; 联机手册了解更多信息。 尽管联机手册 &man.fstab.5; 提到, 可以为配额文件指定其他的位置, 但并不推荐这样做, 因为不同的配额工具并不一定遵循此规则。 到这儿,可以用新内核重新启动系统。 /etc/rc 将自动 运行适当的命令来创建最初的配额文件,所以并不需要手动来创建任何零长度的配额 文件。 在通常的操作过程中,并不要求手动运行 &man.quotacheck.8;、 &man.quotaon.8;, 或 &man.quotaoff.8; 命令,然而可能需要阅读与他们的操作 相似的联机手册。 设置配额限制 disk quotas limits 一旦您配置好了启用配额的系统,可以检查一下它们是真的有用。 可以这样做: &prompt.root; quota -v 您应该能够看到一行当前正在使用的每个文件系统启用的磁盘配额 使用情况的摘要信息。 现在可以使用 &man.edquota.8; 命令准备启用配额限制。 有几个有关如何强制限制用户或组可以分配到的磁盘空间大小的选项。 您可以限制磁盘存储块的配额, 或文件的数量, 甚至同时限制两者。 这些限制最终可分为两类: 硬限制和软限制。 硬性限制 硬性限制是一种不能越过的限制。 一旦用户达到了系统指定的硬性限制, 他就无法在对应的文件系统分配到更多的资源。 例如, 如果文件系统上分给用户的硬性限制是 500 KB, 而现在已经用掉了 490 KB, 那么这个用户最多还能再分配 10 KB 的空间。 换言之, 如果这时试图再分配 11 KB, 则会失败。 软性限制 而与此相反, 软性限制在一段时间内是允许越过的。 这段时间也称为宽限期, 其默认值是一周。 如果一个用户延缓时间太长的话,软限制将会变成硬限制, 而继续分配磁盘空间的操作将被拒绝。 当用户占用的空间回到软性限制值以下时, 宽限期将重新开始计算。 下面是一个运行 &man.edquota.8; 时看到的例子。当 &man.edquota.8; 命令被调用时,会被转移进 EDITOR 环境变量指派的编辑 器中,允许编辑配额限制。如果环境变量没有设置,默认在 vi 编辑器上进行。 &prompt.root; edquota -u test Quotas for user test: /usr: kbytes in use: 65, limits (soft = 50, hard = 75) inodes in use: 7, limits (soft = 50, hard = 60) /usr/var: kbytes in use: 0, limits (soft = 50, hard = 75) inodes in use: 0, limits (soft = 50, hard = 60) 在每一个启用了磁盘配额的文件系统上,通常会看到两行。一行是 block 限制,另一行是 inode 限制。简单地改变要修改的配额限制的值。 例如,提高这个用户软限制的数值到 500 ,硬限制到 600 : /usr: kbytes in use: 65, limits (soft = 50, hard = 75) to: /usr: kbytes in use: 65, limits (soft = 500, hard = 600) 当离开编辑器的时候,新的配额限制设置将会被保存。 有时,在 UIDs 的范围上设置配额限制是非常必要的。这可以通过在 &man.edquota.8; 命令后面加上 选项来完成。首先, 给用户分配所需要的配额限制,然后运行命令 edquota -p protouser startuid-enduid。例如,如果 用户 test 已经有了所需要的配额限制,下面的命令 可以被用来复制那些 UIDs 为10,000 到 19,999 的配额限制: &prompt.root; edquota -p test 10000-19999 更多细节请参考 &man.edquota.8; 联机手册。 检查配额限制和磁盘使用 disk quotas checking 既可以使用 &man.quota.1; 也可以使用 &man.repquota.8; 命令来检查 配额限制和磁盘使用情况。 &man.quota.1; 命令能够检查单个用户和组的配置 使用情况。只有超级用户才可以检查其它用户的配额和磁盘使用情况。 &man.repquota.8; 命令可以用来了解所有配额和磁盘的使用情况。 下面是一个使用 quota -v 命令后的输出情况: Disk quotas for user test (uid 1002): Filesystem usage quota limit grace files quota limit grace /usr 65* 50 75 5days 7 50 60 /usr/var 0 50 75 0 50 60 宽限期 前面以 /usr 作为例子。 此用户目前已经比软限制 50 KB 超出了 15 KB, 还剩下 5 天的宽限期。 请注意, 星号 * 说明用户已经超出了其配额限制。 通常, 如果用户没有使用文件系统上的磁盘空间, 就不会在 &man.quota.1; 命令的输出中显示, 即使已经为那个用户指定了配额。 而使用 选项则会显示它们, 例如前面例子中的 /usr/var 通过 NFS 使用磁盘配额 NFS 配额能够在 NFS 服务器上被配额子系统强迫使用。在 NFS 客户端, &man.rpc.rquotad.8; 命令可以使用 quota 信息用于 &man.quota.1; 命令, 可以允许用户查看它们的 quota 统计信息。 可以这样在 /etc/inetd.conf 中启用 rpc.rquotad rquotad/1 dgram rpc/udp wait root /usr/libexec/rpc.rquotad rpc.rquotad 现在重启 inetd &prompt.root; kill -HUP `cat /var/run/inetd.pid` Lucky Green Contributed by
shamrock@cypherpunks.to
加密磁盘分区 disks encrypting FreeBSD 提供了极好的数据保护措施,防止未受权的数据访问。 文件权限和强制访问控制(MAC)(看 ) 可以帮助预防在操作系统处于运行状态和计算机加电时未受权的第三方访问数据。 但是,和操作系统强制受权不相关的是,如果黑客有物理上访问计算机的可能, 那他就可以简单的把计算机的硬件安装到另一个系统上复制出敏感的数据。 无论攻击者如何取得停机后的硬件或硬盘驱动器本身, &os; GEOM Based Disk Encryption (基于 GEOM 的磁盘加密, gbde)geli 加密子系统都能够保护计算机上的文件系统数据, 使它们免受哪怕是训练有素的攻击者获得有用的资源。 与那些只能加密单个文件的笨重的加密方法不同, gbdegeli 能够透明地加密整个文件系统。 明文数据不会出现在硬盘的任何地方。 使用 <application>gbde</application> 对磁盘进行加密 成为 <username>root</username> 配置 gbde 需要超级用户的权力。 &prompt.user; su - Password: 在内核配置文件中添加对 &man.gbde.4; 的支持 在您的内核配置中加入下面一行: options GEOM_BDE 按照 所进行的介绍重新编译并安装内核。 重新引导进入新的内核。 另一种无需重新编译内核的方法, 是使用 kldload 来加载 &man.gbde.4;: &prompt.root; kldload geom_bde 准备加密盘 下面这个例子假设您添加了一个新的硬盘在您的系统并将拥有一个单独的加密分区。 这个分区将挂接在 /private目录下。 gbde 也可以用来加密 /home/var/mail, 但是这需要更多的复杂命令来执行。 添加新的硬盘 添加新的硬盘到系统中可以查看在 中的说明。 这个例子的目的是说明一个新的硬盘分区已经添加到系统中如: /dev/ad4s1c。在例子中 /dev/ad0s1* 设备代表系统中存在的标准 FreeBSD 分区。 &prompt.root; ls /dev/ad* /dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1 /dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c /dev/ad0s1a /dev/ad0s1d /dev/ad4 创建一个目录来保存 gbde Lock 文件 &prompt.root; mkdir /etc/gbde gbde lock 文件包含了 gbde 需要访问的加密分区的信息。 没有 lock 文件, gbde 将不能解密包含在加密分区上的数据。 每个加密分区使用一个独立的 lock 文件。 初始化 gbde 分区 一个 gbde 分区在使用前必须被初始化, 这个初始化过程只需要执行一次: &prompt.root; gbde init /dev/ad4s1c -i -L /etc/gbde/ad4s1c &man.gbde.8; 将打开您的编辑器, 提示您去设置在一个模板文件中的配置变量。 使用 UFS1 或 UFS2,设置扇区大小为 2048: $FreeBSD: src/sbin/gbde/template.txt,v 1.1 2002/10/20 11:16:13 phk Exp $ # # Sector size is the smallest unit of data which can be read or written. # Making it too small decreases performance and decreases available space. # Making it too large may prevent filesystems from working. 512 is the # minimum and always safe. For UFS, use the fragment size # sector_size = 2048 [...] &man.gbde.8; 将让您输入两次用来加密数据的密钥短语。 两次输入的密钥必须相同。 gbde 保护您数据的能力依靠您选择输入的密钥的质量。 这个提示教您怎样选择一个安全易记的密钥短语, 请看 Diceware Passphrase 网站。 gbde init 命令为您的 gbde 分区创建了一个 lock 文件, 在这个例子中存储在 /etc/gbde/ad4s1c中。 gbde lock 文件 必须 和加密分区上的内容同时备份。 如果发生只有 lock 文件遭到删除的情况时, 就没有办法确定 gbde 分区上的数据是否是解密过的。 另外, 如果没有 lock 文件, 即使磁盘的合法主人, 不经过大量细致的工作也无法访问加密分区上的数据, 而这是在设计 &man.gbde.8; 时完全没有考虑过的。 把加密分区和内核进行关联 &prompt.root; gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c 在加密分区的初始化过程中您将被要求提供一个密码短语。 新的加密设备将在 /dev 中显示为 /dev/device_name.bde &prompt.root; ls /dev/ad* /dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1 /dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c /dev/ad0s1a /dev/ad0s1d /dev/ad4 /dev/ad4s1c.bde 在加密设备上创建文件系统 当加密设备和内核进行关联后, 您就可以使用 &man.newfs.8; 在此设备上创建文件系统, 使用 &man.newfs.8; 来初始化一个 UFS2 文件系统比初始化一个 UFS1 文件系统还要快,摧荐使用 选项。 &prompt.root; newfs -U -O2 /dev/ad4s1c.bde &man.newfs.8; 命令必须在一个 gbde 分区上执行, 这个分区通过一个存在的 *.bde 设备名进行标识。 挂接加密分区 为加密文件系统创建一个挂接点。 &prompt.root; mkdir /private 挂接加密文件系统。 &prompt.root; mount /dev/ad4s1c.bde /private 校验加密文件系统是否有效 加密的文件系统现在对于 &man.df.1; 应该可见并可以使用。 &prompt.user; df -H Filesystem Size Used Avail Capacity Mounted on /dev/ad0s1a 1037M 72M 883M 8% / /devfs 1.0K 1.0K 0B 100% /dev /dev/ad0s1f 8.1G 55K 7.5G 0% /home /dev/ad0s1e 1037M 1.1M 953M 0% /tmp /dev/ad0s1d 6.1G 1.9G 3.7G 35% /usr /dev/ad4s1c.bde 150G 4.1K 138G 0% /private 挂接已有的加密文件系统 每次系统启动后, 在使用加密文件系统前必须和内核重新进行关联, 校验错误和再次挂接。使用的命令必须由 root用户来执行。 关联 gbde 分区到内核 &prompt.root; gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c 接下来系统将提示您输入在初始化加密的 gbde 分区时所用的密码短语。 校验文件系统错误 加密文件系统不能列在 /etc/fstab 文件中进行自动加载, 在加载前必须手动运行 &man.fsck.8; 命令对文件系统进行错误检测。 &prompt.root; fsck -p -t ffs /dev/ad4s1c.bde 挂接加密文件系统 &prompt.root; mount /dev/ad4s1c.bde /private 加密后的文件系统现在可以有效使用。 自动挂接加密分区 可以创建脚本来自动地附加、 检测, 并挂接加密分区, 然而, 处于安全考虑, 这个脚本不应包含 &man.gbde.8; 密码。 因而, 我们建议这类脚本在控制台或通过 &man.ssh.1; 执行并要求用户输入口令。 除此之外, 系统还提供了一个 rc.d 脚本。 这个脚本的参数可以通过 &man.rc.conf.5; 来指定, 例如: - gbde_autoattach_all="YES" -gbde_devices="ad4s1c" + gbde_autoattach_all="YES" +gbde_devices="ad4s1c" 在启动时将要求输入 gbde 的口令。 在输入正确的口令之后, gbde 加密分区将被自动挂接。 对于将 gbde 用在笔记本电脑上时, 这就很有用了。 gbde 提供的密码学保护 &man.gbde.8; 采用 CBC 模式的 128-位 AES 来加密扇区数据。 磁盘上的每个扇区都采用不同的 AES 密钥来加密。 要了解关于 gbde 的密码学设计, 包括扇区密钥如何从用户提供的口令字中生成等细节, 请参考 &man.gbde.4;。 兼容性问题 &man.sysinstall.8; 是和 gbde 加密设备不兼容的。 在启动 &man.sysinstall.8; 时必须将 *.bde 设备和内核进行分离,否则在初始化探测设备时将引起冲突。 与加密设备进行分离在我们的例子中使用如下的命令: &prompt.root; gbde detach /dev/ad4s1c 还需要注意的是, 由于 &man.vinum.4; 没有使用 &man.geom.4; 子系统, 因此不能同时使用 gbdevinum 卷。 Daniel Gerzo 撰写者 使用 <command>geli</command> 对磁盘进行加密 从 &os; 6.0 开始提供了一个新的密码学 GEOM class — geli。 它目前由 - &a.pjd; 开发。 Geli 与 + &a.pjd; 开发。 Geli 工具与 gbde 不同; 它提供了一些不同的功能, 并采用了不同的方式来进行密码学运算。 &man.geli.8; 最重要的功能包括: 使用了 &man.crypto.9; 框架 — 如果系统中有加解密硬件加速设备, 则 geli 会自动加以利用。 支持多种加密算法 (目前支持 AES、 Blowfish, 以及 3DES)。 允许对根分区进行加密。 在系统启动时, 将要求输入用于加密根分区的口令。 允许使用两个不同的密钥 (例如, 一个 个人密钥 和一个 公司密钥)。 geli 速度很快 — 它只进行简单的扇区到扇区的加密。 允许备份和恢复主密钥。 当用户必须销毁其密钥时, 仍然可以通过从备份中恢复密钥来存取数据。 允许使用随机的一次性密钥来挂接磁盘 — 这对于交换区和临时文件系统非常有用。 更多 geli 功能介绍可以在 &man.geli.8; 联机手册中找到。 下面的步骤介绍了如何启用 &os; 内核中的 geli 支持, - 并解释了如何创建新的 geli 加密 provider。 - 最后, 还将对如何利用 geli - 创建加密的交换分区加以演示。 + 并解释了如何创建新和使用 geli + 加密 provider。 要使用 geli, 您必须运行 &os; 6.0-RELEASE 或更新版本。 由于需要修改内核, 因此您还需要拥有超级用户权限。 - 在内核配置文件中加入 <command>geli</command> 支持 + 在内核中加入 <command>geli</command> 支持 在内核配置文件中加入下面两行: - options GEOM_ELI -device crypto + options GEOM_ELI +device crypto 按照 介绍的步骤重新编译并安装内核。 另外, geli 也可以在系统引导时加载。 这是通过在 /boot/loader.conf 中增加下面的配置来实现的: - geom_eli_load="YES" + geom_eli_load="YES" &man.geli.8; 现在应该已经为内核所支持了。 生成主密钥 下面的例子讲描述如何生成密钥文件, 它将作为主密钥 (Master Key) 的一部分, 用于挂接到 /private 的加密 provider。 这个密钥文件将提供一些随机数据来加密主密钥。 同时, 主密钥也会使用一个口令字来保护。 Provider 的扇区尺寸为 4kB。 此外, 这里的讨论将介绍如何挂载 geli provider, 在其上创建文件系统, 如何挂接并在其上工作, 最后将其卸下。 建议您使用较大的扇区尺寸 (例如 4kB), 以获得更好的性能。 主密钥将由口令字保护, 而密钥文件的数据来源则将是 /dev/random。 我们称之为 provider 的 /dev/da2.eli 的扇区尺寸将是 4kB。 &prompt.root; dd if=/dev/random of=/root/da2.key bs=64 count=1 &prompt.root; geli init -s 4096 -K /root/da2.key /dev/da2 Enter new passphrase: Reenter new passphrase: 同时使用口令字和密钥文件并不是必须的; 您也可以只使用其中的一种来加密主密钥。 如果密钥文件写作 -, 则表示使用标准输入。 下面是关于如何使用多个密钥文件的例子: &prompt.root; cat keyfile1 keyfile2 keyfile3 | geli init -K - /dev/da2 将 provider 与所生成的密钥关联 &prompt.root; geli attach -k /root/da2.key /dev/da2 Enter passphrase: 新的明文设备将被命名为 /dev/da2.eli &prompt.root; ls /dev/da2* /dev/da2 /dev/da2.eli 创建新的文件系统 &prompt.root; dd if=/dev/random of=/dev/da2.eli bs=1m &prompt.root; newfs /dev/da2.eli &prompt.root; mount /dev/da2.eli /private 现在加密的文件系统应该已经可以被 &man.df.1; 看到, - 并处于可用状态了。 + 并处于可用状态了: &prompt.root; df -H Filesystem Size Used Avail Capacity Mounted on /dev/ad0s1a 248M 89M 139M 38% / /devfs 1.0K 1.0K 0B 100% /dev /dev/ad0s1f 7.7G 2.3G 4.9G 32% /usr /dev/ad0s1d 989M 1.5M 909M 0% /tmp /dev/ad0s1e 3.9G 1.3G 2.3G 35% /var /dev/da2.eli 150G 4.1K 138G 0% /private 卸下卷并断开 provider 一旦在加密分区上的工作完成, 并且不再需要 /private 分区, 就应考虑将其卸下并将 geli 加密分区从内核上断开。 &prompt.root; umount /private &prompt.root; geli detach da2.eli 关于如何使用 &man.geli.8; 的更多信息, 可以在其联机手册中找到。 使用 <filename>geli</filename> <filename>rc.d</filename> 脚本 geli 提供了一个 rc.d 脚本, 它可以用于简化 geli 的使用。 通过 &man.rc.conf.5; 配置 geli 的方法如下: - geli_devices="da2" -geli_da2_flags="-p -k /root/da2.key" + geli_devices="da2" +geli_da2_flags="-p -k /root/da2.key" 这将把 /dev/da2 配置为一个 geli provider, 其主密钥文件位于 /root/da2.key, 而 geli 在连接 provider 时将不使用口令字 - (注意只有在 geli init 阶段使用了 -P 才可以这样做)。 - 系统将在关闭之前将 geli provider 断开。 + (注意只有在 geli init 阶段使用了 + 才可以这样做)。 + 系统将在关闭之前将 geli provider 断开。 关于如何配置 rc.d 的详细信息可以在使用手册的 rc.d 一节中找到。
Christian Brüffer 原作 对交换区进行加密 swap (交换区) encrypting (加密) 从 &os; 5.3-RELEASE 开始, &os; 提供了易于配置的交换区加密机制。 随所用的 &os; 版本, 可用的配置选项会有所不同, 而配置方法也会有一些差异。 从 &os; 6.0-RELEASE 开始, 已经可以使用 &man.gbde.8; 和 &man.geli.8; 两种加密系统来进行交换区的加密操作了。 在更早的版本中, 则只提供了 &man.gbde.8;。 前面所说的这两种加密系统, 都用到了 encswap 这个 rc.d 脚本。 在前面的小节 如何加密磁盘分区 中, 已经就不同的加密系统之间的区别进行了简单的讨论。 为什么需要对交换区进行加密? 与加密磁盘分区类似, 加密交换区有助于保护敏感信息。 为此, 我们不妨考虑一个需要处理敏感信息的程序, 例如, 它需要处理口令。 如果这些口令一直保持在物理内存中, 则一切相安无事。 然而, 如果操作系统开始将内存页换出到交换区, 以便为其他应用程序腾出内存时, 这些口令就可能以未加密的形式写到磁盘上, 并为攻击者所轻易获得。 加密交换区能够有效地解决这类问题。 准备 在本节余下的部分中, 我们约定使用 ad0s1b 作为交换区。 到目前为止, 交换区仍是未加密的。 很可能其中已经存有明文形式的口令或其他敏感数据。 要纠正这一问题, 首先应使用随机数来覆盖交换分区的数据: &prompt.root; dd if=/dev/random of=/dev/ad0s1b bs=1m 使用 &man.gbde.8; 来加密交换区 如果使用 &os; 6.0-RELEASE 或更新的版本, 则 /etc/fstab 中与交换区对应的行中, 设备名应追加 .bde 后缀: - + # Device Mountpoint FStype Options Dump Pass# /dev/ad0s1b.bde none swap sw 0 0 - + 对于 &os; 6.0-RELEASE 之前的版本, 还需要在 /etc/rc.conf 中加入: gbde_swap_enable="YES" 使用 &man.geli.8; 来加密分区 另一种方法是使用 &man.geli.8; 来达到加密交换区的目的, 其过程与使用 &man.gbde.8; 大体相似。 此时, 在 /etc/fstab 中交换区对应的行中, 设备名应追加 .eli 后缀: - + # Device Mountpoint FStype Options Dump Pass# /dev/ad0s1b.eli none swap sw 0 0 - + &man.geli.8; 默认情况下使用密钥长度为 256-位的 AES 加密算法。 当然, 这些默认值是可以通过 /etc/rc.conf 中的 geli_swap_flags 选项来修改的。 下面的配置表示让 rc.d 脚本 encswap 创建一个 &man.geli.8; 交换区, 在其上使用密钥长度为 128-位 的 Blowfish 加密算法, 4 kilobytes 的扇区尺寸, 并采用 最后一次关闭时卸下 的策略: geli_swap_flags="-a blowfish -l 128 -s 4096 -d" 请参见 &man.geli.8; 联机手册中关于 onetime 命令的说明, 以了解其他可用的选项。 验证所作的配置能够发挥作用 在重启系统之后, 就可以使用 swapinfo 命令来验证加密交换区是否已经在正常运转了。 如果使用了 &man.gbde.8;, 则: &prompt.user; swapinfo Device 1K-blocks Used Avail Capacity /dev/ad0s1b.bde 542720 0 542720 0% 如果使用了 &man.geli.8;, 则: &prompt.user; swapinfo Device 1K-blocks Used Avail Capacity /dev/ad0s1b.eli 542720 0 542720 0%
diff --git a/zh_CN.GB2312/books/handbook/firewalls/chapter.sgml b/zh_CN.GB2312/books/handbook/firewalls/chapter.sgml index 8d654a3ad1..6122fcd0e8 100644 --- a/zh_CN.GB2312/books/handbook/firewalls/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/firewalls/chapter.sgml @@ -1,2986 +1,2986 @@ Joseph J. Barbish Contributed by Brad Davis Converted to SGML and updated by 防火墙 防火墙 安全 防火墙 入门 防火墙的存在, 使得过滤出入系统的数据流成为可能。 防火墙可以使用一组或多组 规则 (rules), 来检查出入您的网络连接的数据包, 并决定允许或阻止它们通过。 这些规则通常可以检查数据包的某个或某些特征, 这些特征包括, 但不必限于协议类型、 来源或目的主机地址, 以及来源或目的端口。 防火墙可以大幅度地改善主机或网络的安全。 它可以用来完成下面的任务: 保护和隔离应用程序、 服务程序, 以及您内部网络上的机器, 不受那些来自公共的 Internet 网络上您所不希望的数据流量的干扰。 限制或禁止从内部网访问公共的 Internet 上的服务。 支持网络地址转换 (NAT), 它使得您的内部网络能够使用私有的 IP 地址, 并分享一条通往公共的 Internet 的连接 (使用一个 IP 地址, 或者一组公网地址)。 读完这章, 您将了解: 如何正确地定义包过滤规则。 &os; 中内建的集中防火墙之间的差异。 如何使用和配置 OpenBSD 的 PF 防火墙。 如何使用和配置 IPFILTER 如何使用和配置 IPFW 阅读这章之前, 您需要: 理解基本的 &os; 和 Internet 概念。 防火墙的概念 防火墙/primary> 规则集 建立防火墙规则集的基本方法有两种: 包容式的排斥式的。 排斥式的防火墙, 允许除了禁止的那些数据之外的所有网络流量通过。 包容式的防火墙正好相反。 后者只允许符合规则的流量通过, 而其他所有的流量都被阻止。 包容式防火墙一般说来要比排斥式防火墙安全, 因为他们显著地降低了由于允许不希望的网络流量通过所带来的风险。 如果使用了 带状态功能的防火墙 (stateful firewall), 则安全机制可以进一步地细化。 带状态功能的防火墙能够记录通过防火墙的连接, 进而只允许与现有连接匹配的连接, 或创建新的连接。 带状态功能的防火墙的缺点, 则是在很短时间内有大量的连接请求时, 它们可能会受到拒绝服务 (DoS) 攻击。 绝大多数防火墙都提供了同时启用两种防火墙的能力, 以便为站点提供更好的保护。 防火墙软件包 &os; 的基本系统内建了三种不同的防火墙软件包。 它们是 IPFILTER (也被称作 IPF)、 IPFIREWALL (也被称作 IPFW), 以及 OpenBSD 的 PacketFilter (也被称为 PF)。 &os; 也提供了两个内建的、 用于流量整形 (基本上是控制带宽占用) 的软件包: &man.altq.4; 和 &man.dummynet.4;。 Dummynet 在过去一直和 IPFW 紧密集成, 而 ALTQ 则需要配合 IPF/PF 使用。 IPF、 IPFW, 以及 PF 都是用规则来控制是否允许数据包出入您的系统, 虽然它们采取了不同的实现方法和规则语法。 &os; 包含多个内建的防火墙软件包的原因在于, 不同的人会有不同的需求和偏好。 任何一个防火墙软件包都很难说是最好的。 作者倾向于使用 IPFILTER, 因为它提供的状态式规则, 在 NAT 的环境中要简单许多, 而且它内建了 ftp 代理, 这简化了使用外部 FTP 服务时所需的配置。 由于所有的防火墙都基于检查所选定的包控制字段来实现功能, 撰写防火墙规则集时, 就必须了解 TCP/IP 是如何工作的, 以及包的控制字段在正常会话交互中的作用。 您可以在这个网站找到一份很好的解释文档: . OpenBSD Packet Filter (PF) 和 <acronym>ALTQ</acronym> 防火墙 PF 2003 年 7 月, OpenBSD 的防火墙, 也就是常说的 PF 被成功地移植到了 &os; 上, 并可以通过 &os; Ports Collection 来安装了; 第一个将 PF 集成到基本系统中的版本是 2004 年 11 月发行的 &os; 5.3。 PF 是一个完整的提供了大量功能的防火墙软件, 并提供了可选的 ALTQ (交错队列, Alternate Queuing) 功能。 ALTQ 提供了服务品质 (QoS) 带宽整形功能, 这个功能能够以基于过滤规则的方式来保障不同服务的带宽。 OpenBSD Project 在维护 PF 用户指南方面已经做了非常卓越的工作, 因此我们不打算在这本使用手册中进行更进一步的阐述, 以避免不必要的重复劳动。 更多的详细信息, 可以在 &os; 版本的 PF 网站上找到: 启用 PF PF 作为 &os; 5.3 和更高版本基本系统安装的一部分, 作为一个可以动态加载的模块出现。 如果在 rc.conf 中配置了 pf_enable="YES" 则系统会自动加载对应的内核模块。 可加载内核模块在构建时启用了 &man.pflog.4;。 这个模块假定 options INETdevice bpf 是存在的。 除非编译时指定了 NOINET6 (对 &os; 6.0-RELEASE 之前的版本) 或 NO_INET6 (对更新一些的版本) (例如在 &man.make.conf.5; 中定义) 它还需要 options INET6 一旦加载了这个内核模块, 或者将 PF 支持静态联编进内核, 就可以随时通过 pfctl 来启用或禁用 pf 了。 下面的例子展示了如何启用 pf &prompt.root; pfctl -e pfctl 命令提供了一种与 pf 防火墙交互的方法。 要了解进一步的信息, 参考 &man.pfctl.8; 联机手册是一个不错的办法。 内核选项 内核选项 device pf 内核选项 device pflog 内核选项 device pfsync 将下面这些选项加入到 &os; 内核的编译配置文件中并不是启用 PF 的强制性要求。 这里列出它们主要是为了介绍一些背景信息。 将 PF 编译到内核中之后, 就不再需要使用可加载内核模块了。 如何在内核编译配置中加入对于 PF 选项的例子可以在内核源代码中的 /usr/src/sys/conf/NOTES 这个文件中找到。 这里列举如下: device pf device pflog device pfsync device pf 用于启用 Packet Filter 防火墙的支持。 device pflog 启用可选的 &man.pflog.4; 伪网络设备, 用以通过 &man.bpf.4; 描述符来记录流量。 &man.pflogd.8; 服务可以用来存储信息, 并把它们以日志形式记录到磁盘上。 device pfsync 启用可选的 &man.pfsync.4; 伪网络设备, 用以监视 状态变更。 由于这不是那个可加载内核模块的一部分, 因此如果需要使用它, 就必须自行编译定制的内核了。 这些设置只有在您使用它们构建和安装新内核之后才会生效。 可用的 rc.conf 选项 您需要在 /etc/rc.conf 中添加如下配置, 以便在启动时激活 PF: pf_enable="YES" # 启用 PF (如果需要的话, 自动加载内核模块) pf_rules="/etc/pf.conf" # pf 使用的规则定义文件 pf_flags="" # 启动时传递给 pfctl 的其他选项 pflog_enable="YES" # 启动 pflogd(8) pflog_logfile="/var/log/pflog" # pflogd 用于记录日志的文件名 pflog_flags="" # 启动时传递给 pflogd 的其他选项 如果您的防火墙后面有一个 LAN, 而且需要通过它来转发 LAN 上的包, 或进行 NAT, 还必须同时启用下述选项: gateway_enable="YES" # 启用为 LAN 网关 启用 <acronym>ALTQ</acronym> ALTQ 只有在作为编译选项加入到 &os; 内核时, 才能使用。 ALTQ 目前还不是所有的可用网卡驱动都能够支持的。 请参见 &man.altq.4; 联机手册了解您正使用的 &os; 版本中的驱动支持情况。 下面这些选项将启用 ALTQ 以及一些附加的功能。 options ALTQ options ALTQ_CBQ # 基于分类的排列 (CBQ) options ALTQ_RED # 随机先期检测 (RED) options ALTQ_RIO # 对进入和发出的包进行 RED options ALTQ_HFSC # 带等级的包调度器 (HFSC) options ALTQ_PRIQ # 按优先级的排列 (PRIQ) options ALTQ_NOPCC # 在联编 SMP 内核时必须使用,禁止读时钟 options ALTQ 将启用 ALTQ 框架的支持。 options ALTQ_CBQ 用于启用基于分类的队列 (CBQ) 支持。 CBQ 允许您将连接分成不同的类别, 或者说, 队列, 以便在规则中为它们指定不同的优先级。 options ALTQ_RED 将启用随机预检测 (RED)。 RED 是一种用于防止网络拥塞的技术。 RED 度量队列的长度, 并将其与队列的最大和最小长度阈值进行比较。 如果队列过长, 则新的包将被丢弃。 如名所示, RED 从不同的连接中随机地丢弃数据包。 options ALTQ_RIO 将启用出入的随机预检测。 options ALTQ_HFSC 启用层次式公平服务平滑包调度器。 要了解关于 HFSC 进一步的信息, 请参见 options ALTQ_PRIQ 启用优先队列 (PRIQ)。 PRIQ 首先允许高优先级队列中的包通过。 options ALTQ_NOPCC 启用 ALTQSMP 支持。 如果是 SMP 系统, 则必须使用它。 建立过滤规则 Packet Filter 会从 &man.pf.conf.5; 文件中读取配置规则, 并根据那里的规则修改、 丢弃或让数据包通过。 默认安装的 &os; 已经提供了一个默认的、 包含一些有用例子和注释的 /etc/pf.conf 尽管 &os; 提供了自己的 /etc/pf.conf, 但这个文件和 OpenBSD 中的语法是一样的。 OpenBSD 开发团队提供了一个非常好的配置 pf 资源, 它可以在 找到。 在浏览 pf 用户手册时, 请时刻注意, 在 &os; 中所包含的 pf 的版本和 OpenBSD 中是不一样的。 在 &os; 5.X 中 pf 相当于 OpenBSD 3.5 中的版本, 而 &os; 6.X 中则相当于 OpenBSD 3.7。 关于 pf 的配置和使用问题, 可以在 &a.pf; 提出。 当然, 在提出问题之前, 别忘了查阅邮件列表的存档。 IPFILTER (IPF) 防火墙 防火墙 IPFILTER 这一节的内容正在撰写中。 其内容可能不总是十分准确。 IPFILTER 的作者是 Darren Reed。 IPFILTER 是独立于操作系统的: 它是一个开放源代码的应用, 并且已经被移植到了 &os;、 NetBSD、 OpenBSD、 SunOS、 HP/UX, 以及 Solaris 操作系统上。 IPFILTER 的支持和维护都相当活跃, 并且有规律地发布更新版本。 IPFILTER 提供了内核模式的防火墙和 NAT 机制, 这些机制可以通过用户模式运行的接口程序进行监视和控制。 防火墙规则可以使用 &man.ipf.8; 工具来动态地设置和删除。 NAT 规则可以通过 &man.ipnat.1; 工具来维护。 &man.ipfstat.8; 工具则可以用来显示 IPFILTER 内核部分的统计数据。 最后, 使用 &man.ipmon.8; 程序可以把 IPFILTER 的动作记录到系统日志文件中。 IPF 最初是使用一组 以最后匹配的规则为准 的策略来实现的, 这种方式只能支持无状态的规则。 随着时代的进步, IPF 被逐渐增强, 并加入了 quick 选项, 以及支持状态的 keep state 选项, 这使得规则处理逻辑变得更富有现代气息。 IPF 的官方文档介绍了传统的规则编写方法和文件处理逻辑。 新增的功能只是作为一些附加的选项出现, 如果能完全理解这些功能, 则对于建立更安全的防火墙就很有好处。 这一节中主要是针对 quick 选项, 以及支持状态的 keep state 选项的介绍。 这是包容式防火墙规则集最基本的编写要素。 包容式防火墙只允许与规则匹配的包通过。 这样, 您就既能够控制来自防火墙后面的机器请求 Internet 公网上的那些服务, 同时也可以控制来自 Internet 的请求能够访问内部网上的哪些服务。 所有其它的访问请求都会被阻止, 并记录下来。 包容式防火墙一般而言要远比排斥式的要安全, 而且也只需要定义允许哪些访问通过。 要获得关于传统规则处理方式的详细信息, 请参考: 以及 IPF FAQ 可以在 找到。 除此之外, 您还可以在 找到开放源代码的 IPFilter 的邮件列表存档, 并进行搜索。 启用 IPF IPFILTER 启用 IPF 作为 &os; 基本安装的一部分, 以一个独立的内核模块的形式提供。 如果在 rc.conf 中配置了 ipfilter_enable="YES", 系统就会自动地动态加载 IPF 内核模块。 这个内核模块在创建时启用了日志支持, 并加入了 default pass all 选项。 如果只是需要把默认的规则设置为 block all 的话, 并不需要把 IPF 编译到内核中。 可以简单地通过把这条规则加入自己的规则集来达到同样的目的。 内核选项 内核选项 IPFILTER 内核选项 IPFILTER_LOG 内核选项 IPFILTER_DEFAULT_BLOCK IPFILTER 内核选项 下面这些 &os; 内核编译选项并不是启用 IPF 所必需的。 这里只是作为背景知识来加以阐述。 如果将 IPF 编入了内核, 则对应的内核模块将不被使用。 关于 IPF 选项语句的内核编译配置的例子, 可以在内核源代码中的 /usr/src/sys/conf/NOTES 找到。 此处列举如下: options IPFILTER options IPFILTER_LOG options IPFILTER_DEFAULT_BLOCK options IPFILTER 用于启用 IPFILTER 防火墙的支持。 options IPFILTER_LOG 用于启用 IPF 的日志支持, 所有匹配了包含 log 的规则的包, 都会被记录到 ipl 这个包记录伪—设备中。 options IPFILTER_DEFAULT_BLOCK 将改变防火墙的默认动作, 进而, 所有不匹配防火墙的 pass 规则的包都会被阻止。 这些选项只有在您重新编译并安装内核之后才会生效。 可用的 rc.conf 选项 要在启动时激活 IPF, 您需要在 /etc/rc.conf 中增加下面的设置: ipfilter_enable="YES" # 启动 ipf 防火墙 ipfilter_rules="/etc/ipf.rules" # 将被加载的规则定义, 这是一个文本文件 ipmon_enable="YES" # 启动 IP 监视日志 ipmon_flags="-Ds" # D = 作为服务程序启动 # s = 使用 syslog 记录 # v = 记录 tcp 窗口大小、 ack 和顺序号(seq) # n = 将 IP 和端口映射为名字 如果您的 LAN 在防火墙后面, 并且使用了保留的私有 IP 地址范围, 那就需要增加下面的一些选项来启用 NAT 功能: gateway_enable="YES" # 启用作为 LAN 网关的功能 ipnat_enable="YES" # 启动 ipnat 功能 ipnat_rules="/etc/ipnat.rules" # 用于 ipnat 的规则定义文件 IPF ipf ipf 命令可以用来加载您自己的规则文件。 一般情况下, 您可以建立一个包括您自定义的规则的文件, 并使用这个命令来替换掉正在运行的防火墙中的内部规则: &prompt.root; ipf -Fa -f /etc/ipf.rules 表示清除所有的内部规则表。 用于指定将要被读取的规则定义文件。 这个功能使得您能够修改自定义的规则文件, 通过运行上面的 IPF 命令, 可以将正在运行的防火墙刷新为使用全新的规则集, 而不需要重新启动系统。 这对于测试新的规则来说就很方便, 因为您可以任意执行上面的命令。 请参考 &man.ipf.8; 联机手册以了解这个命令提供的其它选项。 &man.ipf.8; 命令假定规则文件是一个标准的文本文件。 它不能处理使用符号代换的脚本。 也确实有办法利用脚本的非常强大的符号替换能力来构建 IPF 规则。 要了解进一步的细节, 请参考 IPFSTAT ipfstat IPFILTER 统计 默认情况下, &man.ipfstat.8; 会获取并显示所有的累积统计, 这些统计是防火墙启动以来用户定义的规则匹配的出入流量, 您可以通过使用 ipf -Z 命令来将这些计数器清零。 请参见 &man.ipfstat.8; 联机手册以了解进一步的细节。 默认的 &man.ipfstat.8; 命令输出类似于下面的样子: input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0 output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0 input packets logged: blocked 99286 passed 0 output packets logged: blocked 0 passed 0 packets logged: input 0 output 0 log failures: input 3898 output 0 fragment state(in): kept 0 lost 0 fragment state(out): kept 0 lost 0 packet state(in): kept 169364 lost 0 packet state(out): kept 431395 lost 0 ICMP replies: 0 TCP RSTs sent: 0 Result cache hits(in): 1215208 (out): 1098963 IN Pullups succeeded: 2 failed: 0 OUT Pullups succeeded: 0 failed: 0 Fastroute successes: 0 failures: 0 TCP cksum fails(in): 0 (out): 0 Packet log flags set: (0) 如果使用了 (进入流量) 或者 (输出流量), 它就只获取并显示内核中所安装的对应过滤器规则的统计数据。 ipfstat -in 以规则号的形式显示进入的内部规则表。 ipfstat -on 以规则号的形式显示流出的内部规则表。 输出和下面的类似: @1 pass out on xl0 from any to any @2 block out on dc0 from any to any @3 pass out quick on dc0 proto tcp/udp from any to any keep state ipfstat -ih 显示内部规则表中的进入流量, 每一个匹配规则前面会同时显示匹配的次数。 ipfstat -oh 显示内部规则表中的流出流量, 每一个匹配规则前面会同时显示匹配的次数。 输出和下面的类似: 2451423 pass out on xl0 from any to any 354727 block out on dc0 from any to any 430918 pass out quick on dc0 proto tcp/udp from any to any keep state ipfstat 命令的一个重要的功能可以通过指定 参数来使用, 它会以类似 &man.top.1; 的显示 &os; 正运行的进程表的方式来显示统计数据。 当您的防火墙正在受到攻击的时候, 这个功能让您得以识别、 试验, 并查看攻击的数据包。 这个选项提还提供了实时选择希望监视的目的或源 IP、 端口或协议的能力。 请参见 &man.ipfstat.8; 联机手册以了解详细信息。 IPMON ipmon IPFILTER 记录日志 为了使 ipmon 能够正确工作, 必须打开 IPFILTER_LOG 这个内核选项。 这个命令提供了两种不同的使用模式。 内建模式是默认的模式, 如果您不指定 参数, 就会采用这种模式。 服务模式是持续地通过系统日志来记录的工作模式, 这样, 您就可以通过查看日志来了解过去曾经发生过的事情。 这种模式是 &os; 和 IPFILTER 配合工作的模式。 由于在 &os; 中提供了一个内建的系统日志自动轮转功能, 因此, 使用 syslogd 比默认的将日志信息记录到一个普通文件要好。 在默认的 rc.conf 文件中, 您会看到一个 ipmon_flags 语句, 指定了 标志: ipmon_flags="-Ds" # D = 作为服务程序启动 # s = 使用 syslog 记录 # v = 记录 tcp 窗口大小、 ack 和顺序号(seq) # n = 将 IP 和端口映射为名字 记录日志的好处是很明显的。 它提供了在事后重新审查相关信息, 例如哪些包被丢弃, 以及这些包的来源地址等等。 这将为查找攻击者提供非常有用的第一手资料。 即使启用了日志机制, IPF 仍然不会对其规则进行任何日志记录工作。 防火墙管理员可以决定规则集中的哪些应记录日志, 并在这些规则上加入 log 关键字。 一般来说, 只应记录拒绝性的规则。 作为惯例, 通常会有一条默认的、拒绝所有网络流量的规则, 并指定 log 关键字, 作为您的规则集的最后一条。 这样, 您就能够看到所有没有匹配任何规则的数据包。 IPMON 的日志 Syslogd 使用特殊的方法对日志数据进行分类。 它使用称为 facilitylevel 的组。 以 模式运行的 IPMON 采用 security 作为 facility 名。 所有由 IPMON 记录的数据都会进入 security。 如果需要, 可以用下列 levels 来进一步区分数据: LOG_INFO - 使用 "log" 关键字指定的通过或阻止动作 LOG_NOTICE - 同时记录通过的那些数据包 LOG_WARNING - 同时记录阻止的数据包 LOG_ERR - 进一步记录含不完整的包头的数据包 要设置 IPFILTER 来将所有的数据记录到 /var/log/ipfilter.log, 需要首先建立这个文件。 下面的命令可以完成这个工作: &prompt.root; touch /var/log/ipfilter.log syslog 功能可以通过在 /etc/syslog.conf 文件中的语句来定义。 syslog.conf 提供了相当多的用以控制 syslog 如何处理类似 IPF 这样的用用程序所产生的系统消息的方法。 您需要将下列语句加到 /etc/syslog.conf security.* /var/log/ipfilter.log 这里的 security.* 表示把所有的相关日志信息写到指定的文件中。 要让 /etc/syslog.conf 中的修改立即生效, 您可以重新启动计算机, 或者通过执行 /etc/rc.d/syslogd reload 来让它重新读取 /etc/syslog.conf 不要忘了修改 /etc/newsyslog.conf 来让您刚创建的日志进行轮转。 记录消息的格式 ipmon 生成的消息由空格分隔的数据字段组成。 所有的消息都包含的字段是: 接到数据包的日期。 接到数据包的时间。 其格式为 HH:MM:SS.F, 分别是小时、 分钟、 秒, 以及分秒 (这个数字可能有许多位)。 处理数据包的网络接口名字, 例如 dc0 组和规则的编号, 例如 @0:17 可以通过 ipfstat -in 来查看这些信息。 动作: p 表示通过, b 表示阻止, S 表示包头不全, n 表示没有匹配任何规则, L 表示 log 规则。 显示这些标志的顺序是: S, p, b, n, L。 大写的 P 或 B 表示记录包的原因是某个全局的日志配置, 而不是某个特定的规则。 地址。 这实际上包括三部分: 源地址和端口 (以逗号分开), 一个 -> 符号, 以及目的地址和端口。 209.53.17.22,80 -> 198.73.220.17,1722. PR, 后跟协议名称或编号, 例如, PR tcp。 len, 后跟包头的长度, 以及包的总长度, 例如 len 20 40。 对于 TCP 包, 则还会包括一个附加的字段, 由一个连字号开始, 之后是表示所设置的标志的一个字母。 请参见 &man.ipmon.8; 联机手册, 以了解这些字母所对应的标志。 对于 ICMP 包, 则在最后会有两个字段。 前一个总是 ICMP, 而后一个则是 ICMP 消息和子消息的类型, 中间以斜线分靠, 例如 ICMP 3/3 表示端口不可达消息。 构建采用符号替换的规则脚本 一些有经验的 IPF 会创建包含规则的文件, 并把它编写成能够与符号替换脚本兼容的方式。 这样做最大的好处是, 它能够让您只修改符号名字所代表的值, 而在脚本执行时直接替换掉所有的名符。 作为脚本, 您可以使用符号替换来把那些经常使用的值直接用于多个规则。 下面我们将给出一个例子。 这个脚本所使用的语法与 sh、 csh, 以及 tcsh 脚本。 符号替换的前缀字段是美元符号: $ 符号字段不使用 $ 前缀。 希望替换符号字段的值, 必须使用双引号 (") 括起来。 您的规则文件的开头类似这样: ############# IPF 规则脚本的开头 ######################## oif="dc0" # 外网接口的名字 odns="192.0.2.11" # ISP 的 DNS 服务器 IP 地址 myip="192.0.2.7" # 来自 ISP 的静态 IP 地址 ks="keep state" fks="flags S keep state" # 可以使用这个脚本来建立 /etc/ipf.rules 文件, # 也可以 "直接地" 运行它。 # # 请删除两个注释号之一。 # # 1) 保留下面一行, 则创建 /etc/ipf.rules: #cat > /etc/ipf.rules << EOF # # 2) 保留下面一行, 则 "直接地" 运行脚本: /sbin/ipf -Fa -f - << EOF # 允许发出到我的 ISP 的域名服务器的访问 pass out quick on $oif proto tcp from any to $odns port = 53 $fks pass out quick on $oif proto udp from any to $odns port = 53 $ks # 允许发出未加密的 www 访问请求 pass out quick on $oif proto tcp from $myip to any port = 80 $fks # 允许发出使用 TLS SSL 加密的 https www 访问请求 pass out quick on $oif proto tcp from $myip to any port = 443 $fks EOF ################## IPF 规则脚本的结束 ######################## 这就是所需的全部内容。 这个规则本身并不重要, 它们主要是用于体现如何使用符号代换字段, 以及如何完成值的替换。 如果上面的例子的名字是 /etc/ipf.rules.script, 就可以通过输入下面的命令来重新加载规则: &prompt.root; sh /etc/ipf.rules.script 在规则文件中嵌入符号有一个问题: IPF 无法识别符号替换, 因此它不能直接地读取这样的脚本。 这个脚本可以使用下面两种方法之一来使用: 去掉 cat 之前的注释, 并注释掉 /sbin/ipf 开头的那一行。 像其他配置一样, 将 ipfilter_enable="YES" 放到 /etc/rc.conf 文件中, 并在此后立刻执行脚本, 以创建或更新 /etc/ipf.rules 通过把 ipfilter_enable="NO" (这是默认值) 加到 /etc/rc.conf 中, 来禁止系统启动脚本开启 IPFILTER。 /usr/local/etc/rc.d/ 启动目录中增加一个类似下面的脚本。 应该给它起一个显而易见的名字, 例如 ipf.loadrules.sh。 请注意, .sh 扩展名是必需的。 #!/bin/sh sh /etc/ipf.rules.script 脚本文件必须设置为属于 root, 并且属主可读、 可写、 可执行。 &prompt.root; chmod 700 /usr/local/etc/rc.d/ipf.loadrules.sh 这样, 在系统启动时, 就会自动加载您的 IPF 规则了。 IPF 规则集 规则集是指一组编写好的依据包的值决策允许通过或阻止 ipf 规则。 包的双向交换组成了一个会话交互。 防火墙规则集对同一个包会进行两次处理, 第一次是它从公网的 Internet 主机到达的时候, 第二次是它离开并返回初始的 Internet 公网主机的时候。 每一个 TCP/IP 服务 (例如 telnet, www, 邮件等等) 是由协议预先定义的源或目的 IP 地址, 以及源或目的端口。 这是最基本的一些可以为防火墙规则所利用的, 判别是否允许服务通过的标准。 IPFILTER 规则处理顺序 IPF 最初被写成使用一组称作 以最后匹配的规则为准 的处理逻辑, 且只能处理无状态的规则。 随着时代的发展, IPF 进行了改进, 并提供了 quick 选项, 以及一个有状态的 keep state 选项。 后者使处理逻辑迅速地跟上了时代的步伐。 这一节中提供的一些指导, 是基于使用包含 quick 选项和有状态的 keep state 选项来进行阐述的。 这些是编写包容式防火墙规则集的基本要素。 包容式防火墙只允许与规则匹配的服务通过。 这样, 您就既能够控制来自防火墙后面的机器请求 Internet 公网上的那些服务, 同时也可以控制来自 Internet 的请求能够访问内部网上的哪些服务。 所有其它的访问请求都会被阻止, 并记录下来。 包容式防火墙一般而言要远比排斥式的要安全, 而且也只需要定义允许哪些访问通过。 当对防火墙规则进行操作时, 应该 谨慎行事。 某些配置可能会 将您反锁在 服务器外面。 安全起见, 您可以考虑在第一次进行防火墙配置时在本地控制台上, 而不是远程, 例如通过 ssh 来进行。 规则语法 IPFILTER 规则语法 这里给出的规则语法已经简化到只处理那些新式的带状态规则, 并且都是 第一个匹配的规则获胜 逻辑的。 要了解完整的传统规则语法描述, 请参见 &man.ipf.8; 联机手册。 # 字符开头的内容会被认为是注释。 这些注释可以出现在一行规则的末尾, 或者独占一行。 空行会被忽略。 规则由关键字组成。 这些关键字必须以一定的顺序, 从左到右出现在一行上。 接下来的文字中关键字将使用粗体表示。 某些关键字可能提供了子选项, 这些子选项本身可能也是关键字, 而且可能会提供更多的子选项。 下面的文字中, 每种语法都使用粗体的小节标题呈现, 并介绍了其上下文。 ACTION IN-OUT OPTIONS SELECTION STATEFUL PROTO SRC_ADDR,DST_ADDR OBJECT PORT_NUM TCP_FLAG STATEFUL ACTION = block | pass IN-OUT = in | out OPTIONS = log | quick | on 网络接口的名字 SELECTION = proto 协议名称 | 源/目的 IP | port = 端口号 | flags 标志值 PROTO = tcp/udp | udp | tcp | icmp SRC_ADD,DST_ADDR = all | from 对象 to 对象 OBJECT = IP地址 | any PORT_NUM = port 端口号 TCP_FLAG = S STATEFUL = keep state ACTION (动作) 动作对表示匹配规则的包应采取什么动作。 每一个规则 必须 包含一个动作。 可以使用下面两种动作之一: block 表示如果规则与包匹配, 则丢弃包。 pass 表示如果规则与包匹配, 则允许包通过防火墙。 IN-OUT 每个过滤器规则都必须明确地指定是流入还是流出的规则。 下一个关键字必须要么是 in, 要么是 out, 否则将无法通过语法检查。 in 表示规则应被应用于刚刚从 Internet 公网上收到的数据包。 out 表示规则应被应用于即将发出到 Internet 的数据包。 OPTIONS 这些选项必须按下面指定的顺序出现。 log 表示包头应被写入到 ipl 日志 (如前面 LOGGING 小节所介绍的那样), 如果它与规则匹配的话。 quick 表示如果给出的参数与包匹配, 则以这个规则为准, 这使得能够 "短路" 掉后面的规则。 这个选项对于使用新式的处理逻辑是必需的。 on 表示将网络接口的名称作为筛选参数的一部分。 接口的名字会在 &man.ifconfig.8; 的输出中显示。 使用这个选项, 则规则只会应用到某一个网络接口上的出入数据包上。 要配置新式的处理逻辑, 必须使用这个选项。 当记录包时, 包的头会被写入到 IPL 包日志伪设备中。 紧跟 log 关键字, 可以使用下面几个修饰符 (按照下列顺序): body 表示应同时记录包的前 128 字节的内容。 first 如果 log 关键字和 keep state 选项同时使用, 则这个选项只在第一个包上触发, 这样就不用记录每一个 keep state 包信息了。 SELECTION 这一节所介绍的关键字可以用于所检察的包的属性。 有一个关键字主题, 以及一组子选项关键字, 您必须从他们中选择一个。 以下是一些通用的属性, 它们必须按下面的顺序使用: PROTO proto 是一个主题关键字, 它必须与某个相关的子选项关键字配合使用。 这个值的作用是匹配某个特定的协议。 要使用新式的规则处理逻辑, 就必须使用这个选项。 tcp/udp | udp | tcp | icmp 或其他在 /etc/protocols 中定义的协议。 特殊的协议关键字 tcp/udp 可以用于匹配 TCPUDP 包, 引入这个关键字的作用是是避免大量的重复规则的麻烦。 SRC_ADDR/DST_ADDR 使用 all 关键词, 基本上相当于 from any to any 在没有配合其他关键字的情形。 from src to dst: from 和 to 关键字主要是用来匹配 IP 地址。 所有的规则都必须同时给出源和目的两个参数。 any 是一个可以用于匹配任意 IP 地址的特殊关键字。 例如, 您可以使用 from any to anyfrom 0.0.0.0/0 to anyfrom any to 0.0.0.0/0from 0.0.0.0 to any 以及 from any to 0.0.0.0 IP 地址可以按句点分隔的 IP 地址/掩码长度 的方式来指定, 也可以只指定一个句点分隔的 IP 地址。 如果无法使用子网掩码来表示 IP 的话, 表达地址就会很麻烦。 请参见下面的网页了解如何撰写掩码长度: PORT 如果为源或目的指定了匹配端口, 规则就只能应用于 TCPUDP 包了。 当编写端口比较规则时, 可以指定 /etc/services 中所定义的名字, 也可以直接用端口号来指定。 如果端口号出现在源对象一侧, 则被认为是源端口号; 反之, 则被认为是目的端口号。 要使用新式的规则处理逻辑, 就必须与 to 对象配合使用这个选项。 使用的例子: from any to any port = 80 端口的比较是以数字的形式进行的, 可以使用比较算符来指定, 也可以指定一个范围。 port "=" | "!=" | "<" | ">" | "<=" | ">=" | "eq" | "ne" | "lt" | "gt" | "le" | "ge". 要指定端口范围, 可以使用 "<>" | "><"。 在源和目的匹配参数之后, 需要使用下面两个参数, 才能够使用新式的规则处理逻辑。 <acronym>TCP</acronym>_FLAG 标志只对 TCP 过滤使用。 这些字母用来表达 TCP 包头的标志。 新式的规则处理逻辑使用 flags S 参数来识别 tcp 会话开始的请求。 STATEFUL keep state 表示如果有一个包与规则匹配, 则其筛选参数应激活有状态的过滤机制。 如果使用新式的处理逻辑, 则这个选项是必需的。 有状态过滤 IPFILTER 有状态过滤 有状态过滤将网络流量当作一种双向的包交换来处理。 如果激活它, keep-state 会动态地为每一个相关的包在双向会话交互过程中产生内部规则。 它能够确认发起者和包的目的地之间的会话是有效的双向包交换过程的一部分。 如果包与这些规则不符, 则将自动地拒绝。 状态保持也使得 ICMP 包能够与 TCP 或 UDP 会话相关。 因此, 如果您在浏览网站时收到允许的状态保持规则匹配的 ICMP 类型 3 代码 4 响应, 则这些响应会被自动地允许进入。 所有 IPF 能够处理的包, 都可以作为某种活跃会话的一部分, 即使它是另一种协议的, 也会被允许进入。 所发生的事情是: 将要通过联入公网的网络接口发出的包, 首先会经过动态状态表的检查。 如果包与会话中预期的下一个包匹配, 则防火墙就会允许包通过, 而会话的交互流信息也会在动态状态表中进行更新, 而其他的包, 则将使用发出规则集来检查。 发到联入 Internet 公网的包, 也会首先经过动态规则表的检查。 如果与会话中预期的下一个包匹配, 则防火墙就允许它通过, 并更新动态状态表。 其他包仍会使用进入规则集进行检查。 当会话结束时, 对应的项会在动态状态表中删除。 有状态过滤使得您能够集中于阻止/允许新的会话。 一旦新会话被允许通过, 则所有后续的包就都被自动地允许通过, 而伪造的包则被自动地拒绝。 如果新的会话被阻止, 则后续的包也都不会被允许通过。 有状态过滤从技术角度而言, 在阻止目前攻击者常用的洪水式攻击来说, 具有更好的抗御能力。 包容式规则集的例子 下面的规则集是如何编写非常安全的包容式防火墙规则集的一个范例。 包容式防火墙只让允许的服务通过, 而所有其他的访问都会被默认地拒绝。 所有的防火墙都有至少两个接口对应的默认规则, 从而使防火墙能够正常工作。 所有的类 &unix; 系统, 包括 &os; 都使用 lo0 和 IP 地址 127.0.0.1 用于操作系统中内部的通讯。 防火墙规则必须允许这些包无阻碍地通过。 接入 Internet 公网的网络接口, 是放置规则并允许将访问请求发到 Internet 以及接收响应的地方。 这有可能是用户模式的 PPP tun0 接口, 如果您的网卡同 DSL 或电缆调制解调器相联的话。 如果有至少一个网卡与防火墙后的内网 LAN 相联, 这些网络接口就应该有一个规则来允许来自这些 LAN 接口的包无阻碍地通过。 一般说来, 规则应被组织为三个主要的小节: 所有允许自由通过的接口规则, 发到公网接口的规则, 以及进入公网接口的规则。 每一个公网接口规则中, 经常会匹配到的规则应该放置在尽可能靠前的位置。 而最后一个规则应该是阻止包通过, 并记录它们。 下面防火墙规则集中, Outbound 部分是一些使用 'pass' 的规则, 这些规则指定了允许访问的公网 Internet 服务, 并且指定了 'quick'、 'on'、 'proto'、 'port', 以及 'keep state' 这些选项。 'proto tcp' 规则还指定了 'flag' 这个选项, 这样会话的第一个包将出发状态机制。 接下来的 Inbound 一节, 则首先阻止所有不希望的数据包。 这样做有两个原因, 其一是被阻止的包可能会被后面的规则允许, 从而并不妨碍获得授权的服务正常工作; 其二是这避免了那些不常见的包由于匹配到最后一条规则而触发日志, 规则集中的最后一条规则是阻止并记录所有的包, 通过这样的记录, 就比较容易找到攻击系统的人, 并为采取法律措施收集证据。 需要注意的另一件事情是, 如果收到了不希望的数据包, 则这些包会被丢弃, 而不是给出什么响应。 这样做的好处是, 攻击者无法了解包是否已经被您的系统收到。 攻击者所能了解到的信息越少, 攻陷您的系统所需要花费的时间也就越长。 我们在这里记录的连入的 'nmap OS 指纹' 探测企图, 一般来说正是攻击者所做的第一件事。 如果您看到了 'log first' 规则的日志, 就应该用 ipfstat -hio 命令来看看那个规则被匹配的次数, 以便了解系统是否正在或曾被攻击。 如果记录的包的端口号并不是您所知道的, 可以在 /etc/services 了解端口号通常的用途。 参考下面的网页, 了解木马使用的端口: 下面是我在自己的系统中使用的完整的, 非常安全的 '包容式' 防火墙规则集。 直接使用这个规则集不会给您造成问题, 您所要做的只是注释掉那些您不需要的服务。 如果在日志中发现了希望阻止的记录, 只需在 inbound 小节中增加一条阻止规则集可。 您必须将每一个规则中的 dc0 替换为您系统上接入 Internet 的网络接口名称, 例如, 用户环境下的 PPP 应该是 tun0 /etc/ipf.rules 中加入下面的内容: ################################################################# # No restrictions on Inside LAN Interface for private network # Not needed unless you have LAN ################################################################# #pass out quick on xl0 all #pass in quick on xl0 all ################################################################# # No restrictions on Loopback Interface ################################################################# pass in quick on lo0 all pass out quick on lo0 all ################################################################# # Interface facing Public Internet (Outbound Section) # Interrogate session start requests originating from behind the # firewall on the private network # or from this gateway server destine for the public Internet. ################################################################# # Allow out access to my ISP's Domain name server. # xxx must be the IP address of your ISP's DNS. # Dup these lines if your ISP has more than one DNS server # Get the IP addresses from /etc/resolv.conf file pass out quick on dc0 proto tcp from any to xxx port = 53 flags S keep state pass out quick on dc0 proto udp from any to xxx port = 53 keep state # Allow out access to my ISP's DHCP server for cable or DSL networks. # This rule is not needed for 'user ppp' type connection to the # public Internet, so you can delete this whole group. # Use the following rule and check log for IP address. # Then put IP address in commented out rule & delete first rule pass out log quick on dc0 proto udp from any to any port = 67 keep state #pass out quick on dc0 proto udp from any to z.z.z.z port = 67 keep state # Allow out non-secure standard www function pass out quick on dc0 proto tcp from any to any port = 80 flags S keep state # Allow out secure www function https over TLS SSL pass out quick on dc0 proto tcp from any to any port = 443 flags S keep state # Allow out send & get email function pass out quick on dc0 proto tcp from any to any port = 110 flags S keep state pass out quick on dc0 proto tcp from any to any port = 25 flags S keep state # Allow out Time pass out quick on dc0 proto tcp from any to any port = 37 flags S keep state # Allow out nntp news pass out quick on dc0 proto tcp from any to any port = 119 flags S keep state # Allow out gateway & LAN users non-secure FTP ( both passive & active modes) # This function uses the IPNAT built in FTP proxy function coded in # the nat rules file to make this single rule function correctly. # If you want to use the pkg_add command to install application packages # on your gateway system you need this rule. pass out quick on dc0 proto tcp from any to any port = 21 flags S keep state # Allow out secure FTP, Telnet, and SCP # This function is using SSH (secure shell) pass out quick on dc0 proto tcp from any to any port = 22 flags S keep state # Allow out non-secure Telnet pass out quick on dc0 proto tcp from any to any port = 23 flags S keep state # Allow out FBSD CVSUP function pass out quick on dc0 proto tcp from any to any port = 5999 flags S keep state # Allow out ping to public Internet pass out quick on dc0 proto icmp from any to any icmp-type 8 keep state # Allow out whois for LAN PC to public Internet pass out quick on dc0 proto tcp from any to any port = 43 flags S keep state # Block and log only the first occurrence of everything # else that's trying to get out. # This rule enforces the block all by default logic. block out log first quick on dc0 all ################################################################# # Interface facing Public Internet (Inbound Section) # Interrogate packets originating from the public Internet # destine for this gateway server or the private network. ################################################################# # Block all inbound traffic from non-routable or reserved address spaces block in quick on dc0 from 192.168.0.0/16 to any #RFC 1918 private IP block in quick on dc0 from 172.16.0.0/12 to any #RFC 1918 private IP block in quick on dc0 from 10.0.0.0/8 to any #RFC 1918 private IP block in quick on dc0 from 127.0.0.0/8 to any #loopback block in quick on dc0 from 0.0.0.0/8 to any #loopback block in quick on dc0 from 169.254.0.0/16 to any #DHCP auto-config block in quick on dc0 from 192.0.2.0/24 to any #reserved for docs block in quick on dc0 from 204.152.64.0/23 to any #Sun cluster interconnect block in quick on dc0 from 224.0.0.0/3 to any #Class D & E multicast ##### Block a bunch of different nasty things. ############ # That I do not want to see in the log # Block frags block in quick on dc0 all with frags # Block short tcp packets block in quick on dc0 proto tcp all with short # block source routed packets block in quick on dc0 all with opt lsrr block in quick on dc0 all with opt ssrr # Block nmap OS fingerprint attempts # Log first occurrence of these so I can get their IP address block in log first quick on dc0 proto tcp from any to any flags FUP # Block anything with special options block in quick on dc0 all with ipopts # Block public pings block in quick on dc0 proto icmp all icmp-type 8 # Block ident block in quick on dc0 proto tcp from any to any port = 113 # Block all Netbios service. 137=name, 138=datagram, 139=session # Netbios is MS/Windows sharing services. # Block MS/Windows hosts2 name server requests 81 block in log first quick on dc0 proto tcp/udp from any to any port = 137 block in log first quick on dc0 proto tcp/udp from any to any port = 138 block in log first quick on dc0 proto tcp/udp from any to any port = 139 block in log first quick on dc0 proto tcp/udp from any to any port = 81 # Allow traffic in from ISP's DHCP server. This rule must contain # the IP address of your ISP's DHCP server as it's the only # authorized source to send this packet type. Only necessary for # cable or DSL configurations. This rule is not needed for # 'user ppp' type connection to the public Internet. # This is the same IP address you captured and # used in the outbound section. pass in quick on dc0 proto udp from z.z.z.z to any port = 68 keep state # Allow in standard www function because I have apache server pass in quick on dc0 proto tcp from any to any port = 80 flags S keep state # Allow in non-secure Telnet session from public Internet # labeled non-secure because ID/PW passed over public Internet as clear text. # Delete this sample group if you do not have telnet server enabled. #pass in quick on dc0 proto tcp from any to any port = 23 flags S keep state # Allow in secure FTP, Telnet, and SCP from public Internet # This function is using SSH (secure shell) pass in quick on dc0 proto tcp from any to any port = 22 flags S keep state # Block and log only first occurrence of all remaining traffic # coming into the firewall. The logging of only the first # occurrence stops a .denial of service. attack targeted # at filling up your log file space. # This rule enforces the block all by default logic. block in log first quick on dc0 all ################### End of rules file ##################################### <acronym>NAT</acronym> NAT IP 伪装 NAT 网络地址转换 NAT NAT 是 网络地址转换(Network Address Translation) 的缩写。 对于那些熟悉 &linux; 的人来说, 这个概念叫做 IP 伪装 (Masquerading); NAT 和 IP 伪装是完全一样的概念。 由 IPF 的 NAT 提供的一项功能是, 将防火墙后的本地局域网 (LAN) 共享一个 ISP 提供的 IP 地址来接入 Internet 公网。 有些人可能会问, 为什么需要这么做。 一般而言, ISP 会为非商业用户提供动态的 IP 地址。 动态地址意味着每次登录到 ISP 都有可能得到不同的 IP 地址, 无论是采用电话拨号登录, 或使用 cable 以及 DSL 调制解调器的方式。 这个 IP 是您与 Internet 公网交互时使用的身份。 现在考虑家中有五台 PC 需要访问 Internet 的情形。 您可能需要向 ISP 为每一台 PC 所使用的独立的 Internet 账号付费, 并且拥有五根电话线。 有了 NAT, 您就只需要一个 ISP 账号, 然后将另外四台 PC 的网卡通过交换机连接起来, 并通过运行 &os; 系统的那台机器作为网关连接出去。 NAT 会自动地将每一台 PC 在内网的 LAN IP 地址, 在离开防火墙时转换为公网的 IP 地址。 此外, 当数据包返回时, 也将进行逆向的转换。 NAT 通常是在没有向 ISP 请求许可, 或事先知会的情况下进行的, 因而如果被发现, 有时可能会成为 ISP 撤销您的账号的一个借口。 商业用户一般来说会购买昂贵得多的 Internet 线路, 通常会获得一组长期有效的静态 IP 地址块。 ISP 一般会希望并同意商业用户在他们的内网中使用 NAT 在 IP 地址空间中, 有一些特殊的范围是保留供经过 NAT 的内网 LAN IP 地址使用的。 根据 RFC 1918, 您可以使用下面这些 IP 范围用于内网, 它们不会在 Internet 公网上路由: 起始 IP 10.0.0.0 - 结束 IP 10.255.255.255 起始 IP 172.16.0.0 - 结束 IP 172.31.255.255 起始 IP 192.168.0.0 - 结束 IP 192.168.255.255 IP<acronym>NAT</acronym> NAT 以及 IPFILTER ipnat NAT 规则是通过 ipnat 命令加载的。 默认情况下, NAT 规则会保存在 /etc/ipnat.rules 文件中。 请参见 &man.ipnat.1; 了解更多的详情。 如果在 NAT 已经启动之后想要修改 NAT 规则, 可以修改保存 NAT 规则的那个文件, 然后在执行 ipnat 命令时加上 参数, 以删除在用的 NAT 内部规则表, 以及所有地址翻译表中已有的项。 要重新加载 NAT 规则, 可以使用类似下面的命令: &prompt.root; ipnat -CF -f /etc/ipnat.rules 如果想要看看您系统上 NAT 的统计信息, 可以用下面的命令: &prompt.root; ipnat -s 要列出当前的 NAT 表的映射关系, 使用下面的命令: &prompt.root; ipnat -l 要显示详细的信息并显示与规则处理和当前的规则/表项: &prompt.root; ipnat -v IP<acronym>NAT</acronym> 规则 NAT 规则非常的灵活, 能够适应商业用户和家庭用户的各种不同的需求。 这里所介绍的规则语法已经被简化, 以适应非商用环境中的一般情况。 完整的规则语法描述, 请参考 &man.ipnat.5; 联机手册中的介绍。 NAT 规则的写法与下面的例子类似: map IF LAN_IP_RANGE -> PUBLIC_ADDRESS 关键词 map 出现在规则的最前面。 IF 替换为对外的网络接口名。 LAN_IP_RANGE 是内网中的客户机使用的地址范围。 通常情况下, 这应该是类似 192.168.1.0/24 的地址。 PUBLIC_ADDRESS 既可以是外网的 IP 地址, 也可以是 0/32 这个特殊的关键字, 它表示分配到 IF 上的所有地址。 <acronym>NAT</acronym> 的工作原理 当包从 LAN 到达防火墙, 而目的地址是公网地址时, 它首先会通过 outbound 过滤规则。 接下来, NAT 会得到包, 并按自顶向下的顺序处理规则, 而第一个匹配的规则将生效。 NAT 接下来会根据包对应的接口名字和源 IP 地址检查所有的规则。 如果包和某个 NAT 规则匹配, 则会检查包的 [源 IP 地址, 例如, 内网的 IP 地址] 是否在 NAT 规则中箭头左侧指定的 IP 地址范围匹配。 如果匹配, 则包的原地址将被根据用 0/32 关键字指定的 IP 地址重写。 NAT 将向它的内部 NAT 表发送此地址, 这样, 当包从 Internet 公网中返回时, 就能够把地址映射回原先的内网 IP 地址, 并在随后使用过滤器规则来处理。 启用 IP<acronym>NAT</acronym> 要启用 IPNAT, 只需在 /etc/rc.conf 中加入下面一些语句。 使机器能够在不同的网络接口之间进行包的转发, 需要: gateway_enable="YES" 每次开机时自动启动 IPNAT ipnat_enable="YES" 指定 IPNAT 规则集文件: ipnat_rules="/etc/ipnat.rules" 大型 LAN 中的 <acronym>NAT</acronym> 对于在一个 LAN 中有大量 PC, 以及包含多个 LAN 的情形, 把所有的内网 IP 地址都映射到同一个公网 IP 上会导致资源不够的问题, 因为同一个端口可能在许多做了 NAT 的 LAN PC 上被多次使用, 并导致碰撞。 有两种方法来缓解这个难题。 指定使用哪些端口 普通的 NAT 规则类似于: map dc0 192.168.1.0/24 -> 0/32 上面的规则中, 包的源端口在包通过 IPNAT 时时不会发生变化的。 通过使用 portmap 关键字, 您可以要求 IPNAT 只使用一定范围内的端口地址。 比如说, 下面的规则将让 IPNAT 把源端口改为指定范围内的端口: map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:60000 使用 auto 关键字可以让配置变得更简单一些, 它会要求 IPNAT 自动地检测可用的端口并使用: map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp auto 使用公网地址池 对很大的 LAN 而言, 总有一天会达到这样一个临界值, 此时的 LAN 地址已经多到了无法只用一个公网地址表现的程度。 如果有可用的一块公网 IP 地址, 则可以将这些地址作为一个 地址池 来使用, 让 IPNAT 来从这些公网 IP 地址中挑选用于发包的地址, 并将其为这些包创建映射关系。 例如, 如果将下面这个把所有包都映射到同一公网 IP 地址的规则: map dc0 192.168.1.0/24 -> 204.134.75.1 稍作修改, 就可以用子网掩码来表达 IP 地址范围: map dc0 192.168.1.0/24 -> 204.134.75.0/255.255.255.0 或者用 CIDR 记法来指定的一组地址了: map dc0 192.168.1.0/24 -> 204.134.75.0/24 端口重定向 非常流行的一种做法是, 将 web 服务器、 邮件服务器、 数据库服务器以及 DNS 分别放到 LAN 上的不同的 PC 上。 这种情况下, 来自这些服务器的网络流量仍然应该被 NAT, 但必须有办法把进入的流量发到对应的局域网的 PC 上。 IPNAT 提供了 NAT 重定向机制来解决这个问题。 考虑下面的情况, 您的 web 服务器的 LAN 地址是 10.0.10.25, 而您的唯一的公网 IP 地址是 20.20.20.5, 则可以编写这样的规则: rdr dc0 20.20.20.5/32 port 80 -> 10.0.10.25 port 80 或者: rdr dc0 0.0.0.0/0 port 80 -> 10.0.10.25 port 80 另外, 也可以让 LAN 地址 10.0.10.33 上运行的 LAN DNS 服务器来处理公网上的 DNS 请求: rdr dc0 20.20.20.5/32 port 53 -> 10.0.10.33 port 53 udp FTP 和 <acronym>NAT</acronym> FTP 是一个在 Internet 如今天这样为人所熟知之前就已经出现的恐龙, 那时, 研究机构和大学是通过租用的线路连到一起的, 而 FTP 则被用于在科研人员之间共享大文件。 那时, 数据的安全性并不是需要考虑的事情。 若干年之后, FTP 协议则被埋进了正在形成中的 Internet 骨干, 而它使用明文来交换用户名和口令的缺点, 并没有随着新出现的一些安全需求而得到改变。 FTP 提供了两种不同的风格, 即主动模式和被动模式。 两者的区别在于数据通道的建立方式。 被动模式相对而言要更加安全, 因为数据通道是由发起 ftp 会话的一方建立的。 关于 FTP 以及它所提供的不同模式, 在 进行了很好的阐述。 IP<acronym>NAT</acronym> 规则 IPNAT 提供了一个内建的 FTP 代理选项, 它可以在 NAT map 规则中指定。 它能够监视所有外发的 FTP 主动或被动模式的会话开始请求, 并动态地创建临时性的过滤器规则, 只打开用于数据通道的端口号。 这样, 就消除了 FTP 一般会给防火墙带来的, 需要大范围地打开高端口所可能带来的安全隐患。 下面的规则可以处理来自内网的 FTP 访问: map dc0 10.0.10.0/29 -> 0/32 proxy port 21 ftp/tcp 这个规则能够处理来自网关的 FTP 访问: map dc0 0.0.0.0/0 -> 0/32 proxy port 21 ftp/tcp 这个则处理所有来自内网的非 FTP 网络流量: map dc0 10.0.10.0/29 -> 0/32 FTP map 规则应该在普通的 map 规则之前出现。 所有的包会从最上面的第一个规则开始进行检查。 匹配的顺序是网卡名称, 内网源 IP 地址, 以及它是否是 FTP 包。 如果所有这些规则都匹配成功, 则 FTP 代理将建立一个临时的过滤规则, 以便让 FTP 会话的数据包能够正常出入, 同时对这些包进行 NAT。 所有的 LAN 数据包, 如果没有匹配第一条规则, 则会继续尝试匹配下面的规则, 并最终被 NAT IP<acronym>NAT</acronym> FTP 过滤规则 如果使用了 NAT FTP 代理, 则只需要为 FTP 创建一个规则。 如果没有使用 FTP 代理, 则需要下面三个规则: # Allow out LAN PC client FTP to public Internet # Active and passive modes pass out quick on rl0 proto tcp from any to any port = 21 flags S keep state # Allow out passive mode data channel high order port numbers pass out quick on rl0 proto tcp from any to any port > 1024 flags S keep state # Active mode let data channel in from FTP server pass in quick on rl0 proto tcp from any to any port = 20 flags S keep state IPFW 防火墙 IPFW 这一节的内容正在撰写中。 其内容可能不总是十分准确。 IPFIREWALL (IPFW) 是一个由 &os; 发起的防火墙应用软件, 它由 &os; 的志愿者成员编写和维护。 它使用了传统的无状态规则和规则编写方式, 以期达到简单状态逻辑所期望的目标。 标准的 &os; 安装中, IPFW 所给出的规则集样例 (可以在 /etc/rc.firewall 中找到) 非常简单, 建议不要不加修改地直接使用。 该样例中没有使用状态过滤, 而该功能在大部分的配置中都是非常有用的, 因此这一节并不以系统自带的样例作为基础。 IPFW 的无状态规则语法, 是由一种提供复杂的选择能力的技术支持的, 这种技术远远超出了一般的防火墙安装人员的知识水平。 IPFW 是为满足专业用户, 以及掌握先进技术的电脑爱好者们对于高级的包选择需求而设计的。 要完全释放 IPFW 的规则所拥有的强大能力, 需要对不同的协议的细节有深入的了解, 并根据它们独特的包头信息来编写规则。 这一级别的详细阐述超出了这本手册的范围。 IPFW 由七个部分组成, 其主要组件是内核的防火墙过滤规则处理器, 及其集成的数据包记帐工具、 日志工具、 用以触发 NAT 工具的 'divert' (转发) 规则、 高级特殊用途工具、 dummynet 流量整形机制, 'fwd rule' 转发工具, 桥接工具, 以及 ipstealth 工具。 启用 IPFW IPFW 启用 IPFW 是基本的 &os; 安装的一部分, 以单独的可加载内核模块的形式提供。 如果在 rc.conf 中加入 firewall_enable="YES" 语句, 就会自动地加载对应的内核模块。 除非您打算使用由它提供的 NAT 功能, 一般情况下并不需要把 IPFW 编进 &os; 的内核。 如果将 firewall_enable="YES" 加入到 rc.conf 中并重新启动系统, 则下列信息将在启动过程中, 以高亮的白色显示出来: ipfw2 initialized, divert disabled, rule-based forwarding disabled, default to deny, logging disabled 可加载内核模块在编译时加入了记录日志的能力。 要启用日志功能, 并配置详细日志记录的限制, 需要在 /etc/sysctl.conf 中加入一些配置。 这些设置将在重新启动之后生效: net.inet.ip.fw.verbose=1 net.inet.ip.fw.verbose_limit=5 内核选项 内核选项 IPFIREWALL 内核选项 IPFIREWALL_VERBOSE 内核选项 IPFIREWALL_VERBOSE_LIMIT IPFW 内核选项 把下列选项在编译 &os; 内核时就加入, 并不是启用 IPFW 所必需的, 除非您需要使用 NAT 功能。 这里只是将这些选项作为背景知识来介绍。 options IPFIREWALL 这个选项将 IPFW 作为内核的一部分来启用。 options IPFIREWALL_VERBOSE 这个选项将启用记录通过 IPFW 的匹配了包含 'log' 关键字规则的每一个包的功能。 options IPFIREWALL_VERBOSE_LIMIT=5 以每项的方式, 限制通过 &man.syslogd.8; 记录的包的个数。 如果在比较恶劣的环境下记录防火墙的活动可能会需要这个选项。 它能够避免潜在的针对 syslog 的洪水式拒绝服务攻击。 内核选项 IPFIREWALL_DEFAULT_TO_ACCEPT options IPFIREWALL_DEFAULT_TO_ACCEPT 这个选项默认地允许所有的包通过防火墙, 如果您是第一次配置防火墙, 使用这个选项将是一个不错的主意。 options IPV6FIREWALL options IPV6FIREWALL_VERBOSE options IPV6FIREWALL_VERBOSE_LIMIT options IPV6FIREWALL_DEFAULT_TO_ACCEPT 这些选项与 IPv4 的对应选项功能一样, 它们是针对 IPv6 的。 如果不使用 IPv6, 则不带任何规则的 IPV6FIREWALL 将阻止所有的 IPv6 包。 内核选项 IPDIVERT options IPDIVERT 这一选项启用 NAT 功能。 如果内核选项中没有加入 IPFIREWALL_DEFAULT_TO_ACCEPT, 或将您的防火墙设置配置为允许所有的进入包, 则所有发到本机或发出的包都会被阻止。 <filename>/etc/rc.conf</filename> Options 启用防火墙: firewall_enable="YES" 要选择由 &os; 提供的几种防火墙类型中的一种来作为默认配置, 您需要阅读 /etc/rc.firewall 文件并选出合适的类型, 然后在 /etc/rc.conf 中加入类似下面的配置: firewall_type="open" 您还可以指定下列配置规则之一: open — 允许所有流量通过。 client — 只保护本机。 simple — 保护整个网络。 closed — 完全禁止除回环设备之外的全部 IP 流量。 UNKNOWN — 禁止加载防火墙规则。 filename — 到防火墙规则文件的绝对路径。 有两种加载自定义 ipfw 防火墙规则的方法。 其一是将变量 firewall_type 设为包含不带 &man.ipfw.8; 命令行选项的 防火墙规则 文件的完整路径。 下面是一个简单的规则集例子: add block in all add block out all 除此之外, 也可以将 firewall_script 变量设为包含 ipfw 命令的可执行脚本, 这样这个脚本会在启动时自动执行。 与前面规则集文件等价的规则脚本如下: #!/bin/sh ipfw -q flush ipfw add block in all ipfw add block out all 如果 firewall_type 设为 clientsimple, 则还应查看在 /etc/rc.firewall 中的默认规则, 以确认它们与所在机器的配置相一致。 此外, 请注意这一章中的例子均假定 firewall_script/etc/ipfw.rules 启用日志: firewall_logging="YES" 设置 firewall_logging 的唯一作用是, 系统将把 net.inet.ip.fw.verbose sysctl 变量置为 1 (参见 )。 并没有能够设置日志限制的 rc.conf 变量, 不过这种限制可以通过设置某些 sysctl 变量来完成, 可以手工进行操作, 也可以写到 /etc/sysctl.conf 文件中: net.inet.ip.fw.verbose_limit=5 如果您的计算机是作为网关使用的, 也就是它通过 &man.natd.8; 提供网络地址翻译 (NAT), 请参见 以了解需要在 /etc/rc.conf 中配置的选项。 IPFW 命令 ipfw ipfw 命令是在防火墙运行时, 用于在其内部规则表中手工逐条添加或删除防火墙规则的标准工具。 这一方法的问题在于, 一旦您的关闭计算机或停机, 则所有增加或删除或修改的规则也就丢掉了。 把所有的规则都写到一个文件中, 并在启动时使用这个文件来加载规则, 或一次大批量地替换防火墙规则, 那么推荐使用这里介绍的方法。 ipfw 的另一个非常实用的功能是将所有正在运行的防火墙规则显示出来。 IPFW 的记账机制会为每一个规则动态地创建计数器, 用以记录与它们匹配的包的数量。 在测试规则的过程中, 列出规则及其计数器是了解它们是否工作正常的重要手段。 按顺序列出所有的规则: &prompt.root; ipfw list 列出所有的规则, 同时给出最后一次匹配的时间戳: &prompt.root; ipfw -t list 列出所有的记账信息、 匹配规则的包的数量, 以及规则本身。 第一列是规则的编号, 随后是发出包匹配的数量, 进入包的匹配数量, 最后是规则本身。 &prompt.root; ipfw -a list 列出所有的动态规则和静态规则: &prompt.root; ipfw -d list 同时显示已过期的动态规则: &prompt.root; ipfw -d -e list 将计数器清零: &prompt.root; ipfw zero 只把规则号为 NUM 的计数器清零: &prompt.root; ipfw zero NUM IPFW 规则集 规则集是一组根据包中选择的数值使用 allow 或 deny 写出的 ipfw 规则。 在两个主机之前的双向包交换组成了一次会话交互。 防火墙规则集, 会对同一个包处理两次: 第一次是包从公网上到达防火墙时, 而第二次则是包返回 Internet 公网上的主机时。 每一个 TCP/IP 服务 (例如 telnet, www, mail, 等等), 都有事先定义好的协议, 以及一个端口号。 这可以作为建立允许或阻止规则时的基本选择依据。 IPFW 规则处理顺序 当有数据包进入防火墙时, 会从规则集里的第一个规则开始进行比较, 并自顶向下地进行匹配。 当包与某个选择规则参数相匹配时, 将会执行规则所定义的动作, 并停止规则集搜索。 这种策略, 通常也被称作 最先匹配者获胜 的搜索方法。 如果没有任何与包相匹配的规则, 那么它就会根据强制的 ipfw 默认规则, 也就是 65535 号规则截获。 一般情况下这个规则是阻止包, 而且不给出任何回应。 如果规则定义的动作是 countskiptotee 规则的话, 搜索会继续。 这里所介绍的规则, 都是使用了那些包含状态功能的, 也就是 'keep state'、 'limit'、 'in'/'out'、 或者 'via' 选项的规则。 这是编写包容式防火墙规则集所需的基本框架。 包容式防火墙只允许与规则匹配的包通过。 这样, 您就既能够控制来自防火墙后面的机器请求 Internet 公网上的那些服务, 同时也可以控制来自 Internet 的请求能够访问内部网上的哪些服务。 所有其它的访问请求都会被阻止, 并记录下来。 包容式防火墙一般而言要远比排斥式的要安全, 而且也只需要定义允许哪些访问通过。 在操作防火墙规则时应谨慎行事, 如果操作不当, 有可能将自己反锁在外面。 规则语法 IPFW 规则语法 这里所介绍的规则语法已经经过了简化, 只包括了建立标准的包容式防火墙规则集所必需的那些。 要了解完整的规则语法说明, 请参见 &man.ipfw.8; 联机手册。 规则是由关键字组成的: 这些关键字必须以特定的顺序从左到右书写。 下面的介绍中, 关键字使用粗体表示。 某些关键字还包括了子选项, 这些子选项本身可能也是关键字, 有些还可以包含更多的子选项。 # 用于表示开始一段注释。 它可以出现在一个规则的后面, 也可以独占一行。 空行会被忽略。 CMD RULE_NUMBER ACTION LOGGING SELECTION STATEFUL CMD 每一个新的规则都应以 add 作为前缀, 它表示将规则加入内部表。 RULE_NUMBER 每一个规则都必须包含一个规则编号。 ACTION 每一个规则可以与下列的动作之一相关联, 所指定的动作将在进入的数据包与规则所指定的选择标准相匹配时执行。 allow | accept | pass | permit 这些关键字都表示允许匹配规则的包通过防火墙, 并停止继续搜索规则。 check-state 根据动态规则表检查数据包。 如果匹配, 则执行规则所指定的动作, 亦即生成动态规则; 否则, 转移到下一个规则。 check-state 规则没有选择标准。 如果规则集中没有 check-state 规则, 则会在第一个 keep-state 或 limit 规则处, 对动态规则表实施检查。 deny | drop 这两个关键字都表示丢弃匹配规则的包。 同时, 停止继续搜索规则。 LOGGING log or logamount 当数据包与带 log 关键字的规则匹配时, 将通过名为 SECURITY 的 facility 来把消息记录到 syslogd。 只有在记录的次数没有超过 logamount 参数所指定的次数时, 才会记录日志。 如果没有指定 logamount, 则会以 sysctl 变量 net.inet.ip.fw.verbose_limit 所指定的限制为准。 如果将这两种限制值之一指定为零, 则表示不作限制。 万一达到了限制数, 可以通过将规则的日志计数或包计数清零来重新启用日志, 请参见 ipfw reset log 命令来了解细节。 日志是在所有其他匹配条件都验证成功之后, 在针对包实施最终动作 (accept, deny) 之前进行的。 您可以自行决定哪些规则应启用日志。 SELECTION 这一节所介绍的关键字主要用来描述检查包的哪些属性, 用以判断包是否与规则相匹配。 下面是一些通用的用于匹配包特征的属性, 它们必须按顺序使用: udp | tcp | icmp 也可以指定在 /etc/protocols 中所定义的协议。 这个值定义的是匹配的协议, 在规则中必须指定它。 from src to dst from 和 to 关键字用于匹配 IP 地址。 规则中必须同时指定源和目的两个参数。 如果需要匹配任意 IP 地址, 可以使用特殊关键字 any。 还有一个特殊关键字, 即 me, 用于匹配您的 &os; 系统上所有网络接口上所配置的 IP 地址, 它可以用于表达网络上的其他计算机到防火墙 (也就是本机), 例如 'from me to any' 或 'from any to me' 或 'from 0.0.0.0/0 to any' 或 'from any to 0.0.0.0/0' 或 'from 0.0.0.0 to any' 或 'from any to 0.0.0.0' 以及 'from me to 0.0.0.0'。 IP 地址可以通过 带点的 IP 地址/掩码长度, 或者一个带点的 IP 地址的形式来指定。 这是编写规则时所必需的。 如果不清楚如何写掩码长度, 请参见 port number 这个参数主要用于那些支持端口号的协议 (例如 TCP 和 UDP)。 如果要通过端口号匹配某个协议, 就必须指定这个参数。 此外, 也可以通过服务的名字 (根据 /etc/services) 来指定服务, 这样会比使用数字指定端口号直观一些。 in | out 相应地, 匹配进入和发出的包。 这里的 in 和 out 都是关键字, 在编写匹配规则时, 必需作为其他条件的一部分来使用。 via IF 根据指定的网络接口的名称精确地匹配进出的包。 这里的 via 关键字将使得接口名称成为匹配过程的一部分。 setup 要匹配 TCP 会话的发起请求, 就必须使用它。 keep-state 这是一个必须使用的关键字。 在发生匹配时, 防火墙将创建一个动态规则, 其默认行为是, 匹配使用同一协议的、从源到目的 IP/端口 的双向网络流量。 limit {src-addr | src-port | dst-addr | dst-port} 防火墙只允许匹配规则时, 与指定的参数相同的 N 个连接。 可以指定至少一个源或目的地址及端口。 'limit' 和 'keep-state' 不能在同一规则中同时使用。 'limit' 提供了与 'keep-state' 相同的功能, 并增加了一些独有的能力。 状态规则选项 IPFW 带状态过滤 有状态过滤将网络流量当作一种双向的包交换来处理。 它提供了一种额外的检查能力, 用以检测会话中的包是否来自最初的发送者, 并在遵循双向包交换的规则进行会话。 如果包与这些规则不符, 则将自动地拒绝它们。 'check-state' 用来识别在 IPFW 规则集中的包是否符合动态规则机制的规则。 如果匹配, 则允许包通过, 此时防火墙将创建一个新的动态规则来匹配双向交换中的下一个包。 如果不匹配, 则将继续尝试规则集中的下一个规则。 动态规则机制在 SYN-flood 攻击下是脆弱的, 因为这种情况会产生大量的动态规则, 从而耗尽资源。 为了抵抗这种攻击, 从 &os; 中加入了一个叫做 limit 的新选项。 这个选项可以用来限制符合规则的会话允许的并发连接数。 如果动态规则表中的规则数超过限制, 则包将被丢弃。 记录防火墙消息 IPFW 记录日志 记录日志的好处是显而易见的: 它提供了在事后检查所发生的状况的方法, 例如哪些包被丢弃了, 这些包的来源和目的地, 从而为您提供找到攻击者所需的证据。 即使启用了日志机制, IPFW 也不会自行生成任何规则的日志。 防火墙管理员需要指定规则集中的哪些规则应该记录日志, 并在这些规则上增加 log 动作。 一般来说, 只有 deny 规则应记录日志, 例如对于进入的 ICMP ping 的 deny 规则。 另外, 复制默认的 ipfw 终极 deny 规则, 并加入 log 动作来作为您的规则集的最后一条规则也是很常见的用法。 这样, 您就能看到没有匹配任何一条规则的那些数据包。 日志是一把双刃剑, 如果不谨慎地加以利用, 则可能会陷入过多的日志数据中, 并导致磁盘被日志塞满。 将磁盘填满是 DoS 攻击最为老套的手法之一。 由于日志除了会写入磁盘之外, 还会输出到 root 的控制台屏幕上, 因此有过多的日志信息是很让人恼火的事情。 IPFIREWALL_VERBOSE_LIMIT=5 内核选项将限制同一个规则发到系统日志程序 syslogd 的连续消息的数量。 当内核启用了这个选项时, 某一特定规则所产生的连续消息的数量将封顶为这个数字。 一般来说, 没有办法从连续 200 条一模一样的日志信息中获取更多有用的信息。 举例来说, 如果同一个规则产生了 5 次消息并被记录到 syslogd, 余下的相同的消息将被计数, 并像下面这样发给 syslogd: last message repeated 45 times 所有记录的数据包包消息, 默认情况下会最终写到 /var/log/security 文件中, 后者在 /etc/syslog.conf 文件里进行了定义。 编写规则脚本 绝大多数有经验的 IPFW 用户会创建一个包含规则的文件, 并且, 按能够以脚本形式运行的方式来书写。 这样做最大的一个好处是, 可以大批量地刷新防火墙规则, 而无须重新启动系统就能够激活它们。 这种方法在测试新规则时会非常方便, 因为同一过程在需要时可以多次执行。 作为脚本, 您可以使用符号替换来撰写那些经常需要使用的值, 并用同一个符号在多个规则中反复地表达它。 下面将给出一个例子。 这个脚本使用的语法同 'sh'、 'csh' 以及 'tcsh' 脚本兼容。 符号替换字段使用美元符号 $ 作为前缀。 符号字段本身并不使用 $ 前缀。 符号替换字段的值必须使用 "双引号" 括起来。 可以使用类似下面的规则文件: ############### start of example ipfw rules script ############# # ipfw -q -f flush # Delete all rules # Set defaults oif="tun0" # out interface odns="192.0.2.11" # ISP's DNS server IP address cmd="ipfw -q add " # build rule prefix ks="keep-state" # just too lazy to key this each time $cmd 00500 check-state $cmd 00502 deny all from any to any frag $cmd 00501 deny tcp from any to any established $cmd 00600 allow tcp from any to any 80 out via $oif setup $ks $cmd 00610 allow tcp from any to $odns 53 out via $oif setup $ks $cmd 00611 allow udp from any to $odns 53 out via $oif $ks ################### End of example ipfw rules script ############ 这就是所要做的全部事情了。 例子中的规则并不重要, 它们主要是用来表示如何使用符号替换。 如果把上面的例子保存到 /etc/ipfw.rules 文件中, 您就可以通过输入下面的命令来加载它。 &prompt.root; sh /etc/ipfw.rules /etc/ipfw.rules 这个文件可以放到任何位置, 也可以命名为随便什么别的名字。 也可以手工执行下面的命令来达到类似的目的: &prompt.root; ipfw -q -f flush &prompt.root; ipfw -q add check-state &prompt.root; ipfw -q add deny all from any to any frag &prompt.root; ipfw -q add deny tcp from any to any established &prompt.root; ipfw -q add allow tcp from any to any 80 out via tun0 setup keep-state &prompt.root; ipfw -q add allow tcp from any to 192.0.2.11 53 out via tun0 setup keep-state &prompt.root; ipfw -q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep-state 带状态规则集 以下的这组非-NAT 规则集, 是如何编写非常安全的 '包容式' 防火墙的一个例子。 包容式防火墙只允许匹配了 pass 规则的包通过, 而默认阻止所有的其他数据包。 必须有至少两个网络接口, 并且在其上配置了规则才能使防火墙正常工作。 所有类 &unix; 操作系统, 也包括 &os;, 都设计为允许使用网络接口 lo0 和 IP 地址 127.0.0.1 来完成操作系统内部的通讯。 防火墙必须包含一组规则, 使这些数据包能够无障碍地收发。 接入 Internet 公网的那个网络接口上, 应该配置授权和访问控制, 来限制对外的访问, 以及来自 Internet 公网的访问。 这个接口很可能是您的 ppp 接口, 例如 tun0, 或者您接在 DSL 或电缆 modem 上的网卡。 如果有至少一个网卡接入了防火墙后的内网 LAN, 则必须为这些接口配置规则, 以便让这些接口之间的包能够顺畅地通过。 所有的规则应被组织为三个部分, 所有应无阻碍地通过的规则, 公网的发出规则, 以及公网的接收规则。 公网接口相关的规则的顺序, 应该是最经常用到的放在尽可能靠前的位置, 而最后一个规则, 则应该是阻止那个接口在那一方向上的包。 发出部分的规则只包含一些 'allow' 规则, 允许选定的那些唯一区分协议的端口号所指定的协议通过, 以允许访问 Internet 公网上的这些服务。 所有的规则中都指定了 proto, port, in/out, via 以及 keep state 这些选项。 'proto tcp' 规则同时指定 'setup' 选项, 来区分开始协议会话的包, 以触发将包放入 keep state 规则表中的动作。 接收部分则首先阻止所有不希望的包, 在这里有两个目的。 首先是, 这些包被禁止掉之后, 就不会由于匹配了后面的某个规则而被允许。 其次, 明确地禁止这些包, 就不会再在日志中记录它们而形成干扰。 防火墙的最后一条规则是阻止并记录所有包, 这样, 您就可以留下用于起诉攻击您的系统的人的有用记录。 另一件需要注意的事情是, 不希望的数据包一般来说不会有任何响应, 这些数据包会被丢弃并消失。 这样, 攻击者也就无法了解他的数据包是否到达了您的系统。 而攻击者了解的信息越少, 它们攻陷系统所需的时间也就越长。 当记录的包使用的端口号不是您所熟悉的那些时, 可以看一看 /etc/services/ 或到 并查找一下端口号, 以了解其用途。 另外, 您也可以在这个网页上了解常见木马所使用的端口: 包容式规则集的例子 下面是一个非-NAT 的规则集, 它是一个完整的包容式规则集。 使用它作为您的规则集不会有什么问题。 只需把那些不需要的服务对应的 pass 规则注释掉就可以了。 如果您在日志中看到消息, 而且不想再看到它们, 只需在接收部分增加一个一个 deny 规则。 您可能需要把 'dc0' 改为接入公网的接口的名字。 对于使用用户态 ppp 的用户而言, 应该是 'tun0'。 您可以看出这些规则中的模式。 所有请求 Internet 公网上服务的会话开始包, 都使用了 keep-state。 所有来自 Internet 的授权服务请求, 都采用了 limit 选项来防止洪水式攻击。 所有的规则都使用了 in 或者 out 来说明方向。 所有的规则都使用了 via 接口名来指定应该匹配通过哪一个接口的包。 这些规则都应放到 /etc/ipfw.rules ################ Start of IPFW rules file ############################### # Flush out the list before we begin. ipfw -q -f flush # Set rules command prefix cmd="ipfw -q add" pif="dc0" # public interface name of NIC # facing the public Internet ################################################################# # No restrictions on Inside LAN Interface for private network # Not needed unless you have LAN. # Change xl0 to your LAN NIC interface name ################################################################# #$cmd 00005 allow all from any to any via xl0 ################################################################# # No restrictions on Loopback Interface ################################################################# $cmd 00010 allow all from any to any via lo0 ################################################################# # Allow the packet through if it has previous been added to the # the "dynamic" rules table by a allow keep-state statement. ################################################################# $cmd 00015 check-state ################################################################# # Interface facing Public Internet (Outbound Section) # Interrogate session start requests originating from behind the # firewall on the private network or from this gateway server # destine for the public Internet. ################################################################# # Allow out access to my ISP's Domain name server. # x.x.x.x must be the IP address of your ISP.s DNS # Dup these lines if your ISP has more than one DNS server # Get the IP addresses from /etc/resolv.conf file $cmd 00110 allow tcp from any to x.x.x.x 53 out via $pif setup keep-state $cmd 00111 allow udp from any to x.x.x.x 53 out via $pif keep-state # Allow out access to my ISP's DHCP server for cable/DSL configurations. # This rule is not needed for .user ppp. connection to the public Internet. # so you can delete this whole group. # Use the following rule and check log for IP address. # Then put IP address in commented out rule & delete first rule $cmd 00120 allow log udp from any to any 67 out via $pif keep-state #$cmd 00120 allow udp from any to x.x.x.x 67 out via $pif keep-state # Allow out non-secure standard www function $cmd 00200 allow tcp from any to any 80 out via $pif setup keep-state # Allow out secure www function https over TLS SSL $cmd 00220 allow tcp from any to any 443 out via $pif setup keep-state # Allow out send & get email function $cmd 00230 allow tcp from any to any 25 out via $pif setup keep-state $cmd 00231 allow tcp from any to any 110 out via $pif setup keep-state # Allow out FBSD (make install & CVSUP) functions # Basically give user root "GOD" privileges. $cmd 00240 allow tcp from me to any out via $pif setup keep-state uid root # Allow out ping $cmd 00250 allow icmp from any to any out via $pif keep-state # Allow out Time $cmd 00260 allow tcp from any to any 37 out via $pif setup keep-state # Allow out nntp news (i.e. news groups) $cmd 00270 allow tcp from any to any 119 out via $pif setup keep-state # Allow out secure FTP, Telnet, and SCP # This function is using SSH (secure shell) $cmd 00280 allow tcp from any to any 22 out via $pif setup keep-state # Allow out whois $cmd 00290 allow tcp from any to any 43 out via $pif setup keep-state # deny and log everything else that.s trying to get out. # This rule enforces the block all by default logic. $cmd 00299 deny log all from any to any out via $pif ################################################################# # Interface facing Public Internet (Inbound Section) # Interrogate packets originating from the public Internet # destine for this gateway server or the private network. ################################################################# # Deny all inbound traffic from non-routable reserved address spaces $cmd 00300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP $cmd 00301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP $cmd 00302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP $cmd 00303 deny all from 127.0.0.0/8 to any in via $pif #loopback $cmd 00304 deny all from 0.0.0.0/8 to any in via $pif #loopback $cmd 00305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config $cmd 00306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs $cmd 00307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster interconnect $cmd 00308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast # Deny public pings $cmd 00310 deny icmp from any to any in via $pif # Deny ident $cmd 00315 deny tcp from any to any 113 in via $pif # Deny all Netbios service. 137=name, 138=datagram, 139=session # Netbios is MS/Windows sharing services. # Block MS/Windows hosts2 name server requests 81 $cmd 00320 deny tcp from any to any 137 in via $pif $cmd 00321 deny tcp from any to any 138 in via $pif $cmd 00322 deny tcp from any to any 139 in via $pif $cmd 00323 deny tcp from any to any 81 in via $pif # Deny any late arriving packets $cmd 00330 deny all from any to any frag in via $pif # Deny ACK packets that did not match the dynamic rule table $cmd 00332 deny tcp from any to any established in via $pif # Allow traffic in from ISP's DHCP server. This rule must contain # the IP address of your ISP.s DHCP server as it.s the only # authorized source to send this packet type. # Only necessary for cable or DSL configurations. # This rule is not needed for .user ppp. type connection to # the public Internet. This is the same IP address you captured # and used in the outbound section. #$cmd 00360 allow udp from any to x.x.x.x 67 in via $pif keep-state # Allow in standard www function because I have apache server $cmd 00400 allow tcp from any to me 80 in via $pif setup limit src-addr 2 # Allow in secure FTP, Telnet, and SCP from public Internet $cmd 00410 allow tcp from any to me 22 in via $pif setup limit src-addr 2 # Allow in non-secure Telnet session from public Internet # labeled non-secure because ID & PW are passed over public # Internet as clear text. # Delete this sample group if you do not have telnet server enabled. $cmd 00420 allow tcp from any to me 23 in via $pif setup limit src-addr 2 # Reject & Log all incoming connections from the outside $cmd 00499 deny log all from any to any in via $pif # Everything else is denied by default # deny and log all packets that fell through to see what they are $cmd 00999 deny log all from any to any ################ End of IPFW rules file ############################### 一个 <acronym>NAT</acronym> 和带状态规则集的例子 NAT 以及 IPFW 要使用 IPFW 的 NAT 功能, 还需要进行一些额外的配置。 除了其他 IPFIREWALL 语句之外, 还需要在内核编译配置中加上 'option divert' 语句。 /etc/rc.conf 中, 除了普通的 IPFW 配置之外, 还需要加入: natd_enable="YES" # Enable NATD function natd_interface="rl0" # interface name of public Internet NIC natd_flags="-dynamic -m" # -m = preserve port numbers if possible 将带状态规则与转发 natd 规则 (网络地址转换) 会使规则集的编写变得非常复杂。 check-state 的位置, 以及 'divert natd' 规则将变得非常关键。 这样一来, 就不再有简单的顺序处理逻辑流程了。 提供了一种新的动作类型, 称为 'skipto'。 要使用 skipto 命令, 就必须给每一个规则进行编号, 以确定 skipto 规则号是您希望跳转到的位置。 下面给出了一些未加注释的例子来说明如何编写这样的规则, 用以帮助您理解包处理规则集的处理顺序。 处理流程从规则文件最上边的第一个规则开始处理, 并自顶向下地尝试每一个规则, 直到找到匹配的规则, 且数据包从防火墙中放出为止。 请注意规则号 100 101, 450, 500, 以及 510 的位置非常重要。 这些规则控制发出和接收的包的地址转换过程, 这样它们在 keep-state 动态表中的对应项中就能够与内网的 LAN IP 地址关联。 另一个需要注意的是, 所有的 allow 和 deny 规则都指定了包的方向 (也就是 outbound 或 inbound) 以及网络接口。 最后, 请注意所有发出的会话请求都会请求 skipto rule 500 以完成网络地址转换。 下面以 LAN 用户使用 web 浏览器访问一个 web 页面为例。 Web 页面使用 80 来完成通讯。 当包进入防火墙时, 规则 100 并不匹配, 因为它是发出而不是收到的包。 它能够通过规则 101, 因为这是第一个包, 因而它还没有进入动态状态保持表。 包最终到达规则 125, 并匹配该规则。 最终, 它会通过接入 Internet 公网的网卡发出。 这之前, 包的源地址仍然是内网 IP 地址。 一旦匹配这个规则, 就会触发两个动作。 keep-state 选项会把这个规则发到 keep-state 动态规则表中, 并执行所指定的动作。 动作是发到规则表中的信息的一部分。 在这个例子中, 这个动作是 "skipto rule 500"。 规则 500 NAT 包的 IP 地址, 并将其发出。 请务必牢记, 这一步非常重要。 接下来, 数据包将到达目的地, 之后返回并从规则集的第一条规则开始处理。 这一次, 它将与规则 100 匹配, 其目的 IP 地址将被映射回对应的内网 LAN IP 地址。 其后, 它会被 check-state 规则处理, 进而在暨存会话表中找到对应项, 并发到 LAN。 数据包接下来发到了内网 LAN PC 上, 而后者则会发送从远程服务器请求下一段数据的新数据包。 这个包会再次由 check-state 规则检查, 并找到发出的表项, 并执行其关联的动作, 即 'skipto 500'。 包跳转到规则 500 并被 NAT 后发出。 在接收一侧, 已经存在的会话的数据包, 会被 check-state 规则自动地处理, 并放到转发 natd 规则。 我们需要解决的问题是, 阻止所有的坏数据包, 而只允许授权的服务。 例如在防火墙上运行了 Apache 服务, 而我们希望人们在访问 Internet 公网的同时, 也能够访问本地的 web 站点。 新的接入开始请求包将匹配规则 100, 而 IP 地址则为防火墙所在的服务器而映射到了 LAN IP。 此后, 包会匹配所有我们希望检查的那些令人生厌的东西, 并最终匹配规则 425。 一旦发生匹配, 会发生两件事。 数据包会被发到 keep-state 动态表, 但此时, 所有来自那个源 IP 的会话请求的数量会被限制为 2。 这一做法能够挫败针对指定端口上服务的 DoS 攻击。 动作同时指定了包应被发到 LAN 上。 包返回时, check-state 规则会识别出包属于某一已经存在的会话交互, 并直接把它发到规则 500 做 NAT, 并发到发出接口。 示范规则集 #1: #!/bin/sh cmd="ipfw -q add" skip="skipto 500" pif=rl0 ks="keep-state" good_tcpo="22,25,37,43,53,80,443,110,119" ipfw -q -f flush $cmd 002 allow all from any to any via xl0 # exclude LAN traffic $cmd 003 allow all from any to any via lo0 # exclude loopback traffic $cmd 100 divert natd ip from any to any in via $pif $cmd 101 check-state # Authorized outbound packets $cmd 120 $skip udp from any to xx.168.240.2 53 out via $pif $ks $cmd 121 $skip udp from any to xx.168.240.5 53 out via $pif $ks $cmd 125 $skip tcp from any to any $good_tcpo out via $pif setup $ks $cmd 130 $skip icmp from any to any out via $pif $ks $cmd 135 $skip udp from any to any 123 out via $pif $ks # Deny all inbound traffic from non-routable reserved address spaces $cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP $cmd 301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP $cmd 302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP $cmd 303 deny all from 127.0.0.0/8 to any in via $pif #loopback $cmd 304 deny all from 0.0.0.0/8 to any in via $pif #loopback $cmd 305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config $cmd 306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs $cmd 307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster $cmd 308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast # Authorized inbound packets $cmd 400 allow udp from xx.70.207.54 to any 68 in $ks $cmd 420 allow tcp from any to me 80 in via $pif setup limit src-addr 1 $cmd 450 deny log ip from any to any # This is skipto location for outbound stateful rules $cmd 500 divert natd ip from any to any out via $pif $cmd 510 allow ip from any to any ######################## end of rules ################## 下面的这个规则集基本上和上面一样, 但使用了易于读懂的编写方式, 并给出了相当多的注解, 以帮助经验较少的 IPFW 规则编写者更好地理解这些规则到底在做什么。 示范规则集 #2: #!/bin/sh ################ Start of IPFW rules file ############################### # Flush out the list before we begin. ipfw -q -f flush # Set rules command prefix cmd="ipfw -q add" skip="skipto 800" pif="rl0" # public interface name of NIC # facing the public Internet ################################################################# # No restrictions on Inside LAN Interface for private network # Change xl0 to your LAN NIC interface name ################################################################# $cmd 005 allow all from any to any via xl0 ################################################################# # No restrictions on Loopback Interface ################################################################# $cmd 010 allow all from any to any via lo0 ################################################################# # check if packet is inbound and nat address if it is ################################################################# $cmd 014 divert natd ip from any to any in via $pif ################################################################# # Allow the packet through if it has previous been added to the # the "dynamic" rules table by a allow keep-state statement. ################################################################# $cmd 015 check-state ################################################################# # Interface facing Public Internet (Outbound Section) # Interrogate session start requests originating from behind the # firewall on the private network or from this gateway server # destine for the public Internet. ################################################################# # Allow out access to my ISP's Domain name server. # x.x.x.x must be the IP address of your ISP's DNS # Dup these lines if your ISP has more than one DNS server # Get the IP addresses from /etc/resolv.conf file $cmd 020 $skip tcp from any to x.x.x.x 53 out via $pif setup keep-state # Allow out access to my ISP's DHCP server for cable/DSL configurations. $cmd 030 $skip udp from any to x.x.x.x 67 out via $pif keep-state # Allow out non-secure standard www function $cmd 040 $skip tcp from any to any 80 out via $pif setup keep-state # Allow out secure www function https over TLS SSL $cmd 050 $skip tcp from any to any 443 out via $pif setup keep-state # Allow out send & get email function $cmd 060 $skip tcp from any to any 25 out via $pif setup keep-state $cmd 061 $skip tcp from any to any 110 out via $pif setup keep-state # Allow out FreeBSD (make install & CVSUP) functions # Basically give user root "GOD" privileges. $cmd 070 $skip tcp from me to any out via $pif setup keep-state uid root # Allow out ping $cmd 080 $skip icmp from any to any out via $pif keep-state # Allow out Time $cmd 090 $skip tcp from any to any 37 out via $pif setup keep-state # Allow out nntp news (i.e. news groups) $cmd 100 $skip tcp from any to any 119 out via $pif setup keep-state # Allow out secure FTP, Telnet, and SCP # This function is using SSH (secure shell) $cmd 110 $skip tcp from any to any 22 out via $pif setup keep-state # Allow out whois $cmd 120 $skip tcp from any to any 43 out via $pif setup keep-state # Allow ntp time server $cmd 130 $skip udp from any to any 123 out via $pif keep-state ################################################################# # Interface facing Public Internet (Inbound Section) # Interrogate packets originating from the public Internet # destine for this gateway server or the private network. ################################################################# # Deny all inbound traffic from non-routable reserved address spaces $cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP $cmd 301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP $cmd 302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP $cmd 303 deny all from 127.0.0.0/8 to any in via $pif #loopback $cmd 304 deny all from 0.0.0.0/8 to any in via $pif #loopback $cmd 305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config $cmd 306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs $cmd 307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster $cmd 308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast # Deny ident $cmd 315 deny tcp from any to any 113 in via $pif # Deny all Netbios service. 137=name, 138=datagram, 139=session # Netbios is MS/Windows sharing services. # Block MS/Windows hosts2 name server requests 81 $cmd 320 deny tcp from any to any 137 in via $pif $cmd 321 deny tcp from any to any 138 in via $pif $cmd 322 deny tcp from any to any 139 in via $pif $cmd 323 deny tcp from any to any 81 in via $pif # Deny any late arriving packets $cmd 330 deny all from any to any frag in via $pif # Deny ACK packets that did not match the dynamic rule table $cmd 332 deny tcp from any to any established in via $pif # Allow traffic in from ISP's DHCP server. This rule must contain # the IP address of your ISP's DHCP server as it's the only # authorized source to send this packet type. # Only necessary for cable or DSL configurations. # This rule is not needed for 'user ppp' type connection to # the public Internet. This is the same IP address you captured # and used in the outbound section. $cmd 360 allow udp from x.x.x.x to any 68 in via $pif keep-state # Allow in standard www function because I have Apache server $cmd 370 allow tcp from any to me 80 in via $pif setup limit src-addr 2 # Allow in secure FTP, Telnet, and SCP from public Internet $cmd 380 allow tcp from any to me 22 in via $pif setup limit src-addr 2 # Allow in non-secure Telnet session from public Internet # labeled non-secure because ID & PW are passed over public # Internet as clear text. # Delete this sample group if you do not have telnet server enabled. $cmd 390 allow tcp from any to me 23 in via $pif setup limit src-addr 2 # Reject & Log all unauthorized incoming connections from the public Internet $cmd 400 deny log all from any to any in via $pif # Reject & Log all unauthorized out going connections to the public Internet $cmd 450 deny log all from any to any out via $pif # This is skipto location for outbound stateful rules $cmd 800 divert natd ip from any to any out via $pif $cmd 801 allow ip from any to any # Everything else is denied by default # deny and log all packets that fell through to see what they are $cmd 999 deny log all from any to any ################ End of IPFW rules file ############################### diff --git a/zh_CN.GB2312/books/handbook/install/chapter.sgml b/zh_CN.GB2312/books/handbook/install/chapter.sgml index e357e91ea1..838e0588b7 100644 --- a/zh_CN.GB2312/books/handbook/install/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/install/chapter.sgml @@ -1,4117 +1,4117 @@ Jim Mock 结构、组织重整, 部分重写 Randy Pratt sysinstall 操作流程、屏幕抓图以及一般性文件 安装 FreeBSD 概述 installation FreeBSD 提供了一个以文字为主,简单好用的安装程序,叫做 sysinstall 。这是 FreeBSD 默认使用的安装程序; 厂商如果想,也可以提供适合自己需要的安装程序。本章说明如何使用 sysinstall 来安装 FreeBSD。 学习完本章之后,您将会知道: 如何制作 FreeBSD 安装磁盘 FreeBSD如何参照及分割您的硬盘 如何启动 sysinstall. 在执行 sysinstall 时您将要回答的问题、 问题代表什么意义,以及该如何回答它们。 在阅读本章之前,您应该: 阅读您要安装的 FreeBSD 版本所附的硬件支持列表以确定您的硬件有没有被支持。 一般来说,此安装说明是针对 &i386; (PC 兼容机) 体系结构的电脑。 如果有其它体系结构(如Alpha)的安装说明,我们将一并列出。 虽然本文档经常保持更新,但有可能与您安装版本上所带的说明文档有些许出入。 在这里建议您使用本说明文章作为一般性的安装指导参考手册。 硬件需求 最小配置 安装 &os; 所需的最小硬件配置, 随 &os; 版本和硬件架构不同而有所不同。 关于安装所需的最低硬件配置信息, 可以在 &os; 网站的 发行版信息 部分中的 安装说明书 中找到。 在接下来的几节中, 给出了这些信息的一些总结。 随您安装 &os; 的方式不同, 可能需要使用软驱或为 &os; 支持的 CDROM 驱动器, 有时候也可能需要的是一块网卡。 这将在 中进行介绍。 &i386; 和 pc98 架构 &os;/&i386 和 &os;/pc98 版本, 都需要 486 或更高的处理器, 以及至少 24 MB 的 RAM。 您需要至少 150 MB 的空闲硬盘空间, 才能完成最小的安装配置。 对于老旧的硬件而言, 多数时候, 装配更多的 RAM 和腾出更多的硬盘空间, 要比使用更快的处理器更有用。 Alpha 架构 Alpha 要安装 &os;/alpha, 您使用的必须是某种受支持的平台 (参见 ) 而且 &os; 必须独占一个硬盘。 目前 &os; 还无法与其它操作系统共享磁盘。 这个磁盘必须接在 SRM 固件支持的 SCSI 控制器上, 或者如果您机器上的 SRM 支持从 IDE 硬盘启动, 则应装到 IDE 硬盘上。 ARC Alpha BIOS SRM 此外您还需要用于您的平台 SRM 控制台固件。 有时, 可以在 AlphaBIOS (或 ARC) 固件和 SRM 之间切换。 如果没有, 则需要从制造商网站上下载并安装新的固件。 amd64 架构 运行 &os;/amd64 需要 &amd.athlon;64、 &amd.athlon;64-FX、 &amd.opteron; 或更高的处理器。 如果您的计算机使用 nVidia nForce3 Pro-150, 则 必须 使用 BIOS 配置, 禁用 IO APIC。 如果您没有找到这样的选项, 可能就只能转而禁用 ACPI 了。 Pro-150 芯片组存在一个 bug, 目前我们还没有找到绕过这一问题的方法。 &sparc64; 架构 要安装 &os;/&sparc64;, 必须使用它支持的平台 (参见 )。 &os;/&sparc64; 需要独占一块磁盘。 目前还没有办法与其它操作系统共享一块磁盘。 支持的硬件 支持的硬件列表, 会作为 &os; 发行版本的 &os; 兼容硬件说明提供。 这个文档通常可以在 CDROM 或 FTP 安装文件的顶级目录找到, 它的名字是 HARDWARE.TXT, 此外, 在 sysinstall 的 documentation 菜单也可以找到。 它针对特定的硬件架构列出了 &os; 已知支持的硬件。 不同发行版本和架构上的硬件支持列表, 可以在 &os; 网站的 发行版信息 页面上找到。 安装前的准备工作 列出您电脑的硬件清单 在安装 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 口
在清楚地了解了您计算机的配置之后, 需要检查它是否符合您希望安装的 &os; 版本的硬件需求。
备份您的数据 如果您的电脑上面存有重要的数据资料,那么在安装 FreeBSD 前请确定 您已经将这些资料备份了,并且先测试这些备份文档是否有问题。FreeBSD 安装程序在要写入任何资料到您的硬盘前都会先提醒您确认,一旦您确定要 写入,那么以后就没有反悔的机会。 决定要将 FreeBSD 安装到哪里 如果您想让 FreeBSD 使用整个硬盘,那么请直接跳到下一节。 但是,如果您想让 FreeBSD 跟您已有的系统并存,那么您必须对您数据 存在硬盘的分布方式有深入的了解以及其所造成的影响。 &i386; 体系结构的硬盘分配方式 一个 PC 硬盘可以被细分为许多块。 这些块被称为 partitions (分区)。 由于 &os; 内部也有分区的概念, 如此命名很容易导致混淆, 因此我们在 &os; 中, 将其称为磁盘 slice, 或简称为 slices。 例如, FreeBSD 提供的用于操作 PC 磁盘分区的工具 fdisk 就将其称为 slice 而不是 partition。 由于设计的原因, 每个硬盘仅 支持四个分区;这些分区叫做主分区(Primary partion)。 为了突破这个限制以便能使用更多的分区,就有了新的分区类型,叫做 扩展分区(Extended partition)。一个硬盘可以拥有一个扩展分区。在 扩展分区里可以建立许多个所谓的逻辑分区(Logical partitions) 每个分区都有其独立的分区号(partition ID), 用以区分每个分区的数据类型。FreeBSD 分区的分区号为 165 一般而言,每种操作系统都会有自己独特的方式来区别分区。例如 DOS 及其 之后的 &windows;, 会分配给每个主分区及逻辑分区一个 驱动器字符, 从 C: 开始。 FreeBSD 必须安装在主分区。 FreeBSD 可以在这个分区上面存放系统数据 或是您建立的任何文件。然而,如果您有多个硬盘,您也可以在这些硬盘上(全部 或部分)建立 FreeBSD 分区。在您安装 FreeBSD 的时候,必须要有一个分区可以给 FreeBSD 使用。这个分区可以是尚未规划的分区或是已经划好,但是里面的数据 您都不想保存的分区。 如果您已经用完了您硬盘上的所有分区,那么您必须使用其它操作系统所 提供的工具(如 DOS 或 &windows; 下的 fdisk)来腾出一个分区 给 FreeBSD 使用。 如果您的某个分区有多余的空间,您可以使用它。但是使用前您需要先整理 一下这些分区。 FreeBSD 最小安装需要约 100 MB 的空间,但是这仅是 非常 基本的安装,几乎没有剩下多少空间可以建立您自己的文件。一个较理想的最小安装是 250 MB,不含图形界面;或是 350 MB 以上,包含图形界面。如果您还需要安装 其它的第三方厂商的套件,那么将需要更多的硬盘空间。 您可以使用商业软件,例如 &partitionmagic; (硬盘分区魔术师) 或类似 GParted 这样的免费工具来调整分区尺寸, 为 FreeBSD 腾出空间。 FreeBSD 光盘的 tools 目录包含两个免费的工具也可以完成这个工作:FIPS 以及 PResizer,它们的文档可以在同一目录中找到。FIPSPResizer,和 &partitionmagic; 能够改变 FAT16 以及 FAT32 分区的大小 — 它们可以在 &ms-dos; 以及 &windows; ME 系统中使用。 这些工具的说明文件可以在同一个目录下面找到 &partitionmagic;GParted 都能改变 NTFS 分区的尺寸。 GParted 在许多 Live CD Linux 发行版, 如 SystemRescueCD 中均有提供。 目前已经有报告显示改变 µsoft; Vista 分区尺寸时会出现问题。 在进行此类操作时, 建议您准备一张 Vista 安装 CDROM。 此外, 与其他磁盘维护操作类我我, 强烈建议您事先进行备份。 不当的使用这些工具可能会删掉您硬盘上的数据资料!在使用这些工具前 确定您有最近的、没问题的备份数据。 使用已存在的分区 假设您只有一个 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 可以通过下面任何一种安装介质进行安装: 安装介质 CDROM 或 DVD 在同一计算机上的 DOS 分区 SCSI 或 QIC 磁带 软盘 网络 通过防火墙的一个 FTP 站点,或使用 HTTP 代理。 NFS 服务器 一个指定的并行或串行接口 如果您购买了 FreeBSD 的 CD 或 DVD,那么您可以直接进入下一节 如果您还没有 FreeBSD 的安装文件,您应该回到 一节, 它介绍了如何准备所需要的安装介质。之后,您就可以回到这一节, 并从 继续。 准备引导介质 FreeBSD 的安装过程开始于将您的电脑开机进入 FreeBSD 安装环境—-并非在 其它的操作系统上运行一个程序。计算机通常使用安装在硬盘上的操作系统进行 引导,也可以配置成使用一张bootable(可引导)的软盘进行启动。 大多数现代计算机都可以从光驱进行引导系统。 如果您有 FreeBSD 的安装光盘或 DVD(或者是您购买的,或者是您自己准备的。) 并且您的计算机可以从光驱进行启动 (通常在 BIOS 中会有 Boot Order 或类似的选项可以设置),那么您就可以跳过此小节。因为 FreeBSD 光盘及 DVD 光盘都是可 以引导的,用它们开机您不用做什么特别的准备。 一般来说,要建立安装盘(软盘)请依照下列步骤: 获取开机软盘映像文件 开机软盘映像文件可以在您的安装介质的 floppies/ 目录下找到, 另外您也可以从下述网站的 floppies 目录下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/<架构名>/<版本>-RELEASE/floppies/. 将 <架构名><版本> 替换为您使用的计算机体系结构和希望安装的版本号。 例如,用于安装 &i386; 上的 &os; &rel.current;-RELEASE 的文件的地址, 应该是 软盘映像文件的扩展名是 .flp。 在 floppies/ 目录中包括了许多不同的映像文件, 随您安装的 FreeBSD 版本, 某些时候也随硬件的不同, 您需要使用的映像文件可能会有所不同。 您通常会需要四张软盘, 即 boot.flpkern1.flpkern2.flp, 以及 kern3.flp。 请查阅同一目录下的 README.TXT 文件以了解关于这些映像文件的最新信息。 您的 FTP 程序必须使用 二进制模式 来下载这些映 像文件。有些浏览器只会用 text (或ASCII ) 模式来传输数据, 用这些浏览器下载的映像文件做成的软盘将无法正常开机。 准备软盘 您必须为您下载的每一个映像文件准备一张软盘。并且请避免使用到坏掉的 软盘。最简单的方式就是您先将这些软盘格式化,不要相信所谓的已格式化的软 盘。在 &windows; 下的格式化程序不会告诉您出现多少坏块,它只是简单的标记它 们为 bad 并且忽略它们。根据建议您应该使用全新的软盘来存放 安装程序。 如果您在安装 FreeBSD 的过程中造成当机、冻结或是其它怪异现象,第一个 要怀疑的就是引导软盘。请用其它的软盘制作映像文件再试试看。 将映像文件写入软盘中 .flp 文件 并非 一般的文件, 您不能直接将它们复制到软盘上。事实上它是一张包含完整磁盘内容的映像文件。这 表示您 不能 简单的使用 DOS 的 copy 命令将文件写到软盘上, 而必须使用特别的工具程序将映像文件直接写到软盘中。 DOS 如果您使用 &ms-dos; 或 &windows; 操作系统来制作引导盘,那么您可以使用我们提供 的 fdimage 程序来将映像文件写到软盘中。 如果您使用的是光盘,假设光盘的驱动器符号为 E:, 那么请执行下面的命令: E:\> tools\fdimage floppies\boot.flp A: 重复上述命令以完成每个 .flp 文件的写入,每换一个 映像文件都必须更换软盘;制作好的软盘请注明是使用哪个映像文件做的。如果您的映 像文件存放在不同的地方,请自行修改上面的指令指向您存放 .flp 文件的地方。要是您没有 FreeBSD 光盘,您可以到 FreeBSD 的 FTP 站点tools 目录 中下载。 如果您在 &unix; 系统上制作软盘(例如其它 FreeBSD 机器),您可以使用 &man.dd.1; 命令来将映像文件写到软盘中。如果您用 FreeBSD,可以执行下面的命令: &prompt.root; dd if=boot.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 boot.flp 文件的那张盘, 放入软盘驱动器中。 如果您是从光盘安装, 那么开机后请将 FreeBSD 光盘放入光驱中。 如果您开机后如往常一样并没有从软盘或光盘引导,请检查: 是不是软盘或光盘太晚放入面错失开机引导时间。 如果是, 请将它们放入后重新开机。 BIOS 设定不对,请重新检查 BIOS 的设定。 您的 BIOS 不支持从这些安装介质引导。 FreeBSD 即将启动。如果您是从光盘引导,您会见到类似下面的画面: Booting from CD-Rom... CD Loader 1.2 Building the boot loader arguments Looking up /BOOT/LOADER... Found Relocating the loader and the BTX Starting the BTX loader BTX loader 1.00 BTX version is 1.01 Console: internal video/keyboard BIOS CD is cd0 BIOS drive C: is disk0 BIOS drive D: is disk1 BIOS 639kB/261120kB available memory FreeBSD/i386 bootstrap loader, Revision 1.1 Loading /boot/defaults/loader.conf /boot/kernel/kernel text=0x64daa0 data=0xa4e80+0xa9e40 syms=[0x4+0x6cac0+0x4+0x88e9d] \ 如果您从软盘启动, 则应看到类似下面的画面: Booting from Floppy... Uncompressing ... done 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 1.1 Loading /boot/defaults/loader.conf /kernel text=0x277391 data=0x3268c+0x332a8 | Insert disk labelled "Kernel floppy 1" and press any key... 请根据提示将 boot.flp 软盘取出, 插入 kern1.flp 这张盘, 然后按 Enter。 您只需从第一张软盘启动, 然后再需要时根据提示插入其他软盘就可以了。 不论是从软盘或光盘引导, 接下来都会进入 &os; 引导加载器菜单:
&os; Boot Loader Menu
您可以等待十秒, 或按 Enter
引导 Alpha 系统 Alpha 从电脑尚未打开电源开始。 打开电脑电源并等待屏幕上出现开机提示信息。 如您需要制作用于安装的软盘, 请参考 , 将其中一张制作为第一片引导盘, 其中包含 boot.flp。 将这张软盘插进软驱, 并输入下列命令, 以便从软盘启动 (请视实际情况修改命令中的软驱盘符): >>>BOOT DVA0 -FLAGS '' -FILE '' 如果您要从光盘引导,请将光盘放入光驱中然后输入下列命令开始安装 (请视情况修改命令中的光驱盘符): >>>BOOT DKA0 -FLAGS '' -FILE '' 然后 FreeBSD 就会启动。如果您从软盘引导,到某个阶段您会看到下面的信息: Insert disk labelled "Kernel floppy 1" and press any key... 此时应按照提示取出 boot.flp 软盘, 换上 kern1.flp 软盘, 然后按 Enter 键。 不论从软盘或光盘引导,您都会看到下面这段信息: Hit [Enter] to boot immediately, or any other key for command prompt. Booting [kernel] in 9 seconds... _ 您可以等待 10 秒或是按 Enter 跳过。之后就会进入内核 设定菜单。 引导 &sparc64; 多数 &sparc64; 系统均配置为从硬盘自动引导。 如果希望安装 &os;, 就需要从网络或 CDROM 启动了, 这需要首先进入 PROM (OpenFirmware)。 要完成这项工作, 首先需要重启系统, 并等待出现引导消息。 具体的信息取决于您使用的型号, 不过它应该会是类似下面这样: Sun Blade 100 (UltraSPARC-IIe), Keyboard Present Copyright 1998-2001 Sun Microsystems, Inc. All rights reserved. OpenBoot 4.2, 128 MB memory installed, Serial #51090132. Ethernet address 0:3:ba:b:92:d4, Host ID: 830b92d4. 如果您的系统此时开始了从硬盘引导的过程, 则需要按下 L1AStopA, 或者在串口控制台上发送 BREAK (例如, 在 &man.tip.1; 或 &man.cu.1; 中是 ~#) 以便进入 PROM 提示符。 它应该是类似下面这样: ok ok {0} 这是在只有一颗 CPU 的系统上的提示。 这是用于 SMP 系统的选项, 这里的数字, 是系统中可用的 CPU 数量。 这时, 将 CDROM 插入驱动器, 并在 PROM 提示符后面, 输入 boot cdrom
查看设备探测的结果 前面屏幕显示的最后几百行字会存在缓冲区中以便您查阅。 要浏览缓冲区,您可以按下 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 找到所有您期望出现的设备。 如果系统没有找到设备, 则不会将其列出。 定制内核 能够让您为系统添加默认的 GENERIC 内核所不支持的设备, 如声卡等。 在 &os; 6.2 和更高版本中, 在探测完系统设备之后, 将显示 。 请使用光标键来选择国家或地区。 接着按 Enter, 系统将自动设置地区及键盘映射。 您也可以很容易地退出 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;, 则安装程序将重新启动。 如果您是从软盘启动, 则在重启系统之前, 需要将 boot.flp 软盘取出。
介绍 Sysinstall sysinstall 是 FreeBSD 项目所提供的安装程序。 它以 console(控制台)为主,分为多个菜单及画面让您配置及控制安装过程。 sysinstall 菜单画面由方向键、EnterTabSpace, 以及其它按键所控制。在主画面的 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 也由此了解到计算机计数是从 0 开始的。 虽然我们这里的例子使用 SCSI 硬盘,但是相同的概念也可以套用在 IDE 硬盘上。 使用 FDisk 创建分区 如果不再做改变,数据将会写进硬盘。如果您犯了一个错误想重新开始,请选择 sysinstall 安装程序的退出按钮(exit)。或按 U 键来 Undo 操作。如果您的操作没有结果,您总可以重新启动您 的计算机来达到您的目的。 当您在 sysinstall 主菜单选择使用标准安装 后,您会看到下面的信息: Message In the next menu, you will need to set up a DOS-style ("fdisk") partitioning scheme for your hard disk. If you simply wish to devote all disk space to FreeBSD (overwriting anything else that might be on the disk(s) selected) then use the (A)ll command to select the default partitioning scheme followed by a (Q)uit. If you wish to allocate only free space to FreeBSD, move to a partition marked "unused" and use the (C)reate command. [ OK ] [ Press enter or space ] 如屏幕指示,按 Enter 键,然后您就会看到一个列表 列出所有在探测设备的时候找到的硬盘。 范例显示的是有找到两个 IDE 硬盘的情形,这两个硬盘分别为 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>bsdlabel</application> 创建分区 您现在必须在刚刚建立好的 slice 中规划一些 label。 请注意, 每个 label 的代号是 ah, 另外, 习惯上 bcd 是有特殊用途的, 不应该随意变动。 某些应用程序可以利用一些特殊的分区而达到较好的效果,尤其是分区分散 在不同的硬盘的时候。但是,现在您是第一次安装FreeBSD,所以不需要去烦恼如 何分割您的硬盘。最重要的是,装好FreeBSD然后学习如何使用它。当您对FreeBSD 有相当程度的熟悉后,您可以随时重新安装FreeBSD,然后改变您分区的方式。 下面的范例中有四个分区—一个是磁盘交换分区,另外三个是文件系统。 为第一个硬盘分区 分区 文件系统 大小 描述 a / 100 MB 这是一个根文件系统(root filesystem)。任何其它的文件系统都会 挂在根目录(译注:用根目录比较亲切)下面。 100 MB 对于此目录来说 是合理的大小,因为您往后并不会在这里存放太多的数据;在安装FreeBSD后会 用掉约 40 MB 的根目录空间。剩下的空间是用来存放临时文件用的,同时, 您也应该预留一些空间,因为以后的FreeBSD版本可能会需要较多的 /(根目录)空间。 b N/A 2-3 x RAM b 分区为系统磁盘交换分区(swap space)。 选择正确的交换空间大小可是一门学问唷。 一般来说,交换空间的大小应该是您系统上内存(RAM) 大小的2到3倍。 交换空间至少要有 64 MB。 因此, 如果您的电脑上的 RAM 比 32 MB 小,请将交换空间大小设为 64 MB。 如果您有一个以上的硬盘,您可以在每个硬盘上都配置交换分区。 FreeBSD 会利用每个硬盘上的交换空间, 这样做能够提高 swap 的性能。 如果是这种情形, 先算出您总共需要的交换空间大小 (如128 MB), 然后除以您拥有的硬盘数目(如2块), 算出的结果就是每个硬盘上要配置的交换空间的大小。 在这个例子中, 每个硬盘的交 换空间为 64 MB。 e /var 50 MB /var 目录会存放不同长度的文件、日志以及 其它管理用途的文件。大部分这些文件都是FreeBSD每天在运行的时候会读取或 是写入的。当这些文件放在另外的文件系统(译注:即/var)可以避免影响到 其它目录下面类似的文件存取机制。 f /usr 剩下的硬盘空间 您所有的其它的文件通常都会存在/usr 目录以及其子目录下面。
如果您要将FreeBSD安装在一个以上的硬盘,那么您必须在您配置的其它分区上 再建立分区。最简单的方式就是在每个硬盘上建立两个分区,一个是交换分区,一个 是文件系统分区。 为其它磁盘分区 分区 文件系统 大小 描述 b N/A 见描述 之前提过,交换分区是可以跨硬盘的。但是,即使 a 分区没有使用,习惯上还是会把交换分区放在 b 分区上。 e /diskn 剩下的硬盘空间 剩下的空间是一个大的分区,最简单的做法是将之规划为 a分区而不是e分区。然而, 习惯上a分区是保留给根目录 (/) 用的。您不一定要遵守这个习惯,但是sysinstall 会,所以照着它做会使您的安装比较清爽、干净。您可以将这些文件系统挂在任何 地方,本范例建议将它们挂在/diskn 目录,n 依据每个硬盘而有所不同,但是,您喜欢的话 也可将它们挂在别的地方。
分区的配置完成后,您可以用sysinstall. 来建立它们了。您会看到下面的信息: Message Now, you need to create BSD partitions inside of the fdisk partition(s) just created. If you have a reasonable amount of disk space (200MB or more) and don't have any special requirements, simply use the (A)uto command to allocate space automatically. If you have more specific needs or just don't care for the layout chosen by (A)uto, press F1 for more information on manual layout. [ OK ] [ Press enter or space ] 按下 Enter 键开始FreeBSD分区表编辑器,称做 Disklabel 显示您第一次执行 Disklabel的画面。画面分为三个区域。 前几行显示的是您正在编辑的硬盘以及您正在建立的slice位于哪个分区上。 (在这里, Disklabel 使用的是 分区名称 而不是 slice 名)。此画面也会显示slice还有 多少空间可以使用;亦即,有多余的空间,但是尚未指派分区。 画面中间区域显示已建立的区区,每个分区的文件系统名称、所占的大小以及 一些关于建立这些文件系统的参数选项。 下方的第三区显示在 Disklabel中可用的按键。
Sysinstall Disklabel 编辑器
Disklabel 您可以自动配置分区以及给它们预设 的大小。您可以按 A键使用此功能。您会看到类似 的画面。根据您硬盘的大小,自动分配所配置 的大小不一定合适。但是没有关系,您并不一定要使用预设的大小。 默认情况下会给/tmp 目录一个独立分区,而不是附属在 / 之下。这样可以 避免将一些临时文件放到根目录中(译注:可能会用完根目录空间)。
Sysinstall Disklabel 编辑器-使用自动配置
如果您不想使用默认的分区布局, 则需要用方向键移动光标并选中第一个分区, 然后按 D 来删除它。 重复这一过程直到删除了所有推荐的分区。 要建立第一个分区 (a, 作为 / — 根文件系统), 请确认您已经在屏幕顶部选中了正确的 slice, 然后按 C。 接下来将出现一个对话框, 要求您输入新分区的尺寸 (如 所示)。 您可以输入以块为单位的尺寸, 或以 M 表示MB、 G 结尾表示GB, 或者 C 表示柱面数的方式来表达尺寸。 从 FreeBSD 5.X 开始, 用户可以: 使用 Custom Newfs (Z) 选项来选择 UFS2 (在 &os; 5.1 和更高版本中的默认值)。 用 Auto Defaults 来创建, 然后用 Custom Newfs 选项, 或在创建文件系统时指定 。 如果您使用了 Custom Newfs选项, 不要忘记增加 来启用 SoftUpdates!
根目录使用空间
显示在对话框中的默认大小是使用整个分区,您可以用 Backspace键删除这些数字然后按照上述方式输入您想要的 大小,如64M), 然后按&gui.ok;。
编辑要分区大小
输入完大小后接着问您要建立的分区是文件系统还是交换空间,如 所示。第一个分区是文件系统,所以 确认选择 FS后按Enter键。
选择根分区类型
最后,因为您要建立的是一个文件系统,所以必须告诉 Disklabel 这个文件系统要挂接在什么地方,如 所示。根文件系统的挂接点 /, 所以请输入 /,然后按 Enter键。
选择根挂接点
刚刚制作好的分区会显示在画面上。您应该重复上述的动作以建立其它的 分区。当建立交换空间的时候,系统不会问您要将它挂接在哪里,因为交换空间是不用 挂在系统上的。当您在建立最后一个分区/usr的时候,您可以 直接使用默认的大小,即所有此分区剩余的空间。 您最终的 FreeBSD DiskLabel 编辑器画面会类似 , 实际数字按您的选择而有所不同。按下 Q 键完成分区的建立。
Sysinstall Disklabel 编辑器
选择要安装的软件包 选择要安装的软件包 安装哪些软件包在很大程度上取决于系统将被用来做什么,以及有多少可用的磁盘空间。 内建的选项包括了运行所需要的最小系统,到把所有软件包全都装上的常用配置。 &unix; 或 FreeBSD 新手通常直接选择一个设定好的软件包就可以了, 而有经验的使用者则可以考虑自己订制安装哪些软件包。 按下 F1 可以看到有关软件包的更多选项信息, 以及它们都包含了哪些软件,之后,可以按 Enter 回到软件包选择画面。 如果您想要使用图形界面, 则必须选择软件包名称开头是 X 的那些软件包。 对于 X 服务器的配置, 以及选择默认的桌面管理器这样的工作必须在 &os; 安装完成之后才能作。 关于配置 X 服务器的更多资料可以在 找到。 默认安装的 X11 版本是 &xorg; 如果需要定制内核, 您还需要选择包含源代码的那个选项。 要了解为什么应该编译和构建新的内核, 请参见 显然, 包含所有组件的系统是最万能的。 如果磁盘空间足够, 用光标键选择 中的 All 并按 Enter。 如果担心磁盘空间不够的话, 则选择最合适的选项。 不要担心选择的是否是最合适的, 因为其他软件包可以在安装完毕后再加入进来。
选择软件包
安装ports软件包 当选择完您想要安装的部分后,接着会询问您要不要安装FreeBSD Ports 软件包;Ports软件包可以让您简单方便地安装软件包。Ports本身并不包含编辑 软件所需要的程序源代码,而是一个包含自动下载、编辑以及安装的文档集合。 一章讨论如何使用Ports. 安装程序并不会检查您是否有足够的硬盘空间来放ports,所以,如果要安装 ports软件所,请先确定您有足够的硬盘空间。 FreeBSD &rel.current;版本 FreeBSD Ports Collection 大约占用 &ports.size; 大小的硬盘空间。您要为 这些版本设置大一点的值来安装它们。 User Confirmation Requested Would you like to install the FreeBSD Ports Collection? This will give you ready access to over &os.numports; ported software packages, at a cost of around &ports.size; of disk space when "clean" and possibly much more than that if a lot of the distribution tarballs are loaded (unless you have the extra CDs from a FreeBSD CD/DVD distribution available and can mount it on /cdrom, in which case this is far less of a problem). The Ports Collection is a very valuable resource and well worth having on your /usr partition, so it is advisable to say Yes to this option. For more information on the Ports Collection & the latest ports, visit: http://www.FreeBSD.org/ports [ Yes ] No 选择 &gui.yes; 将会安装 Ports Collection, 而选择 &gui.no; 则将跳过它。 选好后按 Enter 继续。 此后, 选择安装的软件包的屏幕将再次出现。
确认您要安装的软件包
如果对您的选择感到满意,请选择Exit 退出,确保&gui.ok; 被高亮显示,然后按Enter 继续。
选择您要使用的安装介质 如果要从 CDROM 或 DVD安装,使用方向键将光标移到 Install from a FreeBSD CD/DVD。确认 &gui.ok; 被选取,然后按 Enter 开始安装程序。 如果要使用其它的方式安装,请选择适当的安装介质然后按照屏幕指示 进行安装。 F1 可以显示安装介质的在线说明。按一下 Enter 可返回选择安装介质画面。
选择安装介质
FTP安装模式 installation network FTP 使用FTP安装,有三种方式:主动式(active)FTP、被动式(passive)FTP 或是透过HTTP代理服务器。 主动式FTP: 从FTP服务器安装 这个选项将会使所有的FTP传输使用 Active模式。 这将无法通过防火墙,但是可以使用在那些比较早期,不支持被动模式的FTP站。 如果您的连接在使用被动(默认值)模式卡住了,请换主动模式看看! 被动模式FTP: 通过防火墙从FTP服务器安装 FTP passive mode 此选项会让 sysinstall 使用 Passive模式来安装。这使得使用者可以穿过 不允许用非固定TCP PORTS连入的防火墙。 FTP 透过 HTTP 代理服务器: 透过HTTP代理服务器,由 FTP服务器安装 FTP via a HTTP proxy 此选项会让 sysinstall 通过HTTP协议 (像浏览器一样)连到proxy服务器。proxy服务器会解释送出的请求, 然后通知FTP服务器。因为通过HTTP协议,所以可以穿过防火墙。 要用这种方式,您必须指定proxy服务器的地址。 对于一个 FTP 代理服务器而言,通常在使用者登入名称中加入您要登入的 服务器的用户名,加在 @ 符号后面。然后代理服务器就会 假装 成一个真的服务器。 例如, 假设您要从 ftp.FreeBSD.org 安装,通过 FTP 代理服务器 foo.example.com,使用1234端口。 在这种情况下,您可以到 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: /usr/sbin/sysinstall. [ OK ] [ Press enter or space ] 按下 Enter 以进行安装后的配置。 选择 &gui.no; 然后按 Enter 会取消安装,不会对您的系统造成更动。您会看到下面的信息: Message Installation complete with some errors. You may wish to scroll through the debugging messages on VTY1 with the scroll-lock feature. You can also choose "No" at the next prompt and go back into the installation menus to retry whichever operations have failed. [ OK ] 产生这个信息是因为什么东西也没有安装,按下 Enter 后会离开安装程序回到主安装界面。从主安装界面可以退出安装程序。 安装后的配置 安装成功后, 就可以进行进一步的配置了。 引导新安装的 FreeBSD 系统之后, 使用 sysinstall (/stand/sysinstall 如果您使用的是 &os; 5.2 之前的版本), 并选择 Configure 配置网卡 如果您之前配置用 PPP 通过 FTP 安装,那么这个画面将不会出现;正像所说 的那样,您可以稍后再做配置。 如果想更多的了解网卡或将FreeBSD配置为网关或路由器,请参考 Advanced Networking 的相关文章。 User Confirmation Requested Would you like to configure any Ethernet or SLIP/PPP network devices? [ Yes ] No 如果要配置网卡,请选择 &gui.yes; 然后按 Enter。 否则请选择 &gui.no; 继续。
选择网卡设备
用方向键选择您要配置的网卡接口,然后按Enter User Confirmation Requested Do you want to try IPv6 configuration of the interface? Yes [ No ] 目录私人区域网络IP协议IPv4已经足够,所以选择 &gui.no; 然后按 Enter 如果想试试新的IP通信协议 IPv6 ,使用 RA 服务,请选择 &gui.yes; 然后按 Enter。 寻找 RA 服务器将会花费几秒的时间。 User Confirmation Requested Do you want to try DHCP configuration of the interface? Yes [ No ] 如果您不需要 DHCP (Dynamic Host Configuration Protocol 动态主机配置协议) ,选择 &gui.no; 然后按Enter 选择 &gui.yes; 会执行dhclient, 如果成功,它会自动将网络配置信息填上。更多的信息请参考 下面的网络配置显示了怎样把以太网设备配置成区域网络网关的角色。
配置 ed0接口
使用Tab 键可以在各个栏目之间进行切换,请输入适当 的信息: Host(机器名称) 完整的机器名称,例如本例中的 k6-2.example.com Domain(域名) 您机器所在的域名称,如本例的 example.com IPv4 Gateway(IPv4网关) 输入将数据包传送到远端网络的机器IP地址。只有当机器是网络上的 一个节点时才要输入。如果这台机器要作为您局域网的网关, 请将此处设为空白。IPv4网关,也被称作默认网关或 默认路由器。 域名服务器 本地网络中的域名服务器的IP地址。本例中假设机器所在的网络中 没有域名服务器,所以填入的是ISP提供的域名服务器地址 (208.163.10.2。) IPv4 地址 本机所使用的IP地址。本例为 192.168.0.1 子网掩码 在这个局域网中所使用的地址块是 192.168.0.0 - 192.168.0.255, 对应的子网掩码是 255.255.255.0 ifconfig 额外参数设定 任何ifconfig命令跟网卡接口有关的参数。 本范例中没有。 使用 Tab 键选择 &gui.ok;然后按 Enter键。 User Confirmation Requested Would you like to Bring Up the ed0 interface right now? [ Yes ] No 选择 &gui.yes; 然后按 Enter 将会将机器的网卡转为启用状态。机器下次启动 的时候即可使用。
配置网关 User Confirmation Requested Do you want this machine to function as a network gateway? [ Yes ] No 如果这台机器要作为本地网络和其它机器之间传送数据包的网关,请选择 &gui.yes; 然后按 Enter。 如果这台机器只是网络上的普通节点,请选择 &gui.no; 并按 Enter 继续。 配置网络服务 User Confirmation Requested Do you want to configure inetd and the network services that it provides? Yes [ No ] 如果选择 &gui.no;, 许多网络服务,如 telnetd 将不会启用。 这样, 远端用户将无法 telnet 进入这台机器。 本机上的用户还是可以 telnet到远端机器的。 这些服务可以在安装完成后修改/etc/inetd.conf 配置文件来启用它们。请参阅 以获得更多的信息。 如果您想现在就配置这些网络服务,请选择 &gui.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 FTP anonymous User Confirmation Requested Do you want to have anonymous FTP access to this machine? Yes [ No ] 不允许匿名 FTP访问 选择默认的 &gui.no; 并按下 Enter 键将仍然可以让在这台机器上有账号的用户访问 FTP。 允许匿名 FTP访问 如果您选择允许匿名 FTP 存取,那么网络中任何人都可以使用FTP来访问您 的机器。在启用匿名访问之前应该考虑网络的安全问题。如果要知道更多有关网络 安全的信息,请参阅 要启用FTP匿名访问,用方向键选择 &gui.yes; 然后按 Enter键。您会看到下面(或类似)的画面:
默认的匿名 FTP 配置
F1 键可以查看在线帮助文档: This screen allows you to configure the anonymous FTP user. The following configuration values are editable: UID: The user ID you wish to assign to the anonymous FTP user. All files uploaded will be owned by this ID. Group: Which group you wish the anonymous FTP user to be in. Comment: String describing this user in /etc/passwd FTP Root Directory: Where files available for anonymous FTP will be kept. Upload subdirectory: Where files uploaded by anonymous FTP users will go. 默认的FTP根目录将放在 /var目录下。如果您 的/var目录空间不足以应付您的FTP需求,您可以将FTP的根目录改为 /usr 目录下的 /usr/ftp 目录。 当您对一切配置都满意后,请按 Enter 键继续。 User Confirmation Requested Create a welcome message file for anonymous FTP users? [ Yes ] No 如果您选择 &gui.yes; 并按下 Enter键,系统会自动打开文本编辑器让您编辑FTP的欢迎信息。
编辑FTP欢迎信息
此文本编辑器叫做 ee。按照指示修改信息文本或是 稍后再用您喜爱的文本编辑器来修改。请记住画面下方显示的文件位置。 Esc 将弹出一个默认为 a) leave editor的对话框。按 Enter 退出并继续。再次按 Enter 将保存修改。
配置网络文件系统 网络文件系统 (NFS) 可以让您可以在网络上共享您的文件。一台机器可以 配置成NFS服务器、客户端或两者并存。请参考 以获得更多的信息。 NFS 服务器 User Confirmation Requested Do you want to configure this machine as an NFS server? Yes [ No ] 如果您不想安装网络文件系统,请选择 &gui.no; 然后按 Enter键。 如果您选择 &gui.yes; 将会出现一个对话框提醒您 必须先建立一个 exports 文件。 Message Operating as an NFS server means that you must first configure an /etc/exports file to indicate which hosts are allowed certain kinds of access to your local filesystems. Press [Enter] now to invoke an editor on /etc/exports [ OK ] Enter 键继续。系统会启动文本编辑器让您编辑 exports 文件。
编辑 <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
配置系统终端 系统提供了几个选项可以让您配置终端的表现方式。 User Confirmation Requested Would you like to customize your system console settings? [ Yes ] No 要查阅及配置这些选项,请选择 &gui.yes; 并按Enter
系统终端配置选项
最常用的选项就是屏幕保护程序了。使用方向键将光标移动到 Saver 然后按Enter
屏幕保护程序选项
选择您想使用的屏幕保护程序,然后按 Enter。 之后回到系统终端配置画面。 默认开启屏幕保护程序的时间是300秒。如果要更改此时间,请再次选择 Saver 。然后选择 Timeout 并按 Enter键。系统会弹出一个对话框如下:
屏幕保护时间设置
您可以直接改变这个值,然后选 &gui.ok;并按 Enter 键回到系统终端配置画面。
退出系统终端配置
选择 Exit 然后按下 Enter 键会回到安装后的配置画面。
配置时区 配置您机器的时区可以让系统自动校正任何区域时间的变更并且在执行 一些跟时区相关的程序时不会出错。 例子中假设此台机器位于美国东部的时区。请参考您所在的地理位置来配置。 User Confirmation Requested Would you like to set this machine's time zone now? [ Yes ] No 选择 &gui.yes; 并按下 Enter键以配置时区。 User Confirmation Requested Is this machine's CMOS clock set to UTC? If it is set to local time or you don't know, please choose NO here! Yes [ No ] 这里按照您机器时间的配置,选择 &gui.yes; 或 &gui.no; 然后按 Enter
选择您所处的地理区域
请选择适当的区域然后按 Enter
选择您所在的国家
选择您所在的国家然后按 Enter
选择您所在的时区
选择您所在的时区然后按 Enter Confirmation Does the abbreviation 'EDT' look reasonable? [ Yes ] No 检查一下时区的缩写是否正确,如果没错,请按 Enter 返回系统安装后的配置画面。
Linux 兼容性 User Confirmation Requested Would you like to enable Linux binary compatibility? [ Yes ] No 选择 &gui.yes; 并按下Enter 键,将允许您在FreeBSD中执行Linux的软件。安装程序会安装一些为了跟Linux 兼容的软件包。 如果您是通过FTP安装,那么您必须连到网络上。有时候FTP站并不会包含 所有的安装软件包(例如Linux兼容软件包);不过,稍后您还可以再安装这个 项目。 配置鼠标 此选项可以让您在终端上使用三键鼠标剪贴文字。如果您用的鼠标是两个 按钮,请参考手册 &man.moused.8;;以取得有关模拟三键鼠标的信息。范例中 使用的鼠标不是USB接口。(例如ps/2或com接口的鼠标): User Confirmation Requested Does this system have a non-USB mouse attached to it? [ Yes ] No 如果您使用的不是USB鼠标,请选择 &gui.yes; ; 否则请选择 &gui.no; 。然后按Enter
选择鼠标类型
使用方向键选择 Type 然后按 Enter
设置鼠标协议
在这个例子中使用的类型是ps/2鼠标,所以可以使用默认的 Auto(自动) 。 您可以用方向键选择合适的项目, 确定选择了 &gui.ok; 后按 Enter 键离开此画面。
配置鼠标端口
选择 Port 然后按 Enter
配置鼠标端口
假设这台机器用的是ps/2鼠标,您可以采用默认的 PS/2 选项。请选择适当的项目然后按 Enter
启动鼠标服务进程
选择Enable然后按 Enter 来启动和测试鼠标。
测试鼠标功能
鼠标指针可以在屏幕上移动,指明鼠标服务已经正常启用。那么请选择 &gui.yes; 按 Enter键。否则鼠标没 有配置成功 — 选择 &gui.no; 并尝试不同的配置 选项。 选择 Exit 并按 Enter 退回到系统安装完成后的配置画面。
Tom Rhodes Contributed by 配置其他网络服务 配置网络服务总是让那些新手敬畏,因为他们缺乏在这个领域应有的基础知识。 网络,包括因特网有许多关于现代操作系统包括 &os; 的评论文章。这些文章对于 理解&os;拥有的广泛的网络性能是非常有帮助的。在安装这些服务的过程中也能让 用户理解他们可用的各种服务。 网络服务是一些可以使在网络的任何人来访问您提供的服务的程序。有许多 努力想使这些程序不会有任何的 伤害。不幸的是,这些程序并 不是十全十美的,黑客可能会掌握程序中的一些漏洞来进行攻击。只启用一些您 熟悉的和需要的服务十分重要。如果您存在一些疑虑或没有启用这些服务的必要, 那么最好不要使用这些服务。您可以事后通过运行 sysinstall 程序或使用 /etc/rc.conf 配置文件来启用它们。 选择 Networking 选项将下显示一个类似下面的菜单:
网络配置之上层配置
第一个选项,Interfaces, 已经在前面 中讨论过,因此这里可以略过。 选择 AMD 选项,添加 BSD 对自动挂接程序的支持。这个程序和NFS 协议一起使用 不需要经过特别的设置就可以自动挂接远程文件系统。 下一行是 AMD Flags 的参数选项。当您选择后,会弹出一个 子菜单来让您选择 AMD 的参数。菜单中包含一系列的选项: -a /.amd_mnt -l syslog /host /etc/amd.map /net /etc/amd.map 选项用来设置默认的挂接位置,这里使用的是 /.amd_mnt目录。 指定默认的 日志 文件;但是,当 syslogd 被指定用来接收所有的日志时,那么它们会被送到 系统日志程序。/host 被用来挂接远程 主机输出的一个文件系统,例子中/net 目录被用来挂接从IP输出的一个文件系统。 /etc/amd.map 文件定义了 AMD 的默认 输出选项。 FTP anonymous Anon FTP 允许匿名 FTP 访问。 选中这个选项,可以使这台机器成为一台匿名 FTP 服务器。 要注意启用这个选项的安全风险。其它的菜单将说明一些安全问题和更深入的配置。 Gateway 配置菜单可以使本机器成为一台以前我们提到过 的网关。如果您在安装过程中偶尔选中了它,也可以在这里选中这个选项来取消。 Inetd 选项用来配置或完全禁止我们在上面讨论的 &man.inetd.8; 守护程序。 Mail 可以用来配置系统默认的 MTA 或邮件传输代理。选择这个选项将了出现下面的菜单:
选择默认的 MTA
这里给您提供了一个安装默认MTA 的机会。 MTA 用来投递本系统上用户邮件到因特网去。 选择 Sendmail 将会安装 &os;默认的 流行的的 sendmail 服务程序。 - Sendmail local 选项用来设置sendmail - 默认的MTA,也可以禁止它从Internet接收邮件的能力。 + Sendmail local 选项用来设置 sendmail + 默认的 MTA,也可以禁止它从Internet接收邮件的能力。 还有其它的一些选项如: PostfixExim 都类似于 - Sendmail的角色。它们两者也可以投递邮件; - 有些用户更喜欢选择使用Sendmail、 - MTA二者之一。 + Sendmail 的角色。它们两者也可以投递邮件; + 有些用户更喜欢选择使用 Sendmail、 + MTA 二者之一。 选择 MTA或不选择它之后,网络配置菜单的下一 个选项是 NFS client 客户端程序。 NFS client 客户端可以使系统通过 NFS 与服务器进行通信。 - NFS 服务器通过NFS + NFS 服务器通过 NFS 协议可以使其它在网络上的机器来访问自己的文件系统。如果这台机器要作为一台 独立的服务器,这个选项可以保留不选。下面可能还有更多的配置,关于客户端和 服务器的配置请参阅 一节。 接下来的 NFS 服务器选项,可以允许您把系统设备成 为一台NFS 服务器。这需要更多的信息来启动远程过程调 - 用(RPC)服务。 RPC用来连接调 - 用两台机器上的程序。 + 用(RPC)服务。 RPC + 用来连接调用两台机器上的程序。 下一项是 Ntpdate 选项,处理时间同步。当选择它后, 会出现一个像下面所似的菜单:
Ntpdate 配置
从这个菜单选择一个离您最近的服务器。在您连接这台服务器时,除去 连接时的反应时间,时间同步最精确的服务器。 下一个选项是 PCNFSD。 这个选项将安装第三方软件包 net/pcnfsd。 它可以用来为无法自行提供 NFS 认证服务的操作系统, 如微软的 &ms-dos; 提供服务。 滚屏到下一页看一下其它选项:
网络配置之下层配置
&man.rpcbind.8;, &man.rpc.statd.8; 和 &man.rpc.lockd.8; 这三个程序是用来提供远程过程调用 (RPC) 服务的。 rpcbind 程序管理 NFS 服务器和客户端的通信, 这是 NFS 正确工作的必要前提。 rpc.statd 程序可以和其它主机上 rpc.statd 程序交互, 以提供的状态监控。 这些状态报告默认情况下会保存到 /var/db/statd.status 文件中。 最后的一项是 rpc.lockd 选项, 如果启用, 则将提供文件上锁服务。 通常将它和 rpc.statd 联用, 以监视哪些主机会请求对文件执行上锁操作, 以及这种操作的频繁程度。 尽管后两项功能对于调试非常有用, 但它们并不是 NFS 服务器和客户端正常运行所必需的。 下一个项目是Routed,这是一个路由程序。 &man.routed.8; 程序管理网络路由表,发现多播路由, 并且支持在网络上与它物理相连的主机来复制它的路由表的请求。 - 它被广泛地应用在本地网络中并扮演关网关的角色。 + 它被广泛地应用在本地网络中并扮演着网关的角色。 当选择它后,一个子菜单会来询问您这个程序的默认位置。 默认的位置已经被定义过, 您可以选择 Enter 键, 也可以按下其它的键。 这时会出来另一个菜单来询问您传递给 routed程序的参数。 默认的是 参数。 接下来是 Rwhod 选项,选中它会启用 &man.rwhod.8; 程序 在系统初时化的时候。 rwhod程序通过网络周期性的广播系统 信息或以客户的身份来收集这些信息。更多的信息可以查看 &man.ruptime.1; 和&man.rwho.1; 手册页。 倒数第二个选项是&man.sshd.8; 程序。它可以通过使用 - OpenSSH来提供安全的shell服务,我们推荐通过 - 使用它来使用 telnetFTP 服务。 - sshd服务通过使用加密技术来创建从一台机器到另一台机 - 器的安全连接。 + OpenSSH 来提供安全的shell服务, + 我们推荐通过使用它来使用 telnet 和 + FTP 服务。 sshd + 服务通过使用加密技术来创建从一台机器到另一台机器的安全连接。 最后有一个 TCP 扩展选项。这可以用来扩展在 - RFC 1323 和RFC 1644 + RFC 1323 和 RFC 1644 里定义的TCP 功能。当许多主机以高速连接本机时,可 能会引起某些连接被丢弃。我们不推荐使用这个选项,但是当使用独立的主机 时可以从它上面得到一些好处。 现在您已经配置完成了网络服务,您可以滚动屏幕到顶部选择 Exit 项,退出进入下一个配置部分。
配置 X Server 在安装完 &os; 之后才能够配置 X 服务。 关于安装和配置 X 服务的进一步细节可以在 找到。 要使用诸如 KDEGNOME, 以及其他一些图形界面, 则需要配置 X 服务器。 安装软件包 这些软件包已经被预编译成二进制程序了,安装软件有一个很简单的方法。 前面已经介绍了如何安装一个软件包的例子。 如果需要的话, 在安装结束之后, 仍然可以使用 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 + 最终配置屏幕,请选择 Install
添加用户/组 - 您至少要在安装过程中添加一个用户,以便于您能不用root + 您至少要在安装过程中添加一个用户,以便于您能不用 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 继续添加用户。 + 选择 &gui.yes; 然后键入 Enter 继续添加用户。
选择用户
用箭头键来选择 User 然后按 Enter
添加用户信息
下面的描述信息会出现在屏幕的下方,可以使用 Tab 键来切换不同的项目,以便输入相关信息: Login ID 新用户的登录名(强制性必须写) UID 这个用户的ID编号(如果不写,系统自动添加) Group 这个用户的登录组名(如果不写,系统自动添加) Password 这个用户的密码(键入这个需要很仔细!) Full name 用户的全名(解释、备注) Member groups 这个用户所在的组 Home directory 用户的主目录(如果不写,系统自动添加) Login shell 用户登录的shell(默认是/bin/sh)。 你可以将登录 shell 由 /bin/sh 改为 /usr/local/bin/bash, 以便使用事先以 package 形式安装的 bash shell。 不要使用一个不存在的或您不能登录的shell。最通用的shell是使用 BSD-world 的 C shell,可以通过指定/bin/tcsh来修改。 用户也可以被添加到 wheel 组中成了一个超级用户, 从而拥有 root权限。 当您感觉满意时,键入 &gui.ok; 键,用户和组管理菜单将会重新出现。
退出用户和组管理
如果有其他的需要, 此时还可以添加其他的组。 此外, 还可以通过 sysinstall (在 &os; 5.2 以前的版本中是 /stand/sysinstall) 在安装完成之后添加它们。 当您完成添加用户的时候,选择Exit 然后键入Enter 继续下面的安装。
设置 <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 or space ] 键入 Enter 来设置 root 密码。 密码必须正确地输入两次。 毋庸讳言, 您需要选择一个不容易忘记的口令。 请注意您输入的口令不会回显, 也不会显示星号。 New password: Retype new password : 密码成功键入后,安装将继续。 退出安装 如果您需要设置其他的网络设备, 或者需要完成其他的配置, 可以在此时或者事后通过 sysinstall (对于 &os; 5.2 之前的版本是 /stand/sysinstall) 来进行配置。 User Confirmation Requested Visit the general configuration menu for a chance to set any last options? Yes [ No ] 选择 &gui.no; 然后键入 Enter 返回到主安装菜单。
退出安装
选择 [X Exit Install] 然后键入 Enter。您可能需要确认是否真的退出安装: User Confirmation Requested Are you sure you wish to exit? The system will reboot (be sure to remove any floppies/CDs/DVDs 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 组合键来重新启动计算机,但是不推荐使用这个操作。
常见问题 安装 常见问题 下面将介绍一些在安装过程中常见的问题,像如何报告发生的问题,如何 双重启动 FreeBSD 和 &ms-dos; 或 &windows;。 当您遇到错误时,应该怎么做? 由于 PC 结构的限制, 硬件检测不可能 100% 地可靠, 但是有些问题是您可以自己解决的。 首先检查一下您使用的 &os; 版本的 硬件兼容说明 文档看看您使用的是否是被支持的硬件。 如果您使用的硬件是系统支持的, 但仍然遇到了死机或其他问题, 则需要联编 定制的内核。 这能够支持默认的 GENERIC 内核所不支持的设备。 在引导盘上的内核假定绝大多数的硬件, 均为按出厂设置的方式配置了 IRQ、 IO 地址和 DMA 通道。 如果您的硬件重新进行了配置, 则可能需要编辑内核配置, 并重新编译内核, 以便告诉 &os; 到哪里去查找设备。 除此之外, 也可能遇到这种情况吗, 即探测某种并不存在的设备时, 会干扰到其他设备的检测并使其失败。 这种情况吗下应禁止驱动程序检测可能导致冲突的设备。 有些安装问题可以借助更新硬件的程序来解决,特别是主板的 BIOS 。大部分的主板制造商都会提供网站给用户下载新的 BIOS以及提供如何更新的说明。 也有许多制造商强烈建议,除非必要否则不要轻易更新 BIOS 。因为更新的过程可能 会发生问题,进而损害BIOS 芯片。 使用 &ms-dos; 和 &windows; 文件系统 目前, &os; 尚不支持通过 Double Space™ 程序压缩的文件系统。 因此, 如果希望 &os; 访问数据, 则应首先解压缩这些文件系统模块。 这项工作, 可以通过位于 Start> Programs > System Tools 菜单的 Compression Agent 来完成。 &os;可以支持基于 &ms-dos; 的文件系统 (FAT16 和 FAT32)。 这要求您使用带参数的 &man.mount.msdosfs.8; 命令。 最常使用的是: &prompt.root; mount_msdosfs /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上。 排除故障时的常见问题和解决方法 我的系统在引导到探测硬件时发生了死机、 安装过程中行为异常, 或没有检测到软驱。 &os; 5.0 和更高版本在引导过程中广泛使用了 i386、 amd64 及 ia64 平台提供的 ACPI 服务来检测系统配置。 不幸的是, 在 ACPI 驱动和主板 BIOS 中存在一些 bug。 如果遇到这种情况, 可以在系统引导时禁用 ACPI, 其方法是在第三阶段引导加载器时使用 hint hint.acpi.0.disabled set hint.acpi.0.disabled="1" 这一设置会在系统重启之后失效, 因此, 如果需要的话, 您应在 /boot/loader.conf 文件中增加 hint.acpi.0.disabled="1"。 关于引导加载器的进一步详情, 请参见 在硬盘安装 &os; 之后的首次启动时, 内核加载并检测了硬件, 但给出下列消息并停止运行: changing root device to ad1s1a panic: cannot mount root 这是怎么回事? 我该怎么做? 另外引导帮助信息里提到的 bios_drive:interface(unit,partition)kernel_name 是什么? 系统在处理引导盘非系统中的第一块盘时有一个由来已久的问题。 BIOS 采用的编号方式有时和 &os; 不一致, 而设法将其变为一样则很难正确地实现。 因而, 在发生这种情况时, &os; 可能会需要一些帮助才能找到磁盘。 有两种常见的情况, 在这些情况下您都需要手工告诉 &os; 根文件系统模块的位置。 这是通过告诉引导加载器 BIOS 磁盘编号、 磁盘类型以及 &os; 中的该种磁盘的编号来实现的。 第一种情况是有两块 IDE 硬盘, 分别配置为对应 IDE 总线上的主 (master) 设备, 并希望 &os; 从第二块硬盘上启动。 BIOS 将两块硬盘识别为磁盘 0 和磁盘 1, 而 &os; 则将其分别叫做 ad0ad2 &os; 位于 BIOS 磁盘 1, 其类型是 ad 而 &os; 磁盘编号则是 2, 因此, 您应输入: 1:ad(2,a)kernel 注意, 如果您的主总线上有从设备, 则这一配置是不必要的 (因为这样配置是错的)。 第二种情况是从 SCSI 磁盘启动, 但系统中安装了一个或多个 IDE 硬盘。 这时, &os; 磁盘编号会比 BIOS 磁盘编号小。 如果您有两块 IDE 硬盘, 以及一块 SCSI 硬盘, 则 SCSI 硬盘将会是 BIOS 磁盘 2, 类型为 da 而 &os; 磁盘编号是 0, 因此, 您应输入: 2:da(0,a)kernel 来告诉 &os; 您希望从 BIOS 磁盘 2 引导, 而它是系统中的第一块 SCSI 硬盘。 假如只有一块 IDE 硬盘, 则应以 '1:' 代替。 一旦您确定了应选用的正确配置, 就可以用标准的文本编辑器把它写到 /boot.config 文件中了。 除非另行指定, &os; 将使用这个文件的内容, 作为对 boot: 提示的默认回应。 在硬盘安装 &os; 之后的首次启动时, Boot Manager 只是给出了 F? 的菜单提示, 但并不继续引导过程。 在您安装 &os; 进行到分区编辑器时所设置的磁盘尺寸信息不对。 请回到分区编辑器并指定正确的磁盘尺寸。 这种情况必须重新安装 &os;。 如果您无法确定在您机器上的正确尺寸信息, 可以用一个小技巧: 在磁盘开始的地方安装一个小的 DOS 分区, 并在其后安装 &os;。 安装程序能够看到这个 DOS 分区, 并利用它推测磁盘的尺寸信息, 这通常会有所帮助。 下面的技巧不再推荐使用, 在这里仅供参考:
如果您正准备建立只运行 &os; 的服务器或工作站, 而无需考虑 (之后) 与 DOS、 Linux 或其他操作系统的兼容性, 也可以使用整个硬盘 (分区编辑器中的 `A'), 选择 &os; 独占整个硬盘每一个扇区的非标准选项。 这会扫除关于磁盘尺寸的一切烦恼, 但会限制您以后运行 &os; 以外的其他操作系统的能力。
系统找到了 &man.ed.4; 网卡, 但总是报设备超时 (device timeout) 错误。 您的网卡可能使用了与 /boot/device.hints 文件中指定的 IRQ 不同的中断请求号。 ed 驱动默认情况下并不支持 `软' 配置 (在 DOS 中使用 EZSETUP 配置的值), 但如果您在网卡的 hints 中指定 -1, 便会使用软配置。 您应使用网卡的跳线进行硬配置 (根据需要修改内核设置) 或通过 hint hint.ed.0.irq="-1" 将 IRQ 指定为 -1。 这会告诉内核使用软配置。 另一个可能是您的网卡使用 IRQ 9, 这会与 IRQ 2 共用同一中断请求线, 同时也是导致问题的一个常见原因 (特别是 VGA 卡使用 IRQ 2 的时候!)。 您应尽量避免使用 IRQ 2 或 9。
Valentino Vaschetto Contributed by 高级安装指南 这节主要描述在一些特殊情况下如何安装FreeBSD。 在一个没有显示器或键盘的系统上安装FreeBSD installation headless (serial console) serial console 这种类型的安装叫做 headless install(无关安装), 因您正要安装FreeBSD的机器不是没带显示器,就是没有显卡。您可能会问那怎么安装? 可以使用一个串行控制台。串行控制台基本上是使用另外一台机器来充当主显示设备 和键盘。要这样做,只要执行下面的步骤:创建安装软件,请看 一节说明。 按下面的步骤,修改这些软盘用来引导进入一个串行控制台: 通过启动软盘来引导进入一个串行控制台 mount 如果您想用软盘,FreeBSD将进入它通常的安装模式。我们要把FreeBSD 引导进入串行控制台,需要这样做,您必须使用 &man.mount.8;命令在FreeBSD系统 上挂接 boot.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的线, 因为它在一些十字交叉口有金属线。 开始启动安装 现在开始启动安装。把 boot.flp 的那张软盘 插入软盘驱动器,然后开启电源。 连接您的无头机器 cu 现在您已经通过&man.cu.1;连接到了那台机器。 &prompt.root; cu -l /dev/cuad0 在 &os; 5.X 上, 应使用 /dev/cuaa0 代替例子中的 /dev/cuad0 就这样! 您已经能够通过您的cu session对话来控制那台 无头机器了。 它将要求您把 kern1.flp 的那张软盘插入驱动器, 然后它将提示选择使用哪种终端。 只要选择 FreeBSD 的彩色控制台, 然后继续您的安装。 准备您自己的安装介质 为了避免重复 FreeBSD disc 在这里指 FreeBSD CDROM or DVD 那即意味着您要购买或自己制做。 有好几个原因需要您创建自己的FreeBSD安装介质。这可能是物理介质,如磁带, 使用 sysinstall程序找到的安装文件,FTP站点或 &ms-dos;分区。 例如: 您有许多机器连接到本地网络,使用一个FreeBSD光盘。您要使用FreeBSD来 创建一个本地FTP站点,然后使用这个FTP站点来代替连接到Internet。 您有一张 FreeBSD 光盘, FreeBSD 不支持您的 CD/DVD 驱动器, 但 &ms-dos;/&windows; 支持。 您要复制安装文件到一个DOS分区, 然后使用这些文件进行安装。 您要安装的计算机没有 CD/DVD驱动器和网卡,但您可以连接一个 Laplink-style 串口或并口线缆到那台计算机。 您要通过一个磁带机来安装FreeBSD. 创建一张安装光盘 FreeBSD 的每个发行版本都为每一支持的平台提供至少两张 CDROM 映像 (ISO images)。 如果您有刻录机,这些映像文件可以被(burned) 成FreeBSD的安装光盘。 如果没有刻录机,而上网带宽却很便宜,它也是一种很好的安装方式。 下载正确的 ISO 映像文件 每个版本的ISO映像文件都可以从 ftp://ftp.FreeBSD.org/pub/FreeBSD/ISO-IMAGES-架构名/版本 或最近的镜像站点下载。选择合适的 架构版本 目录中包含下面一些映像文件: FreeBSD 5.<replaceable>X</replaceable> 和 6.<replaceable>X</replaceable> ISO 映像文件名和含意 文件名 包含内容 版本-RELEASE-架构-bootonly.iso 引导 FreeBSD 内核并启动安装界面所需的全部数据。 安装文件可以从 FTP 或其他安装源获得。 版本-RELEASE-架构名-disc1.iso 安装 FreeBSD 所需的全部文件, 以及一份用于与 sysinstall 中的 Repair(修复) 机制联用的 现场文件系统 版本-RELEASE-架构名-disc2.iso &os; 文档 (在 &os; 6.2 之前) 以及这张光盘能装下的、 尽可能多的第三方软件包。 version-RELEASE-arch-docs.iso &os; 文档 (&os; 6.2 和之后的版本)。
必须 下载 bootonly ISO 镜像 (如果有的话) 或第一张光盘的镜像之一。 不需要两个都下载, 因为第一张光盘包括了 bootonly ISO 的全部内容。 如果访问 Internet 的价格便宜, 建议使用 bootonly ISO。 这样您可以安装 &os;, 并从网上通过 ports/packages 系统 (参见 ) 根据需要下载和安装第三方软件包。 如果您正打算安装 &os; 并同时选择一些第三方软件包, 则可以下载第一张光盘的镜像文件。 其它的映像盘也是很有用的,但不是必须的,尤其是在您有高速的网络连接时。
刻录 CDs 您必须把这些映像文件刻录成光盘。如果您在其它的FreeBSD系统上完成 此项工作,请看 得到更多的信息,(特别是 如果您在其它的系统平台上执行,您需要相应的刻录软件。映像文件使用 的是标准的ISO格式,必须被您的刻录软件所支持。
如果有兴趣制作一张定制的 FreeBSD 版本, 请参考 Release Engineering Article
为 FreeBSD 安装盘建立局域网 FTP 站点 installation network FTP FreeBSD 光盘的布局和 FTP 站点相同。 这样, 建立局域网 FTP 站点来用于网络上的其它计算机安装 FreeBSD, 就十分的容易。 在要作为FTP站点的那台FreeBSD机器上,确定FreeBSD磁盘放入光驱 中并将它挂在/cdrom目录中。 &prompt.root; mount /cdrom /etc/passwd文件中建立一个可匿名访问FTP 服务器的账号。您可以利用&man.vipw.8; 命令编辑/etc/passwd 文件,加入下面这一行叙述: ftp:*:99:99::0:0:FTP:/cdrom:/nonexistent 确定在/etc/inetd.conf配置文件中开启 了FTP服务。 任何本地网络中的机器在安装FreeBSD选择安装介质时就可以选择透过 FTP站点,然后选取 Other后输入 ftp://本地FTP服务器 即可以透过本地的FTP站点来安装FreeBSD。 如果用作 FTP 客户端的引导介质 (通常是软盘) 与本地局域网的 FTP 站点上的版本不一致, sysinstall 会不允许您完成安装。 如果您使用的版本差距不很大, 并且希望绕过这一判断, 则应进入 Options 菜单, 并将安装包的名字改为 any 此方式最好使用在有防火墙保护的内部网络。如果要将此FTP服务公开给外面的 网际网络(非本地用户),您的电脑必须承担被侵入或其它的风险。我们强烈建议您 要有完善的安全机制才这样做。 创建安装软盘 installation floppies 如果您从软盘安装(我们推荐那样做),或者是由于 不支持硬件或者更简单的理由是因为您坚持要使用软盘安装。您必须准备几张软盘。 至少这些软盘必须是 1.44 MB 的,用来容纳所有在 base (基本系统) 目录下的文件。如果您在 DOS 操作系统下准备就 必须 使用 &ms-dos; 的 FORMAT 命令来格式化软盘。 如果您使用的是 &windows; 操作系统, 在资源管理器中就可以完成这个工作 (用右键单击 A: 驱动器, 并选择 Format)。 不要 指望厂家的预先格式化! 最好还是亲自进行格式化。 过去用户报告的很多问题都是由于不正确地使用格式化设备所造成的, 所以我们需要在这里着重提一下。 如果您在另外一台FreeBSD的机器上做了启动盘的话,进行格式化是一个不 错的主意。虽然您不需要把每张盘都做成DOS文件系统。您也可以使用 bsdlabelnewfs 命令来创建一个UFS文件系统,具体操作按下面的顺序进行: &prompt.root; fdformat -f 1440 fd0.1440 &prompt.root; bsdlabel -w fd0.1440 floppy3 &prompt.root; newfs -t 2 -u 18 -l 1 -i 65536 /dev/fd0 然后您就可以像其它的文件系统一样挂上和写入这些磁盘。 格式化这些磁盘后,您必须把文件复制到磁盘中。 这些发行文件被分割成刚好可存进五张 1.44 MB 软盘。 检查您所有的磁盘, 找出所有可能适合的文件。 直到您找到所有需要的配置并且将它们以这种方式安置。 第一个配置都应该有一个子目录在磁盘上, 例如: a:\base\base.aaa:\base\base.ab, 等等。 base.inf 文件, 也应放在 base 的第一张盘上, 因为安装程序需要读取这个文件, 以了解在获得发布包时需要下载多少文件。 一旦您进入选择安装介质的屏幕,选择 Floppy 将会看到后面的提示符。 从 &ms-dos; 分区安装 installation from MS-DOS 如果从 &ms-dos; 分区安装, 您需要将发布文件复制到该分区根目录下的 freebsd 目录中。 例如: c:\freebsd。 您必须复制一部分 CDROM 或 FTP 上的目录结构, 因此, 如果您从光盘进行复制, 建议使用 DOS 的 xcopy 命令。 下面是准备进行 FreeBSD 最小系统安装的例子: C:\> md c:\freebsd C:\> xcopy e:\bin c:\freebsd\bin\ /s C:\> xcopy e:\manpages c:\freebsd\manpages\ /s 假设 C: 盘是您的空闲空间, E: 盘是您挂接的 CDROM。 如果您没有光盘驱动器,您可以从以下网站下载发行包。 ftp.FreeBSD.org. 每一个发行包都在一个目录中,例如 base 发行包可以在 &rel.current;/base/目录中找到。 对很多发行包来说,如果您希望从 &ms-dos;分区安装的话(您有足够的空间), 安装 c:\freebsd — 下的每个文件-这个 BIN 发行包只是最低限度的要求。 创建一个安装磁带 installation from QIC/SCSI Tape 从磁带安装也许是最简单的方式,比在线使用 FTP 安装或使用 CDROM 还快。 安装的程序假设是简单地被压缩在磁带上。在您得到所有配置文件后,简单地解开它们, 用下面的命令: &prompt.root; cd /freebsd/distdir &prompt.root; tar cvf /dev/rwt0 dist1 ... dist2 在您安装的时候,您要确定留有足够的空间给临时目录(允许您选择) 来容纳磁带安装时 全部 的内容。由于不是随机访问 磁带的,所以这种安装方法需要很多临时空间。 开始安装时,在从软盘启动 之前, 磁带机必须已经放在驱动设备中。 否则, 安装过程中可能会找不到它。 通过网络安装 installation (安装) network (网络) serial (串口, SLIP 或 PPP) installation (安装) network (网络) parallel (并口, PLIP) installation (安装) network (网络) Ethernet (以太网) 可用的网络安装类型有三种。 以太网 (标准的以太网控制器)、 串口 (SLIP 或 PPP) 以及 并口 (PLIP (laplink 线缆))。 如果希望以最迅速的方式完成网络安装, 那么以太网适配器当然就是首选! FreeBSD 支持绝大多数人见 PC 以太网卡; 系统能够支持的网卡 (以及所需的配置) 可以在 FreeBSD 发行版附带的硬件兼容说明中找到。 如果您使用的是系统支持的 PCMCIA 以太网卡, 在为笔记本加电 之前 之前一定要把它插好! 很不幸, FreeBSD 目前并不支持在安装过程中热插 PCMCIA 卡。 此外, 您还需要知道自己的 IP 地址、 网络类型对应的子网掩码, 以及机器名。 如果您正通过 PPP 连接安装而没有固定的静态 IP, 不用怕, 这个 IP 地址会由您的 ISP 自动分配。 您的系统管理员会告诉您进行网络配置所需的信息。 如果您需要通过名字而不是 IP 地址来访问其他主机, 则还需要配置一个域名服务器, 可能还需要一个网关地址 (在使用 PPP 时, 这个地址是服务提供商的 IP 地址)。 如果您希望通过 HTTP 代理服务器来完成 FTP 安装, 还需要知道代理服务器的地址。 如果您不知道这些信息, 则应在进行这种安装 之前 向系统管理员或 ISP 询问。 SLIP 支持是相当原始的,并且被限制在主要对hard-wired 的连接,就像 一台膝上型计算机与另一台计算机间的串行线。现在的SLIP的安装还没有提供拨号功能, 这个连接应该是 hard-wired ;用PPP工具提供的这种便利性应该首先尽可能被用于SLIP 设备。 如果您使用一个MODEM,那您就只有PPP这一种选择了。在您安装的过程中, 要确定您能很容易地获得完整且快速的关于您服务提供商的信息。 如果您使用 PAP 或 CHAP 方式连接到您的 ISP,(换句话说,如果您不使用 脚本在&windows;中连接到您的ISP),那么您需要在ppp 提示符下输入dial 命令。否则,当PPP连接者只提供一种最简单的 终端模拟器,您必须知道如何使用针对MODEM的 AT commands拨号到您 的ISP。想知道更深入的信息可以参考 使用手册中的用户级PPP那节 以及 FAQ 。如果您有一些问题,可以使用 set log local ...命令将日志显示在屏幕上。 您也可以通过并口电缆连接到另外一台FreeBSD(2.0或以后的版本)机器上进行 安装,您可以考虑使用 laplink 并口电缆进行安装。通过并口安装要 比通过串口(最高 50 kbytes/sec)安装快得多。 通过NFS安装之前 installation network NFS NFS 安装方式是非常方便的。 只需要简单地将 FreeBSD 文件复制到一台服务器上, 然后在安装时选择NFS介质。 如果这个服务器要特权端口才能支持(如SUN的工作站), 您需要在安装前在 Options 菜单中设置 NFS Secure 如果您的一台网卡比较糟糕,速度很慢,则应考虑 NFS Slow的选项。 为了达到NFS安装的目的,这个服务器必须支持 subdir 加载。例如,如果您的 FreeBSD &rel.current; 目录存在: ziggy:/usr/archive/stuff/FreeBSD,然后 ziggy 将必须允许直接挂上 /usr/archive/stuff/FreeBSD,而不仅仅是 /usr/usr/archive/stuff 在 FreeBSD的 /etc/exports 配置文件中,是由 选项来控制的。其它 NFS服务器也许有不同的方式。 如果您从服务器得到permission denied 这个信息,可能是因为您没有正确的启用它。
diff --git a/zh_CN.GB2312/books/handbook/jails/chapter.sgml b/zh_CN.GB2312/books/handbook/jails/chapter.sgml index b1c555eb6a..d53980be65 100644 --- a/zh_CN.GB2312/books/handbook/jails/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/jails/chapter.sgml @@ -1,801 +1,818 @@ Matteo Riondato 原作 Jails jails 概述 这一章将为您介绍 &os; jail 是什么, 以及如何使用它们。 Jail, 有时也被认为是对 chroot 环境 的一种增强型替代品, 对于管理员而言是非常强大的工具, 同时, 它的一些基本用法, 对高级用户而言也相当有用。 读完这章, 您将了解: jail 是什么, 以及它在您安装的 &os; 中所能发挥的作用。 如何联编、 启动和停止 jail。 如何从 jail 内部或主机上进行管理的一些基础知识。 其他一些能够为您提供关于 jail 的有用信息的地方还有: &man.jail.8; 联机手册。 这是关于 jail — 用于在 &os; 中启动、 停止和控制 &os; jail — 工具的完整说明书。 邮件列表及其存档。 由 &a.mailman.lists; 提供的 &a.questions; 和其他邮件列表的存档, 已经包含了一系列关于 jail 的有价值的信息。 通常搜索存档或询问 &a.questions.name; 邮件列表能够给您带来很多有用的信息。 与 Jail 相关的一些术语 为了帮助您更好地理解与 jail 有关的 &os; 系统知识, 以及它们如何与 &os; 的其它部分相互作用, 您应理解下列术语: &man.chroot.2; (命令) &os; 的一个系统调用, 其作用是改变进程及其衍生进程所能看到的根目录。 &man.chroot.2; (环境) chroot 中运行的进程环境。 这包括类似文件系统中的可见部分、 可用的用户及用户组 ID、 网络接口以及其他 IPC 机制等资源。 &man.jail.8; (命令) 用以在 jail 环境中运行进程的系统管理工具。 宿主 (系统、 进程、 用户等等) 能够控制 jail 环境的系统。 宿主系统能够访问全部可用的硬件资源, 并能够控制 jail 环境内外的进程。 宿主系统与 jail 的一项重要区别是, 在宿主系统中的超级用户进程, 并不像在 jail 中那样受到一系列限制。 hosted (系统、 进程、 用户等等) 可访问资源受 &os; jail 限制的进程、 用户或其他实体。 介绍 由于系统管理是一项困难而又令人费解的任务, 因此人们开发了一系列强大的工具, 来让管理员的工作变得更加简单。 这些改进通常是让系统能够以更简单的方式安装、 配置, 并毫无问题地持续运转。 这其中, 许多管理员希望能够为系统正确地进行安全方面的配置, 使其能够用于真正的用途, 而阻止安全方面的风险。 &os; 系统提供的一项用于改善安全的工具就是 jail。 jail 是在 &os; 4.X 中由 &a.phk; 引入的, 它在 &os; 5.X 中又进行了一系列改进, 使得它称为一个强大而灵活的系统。 目前仍然在对其进行持续的开发, 以提高其可用性、 性能和安全性。 Jail 是什么 BSD-类的操作系统从 4.2BSD 开始即提供了 &man.chroot.8;。 &man.chroot.2; 工具能够改变一组进程的根目录的位置, 从而建立一个与系统中其他部分相隔离的安全环境: 在 chroot 环境中的进程, 将无法访问其外的文件或其他资源。 正是由于这种能力, 即使攻击者攻破了某一个运行于 chroot 环境的服务, 也不能攻破整个系统。 &man.chroot.8; 对于哪些不需要很多灵活性或复杂的高级功能的简单应用而言相当好用。 另外, 在引入 chroot 概念的过程中, 曾经发现过许多跳出 chroot 环境的方法, 尽管这些问题在较新的 &os; 版本中已经修正, 但很明显地, &man.chroot.8; 并不是一项用于加固服务安全的理想解决方案。 因此, 必须实现一个新的子系统来解决这些问题。 这就是为什么要开发 jail 最主要的原因。 Jail 以多种方式改进了传统的 &man.chroot.2; 环境概念。 在传统的 &man.chroot.2; 环境中, 只限制了进程能够访问文件系统的哪些部分。 其他部分的系统资源 (例如系统用户、 正在运行的进程, 以及网络子系统) 是由 chroot 进程与宿主系统中的其他进程共享的。 jail 扩展了这个模型, 它不仅将文件系统的访问虚拟化, 而且还将用户、 &os; 的网络子系统, 以及一些其他系统资源虚拟化。 关于这些精细控制以及调整 jail 环境访问能力的更具体的介绍, 可参见 jail 具有以下四项特点: 目录子树 — 进入 jail 的起点。 一旦进入了 jail, 进程就不再被允许访问这棵子树以外的对象。 传统上影响到最初 &man.chroot.2; 设计的安全问题不会影响 &os; jail。 主机名 — 将用于 jail 的主机名。 jail 主要用于存放网络服务, 因此在每个 mail 上能够标注一个有意义的主机名, 能够在很大程度上简化系统管理员的工作。 IP 地址 — 这个地址是指定给 jail 的, 在 jail 的生命周期内都无法改变。 通常 jail 的 IP 地址是某一个网络接口上的别名地址, 但这并不是必需的。 命令 — 准备在 jail 中执行的可执行文件的完整路径名。 这个命令是相对于 jail 环境的根目录的, 随 jail 环境的类型不同, 可能会有很多不同之处。 除了这些之外, jail 也可以拥有自己的用户和自己的 root 用户。 自然, 这里的 root 用户的权力会受限于 jail 环境, 并且, 从宿主系统的观点看来, jail root 用户并不是一个无所不能的用户。 此外, jail 中的 root 用户不能执行除了其对应 &man.jail.8; 环境之外的系统中的一些关键操作。 关于 root 用户的能力和限制, 在后面的 中将加以介绍。 建立和控制 jail 一些系统管理员喜欢将 jail 分为两类: 完整的 jail, 通常包含真正的 &os; 系统, 以及 服务 jail, 专用于执行一个可能使用特权的应用或服务。 这只是一种概念上的区分, 并不影响如何建立 jail 的过程。 在联机手册 &man.jail.8; 中对如何创建 jail 进行了清晰的阐述: &prompt.root; setenv D /here/is/the/jail &prompt.root; mkdir -p $D &prompt.root; cd /usr/src &prompt.root; make world DESTDIR=$D &prompt.root; cd etc/ This step is not required on &os; 6.0 and later. &prompt.root; make distribution DESTDIR=$D &prompt.root; mount_devfs devfs $D/dev 为 jail 选择一个位置是建立它的第一步。 这个路径是在宿主系统中 jail 的物理位置。 一种常用的选择是 /usr/jail/jailname, 此处 jailname 是 jail 的主机名。 /usr/ 文件系统通常会有足够的空间来保存 jail 文件系统, 对于 完整 的 jail 而言, 这通常包含 &os; 默认安装的基本系统中每个文件的副本。 这个命令将在 jail 目录中安装所需的可执行文件、 函数库以及联机手册等。 这些是以传统的 &os; 风格的方式完成的 — 首先联编所有的文件, 然后将其安装到目标路径。 distribution 这个 make target 将安装全部配置文件, 或者换句话说, 就是将 /usr/src/etc/ 复制到 jail 环境中的 /etc$D/etc/ 在 jail 中挂接 &man.devfs.8; 文件系统并不是必需的。 而另一方面, 几乎所有的应用程序都会需要访问至少一个设备, 这主要取决于应用程序的性质和目的。 控制 jail 中能够访问的设备非常重要, 因为不正确的配置, 很可能允许攻击者在 jail 中进行一些恶意的操作。 通过 &man.devfs.8; 实施的控制, 可以通过由联机手册 &man.devfs.8; 和 &man.devfs.conf.5; 介绍的规则集配置来实现。 一旦装好了 jail, 就可以使用 &man.jail.8; 工具来安装它了。 &man.jail.8; 工具需要四个必填参数, 这些参数在 中进行了介绍。 除了这四个参数之外, 您还可以指定一些其他参数, 例如, 以特定用户身份来在 jail 中运行程序等等。 这里, 参数取决于您希望建立的 jail 的类型; 对于 虚拟系统, 可以选择 /etc/rc, 因为它会完成真正的 &os; 系统启动所需的操作。 对于 服务 jail, 执行的命令取决于将在 jail 中运行的应用程序。 Jail 通常应在系统启动时启动, 因此, &os; rc 机制提供了一些很方便的机制来简化这些工作。 在引导时需要启动的 jail 列表应写入 &man.rc.conf.5; 文件: jail_enable="YES" # 如果设为 NO 则表示不自动启动 jail jail_list="www" # 以空格分隔的 jail 名字列表 对于 jail_list 中列出的 jail, 还应指定一系列对应的 &man.rc.conf.5; 设置, 用以描述具体的 jail: jail_www_rootdir="/usr/jail/www" # jail 的根目录 jail_www_hostname="www.example.org" # jail 的主机名 jail_www_ip="192.168.0.10" # jail 的 IP 地址 jail_www_devfs_enable="YES" # 在 jail 中挂接 devfs jail_www_devfs_ruleset="www_ruleset" # 在 jail 中应用的devfs 规则集 默认情况下, 在 &man.rc.conf.5; 中配置启动的 jail 会执行其中的 /etc/rc 脚本, 也就是说, 默认情况下将 jail 作为虚拟系统方式来启动。 对于服务 jail, 您应另外指定启动命令, 方法是设置对应的 jail_jailname_exec_start 配置。 如欲了解全部可用的选项, 请参阅联机手册 &man.rc.conf.5;。 /etc/rc.d/jail 脚本也可以用于手工启动或停止 rc.conf 中配置的 jail: &prompt.root; /etc/rc.d/jail start www &prompt.root; /etc/rc.d/jail stop www 目前, 尚没有一项方法来很干净地关闭 &man.jail.8;。 这是因为通常用于正常关闭系统的命令, 目前尚不能在 jail 中使用。 目前, 关闭 jail 最好的方式, 是在 jail 外通过 &man.jexec.8; 工具, 在 jail 中执行下列命令: &prompt.root; sh /etc/rc.shutdown 更进一步的详细说明, 请参见联机手册 &man.jail.8;。 微调和管理 您可以为 jail 设置许多不同的选项, 并让 &os; 宿主系统以不同的方式与 jail 交互, 以支持更高级别的应用。 这一节将介绍: 一些用于微调 jail 行为和安全限制的选项。 一些可以通过 &os; Ports 套件安装的高级 jail 管理应用程序, 这些程序可以用于实现一般的基于 jail 的解决方案。 &os; 提供的用于微调 jail 的系统工具 对于 jail 的配置微调, 基本上都是通过设置 &man.sysctl.8; 变量来完成的。 系统提供了一个特殊的 sysctl 子树, 全部相关的选项均在这棵子树中; 这就是 &os; 内核的 security.jail.* 选项子树。 下面是与 jail 有关的主要 sysctl, 以及这些变量的默认值。 这些名字都比较容易理解, 如欲了解进一步的详情, 请参阅联机手册 &man.jail.8; 和 &man.sysctl.8;。 security.jail.set_hostname_allowed: 1 security.jail.socket_unixiproute_only: 1 security.jail.sysvipc_allowed: 0 security.jail.enforce_statfs: 2 security.jail.allow_raw_sockets: 0 security.jail.chflags_allowed: 0 security.jail.jailed: 0 系统管理员可以在中 宿主系统 中, 透过设置这些变量的值来默认为 root 用户增加或取消限制。 需要注意的是, 某些限制是不能够取消的。 在 &man.jail.8; 中的 root 用户, 无法挂载或卸下文件系统, 此外在 jail 中的 root 用户也不能加载或卸载 &man.devfs.8; 规则集、 配置防火墙规则, 或执行其他需要修改内核数据的管理操作, 例如设置内核的 securelevel 等等。 &os; 的基本系统包含一系列用于查看目前在用的 jail 信息, 以及接入 jail 并执行管理命令所需的基本工具。 &man.jls.8; 和 &man.jexec.8; 命令都是 &os; 基本系统的一部分, 并可用于执行简单的任务: 列出在用的 jail 以及对应的 jail 标识 (JID)、 IP 地址、 主机名和路径。 从宿主系统中接入正在运行的 jail, 并在其中执行命令, 以完成一系列 jail 管理任务。 这在 root 希望干净地关闭 jail 时非常有用。 &man.jexec.8; 工具也可以用于在 jail 中启动 shell 以便对其进行管理; 例如: &prompt.root; jexec 1 tcsh 由 &os; Ports 套件提供的高级管理工具 在众多第三方 jail 管理工具中, 最完整和好用的一个是 sysutils/jailutils。 这是一系列方便 &man.jail.8; 管理的小工具。 请参见其网站以了解进一步的详情。 Jail 的应用 Daniel Gerzo 原作 服务 Jail 这一节主要基于 &a.simon; 的 中的思路, 以及由 Ken Tom locals@gmail.com 更新的文档。 这一节中描述了如何配置 &os; 系统的 &man.jail.8; 功能为其增加一个安全层次。 这部分假定您运行 RELENG_6_0 或更新版本, 并理解本章之前部分的内容。 设计 jail 的一个主要问题是如何对它们进行升级和管理。 由于每个 jail 都是从头联编的, 对于单个 jail 而言升级也许还不是个很严重的问题, 因为升级不会太过麻烦, 而对于多个 jail 而言, 升级不仅会耗费大量时间, 并且十分乏味的过程。 这个配置过程需要您对 &os; 有较多的配置和使用经验。 如果这些过程显得太过复杂, 您应考虑使用较简单的系统, 例如 sysutils/ezjail, 它提供了更简单的管理 &os; jail 的方法。 基本的想法是, 在不同的 jail 中尽可能多地以安全的方式使用共享的资源 — 使用只读的 &man.mount.nullfs.8; 挂接, 这会让升级简单许多, 从而使为每个服务建立不同的 jail 这种方案变得更加可行。 另外, 它也为增加或删除以及升级 jail 提供了更为便捷的方法。 在这里服务的常见例子包括: HTTP 服务、 DNS 服务、 SMTP 服务等等, 诸如此类。 这节介绍的配置的目的包括: 建立简单并易于理解的 jail 结构。 也就是说 不必 为每个 jail 执行完整的 installworld 操作。 使增删 jail 更容易。 使更新或升级 jail 更容易。 使运行自订的 &os; 分支成为可能。 对安全的更偏执的追求, 尽可能减少被攻陷的可能。 尽可能节省空间和 inode。 如前面提到的那样, 这个设计极大程度上依赖于将一份只读的主模板 (known as nullfs) 挂接到没一个 jail 中, 并为每个 jail 配置一个可读写的设备。 这种设备可以是物理磁盘、 分区, 或以 vnode 为后端的 &man.md.4; 设备。 在这个例子中, 我们将使用可读写的 nullfs 挂接。 下面的表中描述了文件系统格局: 每个 jail 挂接到 /home/j 目录下的一个目录。 /home/j/mroot 是每个 jail 共用的模板, 对于所有的 jail 而言都是只读的。 /home/j 目录中, 每个 jail 有一个对应的空目录。 每个 jail 中都有一个 /s 目录, 这个目录将连接到系统中的可读写部分。 每个 jail 应基于 /home/j/skel 建立其可读写空间。 每个 jailspace (jail 中的可读写部分) 应创建到 /home/js 这假定所有的 jail 都放置于 /home 分区中。 当然, 您可以根据需要将这个配置改为需要的任何样子, 但在接下来的例子中, 也应相应地加以变动。 建立模板 这一节将介绍创建 jail 所需的只读主模板所需的步骤。 一般来说, 您应将系统升级到最新的 &os; -RELEASE 分支, 具体做法请参见本手册的相关 章节。 当更新不可行时, 则需要完成 buildworld 过程, 另外, 您还需要 sysutils/cpdup 软件包。 我们将使用 &man.portsnap.8; 工具来下载 &os; Ports 套件。 在使用手册的 Portsnap 章节 中, 提供了针对初学者的介绍。 首先, 需要为将要存放只读的 &os; 执行文件的文件系统建立一个目录, 接着进入 &os; 源代码的目录, 并在其中安装 jail 模板: &prompt.root; mkdir /home/j /home/j/mroot &prompt.root; cd /usr/src &prompt.root; make installworld DESTDIR=/home/j/mroot 接着, 准备一份 &os; Ports 套件, 以及用于执行 mergemaster 的 &os; 源代码: &prompt.root; cd /home/j/mroot &prompt.root; mkdir usr/ports &prompt.root; portsnap -p /home/j/mroot/usr/ports fetch extract &prompt.root; cpdup /usr/src /home/j/mroot/usr/src 创建系统中可读写部分的骨架: &prompt.root; mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles &prompt.root; mv etc /home/j/skel &prompt.root; mv usr/local /home/j/skel/usr-local &prompt.root; mv tmp /home/j/skel &prompt.root; mv var /home/j/skel &prompt.root; mv root /home/j/skel 使用 mergemaster 安装缺失的配置文件。 接下来, 删除 mergemaster 创建的多余目录: &prompt.root; mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i &prompt.root; cd /home/j/skel &prompt.root; rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev 现在, 将可读写文件系统连接到只读文件系统中。 请确保您在 s/ 目录中建立了适当的符号连接。 如果没有建立目录或建立的位置不正确, 可能会导致安装失败。 &prompt.root; cd /home/j/mroot &prompt.root; mkdir s &prompt.root; ln -s s/etc etc &prompt.root; ln -s s/home home &prompt.root; ln -s s/root root &prompt.root; ln -s ../s/usr-local usr/local &prompt.root; ln -s ../s/usr-X11R6 usr/X11R6 &prompt.root; ln -s ../../s/distfiles usr/ports/distfiles &prompt.root; ln -s s/tmp tmp &prompt.root; ln -s s/var var 最后, 创建一个默认的包含下列配置的 /home/j/skel/etc/make.conf WRKDIRPREFIX?= /s/portbuild 配置 WRKDIRPREFIX 使得在每个 jail 中分别编译 &os; 成为可能。 请注意 ports 目录是只读系统的一部分。 而自订的 WRKDIRPREFIX 则使得联编过程得以在 jail 中的可读写部分完成。 建立 Jail 现在我们已经有了完整的 &os; jail 模板, 可以在 /etc/rc.conf 中安装并配置它们了。 这个例子中演示了建立 3 个 jail: NSMAILWWW /etc/fstab 文件中加入下列配置, 以便让系统自动挂接 jail 的只读模板和读写空间: /home/j/mroot /home/j/ns nullfs ro 0 0 /home/j/mroot /home/j/mail nullfs ro 0 0 /home/j/mroot /home/j/www nullfs ro 0 0 /home/js/ns /home/j/ns/s nullfs rw 0 0 /home/js/mail /home/j/mail/s nullfs rw 0 0 /home/js/www /home/j/www/s nullfs rw 0 0 扫描批次号 (pass number) 为 0 的分区不会在启动时使用 &man.fsck.8; 进行检查, 而转存批次号 (dump number) 为 0 的分区则不会在 &man.dump.8; 时备份。 我们不希望 fsck 检查 nullfs 挂接, 或让 dump 备份 jail 中的只读 nullfs 挂接。 这就是为什么在每个 fstab 条目的最后两列是 0 0 的原因。 /etc/rc.conf 中配置 jail: jail_enable="YES" jail_set_hostname_allow="NO" jail_list="ns mail www" jail_ns_hostname="ns.example.org" jail_ns_ip="192.168.3.17" -jail_ns_rootdir="/home/j/ns" +jail_ns_rootdir="/usr/home/j/ns" jail_ns_devfs_enable="YES" jail_mail_hostname="mail.example.org" jail_mail_ip="192.168.3.18" -jail_mail_rootdir="/home/j/mail" +jail_mail_rootdir="/usr/home/j/mail" jail_mail_devfs_enable="YES" jail_www_hostname="www.example.org" jail_www_ip="62.123.43.14" -jail_www_rootdir="/home/j/www" +jail_www_rootdir="/usr/home/j/www" jail_www_devfs_enable="YES" + + + 应把 + jail_name_rootdir + 变量设置成 /usr/home 而不是 + /home 的原因是 + /home + 目录在默认安装的 &os; 上是指向 + /usr/home + 的一个符号连接。 而 + jail_name_rootdir + 变量必须是一个 包含符号连接的路径, + 否则 jail 将拒绝启动。 可以使用 &man.realpath.1; + 工具来决定这一变量应被赋予一个什么样的值。 + 更详细的信息请参阅安全公告 &os;-SA-07:01.jail + 为每个 jail 创建所需的只读文件系统挂接点: &prompt.root; mkdir /home/j/ns /home/j/mail /home/j/www 在 jail 中安装可读写的模板。 注意您需要使用 sysutils/cpdup, 它能够帮助您确保每个目录都是正确地复制的: &prompt.root; mkdir /home/js &prompt.root; cpdup /home/j/skel /home/js/ns &prompt.root; cpdup /home/j/skel /home/js/mail &prompt.root; cpdup /home/j/skel /home/js/www 这样, 就完成了 jail 的制作, 可以运行了。 首先为 jail 挂接文件系统, 然后使用 /etc/rc.d/jail 脚本来启动它们: &prompt.root; mount -a &prompt.root; /etc/rc.d/jail start 现在 jail 应该就启动起来了。 要检查它们是否运行正常, 可以使用 &man.jls.8; 命令。 它的输出应该类似这样: &prompt.root; jls JID IP Address Hostname Path 3 192.168.3.17 ns.example.org /home/j/ns 2 192.168.3.18 mail.example.org /home/j/mail 1 62.123.43.14 www.example.org /home/j/www 这时, 就可以登入 jail 并增加用户和配置服务了。 JID 列给出了正在运行的 jail 的标识编号。 您可以使用下面的命令来在 JID 编号为 3 的 jail 中执行管理任务: &prompt.root; jexec 3 tcsh 升级 有时, 由于安全问题, 或新增功能有用, 会希望将系统升级到一个新版本的 &os;。 这种安装方式的设计使得升级现有 jail 变得很容易。 另外, 它也能最大限度地减小停机时间, 因为 jail 只在最后时刻才需要关闭。 另外, 它也提供了简单的回退到先前版本的方法。 第一步是按通常的方法升级主机的系统。 接着, 在 /home/j/mroot2 中建立一个新的临时模板: &prompt.root; mkdir /home/j/mroot2 &prompt.root; cd /usr/src &prompt.root; make installworld DESTDIR=/home/j/mroot2 &prompt.root; cd /home/j/mroot2 &prompt.root; cpdup /usr/src usr/src &prompt.root; mkdir s 在运行 installworld 时会创建一些不需要的目录, 应将它们删除: &prompt.root; chflags -R 0 var &prompt.root; rm -R etc var root usr/local tmp 重建到主系统中的可读写符号连接: &prompt.root; ln -s s/etc etc &prompt.root; ln -s s/root root &prompt.root; ln -s s/home home &prompt.root; ln -s ../s/usr-local usr/local &prompt.root; ln -s ../s/usr-X11R6 usr/X11R6 &prompt.root; ln -s s/tmp tmp &prompt.root; ln -s s/var var 现在是时候关闭 jail 了: &prompt.root; /etc/rc.d/jail stop 卸下原先的文件系统: &prompt.root; umount /home/j/ns/s &prompt.root; umount /home/j/ns &prompt.root; umount /home/j/mail/s &prompt.root; umount /home/j/mail &prompt.root; umount /home/j/www/s &prompt.root; umount /home/j/www 可读写的文件系统 (/s) 会在只读系统之后挂接, 因此应首先卸载。 将先前的只读文件系统挪走, 换成新的系统。 这样做也同时保留了先前系统的备份, 从而可以在出现问题时从中恢复。 这里我们根据新系统的创建时间来命名。 此外我们把先前的 &os; Ports 套件直接移动到新的文件系统中, 以节省磁盘空间和 inode: &prompt.root; cd /home/j &prompt.root; mv mroot mroot.20060601 &prompt.root; mv mroot2 mroot &prompt.root; mv mroot.20060601/usr/ports mroot/usr 现在新的只读模板就可以用了, 剩下的事情是重新挂接文件系统并启动 jails: &prompt.root; mount -a &prompt.root; /etc/rc.d/jail start 最后用 &man.jls.8; 检查 jail 启动是否正常。 不要忘记在 jail 中运行 mergemaster。 配置文件和 rc.d 脚本在升级时应进行更新。 diff --git a/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml b/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml index e8133d2418..245626fe7e 100644 --- a/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml @@ -1,1243 +1,1239 @@ Jim Mock Updated and restructured by Jake Hamby Originally contributed by 配置FreeBSD的内核 概述 内核 建立一个定制的内核 内核是 &os; 操作系统的核心。 它负责管理内存、 执行安全控制、 网络、 磁盘访问等等。 尽管 &os; 可以动态修改的现在已经越来越多, 但有时您还是需要重新配置和编译您的内核。 读完这章,您将了解: 为什么需要建立定制的内核。 如何编写内核配置文件,或修改已存在的配置文件。 如何使用内核配置文件创建和联编新的内核。 如何安装新内核。 如何处理出现的问题。 这一章给出的命令应该以 root 身份执行, 否则可能会不成功。 为什么需要建立定制的内核? 过去, &os; 采用称作 单片式 的内核。 这句话的意思是说内核是一个大的程序, 支持固定的设备, 如果您希望改变内核的行为则必须编译一个新的, 并重新启动计算机来引导它。 今天, &os; 已经迅速地转移到了一个新的模型, 其重要特征是内核功能可以由能够根据需要动态加载和卸载的模块来提供。 这使得内核能够迅速地适应硬件的调整 (例如笔记本电脑的 PCMCIA), 或为内核增加在最初编译它时所不具备的新的功能。 这一模式成为模块化内核。 尽管如此, 一些功能仍然需要静态地连编进内核。 一些情况是因为这些功能于内核的结合十分紧密, 而不可能将它们做成可以动态加载的。 另一种情况是因为没有人有时间来编写实现那个功能的可以动态加载的内核模块。 建造定制的内核是几乎每一个 BSD 用户所必须经历的一关。 尽管这项工作可能比较耗时, 但它能够为使用 &os; 系统带来很多好处。 与必须支持大量各式硬件的 GENERIC 内核不同, 定制的内核可以只包含对于 您的 PC 硬件的支持。 这有很多好处, 例如: 更快地启动。 因为内核只需要检测您系统上的硬件, 启动时所花费的时间将大大缩短。 使用更少的内存。 定制的内核通常会比 GENERIC 内核使用更少的内存, 由于内核必须时刻处于物理内存中, 因此这就显得更加重要。 基于这样的原因, 对于内存较小的系统来说, 定制内核将发挥更大的作用。 支持更多的硬件。 定制的内核允许您增加类似声卡这样的 GENERIC 内核没有提供内建支持的硬件。 建立并安装一个定制的内核 内核 建立/安装 首先对内核构建目录做一个快速的浏览。 这里所提到的所有目录都在 /usr/src/sys 目录中; 也可以通过 /sys 来访问它。 这里的众多子目录包含了内核的不同部分, 但对我们所要完成的任务最重要的目录是 arch/conf, 您将在这里编辑定制的内核配置; 以及 compile, 编译过程中的文件将放置在这里。 arch 表示 i386alphaamd64ia64powerpcsparc64, 或 pc98 (在日本比较流行的另一种 PC 硬件开发分支)。 在特定硬件架构目录中的文件只和特定的硬件有关; 而其余代码则是与机器无关的, 则所有已经或将要移植并运行 &os; 的平台上都共享这些代码。 文件目录是按照逻辑组织的, 所支持的硬件设备、 文件系统, 以及可选的组件通常都在它们自己的目录中。 这一章提供的例子假定您使用 i386 架构的计算机。 如果您的情况不是这样, 只需对目录名作相应的调整即可。 如果您的系统中 没有 /usr/src/sys 这样一个目录, 则说明没有安装内核源代码。 安装它最简单的方法是通过以 root 身份运行 sysinstall, 选择 Configure, 然后是 Distributionssrc, 选中其中的 basesys。 如果您不喜欢 sysinstall 并且有一张 官方的 &os; CDROM, 也可以使用下列命令, 从命令行来安装源代码: &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 - &prompt.root; cat /cdrom/src/sbase.[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; 源代码对应, 因此能够提供比手册更具时效性的新内容。 现在应该编译内核的源代码了。 联编内核 进入 /usr/src 目录: &prompt.root; cd /usr/src 编译内核: &prompt.root; make buildkernel KERNCONF=MYKERNEL 安装新内核: &prompt.root; make installkernel KERNCONF=MYKERNEL 使用这种方法联编内核时, 需要安装完整的 &os; 源代码。 默认情况下, 在联编您所定制的内核时, 全部 内核模块也会同时参与构建。 如果您希望更快地升级内核, 或者只希望联编您所需要的模块, 则应在联编之前编辑 /etc/make.conf MODULES_OVERRIDE = linux acpi sound/sound sound/driver/ds1 ntfs 这个变量的内容是所希望构建的模块列表。 WITHOUT_MODULES = linux acpi sound/sound sound/driver/ds1 ntfs - This variable sets up a list of modules to exclude - from the build process. For other variables which you may find useful - in the process of building kernel, refer to &man.make.conf.5; - manual page. 这个变量的内容是在联编过程中将不被编译的模块列表。 如果希望了解更多与构建内核有关的变量, 请参见 &man.make.conf.5; 联机手册。 /boot/kernel.old 新内核将会被复制到 /boot/kernel 目录中成为 /boot/kernel/kernel 而旧的则被移到 /boot/kernel.old/kernel。 现在关闭系统, 然后用新的内核启动计算机。 如果出现问题, 后面的一些 故障排除方法 将帮您摆脱困境。 如果您的内核 无法启动, 请参考那一节。 其他与启动过程相关的文件, 如 &man.loader.8; 及其配置, 则放在 /boot。 第三方或定制的模块也可以放在 /boot/kernel, 不过应该注意保持模块和内核的同步时很重要的, 否则会导致不稳定和错误。 Joel Dahl Updated for &os; 6.X by 配置文件 内核 NOTES NOTES 内核 配置文件 配置文件的格式是非常简单的。 每一行都包括一个关键词, 以及一个或多个参数。 实际上, 绝大多数行都只包括一个参数。 在 # 之后的内容会被认为是注释而忽略掉。 接下来几节, 将以 GENERIC 中的顺序介绍所有关键字。 如果需要与平台有关的选项和设备的详细列表, 请参考与 GENERIC 文件在同一个目录中的那个 NOTES, 而平台无关的选项, 则可以在 /usr/src/sys/conf/NOTES 找到。 如果您需要一份包含所有选项的文件, 例如用于测试目的, 则应以 root 身份执行下列命令: &prompt.root; cd /usr/src/sys/i386/conf && make LINT 内核 配置文件 下面是一个 GENERIC 内核配置文件的例子, 它包括了一些需要解释的注释。 这个例子应该和您复制的 /usr/src/sys/i386/conf/GENERIC 非常接近。 内核选项 机器 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 中的启动信息来了解。 内核选项 ident ident GENERIC 这是内核的名字。 您应该取一个自己的名字, 例如取名叫 MYKERNEL, 如果您一直在按照前面的说明做的话。 您放在 ident 后面的字符串在启动内核时会显示出来, 因此如果希望能够容易区分常用的内核和刚刚定制的内核, 就应该采取不同的名字 (例如, 您想定制一个试验性的内核)。 #To statically compile in device wiring instead of /boot/device.hints #hints "GENERIC.hints" # Default places to look for devices. &man.device.hints.5; 可以用来配置设备驱动选项。 在启动的时候 &man.loader.8; 将会检查缺省位置 /boot/devicehints。 使用 hints 选项您就可以把这些 hints 静态编译进内核。 这样就没有必要在 /boot下创建devicehints makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols 一般的 &os; 联编过程, 在所联编的内核指定了 选项时, 由于此选项将传递给 &man.gcc.1; 表示加入调试信息, 因此会将调试符号也包含进来。 options SCHED_4BSD # 4BSD scheduler 这是 &os; 传统上使用的默认系统调度器。 请保留此选项。 options PREEMPTION # Enable kernel thread preemption 允许内核线程根据优先级的抢占调度。 这有助于改善交互性, 并可以让中断线程更早地执行, 而无须等待。 options INET # InterNETworking 网络支持,即使您不打算连网,也请保留它,大部分的程序至少需要回环网络(就是和本机进行网络连接),所以强烈要求保留它。 options INET6 # IPv6 communications protocols 这将打开IPv6连接协议。 options FFS # Berkeley Fast Filesystem 这是最基本的硬盘文件系统,如果打算从本地硬盘启动,请保留它。 options SOFTUPDATES # Enable FFS Soft Updates support 这个选项会启用内核中的 Soft Updates 支持, 它会显著地提高磁盘的写入速度。 尽管这项功能是由内核直接提供的, 但仍然需要在每个磁盘上启用它。 请检查 &man.mount.8; 的输出, 以了解您系统中的磁盘上是否已经启用了 Soft Updates。 如果没有看到 soft-updates 选项, 则需要使用 &man.tunefs.8; (对于暨存系统) 或 &man.newfs.8; (对于新系统) 命令来激活它。 options UFS_ACL # Support for access control lists 这个选项将启用内核中的访问控制表的支持。 这依赖于扩展属性以及 UFS2, 以及在 中所介绍的那些特性。 ACL 默认是启用的, 并且如果已经在文件系统上使用了这一特性, 就不应再关掉它, 因为这会去掉文件的访问控制表, 并以不可预期的方式改变受保护的文件的访问方式。 options UFS_DIRHASH # Improve performance on big directories 通过使用额外的内存,这个选项可以加速在大目录上的磁盘操作。 您应该在大型服务器和频繁使用的工作站上打开这个选项,而在磁盘操作不是很重要的 小型系统上关闭它,比如防火墙。 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 (requires PSEUDOFS) 进程文件系统。 这是一个挂接在 /proc 的一个 假扮的 文件系统, 其作用是允许类似 &man.ps.1; 这样的程序给出正在运行的进程的进一步信息。 多数情况下, 并不需要使用 PROCFS, 因为绝大多数调试和监控工具, 已经进行了一系列修改, 使之不再依赖 PROCFS: 默认安装的系统中并不会挂接这一文件系统。 options PSEUDOFS # Pseudo-filesystem framework 在 6.X 内核中, 如果希望使用 PROCFS, 就必须加入 PSEUDOFS 的支持。 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 COMPAT_FREEBSD5 # Compatible with &os;5 对于 &os; 6.X 和更高版本而言, 如果希望在其上运行为 &os; 5.X 版本联编的、 用到 &os; 5.X 系统调用接口的程序, 则需要使用这个选项。 options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI 这将让内核在探测每个 SCSI 设备之前等待 5 秒。 如果您只有 IDE 硬盘驱动器, 就可以不管它, 反之您可能会希望尝试降低这个数值以加速启动过程。 当然, 如果您这么做之后 &os; 在识别您的 SCSI 设备时遇到问题, 则您还需要再把它改回去。 options KTRACE # ktrace(1) support 这个选项打开内核进程跟踪,在调试时很有用。 options SYSVSHM # SYSV-style shared memory 提供System V共享内存(SHM)的支持,最常用到SHM的应该是X Window的XSHM延伸, 不少绘图相关程序会自动使用SHM来提供额外的速度。如果您要使用X Window,您最好加入这个选项。 options SYSVMSG # SYSV-style message queues 支持 System V 消息。 这只会在内核中增加数百字节的空间占用。 options SYSVSEM # SYSV-style semaphores 支持System V 信号量, 不常用到, 但只在kernel中占用几百个字节的空间。 &man.ipcs.1; 命令的 选项可以显示出任何用到这些 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 ADAPTIVE_GIANT # Giant mutex is adaptive. 内核全局锁 (Giant) 是一种互斥机制 (休眠互斥体) 的名字, 它用于保护许多内核资源。 现在, 这已经成为了一种无法接受的性能瓶颈, 它已经被越来越多地使用保护单个资源的锁代替。 ADAPTIVE_GIANT 选项将使得内核全局锁作为一种自适应自旋锁。 这意味着, 当有线程希望锁住内核全局锁互斥体, 但互斥体已经被另一个 CPU 上的线程锁住的时候, 它将继续运行, 直到那个线程释放锁为止。 一般情况下, 另一个线程将进入休眠状态并等待下一次调度。 如果您不确定是否应该这样做的话, 一般应该打开它。 内核选项 SMP device apic # I/O APIC apic 设备将启用使用 I/O APIC 作为中断发送设备的能力。 apic 设备可以被 UP 和 SMP 内核使用, 但 SMP 内核必须使用它。 要支持多处理器, 还需要加上 options SMP The apic device exists only on the i386 architecture, this configuration line should not be used on other architectures. device eisa 如果您的主机板上有EISA总线,加入这个设置。使用这个选项可以自动扫描并设置所有连接在EISA总线上的设备。 device pci 如果您的主板有PCI总线,就加入这个选项。使用这个选项可以自动扫描PCI卡,并在PCI到ISA之间建立通路。 # 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 options AHC_REG_PRETTY_PRINT # Print register bitfields in debug # output. Adds ~128k to driver. device ahd # AHA39320/29320 and onboard AIC79xx devices options AHD_REG_PRETTY_PRINT # Print register bitfields in debug # output. Adds ~215k to driver. device amd # AMD 53C974 (Teckram DC-390(T)) device isp # Qlogic family #device ispfw # Firmware for QLogic HBAs- normally a module device mpt # LSI-Logic MPT-Fusion #device ncr # NCR/Symbios Logic device sym # NCR/Symbios Logic (newer chipsets + those of `ncr') 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设备,您可以把这些一起删掉。 *_REG_PRETTY_PRINT 这样的配置, 则是对应驱动程序的调试选项。 # 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 arcmsr # Areca SATA II RAID 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 hptmv # Highpoint RocketRAID 182x device rr232x # Highpoint RocketRAID 232x 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 mfi # LSI MegaRAID SAS 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 kbdmux # keyboard multiplexer 针对键盘多路选择器的基本支持。 如果您不打算使用多个键盘, 则可以放心地删除这一行。 device vga # VGA video card driver 显卡驱动。 device splash # Splash screen and screen saver support 启动时的 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 则几乎每种平台都支持。 device agp 如果您的机器使用 AGP 卡, 请把上面一行加入配置。 这将启用 AGP, 以及某些卡上的 AGP GART 支持。 APM # 电源管理支持 (参见 NOTES 了解更多选项) #device apm 高级电源管理支持。 对笔记本有用, 不过在 &os; 5.X 和更高版本中的 GENERIC 里默认禁用。 # 增加 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; 支持的 串行或并行 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 bce # Broadcom BCM5706/BCM5708 Gigabit Ethernet 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 lge # Level 1 LXT1001 gigabit ethernet device msk # Marvell/SysKonnect Yukon II Gigabit Ethernet device nge # NatSemi DP83820 gigabit ethernet device nve # nVidia nForce MCP on-board Ethernet Networking 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 stge # Sundance/Tamarack TC9021 gigabit Ethernet device ti # Alteon Networks Tigon I/II gigabit Ethernet device tl # Texas Instruments ThunderLAN device tx # SMC EtherPower II (83c170 EPIC) device vge # VIA VT612x gigabit ethernet 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 通用 802.11 支持。 这行配置是无线网络所必需的。 device wlan_wep # 802.11 WEP support device wlan_ccmp # 802.11 CCMP support device wlan_tkip # 802.11 TKIP support 针对 802.11 设备的加密支持。 如果希望使用加密和 802.11i 安全协议, 就需要这些配置行。 device an # Aironet 4500/4800 802.11 wireless NICs. device ath # Atheros pci/cardbus NIC's device ath_hal # Atheros HAL (Hardware Access Layer) device ath_rate_sample # SampleRate tx rate control for ath device awi # BayStack 660 and others device ral # Ralink Technology RT2500 wireless NICs. device wi # WaveLAN/Intersil/Symbol 802.11 wireless NICs. #device wl # Older non 802.11 Wavelan wireless NIC. 用以支持多种无线网卡。 # Pseudo devices device loop # Network loopback 这是 TCP/IP 的通用回环设备。 如果您 telnet 或 FTP 到 localhost (也就是 127.0.0.1) 则将通过这个设备回到本机。 这个设备是 必需的 device random # Entropy device Cryptographically secure random number generator. device ether # Ethernet support ether 只有在使用以太网卡时才需要。 它包含了通用的以太网协议代码。 device sl # Kernel SLIP sl 用以提供 SLIP 支持。 目前它几乎已经完全被 PPP 取代了, 因为后者更容易配置, 而且更适合调制解调器之间的连接, 并提供了更强大的功能。 device ppp # Kernel PPP 这一选项用以提供内核级的 PPP 支持, 用于拨号连接。 也有以用户模式运行的 PPP 实现, 使用 tun 并提供包括按需拨号在内的更为灵活的功能。 device tun # Packet tunnel. 它会被用户模式的 PPP 软件用到。 参考本书的 PPP 以了解更多的细节。 device pty # Pseudo-ttys (telnet etc) 这是一个 pseudo-terminal 或模拟登入端口。 它用来接收连入的 telnet 以及 rlogin 会话、 xterm, 以及一些其它程序如 Emacs 等。 device md # Memory disks 内存盘伪设备。 device gif # IPv6 and IPv4 tunneling 它实现了在 IPv4 上的 IPv6 隧道、 IPv6 上的 IPv4 隧道、 IPv4 上的 IPv4 隧道、 以及IPv6 上的 IPv6隧道。 gif 设备是 自动克隆 的, 它会根据需要自动创建设备节点。 device faith # IPv6-to-IPv4 relaying (translation) 这个伪设备能捕捉发给它的数据包,并把它们转发给 IPv4/IPv6 翻译服务程序。 # The `bpf' device enables the Berkeley Packet Filter. # Be aware of the administrative consequences of enabling this! # Note that 'bpf' is required for DHCP. device bpf # Berkeley packet filter 这是 Berkeley 包过滤器。这个伪设备允许网络接口被置于混杂模式, 从而,截获广播网 (例如,以太网) 上的每一个数据包。 截获的数据报可以保存到磁盘上,也可以使用 &man.tcpdump.1; 程序来分析。 &man.bpf.4; 设备也被用于 &man.dhclient.8; 来获取默认路由器(网关)的 IP 地址。如果使用DHCP,就不要注释掉这行。 # USB support device uhci # UHCI PCI->USB interface device ohci # OHCI PCI->USB interface device ehci # EHCI PCI->USB interface (USB 2.0) 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 ural # Ralink Technology RT2500USB wireless NICs 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 cdce # Generic USB over 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位物理地址的支持。 物理地址扩展 (PAE) 是 &intel; &pentium; Pro和后续的 CPU 提供的一种允许将内存地址扩展到 64GB 的功能, &os; 的所有最新版本均支持此功能, 并通过 选项来启用这个能力。 因为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 支持的内核中会导致数据损坏。 因为这个原因, PAE 内核配置文件 会把所有在打开了 PAE 的内核上不能工作的驱动程序排除在外。 一些系统打开了探测系统内存资源使用能力的功能,因为打开了 PAE支持,这些功能可能会被覆盖掉。 其中一个例子就是内核参数,它是控制 内核能使用的最大vnodes数目的,建议重新调整它及其他类似参数到合适的值。 为了避免KVA的消耗,很有必要增加系统的内核虚拟地址, 或者减少很耗系统资源的内核选项的总量(看上面)。选项 可以用来增加KVA空间。 为了稳定和高性能,建议查看&man.tuning.7;手册页。&man.pae.4;手册页包含 &os;'sPAE支持的最新信息。 如果出现问题怎么办 在定制一个内核时,可能会出现五种问题。它们是: config失败: 如果 &man.config.8; 在给出您的内核描述时失败, 则可能在某些地方引入了一处小的错误。 幸运的是, &man.config.8; 会显示出它遇到问题的行号, 这样您就能够迅速地定位错误。 例如, 如果您看到: config: line 17: syntax error 可以通过与 GENERIC 或其他参考资料对比, 来确定这里的关键词是否拼写正确。 make失败: 如果 make 命令失败, 它通常表示内核描述中发生了 &man.config.8; 无法找出的的错误。 同样地, 仔细检查您的配置, 如果仍然不能解决问题, 发一封邮件到 &a.questions; 并附上您的内核配置, 则问题应该很快就能解决。 内核无法启动: 如果您的内核无法启动, 或不识别您的设备, 千万别慌! 非常幸运的是, &os; 有一个很好的机制帮助您从不兼容的内核恢复。 在 &os; 启动加载器那里简单地选择一下要启动的内核就可以了。 当系统在引导菜单的 10 秒倒计时时进入它, 方法是选择 Escape to a loader prompt 选项, 其编号为 6。 输入 unload kernel, 然后输入 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 &prompt.root; mv /boot/kernel.good /boot/kernel 内核工作,但是&man.ps.1;根本不工作: 如果您安装了一个与系统中内建工具版本不同的内核, 例如在 -STABLE 系统上安装了 -CURRENT 的内核, 许多用于检查系统状态的工具如 &man.ps.1; 和 &man.vmstat.8; 都将无法正常使用。 您应该 重新编译一个和内核版本一致的系统。 这也是为什么一般不鼓励使用与系统其他部分版本不同的内核的一个主要原因。 diff --git a/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml b/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml index 7a648a570a..d56351f6d5 100644 --- a/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml @@ -1,1553 +1,1611 @@ Ross Lippert 编辑: 雪平 中文翻译: 多媒体 概述 FreeBSD 广泛地支持各种声卡, 让您可以从容地享受来自您的计算机的高保真输出。 这包括了录制和播放 MPEG Audio Layer 3 (MP3)、 WAV、 以及 Ogg Vorbis 等许多种格式声音的能力。 FreeBSD 同时也包括了许多的应用程序,让您可以录音、 增加声音效果以及控制附加的MIDI设备。 要是乐于动手, FreeBSD 也能支持播放一般的视频文件和 DVD。 对各种视频媒体进行编码、 转换和播放的应用程序比起处理声音的应用程序略少一些。 例如, 在撰写这章时, FreeBSD Ports Collection 中还没有类似 audio/sox 那样好的重编码工具能够用来在不同的格式之间转换。 不过, 这个领域的软件研发进展是很快的。 本章将介绍配置声卡的必要步骤。 X11 的安装和配置 () 里已经考虑到了您显卡的问题, 但要想有更好的播放效果, 仍需要调整一些东西。 读了本章后,您将知道: 如何配置系统识别声卡。 测试声卡是否正常工作的方法。 如何排除声卡安装中的问题。 如何播放和编码MP3以及其它格式的音频。 X 服务器如何支持视频。 哪些好的视频播放/压缩ports 如何播放 DVD、 .mpg 以及 .avi 文件。 如何从 CD 和 DVD 中提取文件。 怎样配置电视卡。 如何配置图像扫描仪。 在读本章这前,您应该: 知道如何配置、安装一个新的内核 () 用&man.mount.8; 命令去装载CD光盘,至少会产生一个错误, 更糟的情况下会产生 kernel panic。 这种媒体所用的编码与通常的ISO文件系统是不同的。 Moses Moore 贡献者 Marc Fonvieille Enhanced for &os; 5.X by 安装声卡 配置系统 PCI ISA 声卡 在开始之前,您应该清楚声卡类型、所用的芯片以及它是 PCI 还是 ISA 卡。 FreeBSD 支持种类繁多的 PCI 和 ISA 卡。检查 硬件兼容说明 中支持的音频设备列表看看是否支持您的声卡, 硬件兼容说明也会说明支持您声卡的是哪个驱动程序。 内核 配置 要使用声卡, 就应装载正确的驱动程序。完成的方式有两种: 最简单的是使用命令 &man.kldload.8; 来装载一个内核模块,在命令行输入 &prompt.root; kldload snd_emu10k1 或者在文件 /boot/loader.conf 里加入一行,内容如下 snd_emu10k1_load="YES" 上边实例用于 Creative &soundblaster; Live! 声卡。 - 其它可装载的模块列在文件/boot/defaults/loader.conf里边。 + 其它可装载的模块列在文件 + /boot/defaults/loader.conf 里边。 如果不知道应该使用哪个驱动, 您可以尝试加载 snd_driver module: &prompt.root; kldload snd_driver 这是个 meta 驱动,一次加载了最常见的设备驱动。 这会提高搜索正确驱动的速度。也可以通过 /boot/loader.conf 工具来加载所有的声卡驱动。 如果希望在加载了 snd_driver meta 驱动之后了解到底选择了哪种声卡, 可以通过使用 cat /dev/sndstat 来查询 /dev/sndstat 文件。 另外,您也可以把支持您声卡的代码静态地编译到内核里去。 下一节就采用这种方式支持硬件给出提示。 关于重新编译内核,请参考 定制内核使其支持声卡 要做的第一件事情就是添加通用音频框架驱动 &man.sound.4; 到内核中, 您需要添加下面这行到内核配置文件中: device sound 接下来就是加入对我们所用声卡的支持了。 首先需要确定我们的声卡需要使用哪一个驱动。 您可以参考 硬件兼容列表 所列出的音频设备, 以确定您声卡的驱动。 例如, Creative &soundblaster; Live! 声卡由 &man.snd.emu10k1.4; 驱动来支持。 要添加它, 需要在内核编译配置文件中加入下面一行: device snd_emu10k1 一定要阅读驱动的联机手册了解如何使用它们。 关于内核配置文件中声卡驱动的具体写法, 也可以在 /usr/src/sys/conf/NOTES 文件中找到。 非即插即用的 ISA 卡可能需要您为内核提供一些关于声卡配置的信息 (IRQ、 I/O 端口, 等等), 这一点与其他不支持即插即用的 ISA 卡类似。 这项工作可以通过 /boot/device.hints 文件来完成。 系统启动时, &man.loader.8; 将读取这个文件, 并将其中的配置传给内核。 例如, 旧式的 Creative &soundblaster; 16 ISA 非即插即用卡需要使用 &man.snd.sbc.4; 驱动并配合 snd_sb16(4)。 您可以在内核编译配置文件中增加如下配置: device snd_sbc device snd_sb16 还有下面这些到 /boot/device.hints中: hint.sbc.0.at="isa" hint.sbc.0.port="0x220" hint.sbc.0.irq="5" hint.sbc.0.drq="1" hint.sbc.0.flags="0x15" 这样,声卡使用 0x220 I/O 端口和 IRQ 5 /boot/device.hints 文件中所使用的语法, 在 &man.sound.4; 联机手册中以及所用的具体声卡驱动的联机手册中, 会进行进一步的讲解。 上面所展示的是默认的配置。 有时候, 您可能需要更改 IRQ 或其他配置, 以适应声卡的实际情况。 查看 &man.snd.sbc.4; 联机手册了解更多信息。 测试声卡 用修改过的内核重起,或者加载了需要的模块之后, 声卡将会出现在您的系统消息缓存中 (&man.dmesg.8;),就像这样: pcm0: <Intel ICH3 (82801CA)> port 0xdc80-0xdcbf,0xd800-0xd8ff irq 5 at device 31.5 on pci0 pcm0: [GIANT-LOCKED] pcm0: <Cirrus Logic CS4205 AC97 Codec> 声卡的状态可以通过 /dev/sndstat 文件来查询: &prompt.root; cat /dev/sndstat FreeBSD Audio Driver (newpcm) Installed devices: pcm0: <Intel ICH3 (82801CA)> at io 0xd800, 0xdc80 irq 5 bufsz 16384 kld snd_ich (1p/2r/0v channels duplex default) 您系统的输出可能与此不同。如果没有看到 pcm 设备,回顾并检查一下前面做的。 重新检查您的内核配置文件并保证选择了正确的设备。 - 常见问题列在一节。 + 常见问题列在 一节。 如果一切正常,您现在应该拥有一个多功能声卡了。 如果您的 CD-ROM 或者 DVD-ROM 驱动器的音频输出线已经与声卡连在一起, 您可以把 CD 放入驱动器并用 &man.cdcontrol.1; 来播放: &prompt.user; cdcontrol -f /dev/acd0 play 1 许多应用程序,比如 audio/workman 可以提供一个友好的界面。 您可能想要安装一个应用程序比如 audio/mpg123 来听 MP3 音频文件。 另一种快速测试声卡的方法, 是将数据发送到 /dev/dsp, 像这样做: &prompt.user; cat filename > /dev/dsp 这里 filename 可以是任意文件。 这行命令会产生一些噪音,证明声卡果真在工作。 声卡混音级别可以通过 &man.mixer.8; 命令更改。 更多细节可以在 &man.mixer.8; 联机手册中找到。 常见问题 设备节点 I/O 端口 IRQ DSP 错误信息 解决方法 sb_dspwr(XX) timed out I/O端口没有设置正确。 bad irq XX IRQ设置不正确。确信设定的IRQ和声卡的IRQ是一样的。 xxx: gus pcm not attached, out of memory 没有足够的内存空间供设置使用。 xxx: can't open /dev/dsp! 使用命令 fstat | grep dsp 进行检查是否有其它的程序打开了设备。 值得注意的是 esoundKDE 提供的声卡支持经常是造成麻烦的祸根。 Munish Chopra 贡献者 利用多个声源 同时有多个声源的声音在播放, 这是完全可能的, 例如当 esound 或者 artsd 不支持与其它程序共享音频设备时。 FreeBSD 可以通过 虚拟声道(Virtual Sound Channels) 来达到这样的效果, 它可以用 &man.sysctl.8; 来启用。 虚拟的声道可以能过在内核里混合声音来混合声卡里播放的声道。 使用两条sysctl命令来设置虚拟声道的数目。 如果您是 root 用户, 执行下面的操作: &prompt.root; sysctl hw.snd.pcm0.vchans=4 &prompt.root; sysctl hw.snd.maxautovchans=4 上面的实例设定了4个虚拟声道,这也是实际上所使用的数目。hw.snd.pcm0.vchans - 是pcm0的虚拟声道数,一当链接上一个设备它就可配置了。 - hw.snd.maxautovchans是分配给新的音频设备的虚拟声道数, + 是 pcm0 的虚拟声道数,一当链接上一个设备它就可配置了。 + hw.snd.maxautovchans 是分配给新的音频设备的虚拟声道数, 此时这个设备要用 &man.kldload.8; 来链接。 因为 pcm 模块可以独立装载许多硬件驱动程序, 因此 hw.snd.maxautovchans 也就可以存储分配给以后链接到的设备的虚拟声道数。 您不能在使用某个设备的时候改变其虚拟通道数。 首先需要关闭所有使用该设备的程序, 如音乐播放器或声音服务。 如果不使用 &man.devfs.5;, 就必须把应用程序指向 /dev/dsp0.x, 其中 x 为0到3, 因为在上面的例子里 hw.snd.pcm.0.vchans 被设为了4。 在使用 &man.devfs.5; 的系统中, 当应用程序请求 /dev/dsp0 时, 系统会自动为其分配一个而无需额外干预。 Josef El-Rayes 这一节的作者是 如何设置混音器通道值 不同的混音通道的默认音量是硬编码进 &man.pcm.4; 驱动程序的。 同时, 也有很多应用或服务程序提供了允许用户直接设置并记住这些值的功能。 不过这并不是一个很好的解决方案, 您可能希望在驱动一级有一个可以设置的默认值。 这可以通过在 /boot/device.hints 定义适当的值来实现。 例如: hint.pcm.0.vol="50" 这将在 &man.pcm.4; 模块加载时, 将通道音量设置为默认的 50。 Chern Lee 贡献者 MP3音频 MP3 (MPEG Layer 3 Audio)达到过CD音质的效果,FreeBSD工作站没理由会缺少这样的好东东。 MP3播放器 目前为止, 最为流行的 X11 MP3 播放器是 XMMS (X 多媒体系统)。 Winamp 的肤面可以直接用于 XMMS, 因为它的 GUI 几乎和 Nullsoft 的 Winamp 完全一样。 另外, XMMS 也提供了内建的插件支持。 XMMS 可以通过 multimedia/xmms port 或 package 来安装。 XMMS 的界面很直观, 它提供了播放列表、 图形化均衡器等等。 如果您熟悉 Winamp, 就会感觉 XMMS 很容易使用。 audio/mpg123 port 提供了一个命令行界面的 MP3 播放器。 mpg123 可以在执行时通过命令行指定声音设备和要播放的 MP3 文件, 如下所示: &prompt.root; mpg123 -a /dev/dsp1.0 Foobar-GreatestHits.mp3 High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2 and 3. Version 0.59r (1999/Jun/15). Written and copyrights by Michael Hipp. Uses code from various people. See 'README' for more! THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK! Playing MPEG stream from Foobar-GreatestHits.mp3 ... MPEG 1.0 layer III, 128 kbit/s, 44100 Hz joint-stereo /dev/dsp1.0 应该换成您的系统上的 dsp 设备。 抓取CD音轨 在对CD或CD音轨编码成MP3之前, CD上的音频数据应先抓到硬盘里。 这个可以通过复制原始的CDDA(CD数字音频)数据成为波形(WAV)文件。 工具 cdda2wavsysutils/cdrtools 套件的一部份,可用来从CD中获取音频及其相关信息。 把CD放到光驱里,下面的命令可以完成 (作为 root用户) 把整张 CD 分割成单个 (每个音轨) 的WAV文件:/para> &prompt.root; cdda2wav -D 0,1,0 -B cdda2wav 支持 ATAPI (IDE)光驱。 从IDE光驱中抓取音轨, 需要用设备名称代替SCSI的单元号。 例如, 想从 IDE 光驱中抓取第7道音轨: &prompt.root; cdda2wav -D /dev/acd0 -t 7 参数 表示 SCSI 设备 0,1,0, 与命令 - cdrecord -scanbus的输出相对应。 + cdrecord -scanbus 的输出相对应。 - 抓取单轨,要使用选项,如下所示: + 抓取单轨,要使用选项 ,如下所示: &prompt.root; cdda2wav -D 0,1,0 -t 7 这个实例用于抓取第七个音轨。要抓取一定范围的音轨,如从1到7: &prompt.root; cdda2wav -D 0,1,0 -t 1+7 利用&man.dd.1;也可以从ATAPI光驱中抓取音轨,从 - 可以了解更多。 + 可以了解更多。 MP3 编码 - 现今,可选的MP3编码器是lame。 - Lame可以从ports树里的 + 现今,可选的MP3编码器是 lame。 + Lame 可以从ports树里的 audio/lame 处找到。 利用抓取的WAV文件,下边的命令就可以把 audio01.wav - 转换成audio01.mp3 + 转换成 audio01.mp3 &prompt.root; lame -h -b 128 \ --tt "Foo Song Title" \ --ta "FooBar Artist" \ --tl "FooBar Album" \ --ty "2001" \ --tc "Ripped and encoded by Foo" \ --tg "Genre" \ audio01.wav audio01.mp3 128 kbits 是标准的MP3位率(bitrate)。 许多人可能喜欢更高的品质例如 160 或 192。 更高的位率, 会使 MP3 占用更多的磁盘空间--但音质会更高。选项 控制 高品质但低速度 (higher quality but a little slower) 模式的开关。 选项 表示把 ID3 标签--通常包含了歌曲的信息, 植入到MP3文件里。 其它的编码选项可以查询 lame 的联机手册。 MP3 解码 要把MP3歌曲刻录成音乐CD,就需要把它转换成非压缩的波形(WAV)格式。 XMMSmpg123 都支持把MP3输出成非压缩格式文件。 - XMMS中输出到磁盘: + XMMS 中输出到磁盘: 启动 XMMS. - 在窗口里右击鼠标,弹出XMMS菜单。 + 在窗口里右击鼠标,弹出 XMMS 菜单。 - 选项(Options)里选择设定(Preference) + 选项(Options) 里选择 + 设定(Preference) - 改变输出插件成写磁盘插件(Disk Writer + 改变输出插件成 写磁盘插件(Disk Writer Plugin) - 配置(Configure) + 配置(Configure) 输入或选择一个目录用于存放解压的文件。 - 象平常一样,把MP3文件装入到XMMS里边, + 象平常一样,把MP3文件装入到 XMMS 里边, 把音量调节到100%并且关掉EQ设定。 - 按一下播放(Play) — + 按一下 播放(Play)XMMS 如同在播放mp3一样,只是听不到声音。 实际上是在播放mp3到一个文件里。 要想再听MP3歌曲,记得把默认的输出插件设回原来的值。 - mpg123进行标准输出: + mpg123 进行标准输出: - 执行 mpg123 -s audio01.mp3 + 执行 mpg123 -s audio01.mp3 > audio01.pcm - XMMS输出的文件是波形(WAV)格式, - 而mpg123 则把MP3转换成无压缩的PCM + XMMS 输出的文件是波形(WAV)格式, + 而 mpg123 则把MP3转换成无压缩的PCM 音频数据。两种格式都支持用 cdrecord 刻录成音乐CD。 使用 &man.burncd.8; 您就必须使用无压缩的PCM。 如果选择波形格式, 就要注意在每道开始时的一小点杂音, 这段声音是波形文件的头部份。 可以使用工具 SoX 来轻松去除。 SoX 可从 audio/sox port 或包(package)中安装得到: &prompt.user; sox -t wav -r 44100 -s -w -c 2 track.wav track.raw 阅读 这部份可以了解到更多在 FreeBSD 里刻盘的信息。 Ross Lippert 贡献者 视频回放 视频回放是个很新并且迅速发展中的应用领域。 一定要有耐心,因为不是所有的事情都象处音频那么顺利。 在开始之前,您要了解显卡的类型以及它所用的芯片的类型。 尽管 &xorg;&xfree86; 支持大量的显卡, 但能达到好的回放效果的却寥寥无几。 在X11运行时,您可以使用命令 &man.xdpyinfo.1; 获得使用您的显卡的X服务器所支持的扩展列表。 为了评估各种播放器和设置,您需要有一小段用作测试的MPEG文件。 由于一些DVD播放器会默认地在 /dev/dvd 里去找DVD文件, 因此, - 您会发样建立符号链接到恰当的设备会很有用: + 您会发现建立符号链接到恰当的设备会很有用: &prompt.root; ln -sf /dev/acd0 /dev/dvd &prompt.root; ln -sf /dev/acd0 /dev/rdvd - 注意:由于&man.devfs.5;本身的原因, + 注意:由于 &man.devfs.5; 本身的原因, 像这样手工建立的链接在重启后将不会存在。 想要无论什么时候您启动系统都能自动建立符号链接, 那就把下边这行加到 /etc/devfs.conf 里边: link acd0 dvd link acd0 rdvd 另外,DVD解密要求调用专用的DVD-ROM函数,要求把许可定到DVD设备里。 为了改善 X11 界面使用共享内存的能力, 建议提高一些 &man.sysctl.8; 变量的值: kern.ipc.shmmax=67108864 kern.ipc.shmall=32768 测定视频的性能 XVideo SDL DGA 在X11下有几种可以显示图像的方式。 - 到底哪个能工作很大程序上依赖于硬件。 首先, + 到底哪个能工作很大程度上依赖于硬件。 首先, 下边描述的每一种方法在不同的硬件上都会有不同的品质。 其次, 在X11里的图像显示近来引起普遍的关注, 随着 &xorg;&xfree86; 的每一个版本, 都会有很大的突破。 常见图像接口列表: X11: 一般性的使用共享内存的X11输出。 XVideo: 一种X11接口扩展,支持任何X11图像的可拖拉。 SDL: 简单直接媒体层。 DGA: 直接图片存取。 SVGAlib: 低层次掌控图片层。 XVideo &xorg;&xfree86; 4.X - 有种扩展叫做XVideo + 有种扩展叫做 XVideo (或称Xvideo, Xv, xv), 它可以通过一个特殊的加速器直接把图像显示在可拖拉的对象里。 即使在低端的计算机 (例如我的PIII 400 Mhz膝上电脑), 这个扩展也提供了很好的播放质量。 要了解这一扩展是否在正常工作, 使用 xvinfo 命令: &prompt.user; xvinfo 如果显示结果如下,那您的显卡就支持XVideo: X-Video Extension version 2.2 screen #0 Adaptor #0: "Savage Streams Engine" number of ports: 1 port base: 43 operations supported: PutImage supported visuals: depth 16, visualID 0x22 depth 16, visualID 0x23 number of attributes: 5 "XV_COLORKEY" (range 0 to 16777215) client settable attribute client gettable attribute (current value is 2110) "XV_BRIGHTNESS" (range -128 to 127) client settable attribute client gettable attribute (current value is 0) "XV_CONTRAST" (range 0 to 255) client settable attribute client gettable attribute (current value is 128) "XV_SATURATION" (range 0 to 255) client settable attribute client gettable attribute (current value is 128) "XV_HUE" (range -180 to 180) client settable attribute client gettable attribute (current value is 0) maximum XvImage size: 1024 x 1024 Number of image formats: 7 id: 0x32595559 (YUY2) guid: 59555932-0000-0010-8000-00aa00389b71 bits per pixel: 16 number of planes: 1 type: YUV (packed) id: 0x32315659 (YV12) guid: 59563132-0000-0010-8000-00aa00389b71 bits per pixel: 12 number of planes: 3 type: YUV (planar) id: 0x30323449 (I420) guid: 49343230-0000-0010-8000-00aa00389b71 bits per pixel: 12 number of planes: 3 type: YUV (planar) id: 0x36315652 (RV16) guid: 52563135-0000-0000-0000-000000000000 bits per pixel: 16 number of planes: 1 type: RGB (packed) depth: 0 red, green, blue masks: 0x1f, 0x3e0, 0x7c00 id: 0x35315652 (RV15) guid: 52563136-0000-0000-0000-000000000000 bits per pixel: 16 number of planes: 1 type: RGB (packed) depth: 0 red, green, blue masks: 0x1f, 0x7e0, 0xf800 id: 0x31313259 (Y211) guid: 59323131-0000-0010-8000-00aa00389b71 bits per pixel: 6 number of planes: 3 type: YUV (packed) id: 0x0 guid: 00000000-0000-0000-0000-000000000000 bits per pixel: 0 number of planes: 0 type: RGB (packed) depth: 1 red, green, blue masks: 0x0, 0x0, 0x0 同时注意:列出来的格式(YUV2, YUV12, 等等) 并不总是随着 - XVdieo的每一次执行而存在。没有它们可能或迷惑有些人。 + XVdieo的每一次执行而存在。没有它们可能会迷惑某些人。 如果结果看起来是这样: X-Video Extension version 2.2 screen #0 no adaptors present 那么您的显卡可以就不支持XVideo功能。 如果您的卡不支持XVideo, 则只是说明您的显示器在满足刷新图像的计算要求上存在更大的困难。 尽管显卡和处理器很重要,您仍然会有个不错的显示效果。 此外, 您也可以参考我们提供的文献, 在 中有所介绍。 简单直接媒体层 简单直接媒体层(SDL),原意是做为 µsoft.windows;、BeOS 以及 &unix; 之间的端口层,允许跨平台应用发展,更高效地利用声卡和图形卡。SDL 层可以在低层访问硬件, 有时这样做就比 X11 接口层更为高效。 关于 SDL, 可以参考 devel/sdl12 直接图形存取 直接图形存取 (Direct Graphics Access) 是一种 X11 扩展, 通过它, 应用程序能够绕过 X 服务, 并直接修改画面缓存 (framebuffer)。 由于它依赖一种底层的内存映射来实现其功能, 因此使用它的程序必须以 root 身份来执行。 DGA 扩展可以通过 &man.dga.1; 来完成测试和性能测量。 运行 dga 时, 它将随按键改变现实的颜色。 按 q 退出这个程序。 Ports 和 包(Packages) 对视频的解决 视频 ports 视频 包 这部份主要讨论在 FreeBSD Ports 集中提供的可用于视频回放的软件。 视频回放在软件发展中是个很活跃的领域, 并且各种不同程序的功能可能与这里的描述不尽相同。 首先要弄清楚的重要一点是在 FreeBSD 上使用的视频程序其发展与在 Linux 里使用的是一样的。 大部份程序都还处在β阶段。使用 FreeBSD 的包可能面对的问题: 一个应用程序不能播放其它程序制作的文件。 一个应用程序不能播放其自已制作的文件。 不同机上的同样的程序,各自重新建立(rebuild)了一次, 播放同一个文件结果也会有不同。 一个看起来没什么的过滤器, 如图像尺寸的调整, 也有可能因为一个调整例程的问题变得很不象样。 应用程序频繁地留下垃圾(dumps core)。 没有随 port 一起安装的文档可以在网上或者 port 的 work 目录中找到。 这些程序中许多也体现了 Linux主义。即, 有些问题来自于(程序)使用的标准库存在于Linux的发行版中, 或者有些是 Linux 内核的功能, 而该程序的作者事先所假定了的是 Linux内核。这些问题并不总是被 port 编护人员注意到或处理过, 这也就可能导致如下问题: 使用/proc/cpuinfo去检测处理器的特性。 滥用线程可能导致一个程序悬挂完成,而不是完全中止。 软件还不属于FreeBSD Ports集,而又与其它程序经常地一起使用。 现在,这些程序的开发人员也已同 port 的维护人员进行了联合, 以减少制作port时出错。 MPlayer MPlayer 是近来开发的同时也正迅速发展着的一个视频播放器。 MPlayer 团队的目标是在 Linux 和其它 UNIX 系统中的速度和机动性能。 在团队的创始人实在受不了当时可用的播放器的性能时, 这个计划就开始了。 有人也许会说图形接口已经成为新型设计的牺牲品。 - 但是一但您习惯了命令行选项和按键控制方式,它就能表现得很好。 + 但是一旦您习惯了命令行选项和按键控制方式,它就能表现得很好。 创建MPlayer MPlayer making MPlayer 可以从 multimedia/mplayer 找到。 MPlayer 在联编过程中会进行许多硬件检测, 而得到的可执行文件因此将无法移植到其他系统中使用。 因此, 从 ports 完成联编而不是安装预编译的包就很重要。 另外, 在 make 命令行还可以指定许多选项, 在 Makefile 中有所描述, 接下来我们开始联编: &prompt.root; cd /usr/ports/multimedia/mplayer &prompt.root; make N - O - T - E Take a careful look into the Makefile in order to learn how to tune mplayer towards you personal preferences! For example, make WITH_GTK1 builds MPlayer with GTK1-GUI support. If you want to use the GUI, you can either install /usr/ports/multimedia/mplayer-skins or download official skin collections from http://www.mplayerhq.hu/homepage/dload.html - 默认的 port 选项对于绝大多数用户来来说是够用了。 + 默认的 port 选项对于绝大多数用户来说是够用了。 不过, 如果您需要 XviD 编解码器, 则必须指定 WITH_XVID 这个命令行选项。 默认的 DVD 设备也可以用 WITH_DVD_DEVICE 选项来定义, 其默认值是 /dev/acd0 撰写这一章的时候, MPlayer port 的联编过程包括了 HTML 文档和两个可执行文件, mplayermencoder, 后者是一个视频再编码工具。 MPlayer 的 HTML 文档提供了丰富的内容。 如果读者发现本章中缺少关于视频硬件的一些信息, 则 MPlayer 的文档将是十分详尽的补充。 如果您正在找关于 &unix; 中的视频支持的资料, 您绝对应该花一些时间来阅读 MPlayer 的文档。 使用MPlayer MPlayer 使用 - 任何 MPlayer 用户必须在主目录下建立一个叫 + 任何 MPlayer 用户必须在其用户主目录下建立一个叫 .mplayer 的子目录。 输入下边的内容来建立这个必须的子目录: &prompt.user; cd /usr/ports/multimedia/mplayer &prompt.user; make install-user - mplayer的手册里列出了它的命令选项。 + mplayer 的手册里列出了它的命令选项。 HTML文档里有更为详细的信息。 这部份里, 我们只是描述了很少的常见应用。 要播放一个文件,如 testfile.avi, 可以通过各种视频接口当中的某一个去设置 选项: &prompt.user; mplayer -vo xv testfile.avi &prompt.user; mplayer -vo sdl testfile.avi &prompt.user; mplayer -vo x11 testfile.avi &prompt.root; mplayer -vo dga testfile.avi &prompt.root; mplayer -vo 'sdl:dga' testfile.avi 所有这些选项都是值得一试的, 因为它们的性能依赖很多因素,并且都与硬件密切相关。 要播放 DVD, 需要把 testfile.avi 改为 。 这里 N 是要播放的节目编号, 而 DEVICE 则是 DVD-ROM 的设备节点。 例如, 要播放 /dev/dvd 的第三个节目: &prompt.root; mplayer -vo xv dvd://3 -dvd-device /dev/dvd 可以在编译 MPlayer 时, 通过 WITH_DVD_DEVICE 来指定默认的 DVD 设备。 系统内定的默认设备是 /dev/acd0。 更多细节, 请参考 port 的 Makefile 要停止、暂停、前进等等,可以参考设定的按键---这些可以通过 mplayer -h 得到或查看手册。 另外,回放的重要选项是:用于全屏模式的 和起辅助完成作用的 为了让 mplayer 的命令行不是太长,使用者可以通过建立一个文件 .mplayer/config 来设定如下默认选项: vo=xv fs=yes zoom=yes - 最后,mplayer可以把DVD题目(title)抓取成为 - .vob文件。为了从DVD中导出第二个题目,请输入: + 最后,mplayer 可以把DVD题目(title)抓取成为 + .vob 文件。为了从DVD中导出第二个题目,请输入: &prompt.root; mplayer -dumpstream -dumpfile out.vob dvd://2 -dvd-device /dev/dvd 输出文件 out.vob 将是 MPEG - 并且可以被这部份描述的其它利用。 + 并且可以被这部份描述的其它 利用。 mencoder mencoder 在使用 mencoder 之前, 首先熟悉其 HTML 文档中所介绍的选项是一个不错的主意。 它提供了联机手册, 但如果没有 HTML 文档则帮助不大。 有无数种方法来提高视频品质、 降低比特率、 修改格式, 而这些技巧可能会影响性能。 下面是几个例子, 第一个是简单地复制: &prompt.user; mencoder input.avi -oac copy -ovc copy -o output.avi - 不正确的命令选项组合可能使生成的文件不能被mplayer播放。因此,如果您只是想抓取文件,一定在mplayer里使用 + 不正确的命令选项组合可能使生成的文件不能被 + mplayer 播放。因此,如果您只是想抓取文件, + 一定在 mplayer 里使用 + - 转换input.avi成为带有MPEG3音频编码 (要求audio/lame )的MPEG4编码: + 转换 input.avi + 成为带有MPEG3音频编码 (要求 + audio/lame ) + 的MPEG4编码: &prompt.user; mencoder input.avi -oac mp3lame -lameopts br=192 \ -ovc lavc -lavcopts vcodec=mpeg4:vhq -o output.avi - 这样就产生了可被mplayerxine播放的输出。 + 这样就产生了可被 mplayerxine播放的输出。 input.avi 可以换成 并以 root 的身份来执行, 以重新对 DVD 节目进行编码。 由于您第一次做这样的工作时很可能会对结果不太满意, 建议您首先把节目复制成文件, 然后对它进行操作。 xine视频播放器 - xine视频播放器是一个关注范围很广的项目,它不仅看准多合一的视频解决,而且出品了一个可再用的基本库和一个可扩展插件的可执行模块。发行有和port版本-- multimedia/xine + xine 视频播放器是一个关注范围很广的项目, + 它不仅看准多合一的视频解决, + 而且出品了一个可再用的基本库和一个可扩展插件的可执行模块。 + 发行有 和port版本-- + multimedia/xine - xine播放器仍然很粗糙,但这很显然与好开头无关。实际上xine 即需要一个快速的带有快速显卡的CPU,也支持XVideo的扩展。图形界面(GUI)可以使用,但很勉强。 + xine 播放器仍然很粗糙, + 但这很显然与好开头无关。实际上 xine + 即需要一个快速的带有快速显卡的CPU,也支持XVideo的扩展。 + 图形界面(GUI)可以使用,但很勉强。 到写这章时,还没有可用于播放CSS编码的DVD文件的输入模块随同 - xine一起发行。 + xine 一起发行。 第三方的建造(builds)里内建有这样的模块, 但都不属于FreeBSD Ports 集。 - MPlayer相比,xine 为用户考虑得更多,但同时,对用户来说也少了很多有条理的控制方式。xine 播放器在XVideo接口上做得不错。 + MPlayer 相比, + xine 为用户考虑得更多, + 但同时,对用户来说也少了很多有条理的控制方式。 + xine 播放器在XVideo接口上做得不错。 - 默认情况下,播放器xine启动的时后会使用图形界面。那么就可以使用菜单打开指定的文件: + 默认情况下,播放器 xine + 启动的时候会使用图形界面。那么就可以使用菜单打开指定的文件: &prompt.user; xine 另外,没有图形界面也可以使用如下命令立即打开播放文件: &prompt.user; xine -g -p mymovie.avi 使用transcode transcode 这个软件并不是播放器, 而是一系列用于对视频和音频文件进行重新编码的工具。 通过使用 transcode, 就可以拥有使用带 stdin/stdout 接口的命令行工具来合并视频文件, 以及修复坏损文件的能力。 在联编 multimedia/transcode port 时可以指定大量选项, 我们建议使用下面的命令行来构建 transcode &prompt.root; make WITH_OPTIMIZED_CFLAGS=yes WITH_LIBA52=yes WITH_LAME=yes WITH_OGG=yes \ WITH_MJPEG=yes -DWITH_XVID=yes 对于多数用户而言, 前述配置已经足够了。 为了说明 transcode 的功能, 下面的例子展示了如何将 DivX 转换为 PAL MPEG-1 文件 (PAL VCD): &prompt.user; transcode -i input.avi -V --export_prof vcd-pal -o output_vcd &prompt.user; mplex -f 1 -o output_vcd.mpg output_vcd.m1v output_vcd.mpa 生成的 MPEG 文件, output_vcd.mpg, 可以通过 MPlayer 来播放。 - 您甚至可以直接将这个文件烧录到 CD-R 介质上来创建 Video CD, + 您甚至可以直接将这个文件刻录到 CD-R 介质上来创建 Video CD, 如果希望这样做的话, 需要安装 multimedia/vcdimagersysutils/cdrdao 这两个程序。 transcode 提供了联机手册, 但您仍应参考 transcode wiki 以了解更多信息和例子。 进一步了解 - FreeBSD里不同的视频软件包正迅速发展中。很可能在不久的将来,这里所谈到的问题都将得到解决。同时,有些人想超越FreeBSD的声/像(A/V)能力,那他们就不得不从一些FAQ和指南里学知识,并使用一些不同的应用程序。这里就给这些读者指出一些补充信息。 + FreeBSD里不同的视频软件包正迅速发展中。 + 很可能在不久的将来,这里所谈到的问题都将得到解决。 + 同时,有些人想超越FreeBSD的音/像(A/V)能力, + 那他们就不得不从一些FAQ和指南里学知识, + 并使用一些不同的应用程序。 + 这里就给这些读者指出一些补充信息。 - MPlayer 文档是很技术性的。这些文档可以给那些希望获得关于&unix;视频高级技术的人们提供参考。MPlayer邮件列表很不喜欢没耐心阅读文档的人,如果您发现什么问题想报告给他们,请首先RTFM。 + MPlayer 文档 + 是很技术性的。 + 这些文档可以给那些希望获得关于&unix;视频高级技术的人们提供参考。 + MPlayer 邮件列表很不喜欢没耐心阅读文档的人, + 如果您发现什么问题想报告给他们,请首先RTFM。 - xine HOWTO里边有一章是关于提高性能的,对所有的播放器都很适应。 + xine HOWTO + 里边有一章是关于提高性能的,对所有的播放器都很适应。 最后是一些很有前途的程序,读者可以试一下: Avifile,它就是 multimedia/avifile port。 Ogle 它就是 multimedia/ogle port。 Xtheater multimedia/dvdauthor,一个制作 DVD 节目的源码开放包。 + role="package">multimedia/dvdauthor, + 一个制作 DVD 节目的源码开放包。 Josef El-Rayes 原创: Marc Fonvieille 改编: 安装电视卡 电视卡 介绍 - 电视卡可以让您在您的计算机里观看到无线或有线电视。许多卡是通过RCA或S-video输入接收复合视频,而且有些卡还带有调频广播接收器。 + 电视卡可以让您在您的计算机里观看到无线或有线电视。 + 许多卡是通过RCA或S-video输入接收复合视频, + 而且有些卡还带有调频广播接收器。 - &os; 通过&man.bktr.4;驱动程序,提供了对基于PCI的电视卡的支持,要求这些卡使用的是Brooktree Bt848/849/878/879 或 Conexant CN-878/Fusion 878a视频采集芯片。您还要确保这个板上带的有被支持的调谐器,参考&man.bktr.4;手册查看所支持的调谐器列表。 + &os; 通过&man.bktr.4;驱动程序,提供了对基于PCI的电视卡的支持, + 要求这些卡使用的是Brooktree Bt848/849/878/879 或 + Conexant CN-878/Fusion 878a视频采集芯片。 + 您还要确保这个板上带的有被支持的调谐器, + 参考&man.bktr.4;手册查看所支持的调谐器列表。 增加驱动程序 - 要使用您的卡,您就要装载&man.bktr.4;驱动程序。这个可以通过往/boot/loader.conf里边添加下边一行来实现。象这样: + 要使用您的卡,您就要装载&man.bktr.4;驱动程序。 + 这个可以通过往 /boot/loader.conf + 里边添加下边一行来实现。象这样: bktr_load="YES" - 另外,您也可以静态地这个支持编译到内核里去,要是这样的话,就把下边几行加到内核配置里去: + 另外,您也可以静态地这个支持编译到内核里去, + 要是这样的话,就把下边几行加到内核配置里去: device bktr device iicbus device iicbb device smbus - 这些附加的设备驱动程序是必须的,因为卡的各组成部分是能过一根I2C总线相互连接在一起的。然后建立安装新的内核。 + 这些附加的设备驱动程序是必须的, + 因为卡的各组成部分是能过一根I2C总线相互连接在一起的。 + 然后建立安装新的内核。 - 一旦这个支持被加到了您的系统里,您须要重启系统。在启动过程中,您的电视卡应该显示为up(启动),象这样: + 一旦这个支持被加到了您的系统里,您须要重启系统。 + 在启动过程中,您的电视卡应该显示为up(启动),象这样: bktr0: <BrookTree 848A> mem 0xd7000000-0xd7000fff irq 10 at device 10.0 on pci0 iicbb0: <I2C bit-banging driver> on bti2c0 iicbus0: <Philips I2C bus> on iicbb0 master-only iicbus1: <Philips I2C bus> on iicbb0 master-only smbus0: <System Management Bus> on bti2c0 bktr0: Pinnacle/Miro TV, Philips SECAM tuner. - 当然,这些信息可能因您的硬件不同而有所区别。但是您应该能检查那个调制器是否被正确检测到了,可能要忽略一些检测到的同&man.sysctl.8; MIB(管理系统库)和内核配置文件选项一起的参数。例如,如果您想强制使用Philips(飞利浦) SECAM制式的调谐器 ,您就应把下列行加到内核配置文件里: + 当然,这些信息可能因您的硬件不同而有所区别。 + 但是您应该能检查那个调制器是否被正确检测到了, + 可能要忽略一些检测到的同&man.sysctl.8; + MIB(管理系统库)和内核配置文件选项一起的参数。 + 例如,如果您想强制使用Philips(飞利浦) SECAM制式的调谐器 , + 您就应把下列行加到内核配置文件里: options OVERRIDE_TUNER=6 或者,您直接使用&man.sysctl.8;: &prompt.root; sysctl hw.bt848.tuner=6 请参见 &man.bktr.4; 手册和 /usr/src/sys/conf/NOTES 文件, 以了解更多详细关于可用选项的资料。 有用的应用程序 要使用您的电视卡,您需要安装下列应用程序之一: - multimedia/fxtv提供窗口电视(TV-in-a-window)功能和图像/声音/图像采集功能。 + multimedia/fxtv + 提供 窗口电视(TV-in-a-window) + 功能和图像/声音/图像采集功能。 - multimedia/xawtv也是一款电视应用程序,功能同fxtv一样。 + multimedia/xawtv + 也是一款电视应用程序,功能同 + fxtv 一样。 - misc/alevt解码和显示Videotext/Teletext。 + misc/alevt + 解码和显示Videotext/Teletext。 - audio/xmradio,一款用于一些电视卡的调频电台调谐器的程序。 + audio/xmradio, + 一款用于一些电视卡的调频电台调谐器的程序。 - audio/wmtune,一款用于电台调谐器的便捷的桌面程序。 + audio/wmtune, + 一款用于电台调谐器的便捷的桌面程序。 更多的程序在&os; Ports Collection(Ports 集)里。 问题解决 - 如果您的电视卡遇到了什么问题,您应该首先检查一下您的视频采集芯片和调谐器是不是真正的被&man.bktr.4;驱动程序支持,并且是不是使用了正确的配置选项。想得到更多支持和关于您的电视卡的各种问题,您可以接触和使用&a.multimedia.name; 邮件列表的压缩包。 + 如果您的电视卡遇到了什么问题, + 您应该首先检查一下您的视频采集芯片和调谐器是不是真正的被&man.bktr.4; + 驱动程序支持,并且是不是使用了正确的配置选项。 + 想得到更多支持和关于您的电视卡的各种问题, + 您可以接触和使用&a.multimedia.name; 邮件列表的压缩包。 Marc Fonvieille 撰写人 图象扫描仪 图象扫描仪 介绍 在 &os; 中, 访问扫描仪的能力, 是通过 SANE (Scanner Access Now Easy) API 提供的。 SANE 也会使用一些 &os; 设备驱动来访问扫描仪硬件。 &os; 支持 SCSI 和 USB 扫描仪。 在做任何配置之前请确保您的扫描仪被 SANE 支持。 SANE 有一个 - 支持的设备列表, 可以为您提供有关扫描仪的支持情况和状态的信息。 + 支持的设备 列表, + 可以为您提供有关扫描仪的支持情况和状态的信息。 &man.uscanner.4; 手册页也提供了一个支持的 USB 扫描仪列表。 内核配置 上面提到 SCSI 和 USB 接口都是支持的。 取决于您的扫描仪接口, 需要不同的设备驱动程序。 USB 接口 默认的 GENERIC 内核包含了支持 USB 扫描仪需要的设备驱动。 如果您决定使用一个定制的内核, 确保下面在您的内核配置文件中存在下面这些行: device usb device uhci device ohci device uscanner 取决于您主板上的 USB 芯片, 您只需要 device uhci 或者 device ohci 中的一种,但是两个都在 内核配置文件中是没有害处的。 如果您不想重新编译内核而且您的内核也不是 GENERIC 的, 您可以用 &man.kldload.8; 命令直接加载 &man.uscanner.4; 设备驱动模块: &prompt.root; kldload uscanner 要在每次系统启动的时候加载这个模块, 添加下面这行到 /boot/loader.conf 中: uscanner_load="YES" 在使用正确的内核重启系统, 或加载了所需的内核模块之后, 就可以将您的 USB 扫描仪接到计算机上了。 在系统消息缓冲中, (&man.dmesg.8;) 应该会出现一行表示检测到您的扫描仪的信息: uscanner0: EPSON EPSON Scanner, rev 1.10/3.02, addr 2 这表明我们的扫描仪正在使用 /dev/uscanner0 设备节点。 SCSI 接口 如果您的扫描仪是 SCSI 接口的, 重要的是要知道您使用哪种 SCSI 控制器。 取决于所使用的 SCSI 芯片, 您需要调整内核配置文件。 GENERIC 的内核支持最常用的 SCSI 控制器。 请阅读 NOTES 文件并在您的内核配置文件中添加正确的行。 除了 SCSI 适配器驱动之外, 您还需要在内核配置文件中增加下述配置: device scbus device pass 在正确地联编并安装了内核之后, 就应该可以在系统启动时, 从系统消息缓冲中看到这些设备: pass2 at aic0 bus 0 target 2 lun 0 pass2: <AGFA SNAPSCAN 600 1.10> Fixed Scanner SCSI-2 device pass2: 3.300MB/s transfers 如果您的扫描仪没有在系统启动的时候加电, 很可能还需要强制手动检测一下,用 &man.camcontrol.8; 命令执行一次 SCSI 总线扫描: &prompt.root; camcontrol rescan all Re-scan of bus 0 was successful Re-scan of bus 1 was successful Re-scan of bus 2 was successful Re-scan of bus 3 was successful 然后扫描仪就会出现在 SCSI 设备列表里: &prompt.root; camcontrol devlist <IBM DDRS-34560 S97B> at scbus0 target 5 lun 0 (pass0,da0) <IBM DDRS-34560 S97B> at scbus0 target 6 lun 0 (pass1,da1) <AGFA SNAPSCAN 600 1.10> at scbus1 target 2 lun 0 (pass3) <PHILIPS CDD3610 CD-R/RW 1.00> at scbus2 target 0 lun 0 (pass2,cd0) 有关 SCSI 设备的更多细节, 可查看 &man.scsi.4; 和 &man.camcontrol.8; 手册页。 SANE 配置 SANE 系统分为两部分: 后端 (graphics/sane-backends) 和前端 (graphics/sane-frontends)。 后端部分提供到扫描仪自身的访问。 SANE 支持设备列表详细说明了哪一个后端可以支持您的图象扫描仪。 如果您想使用您的设备,就必须为您的扫描仪选定正确的后端。 前端部分提供图形化的扫描界面 (xscanimage)。 要做的第一步就是安装 graphics/sane-backends port 或者 package。然后,使用 sane-find-scanner 命令来检查 SANE 系统做的扫描仪检测: &prompt.root; sane-find-scanner -q found SCSI scanner "AGFA SNAPSCAN 600 1.10" at /dev/pass3 输出显示了扫描仪的接口类型和扫描仪连接到系统上的设备节点。 生产厂家和产品型号可能没有显示,不过不重要。 一些 USB 扫描仪需要您加载固件,后端的手册页中有这方面的解释。 您也应该阅读 &man.sane-find-scanner.1; 和 &man.sane.7; 手册页。 现在我们需要检查扫描仪是否可以被扫描前端识别。 默认情况下, SANE 后端自带一个叫做 &man.scanimage.1; 的命令行工具。 这个命令允许您列出设备以及从命令行执行图片扫描。 选项用来列出扫描仪设备: &prompt.root; scanimage -L device `snapscan:/dev/pass3' is a AGFA SNAPSCAN 600 flatbed scanner 如果没有输出任何信息, 或提示没有识别到扫描仪, 则说明 &man.scanimage.1; 无法识别它。 如果发生这种情况, 您就需要修改扫描仪支持后端的配置文件, 并定义所使用的扫描设备。 /usr/local/etc/sane.d/ 目录中包含了所有的后端配置文件。 这类识别问题经常会在某些 USB 扫描仪上发生。 例如, 对于在 中所使用的 USB 扫描仪, sane-find-scanner 会给出下面的信息: &prompt.root; sane-find-scanner -q found USB scanner (UNKNOWN vendor and product) at device /dev/uscanner0 扫描仪被正确的探测到了,它使用 USB 接口,连接在 /dev/uscanner0 设备节点上。 我们现在可以检查看看扫描仪是否被正确的识别: &prompt.root; scanimage -L No scanners were identified. If you were expecting something different, check that the scanner is plugged in, turned on and detected by the sane-find-scanner tool (if appropriate). Please read the documentation which came with this software (README, FAQ, manpages). 既然扫描仪没有被识别,我们就需要编辑 /usr/local/etc/sane.d/epson.conf 文件。所用的扫描仪型号是 &epson.perfection; 1650, 这样我们知道扫描仪应使用 epson 后端。确保阅读后端配置文件中的帮助注释。 改动非常简单:注释掉导致您的扫描仪使用错误接口的所有行 (在我们这种情况下,我们将注释掉从 scsi 开始的所有行,因为我们的扫描仪使用 USB 接口),然后在文件的结尾添加指定的接口和所用的设备节点。 这种情况下,我们添加下面这行: usb /dev/uscanner0 请确保阅读后端配置文件提供的注释以及后端手册页了解更多细节, 并使用正确的语法。我们现在可以检验扫描仪是否被识别到了: &prompt.root; scanimage -L device `epson:/dev/uscanner0' is a Epson GT-8200 flatbed scanner 我们的 USB 扫描仪被识别到了。 此时如果商标和型号与扫描仪的实际情况不符, 并不会带来太大的麻烦。 您需要关注的是 `epson:/dev/uscanner0' 字段, 这个给了我们正确地后端名称和正确的设备节点。 一旦 scanimage -L 命令可以看到扫描仪, 配置就完成了。设备现在准备好等待扫描了。 &man.scanimage.1; 允许我们从命令行执行图片扫描, 相比之下使用图形用户界面来执行图片扫描会更好。 SANE 提供了一个简单但实用的图形界面: xscanimage (graphics/sane-frontends)。 Xsane (graphics/xsane)是另一个流行的图形扫描前端。 这个前端提供了一些高级特性, 比如多样的扫描模式(photocopy,fax,等。), 色彩校正,批量扫描,等等。这两个程序都可以作为 GIMP 的插件使用。 授权其他用户访问扫描仪 前面所有的操作都是用 root 权限来完成的。You may however, need 然而您可能需要让其他的用户也可以访问扫描仪。 用户需要有扫描仪所用的设备节点的读和写权限。 比如,我们的 USB 扫描仪使用设备节点 /dev/uscanner0,这个节点属于 operator 组。将用户 joe 添加到 operator 组会允许他使用扫描仪: &prompt.root; pw groupmod operator -m joe 要了解更多细节, 请阅读 &man.pw.8; 联机手册。 此外, 还需要为 /dev/uscanner0 设备节点设置正确的写入权限 (0660 或 0664), 因为默认情况下, operator 组只能读这个设备节点。 这项工作可以通过在 /etc/devfs.rules 文件中添加如下设置来自东完成: [system=5] add path uscanner0 mode 660 随后您还需要在 /etc/rc.conf 中添加下面的内容并重新启动: devfs_system_ruleset="system" 关于这些配置的进一步细节请参考联机手册 &man.devfs.8;。 当然, 考虑安全的原因, 在您将用户添加到任何组, 尤其是 operator 组时, 都应三思而后行。 diff --git a/zh_CN.GB2312/books/handbook/security/chapter.sgml b/zh_CN.GB2312/books/handbook/security/chapter.sgml index c8dcdc75cb..83eb063537 100644 --- a/zh_CN.GB2312/books/handbook/security/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/security/chapter.sgml @@ -1,4427 +1,4439 @@ Matthew Dillon 这一章的许多内容来自 security(7) 联机手册,其作者是 安全 security 概述 这一章将对系统安全的基本概念进行介绍, 除此之外, 还将介绍一些好的习惯, 以及 &os; 下的一些更深入的话题。 这章的许多内容对于一般的系统和 Internet 安全也适用。 如今, Internet 已经不再像以前那样是一个人人都愿意与您作好邻居的 友善 的地方。 让系统更加安全, 将保护您的数据、 智力财产、 时间, 以及其他很多东西不至于被入侵者或心存恶意的人所窃取。 &os; 提供了一系列工具和机制来保证您的系统和网络的完整及安全。 读完这章,您将了解: 基本的 &os; 系统安全概念。 &os; 中众多可用的密码学设施,例如 DESMD5 如何设置一次性口令验证机制。 如何配置 TCP Wrappers 以便与 inetd 配合使用。 如何在 &os; 5.0 以前的版本上设置 KerberosIV 如何在 &os; 上设置 Kerberos5 如何配置 IPsec 并在 &os;/&windows; 机器之间建构 VPN 如何配置并使用 OpenSSH,以及 &os; 的 SSH 执行方式。 系统 ACL 的概念,以及如何使用它们。 如何使用 Portaudit 工具来审核从 Ports Collection 安装的第三方软件包的安全性。 如何从 &os; 的安全公告中获得有用信息并采取相应措施。 对于进程记帐功能的感性认识, 并了解如何在 &os; 中启用它。 在开始阅读这章之前,您需要: 理解基本的 &os; 和 Internet 概念。 其他安全方面的话题, 则贯穿本书的始终。 例如, 强制性访问控制 (MAC) 在 中进行了介绍, 而 Internet 防火墙则在 中进行了讨论。 介绍 安全是系统管理员自始至终的基本要求。 由于所有的 BSD &unix; 多用户系统都提供了与生俱来的安全性, 因此建立和维护额外的安全机制, 确保用户的 诚实 可能也就是最需要系统管理员考虑的艰巨的工作了。 机器的安全性取决于您设置的安全设施, 而许多安全方面的考虑, 则会与人们使用计算机时的便利性相矛盾。 一般来说, &unix; 系统能够胜任数目众多进程并发地处理各类任务, 这其中的许多进程是以服务身份运行的 — 这意味着, 外部实体能够与它们互联并产生会话交互。 如今的桌面系统, 已经能够达到许多昔日的小型机甚至主机的性能, 而随着这些计算机的联网和在更大范围内完成互联, 安全也成为了一个日益严峻的课题。 系统的安全也应能够应付各种形式的攻击, 这也包括那些使系统崩溃, 或阻止其正常运转, 但并不试图窃取 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可执行程序的安全。 确保用户帐户的安全。 确保口令文件的安全。 确保内核中核心组件、直接访问设备和文件系统的安全。 快速检测系统中发生的不适当的变化。 做个偏执狂。 这一章的下一节将比较深入地讲述上面提到的每一个条目。 确保 &os; 的安全 security 确保 &os; 的安全 命令与协议 在这份文档中,我们使用 粗体 来表示应用程序, 并使用 单倍距 字体来表示命令。 这样的排版区分能够有效地区分类似 ssh 这样的概念, 因为它既可以表示命令,又可以表示协议。 接下来的几节中, 将介绍在这一章中 前一节 中所介绍的那些加强 &os; 系统安全性的手段。 确保 <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 谨慎的管理员只运行他们需要的服务, 不多, 不少。 要当心第三方的服务程序很可能有更多的问题。 例如, 运行旧版的 imapdpopper 无异于将 root 令牌拱手送给全世界的攻击者。 永远不要运行那些您没有仔细检查过的服务程序, 另外也要知道, 许多服务程序并不需要以 root 的身份运行。 例如, ntalkcomsat, 以及 finger 这些服务, 都能够以一种被称作 沙盒 的特殊用户的身份运行。 除非您已经解决掉了许多麻烦的问题, 否则沙盒就不是完美的, 但洋葱式安全规则仍然成立: 如果有人设法攻破了在沙盒中运行的程序, 那么在做更多坏事之前, 他们还必须想办法攻破沙盒本身的限制。 攻击者需要攻破的层次越多, 他们成功的可能性就越小。 过去, 破解 root 的漏洞几乎在所有以 root 身份运行的服务上都发现过, 包括那些基本的系统服务。 如果您的机器只打算向外界提供 sshd 登录, 而用户不会使用 telnetdrshd 甚至 rlogind 登录, 就应该毫不犹豫地关闭它们! &os; 现在默认在沙盒中运行 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 那么他就有能力作任何事情, 当然, 有一些事情是他们比较喜欢干的。 例如, 绝大多数现代的内核都包括一个内建的听包设备。 在 &os; 中,这个设备被称作 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 可执行文件将是一个好主意。 您可能会想看看 nosuid 选项 (参见 &man.mount.8;)。 尽管如此, 这些扫描仍然应该至少每周进行一次, 这样做的意义并不是检测有效的攻击, 而是检查攻击企图。 进程记帐 (参见 &man.accton.8;) 是一种相对成本较低的, 可以帮助您在被入侵后评估损失的机制。 对于找出入侵者是如何进入系统的这件事情来说, 它会非常的有所助益,特别是当入侵者什么文件都没有修改的情况下。 最后, 安全脚本应该处理日志文件, 而日志文件本身应该通过尽可能安全的方法生成 — 远程 syslog 可能非常有用。 入侵者会试图掩盖他们的踪迹, 而日志文件对于希望了解入侵发生时间的系统管理员来说则显得尤为重要。 保持日志文件的永久性记录的一种方法是在串口上运行系统控制台, 并在一台安全的机器上收集这些信息。 偏执 带点偏执不会带来伤害。作为一种惯例, 系统管理员在不影响使用的便利的前提下可以启用任何安全特性,此外, 在经过深思熟虑之后,也可以增加一些 确实会 让使用变得不那么方便的安全特性。 更重要的是,有安全意识的管理员应该学会混合不同的安全策略 — 如果您逐字逐句地按照这份文档来配置您的机器, 那无异于向那些同样能得到这份文档的攻击者透露了更多的信息。 拒绝服务攻击 拒绝服务 (DoS) 这一节将介绍拒绝服务攻击。 DoS 攻击通常是基于数据包的攻击, 尽管几乎没有任何办法来阻止大量的伪造数据包耗尽网络资源, 但通常可以通过一些手段来限制这类攻击的损害,使它们无法击垮服务器: 限制服务进程 fork。 限制 springboard 攻击 (ICMP 响应攻击, ping 广播,等等)。 使内核路由缓存过载。 一种比较常见的 DoS 攻击情形, 是通过攻击复制进程 (fork) 的服务, 使其产生大量子进程, 从而是其运行的机器耗尽内存、 文件描述符等资源, 直到服务器彻底死掉。 inetd (参见 &man.inetd.8;) 提供了许多选项来限制这类攻击。 需要注意的是, 尽管能够阻止一台机器彻底垮掉, 但通常无法防止服务本身被击垮。 请仔细阅读 inetd 的联机手册, 特别是它的 以及 这三个选项。 伪造 IP 攻击能够绕过 inetd 选项, 因此, 这些选项需要配合使用。 某些独立的服务器也有类似的限制参数。 例如, Sendmail 就提供了自己的 选项, 它通常比 Sendmail 的负载限制选项更为有效, 因为服务器负载的计算有滞后性。 您可以在启动 sendmail 时指定一个 MaxDaemonChildren 参数; 把它设的足够高以便承载您所需要的负荷, 当然, 不要高到足以让运行 Sendmail 的机器死掉。 此外, 以队列模式 () 运行 Sendmail 并把服务程序 (sendmail -bd) 和队列执行程序分别执行 (sendmail -q15m) 也是一个好主意。 如果您希望保证队列的实时性, 可以考虑使用更短的间隔, 例如 , 但同时也需要指定一个合理的子进程数, 也就是通过 MaxDaemonChildren 选项以免 那个 Sendmail 造成重叠的故障。 Syslogd 可以被直接地攻击,因此, 强烈建议只要可行,就在启动它的时候加上 参数, 其他情况下,则至少应该加上 对于基于连接的服务,例如 TCP Wrapper 的 reverse-identd, 都应该格外的小心, 因为它们都可能直接遭受攻击。 一般情况下, 基于安全考虑, 不应使用 TCP Wrapper 所提供的 reverse-ident 这样的功能。 此外, 将内部服务保护起来, 阻止来自其他主机的访问也十分重要, 这些工作可以通过设置边界路由器来完成。 主要的想法, 是阻止来自您的 LAN 以外的访问, 这有助于避免 root 受到攻击。 尽可能配置排他式的防火墙, 例如, 用防火墙阻止所有的网络流量 除了 端口 A、B、 C、D,以及 M-Z。 通过采用这种方法, 您可以很容易地将低端口的访问阻止在外, 而又不难配置使防火墙放过那些明确需要开放的服务, 例如 named (如果您的机器准备作为域的主要解析服务器), ntalkdsendmail,以及其他可以从 Internet 访问的服务。 如果您尝试以其他方式配置防火墙 — 采用比较宽松的策略, 那么您将很有可能忘记 关掉 一两个服务, 或者在增加了一些服务之后忘记更新防火墙策略。 尽管如此, 仍然可以考虑允许让数据进入编号较高的那一部分端口, 这将保证那些需要这样特性的服务能够正常工作, 而又不影响低端口服务的安全性。 此外, 还应注意到 &os; 允许您来控制动态绑定的端口的范围, 即一系列 net.inet.ip.portrange 变量,通过 sysctl 来完成设置。 (sysctl -a | fgrep portrange)。 这使得您完成较复杂的防火墙策略变得易如反掌。 例如, 您可能希望普通的高段端口的起止范围是 4000 到 5000, 而更高范围则是 49152 到 65535, 随后在防火墙中阻止低于 4000 的所有端口 (当然, 除了那些特地为 Internet 访问而开设的端口)。 另一种常被称作 springboard 的攻击也是非常常见的 DoS 攻击 — 它通过使服务器产生其无法处理的响应来达到目的。 最常见的攻击就是 ICMP ping 广播攻击。 攻击者通过伪造 ping 包, 将其源 IP 设置为希望攻击的机器的 IP。 如果您的边界路由器没有进行禁止 ping 广播地址的设置, 则您的网络将最终陷于响应伪造的 ping 包之中, 特别是当攻击者同时使用了多个不同的网络时。 广播攻击能够产生超过 120 兆位的瞬时流量。 另一种常见的针对 ICMP 错误报告系统的 springboard 攻击, 通过建立可以生成 ICMP 出错响应的包, 攻击者能够攻击服务器的网络下行资源, 并导致其上行资源耗尽。 这种类型的攻击也可以通过耗尽内存来使得使得被攻击的服务器崩溃, 特别是当这些服务器无法足够快地完成 ICMP 响应的时候。 较新的内核可以通过调整 sysctl 变量 net.inet.icmp.icmplim 来限制这种攻击。 最后一类主要的 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 5 是一个很棒的验证协议, 但使用了它的 telnetrlogin 应用程序有一些 bug, 使得它们不适合处理二进制流。 而且, 除非使用了 选项, 否则默认情况下 Kerberos 并不加密会话。 ssh 在默认时加密所有的会话内容。 除了默认转发加密密钥之外, ssh 在所有的其他方面都做得很好。 这意味着如果您持有供您访问系统其他部分密钥的工作站作了很好的安全防护, 而您连到了一台不安全的机器上, 则您的密钥可能被别人获得。 尽管实际的密钥并没有被泄漏, 但由于 ssh 会在您登录的过程中启用一个转发端口, 如果攻击者拿到那台不安全的机器上的 root 那么他将能够利用那个端口来使用您的密钥, 从而访问您能够访问的那些机器。 我们建议您在使用 ssh 时配合 Kerberos 来完成工作人员的登录过程。 Ssh 在编译时可以加入 Kerberos 支持。 在减少了潜在地暴露 ssh 密钥的机会的同时, 它还能够通过 Kerberos 来保护口令。 Ssh 密钥只有在做过安全防护的机器上执行自动操作时才应使用 (这是 Kerberos 不适合的情形)。 此外,我们还建议您要么在 ssh 配置中关闭密钥转发, 要么在 authorized_keys 中增加 from=IP/DOMAIN 选项, 来限制这些密钥能够登录的来源机器。 Bill Swingle 部分重写、更新来自 DES、 Blowfish、 MD5, 以及 Crypt 安全 密码 crypt Blowfish DES MD5 &unix; 系统上的每个用户都有一个与其帐户关联的口令。 很显然, 密码只需要被这个用户和操作系统知道。 为了保证口令的私密性, 采用了一种称为 单向散列 的方法来处理口令, 简单地说, 很容易从口令推算出散列值, 反之却很难。 其实, 刚才那句话可能并不十分确切: 因为操作系统本身并不 真的 知道您的口令。 它只知道口令 经过加密的形式。 获取口令对应 明文 的唯一办法是采用暴力在口令可能的区间内穷举。 不幸的是,当 &unix; 刚刚出现时,安全地加密口令的唯一方法基于DES, 数据加密标准 ( the Data Encryption Standard )。 于是这给那些非美国居民带来了问题, 因为 DES 的源代码在当时不能被出口到美国以外的地方, &os; 必须找到符合美国法律,但又要与其他那些使用 DES 的 &unix; 版本兼容的办法。 解决方案是把加密函数库分割为两个, 于是美国的用户可以安装并使用 DES 函数库, 而国际用户则使用另外一套库提供的一种可以出口的加密算法。 这就是 &os; 为什么使用 MD5 作为它的默认加密算法的原因。 MD5 据信要比 DES 更安全,因此,安装 DES 更多地是出于兼容目的。 识别您采用的加密算法 现在这个库支持 DES、 MD5 和 Blowfish 散列函数。默认情况下, &os; 使用 MD5 来加密口令。 可以很容易地识别 &os; 使用哪种加密方法。 检查 /etc/master.passwd 文件中的加密密码是一种方法。 用 MD5 散列加密的密码通常要比用 DES 散列得到的长一些, 并且以 $1$ 字符开始。 以 $2a$ 开始的口令是通过 Blowfish 散列函数加密的。 DES 密码字符没有任何可以用于鉴别的特征, 但他们要比 MD5 短, 并且以不包括 $ 在内的 64 个可显示字符来表示, 因此相对比较短的、没有以美元符号开头的字符串很可能是一个 DES 口令。 新口令所使用的密码格式是由 /etc/login.conf 中的 passwd_format 来控制的, 可供选择的算法包括 des, md5blf。 请参考 &man.login.conf.5; 联机帮助以获得更进一步的详情。 一次性口令 一次性口令 安全 一次性口令 默认情况下, &os; 提供了 OPIE (One-time Passwords In Everything) 支持, 它默认使用 MD5 散列。 下面将介绍三种不同的口令。 第一种是您常用的 &unix; 风格或 Kerberos 口令; 我们在后面的章节中将称其为 &unix; 口令。 第二种是使用 OPIE 的 &man.opiekey.1; 程序生成, 并为 &man.opiepasswd.1; 以及登录提示所接受的一次性口令,我们称其为 一次性口令。 最后一类口令是您输入给 opiekey 程序 (有些时候是 opiepasswd 程序) 用以产生一次性口令的秘密口令,我们称其为 秘密口令 或通俗地简称为 口令 秘密口令和您的 &unix; 口令毫无关系, 尽管可以设置为相同的, 但不推荐这么做。 OPIE 秘密口令并不像旧式的 &unix; 口令那样只能限于8位以内在 &os; 中标准的登录口令最长不能超过 128 个字符。。 您想要用多长的口令都可以。 有六、七个词的短句是很常见的选择。 在绝大多数时候, OPIE 系统和 &unix; 口令系统完全相互独立地工作。 除了口令之外, 对于 OPIE 还有两组至关重要的数据。 其一被称作 种子key, 它包括两个字符和五个数字。 另一个被称作 迭代轮数, 这是一个 1 到 100 之间的数字。 OPIE 通过将种子加到秘密口令后面, 并执行迭代轮数那么多次的 MD4/MD5 散列运算来得到结果, 并将结果表示为 6 个短的英文单词。 这 6 个英文单词就是您的一次性口令。 验证系统 (主要是 PAM) 会记录上次使用的一次性口令, 如果用户提供的口令的散列值与上次一致, 则可以通过身份验证。 由于使用了单向的散列函数, 因此即使截获了上次使用的口令, 也没有办法恢复出下次将要使用的口令; 每次成功登录都将导致迭代轮数递减, 这样用户和登录程序将保持同步。 每当迭代轮数减少到 1 时, 都必须重新初始化 OPIE。 接下来将讨论和每个系统有关的三个程序。 opiekey 程序能够接收带迭代计数, 种子和秘密口令, 并生成一个一次性口令, 或一张包含连续的一组一次性口令的表格。 opiepasswd 程序用于初始化 OPIE, 并修改口令、 迭代次数、种子和一次性口令。 和 opieinfo 程序可以用于检查相应的验证数据文件 (/etc/opiekeys) 并显示执行命令的用户当前的迭代轮数和种子。 我们将介绍四种不同的操作。 在安全的连接上通过 opiepasswd 来第一次设置一次性口令, 或修改口令及种子。 第二类操作是在不安全的连接上使用 opiepasswd 辅以在安全连接上执行的 opiekey 来完成同样的工作。 第三类操作是在不安全的连接上使用 opiekey 来登录。 最后一类操作是采用 opiekey 来生成大批的密码, 以便抄下来或打印出来,在没有安全连接的地方使用。 安全连接的初始化 第一次初始化 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 这一行给出了所需的参数: 您的登录名, 迭代轮数, 以及种子。 登录系统时, 它能够记住这些参数并呈现给您, 因此无需记忆它们。 最后一行给出了与您的秘密口令对应的、用于登录的一个一次性口令; 如果您立即重新登录, 则它将是您需要使用的那个口令。 不安全连接初始化 如果您需要通过一个不安全的连接来初始化, 则应首先在安全连接上执行过一次 opiekey; 您可能希望在可信的机器的 shell 提示符下完成。 此外还需要指定一个迭代轮数 (100 也许是一个较好的选择) 也可以选择一个自己的种子, 或让计算机随机生成一个。 在不安全的连接上 (当然是连到您希望初始化的机器上),使用 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 为了接受默认的种子, 按下 Return。 在输入访问口令之前, 到一个有安全连接的机器上, 并给它同样的参数: &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 现在回到不安全的连接, 并将生成的一次性口令粘贴到相应的应用程序中。 生成一个一次性密码 一旦初始化过 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: 另外, OPIE 提示有一个很有用的特性 (这里没有表现出来): 如果您在口令提示处按下 Return(回车) 系统将回显刚键入的口令, 您可以藉此看到自己所键入的内容。 如果试图手工键入一个一次性密码, 这会非常有用。 MS-DOS Windows MacOS 此时您需要生成一个一次性密码来回答这一提示。 这项工作必须在一个可信的系统上执行 opiekey 来完成。 (也可以找到 DOS、 &windows; 以及 &macos; 等操作系统上运行的版本)。 这个程序需要将迭代轮数和种子提供给它。 您可以从登录提示那里复制和粘贴它们。 在可信的系统上: &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 现在就可以用刚刚获得的一次性口令登录了。 产生多个一次性口令 有时,会需要到不能访问可信的机器或安全连接的地方。 这种情形下, 可以使用 opiekey 命令来一次生成许多一次性口令。 例如: &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; 口令 OPIE 可以对 &unix; 口令的使用进行基于 IP 的登录限制。 对应的文件是 /etc/opieaccess, 这个文件默认情况下就是存在的。 请参阅 &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 提供的一些额外的安全功能, 不应被视为好的防火墙的替代品。 TCP Wrappers 应结合防火墙或其他安全加强设施一并使用, 为系统多提供一层安全防护。 由于这些配置是对于 inetd 的扩展, 因此, 读者应首先阅读 配置 inetd 这节。 尽管由 &man.inetd.8; 运行的程序并不是真正的 服务程序, 但传统上也把它们称为服务程序。 下面仍将使用这一术语。 初始配置 在 &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 是一个网络附加系统/协议, 它使得用户能够通过一个安全服务器的服务来验证身份。 象远程登录, 远程复制, 系统间的相互文件复制和其他完成高风险任务的服务将被变得相当安全和可控制。 下面将具体介绍如何配置随 &os; 发行的 Kerberos。 不过, 您还是应该阅读相应的联机手册以获得完整的说明。 安装 <application>KerberosIV</application> MIT KerberosIV 安装 Kerberos 是 &os; 的一项可选组件。 安装该软件最简单的办法就是 在使用 sysinstall 安装 &os; 时选择 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 目录中。 在每一台服务器上都必须存在这个文件, 它对 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 特权的用户使用他们自己 单独的 &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 或者, 当 jack 登录到 jane 在同一台机器上的账号 (jane 按照前面所介绍的那样配置了 .klogin 文件, 而负责 Kerberos 的管理员, 则为 jack 的 principal 配置了一个空的 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 的配置文件, /etc/krb5.conf [libdefaults] default_realm = EXAMPLE.ORG [realms] EXAMPLE.ORG = { kdc = kerberos.example.org admin_server = 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 服务, 就 必须 首先配置完整或最小配置的 /etc/krb5.conf 并且 正确地配置 DNS 服务器。 接下来需要创建 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; kinit tillman tillman@EXAMPLE.ORG's Password: &prompt.user; klist 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 完成所需的操作之后, 可以撤消这一 ticket: &prompt.user; k5destroy 为 <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 客户应用程序也是默认安装的。 在 Hemidal 的 最小 安装理念下, telnet 是唯一一个采用了 Kerberos 的服务。 Heimdal port 则提供了一些默认不安装的客户应用程序, 例如启用了 Kerberos 版本的 ftprshrcprlogin 以及一些更不常用的程序。 MIT port 也包括了一整套 Kerberos 客户应用程序。 用户配置文件: <filename>.k5login</filename> 和 <filename>.k5users</filename> .k5login .k5users 在某个领域中的用户往往都有自己的 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 来进行验证, 才能够正确地修改转发凭据的属主。 除此之外, 还应修改 rc.conf 并加入下列配置: kerberos5_server="/usr/local/sbin/krb5kdc" kadmind5_server="/usr/local/sbin/kadmind" kerberos5_server_enable="YES" kadmind5_server_enable="YES" 这样做的原因是, MIT kerberos 会将可执行文件装到 /usr/local 之下。 缓解 <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 FAQ 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 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; 联机手册中找到。 在您执行前述命令的目录中将生成两个文件。 证书申请, 即 req.pem, 可以发给一家发证机构, 它将验证您输入的凭据的真实性, 并对申请进行签名, 再把证书返还给您。 第二个文件的名字将是 cert.pem, 它包含了证书的私钥, 应被全力保护; 如果它落入别人手中, 则可以被用来伪造您 (或您的服务器)。 如果不需要来自 CA 的签名, 也可以创建自行签名的证书。 首先, 需要生成 RSA 密钥: &prompt.root; openssl dsaparam -rand -genkey -out myRSA.key 1024 接下来, 生成 CA 密钥: &prompt.root; openssl gendsa -des3 -out myca.key myRSA.key 然后用这个密钥来创建证书: &prompt.root; openssl req -new -x509 -days 365 -key myca.key -out new.crt 上述步骤将在当前目录中生成两个新文件: 一个是权威发证机构的签名文件, myca.key; 另一个是证书本身, new.crt。 这些文件应该放到同一个目录中, 一般而言, 推荐放到 /etc, 并且只允许 root 读取。 建议把权限设置为 0700, 这可以通过 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 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 包括了采用 硬件加速的 IPsec 协议栈, 也称作 Fast IPsec, 它来自 OpenBSD。 它能够通过 &man.crypto.4; 子系统来利用加密硬件 (只要可能) 优化 IPSec 的性能。 这个子系统是新的, 暂时还不支持 KAME 版本的 IPsec 的全部功能。 此外, 为了启用硬件加速的 IPsec, 必须把下面的选项加入到内核配置中: 内核选项 FAST_IPSEC options FAST_IPSEC # new IPsec (cannot define w/ IPSEC) 需要注意的是, 目前还不能用 Fast IPsec 子系统完全替代 KAME 的 IPsec 实现。 请参见联机手册 &man.fast.ipsec.4; 以了解进一步的详情。 如果希望防火墙能够正确地跟踪到 &man.gif.4; 信道的状态, 您还需要在内核配置中启用 options IPSEC_FILTERGIF #filter ipsec packets from a tunnel IPsec ESP IPsec AH IPsec 包括了两个子协议: Encapsulated Security Payload (ESP), 保护 IP 包数据不被第三方介入, 通过使用对称加密算法 (例如 Blowfish、 3DES)。 Authentication Header (AH), 保护 IP 包头不被第三方介入和伪造, 通过计算校验和以及对 IP 包头的字段进行安全散列来实现。 随后是一个包含了散列值的附加头, 以便能够验证包。 ESPAH 可以根据环境的不同, 分别或者一同使用。 VPN 虚拟专用网 VPN IPsec 既可以用来直接加密主机之间的网络通讯 (也就是 传输模式); 也可以用来在两个子网之间建造 虚拟隧道 用于两个网络之间的安全通讯 (也就是 隧道模式)。 后一种更多的被称为是 虚拟专用网 (VPN)。 &man.ipsec.4; 联机手册提供了关于 FreeBSD 中 IPsec 子系统的详细信息。 要把 IPsec 支持放进内核, 应该在配置文件中加入下面的选项: 内核选项 IPSEC 内核选项 IPSEC_ESP options IPSEC #IP security options IPSEC_ESP #IP security (crypto; define w/ IPSEC) 内核选项 IPSEC_DEBUG 如果需要 IPsec 的调试支持, 还应增加: options IPSEC_DEBUG #debug for IP security
问题 由于对如何建立 VPN 并不存在标准, 因此 VPN 可以采用许多种不同的技术来实现, 每种技术都有其长处和弱点。 这篇文章讲展现一个具体的应用情景, 并为它设计了适合的 VPN。 情景: 两个网络都接入了 Internet, 希望像一个网络那样工作 VPN 创建 现有条件如下: 至少有两个不同的站点 每个站点都使用内部的 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 的数据包将会封装到另外的包中。 + 因此, 发送到 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 设备的支持必须在两台网关机上编译进 &os; 内核。 可以通过添加下面的设置来达到目的: device gif 到两边的内核配置文件中, 并重新编译、 安装和启动它们。 配置隧道可以分为两步来完成。 首先隧道必须被告知外部的 (或公网的) IP 地址, 可以通过 &man.ifconfig.8; 来完成这步。 私网 IP 地址则必须使用 &man.ifconfig.8; 来配置。 在网络 #1 的网关机上可以通过下面的这些命令来配置隧道。 &prompt.root; ifconfig gif0 create &prompt.root; ifconfig gif0 tunnel A.B.C.D W.X.Y.Z &prompt.root; ifconfig gif0 inet 192.168.1.1 192.168.2.1 netmask 0xffffffff 在另一台网关上也需要执行同样的命令, 但 IP 地址的顺序相反。 &prompt.root; ifconfig gif0 create &prompt.root; ifconfig gif0 tunnel W.X.Y.Z A.B.C.D &prompt.root; ifconfig gif0 inet 192.168.2.1 192.168.1.1 netmask 0xffffffff 随后执行: ifconfig gif0 可以查看当前的配置情况。 例如, 在网络 #1 的网关上您应该能够看到: &prompt.root; ifconfig gif0 gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280 tunnel inet A.B.C.D --> W.X.Y.Z inet 192.168.1.1 --> 192.168.2.1 netmask 0xffffffff 如您所见, 虽然到已经在物理地址 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;, 甚至可以得到包中的更多信息以及其中的数据。 很明显这是不能接受的。 下一节将讨论如何让两个网络之间的连接更安全, 这件事是通过对通讯实施加密来完成的。 小结: 在两边的内核中配置 device gif 编辑网关 #1 上的 /etc/rc.conf 并将下面的行添加进去 (根据需要改 IP )。 gif_interfaces="gif0" 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) 协议。 配置下面的内核选项 内核选项 IPSEC options IPSEC options IPSEC_ESP 然后重新编译、 安装最后重新启动新的内核。 在继续进行设置之前, 您需要在两台网关上都进行同样的设置。 IKE 在建立安全关联时有两种选择。 一种方法是完全手工地在两台主机之间选择加密算法、 密钥等等, 另一种方法是使用实现了 Internet 密钥交换协议 (IKE) 的服务程序来帮您完成这些任务。 我们推荐后者。 不说别的, 它配置起来要容易得多。 IPsec security policies setkey 用 &man.setkey.8; 可以编辑和显示安全策略。 打个比方, setkey 之于内核的安全策略表, 就相当于 &man.route.8; 之于内核中的路由表。 setkey 还可以显示当前的安全关联, 这一点和 netstat -r 类似。 在 FreeBSD 上可供选择的用于管理安全关联的服务程序有很多。 这篇文章将介绍其中的一种, racoon —。 它可以从 &os; 的 Ports collection 中的 security/ipsec-tools 安装。 racoon 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/ipsec-tools。 编辑两台网关上的 ${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 两个版本。 使用 OpenSSH 的好处 通常,当使用 &man.telnet.1; 或 &man.rlogin.1; 时, 数据是以明码的形式发送的,并没有加密。 在客户机和服务器之间的网络上运行的听包程序可以在会话中偷窃到传输的用户名/密码和数据。 OpenSSH 提供了多种的身份验证和加密方法来防止这种情况的发生。 启用 sshd OpenSSH 启用 sshd 的启用是作为 &os; 安装中 Standard 安装过程中的一步来进行的。 要查看 sshd 是否已被启用, 请检查 rc.conf 文件中的: sshd_enable="YES" 这表示在下次系统启动时加载 OpenSSH 的服务程序 &man.sshd.8;。 此外, 也可以手动使用 &man.rc.8; 脚本 /etc/rc.d/sshd 来启动 OpenSSH /etc/rc.d/sshd start 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 v2 连接。 如果能用版本 2 则客户程序会自动使用, 否则它会返回使用版本 1 的模式。 此外, 也可以通过命令行参数 来相应地强制使用版本 1 或 2。 保持客户端的版本 1 能力是为了考虑较早版本的兼容性。 安全复制 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; 来生成 DSA 或 RSA 密钥对用于验证用户的身份: &prompt.user; ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/user/.ssh/id_dsa): Created directory '/home/user/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_dsa. Your public key has been saved in /home/user/.ssh/id_dsa.pub. The key fingerprint is: bb:48:db:f2:93:57:80:b6:aa:bc:f5:d5:ba:8f:79:17 user@host.example.com &man.ssh-keygen.1; 会生成一个包含公私钥对用于验证身份。 私钥将保存到 ~/.ssh/id_dsa~/.ssh/id_rsa, 而公钥则被存放到 ~/.ssh/id_dsa.pub 或 - ~/.ssh/id_rsa.pub, 文件名取决于您选择的 DSA 和 - RSA 密钥类型。 公钥必须被存放到远程机器上的 + ~/.ssh/id_rsa.pub, 文件名取决于您选择的 + DSARSA + 密钥类型。 RSA 或者 DSA + 公钥必须被存放到远程机器上的 ~/.ssh/authorized_keys 才能够使系统正确运转。 - 类似地, 第 1 版的 RSA 公钥应存放到 - ~/.ssh/authorized_keys + 这将允许从远程连接时以基于 SSH 密钥的验证来代替口令验证。 如果在 &man.ssh-keygen.1; 中使用了通行字, 则每次使用私钥时都需要输入它。 &man.ssh-agent.1; 能够缓解多次输入长通行字的压力, 并将在接下来的 予以详述。 选项和配置文件可能随 OpenSSH 的版本不同而不同; 为了避免出现问题, 您应参考 &man.ssh-keygen.1; 联机手册。 + + 这将使到远程机器的连接基于 SSH 密钥而不是口令。 + + 如果在运行 &man.ssh-keygen.1; 时使用了通行字, + 每次使用私钥的时候用户都将被要求输入通行字。 &man.ssh-agent.1; + 能够减缓重复输入较长通行字的负担, 有关更详细的探究在 + 下一节 . + + 随着你系统上的 OpenSSH + 版本的不同,各种选项和配置文件也会不同; 为了避免此类问题, + 你需要参阅 &man.ssh-keygen.1; 联机手册。 ssh-agent 和 ssh-add &man.ssh-agent.1; 和 &man.ssh-add.1; 这两个工具, 提供了一种将 SSH 秘钥加载到内存中以便使用, 而不必每次都输入通行字的方法。 &man.ssh-agent.1; 工具能够使用加载到其中的私钥来处理验证过程。 &man.ssh-agent.1; 应被用于启动另一个应用程序。 最基本的用法是, 使用它来启动 shell, 而高级一些的用法则是用它来启动窗口管理器。 要在 shell 中使用 &man.ssh-agent.1;, 首先应把 shell 作为参数来启动它。 随后, 应通过 &man.ssh-add.1; 并输入通行字, 来向它提供身份验证信息。 一旦这些步骤都做完了, 用户就应该能够 &man.ssh.1; 到任何一个安装了对应公钥的机器了。 例如: &prompt.user; ssh-agent csh &prompt.user; ssh-add Enter passphrase for /home/user/.ssh/id_dsa: Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa) &prompt.user; 要在 X11 中使用 &man.ssh-agent.1;, 调用 &man.ssh-agent.1; 的过程应置于 ~/.xinitrc 之中。 这将把 &man.ssh-agent.1; 服务提供给所有在 X11 中运行的程序。 下面是一个 ~/.xinitrc 文件的实例: exec ssh-agent startxfce4 这将启动 &man.ssh-agent.1;, 而后者将在每次 X11 启动时运行 XFCE。 作完这些之后就可以重启 X11 以便使修改生效。 随后您就可以运行 &man.ssh-add.1; 来加载全部 SSH 密钥了。 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 端口, 从而绕过防火墙。 允许用户登录 <varname>AllowUsers</varname> 选项 通常限制哪些用户能够登录, 以及从何处登录会是好主意。 采用 AllowUsers 选项能够方便地达到这一目的。 例如, 想要只允许 root 用户从 192.168.1.32 登录, 就可以在 /etc/ssh/sshd_config 文件中加入下述设置: AllowUsers root@192.168.1.32 要允许用户 admin 从任何地方登录, 则只需列出用户名: AllowUsers admin 可以在同一行指定多个用户, 例如: AllowUsers root@192.168.1.32 admin 列出需要登录机器的用户很重要; 否则他们将被锁在外面。 在完成对 /etc/ssh/sshd_config 的修改之后您必须告诉 &man.sshd.8; 重新加载其配置文件, 方法是执行: &prompt.root; /etc/rc.d/sshd reload 进一步的资料 OpenSSH &man.ssh.1; &man.scp.1; &man.ssh-keygen.1; &man.ssh-agent.1; &man.ssh-add.1; &man.ssh.config.5; &man.sshd.8; &man.sftp-server.8; &man.sshd.config.5; Tom Rhodes 作者 ACL 文件系统访问控制表 与文件系统在其他方面的加强, 如快照等一道, &os; 5.0 及更高版本提供了通过文件系统访问控制表 (ACL) 实现的安全机制。 访问控制表以高度兼容 (&posix;.1e) 的方式扩展了标准的 &unix; 权限模型。 这一特性使得管理员能够利用其优势设计更为复杂的安全模型。 如果想为 UFS 文件系统启用 ACL 支持, 则需要添加下列选项: options UFS_ACL 并重新编译内核。 如果没有将这个选项编译进内核, 则在挂接支持 ACL 的文件系统时将会收到警告。 这个选项在 GENERIC 内核中已经包含了。 ACL 依赖于在文件系统上启用扩展属性。 在新一代的 &unix; 文件系统, UFS2 中内建了这种支持。 UFS1 上配置扩展属性需要比 UFS2 更多的管理开销。 而且, 在 UFS2 上的扩展属性的性能也有极大的提高。 因此, 如果想要使用访问控制表, 推荐使用 UFS2 而不是 UFS1 ACL 可以在挂接时通过选项 来启动, 它可以加入 /etc/fstab。 另外, 也可以通过使用 &man.tunefs.8; 修改超级块中的 ACL 标记来持久性地设置自动的挂接属性。 一般而言, 后一种方法是推荐的做法, 其原因是: 挂接时的 ACL 标记无法被重挂接 (&man.mount.8; ) 改变, 只有完整地 &man.umount.8; 并做一次新的 &man.mount.8; 才能改变它。 这意味着 ACL 状态在系统启动之后就不可能在 root 文件系统上发生变化了。 另外也没有办法改变正在使用的文件系统的这个状态。 在超级块中的设置将使得文件系统总被以启用 ACL 的方式挂接, 即使在 fstab 中的对应项目没有作设置, 或设备顺序发生变化时也是如此。 这避免了不慎将文件系统以没有启用 ACL 的状态挂接, 从而避免没有强制 ACL 这样的安全问题。 可以修改 ACL 行为, 以允许在没有执行一次全新的 &man.mount.8; 的情况下启用它, 但我们认为, 不鼓励在未启用 ACL 时这么做是有必要的, 因为如果启用了 ACL, 然后关掉它, 然后在没有刷新扩展属性的情况下重新启用它是很容易造成问题的。 一般而言, 一旦启用了文件系统的 ACL 就不应该再关掉它, 因为此时的文件系统的保护措施可能和用户所期待的样子不再兼容, 而重新启用 ACL 将重新把先前的 ACL 附着到文件上, 而由于它们的权限发生了变化, 就很可能造成无法预期的行为。 在查看目录时, 启用了 ACL 的文件将在通常的属性后面显示 + (加号)。 例如: 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 这里我们看到了 directory1directory2, 以及 directory3 目录使用了 ACL。 而 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 Contributed by Portaudit 监视第三方安全问题 过去几年中, 安全领域在如何处理漏洞的评估方面取得了长足的进步。 几乎每一个操作系统都越来越多地安装和配置了第三方工具, 而系统被入侵的威胁也随之增加。 漏洞的评估是安全的一个关键因素, 尽管 &os; 会发布基本系统的安全公告, 然而为每一个第三方工具都发布安全公告则超出了 &os; Project 的能力。 在这一前提下, 一种减轻第三方漏洞的威胁, 并警告管理员存在已知的安全问题的方法也就应运而生。 名为 Portaudit 的 &os; 附加工具能够帮助您达成这一目的。 ports-mgmt/portaudit port 会下载一个数据库, 这一数据库是由 &os; Security Team 和 ports 开发人员维护的, 其中包含了已知的安全问题。 要开始使用 Portaudit, 需要首先从 Ports Collection 安装它: &prompt.root; cd /usr/ports/ports-mgmt/portaudit && make install clean 在安装过程中, &man.periodic.8; 的配置文件将被修改, 以便让 Portaudit 能够在每天的安全审计过程中运行。 一定要保证发到 root 帐号的每日安全审计邮件确实有人在读。 除此之外不需要进行更多的配置了。 安装完成之后, 管理员可以通过下面的命令来更新数据库, 并查看目前安装的软件包中所存在的已知安全漏洞: &prompt.root; portaudit -Fda 由于每天执行 &man.periodic.8; 时都会自动更新数据库, 因此, 运行这条命令是可选的。 在这里只是作为例子给出。 在任何时候, 如果希望对通过 Ports Collection 安装的第三方软件工具进行审计, 管理员都可以使用下面的命令: &prompt.root; portaudit -a 针对存在漏洞的软件包, Portaudit 将生成类似下面的输出: Affected package: cups-base-1.1.22.0_1 Type of problem: cups-base -- HPGL buffer overflow vulnerability. Reference: <http://www.FreeBSD.org/ports/portaudit/40a3bca2-6809-11d9-a9e7-0001020eed82.html> 1 problem(s) in your installed packages found. You are advised to update or deinstall the affected package(s) immediately. 通过访问上面给出的 URL, 管理员能够了解关于那个漏洞的进一步信息。 这些信息通常包括受到影响的 &os; Port 版本, 以及其他可能包含安全公告的网站。 简而言之, Portaudit 是一个强大的工具, 并能够配合 Portupgrade port 来非常有效地工作。 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) CVE Name: CVE-XXXX-XXXX 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; 的那些版本存在这个漏洞。 + The Affects(影响范围) 一栏给出了 &os; 的哪些版本存在这个漏洞。 对于内核来说, 检视受影响的文件上执行的 ident 输出可以帮助确认文件版本。 对于 ports, 版本号在 /var/db/pkg 里面的 port 的名字后面列出。 如果系统没有与 &os; CVS 代码库同步并每日构建, 它很可能是有问题的。 Corrected(修正时间) 一栏给出了发行版本中修正问题的具体日期、时间和时差。 在公共漏洞数据库 (Common Vulnerabilities Database) 系统中预留的, 用于查看漏洞的标识信息。 Background(技术背景) 一栏提供了受影响的组件的作用。 多数时候这一部分会说明为什么 &os; 中包含了它, 它的作用, 以及它的一些原理。 Problem Description(问题描述) 一栏深入阐述安全漏洞的技术细节。 这部分有时会包括有问题的代码相关的详细情况, 甚至是这个部件如何能够被恶意利用并打开漏洞的细节。 Impact(影响) 一栏描述了问题能够造成的影响类型。 例如, 可能导致拒绝服务攻击, 权限提升, 甚至导致得到超级用户的权限。 Workaround(应急方案) 一栏给出了系统管理员在暂时无法升级系统时可以采取的临时性对策。 这些原因可能包括时间限制, 网络资源的限制, 或其它因素。 不过无论如何, 安全不能够被轻视, 有问题的系统要么应该打补丁, 要么应该实施这种应急方案。 Solution(解决方案) 一栏提供了如何给有问题的系统打补丁的方法。 这是经过逐步测试和验证过的给系统打补丁并让其安全地工作的方法。 =Correction Details(修正细节) 一栏展示了针对 CVS 分支或某个发行版的修正特征。 同时也提供了每个分支上相关文件的版本号。 References(文献) 一栏通常会给出其它信息的来源。 这可能包括 URL, 书籍、 邮件列表以及新闻组。 Tom Rhodes Contributed by 进程记帐 进程记帐 进程记帐是一种管理员可以使用的跟踪系统资源使用情况的手段, 包括它们分配给了哪些用户、 提供系统监视手段, 并且可以精细到用户执行的每一个命令。 当然, 这种做法是兼有利弊的。 它的好处是, 查找入侵时可以迅速把范围缩小到攻击者进入的时刻; 而这样做的缺点, 则是记帐会产生大量的日志, 因而需要很多磁盘空间来存储它们。 这一节将带领管理员一步一步地配置基本的进程记帐。 启用并利用进程记帐 在使用进程记帐之前, 必须先启用它。 要完成这项工作, 需要运行下面的命令: &prompt.root; touch /var/account/acct &prompt.root; accton /var/account/acct &prompt.root; echo 'accounting_enable="YES"' >> /etc/rc.conf 一旦启用之后, 记帐就会开始跟踪 CPU 统计数据、 命令, 等等。 所有的记帐日志不是以可读的方式记录的, 要查看它们, 需要使用 &man.sa.8; 这个工具。 如果没有给出其他参数, 则 sa 将按用户, 以分钟为单位显示他们所使用的时间、 总共的 CPU 和用户时间, 以及平均的 I/O 操作数目, 等等。 要显示关于刚刚发出的命令的相关信息, 则应使用 &man.lastcomm.1; 工具。 lastcomm 可以用来显示在某一 &man.ttys.5; 上的用户信息, 例如: &prompt.root; lastcomm ls trhodes ttyp1 将会显示出所有已知的 trhodes 在 ttyp1 终端上执行 ls 的情况。 更多的可用选项在联机手册 &man.lastcomm.1;、 &man.acct.5; 和 &man.sa.8; 中有所介绍。
diff --git a/zh_CN.GB2312/books/handbook/virtualization/chapter.sgml b/zh_CN.GB2312/books/handbook/virtualization/chapter.sgml index 7f06e64737..c79eb14745 100644 --- a/zh_CN.GB2312/books/handbook/virtualization/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/virtualization/chapter.sgml @@ -1,533 +1,717 @@ Murray Stokely 原作 虚拟化 概述 虚拟化软件能够让同一台机器上同时运行多个操作系统。 在 PC 上, 这种系统通常由一个运行虚拟化软件的宿主操作系统, 以及一系列客户操作系统组成。 读完这章, 您将了解: 宿主操作系统与客户操作系统的区别。 + + 如何在采用 &intel; 处理器的 &apple; &macintosh; + 计算机上安装 FreeBSD。 + + 如何在包含 &xen; 的 Linux 上安装 FreeBSD。 - 如何在采用 &intel; 处理器的 &apple; &macintosh; - 计算机上安装 FreeBSD。 + 如何在 µsoft.windows; 以 + Virtual PC 安装 FreeBSD。 如何为虚拟化对 FreeBSD 系统进行性能调优。 - 在阅读这章之前, 您应: 理解 &unix; 和 FreeBSD 的基础知识 ()。 了解如何安装 FreeBSD ()。 了解如何配置网络连接 ()。 了解如何安装第三方软件 (). 作为客户 OS 的 FreeBSD MacOS 上的 Parallels 为 &mac; 设计的 Parallels Desktop 是一种可用于采用 &intel; 处理器, 并运行 &macos; 10.4.6 或更高版本的 &apple; &mac; 计算机的商业软件。 在 &macos; X 上安装了这个软件之后, 用户需要配置虚拟机并安装所需的客户操作系统。 在 Parallels/&macos; X 上安装 FreeBSD 在 &macos; X/Parallels 上安装 FreeBSD 的第一步是创建一个新的虚拟机。 在系统提示选择客户 OS 类型 (Guest OS Type) 时选择 FreeBSD, 并根据您使用 FreeBSD 虚拟实例的需要分配磁盘和内存: 对多数在 Parallels 上使用 FreeBSD 的情形而言, 4GB 磁盘空间和 512MB 的 RAM 就够用了: 在创建了 FreeBSD 虚拟机之后, 还需要在其中安装 FreeBSD。 最好的做法是使用官方的 FreeBSD CDROM 或从官方 FTP 站点下载的 ISO 镜像来完成这个任务。 如果您的本地 &mac; 文件系统中有 ISO 映像文件, 或您的 &mac; 的 CD 驱动器中有 CDROM, 就可以在 FreeBSD Parallels 窗口的右下角点击光盘图标。 之后, 系统将给出一个窗口, 供您完成将虚拟机中的 CDROM 驱动器连接到本地的 ISO 文件或真正的 CDROM 驱动器上。 在完成了将 CDROM 与您的安装源完成关联之后, 就可以按重启 (reboot) 图标来重启 FreeBSD 虚拟机了。 Parallels 将配合一个特殊的 BIOS 启动, 后者能够像普通的 BIOS 一样检查系统中是否有 CDROM 驱动器。 此时, 它就能够找到 FreeBSD 安装介质并开始 中所介绍的标准的基于 sysinstall 安装的过程。 此时您可以安装 X11, 但暂时不要对它进行配置。 在完成安装之后, 重启并进入新安装的 FreeBSD 虚拟机。 在 &macos; X/Parallels 上配置 FreeBSD 在您将 FreeBSD 安装到 &macos; X 的 Parallels 上之后, 还需要进行一系列的配置, 以便为系统的虚拟化操作进行优化。 配置引导加载器变量 最重要的一步是通过调低 变量来降低 Parallels 环境中的 FreeBSD 对 CPU 的使用。 这可以通过在 /boot/loader.conf 中增加下述配置来完成: kern.hz=100 如果不使用这个配置, 闲置的 FreeBSD Parallels 客户 OS 会在单处理器的 &imac; 上使用大约 15% 的 CPU。 如此修改之后, 空闲时的使用量就减少到大约 5% 了。 创建新的内核配置文件 您可以删去全部 SCSI、 FireWire, 以及 USB 设备驱动程序。 Parallels 提供了一个由 &man.ed.4; 驱动的虚拟网卡, 因此, 除了 &man.ed.4; 和 &man.miibus.4; 之外的其他网络接口驱动都可以从内核中删去。 配置网络 最基本的网络配置, 是通过使用 DHCP 来将您的虚拟机与宿主 &mac; 接入同一个局域网。 这可以通过在 /etc/rc.conf 中加入 ifconfig_ed0="DHCP" 来完成。 更高级一些的网络配置方法, 请参见 中的介绍。 福康 陈 (Loader) 原作 在 Linux 上通过 &xen; 运行 FreeBSD &xen; hypervisor 是一个开放源代码的并行虚拟化产品, 并由商业的 XenSource 公司提供支持。 在这种系统中, 客户操作系统称为 domU 域, 而宿主系统则称为 dom0。 在 Linux 上运行 FreeBSD 虚拟机实例的第一步, 是安装用于 Linux dom0 的 &xen;。 在这个例子中, 宿主系统采用的发行版本是 Slackware Linux。 在 Linux dom0 上安装 &xen; 3 从 XenSource 下载 &xen; 3.0 下载 xen-3.0.4_1-src.tgz 解压缩源代码包 &prompt.root; cd xen-3.0.4_1-src &prompt.root; KERNELS="linux-2.6-xen0 linux-2.6-xenU" make world &prompt.root; make install 为 dom0 重新编译内核: &prompt.root; cd xen-3.0.4_1-src/linux-2.6.16.33-xen0 &prompt.root; make menuconfig &prompt.root; make &prompt.root; make install 对于较早版本的 &xen;, 可能需要指定 make ARCH=xen menuconfig 在 Grub 的 menu.lst 中增加一个对应的菜单项 编辑 /boot/grub/menu.lst 并在其中增加下列配置: title Xen-3.0.4 root (hd0,0) kernel /boot/xen-3.0.4-1.gz dom0_mem=262144 module /boot/vmlinuz-2.6.16.33-xen0 root=/dev/hda1 ro 重新启动计算机并进入 &xen; 首先, 编辑 /etc/xen/xend-config.sxp, 并在其中增加下列配置: (network-script 'network-bridge netdev=eth0') 接下来就可以运行 &xen; 了: &prompt.root; /etc/init.d/xend start &prompt.root; /etc/init.d/xendomains start 现在 dom0 已经开始运行: &prompt.root; xm list Name ID Mem VCPUs State Time(s) Domain-0 0 256 1 r----- 54452.9 FreeBSD 7-CURRENT domU http://www.fsmware.com/ 下载用于 &xen; 3.0 的 FreeBSD domU 内核。 kernel-current mdroot-7.0.bz2 xmexample1.bsd 将配置文件 xmexample1.bsd 放到 /etc/xen/ 并修改与内核及磁盘映像位置有关的配置项。 下面是一个示范的例子: kernel = "/opt/kernel-current" memory = 256 name = "freebsd" vif = [ '' ] disk = [ 'file:/opt/mdroot-7.0,hda1,w' ] #on_crash = 'preserve' extra = "boot_verbose" extra += ",boot_single" extra += ",kern.hz=100" extra += ",vfs.root.mountfrom=ufs:/dev/xbd769a" 其中, mdroot-7.0.bz2 应是未压缩的。 接下来, 您需要修改 kernel-current 中的 __xen_guest 小节, 并加入 &xen; 3.0.3 所需要的 VIRT_BASE: &prompt.root; objcopy kernel-current -R __xen_guest &prompt.root; perl -e 'print "LOADER=generic,GUEST_OS=freebsd,GUEST_VER=7.0,XEN_VER=xen-3.0,BSD_SYMTAB,VIRT_BASE=0xC0000000\x00"' > tmp &prompt.root; objcopy kernel-current --add-section __xen_guest=tmp &prompt.root; objdump -j __xen_guest -s kernel-current kernel-current: file format elf32-i386 Contents of section __xen_guest: 0000 4c4f4144 45523d67 656e6572 69632c47 LOADER=generic,G 0010 55455354 5f4f533d 66726565 6273642c UEST_OS=freebsd, 0020 47554553 545f5645 523d372e 302c5845 GUEST_VER=7.0,XE 0030 4e5f5645 523d7865 6e2d332e 302c4253 N_VER=xen-3.0,BS 0040 445f5359 4d544142 2c564952 545f4241 D_SYMTAB,VIRT_BA 0050 53453d30 78433030 30303030 3000 SE=0xC0000000. 现在可以创建并运行 domU 了: &prompt.root; xm create /etc/xen/xmexample1.bsd -c Using config file "/etc/xen/xmexample1.bsd". Started domain freebsd WARNING: loader(8) metadata is missing! Copyright (c) 1992-2006 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. FreeBSD 7.0-CURRENT #113: Wed Jan 4 06:25:43 UTC 2006 kmacy@freebsd7.gateway.2wire.net:/usr/home/kmacy/p4/freebsd7_xen3/src/sys/i386-xen/compile/XENCONF WARNING: DIAGNOSTIC option enabled, expect reduced performance. Xen reported: 1796.927 MHz processor. Timecounter "ixen" frequency 1796927000 Hz quality 0 CPU: Intel(R) Pentium(R) 4 CPU 1.80GHz (1796.93-MHz 686-class CPU) Origin = "GenuineIntel" Id = 0xf29 Stepping = 9 Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH, DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE> Features2=0x4400<CNTX-ID,<b14>> real memory = 265244672 (252 MB) avail memory = 255963136 (244 MB) xc0: <Xen Console> on motherboard cpu0 on motherboard Timecounters tick every 10.000 msec [XEN] Initialising virtual ethernet driver. xn0: Ethernet address: 00:16:3e:6b:de:3a [XEN] Trying to mount root from ufs:/dev/xbd769a WARNING: / was not properly dismounted Loading configuration files. No suitable dump device was found. Entropy harvesting: interrupts ethernet point_to_point kickstart. Starting file system checks: /dev/xbd769a: 18859 files, 140370 used, 113473 free (10769 frags, 12838 blocks, 4.2% fragmentation) Setting hostname: demo.freebsd.org. lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2 inet 127.0.0.1 netmask 0xff000000 Additional routing options:. Mounting NFS file systems:. Starting syslogd. /etc/rc: WARNING: Dump device does not exist. Savecore not run. ELF ldconfig path: /lib /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 usbd. usb: Kernel module not available: No such file or directory Starting local daemons:. Updating motd. Starting sshd. Initial i386 initialization:. Additional ABI support: linux. Starting cron. Local package initialization:. Additional TCP options:. Starting background file system checks in 60 seconds. Sun Apr 1 02:11:43 UTC 2007 FreeBSD/i386 (demo.freebsd.org) (xc0) login: 现在 domU 应该能运行 &os; 7.0-CURRENT 内核了: &prompt.root; uname -a FreeBSD demo.freebsd.org 7.0-CURRENT FreeBSD 7.0-CURRENT #113: Wed Jan 4 06:25:43 UTC 2006 kmacy@freebsd7.gateway.2wire.net:/usr/home/kmacy/p4/freebsd7_xen3/src/sys/i386-xen/compile/XENCONF i386 接下来可以在 domU 中配置网络了。 &os; domU 会使用一种称做 xn0 的专用网络接口: &prompt.root; ifconfig xn0 10.10.10.200 netmask 255.0.0.0 &prompt.root; ifconfig xn0: flags=843<UP,BROADCAST,RUNNING,SIMPLEX> mtu 1500 inet 10.10.10.200 netmask 0xff000000 broadcast 10.255.255.255 ether 00:16:3e:6b:de:3a lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2 inet 127.0.0.1 netmask 0xff000000 在 dom0 Slackware 上 会出现一些 &xen; 专用的网络接口: &prompt.root; ifconfig eth0 Link encap:Ethernet HWaddr 00:07:E9:A0:02:C2 inet addr:10.10.10.130 Bcast:0.0.0.0 Mask:255.0.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:815 errors:0 dropped:0 overruns:0 frame:0 TX packets:1400 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:204857 (200.0 KiB) TX bytes:129915 (126.8 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:99 errors:0 dropped:0 overruns:0 frame:0 TX packets:99 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:9744 (9.5 KiB) TX bytes:9744 (9.5 KiB) peth0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF UP BROADCAST RUNNING NOARP MTU:1500 Metric:1 RX packets:1853349 errors:0 dropped:0 overruns:0 frame:0 TX packets:952923 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2432115831 (2.2 GiB) TX bytes:86528526 (82.5 MiB) Base address:0xc000 Memory:ef020000-ef040000 vif0.1 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF UP BROADCAST RUNNING NOARP MTU:1500 Metric:1 RX packets:1400 errors:0 dropped:0 overruns:0 frame:0 TX packets:815 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:129915 (126.8 KiB) TX bytes:204857 (200.0 KiB) vif1.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF UP BROADCAST RUNNING NOARP MTU:1500 Metric:1 RX packets:3 errors:0 dropped:0 overruns:0 frame:0 TX packets:2 errors:0 dropped:157 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:140 (140.0 b) TX bytes:158 (158.0 b) xenbr1 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF UP BROADCAST RUNNING NOARP MTU:1500 Metric:1 RX packets:4 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:112 (112.0 b) TX bytes:0 (0.0 b) &prompt.root; brctl show bridge name bridge id STP enabled interfaces xenbr1 8000.feffffffffff no vif0.1 peth0 vif1.0 + + &windows; 上的 Virtual PC + + Virtual PC 是 µsoft; + 上的 &windows; 软件产品, 可以免费下载使用。 相关系统要求,请参阅 + system requirements 说明。 + 在 µsoft.windows; 装完 Virtual PC + 之后, 必须针对所安装的虚拟机器来做相应设定。 + + + 在 Virtual PC/µsoft.windows; 上安装 FreeBSD + + 在 µsoft.windows;/Virtual PC + 上安装 FreeBSD 的第一步是新增虚拟器。 如下所示,在提示向导中请选择 + Create a virtual machine + + + + + + + + + + + + + + 然后在 Operating system + 处选 Other + + + + + + + + 并依据自身需求来规划硬盘容量和内存的分配。对大多数在 + Virtual PC 使用 FreeBSD + 的情况而言, 大约 4GB 的硬盘空间以及 512MB 的内存就够用了。 + + + + + + + + + + + + + + 保存并完成配置: + + + + + + + + 接下来选择新建的 FreeBSD 虚拟机器,并单击 + Settings, 以设定网络种类以及网卡: + + + + + + + + + + + + + + 在新建 FreeBSD 虚拟机器以后, 就可以继续以其安装 + FreeBSD。 安装方面, 比较好的作法是使用官方的 FreeBSD + 光盘或从官方 FTP 站下载 ISO 镜像。 若您的 &windows; 系统 + 内已有该 ISO 镜像, 那么就可以在 FreeBSD 虚拟机器上连按两下, + 以开始启动。 接着在 Virtual PC + 窗口内按 CD 再按 + Capture ISO Image...。 接着出现一个对话框, + 可以把虚拟机器内的光驱设定到该 ISO 镜像, 或者是真实的光驱。 + + + + + + + + + + + + + + 设好光盘来源之后,就可以重新开机, 也就是先按 + Action 再按 Reset 即可。 + Virtual PC 会以特殊 BIOS 开机, + 并与普通 BIOS 一样会先检查是否有光盘驱动器。 + + + + + + + + 此时, 它会找到 FreeBSD 安装光盘, 并开始在 + 内所介绍的 + sysinstall 安装过程。 + 这时候也可以顺便安装 X11, 但不要进行相关设定。 + + + + + + + + 完成安装之后, 记得把安装光盘或者 ISO 镜像退出。 + 最后, 把装好的 FreeBSD 虚拟机器重新开机即可。 + + + + + + + + + + 调整 µsoft.windows;/Virtual PC 上的 FreeBSD + + 在 µsoft.windows; 上以 Virtual PC + 装好 FreeBSD 后, 还需要做一些设定步骤, + 以便将虚拟机内的 FreeBSD 最佳化。 + + + + 设定 boot loader 参数 + + 最重要的步骤乃是藉由调降 + 来降低 Virtual PC 环境内 + FreeBSD 的 CPU 占用率。 在 + /boot/loader.conf + 内加上下列设定即可: + + kern.hz=100 + + 若不作这设定, 那么光是 idle 状态的 FreeBSD + Virtual PC guest OS + 就会在单一处理器的电脑上大约有 40% 的 CPU 占用率。 + 作了上述修改之后, 占用率大约会降至 3%。 + + + + 建立一个新的内核配置文件 + + 可以放心把所有的 SCSI, FireWire 和 USB + 设备驱动都移除。 Virtual PC + 有提供 &man.de.4; 的虚拟网卡, 因此除了 + &man.de.4; 以及 &man.miibus.4; + 以外其他的网卡也都可以从内核的配置文件中移除。 + + + + 设定网络 + + 可以给虚拟机器简单得使用 DHCP 来设定与 + host (µsoft.windows;) 相同的本地网络环境, + 只要在 /etc/rc.conf + 加上 ifconfig_de0="DHCP" + 即可完成。 其他的高级网络设置, 可参阅 + . + + + + + + + 运行于 &windows;/&mac;/&linux; 的 VMware 本节尚未开始撰写。 作为宿主 OS 的 FreeBSD 目前, 还没有任何一种虚拟化软件包官方支持 FreeBSD 作为宿主操作系统, 但很多人使用较早版本的 VMware 提供的这项能力。 目前, 已经有人在为让 &xen; 能够在 FreeBSD 上作为宿主环境而进行相关的开发工作。 diff --git a/zh_CN.GB2312/share/sgml/trademarks.ent b/zh_CN.GB2312/share/sgml/trademarks.ent index b8498ffab3..7b0c2ac0a9 100644 --- a/zh_CN.GB2312/share/sgml/trademarks.ent +++ b/zh_CN.GB2312/share/sgml/trademarks.ent @@ -1,354 +1,362 @@ 3Com 和 HomeConnect 是 3Com Corporation 的注册商标。"> 3Com"> 3ware 和 Escalade 是 3ware Inc 的注册商标。"> 3ware"> Escalade"> Adaptec 是 Adaptec, Inc. 的注册商标。"> Adaptec"> Adobe, Acrobat, Acrobat Reader, 以及 PostScript 是 Adobe Systems Incorporated 在美国和/或其他国家的商标或注册商标。"> Acrobat"> Acrobat Reader"> Adobe"> PostScript"> AMD, Am486, Am5X86, AMD Athlon, AMD Duron, AMD Opteron, AMD-K6, Athlon, Élan, Opteron, 和 PCnet 是 Advanced Micro Devices, Inc. 的商标。"> Am486"> Am5x86"> AMD Athlon"> AMD Duron"> AMD-K6"> AMD Opteron"> AMD Sempron"> AMD Turion"> Athlon"> Élan"> Opteron"> Apple, AirPort, FireWire, Mac, Macintosh, Mac OS, Quicktime, 以及 TrueType 是 Apple Computer, Inc. 在美国以及其他国家的注册商标。"> AirPort"> Apple"> FireWire"> iMac"> Mac"> Macintosh"> Mac OS"> Quicktime"> TrueType"> ARM 是 ARM Limited. 的注册商标。"> ARM"> The Bluetooth 文字标志属于 Bluetooth SIG, Inc."> Bluetooth"> Broadcom 是 Broadcom Corporation 和/或其子公司的注册商标。"> Broadcom"> Check Point, Firewall-1, 以及 VPN-1 是 Check Point Software Technologies Ltd. 的商标。"> Cisco, Catalyst, 和 IOS 是 Cisco Systems, Inc. 和/或其附属机构在美国和一些其他国家的注册商标。"> Catalyst"> IOS"> Corel 和 WordPerfect 是 Corel Corporation 和/或其子公司 在加拿大、美国和/或其他国家的注册商标。"> WordPerfect"> + +Coverity 是一个注册商标; +Coverity Extend, Coverity Prevent 和 Coverity Prevent SQS 是 Coverity 公司的注册商标。"> +Coverity"> +Coverity Prevent"> + Sound Blaster 是 Creative Technology Ltd. 在美国和/或其他国家的注册商标。"> SoundBlaster"> CVSup 是 John D. Polstra 的注册商标。"> Dell, Dell Precision, Latitude, Optiplex, PowerEdge 是 Dell Computer Corporation 的商标或注册商标。"> Dell"> PowerEdge"> EPSON, EPSON Perfection 是 Epson Corporation的注册商标。"> EPSON"> EPSON Perfection"> FreeBSD 是 FreeBSD基金会的注册商标"> Heidelberg、 Helvetica、 Palatino 以及 Times Roman 是 Heidelberger Druckmaschinen AG 在美国和其他国家的商标或注册商标。"> IBM、 AIX、 EtherJet、 Netfinity、 OS/2、 PowerPC、 PS/2、 S/390 以及 ThinkPad 是国际商用机器公司在美国和其他国家的注册商标或商标。"> AIX"> EtherJet"> Netfinity"> OS/2"> PowerPC"> PS/2"> S/390"> ThinkPad"> IEEE, POSIX, 和 802 是 Institute of Electrical and Electronics Engineers, Inc. 在美国的注册商标。"> POSIX"> + Intel, Celeron, EtherExpress, i386, i486, Itanium, Pentium, 和 Xeon 是 Intel Corporation 及其分支机构在美国和其他国家的商标或注册商标。"> Celeron"> EtherExpress"> i386"> i486"> Intel"> Itanium"> Pentium"> Xeon"> +Core"> Intuit 和 Quicken 是 Intuit Inc., 或其子公司在美国和其他国家的商标或注册商标。"> Iomega, Zip, 和 Jaz 是 Iomega Corporation 在美国和/或其他国家的商标或注册商标。"> Zip"> Jaz"> Lantronix 和 EasyIO 是 Lantronix Corporation 的商标。"> EasyIO"> Linux 是 Linus Torvalds 的注册商标。"> Linux"> LSI Logic, AcceleRAID, eXtremeRAID, MegaRAID 和 Mylex 是 LSI Logic Corp 的商标或注册商标。"> AcceleRAID"> MegaRAID"> Mylex"> Macromedia, Flash, 以及 Shockwave Macromedia, Inc. 在美国和/或其他国家的商标或注册商标。"> Flash"> Macromedia"> Shockwave"> Microsoft, IntelliMouse, MS-DOS, Outlook, Windows, Windows Media, 和 Windows NT 是 Microsoft Corporation 在美国和/或其他国家的商标或注册商标。"> IntelliMouse"> Microsoft"> MS-DOS"> Outlook"> Windows"> Windows Media"> Windows NT"> MIPS 和 R4000 是 MIPS Technologies, Inc. 在美国以及其他国家的注册商标。"> MIPS"> MySQL 是 MySQL AB 在美国、欧盟和其他国家的注册商标。"> MySQL"> M-Systems 和 DiskOnChip 是 M-Systems Flash Disk Pioneers, Ltd. 的商标或注册商标。"> DiskOnChip"> NetBSD是 NetBSD Foundation的注册商标。"> Netscape 以及 Netscape Navigator 是 Netscape Communications Corporation 在美国和其他国家的注册商标。"> Netscape"> Netscape Navigator"> GateD 和 NextHop 是 NextHop 在美国和其他国家的商标或注册商标。"> GateD"> NetWare, NetWare Loadable Module, 和 NLM 是 Novell, Inc. 在美国和其他国家的商标或注册商标。"> Motif, OSF/1, 和 UNIX 是 The Open Group 在美国和其他国家的注册商标; IT DialTone 和 The Open Group 是其商标。"> UNIX是 Open Group 在美国和其它国家的注册商标。"> Motif"> UNIX"> Oracle 是 Oracle Corporation 的注册商标。"> Oracle"> Parallels 是 Parallels Software International Inc. 的商标。"> PowerQuest 和 PartitionMagic 是 PowerQuest Corporation 在美国和/或其他国家的注册商标。"> PartitionMagic"> QUALCOMM 和 Eudora 是 QUALCOMM Incorporated 的注册商标。"> Eudora"> RealNetworks, RealPlayer, 和 RealAudio 是 RealNetworks, Inc. 的注册商标。"> RealPlayer"> Red Hat, RPM, 是 Red Hat, Inc. 在美国和其他国家的注册商标。"> SAP, R/3, 和 mySAP 是 SAP AG 在德国以及许多其他国家的商标或注册商标。"> R/3"> SAP"> Silicon Graphics, SGI, 和 OpenGL 是 Silicon Graphics, Inc. 在美国和/或其他国家的注册商标。"> OpenGL"> Slackware 是 Patrick Volkerding 及 Slackware Linux, Inc. 的注册商标。"> Sparc, Sparc64, SPARCEngine, 以及 UltraSPARC 是 SPARC International, Inc 在美国和其他国家的商标。 包含 SPARC 商标的产品基于 Sun Microsystems, Inc. 开发的架构。"> Sparc"> Sparc64"> SPARCEngine"> UltraSPARC"> Sun、 Sun Microsystems、 Java、 Java Virtual Machine、 JavaServer Pages、 JDK、 JRE、 JSP、 JVM、 Netra、 Solaris、 StarOffice、 Sun Blade、 Sun Enterprise、 Sun Fire、 SunOS 以及 Ultra 是 Sun Microsystems, Inc. 在美国和其他国家的商标或注册商标。"> Java"> Java Virtual Machine"> JavaServer Pages"> JDK"> JRE"> JSP"> JVM"> Netra"> Solaris"> StarOffice"> Sun"> Sun Blade"> Sun Enterprise"> Sun Fire"> Ultra"> SunOS"> Symantec 和 Ghost 是 Symantec Corporation 在美国和其他国家的注册商标。"> MATLAB 是 The MathWorks, Inc. 的注册商标。"> MATLAB"> SpeedTouch 是 Thomson 的商标。"> SpeedTouch"> Transmeta 和 Crusoe 是 Transmeta Corporation 在美国和/或其他国家的商标或注册商标。"> Crusoe"> Transmeta"> U.S. Robotics 和 Sportster 是 U.S. Robotics Corporation 的注册商标。"> Sportster"> U.S. Robotics"> Waterloo Maple 和 Maple 是 Waterloo Maple Inc 的商标或注册商标"> Maple"> Mathematica 是 Wolfram Research, Inc 的注册商标。"> Mathematica"> VMware 是 VMware, Inc. 的商标"> Xen 是 XenSource, Inc. 在美国及其他国家的商标。"> Xen"> XFree86 是 The XFree86 Project, Inc 的商标。."> XFree86"> Ogg Vorbis 和 Xiph.Org 是 Xiph.Org 的商标。"> 许多制造商和经销商使用一些称为商标的图案或文字设计来彰显自己的产品。 本文档中出现的, 为 FreeBSD Project 所知晓的商标,后面将以 '™' 或 '®' 符号来标注。">