IT家园's Archiver

逍遥 发表于 2006-6-5 14:54

FreeBSD安装及教程

[size=6]FreeBSD教程 [/size]
  
  
[size=4]
序 第一章 FreeBSD 简介           《 二楼》
第二章 安装 FreeBSD                《三楼》
第三章 UNIX 系统入门              《四楼》
第四章 使用者管理                   《五楼》
第五章 网络设定                      《 六楼》
第六章 档案系统管理               《七楼》
第七章 系统安全                        《八楼》
第八章 编译核心                       《 九楼》
第九章 系统调校                       《十楼》
第十章 软件安装                      《十一楼》
第十一章 X Window 的使用     《十二楼》
第十二章 NAT 及防火墙          《十三楼》
第十三章 网页服务器              《十四楼》
第十四章 网页服务器进阶应用 《十五楼》
第十五章 FTP 服务器             《十六楼》
第十六章 邮件服务器           《十七楼》
第十七章 邮件服务器进阶应用 《十八楼》
第十八章 DHCP服务器           《十九楼》
第十九章 数据库系统           《二十楼》
第二十章 SAMBA 网络芳邻   《二十一楼》
第二十一章 NFS                     《二十二楼》
第二十二章 DNS 服务器        《二十三楼》
第二十三章 指令应用          《二十四楼》
第二十四章 Shell Script           《二十五楼》
附录 A /etc 目录下的档案介绍 《二十六楼》
附录B 制作 FreeBSD 安装光盘 《二十七楼》[/size]

逍遥 发表于 2006-6-5 14:55



近年来笔者在 FreeBSD 及 Linux 从事程序开发的工作,使用 FreeBSD 及 Linux 的经验也越来越多,对于 FreeBSD 系统的优越也越来越肯定。

笔者第一次接触 FreeBSD 是在刚进入大学时,由于对 UNIX 系统的兴趣,在网络上找了很多关于 UNIX 的介绍,最后在众多 UNIX-like 的系统中选择了 FreeBSD。当时我连 UNIX 最基本的指令都不会,在使用上也常遇到问题,但却不因此而放弃。

在遇到问题时,笔者第一步通常是到 BBS 上的 BSD 版上发问。在台湾有许多 FreeBSD 的使用者,他们都非常热心且乐意为新手解答。而现在,FreeBSD 在网络上的数据已经非常丰原富了,只要在搜寻引擎上输入您想查询的主题,一定能找到相关解答。

对于初学者而言,学习新的操作系统一定会遇到很多问题。但当这些困难获得解决时,就是一次新的成长。因此,当读者在使用 FreeBSD 遇到问题时,千万不因气馁,只要再加把劲,您也可以在 FreeBSD 世界中得心应手。

本书将带领读者从基本的系统使用、网络服务器架设、到深入系统管理所需的知识,并将笔者在管理公司及学校服务器的经验和读者分享,期望对有心学习 FreeBSD 的使用者有所助益。为了推广 FreeBSD,笔者也将本书全部内容放在网站上供大家参考,网址是 [url]http://www.twbsd.org[/url],本书的第二片光盘中亦包含了本书电子文件。提供电子文件的用意除了推广 FreeBSD 外,更希望有助于读者设定、操作、及使用。不过,请读者不要散布电子文件,若有需要,请上笔者网站上下载。

经过一年的漫长等待,FreeBSD 终于又释出最新的 6.0 版本了。FreeBSD 6.0 可以说是继 4.x 以后最稳定的分支。由于之前 FreeBSD 5.x 加入了许多新的功能,不论是稳定性或效能都比不上 4.x。然而 6.0 改善了 5.x 的稳定性,它可以说是 FreeBSD 近年来最重要的一次更新。因此,其释出的时间也一再延期,最主要的目的就是要提供使用者一套好用的操作系统。

感谢许多朋友对于笔者之前 FreeBSD 系列书籍的指正与厚爱,祈盼各界继续支持指教。

逍遥 发表于 2006-6-5 14:56

第一章 FreeBSD 简介
1.1 什么是FreeBSD?
我想大家都知道 Microsoft Windows 是一套操作系统,FreeBSD 也是一套操作系统。FreeBSD 是一个可以在 Intel 兼容个人计算机、DEC Alpha 或 PC98 架构的计算机上执行的 UNIX 操作系统。大家应该听过另一套UNIX的操作系统 Linux,FreeBSD 也是一套免费的操作系统。它可以让我们的个人计算机变成先进的工作站,更稳定的提供你所需的网络服务。
BSD UNIX 系统可以说是网络操作系统的始祖,FreeBSD 是众多 BSD UNIX 分支中的一个,它继承了 BSD 系统的高性能与可靠性。自从1993 年 FreeBSD 推出 1.0-RELEASE 以来,FreeBSD 开发团队便致力于系统的调校,使其发挥绝佳的效能。在 FreeBSD 团队的统筹努力下,使它比起其它免费的 UNIX 操作系统更有结构。在 FreeBSD 上有许多支持的免费软件,这些软件大都已移植收录于 FreeBSD ports 中,使得我们在安装软件时变得十分轻松。FreeBSD 支持 32 位、64 位的许多不同平台,具有高效能核心架构、动态函式库共享、绝佳的网络功能,比起其它商用 UNIX 系统毫不逊色。
FreeBSD 操作系统相当容易取得及安装,除了经由传统的光盘安装外,它也可以经由网络安装、MS-DOS 分割区安装等等。当然,我们也可以在计算机中同时安装多种不同的操作系统,例如 Windwos 98 和 FreeBSD 同时并存也是件十分容易的事。
在 FreeBSD 上的应用软件相当的多,也都可以免费取得,由于 FreeBSD 的稳定性高且功能强大,因此许多大型网站都以它为作业平台,其中最知名的就是 YAHOO!。YAHOO! 是一个流量相当大的入口网站,他们选择以 FreeBSD 为作业平台,由此可知 FreeBSD 的优异性。除此之外,在台湾,FreeBSD 普遍被应用于学术网络上,许多大专院校的服务器都是使用 FreeBSD 来提供网络服务。
但是您别以为 FreeBSD 只能用来做为网络服务器,FreeBSD 也可以是一个良好的个人操作系统。事实上,Mac OS X 就是使用 FreeBSD 做为系统核心。大家都知道 Mac OS 是个人计算机上有名的操作系统,它会使用 FreeBSD 做为系统核心,可见 FreeBSD 的品质亦深获 Apple 的肯定。
在宽频网络逐渐普及的台湾,每个人都可以自行架设一台网络服务器,以 FreeBSD 来提供网络服务(如网页、邮件、档案存取等)。值得一提的是 FreeBSD 并不像 MS-Windows 一样每每要求使用者升级计算机才能使用。FreeBSD 对于硬件的要求很低,你可以用一台 Intel 586-133MHz 的旧计算机来安装 FreeBSD,这也算是癈物利用吧。
1.2 为什么要选择FreeBSD?
现在的个人计算机操作系统市场中,是以 MS-Windows 独大,但在网络服务器市场中,UNIX 系统的使用率可不输 MS-Windows 喔。我个人认为 MS-Windows 之所以会有那么多的使用者主要是因为他的使用者接口对初学者而言较容易操作,再加上许多软件的配合及盗版的助长,安装软件只要一直按下一步就完成。使得使用者即便它的稳定性不高也得乖乖的接受。
其实初学者没有试过其它的操作系统才会有这样的误解,因为一直用 MS-Windows 才会认为当机是无可避免的事,当机对于 MS-Windows 或许是无可避免,但在其它 UNIX 系统中可不常见。在 UNIX 系列的操作系统中,也可以有像 MS-Windows 的图形接口,几乎所有在 MS-Windows 上可以做的事,在 FreeBSD 上都可以做得到,唯一的不同点是你不必花钱去取得你想要的功能。包括排版、图形处理、MP3、多媒体、网络芳邻等等都可以在 FreeBSD 中做到。
重点是,对于一台网络服务器而言,图形接口会占用系统资源,而且必须安装一堆有的没的软件。笔者偏好干干脆净净的系统,而 FreeBSD 正好具有这个优点。不过这并不代表您不能使用图形接口,您还是可以安装类似 Windows 的图形接口,让您使用它来做为平日使用的个人计算机。此外,FreeBSD 把自己定位为最佳的网络服务器,它承袭了 BSD 优良的网络血统,在提供服务时能有绝佳的效能表现。而且,它是免费的。
然而,有这么多的免费 UNIX 操作系统中,为什么要选择 FreeBSD 而不使用其它操作系统(如 Linux )呢?在网络上在讨论这个问题时,每每会引发每个操作系统使用者的激辩。对于要使用何种操作系统,除了使用者偏好外,还有许多指标可以提供我们参考。
FreeBSD 是一套完整的操作系统
我们平常所说的 Linux 指的是它的核心 (Kernel),Kernel 只是整个操作系统的一部份,除了 Kernel 外,我们还需要一些基本的指令、系统及目录架构、图形接口等。Linux 的 Distribution 就是各个不同的组织或公司自行收集一些系统必备的程序,制作出一个操作系统。Linux 系统有很多的 Distribution,如 Redhat、SUSE、Debian 等。因为每个 Distribution 都有自己的程序或架构,所以每个 Distribution 都长的不一样。如果您使用的是 Linux,在 Linux 三十多种 Distribution 中,每一种之间都有些许差异,在设定上用法都不同。
而 FreeBSD 指的不只是核心而已,它是一套完整的操作系统。从系统核心到使用者接口、各种常用指令都是由 FreeBSD 总部所统一推出。因此,FreeBSD 每一个版本之间有着共同的架构,不同软件之间的整合搭配性较为完整,不管是设定、学习都很容易。
由核心团队统筹开发
FreeBSD 整个系统都是由总部的核心团队所维护,所以整个系统都搭配得很好。而 Linux 只有 Kernel 由 Linus Torvlds 所维护。因为 FreeBSD 整个系统都是由总部所开发,不只系统整体较有规划,各个程序之间搭配起来也比较紧密。如果您使用 Linux,由于 Kernel 和其它的程序是由不同组织所维护,在升级时,比较麻烦。而 FreeBSD 就简单多了,每次一有新的版本,一定是整个系统一起升级。
我觉得 FreeBSD 总部统筹发展 FreeBSD 是一件很棒的事,所有的问题回报都可以统筹管理并予以更新。FreeBSD 推陈出新的速度相当快,每一次安装都确保这个版本不会有上一版的缺失。所以在 Linux 或 MS-Windows 中「新版本不一定是最好」的定律并不适用于 FreeBSD。但这并不意味着你必须不断重新安装系统,FreeBSD 总部随时会发布最新更新的档案提供下载,而且如果使用 CVSUP 就可以和更新版的 FreeBSD 保持同步更新。
完整的使用手册
FreeBSD 的使用手册非常完整,而且会随着软件一起更新。每次一有新的版本推出,FreeBSD 的文件也会做相对的更新。在 FreeBSD 的官方网站上,我们可以轻松的取得这些高品质的手册及文件。
软件安装的便利性
FreeBSD 支持的软件相当多,它将常用的软件分类管理,当需要安装软件时,使用者不必自行到网络上找寻,只要到 FreeBSD ports 目录中下个指令就安装完成。
条理分明的系统架构
FreeBSD 目录结构非常有组织,结构严谨,对于系统管理者而言比较不会紊乱。FreeBSD 将系统预设的目录和管理者自行安装的程序目录划分得十分清楚,管理者在进行升级、维护时可以一目了然。
完美的程序开发平台
安装完 FreeBSD 后,系统所有程序原始码非常有条理的存放在特定目录中。对于想要进行程序修改的管理者而言,不必四处寻找某支程序原始码。笔者在 FreeBSD 及 Linux 上开发程序多年,我觉得 FreeBSD 原始码及系统架构十分有组织,是程序开发最好的平台。
而且 FreeBSD 的版权较为宽松,对于想要以 FreeBSD 为基础开发产品的公司而言,它可以保护您的修改不会被其它对手抄袭。
1.3 为什么不选择FreeBSD?
许多企业选择使用目前大多数人使用的 MS windows 做为一般作业用个人计算机的操作系统当然无可厚非。但以 MS windows 做服务器,除了信息人员的偏好外(或许因为不会使用其它系统吧),还有部份原因是为了在企业内信息人员技术不足时,能求助于系统供货商。而 FreeBSD 是免费的,企业也害怕有状况时无人可以支持,这对企业是很重要的一项因素。
然而,FreeBSD 的使用人数其实很多,而且使用者都十分热心,在台湾的 BBS 讨论区上,许多问题都可以获得解决。这当然还不够,现在有很多顾问公司提供 FreeBSD 的顾问服务,可以提供企业这方面的服务。虽然说 FreeBSD 的系统稳定,但在应用上如果没有信息人员的支持,很难能在企业中存活。但正因市场上了解 FreeBSD 的人较少,若我们能主动学习,必能为自己创造更多价值。
FreeBSD 目前支持的平台不多,若您不是使用 X86 的系统,而是使用 ARM、MIPS 等平台,您就必须寻求其它的解决方案。
1.4 FreeBSD的版本命名规则
FreeBSD 每出一个新的版本都是以 FreeBSD A.B.C-TAG 来作为命名的方式,例如 FreeBSD 5.4-RELEASE 或 FreeBSD 5.2.1-RELEASE。
A-主要版本编号
B-次要版本编号
C-修正版本编号
TAG-名称标签,如 RELEASE、STABLE、CURRENT 等
世界各地活跃的高手们组成 Core Team 对系统原始程序代码做开发和维护,几乎系统原始程序代码每天都会有新版本和修正除错。系统工具程序、驱动程序等等,例如 Ports 内的程序版本也常常更新。FreeBSD 的 Core Team 为了兼顾发展新功能和稳定性,所以将原始码进入稳定阶段,就会建立一个新的分支,并在新的分支上加强稳定性及效能。所有新的功能会先在 Current 上进行开发,有必要才会放到稳定的分支中。图 1-1 即为目前 FreeBSD 原始码版本结构简图:
图 1-1
[img]http://homepage.cqwu.net/wxfy/images/ch01_01.png[/img]
在 FreeBSD 在开发时有一个实验性的版本,以开发新功能为主,称为 CURRENT ,这是主要的分支。当 CURRENT 进入稳定的阶段后,会分支出一个 STABLE 的 Branch,目前 5.x 系列就是一个还在维护的分支。FreeBSD 4.x 分支自从 4.11 之后应该不会再推出新的版本了,以后 STABLE 版将以 5.x 为主。FreeBSD 正式发行的版本称为 RELEASE 版本,推出RELEASE之后会不断的更新该版本以力求稳定性,称之为 STABLE。以 FreeBSD 5.x 为例,自从 Current 开发到 5.3 时,因为品质已经十分稳定,因此产生新的分支,以后 5.x 就会在此分支下开发,而一些新的功能或是实验性质的程序会被放到 Current 中。
在 FreeBSD 在 5.x 中加入了设多新的功能,在系统架构上有许多新的变革,使用了许多新的技术,而这些新的技术经过 5.0、5.1、5.2、5.3-RELEASE 的淬炼后,功能上已十分稳定。而 FreeBSD 4.11 是 4.x 最后的版本,如果您十分保守,或是您所要跑的软件只支持 4.x,历史悠久的 FreeBSD 4.x 也是不错的选择。我们以下列出 FreeBSD 5.x 和 4.x 主要的差异供读者参考:
SMPng (Symmetric MultiProcessor next generation) 对多颗 CPU 的支持有更好的效率。
对于新硬件的支持更完整。例如支持蓝芽、32 bit 的 PCMCIA 等。FreeBSD 5.x 使用不同的方式管理硬件装置,日后对于新的硬件支持应该会比较迅速。
更进步的档案系统功能。FreeBSD 一项最大的弱点就是缺乏一个比较好的档案系统格式,但 5.x 新增了一些新的功能改善即有的档案系统。例如 background fsck,可以让不正常关机后的系统可以更快速进入正常运作。FreeBSD 5.x 使用 UFS2,它支持更大的档案及更多档案属性。另外,还有 snapshot 功能,可以让我们对档案系统进行快照,保留某一时间的档案内容。
支援 kernel thread,FreeBSD 5.x 的 KSE (Kernel scheduled Entities) 让我们可以拥有 kernel mode 的多重执行绪。这项功能对于一些大型系统效率 (如使用 Apache 2 或支持多执行绪的数据库) 有明显提升。
FreeBSD 4.x 发展到最后,可以说是一套最稳定的操作系统,而由于 5.x 加入了许多新的功能,在稳定性方面略逊一筹。为了改善 5.x 的稳定性及效能,FreeBSD 很快就推出 6.x 系列。6.x 的主要目的是改善 5.x 的稳定性及提升系统效能,在功能上不会有太多的不同。所以,目前选用 6.x 应该是最好的选择。
1.5 如何取得FreeBSD?
FreeBSD 可以经由免费取得,我们可以自各大 FTP 站台下载 ISO 档,自行烧录成光盘来安装,也可以透过 FTP 站台以网络安装。国内对 FreeBSD 收集最知名的应该是交大资工,如果您要下载 ISO 档的话,可以在该 FTP 站台中的 ISO-IMAGE 目录中找到。以交大资工而言,ISO-IMAGE 通常放在 /pub/releases/i386/ISO-IMAGES/。我们一般的 PC 都是属于 i386 的架构,所以您在 i386 目录下看到一堆不同版本的 STABLE 及 RELEASE 都是你可以下载安装的版本。
交大资工([url]ftp://freebsd.csie.nctu.edu.tw)[/url]
中央资工([url]ftp://freebsd.csie.ncu.edu.tw)[/url]
和信超媒体([url]ftp://ftp.giga.net.tw)[/url]
还有许多
[url=ftp://ftp1.tw.freebsd.org/]ftp1.tw.freebsd.org[/url]

[url=ftp://ftp9.tw.freebsd.org/]ftp9.tw.freebsd.org[/url]
都是在台湾的mirror站台
1.6 如何得到更多信息?
笔者网站有本书所有内容及一些关于 FreeBSD 的文章。除此之外,FreeBSD 的使用者众多,且十分热心,在国内外有许多高手们将自己的经验开放给使用者参考。以下即为部份 FreeBSD 的站台。
中文站台
笔者的 twbsd.org ([url]http://www.twbsd.org)[/url]
FreeBSD Chinese HOWTO([url]http://netlab.cse.yzu.edu.tw/~statue/freebsd/)[/url]
蓝色泡泡的OHAHA ([url]http://ohaha.ks.edu.tw)[/url]
大南国小的FreeBSD ([url]http://freebsd.lab.mlc.edu.tw/)[/url]
FreeBSD 使用大全 ([url]http://tech.sina.com.cn/focus/FreeBSD/index.shtml)[/url]
英文站台
FreeBSD总部 ([url]http://www.freebsd.org)[/url]
FreeBSD Handbook ([url]http://www.freebsd.org/doc/)[/url]
BSD Forum ([url]http://www.bsdforums.org/)[/url]
Fresh Ports ([url]http://www.freshports.org/)[/url]
ONLamp.com:FreeBSD Basics ([url]http://www.onlamp.com/bsd/)[/url]
1.7 本书光盘使用说明
本书附有二片随书光盘,第一片光盘为 FreeBSD 6.0-RELEASE 安装光盘,第二片为本书所需的所有软件及笔者设定文件的范例。
光盘二档案说明:
[b]文件名称[/b]
[b]说明[/b]
/book/
本书全文的电子文件。
/examples/
存放笔者的设定文件及一些范例程序。
/examples/etc/
笔者 /etc/ 目录下的设定文件。
/examples/adduser.tar.gz
大量新增账号程序。
/mailserver
此目录含有快速安装 mail 所需的档案及程序。
/wintools/
MS Windows 下的工具。
/wintools/putty.exe
在 MS Windows 下好用的 SSH 联机软件。
/wintools/WinMD5.exe
检查 MD5 的工具。
当您要以光盘安装 FreeBSD 时,请使用光盘一来开机。系统安装完毕后,您可能会安装一些可以在 FreeBSD 上使用的软件。当我们使用 FreeBSD ports 安装软件时(参考「软件安装」一章的说明),它会先检查计算机中是否也有该软件的原始文件,如果没有则将自动从网络下载。

[[i] 本帖最后由 逍遥 于 2006-6-5 15:01 编辑 [/i]]

逍遥 发表于 2006-6-5 15:02

第二章 安装 FreeBSD
在开始安装 FreeBSD 之前,我们会先介绍一下 FreeBSD 的取得及一些安装前必须知道的知识。读完本章后,我们将可以了解下列主题:
如何取得 FreeBSD。
FreeBSD 硬盘的使用及配置。
如何规划硬盘空间。
如何从 CD-ROM 或网络安装 FreeBSD。
2.1 安装前需知
2.1.1 如何取得FreeBSD
在这里我们只介绍二种较常使用的安装方式,即利用光盘安装与经由网络安装。如果要利用光盘安装,可以使用本书所附之第一片光盘,其版本是 6.0-RELEASE。或者您也可以到国内各大学的 FTP 站台取得 FreeBSD 的 ISO 文件来烧成光盘。国内对 FreeBSD 收集最知名的应该是交大资工,如果您要下载 ISO 档的话,可以在该 FTP 站台中的 ISO-IMAGES 目录中找到。以交大资工而言,ISO-IMAGE 通常放在 /pub/releases/i386/ISO-IMAGES/。我们一般的 PC 都是属于 i386 的架构,所以您在 i386 目录下看到一堆不同版本的 RELEASE 都是可以下载安装的版本。所有的 Release 版本都会任成可以直接烧录于光盘的 ISO 文件,有时在 ISO-IMAGES 目录中有许多档案,例如 6.0-RELEASE-i386-disc1.iso 、6.0-RELEASE-i386-mini.iso,那个 disc1.iso 就是我们要下载的档,而 mini.iso 也是可以用来安装的档案,只是没有一些常用的 packages ,所以档案较小。以下为各主要 FTP 站台的网址:
交大资工([url]ftp://freebsd.csie.nctu.edu.tw)[/url]
中央资工([url]ftp://freebsd.csie.ncu.edu.tw)[/url]
和信超媒体([url]ftp://ftp.giga.net.tw)[/url]
下载时您会发现该目录中有一个档案叫做 CHECKSUM.MD5,这是一个文字文件,用来检查下载的档案是否正确,您可以使用 FreeBSD 下的指令 md5 来检查计算出来的结果和 CHECKSUM.MD5 中的记录是否相同,也可以使用 WinMD5 这个工具,在 MS Windows 计算。WinMD5 可以在本书所附光盘二的 wintools 目录下找到。下载 ISO 档后,把扩展名 .iso 改成 .nrg 后,再用 NERO 以烧录映像档方式,将该档案烧录成光盘,该光盘即具备光盘开机的能力。详细的光盘烧录方式,请参考本书附录 C 的说明。
如果您要以网络安装的话,必须先做开机片,当然,您也可以使用类似版本的光盘来开机,再更改一些设定以安装最新版本的 FreeBSD。要制作开机片,必须先到上述 FTP 站中下载下列档案到 MS Windows 端:
FreeBSD 5.x 以后:
pub/tools/fdimage.exe
pub/releases/i386/6.0-RELEASE/floppies/kern1.flp
pub/releases/i386/6.0-RELEASE/floppies/kern2.flp
pub/releases/i386/6.0-RELEASE/floppies/boot.flp
FreeBSD 4.x:
pub/tools/fdimage.exe
pub/releases/i386/4.11-RELEASE/floppies/kern.flp
pub/releases/i386/4.11-RELEASE/floppies/mfsroot.flp
上面的各个目录可能依 FTP 站台的不同有点变更,不过基本上 fdimage.exe 一定在 tools 的目录下,而另外二个档案一定在想要安装的版本目录下的 floppies 目录中。上面目录中的 6.0-RELEASE 是您想要安装版本的目录,您可以更改为想要的版本。下载完后,准备三张磁盘 (FreeBSD 4.x 只要二张磁盘),在 DOS 模式下 (Windows XP/2000 请执行在 [开始]->[执行] 输入 cmd 以进入命令列)执行下列指令以制作开机片。
如果您使用 FreeBSD 5.x 以后的版本:c:>fdimage -f 1.44M kern1.flp A:
c:>fdimage -f 1.44M kern2.flp A:
c:>fdimage -f 1.44M boot.flp A:
如果您使用 FreeBSD 4.x:c:>fdimage -f 1.44M kern.flp A:
c:>fdimage -f 1.44M mfsroot.flp A:
第一个指令完成后,第一张磁盘就做好了,别忘了要先换第二张磁盘后再下第二个指令,如此即完成开机片的制作。
2.1.2 硬盘分割表的概念
在 DOS/Windows 系统中,分割硬盘时,有一个主要扇区 (Primary partition)、一个延伸扇区 (Extended partition),延伸扇区中再去分割成许多的逻辑扇区 (Logical partition)。在 Windows 系统中,每一个扇区会被分配一个磁盘驱动器代号,例如, C:、D: 等。
在 FreeBSD 中,硬盘扇区并非以 C:、D: 等方式分配,而是将扇区挂入目录下。例如,系统中会有一个根目录 (/) 是系统的主要目录,我们会将一个扇区挂在根目录下,根目录就好像是 C: 一样。在根目录下有很多目录,例如 /home 这个目录对于 FreeBSD 而言,就好像是 Windows 的 「Documents and Settings」 目录一样。在 /home 中会有许多使用者的目录,例如 /home/alex、/home/john 等。我们可以让 /home 使用另一个硬盘的分割区,也就是说,如果您有一个 40 GB 的硬盘,您可以将它切割成二个扇区,第一个扇区做为系统根目录,而另一个扇区专门用来存放使用者数据。
在FreeBSD 中切割硬盘的方式和 Windows 也不太一样。我们会将硬盘先切出一块主要扇区 (slice),再细分为许多分割区 (partition),做为档案目录或虚拟内存。以我的计算机为例,我有二颗IDE硬盘,在 FreeBSD 中的代号分别为 ad0 及 ad1。在第一个硬盘中,我有一个 DOS 系统及 FreeBSD 操作系统,这二个硬盘我分别再分割为许多分割区做为不同用途,因为的硬盘中有 DOS 系统已用去了一个主要扇区的话,那么您看到第一个主要扇区是 s2。举例说明:
[b]分割区名称[/b]
[b]说明[/b]
ad0s1
ad0 代表第一个硬盘,s1 是第一个主要扇区,我放 MSDOS。
ad0s2a
s2 代表第二个主要扇区,最后一个 a 在传统上是指根目录。
ad0s2b
b 在传统上是指 swap 虚拟内存。
ad0s2d
/usr
ad1s1d
/home
ad1s1e
/var
我将第一个硬盘 ad0 分割成二个主要扇区,一个是给 Windows 使用 (ad0s1),另一个是 FreeBSD 使用 (ad0s2)。而在 ad0s2 中,我又细分为三个分割区:ad0s2a、ad0s2b、及 ad0s2d。分割区名称代号最后一个 a 在传统上是指根目录,所以根目录的名称都会是代号 a;而 b 在传统上会被用在 swap 虚拟内存;c 是指整个主要扇区;而 defgh 等是我们可以任意使用的。所以您可以看到我的第二个硬盘,因为只有一个主要扇区,所以代号开头都是 ad1s1,而上面有二个分割区,分别用来做 /home 及 /var,由于这二个分割区不是根目录或 swap,所以代号从 d 开始。
图 2-1
[img]http://homepage.cqwu.net/wxfy/images/ch02_01.png[/img]
在一般 Windows 系统中,我们常看到 C:、D: 等不同的磁盘驱动器,而在 UNIX 系统中,并没有这种磁盘驱动器的观念,所有切割出来的磁盘空间都会被指定挂入某个目录,日后我们要存取该存碟时,就是透过这个目录来存取。以上表为例,我们的第二颗硬盘分割成二个扇区,其中一个扇区被挂入 /home 这个目录下,安装完成后,所以存放在 /home 下的档案都会被放到第二颗硬盘上。
2.1.3 硬盘空间的配置
要分割成多少个 partition 见仁见智,您可以把任何目录都独立成一个 partition (我想没人这样做),如果 partition 分割成很多个的话,可能因为分割不良而造成日后有的扇区空间满了,而有的扇区完全没用到;如果分割成很大,档案都在同一个分割区上,当机时档案遗失的机会比较大。
因为每一个分割区都是一个独立的档案系统,在一个档案系统上,我们可以分别设定不同的属性。如果不同的目录要设不同的参数的话,就要分割成不同的扇区,这样一来我们就可以针对不同的扇区设定不同的属性。例如当要架设 BBS 或 News server 时,由于这类的服务器所使用的档案都比较小,所以 inode 会设比较多。所谓的 inode 是用来存放档案及目录的基本信息,包含时间、文件名、使用者及群组等。在分割扇区时,系统会先做出一堆 inode 以供以后使用,inode 的数量关系着系统中可以建立的档案及目录总数。如果要存的档案大部分都很小,则同样大小的硬盘中会有较多的档案,也就是说需要较多的 inode 来挂档案及目录。如果 inode 满了而硬盘未满的话还是不能存档案。就好像是有一面墙(硬盘),上面有很多勾子 (inode) 可以挂衣服(档案)。如果勾子少,则彼此的空间大,衣服大件一点的话很好,小件的话就会很空,浪费墙的空间。反之,如果勾子多则可以多挂点衣服,不过勾子也是会占空间的,而且太多的 inode 会降低硬盘存取的效率。
如果不同目录写入的频率不同,我会把较常写入的目录独立出来,才不会影响其它档案。又如果有多颗硬盘,我也会平均分配每个硬盘的使用频率,利用分割的技巧来平均配置不同的目录。甚至有的目录我们只希望以只读的方式挂入,也必须使用一个独立的分割区。
最简单的分割方式就是一个根目录和一个 swap,这样就不会造成分割不良的浪费,不过这样当不正常关机时,挡案毁损的机会也大。以下为我一颗 40GB 硬盘的分割方式供大家参考:
目录
大小
用途
/
1 GB
根目录,放开机必备文件,包含/bin、/etc、/sbin、/root.....等。
swap
512 MB
虚拟内存。在很久以前,RAM 的价格十分昂贵,所以许多系统都会使用硬盘来做虚拟内存 ,让系统在物理内存用完后,依然有内存空间可以用。FreeBSD 对于虚拟内存的管理建议至少设为物理内存的二倍,因为系统核心在管理内存时,在这种设定下最有效率。也就是当您只有 128 MB RAM 时,建议您至少建一个 256 MB 的虚拟内存。不过现在的 RAM 动不动就是 512 MB,甚至 1GB,一般在使用时就已经很少会用到虚拟内存了。所以为建议,如果您的 RAM 在 256 MB 以下,可以建一个 256 MB 的虚拟内存。而 RAM 在 512 MB 以上,如果您的硬盘空间实在很小,系统上跑的程序也不多,您可以将 Swap 设小一点。我的 BBS 站有一百多人使用,内存有256MB,设 512MB 的 Swap 用都没用到。我们会在档案系统管理一章中做更详细的说明。
/usr
10 GB
放执行档、设定档等,日后安装的软件都会放在这里,所以要大一点。如果要安装X Window的话,至少要有 7 GB,因为在安装过程中,编译时会用去很大的空间,安装完清除暂存档后大概还是需要 3GB 吧。如果不安装 X Window,只当服务器用的其它数据又位于另一个独立的分割区,则 /usr 2GB 一定足够。
/tmp
1 GB
/tmp 是许多程序的暂存区,其权限通常是所有使用者都可以读写,而且这个目录写入频繁,所以我将它独立出来。如果您的服务器上所执行的程序会用到大量的暂存空间,您可以切大一点。您也可以将 /var/tmp 也独立分割一个扇区,因为像 /tmp 及 /var/tmp 这二个目录都是一般使用者可以写入的地方,如果使用者在里面放大量档案而造成磁盘空间满了,会影响原本的系统运作 (例如必须用到 /var/log、/var/mail、及 /var/spool 的邮件服务器等)。
/var
5 GB
这是放使用者信件、寄信时暂存区及一些系统记录(log) 的地方,如果信都不大、使用者不多,设成 100MB 也没关系,如果要做邮件服务器的话,就设大一点吧。使用者新进的信件都会放在 /var/mail 目录下,您也可以将这个扇区独立出来,并在这个扇区上设定限制使用者磁盘空间配额。
/home
22 GB
这里是放使用者的目录,我通常把网页都放在这里。这个分割区会被用来存放使用者的数据,所以我将剩下的空间都给 /home 使用。如果您没有分割出 /home 这个扇区,/home 这个目录将使用 /usr 的扇区。

[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
如果您有多颗硬盘,建议您可以将数据放在独立的一颗硬盘,例如将 /home 分割在另一个硬盘上。这样一来,日后升级时,由于数据在独立的分割区,我们只要把该分割区挂入即可。
2.1.4 多重开机
FreeBSD 本身就支持多重开机,如果您想在计算机中安装不同的操作系统,例如同时安装 Windows 98 及 FreeBSD 的话,请先安装 Windows 98 再安装 FreeBSD。在安装 FreeBSD 时,可以选择使用 FreeBSD 内定的多重开机程序,也可以安装您喜欢的多重开机软件。FreeBSD 的多重开机就只有二行字,画面比较简单,但是安装容易,不需做额外的设定。如果您对于这种画面不满意,您可以使用其它多重开机软件在安装完 FreeBSD 后再在 Windows 98 下设定多重开机。
顺道一提,如果您使用了 FreeBSD 或是其它的多重开机, 日后要移除多重开机管理员时只要在 MS-DOS 下执行下列指令即可:c:\> fdisk /mbr
2.2 系统安装
2.2.1 开机
如果使用光盘开机的话,只要放入本书的第一张光盘,就会进入设定核心的目录选单,记得要先在 BIOS 中设定可以光盘开机。
如果使用磁盘开机的话,放入安装前须知中制作的磁盘,FreeBSD 5.x 以后一共有三张磁盘,先放入 kern1.flp 那一张,再依序放入 kern2.flp 及 boot.flp。如果是 FreeBSD 4.x,请先放入 kern.flp,读完之后会出现一个讯息,要您放入 mfsroot 那一张磁盘,这时候就拿出 kern 那一张再放入 mfsroot 那一张磁盘后,按 enter 就可以继续开机了。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
请记得先在 BIOS 中设定使用光驱或软盘机做为第一个开机来源,这样我们才可以进入 FreeBSD 的安装喔。一般进入 BIOS 设定的方式是按  或是 ++,或是  等,请参考您主机版的使用手册以得知正确设定方式。
2.2.2 设定核心
如果您使用 FreeBSD 5.x 以后的版本,系统一开机时会先出现一个选单:
图 2-2
[img]http://homepage.cqwu.net/wxfy/images/ch02_02.png[/img]
请直接按 Enter 即可进入开机模式。如果您使用的是 FreeBSD 5.x 以后的版本,请直接跳到 2.2.3 小节;如果您使用 FreeBSD 4.x,开机完后会出现下列的画面:
图 2-3
[img]http://homepage.cqwu.net/wxfy/images/ch02_03.png[/img]
这时候您可以选第一个跳过 kernel configure,也可以选第二个来设定核心。我通常第二个,因为有些硬件的驱动程序间会相冲,例如我的 SCSI 卡就不能选第一个直接进入,必须先移除其它的 SCSI 卡驱动程序。好吧,就选第二个 「Start kernel configuration in full-screen visual mode.」
图 2-4
[img]http://homepage.cqwu.net/wxfy/images/ch02_04.png[/img]
在这里分成上下二个窗口,最上面的 Active-Drivers 是您要使用的驱动程序,下面是您移除的。如果在上面移除的话,就会跑到下面来。您可以用 [TAB] 键在二个窗口中移动,使用 [DEL] 键来删除设备。在这里只要设定 Storage 及 Network 的选项即可。设定完后按 Q 存档离开。
如果您的 SCSI 卡都是 PCI 接口的话,您可以把 Storage 中所有出现 SCSI 的选项都按 [DEL] 来删除,因为 PCI 的装置都是即插即用,都自动抓得到。其它设备网络卡等也都是这样,在 Network 选项中,里面的设备都是给 ISA 接口用的,如果您的是 PCI 的网络卡的话,就把它们都删了吧。如果您的设备有 ISA 接口的话,而您又不知道自己的设备是哪一个,就把它们都留着。
在 Storage 选项中,有 IDE 硬盘及软盘机用的设备,请不要把它们删除,最后的 Storage 选项至少应有下列图 2-5 所示的三个:
图 2-5
[img]http://homepage.cqwu.net/wxfy/images/ch02_05.png[/img]
完成了上面的步骤,就可以按 Q 离开了,画面会出现:Save these parameters before exiting? ([Y]es/[N]o/[C]ancel)
按 Y 就可以离开,进入下一个步骤。这时候系统会一直跑,继续开机的动作,最后会到一个蓝色画面。
2.2.3 开始自订安装
完成了开机后,会出现一个蓝色画面,这个画面日后您可以在 /stand 目录中,使用指令 sysinstall 去叫出这个安装时的画面。当开机进入蓝色画面时,您可以按 ALT+F2 来看除错信息,看一下是不是有硬件没有安装进来,由于 kernel 中只有安装时要用到的硬件才会驱动,所以如果没有抓到声卡的话也没关系。要回到蓝色画面就按 ALT+F1。
图 2-6
[img]http://homepage.cqwu.net/wxfy/images/ch02_06.png[/img]
我们选择第四项 Custom 来自订安装。请使用上下键来选择,并以空格键来确定进入。如果要把光棒从 Select 移到 Exit Install 的话,请使用左右键来移动。进入 Custom 后会出现下列画面:
图 2-7
[img]http://homepage.cqwu.net/wxfy/images/ch02_07.png[/img]
如果您所使用的开机片并不是您想要安装的版本的开机片的话,您要先选第二项 Options 进去修改 Release Name 的部份,否则就可以略过这一步,直接选 3 Partition 来选择要安装 FreeBSD 的硬盘扇区。
2.2.4 分割硬盘
进入 Partition 选单时,如果您有二颗以上的硬盘,首先会出现硬盘选单,如图 2-8 所示:
图 2-8
[img]http://homepage.cqwu.net/wxfy/images/ch02_08.png[/img]
您会看到上面的图,我们之前说过 ad0 是第一个硬盘,而这里的 ad2 是指第二个硬盘排线的第一个硬盘(master disk on the second IDE controller)。把光棒移到您要使用的硬盘,再按空格键进入即出现下面的画面。如果二个硬盘都要使用,等一下分割完第一颗之后再来设定第二颗。
图 2-9
[img]http://homepage.cqwu.net/wxfy/images/ch02_09.png[/img]
在图 2-9 中,光棒所指的就是未使用的空间,如果您这个硬盘只要给 FreeBSD 使用的话,您可以直接按 A 使用整个硬盘。如果您有 DOS 分割区的话,应该会出现一列是 fat 的扇区。
我们把光棒移到 unused 的地方,按 C 来建立扇区,它会问您要使用多大的空间,您可以输入 10000M 代表 10000 MB 也就是 10 GB 。接着按 Enter 键,它会问您 TYPE ,预设是 165 ,这是 FreeBSD 档案系统代号,请直接按 Enter 就可以了。好了之后再对着刚设定好的 freebsd 扇区按 S 设定为可以开机,如果没有设定也没关系,FreeBSD 会自动将它设定可开机。最后按 Q 离开画面。离开后会出现下列画面:
图 2-10
[img]http://homepage.cqwu.net/wxfy/images/ch02_10.png[/img]
上图是问您要使用哪一种开机管理员,如果要使用其它操作系统,您可以使用 FreeBSD 的多重开机管理员,即选择第一个 BootMgr 选项。如果要使用其它多重开机管理员就选 None,不过这样一来如果没有安装其它多重开机管理员便无法使用 FreeBSD 开机。如果您的计算机中只有 FreeBSD 这个操作系统,就选中间这一个 Standard。我只要使用 FreeBSD ,并没有其它操作系统,所以我选 Standard。选完后会回到刚才的硬盘选单,如果您还有其它的硬盘要加入的话,您可以选其它硬盘重复刚才的步骤,如果要加入的是 DOS 的硬盘,只要选择进入后,什么都不做,直接按 Q 离开即可。当所有的硬盘都设定好了,回到硬盘选单时,按 Cancel 离开选单,回到自订安装选单。
回到自订安装选单后,选第 3 个 Lable 进入 Disk Lable 编辑。即图 2-11 的画面:
图 2-11
[img]http://homepage.cqwu.net/wxfy/images/ch02_11.png[/img]
我们之前在安装前的须知中说过关于扇区的分割方式及大小配置,您可以直接按 A 自动配置,不过这样出来的结果可能不是我们想要的。所以我们手动来做吧,最上方蓝色光棒的位置就是您现在要分割的硬盘及其使用空间。如果有二个硬盘,所看到的就不是像上面那样,而是有比较多个硬盘。不管硬盘有多少个,只要对着您要的硬盘按 C 去建立一个分割区,它会先问您大小,如图 2-12 所示:
图 2-12
[img]http://homepage.cqwu.net/wxfy/images/ch02_12.png[/img]
在图 2-12 询问您所要分割的大小时,您可以输入想要的空间大小,接着会出现图 2-13 的画面,询问您要给哪一种类型的分割区,如果是要给目录使用的话,就选 A file system,如果是 swap 就选 A swap partition。我们先来分割给根目录使用,如下图:
图 2-13
[img]http://homepage.cqwu.net/wxfy/images/ch02_13.png[/img]
接着选择挂入点,如果是分割给 swap 使用的话,并不会问您挂入点是什么。这里我们先分割根目录,如图 2-14:
图 2-14
[img]http://homepage.cqwu.net/wxfy/images/ch02_14.png[/img]
这时您就输入 / 就代表根目录。接着再继续分割给其它目录,如 /usr、/home等。最后如图 2-15 所示:
图 2-15
[img]http://homepage.cqwu.net/wxfy/images/ch02_15.png[/img]
在图 2-15 中,如果您有 DOS 分割区在硬盘中,您可以把它挂进来 (mount) 做为一个目录,这样子在 FreeBSD 中就可以看到 DOS 分割区了。您可以对着最上面一行 DOS 那一个按 M ,并输入目录名称为 /MSDOS ,就可以了。
除了 / 及 swap 外,其它的分割区 Newfs 字段都有一个 UFS2+S 的设定。您所看到的 S 表示使用 Soft Updates。Soft Updates 可以用来加速系统写入档案及目录的系统数据,对于新增及删除档案的速度有明显的提升。Soft Updates 可以让我们在写入资料时保有完整性,在面临系统不正常关机时,能让所写入的数据尽量完整。而其缺点是在删除或更新档案时,硬盘空间的释放较慢,这个缺点在于一个快要满的分割区中比较明显。例如,当我们的 / 目录快满时,我们更新该分割区的数据时,可能会因为分割区在删除数据后空间释放较慢而使空间不足而失败,进而造成某些档案无法使用。所以 FreeBSD 预设并未在 / 目录中使用 Soft Updates。
如果您有 BBS 站的话,您必须更改一下 inode 的设定,才不会造成空间的浪费。把光棒移到 BBS 的目录,再按 N 并输入参数为 newfs -i 1024 -b 4096 -f 1024,来改变 inode 的设定。
好了,都设定好了就按 Q 离开,回到自订安装选单吧。接下来就开始选择要安装的套件。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
如果您之前安装过 FreeBSD,而且将数据存在另一个硬盘,您可以使用 M 将它挂入一个目录中。硬盘分割安装完成后,除非重新安装,否则就无法再做更动,所以请小心规划硬盘的使用空间。如果您真的不知道怎么分割,您可以先分割成一个根目录及 swap 空间,下次再安装时,您就可以依照当时实际的使用情形来分割硬盘了。
2.2.5 安装自订套件
回到了自订安装选单后,选择 Distribution 来选择要安装的套件。进入图 2-16 的画面后,选择最下方的 Custom:
图 2-16
[img]http://homepage.cqwu.net/wxfy/images/ch02_16.png[/img]
在上图中选 Custom 后,会进入图 2-17 的选单:
图 2-17
[img]http://homepage.cqwu.net/wxfy/images/ch02_17.png[/img]
您最简单的方式就是选择所有的套件 All 以安装所有的 FreeBSD 预设套件。如果您不需要使用窗口接口,可以不必安装 X.Org。FreeBSD 使用 X Windows 做为图形化接口,X Windows 原本是 XFree86 这个套件,但后来因为版权及管理问题而分裂成 XFree86 及 X.Org 这二个套件。原本 FreeBSD 使用的是 XFree86,但自从 5.3 以后,改用 X.Org。
全部选完之后就选 Exit 离开。回到上一层选单,再选 Exit 回到自订安装选单。接着就是选择安装的来源了。
2.2.6 选择安装来源
回到自订安装选单后,我们选择 Media 来决定安装的来源,如图 2-18:
图 2-18
[img]http://homepage.cqwu.net/wxfy/images/ch02_18.png[/img]
如果您是以光盘安装的话,就选第一个 CD/DVD 作为安装来源,选了之后就可以回到自订安装选单,选 Commit 开始安装,并按下确定开始。
如果您是以网络安装的话,就选第二个 FTP。选了 FTP 之后,会问您要使用哪一个 FTP 站台,这时候请选第二个 URL Specify some other ftp site by URL 来自订要使用的 FTP 站台。进入后会问您要使用的站台位置,您要先去找出该 FTP 站台放 FreeBSD 的目录为何,以交大资工而言,您应该输入
[url=ftp://freebsd.csie.nctu.edu.tw/pub/releases/i386/]ftp://freebsd.csie.nctu.edu.tw/pub/releases/i386/[/url]
接着会要求您设定网络,使用网络安装必需先设定网络,出现图 2-19 的画面,要您选择网络卡:
图 2-19
[img]http://homepage.cqwu.net/wxfy/images/ch02_19.png[/img]
图 2-19 中,您的网络卡会出现在第一个,如果您有二张网络卡的话,就会有二个不同编号。选择一个对外连到网络的卡后,接着会问您是否要使用 IPv6 选否,再来是问您要不要使用 DHCP (自动取得 IP 地址....这就看您有没有 DHCP server 可以自动取得 IP 啰),接着就进入图 2-20 的画面。
图 2-20
[img]http://homepage.cqwu.net/wxfy/images/ch02_20.png[/img]
您要先知道您的 Domain Name 及 IP 等,如果没有 Domain Name 的话,就随便输入吧。假设我们的机器是 [url]www.mydomain.com[/url] ,所以在 Host 一栏中就输入 [url]www.mydomain.tw[/url],在 Domain 中就输入 mydomain.com。我的机器在中央大学,所以 Gateway 就输入 140.115.1.254,Name server 输入 140.115.1.31,IPv4 Address 就输入我的 IP 也就是 140.115.75.1,Netmask 也就是子网络就输入 255.255.0.0。接着按 OK 离开回到自订安装选单。再来选 Commit 开始安装,并按下确定开始。
2.2.7 最后的设定
经过了一段时间的安装后,最后就会出现一个窗口问您是否要做最后的设定,这时候选 [YES]。又回到了一开始 sysinstall 的画面。
图 2-21
[img]http://homepage.cqwu.net/wxfy/images/ch02_21.png[/img]
这时候就选 Configure 进入设定选单,在 Configure 选单中,我们可以设定本机的基本资料。在这里我们仅设定下列几项:
设定网络:进入后选择 Networking 设定网络,如果您是用网络安装的话,您已经设定好了。如果是用光盘安装的话,就必须进入进行设定。请参考前面安装时选择安装媒体时所做的网络设定方式。
设定键盘速度及屏幕保护程序。
设定时区 Time Zone。
如果您要设定键盘速度,请选择 Configure 以进入设定选单,如图 2-22 所示:
图 2-22
[img]http://homepage.cqwu.net/wxfy/images/ch02_22.png[/img]
这个设定选单中,各个选项的说明如下:
Distributions
让我们新增 FreeBSD 的安装套件。
Packages
安装其它 packages 软件。
Root Password
设定超级使用者密码。
Fdisk
分割硬盘的工具,日后要再加入新硬盘时可以使用。
Label
Disk Label editor,让我们将己分割的硬盘再分割成不同扇区,以挂入 FreeBSD 中使用。
User Management
使用者账号管理工具。
Console
文字模式下屏幕的设定。
Time Zone
设定时区。
Media
让定安装软件的来源。
Mouse
设定鼠标。如果您要使用鼠标,可以在此驱动。
Networking
设定网络。
Security
设定 FreeBSD Security Level。
Startup
设定开机时要启动的选项,我们可以在 /etc/rc.conf 中设定。
TTYs
设定不同 TTY 的权限。
Options
设定一些安装时选项。
XFree86
X Window 的设定。
Desktop
X Window 的桌面管理员设定。
HTML Docs
显示 FreeBSD HTML文件。
Load LKM
从磁盘中加载 kernel module。
这里的设定只要先设定 Console 及 Time zone 即可,其余的设定(如新增使用者及设定密码等)我们都可以在重新开机后,于文字模式设定。
首先请选择 Console 进入图 2-23 的选单:
图 2-23
[img]http://homepage.cqwu.net/wxfy/images/ch02_23.png[/img]
在 System Console Configuration 选单中,第二及第三个选项 Font、Keymap 可以让我们设定屏幕字型及键盘对映,不过我们不需要设定。第四项 Repeat 是设定键盘按键重复的速度,因为笔者喜欢按下一个键时,能快速的重复输入该键,所以我选了 Repeat 设定,并将速度设定 Fast。第五个选项是 Saver,我们可以选择喜欢的屏幕保护程序,也可以选择 Timeout 来设定启动屏幕保护的时间。当您设定完成之后,请选择 Exit 回到 Configuration Menu ,接着我们再选取 Time zone 来设定时区:
选择了 Time zone 后,它会问您目前 BIOS 是否设定为 UTC (格林威治时区),如图 2-24 所示,如果您不清楚,请选 NO。
图 2-24
[img]http://homepage.cqwu.net/wxfy/images/ch02_24.png[/img]
接着要选择所在区域,我们选择第 5 项 Asia,如图 2-25:
图 2-25
[img]http://homepage.cqwu.net/wxfy/images/ch02_25.png[/img]
然后再选择国家 Taiwan 即可。
图 2-26
[img]http://homepage.cqwu.net/wxfy/images/ch02_26.png[/img]
最后系统会询问您所选择的是 CST 时区是否正确,如图 2-27,我们便选取 [Yes] 即可。
图 2-27
[img]http://homepage.cqwu.net/wxfy/images/ch02_27.png[/img]
我们在 Configuration Menu 所做的设定最后都会存放在 /etc/rc.conf 中,如果日后有需要更改,可以经由修改 /etc/rc.conf 来完成。
最后就一直选 Exit ,最后 Exit Install 离开安装程序,重新开机即完成 FreeBSD 的安装。如果您在过程中遇到问题,可以到各大 BBS 的 386bsd 版中发问。

[url=http://homepage.cqwu.net/wxfy/ch03.htm]下一节[/url]

[url=http://homepage.cqwu.net/wxfy/index.htm]返 回[/url]

逍遥 发表于 2006-6-5 15:04

第三章 UNIX 系统入门
在开始进阶的 FreeBSD 设定之前,我们先来了解一下 UNIX 系统的架构及基本知识。这些知识对于我们之后管理、使用 FreeBSD 十分重要。如果您是 UNIX 新手,请务必详读本章。
本章将介绍下列主题:
如何登入注销系统。
UNIX 的指令用法。
UNIX 中常用的特殊键。
UNIX 的目录结构及路径的使用。
如何管理档案及目录。
重导 I/O 及管道的使用。
ee 及 vi 等文书编辑器的使用。
Shell 的环境设定。
使用者及群组权限设定。
何谓行程 (Process) 及系统服务管理。
如何进行工作排程。
虚拟终端机管理。
3.1 第一次登入系统
安装完 FreeBSD 后,重新开机,要知道的第一件事就是要怎么使用嘛。我第一次使用 FreeBSD 时,一开机看到 login: 时我当场呆在那里,完全不知如何下手。所以我一定要说一下这个,如何登入并更改密码。说了一堆好像很难的样子,其实不会啦,开机后看到 login: 时,打 root 就可以登入系统了,如图 3-1。
图 3-1
[img]http://homepage.cqwu.net/wxfy/images/ch03_01.png[/img]
这里的 root 就是所谓的超级使用者,这个使用者是 UNIX 系统中的预设管理者名称。root 拥有系统所有权限,我们可以使用这个账号登入系统进行管理。root 这个使用者拥有许多一般使用者所没有的权限,建议您平常使用时最好不要以 root 登入。例如收发 email,程序开发、浏览网页、练习 UNIX 指令等,应该以一般使用者的身份来进行。因为您可能不小心打了某个指令而删除不该被删除的档案、或因为不良的操作而影响系统的稳定。因此,在我们设定完系统后,您应该新增一个一般使用者以减少错误的发生。
由于这是刚装好的系统,所以当我们以 root 登入时,系统不会问我们密码。一个没有密码保护的系统是十分危险的事,所以我们第一件要做的事就是设定 root 的密码。请执行指令 passwd 来设定您的密码,系统会问您二次新密码,以确认二次输入的密码相同。请不要使用太简单的密码,以免造成安全的漏洞。
如果您要离开系统,只要打 exit 或是 [Ctrl] + [D] 即可离开。不过离开系统并不是关机喔,如果您要关机,必须先打指令 shutdown now 才能关闭电源。
3.2 认识 UNIX 使用环境
在开始使用之前,我们先说明一些简单的指令用法,以利后续的设定,更详情的指令介绍请参考本书「指令应用」一章中的说明,或使用指令 man 来查询指令的用法。如果您是 UNIX 初学者,先阅读「指令应用」可以让您对 UNIX 指令及系统管理有更多的了解。
3.2.1 UNIX 指令语法
UNIX 系统预设开机后是跑在命令列模式,就是会有一个命令列提示 (又称为 prompt),登入系统后,我们可以在命令列提示中输入指令。在 FreeBSD 中,一般使用者所看到的命令列提示字符是百分比符号 % 或是金钱符号 $,而超级使用者 root 的提示符号是井字号 #。
我们可以在命令列提示之后输入指令,例如:# date
Wed Jun 15 03:20:44 CST 2005
我们输入指令 date 之后可以看到目前的系统时间。
指令语法
在 UNIX 系统中的指令大多是下列格式:command [-options] arg1 arg2 ...
command 的部份就是指令本身,而 [-options] 表示指令的选项,arg1、arg2 则是要给该指令的参数。-option 使用 [] 括起来表示指令的选项可有可无,有的指令可能可以不必加任何选项及参数,如我们刚才输入的指令 date。而在指令之后输入参数会有不同的作用,例如,我们可以使用 date 这个指令来修改目前的系统时间:# date 200507141730
上述指令即是设定时间为 2005 年 7 月 14 日下午 17 点 30 分。 下面这个范例是有加上选项的指令:# ls -ld /usr /etc
ls 这个指令是用来列出档案的信息,选项 -l 表示列出详细信息,选项 -d 表示只列出目录本身而不列出目录下的档案,而最后的二个参数则是我们要列出的档案或目录。
值得注意的是,UNIX 系统中的指令及文件名有区分大小写喔,例如,date 和 DATE 是不一样的东西喔。如果您输入了 DATE,您将会看到命令列出现「DATE: Command not found.」,表示指令不存在。如果您输入指令 ls 来查看一个档案,但该档案不存在,则会出现「ls: noexist: No such file or directory」,表示档案不存在。所以当我们在输入指令时,如果有发生问题,应该先查看输出的错误讯息是什么,再根据该讯息修正指令。
在 UNIX 系统中,如果您想了解一个指令的用法,例如可以使用哪些参数等,可以使用 man 这个指令来查询 manual。例如,您可以使用下列指令来查询 ls 这个指令的用法:# man ls
更多关于 man  的用法,请参考「指令应用」一章的说明。当您对指令用法有问题时,man 绝对是你是好朋友,懂得善用男人 (man) 可是 UNIX 入门的第一步喔。
指令规则
大部份的情况下,UNIX 的指令输入方式都有下列规则:
指令通常全部都是小写。
选项 (Options) 可以用来改变指令本身的行为,而选项通常会有一个减号 (-) 做开头。我们可以同时使用多个选项,例如 -ld 表示同时使用 l 和 d 这二个选项。我们也可以将这二个选项分开来写,例如 -l -d 。
在指令、选项、和参数之间必须由空白隔开。
选项通常放在参数之前。例如 ls -l /usr,选项 -l 必须放在文件名 /usr 之前。
我们可以在一行命令列中输入多个指令,但每个指令必须使用分号 (;) 隔开。例如,pwd; ls。
特殊按键
当我们在使用命令列输入指令时,有一些特殊按键可以让我们在命令列中移动。例如,我们可以使用键盘的左右键来移动光标,其它还有一些常用的热键如下:
[Backspace]、[Del]、[Ctrl] + [H]:使用键盘的退格键、Delete 键、或是按着 [Ctrl] 键及 H 键,可以删除一个字符。
[Ctrl] + [U]:用以清除整个命令列所输入的数据。
[Ctrl] + [W]:用以清除游标之前的一整个字。
[Ctrl] + [C]:用来中断目前的输入,或是中断一个正在执行的指令。例如,您执行了一个指令,但是该指令跑了很久都没跑完,您可以按 [Ctrl]+[C] 来中断它。
还有一个您一定要知道的小秘诀,当您要 cd 到一个目录时,您可以只打档名的一部份,再按 [Tab] 键,tcsh 会自动帮您补上剩余的部份。例如,我们要切换工作目录 (使用 cd 这个指令) 到 /usr/local,当你打了 cd /usr/lo 时,即可按 [Tab] 键,只要在 /usr 中,除了 local 外没有其它开头为 lo 的档案或目录,tcsh 便会自动补齐成 cd /usr/local。除了 cd 外,其它的指令也是一样,只要按 [Tab] 即可自动补齐。而且除了档案及目录外,指令也可以自动补齐喔。例如,你要下指令 ifconfig,您可以只打 ifc 再按 Tab 键,tcsh 会自动补成 ifconfig。如果您只打 if 即按 Tab 键,您会发现并没有任何动作,因为在系统中,除了 ifconfig 外,还有指令开头也是 if,如 ifmcstat。
3.2.2 UNIX 的目录结构
和大多数的系统一样,UNIX 系统中有档案和目录的分别。档案指的是我们一般的文字文件、音乐文件、图片文件等等,而档案会被放在目录中来管理。
家目录
每一个使用者都有一个「家目录」(home directory),在登入系统后,使用者所在的目录会是在家目录中。该目录中存放了一些使用者登入后会用到的档案,使用者可以在家目录中建立自己的档案、目录等。一般使用者的家目录是在 /home/username 中,而系统管理者的家目录是 /root。
我们在下指令时,可以使用「~」这个符号表示家目录。例如,下列指令表示查看自己家目录中的档案:# ls ~
如果您要查看其它使用者的家目录,可以在「~」之后加上使用者名称,例如:# ls ~alex
目前工作目录
目前工作目录 (Current working directory) 顾名思义就是您目前在系统中的所在路径。您可以使用指令 pwd 来查看目前所在路径。
当我们在执行指令时,如果没有告诉该指令目录或文件名称,预设就是会使用目前的工作目录。例如,ls 这个指令,如果没有加上任何参数,表示我们要查看目前工作目录中的档案。
我们可以使用指 cd 来切换工作目录。例如,我们要将目前工作路径切换到 /usr:# cd /usr
# pwd
/usr
我们可以看到在 cd 到 /usr 后,使用指令 pwd 的结果变成了 /usr 了。
您可以使用下列指令来回到之前的工作目录:# cd -
目录结构
在 Windows 操作系统中,在档案总管中可以看到 Windows 的 "树状" 目录结构。而 FreeBSD 中的目录也是像一颗树,一个目录下还有很多个目录,和 Windows 不同的是在 UNIX 系统中每一个目录都有一定用途。我们了解 FreeBSD 目录结构的用意就是让我们知道每个目录的用途,日后我们要安装新软件或使用 FreeBSD 时,能按照这种规则来做,这样一来在管理维护上比较方便,目录也会比较有条理。
图 3-2
[img]http://homepage.cqwu.net/wxfy/images/ch03_02.png[/img]
以下我们就简单的说明 FreeBSD 的目录结构,您也可以使用指令 man hier 来查看目录结构说明。
[b]目录名称[/b]
[b]说明[/b]
/
UINX 系统的根目录,是目录的最上层。
/bin/
放置基本的使用者指令,是开机时必备的。
/boot/
系统开机时必需用到的设定。
/dev/
UNIX 系统将外围设备视为档案来管理,这个目录就是放置装置节点文件 (device node)。在 FreeBSD 5.0 以前 /dev/MAKEDEV 可以使用管理这些节点档的工具。5.0 以后这些 device node 都改由 devfs 来管理。
/etc/
放置系统的设定文件,例如使用者密码、群组等。
/etc/defaults/
放置预设的系统设定文件。请 man rc。
/etc/gnats/
gnats 的设定档,请 man send-pr。
/etc/isdn/
isdn 的设定档,请 man isdnd。
/etc/kerberosIV/
kerberos version IV 的设定档,请 man kerberos。
/etc/mail/
Sendmail 的设定档。
/etc/mtree/
目录权限的设定文件,请 man mtree。
/etc/namedb/
DNS 服务器的设定档,请 man named。
/etc/periodic/
每天、每周、每月定时要执行的设定,请 man periodic。
/etc/ppp/
ppp 的设定档,请 man ppp。
/etc/ssl/
OpenSSL 的设定档。
/kernel
开机时系统会加载的核心 (kernel)。在 FreeBSD 5.x 中,kernel 这个文件已被放在 /boot 目录中。
/modules/
Kernel 可以加载的模块,请 man kldstat。在 FreeBSD 5.x 中, 这个目录已被放在 /boot 目录中。
/mnt/
空目录,我们可以用它来作为暂时 mount 档案系统。
/proc/
系统执行中程序 (process) 数据,请 man procfs mount_procfs。
/root/
超级使用者 root 的家目录。
/sbin/
系统程序及管理工具的目录。
/stand/
这是安装磁盘上的指令。
/tmp/
暂存目录,许多程序都会需要暂存目录来存放数据。开机时会清除。
/usr/
包含主要的使用者工具及应用软件。您可以把它看成 Windows 中的 windows 目录及 program file 目录的集合。
/usr/bin/
一般的使用者指令及应用软件。
/usr/games/
一些小游戏。
/usr/include/
标准 C 语言的标头文件。
/usr/lib/
系统函式库。
/usr/libdata/
一些系统工具的数据库。
/usr/libexec/
系统服务程序 (daemons) 及工具。
/usr/local/
非 FreeBSD 所附的软件都会安装在这个目录下,我们在安装软件时最好都安装在这个目录。您可以将它视为 Windows 操作系统中的 program file 目录。这个目录中也有 bin sbin etc lib 等目录。
/usr/obj/
在编译 FreeBSD 系统时存放过程中暂存盘的位置。
/usr/ports/
FreeBSD ports 移植软件的原始程序目录,我们可以从这个目录中找到自己想要的软件来快速安装。
/usr/sbin/
可以让使用者执行的系统服务及工具。
/usr/share/
系统软件共享的数据库。
/usr/src/
放置 BSD 或其它软件原始程序代码的目录。
/usr/X11R6/
X Windows 的目录。
/var/
放置系统记录文件、暂存盘的目录。
/var/account/
使用者执行过的指令记录文件,请 man acct。
/var/at/
定时执行排程的数据文件。请 man at。
/var/backups/
系统重要档案的备份区。
/var/cron/
使用者排程的数据表,请 man cron。
/var/db/
重要的系统数据库。
/var/games/
内附的游戏纪录文件。
/var/log/
系统记录文件,我们可以在这里查看系统状况记录。
/var/mail/
使用者信件暂存区。
/var/preserve/
文件编辑时异常中止时,会将文件存到这个目录,请 man ex。
/var/msgs/
系统讯系的数据库,请 man msgs。
/var/quotas/
档案系统使用容量限制的记录。
/var/run/
记录系统开机后执行状态的暂存区。请 man utmp。
/var/spool/
列表机或邮件输出时的缓冲区。
/var/tmp/
系统暂存区,开机时不会清除。
/var/yp/
the NIS maps。
相对路径与绝对路径
我们可以看到 UNIX 系统的目录结构是树状结构,而我们可以使用 cd 这个指令来改变目前的工作路径。当我们要在目录之间移动时,必须要输入路径名称。而在输入路径时,有二种输入方式:相对路径及绝对路径。
所谓的绝对路径就是以「/」为开头的路径名称。「/」在 UNIX 中表示根目录,也可以用来分开各个目录的名称。所以从根目录开始,指定路径名称就称为绝对路径。例如「/usr/bin」就是一个绝对路径。
相对路径就是相对于目前路径的目录。如果您现在的所在目录 (工作路径) 是「/usr」,而 /usr/share/man 的相对路径就是「share/man」。
另外,有二个特殊的路径「.」及「..」。「.」所代表的是目前所在路径,而「..」表示上一层目录。因此,如果您的所在目录是 /usr,而 /etc 的相对路径就是「../etc」。
3.2.3 档案与目录管理
我们已经知道 UNIX 系统中的目录结构,接下来我们看看如何管理这些档案及目录。
观看档案内容
最基本的档案格式纯文字文件。如果您要观看纯文本文件内容,可以使用 cat 这个指令:# cat /etc/shells
# $FreeBSD: src/etc/shells,v 1.5 2000/04/27 21:58:46 ache Exp $
#
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.
/bin/sh
/bin/csh
/bin/tcsh
cat 这个指令会印出档案内容。不过如果档案案很大时,画面会一下子就卷走了。
如果您想要看一个比较大的文字文件,可以使用 more 或是 less 的指令,这二个指令会将档案内容分页显示,我们只要按 [Page Up]、[Page Down]、或是空格键就显示可以上一页或下一页。您也可以使用上下键来一行一行往上或往下卷。# more /etc/rc.firewall
如果您看到一半想要离开,可以按 [q] 键即可。另外,如果您想要在 more 及 less 的输出中搜寻一个字符串,可以按 [/] 之后,再输入相要找的字即可。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
您有没有注意到我们在使用指令 man 时也是分页显示,它其实就是使用 more,所以您也可以按 「q」来离开,或「/」来查找一个关键词。
档案与目录管理
我们简单介绍一下如何建立目录、复制档案、删除及搬移档案。首先,如果您要建立目录,可以使用 mkdir 这个指令:# mkdir myfolder
我们给 mkdir 指令一个参数 myfolder,表示建立一个名为 myfolder 的目录。这个目录的参数可以是相对路径也可以是绝对路径。建立了目录后,您可以使用 ls 看一下它是不是真的建出来了。
如果您要复制一个档案或目录,可以使用 cp 这个指令:# cp /etc/rc.firewall ./firewall
# cp /etc/rc ./
# cp -R myfolder folder1
上述第一行指令表示将 /etc/rc.firewall 复制一分到目前目录下,并命名为 firewall。如果您不指定档名,例如第二行指令,表示将该档案复制后维持同样的文件名称。如果您所要复制的是目录,必须加上 -R 的参数,如第三行指令所示。
接下来是重新命名档案或目录名称,重新命名或是搬移档案都是使用 mv 这个指令:# mv folder1 folder2
# mv firewall /tmp/tmpfile
# mv /tmp/tmpfile folder2
第一行指令表示将 folder1 更名为 folder2,第二行指令是将 firewall 这个档案搬到 /tmp 目录下,并更名为 tmpfile。而第三行指令是将 /tmp/tmpfile 搬到 folder2 目录下。我们可以看到第三行指令比较特别,因为 folder2 是已经存在的一个目录,所以在更名时,档案会直接被放在该目录下。如果 folder2 不存在时,第三行指令的结果就会变成是将 /tmp/tmpfile 搬到目录所在目录下,并更名为 folder2。
接下来我们看看要如何删除档案及目录:# rm folder2/tmpfile
# rm -rf folder2
第一行指令就是要删除 folder2 目录下的 tmpfile。如果您要删除的是目录,则必须加上 -r 的参数,如第二行所示。而参数 -f 表示强制删除,如果档案或目录不存在时,不要显示任何错误讯息。
文件名称规则
我们在命名档案或目录时,有一些特殊字符是不可以使用的,例如「/」表示根目录,而且会用来分开目录名称,所以不可以使用。另外,还有一些规则:
档案或目录不可以命名为「.」及「..」,因为它们分别代表目前的目录及上一层目录。
档案开头最好不要使用「-」,因为「-」会被 shell 认为是参数而忽略。
如果文件名称开头为「.」表示是隐藏档,在 ls 时,必须使用参数 -a 才会显示出来。
除此之外,有三个特殊字符在使用上要特别小心,分别是「\」、「*」及「?」。「\」在 UNIX 中是一个换行符号,也是一个跳脱字符。当我们在命令列要下一个指令太长时,可以使用「\」来换成,例如:# ls /usr/bin \  ? /usr/local
在上述指令中,我们第一行最后有一个「\」,按下 [Enter] 后,会出现一个问号的提示字符,接着我们可以再继续输入未完成的指令,最后的结果就好像是二行指令变成一行一样。
另外「\」还可以做为跳脱字符。例如,我们要建立一个文件名称就叫做「\」,这时候我们可以在 「\」的前面再加一个「\」,表示取消「\」的特殊意义。
「*」及「?」分别代表了「任何字」及「任何字符」,例如下列二行指令:# ls /etc/net*
/etc/netconfig     /etc/netstart     /etc/network.subr    /etc/networks
# ls /etc/rc.con?
/etc/rc.conf
第一行指令是要列出 /etc 目录下任何开头为 net 的档案,不管 net 后面有几个字都列出来。而第二个指令是要列出 /etc 下,任何开头是 rc.con,而最后一个字符是任何字的档案。
「*」表示任何字,不管是几个字符,而「?」表示任何字符,因为这二个字是特殊字符,我们不建议您用在档案命名上。如果您非要以这二个字为档名,必须在该字前面加上「\」来跳脱它的特殊意义。例如:# mkdir abc\*
# rm -r abc\*
搜寻档案
我们已经知道基本的档案管理了,接下来我们来看看要如何在茫茫人海中寻找一个档案。
如果您要找的是指令所在路径,可以使用 whereis:# whereis pwd
pwd: /bin/pwd /usr/share/man/en.ISO8859-1/man1/pwd.1.gz /usr/src/bin/pwd
我们可以看到 pwd 这个指令的位置是 /bin/pwd,另外还有它的使用手册及原始码路径也列出来了。
如果你要找的是任何类型的档案,可以使用 find。例如,我们要在 /etc 找 rc.conf 这个档案的位置:# find /etc -name rc.conf
/etc/defaults/rc.conf
/etc/rc.conf
find 的第一个参数是要找的路径名称,接着我们使用 -name 后面加上文件名称来找 rc.conf 这个档。如果您要找所有扩展名为 .conf 的档案,可以用下列指令:# find /etc -name "*.conf"
/etc/apmd.conf       /etc/host.conf    /etc/natd.conf       /etc/rc.conf
/etc/auth.conf       /etc/inetd.conf   /etc/newsyslog.conf  /etc/resolv.conf
/etc/devd.conf       /etc/login.conf   /etc/nsmb.conf       /etc/sysctl.conf
/etc/devfs.conf      /etc/mac.conf     /etc/nsswitch.conf   /etc/syslog.conf
/etc/dhclient.conf   /etc/make.conf    /etc/pf.conf         /etc/usbd.conf
更多 find 指令的用法请参考「指令应用」一章的说明。
3.2.4 重导 I/O 及管道
所谓的重导 I/O 就是重新导向输入或输出的数据。在 UNIX 中有所谓的标准输入和标准输出。标准输入指的是预设的输入方式,例如我们在输入指令时,标准输入就是键盘,而标准输出就是将结果输出到预设的输出装置,也就是我们的屏幕。
然而,我们也可以使用一些特殊字符将标准输入、输出导向到其它地方。如果我们要重新导向标准输出,可以使用「大于」符号「>」,例如,我们可以让指令 ls 的结果不要显示在屏幕上,而导向输出在档案中:# ls /etc > /tmp/result
上述指令的结果就会在 /tmp/result 中新增一个档案,内容就是 /etc 的档案列表。另外,我们可以使用 cat 这个指令及「>」来建立一个小的文字文件。cat 这个指令会将我们所输入的数据印在屏幕上,我们可以将输出重新导向到一个档案中:# cat > /tmp/result
/etc/rc.conf
/etc/rc.firewall
[Ctrl]+[d]
我们在输入指令后就可以开始输入内容,最后要离开只要按 [Ctrl]+[d] 即可。
上述指令中,我们使用一个「>」,它会建立一个新的档案 /tmp/result,如果该档案已存在,它会将档案清空。如果我们使用二个「大于」符号「>>」,则会在档案后面附加上内容,而不会清除档案原本的内容:# cat >> /tmp/result
/etc/rc
[Ctrl]+[d]
经过上述指令后,/tmp/result 就会变成有三行资料了。
那我们要如何重导标准输入呢?既然标准输出是「>」,标准输入自然就是「nslookup 指令可以用来查主机名称,它的使用方式如下:# nslookup
> twbsd.org
Server:         168.95.192.1
Address:        168.95.192.1#53
Name:   twbsd.org
Address: 220.132.178.72
> exit
执行了 nslookup 后,我们必须输入所要查找的主机名称,最后输入 exit 离开。我们可以新增一个档案,内容为多个主机名称,最后使用下列指令一次喂给 nslookup:# nslookup
除了重导 I/O 外,还有一个类似重导的功能,称之为管道 (pipe)。我们可以将一个指令的输出转向到另一个指令的输入,而转向的方式就是使用「|」的符号。例如,我们可以将 ls 指令的输出,转向到 more 这个指令进行分页:# ls /etc | more
另外有二个常用来和管道配合使用的指令「sort」及「grep」。sort 指令是用来做排序用,例如,我们可以将 ls 的输出结果依文件名称排序:# ls /etc | sort
而 grep 指令可以用来过滤我们想要的数据,例如,我们可以将 ls 的结果导向到 grep 去找出文件名有包含 rc 的档案:# ls /etc | grep rc
我们也可以在 grep 指令中加上参数 -v 表示要滤掉的字符串。例如下列指令就会滤掉文件名包含 host 的档案:# ls /etc | grep -v host
3.3 文书编辑器
因为许多系统设定都必须修改设定档,而修改设定文件必须使用文书编辑软件,所以在开始所有设定之前,让我们先来了解文书编辑器的用法。
我们将介绍 FreeBSD 内附的二套文书编辑软件 ee 及 vi。这二套软件都是在命令列模式下使用的软件,ee 是一套比较适合初学者的编辑器,它的使用方式和我们一般的使用习惯较接近,操作简单又容易上手。不过 ee 是 FreeBSD 特有的编辑软件,在其它的 UNIX 系统中无法使用。因此,我们也将介绍另一套所有 UNIX 系统都内附的编辑器 vi。
vi 是一套威力强大的工具,操作熟练的人会觉得如有神助,而对于初学者而言却是望之却步。是否要将 vi 练到出神入化见人见智,但对于一个 UNIX 系统管理者而言,我们至少要知道一些基本的操作方式。
3.3.1 ee
ee 是 FreeBSD 系统内附较适合初学者的文书编辑软件,它是 Easy Editor 的简称,顾名思义 ee 使用上十分容易。当您要编辑档案 example.txt 时,只要在命令列上打 ee example.txt 即可。执行 ee 之后将会出现下列画面:
图 3-3
[img]http://homepage.cqwu.net/wxfy/images/ch03_03.png[/img]
在画面最上方有使用说明,几乎我们所有的会使用到的功能都在最上方的说明中。您可以使用上下左右键来移动游标,并直接输入内容,以下为 ee 的指令说明,请注意我们将键盘上独立的按键以小于及大于的符号括起来,例如  表示键盘上 Ctrl 这个键:
[b]按键[/b]
[b]意义[/b]
+ [ 或  键
显示主选单。
+ o
输入 ASCII code,例如输入 65 就会显示 A。
+ u
跳到档案结尾。
+ t
跳到档案开头。
+ c
输入指令。在按了 Ctrl+c 后,上方选单会出现命令说明,例如您可以直接输入数字,表示将光标移到某一行。
+ y
搜寻。按了 Ctrl+y 之后,你可以输入欲搜寻的字符串。如果要搜寻下一个该字符串,只要再按 Ctrl+x 即可。预设的搜寻是不分大小写的,如果要区分大小写,您可以按 Ctrl+c 并输入 case 即可。如果要取消只要再按 Ctrl+c 并输入 nocase。
+ a
跳到行首。
+ e
跳到行尾。
+ d
删除光标所在位置的字符。
+ j
贴上上一次所删除的字符。
+ k
删除光标所在位置的一整行。
+ l
贴上上一次删除的一整行内容。
+ w
删除一个字。
+ r
贴上上一次所删除的字。
+ p
将光标移到上一行。
+ n
将光标移到下一行。
+ b
将光标移到上一个字,和方向键左键一样。
+ f
将光标移到下一个字,和方向键右键一样。
+ g
下一页。
+ v
上一页。
+ z
移到下一个字。
+
离开 ee。如果档案有修改过,它会问您是否要储存档案。
当我们按了  键时,会出现一个主选单,在选单中我们可以进行一些设定,如果您储存这些设定,它会被存在您的 home 目录下的 .init.ee,以 root 为例,设定档会存放在 /root/.init.ee。如果您要还原默认值,只需将该档删除即可。
3.3.2 vi
Vi 是一个历史悠久且功能强大的 UNIX 文书编辑器。在古早的年代,许多键盘都只有一些基本按键,连上下左右键都没有,所以 vi 大多数的功能都必须使用一些特殊的按键。
Vi 在使用时可以分成二种模式,一种是「编辑模式」,另一种则为「命令模式」。在编辑模式时,我们可以使用上下左右键来移动光标并编辑输入我们所要编辑的文字内容。而命令模式时,我们可以进行档案操作 (开文件、存盘等)、搜寻等功能。使用 vi 时,我们会很常按  键, 键可以让我们离开编辑模式并进入命令模式。请执行 vi example.txt 来编辑 example.txt 这个档案,一进入 vi 时,预设会处于命令模式,我们必需先输入 "o"、"i"、或"a"才能进入编辑模式。
以下即为进入编辑模式的指令:
[b]按键[/b]
[b]意义[/b]
i
Insert (插入),在目前光标前开始输入。
a
Append (附加),在目前光标后开始输入。
o
在光标下方新增一空白行并开始编辑。
O
在光标上方新增一空白行并开始编辑。
如果您输入错误,您无法使用  或  来删除,我们必须使用 vi 的其它命令来进行。请先按  来进入命令模式,接着您就可以使用下列指令来进行进阶编辑:
[b]按键[/b]
[b]意义[/b]
x
删除光标所在位置的字符。
dw
删除游标所在到字尾,即删除一个字。
dd
删除游标所在一整行。
d + 数字 +
删除从光标所在位置到其下方 n 行。例如输入 d5 ,将删除光标所在位置起 6 行。
yw
复制光标开始到字尾。
yy
复制游标所在一整行。
y + 数字 +
复制从光标所在位置到其下方 n 行。例如输入 y4 ,将复制光标所在位置起 5 行。
p
贴上上一次复制的内容。
:w
存档。
:w 文件名称
另存新檔。您必输在 w 后输入新的档名。
:q
离开 vi。如果档案有修改过会无法离开。
:wq
存档并离开。
:q!
不存档并离开。
接下来我们说明一下如何在档案中穿梭移动:
[b]按键[/b]
[b]意义[/b]
h
游标向左移。
j
游标向下移。
k
游标向上移。
l
游标向右移。
^
跳到行首。
$
跳到行尾。
w
游标跳到下个字的开头。
e
游标跳到下个字的结尾。
b
游标跳到上个字的开头
+ d
光标往下移动半个屏幕。
+ u
光标往上移动半个屏幕。
+ f
光标往上移动一个屏幕。
+ b
光标往下移动一个屏幕。
:数字
跳到 n 行,例如输入 :100 即可将光标移到第 100 行。
/欲搜寻的字符串
输入 / 后,您可以在 / 后输入所要搜寻的字符串,如果要找下一个,则直接按 /  即可。
只要您熟悉了上列指令,您大概就可以很轻松的使用 vi 了。Vi 还有许多功能,你可以 man vi 来获得更多信息。
3.4 Shell 环境简介
在 UNIX 系统中,使用者对于系统的操作是透过 "Shell",Shell 就好像是 DOS 中的 command.com 或 Windows 中的 explorer.exe。Shell 在接收到指令之后,会将它转换成机器可以读的语法来对系统进入操作。
FreeBSD 内附的 Shell 有 sh、csh、tcsh,sh 名为 Bourne Shell,它是 UNIX 系统中最悠久的 shell,所有的 UNIX 系统都会内附这个 shell,我们在写 shell scripts 时为了可移植性,大多使用 sh。在 FreeBSD 中 csh 和 tcsh 是一样的东西,csh 名称的由来是因为它的 scripts 语法和 C 语言很像。至于要使用哪一种 shell 全凭个人偏好,您也可以自行从 ports 中安装 Linux 用的 bash 或 ksh。
以笔者个人而言,写 shell scripts 自然是使用 Bourne Shell,而系统登入时,我偏好使用 tcsh。tcsh 除了有 3.2 节中提及的使用  键自动完成档名外,最重要的一点是它会自动搜寻上一次输入的指令 (history-search-backward)。
例如,我们输入下列指令:# ls /usr/port/www
# cd /usr/port/www
# cd /usr
在输入上述指令后,现在我们如果使用键盘方向键按上,将出现上一次所输入的指令内容。如果我们先打了 ls 再按方向键上,则 tcsh 会自动找出最近输入过开头为 ls 的指令,多按几次上它还会继续出现上上一次输入过的 ls 指令,很棒吧。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
FreeBSD 的 tcsh 有 history search backward 的功能是因为在 ~/.cshrc 中有二行:  
bindkey -k up history-search-backward
bindkey -k down history-search-forward
如果您不想使用 history search backware,只要将该二行删除即可。
如果您想变更自己所使用的 Shell,可以执行下列指令:# chsh -s /bin/tcsh
上述指令中,我们将所使用的 Shell 变更成 /bin/tcsh。请注意,您所输入的 shell 名称一定要存在于 /etc/shells 这个档中。系统预设的 shell 有 /bin/sh、/bin/csh、/bin/tcsh。如果想使用自行安装的 shell,您必须先将该 shell 的路径加入 /etc/shells 中才可以使用。
3.4.1 Shell 的环境变量
在 Shell 有所谓的环境变量,当我们在 shell 中执行指令时,这些环境变量可能会被该程序用来判断程序所要执行时的参数。例如,我们在执行 cal 这个指令时,我们不必打它的绝对路径 /usr/bin/cal,因为 shell 会自动依照 PATH 这个环境变量所设定的路径去找我们所输入的指令。您可以使用下列指令来看目前 PATH 这个变量的内容:# echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin
如果您使用 tcsh,您也可以打 setenv 来看目前所有的环境变量。以下为一些常用的环境变量:
[b]变量名称[/b]
[b]描述[/b]
USER
目前所使用的使用者名称。
PATH
执行指令所要搜寻的位置,以冒号隔开。
SHELL
目前所使用的 Shell。
TERM
目前所使用的终端机模式。
OSTYPE
操作系统名称。
MACHTYPE
系统所使用的 CPU 架构。
PAGER
当需要分页时,所要使用的分页软件,如 more 或 less。例如 man 这个指令就会参考您所设定的 PAGER 而使用 more 或 less。
EDITOR
预设所要使用的编辑器。
您也可以使用 setenv 来改变一个环境变量的值。例如,我们要将预设的文书编辑器改成 ee,在 tcsh 中可以使用:# setenv EDITOR ee
如果您使用的是 Bourne Shell:# export EDITOR="ee"
3.4.2 Tcsh 的环境设定
登入系统后,您会发现在光标之前有一个井字号 "#",这个井字号我们称之为提示符号 (prompt)。在 tcsh 及 csh 中,当以 root 登入时,预设的提示符号是 "#",而以一般使用者登入时,提示符号为 "%"。
FreeBSD 安装好后,我们必须做一些设定让 FreeBSD 使用起来更顺手。在预设的况状下,系统并不支持中文文件名,对于使用中文的人不太方便。另外,命令列提示符号的样子也不符合我们的需求。如果你想要客制化一些指令,也可以在这里加上去。所以在开始进行其它设定之前,我们先建立一个良好的使用环境。
在使用者登入后,Tcsh 会先去读取 /etc/csh.cshrc 及 /etc/csh.login 的设定,接着会读取该使用者家目录下的 .cshrc 及 .login。因此,我们可以经由设定这几个档案让设定使用者一登入时就生效。
首先编辑 /etc/csh.cshrc 加入下列设定:
setenv EDITOR ee
alias ls ls -F
set prompt = "%B%m [%~] -%n-> "
第一行设定是将预设的文书编辑器改成 ee。第二行是要将指令 ls 变成 ls -F,就是每次打 ls 时,系统会出现 ls -F 的效果。而第三行是将命令列的提示符号改成下面这样: mydomain [/home/john] -john->
就是开头是机器名称,再来是路径名称,最后是使用者名称。修改完 csh.cshrc 或 ~/.cshrc 后,您必须注销再登入才会看到修改后的效果。或者,您也可以使用下列指令来让修改立即生效:# source ~/.cshrc
由于在 /etc 下的 csh.cshrc 是通用的设定,但如果使用者自己的设定和通用设定一样时,会以使用者的设定为主。例如,在一般使用者的家目录下的 .cshrc 也有一行编辑器的设定,当设定不同时,会以使用者目录下的设定为主。因此,我们必须再编辑 ~/.cshrc,将 EDITOR 从 vi 改 ee,如此一来设定才会生效。
如果您希望日后每个新增的使用者的设定都是这样,则必须修改 /usr/share/skel/dot.cshrc 档案,该档内容的修改和修改 ~/.cshrc 一样,把 vi 换成 ee ,并加入 「alias ls ls -F」。因为在使用 adduser 指令新增使用者时,它会问你是否要将 /usr/share/skel/dot.file 复制到使用者目录下,因此我们就修改这里,让日后新增使用者时能使用该设定。
/etc/csh.cshrc 和 /etc/csh.login 的差别在于如果是使用者登入,二个档案都会被执行,如果是 scripts 则只会去读取 csh.cshrc。我们接下来要让使用者登入后可以支持中文的 console 环境,所以我们编辑 /etc/csh.login 并在最后面加入以下的设定:
# 支持中文的环境,让我们可以在 console 下或 telnet 中使用中文。
setenv LANG zh_TW.Big5
上述的环境变量设定会在使用者登入时自动被加载,一些程序 (例如 date) 会自动读取这些变量,并产生中文的讯息。不过由于我们的 console 尚未支持中文,我们必须先安装中文终端机软件,或在支持中文的 PC 上使用 telnet 登入。别急,我们会在下面几节中说明如何安装中文终端机。
3.5 使用者及权限管理
由于 FreeBSD 和所有的 UNIX 系统一样,在设定上都是为了支持多个使用者的环境,所以在使用者管理上必须考量到多个使用者同时使用时所会造成的影响。例如使用者 A 不可以删除使用者 B 的数据,某些使用者可以存取某些数据夹,某些则否。为了让系统管理更有效率,在支持多人使用的操作系统中,都有群组及权限的观念。
在 UNIX 系统中,每个使用者「至少」会属于一个群组,我们可以针对不同使用者或不同群组来设定他们在系统中的使用权限。以学校为例,每一个不同科系的学生都可以自由使用该科系中的资源。例如,只有资工系的学生可以使用资工系计算机教室、研究室等,这个「科系」就是使用者的预设群组。管理者可以针对这个群组去设定该群组可以使用的资源,而不必针对一个个学生设定。而每个学生还可以参加多个社区,例如管乐社、吉他社等。而只有该社团的成员才可以使用社团资源,如借用乐器、申请经费。这时候我们就可以把社团看成一个个使用者额外加入的群组。
上述例子中,在 UNIX 系统的实际情形可能是有一个使用者「u654321」,它的预设群组是「csie」,同时,他也是「guitar」群组。日后有新的资工学生时,我们只要将它加入「csie」群组即可,他就会具有资工学生的所有功能,而不必在新增使用者时去设定很多权限。
所以我们在新增使用者时,必须指定他的群组,预设的群组是一个和使用者同名的新群组,我们先来看看新增使用者的过程,请使用指令 adduser 来新增使用者。系统会问您一些问题:
# adduser
Username: jack
执行了 adduser 之后,首先要输入使用者名称,使用者名称除了英文字、数字及 -_ 外不可以包含其它特殊字符。
Full name: Jack
接着我们要输入使用者全名,这个字段可以是空的,如果您不输入则直接按 Enter 即可。
Uid (Leave empty for default):       
这个字段是使用者编号,直接留白按 Enter 即可,系统会自动指定。
Login group [jack]:
输入使用者群组名称,群组名称预设会自动产生一个和新增的使用者同名的群组,如果要使用不同的群组,必须先手动新增群组。我们直接按 Enter 即可。
Login group is jack. Invite jack into other groups? []: wheel
是否要将新的使用者加入其它群组,由于这是我们新增的第一个一般使用者,所以我们将它加入系统管理者 wheel 这个群组,让他可以使用 su 这个指令来切换身份成 root。
Login class [default]:
登入的类别,这是用来分类控制使用者对于系统资源的使用,请参考「使用者管理」一章中关于系统资源限制的说明。在这里我们直接按 Enter 使用默认值即可。
Shell (sh csh tcsh nologin) [sh]: tcsh
输入所要使用的 Shell,建议输入 tcsh,如果您不想让该使用者登入系统,可以输入 nologin。
Home directory [/home/jack]:
输入使用者的家目录,也就是使用者在系统中的数据夹,所有使用者的目录我们都放在 /home 下,所以我们直接按 Enter 即可。
Use password-based authentication? [yes]:
是否要使用密码认证的方式,预设为是,我们直接按 Enter 即可。
Use an empty password? (yes/no) [no]:
是否要使用空密码,预设为否。
Use a random password? (yes/no) [no]:
是否使用随机产生的密码,如果使用随机产生的密码,在新增完毕后,系统会告知我们产生的密码,预设为否。
Enter password:
输入该使用者的密码。
Enter password again:
再输入一次密码,以确认输入无误。
Lock out the account after creation? [no]:
在新增完使用者后,是否要先将该账户关闭。
最后会显示我们刚才输入的结果:
Username : jack
Password : *****
Full Name : Jack
Uid : 1003
Class :
Groups : jack
Home : /home/jack
Shell : /bin/tcsh
Locked : no
OK? (yes/no): y
如果全部 ok 则输入 y。
adduser: INFO: Successfully added (jack) to the user database.
Add another user? (yes/no): n
Goodbye!
最后系统会询问我们是否要新增另一个使用者,如果没有则按 n 离开。
新增完使用者后,我们可以看到 /home 目录下多了一个使用者 jack 的目录:
# ls -la /home
drwxr-xr-x  10 root    wheel      512  3 21 16:12 ./
drwxr-xr-x  21 root    wheel      512  1 14 06:29 ../
drwxr-xr-x  13 jack    jack      1024  3 21 16:05 jack/
"." 及 ".." 这二个目录分别代表着目前所在的目录及上一层目录,我们可以看到它的拥有者是 root,群组是 wheel。而 jack 这个目录的目录的拥有者是 jack,其群组也是 jack。
图 3-4
[img]http://homepage.cqwu.net/wxfy/images/ch03_04.png[/img]
在 ls 结果的第一个字段表着该档案或目录的存取权限,该字段共有十个字符,第一个字符表示档案的类型,以 jack 这个目录为例,它的类型是目录,所以第一个字是 d,如果是一般的档案,则第一个字是 - 。除了目录和一般档案之外,还有可能有「l」表示是连结档 (link)、「b」及「c」代表装置文件 block device 及 charactor device。连结文件就像是 Windows 系统中的快捷方式,而装置文件是 FreeBSD 用来管理硬件的方式,FreeBSD 会将键盘、硬盘等装置都用装置文件来管理,而这些装置文件都放在 /dev 中。
除了档案类型外,接下来的九个字符,以三个为单位,分别代表着使用者 (User)、群组 (Group)、及其它人 (Others) 的权限:
r:可以读取,代表数字 4。
w:可以写入,代表数字 2。
x:如果是档案的话表示可以执行该程序;如果是目录表示可以进入让目录。代表数字 1。
-:表示无权限,代表数字为 0。
我们看到 jack 这个目录,它的权限是 rwxr-xr-x,前三个字 rwx 表示使用者 jack 对于这个目录有读取、写入及进入目录的权限;接下来的 r-x 表示 jack 群组可以读取及进入该目录,但无法写入数据;最后三个 r-x 表示其它使用者可以读取、进入该目录。
在 UNIX 世界中,档案的类型和扩展名完全没有关系,扩展名只是我们一般的命名习惯,只是参考用。档案是否为可执行档,除了档案本身必须要是可执行外,档案权限方面一定要有执行的权限才行,也就是执行的人必须对于该档案有「x」权限。
使用者的权限除了可以使用 rwx 来表示外,我们也可以使用数字来设定权限。假设档案拥有者的权限为 rwx,由于 r 代表的数字是 4、w 是 2、x 是 1,所以档案拥有者的权限就是 4+2+1,也就是 7。同理,如果群组的权限是 r-x,则数字表示为 4+0+1,也就是 5。如果我们要将权限设成 rwxr-xr--,则数字就是 754,如下图所示:
图 3-5
[img]http://homepage.cqwu.net/wxfy/images/ch03_05.png[/img]
假设我们要更改档案 file.txt 的权限为 rwxr-xr-- (754),我们可以使用 chmod 这个指令:# chmod 754 file.txt
我们上面提及的权限都是以三位数字来表示,另外我们也可以使用四位数字表示。所谓的四位数字是指在原本的三位数之前加上一个关于档案形态的设定。
数字 4,Set User ID (SUID) 或 Set Group ID (SGID)。表示该档案在执行时会以档案拥有人或群组的身份执行。
数字 2,如果该档案可以被执行(具 x 权限),则在执行时会以拥有者群组的身份执行。如果是不能被执行的档案,在读写时会控制不能让多个程序同时存取(locked)。
数字 1,sticky。如果将档案设为所有人都可以读写,并设定 sticky,则所有人都可以修改该档案,但是不能删除。如果是目录开放读写权限,但设定了 sticky,则使用者只能新增档案,不能删除,这个可以应用于 FTP 的上传区。
假设我们要设定档案 myfile 可以被所有人读、写、执行,并设定 sticky:# chmod 1777 myfile
除了使用数字一次设定权限之外,我们也可以分别针对档案的使用者、群组及其它人来设定权限。chmod 这个指令在权限的参数部份,除了使用数字外,也可以使用 (对谁)(做什么动作)(权限) 这种语法。
[b]项目[/b]
[b]使用的字符[/b]
[b]代表意义[/b]
对谁
u
使用者 (User)
对谁
g
群组 (Group)
对谁
o
其它人 (Others)
对谁
a
所有人 (All)
做什么动作
+
增加权限
做什么动作
-
移除权限
做什么动作
=
直接设定权限
权限
r
读取
权限
w
写入
权限
x
执行
权限
t
Sticky
权限
s
Set UID 或 GID
例如,我们要设定其它人对档案 file.txt 只有读取及执行的权利:# chmod o=rx file.txt
更多 chmod 的用法,请参考「指令应用」一章中的说明。
3.6 系统服务及行程管理
FreeBSD 和其它常用的操作系统一样都是多任务的环境,我们可以同时执行数个工作,例如同时听音乐、开浏览器上网。在系统一开机后,便会自动执行许多程序来维持系统的正常运作。这些正在执行的程序我们称之为行程 (process)。
3.6.1 行程
每一个行程都有一个与众不同的编号,称之为 process id (PID)。所有正在执行中的程序都需要使用到一些系统资源,例如内存、CPU 等等。PID 的做用就是让系统可以根据这一个独特的编号来做资源的调配及工作排程。当我们在进行管理这些程序时,也必须要依照 PID 来区分不同的行程。
几乎所有的行程都是由其它程序所呼叫执行的,这个呼叫、执行一个新的行程的人是该行程的 parent。例如当我们执行了 ls 时,ls 这个行程的 parent 就是我们当时所使用的 shell。唯一没有 parent 的例外是 init 这支程序。当 FreeBSD 开机执行完系统核心程序之后,会自动执行 init 这支程序,由于这是开机后所执行的第一支程序,所以它的 PID 是 1。init 执行之后,会再呼叫其它程序,例如 /etc/rc 来启动开机必须执行的系统设定等。
每一个行程和档案、目录一样,都有行程的拥有者及群组。程序执行之后,可能必须要开启某些档案或对于系统装置进行存取,而使用这些资源时,即是以该行程的拥有者及群组的身份进行存取。
我们可以使用 ps 这支程序来取得行程的信息,以下即为 ps 指令的输出结果:
# ps
PID    TT  STAT   TIME      COMMAND
77393  p0  ILs    0:00.02   login [pam] (login)
78056  p0  IL     0:00.02   su
78057  p0  SL     0:00.02   _su (tcsh)
78074  p0  RL+    0:00.00   ps
89678  v0  ILs+   0:00.01   /usr/libexec/getty Pc ttyv0
78073  v1  SLs+   0:00.01   /usr/libexec/getty Pc ttyv1
616   v2  ILs+   0:00.00   /usr/libexec/getty Pc ttyv2
617   v3  ILs+   0:00.00   /usr/libexec/getty Pc ttyv3
618   v4  ILs+   0:00.00   /usr/libexec/getty Pc ttyv4
619   v5  ILs+   0:00.00   /usr/libexec/getty Pc ttyv5
620   v6  ILs+   0:00.00   /usr/libexec/getty Pc ttyv6
621   v7  ILs+   0:00.00   /usr/libexec/getty Pc ttyv7
我们可以看到第一个字段是 PID,它的范围从 1 到 99999,当用完了 99999 后,系统会自动从头开始找一个没人用的 PID 来使用。Kernel thread 的 PID 是 1 到 100,100 以后才是供一般使用者程序使用。TT 这个字段是我们正在使用的 tty,如果是在 console 前执行的执令,则 tty 为 ttyvX,如果是 telnet 到系统中,则 tty 为 ttypX。STAT 字段为目前该程序的状态,您可以 man ps 以查询各个 state 所代表的意义。TIME 则是该程序所使用的 CPU 时间。最后的字段 COMMAND 则是该程序被执行时所下的指令。
除了 ps 之外,我们也可以使用 top 来查看所有行程的状态:
# top
last pid: 78151;  load averages:  1.11, 1.04, 1.01   up 27+14:45:03  18:02:07
51 processes:  3 running, 48 sleeping
CPU states:  0.2% user, 96.8% nice, 1.5% system, 1.5% interrupt, 0.0% idle
Mem: 114M Active, 45M Inact, 64M Wired, 12M Cache, 34M Buf, 7952K Free
Swap: 512M Total, 372K Used, 512M Free
PID USERNAME  PRI NICE   SIZE    RES STATE    TIME   WCPU    CPU COMMAND
235  root      96    0  1616K  1044K select 114:50  0.05%  0.05%  natd
425  root      96    0  9644K  4836K select   2:02  0.00%  0.00%  httpd
4872 root      96    0  3900K  2048K select   1:40  0.00%  0.00%  top
470  root      96    0  3776K  2240K select   1:39  0.00%  0.00%  sendmail
290  root      96    0  1312K   764K select   0:30  0.00%  0.00%  syslogd
490  root       8    0  1336K   864K nanslp   0:17  0.00%  0.00%  cron
   
top 这个指令会每二秒自动更新一次。我们可以看到 top 的输出分成二个部份,最上方是目前关于行程的的系统状态。包含最后一个 PID (last pid)、系统负荷 (load average) 、已开机时间 (up)、总共有多少行程正在执行中、及 CPU 和内存的使用量等等。第二个部份和 ps 一样,列出 PID、行程的拥有者、及其它和行程相关的状态。其它更多关于 ps 及 top 的用法,请参考「指令应用」一章的说明。
3.6.2 系统服务及行程管理
我们每执行一个指令,都会产生一个新的行程,有的程序在执行完毕后,就会结束离开;而有的程序会常驻在系统中。例如当我们执行 ls 这个指令时,会产生一个新的行程,在该指令列出了目录或档案信息后,便会立即结束。而像网页服务器所执行的 httpd 这类的程序,会一直常驻在系统中,随时等候联机的要求,这种常驻的程序称之为 daemon。
Daemon 这个字是由希腊神话而来,Daemon 是一只会跟随在主人身边的小恶魔,它是个调皮的小东西,会帮人类做一些有用的事。不过它本身并没有善恶之分,也可能会做出不好的事情,全看人类本身。
FreeBSD 系统内附的 daemon 在命名上大都依循一定的规则,例如 FTP daemon 所执行的程序是 ftpd,而负责 telnet 服务的 daemon 叫做 telnetd,大到上就是在该服务的名字后面加上一个 "d" 结尾。其它非 FreeBSD 内附的程序大都有类似的规则,像 Apahce 这种网络服务器的主要执行程序为 httpd。但也有例外的程序,例如系统中的邮件服务器 Sendamil,它的执行档是 sendmail 而非 smtpd 或 maild。
通常 daemon 在执行后,会将自己的 PID 以扩展名为 .pid 的档案写在 /var/run 目录下,例如 /var/run/syslogd.pid 、/var/run/cron.pid。该档案的内容为该 daemon 的 PID,可以让我们直接看该档案而得知该程序的行程编号。
有时候我们可能会需要和正在执行中的 daemon 沟通。例如当我们修改了 /etc/syslog.conf 这个 syslogd 所使用的设定档时,我们必须告诉它这个档被修改过了,请重新读取。和 daemon 沟通的方式就是传送给它一个信号 (signal),程序在收到信号后,会依照信号的类别做不同的事。以上述要求 syslogd 重新读取设定档为例,我们会送给它一个 SIGHUP 的信号。
除了 SIGHUP 外,如果我们想要终止一个程序的执行,可以传送 SIGTERM 或 SIGKILL 的信号。SIGTERM 表示通知正在执行中的程序我们希望它中止执行,如果该程序中有接收 SIGTERM 的机制,它可以做一些离开前的处理,例如关闭所开启的档案、结束某些正在执行的动作等等。然而,收到 SIGTERM 的程序也可以选择忽视,但 SIGKILL 则是不管程序是否在忙着其它事情,都必须中即停止,而且这个信号是不可以被忽视的。所有的信号都可以使用数字来表示,例如 SIGHUP 可以使用数字 1 表示、SIGTERM 为 15、SIGKILL 为 9。
系统中传送信号的指令是 kill 这个指令,假设我们要送一个 SIGHUP 的信号给 PID 为 199 的程序,我们可以使用下列指令:# kill -HUP 199
上述指令中的参数 -HUP 也可以使用 -1 来取代。
值得注意的是,只有超级使用者 root 可以送信号给不属于自己的行程,而一般使用者只能管理自己的行程。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
管理者可以对系统有最大的控制权,您可以使用 kill 去删除其它使用者正在执行的工作。例如,若有人正在复制档案,而系统变得很慢,您可以先使用 ps 去查出该指令的 PID,再用 kill -9 去停止该指令。而如果该使用在正在在线,他会在 console 中看到该指令被 killed 的讯息。
3.6.3 基本系统服务 inetd
在系统中有一个专门负责各式网络服务的超级服务器 "inetd"。 我们可以经由修改设定文件请它负责许多网络相关的服务,例如 telnet、ftp、ssh 等。当有 telnet 联机要求时,inetd 会依照设定执行负责 telnet 服务的 telnetd 这支程序,再将主导权转手给 telnetd,并继续等待下一个联机要求。若下一个联机是 ftp,则 inetd 会呼叫 ftpd 这支程序来负责。
其实像 ftpd 这类的程序,它本身也可以自己成为一支 daemon,由自己等待 ftp 的联机要求,而无需经由 inetd。使用 inetd 来管理这些网络服务的好处是我们不必为了提供十种网络服务而执行十个常驻程序。每一个常驻程序都会占用一些系统资源,而使用一个 inetd 来统筹,可以让这些资源空出来。另外,inetd 也可以用来过滤联机来源,针对不同的联机,我们可以使用 inetd 内建的 TCP Wrapper 功能来进行联机网域的限制,相关设定我们会再后续章节中提及。
有优点就会有缺点,使用 inetd 来管理网络服务固然有其优点,但对于联机较频繁、需要更快反应的服务而言并不合适。以 FTP 为例,一个联机进来,inetd 都必须重新执行一次 ftpd。如果我们是以 daemon 的方式,让 ftpd 常驻于系统中,则当有联机要求时,我们就可以直接将自己复制一份出来进行 ftp 服务,而不需重头执行。所以对于一台大型的 FTP 服务器而言,通常会使用独立 daemon 的方式。而一些较少使用的服务,如 telnet、ssh 等就交由 inetd 来处理。
FreeBSD 预设并不会启动 inetd,所以如果我们想要让它在一开机就执行,必须在 /etc/rc.conf 中加入下列设定:
inetd_enable="YES"

[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
修改了 rc.conf 之后,必须重新开机 inetd 才会启动。或者,您也可以手动执行下列指令来立即启动 inetd:# inetd -wW -C 60
我们在执行 inetd 时给了几个参数,表示要使用内建的 TCP Wrapper 功能,并限制每个 IP 来源一分钟内最多可以建立联机 60 次。这是系统开机时预设会给的参数 (在 /etc/defaults/rc.conf 中的 inetd_flags 指定)。
假设我们想要让 inetd 负责 telnet 及 ftp 服务,我们必须修改 /etc/inetd.conf ,将 telnet 及 ftp 前的 "#" 拿掉,如下所示:
# $FreeBSD: src/etc/inetd.conf,v 1.63 2003/06/09 21:04:30 markm Exp $
#
# Internet server configuration database
#
# Define *both* IPv4 and IPv6 entries for dual-stack support.
# To disable a service, comment it out by prefixing the line with '#'.
# To enable a service, remove the '#' at the beginning of the line.
#
ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l
ftp     stream  tcp6    nowait  root    /usr/libexec/ftpd       ftpd -l
#ssh    stream  tcp     nowait  root    /usr/sbin/sshd          sshd -i -4
#ssh    stream  tcp6    nowait  root    /usr/sbin/sshd          sshd -i -6
telnet  stream  tcp     nowait  root    /usr/libexec/telnetd    telnetd
telnet  stream  tcp6    nowait  root    /usr/libexec/telnetd    telnetd
#shell  stream  tcp     nowait  root    /usr/libexec/rshd       rshd
#shell  stream  tcp6    nowait  root    /usr/libexec/rshd       rshd
#login  stream  tcp     nowait  root    /usr/libexec/rlogind    rlogind
#login  stream  tcp6    nowait  root    /usr/libexec/rlogind    rlogind
#finger stream  tcp     nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
#finger stream  tcp6    nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
#exec   stream  tcp     nowait  root    /usr/libexec/rexecd     rexecd
  
接着,再使用下列指令来启动 inetd 服务:# /usr/sbin/inetd -wW -C 60
如果 inetd 已经被启动了,而我们修改过 inetd.conf 必须要求 inetd 重新读取设定档:# kill -HUP `cat /var/run/inetd.pid`
请注意这里 `cat /var/run/inetd.pid` 所使用的 ` 是键盘左上角的那一个符号,而非单引号。
不过我们建议您使用 ssh 联机以取代 telnet,因为 ssh 是以加密过的方式联机,比较不会以明码的方式传送数据。您可以使用 putty 这个软件在 MS windows 下联机到 FreeBSD 中。您可以从 [url]http://www.chiark.greenend.org.uk/~sgtatham/putty/[/url] 下载 putty,也可以在本书光盘二的 wintools 目录下找到该软件。
当然,您也可以在FreeBSD中使用 ssh 的方式连到别台机器,FreeBSD 中内建有 ssh 软件,你可以使用下列指令:# ssh jack@123.123.78.9
这个指令表示以使用者 jack 身份联机到 123.123.78.9,我们也可以使用主机名称的方式,例如[email]jack@dns.abc.edu.tw[/email] ,或者也可以只打 ssh dns.abc.edu.tw 来登入,此时登入名称会是您现在用的使用者名称。
如果所联机的站台是第一次使用 SSH联机,则会出现下列一堆东西,表示接收到所联机站台RSA key,并询问您是否要继续连接。此时打 "yes" 三个字即可:
The authenticity of host '123.456.78.9' can't be established.
RSA key fingerprint is 13:96:8a:61:31:cf:32:3f:7a:0a:77:ad:7e:49:e7:3f.
Are you sure you want to continue connecting (yes/no)?  yes
系统会将所接收到的金钥 (key) 存放在使用者家目录下的 .ssh/known_hosts 档案中。如果日后在 known_hosts 目录中所记录的站台金钥有变更时,我们可以编辑该档案以删除旧的金钥。
设定到这里后,就可以不必在机器前作业了。通常我的习惯是设定到这个地方后,就使用 telnet 或 ssh 的方式经由其它计算机联机到机器来作其它的设定,这样我就不必一定要待在机器前,可以在自己家中使用别的机器联机到 FreeBSD 中做设定。不过要注意的是 root 账号预设是不能使用远程登入,如果您想使用远程登入并拥有 root 的权限,您必须先使用一般的使用者登入后,再执行 su 这个指令来切换身份成为 root,而且这个使用者必须加入 wheel 群组中。假设您在新增使用者时并未将该使用加入 wheel 群组,您可以手动编辑 /etc/group 来加入该使用者…。例如我们要让一般使用者 alex 拥有 su 成为 root 的权限:
wheel:*:0:root,alex
3.6.4 定时执行工作
在 FreeBSD 系统中,系统常常会定时执行一行工作,例如,每天的系统信息统计、系统安全检查等。而系统管理者及一般使用者也可以设定定时执行一些工作,这些工作可以时只执行一次、或是定时重复执行。
如果是要设定只执行一次的工作,例如,设定在今天 10:00 时执行某个指令,我们可以使用「at」这个指令。如果是要设定重复报行的工作,例如,设定每天 12 点执行某个指令,我们可以使用「crontab」这个指令,或者是由系统管理者编辑 /etc/crontab 这个档案来进行设定。我们先来看看「crontab」重复定时执行程序的说明:
「crontab」重复定时执行程序
在 UNIX 系统中,有一个背景程序会定时执行一些工作,这个程序在 FreeBSD 中称为「cron」。「cron」这个程序会定时去检查 /etc/crontab 及 /var/cron/tabs 中的档案,并执行其中的设定。/etc/crontab 可以让管理者设定要以什么使用者的身份去执行定时工作,而一般使用者如果要设定定时执行工作时,可以使用指令 crontab -e 来编辑自己的定时执行工作,crontab 会将使用者的工作设定放在 /var/cron/tabs 中。
我们先来看一下 /etc/crontab 的内容说明:
# 设定使用的 shell, 路径
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
# 设定执行指令时的目录
HOME=/var/log
# 当指令有输出数据时,要将输出的东西寄给谁。
MAILTO=""
#
# 分        小时        天        月        星期几        身份        指令
#minute        hour        mday        month        wday        who        command
#
*/5        *        *        *        *        root        /usr/libexec/atrun
minute:代表一小时内的第几分,范围 0-59。
hour:代表一天中的第几小时,范围 0-23。
mday:代表一个月中的第几天,范围 1-31。
month:代表一年中第几个月,范围 1-12。
wday:代表星期几,范围 0-7 (0及7都是星期天)。
who:要使用什么身份执行该指令,当您使用 crontab -e 时,不必加此字段。
command:所要执行的指令。
小时的字段中如果是 *,表示每小时,天的字段中如果是 *,表示每天,依此类推。字段中也可以使用 "-" 来表示范围。例如,在小时的字段中填 8-11,表示执行的时间是 8,9,10,11,共四次。
字段中也可以用逗点来表示,以分的字段而言, 1,2,5,9 表示将在 1,2,5,9 分时各执行一次。我们也可以写成像这样 1-2,12-14 ,表示在 1,2,12,13,14 分各执行一次。
另外,也可以用 / 后面加数字表示每几分钟要执行一次。如在分的字段填 0-23/2,表示 1-22 分之间,每隔二分钟执行一次,也就是 0,2,4,6,8,10,12,14,16,18,20,22。如果在分的字段是 */5,表示每五分钟一次。
除此之外,在时间的字段中,我们也可以用一个开头为 @ 的字符串来表示各种排程时间意义:
[b]字符串[/b]
[b]代表意义[/b]
@reboot
开机时跑一次。
@yearly
每年跑一次,等于 "0 0 1 1 *"。
@annually
和 @yearly 一样。
@monthly
每月跑一次,等于 "0 0 1 * *",也就是每月一日半夜 12 点执行。
@weekly
每周跑一次,等于 "0 0 * * 0",也就是每个周日半夜 12 点执行。
@daily
每天跑一次,等于 "0 0 * * *",也就是每天半夜 12 点执行。
@midnight
和 @daily 一样。
@hourly
每小时跑一次,等于 "0 * * * *"。
另外,我们还可以在档案中以「key = value」的方式设定在执行指令时的环境变量。例如,一般指令有输出执行结果时,会自动寄给 root,我们也可以设定「MAILTO = ""」表示不要将输出结果寄出。
以下为几个时间设定的范例:
# 分        小时        天        月        星期几        身份        指令
#minute        hour        mday        month        wday        who        command
#
# 设定每 5 分钟执行一次atrun。
*/5        *        *        *        *        root        /usr/libexec/atrun
# 设定每天一点零一分时执行 /bin/check
1        1        *        *        *        root        /bin/check
# 设定每周一 3:11 分执行 week_check
11        3        *        *        1        root        /usr/local/week_check
# 设定每天一点及四点的零到二十三分中间,每二分钟执行一次 something。
0-23/2        1,4        *        *        root        /bin/something
# 设定每天半夜十二点执行 something。
@daily        root        /bin/something
如果你以一般使用者或是管理者的身份执行 crontab -e 来设定 crontab,你不必设定身份的字段,因为 crontab 会自动取得您的身份。使用 crontab -e 所设定的工作会被放在 /var/cron/tabs 目录中,所以如果要备份或升级时,应该要注意这些档案是否要备份。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
我们在安排 crontab 时,应该要错开每个程序的执行时间,才不会有一大堆程序同时执行,造成系统负荷过高。
「at」设定只执行一次的程序
cron 可以用来设定不断的重复定时执行一些工作,然而,如果您只希望在某个时间执行「一次」某个指令,可以使用「at」。
「at」的设定可以分为三个指令:「at」用来建立工作、「atq」用来列出目前待执行的工作有哪些、「atrm」用来删除 atq 中所列出的工作。当您执行了 at 后,它会要求您在命令列中以 shell scripts 的写法输入想要执行的指令,而您也可以先将所要执行的指令写再一个档案中,再让 at 去执行。
在使用 at 指令时,必须先输入您要在什么时候执行工作,而时间的格式可以是下列任何一种:
[b]格式[/b]
[b]说明[/b]
at 10pm
设定晚上十点执行。时间的格式可以是 HHMM 或 HH:MM。
at 8:30am Oct 10
设定十月十日早上八点半执行。
at midnight Jan 1 2005
设定 2005 年一月一日的第一秒钟执行。
at teatime
设定在下次的下午 4 点执行。teatime 表示是 4:00pm,而 midnight 表示半夜十二点,noon 表示中午十二点。
at -t MMDDhhmm
表示在 MM 月 DD 日 hh 时 mm 分时执行,您还可以在 MM 前加上年,而年的格式二位或是四位都可以。
如果您要设定在 10pm 执行某些工作,您可以打「at 10pm」后按 ,接着您必须开始输入所要执行的指令,在全部输入完成后,请按 +结束编辑。如果您不想使用命令列编辑的方式输入所要执行的工作,您可以先写一个 shell script 并使用下列指令设定:# at -f mycommand.sh 10pm
上述指令中,您所写的 shell scripts 档案是 mycommand.sh。
在设定之后,接着您可以使用下列指令列出目前等待执行的 at 工作:# atq
Date                                 Owner          Queue   Job#
2005年 6月 5日 周日 22时00分00秒 CST    root             c      2
如果您要删除某一个工作,只要使用 atrm 并输入该工作在 atq 中的 job id 即可。例如,我们要删除 ID 为 2 的工作:# atrm 2
限制一般使用者使用 cron 及 at
大部份的情况下,一般使用者应该不会需要使用定时排程的工作。如果您发现有使用者定时会执行一些耗费系统数据的工作,我们可以为这个指令设限,只允许必要的使用者执行。
如果要限制使用 crontab,只需要在 /var/cron 目录中,加入 allow 或是 deny 这个档即可。例如,我们只允许少数几个使用者执行 crontab,我们可以新增 /var/cron/allow 这个档,内容为该使用者的名称。相对的,如果我们要限制少数几个使用者执行 crontab,只要编辑 /var/cron/deny 这个档即可。而指令 at 的限制也是一样,不同的只是允许执行 at 指令的名单是 /var/at/at.allow,而拒绝的名单是 /var/at/at.deny。
3.7 虚拟终端机
大多数的时候,我们都是在命令列模式 (文字模式) 下执行系统管理的工作,命令列模式相较于图形模式而言,所使用的系统资源较少,同时也是一般 UNIX 最常使用的模式。
在系统一开机后,屏幕上会出现类似下列画面:
Fri Mar 20 14:05:16 CST 2005
FreeBSD/i386 (example.com) (ttyv0)
login:
我们看到第二行的部份有一个 ttyv0,ttyv0 所代表的是编号为 0的系统 console 终端机。我们在该机器面前所使用的屏幕中文字模式的画面就叫做 console,我们可以在 console 下执行许多指令。FreeBSD 一开机后就会建立让多虚拟的 console 终端机机,我们可以同时开机多个 console 画面同时进行操作。您可以使用 ALT+F2、ALT+F3、…直到 ALT+F8 来切换不同的 console 画面。当您使用 ALT+2 时,您会看到前面所提及的 login 画面,而画面上有一个 ttyv1 的字样。如果您要切换回 ttyv0 只要按 ALT+F1 即可。
当我们使用 telnet 或 ssh 进入系统时,我们所看到的虚拟终端机是 ttyp0、ttyp1 等等。关于各种 tty 权限的设定被记录在 /etc/ttys 这个档案中。
console none                            unknown off secure
#
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
# Pseudo terminals
ttyp0   none                    network
ttyp1   none                    network
ttyp2   none                    network
……
这个档案中设定了每一个不同的终端机类型可以使用的权限,例如 ttyv0 最后面都有一个 secure 的字样,而 ttyp0 则无,表示 root 可以从 ttyv0 登入,但不可以从 ttyp0 登入,这也就是为什么 telnet 进来时,不可以使用 root 登入的原因。如果您想让 root 可以使用 telnet 登入,只要在 ttyp0、ttyp1 等行加入 secure 即可,但我们并不建议做这样的设定。更多关于 ttys 这个档案的格式及其设定,请 man ttys。
3.7.1登入后的讯息
在您登入系统之后,屏幕会自动秀出一段文字,这段文字称为 Message Of The Day(motd)。这一段文字是可以修改的,你可以编辑 /etc/motd 来制作自己的画面。如果你想使用像 BBS 中的文书编辑软件,来画 ANSI 图的话,你可以安装 ve 这个软件。# cd /usr/ports/chinese/ve
# make install clean
再使用 ve /etc/motd 来修改讯息。例如笔者所使用的画面如下:
图 3-6
[img]http://homepage.cqwu.net/wxfy/images/ch03_06.png[/img]
您可以在本书第二片光盘 /examples/etc/motd 找到笔者所使用的 motd 设定档。
3.7.2 登入前的讯息
在登入系统前 FreeBSD 时,你会看到下面的画面:
FreeBSD/i386 (example.com) (ttyv0)
login:
我们在这里要做的就是把它改成想要的样子。更改 login 前的画面有二种方式,一种是修改 /etc/gettytab 及 /etc/issue,另一种方式是修改 telnetd。
方式一:
编辑 /etc/gettytab,找到 default的地方。
default:\
:cb:ce:ck:lc:fd#1000:im=\r\n%s/%m (%h) (%t)\r\n\r\n:sp#1200:\
:if=/etc/issue:
其中的%s %m %h %t 分别对应到 FreeBSD i386 example.com ttyp0,如果你不想显示 FreeBSD ,就把 %s 拿掉。最后一行 if=/etc/issue 就是表如果没有 issue 这个档的话,就执行 default。
如果你不仅仅是要修改 FreeBSD/i386 这个部份,还想要在 login 前秀出一段文字的话,你可以新增 /etc/issue 这个档,并编辑你想要的画面。和 motd 一样,issue 也可以使用 ANSI 画面,所以你可以用 ve 来编辑画面。如果你在该档中加入 %s %m %h %t 等参数的话,也是会出现 FreeBSD i386 example.com ttyp0等,如果不加就不会出现。
但由于 issue 这个档只会在 console 登入时才有作用,如果您要在开机前的画面中秀出更多的数据,您可以使用第二种方式。
方式二:
如果你想要在登入前执行一些指令,例如秀出开机时间等,必须要以更改 telnetd 的方式来做。首先,请编辑一个可执行档 /usr/local/libexec/telnetd.sh 内容如下:
#!/bin/sh
TTY=`/usr/bin/tty | /usr/bin/cut -c9`
if [ "$TTY" = 'v' ]; then
    exec /usr/libexec/telnetd
else
    /bin/cat /etc/issue
    echo "颜色句柄`/usr/bin/uptime`控制结束码"
    exec /usr/libexec/telnetd
fi
上面句柄部份,你可以使用 ve 来加入颜色句柄,编辑完后要把该档变成可执行的档案,使用下列指令:# chmod 755 /usr/local/libexec/telnetd.sh
再编辑 /etc/inetd.conf,将原来的 "/usr/libexec/telnetd telnetd" 换成 "/usr/local/libexec/telnetd.sh telnetd.sh":
telnet stream tcp nowait root /usr/libexec/telnetd.sh telnetd.sh
最后重跑 inetd,使用指令 kill -HUP `cat /var/run/inetd.pid` 即完成设定。
3.7.3 使用中文终端机
FreeBSD 的console 并无法显示中文,如果我们要在 console 下使用中文的环境,则必须安装 big5con 这套软件才可以。请使用 root 的身份直接使用下列指令来安装:# cd /usr/ports/chinese/big5con
# make install clean
安装完后,先执行 rehash 来更新一下 tcsh 指令的快取,之后我们就可以使用指令 b5c 来出现像 DOS 下倚天中文的环境,如图 3-7。
图 3-7
[img]http://homepage.cqwu.net/wxfy/images/ch03_07.png[/img]
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
您可以使用 ++ 来切换不同的输入法,并使用 + 来切换中英文。

逍遥 发表于 2006-6-5 15:05

第四章 使用者管理
FreeBSD 是一个多重使用者的操作系统,在系统可有存在多个使用者。使用者的管理可以说是系统管理最基本的议题,在系统一安装完成时,我们就必须进行使用者的新增及设定。
本章将介绍和使用者相关的管理知识,包括:
如何新增及删除使用者。
使用者及群组相关的重要档案设定。
如何限制系统资源 (如硬盘空间) 的使用。
如何备份及移转使用者数据。
大量新增账号。
记录使用者执行过的指令。
控制 root 的使用。
4.1 账号管理
4.1.1 新增使用者
新增使用者时,我们会以 adduser 这个指令来进行,adduser 指令其实是将新增使用者所必须做的事写成一个执行档来自动帮我们做,在 FreeBSD 4.x 是以 perl 所写成,而 FreeBSD 5.x 改以 shell scripts 来实作。为了了解系统对于使用者管理细节,让我们先回顾一下上一章关于使用 adduser 新增使用者的过程。在 4.x 和 5.x adduser 指令的细节有一点不同,但大同小异。
# adduser
Username: jack
执行了 adduser 之后,首先要输入使用者名称,使用者名称除了英文字、数字及 -_ 外不可以包含其它特殊字符。
Full name: Jack
接着我们要输入使用者全名,这个字段可以是空的,如果您不输入则直接按 Enter 即可。
Uid (Leave empty for default):
这个字段是使用者编号,直接留白按 Enter 即可,系统会自动指定。
Login group [jack]:
输入使用者群组名称,群组名称预设会自动产生一个和新增的使用者同名的群组,如果要使用不同的群组,必须先手动新增群组。我们直接按 Enter 即可。
Login group is jack. Invite jack into other groups? []:wheel
是否要将新的使用者加入其它群组,由于这是我们新增的第一个一般使用者,所以我们将它加入系统管理者 wheel 这个群组,让他可以使用 su 这个指令来切换身份成 root。
Login class [default]:
登入的类别,这是用来分类控制使用者对于系统资源的使用,请参考下一节系统资源限制的说明。在这里我们直接按 Enter 使用默认值即可。
Shell (sh csh tcsh nologin) [sh]: tcsh
输入所要使用的 Shell,建议输入 tcsh,如果您不想让该使用者登入系统,可以输入 nologin。
Home directory [/home/jack]:
输入使用者的家目录,也就是使用者在系统中的数据夹,所有使用者的目录我们都放在 /home 下,所以我们直接按 Enter 即可。
Use password-based authentication? [yes]:
是否要使用密码认证的方式,预设为是,我们直接按 Enter 即可。
Use an empty password? (yes/no) [no]:
是否要使用空密码,预设为否。
Use a random password? (yes/no) [no]:
是否使用随机产生的密码,如果使用随机产生的密码,在新增完毕后,系统会告知我们产生的密码,预设为否。
Enter password:
输入该使用者的密码。
Enter password again:
再输入一次密码,以确认输入无误。
Lock out the account after creation? [no]:
在新增完使用者后,是否要先将该账户关闭。
看了 adduser 指令的过程,您对于新增使用者应有的步骤应该已经有初步的了解了,接下来我们要介绍 adduser 这个指令到底做了哪些事。
在 /etc/group 中加入使用者的群组
在 /etc/master.passwd 中加入使用者
在 /home 中建立使用者目录,并建立 dotfile
在 /var/mail 中建立使用者邮件目录
知道了以上的流程,我们也可以手动自己做上述的步骤,但我们必须先知道 group 及 master.passwd 等档案的格式。所以我们接下来要介绍这些档案。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
在旧版的 FreeBSD 中,adduser 一开始会先问您使用者名称要符合怎样的规则,通常我们会直接按 ENTER 跳过,您要注意看清楚喔,不要在那个时候输入使用者名称,否则在新增使用者时可能会有问题。如果您已经输入错了,可以将 /etc/adduser.conf 删除,就可以恢复原本的设定。
4.1.2 /etc/group 介绍
在使用者的管理方面,FreeBSD 大致上可以分为群组管理及账号管理。每一个账号至少属于一个群组,这样子有利于权限控制。例如学生的账号就有一个学生群组,而老师的账号就属于教师群组,某几位老师属于管理者的群组。这样一来,我们除了可以针对个人设定权限外,也可以针对不同群组给予不同的权限。
每个使用者预设都会有一个群组,这个预设群组是设定在 /etc/master.passwd,我们会在下一小节中说明。而您也可以将使用者加入其它群组中,这些其它加入的群组设定是在 /etc/group 中,在群组后面加上使用者名称即可。
/etc/group 这个档案就是记录群组的档案,这是一个文字文件,我们可以使用 ee 等文字编辑软件打开它。在 group 档案中,其格式如下:
wheel:*:0:root,alex
students:*:1000:
teachers:*:1001:
webadmin:*:1002:alex,john,tom
每一个字段以冒号分开,以最后一行为例,第一个字段代表群组名称为 teachers,而群组代号(gid) 是 1001。我们可以自行使用文字编辑器加入想要的群组名称及 gid,但要注意的是群组名称和 gid 不能重复。
第一行的最后面是 root,alex,表示该群组成员。由于记录使用者数据的档案中只能记录使用者的预设群组,如果使用者还属于其它群组,则必须记录在 /etc/group 中。例如使用者 alex 的预设群组是 alex,我们希望他同时是 webadmin 群组,则我们必须在 webadmin 群组后加上该使用者。
在 FreeBSD 中,如果其它使用者要能使用 su 变成超级使用者的话,必须将其账号加入 wheel 群组中。
新增群组时,除了可以使用文字编辑外,也可以使用指令 pw 来新增群组:# pw groupadd newgroup
# pw groupshow newgroup
newgroup:*:1002:
第一个指令是以参数 groupadd 来新增群组 newgroup,再以参数 groupshow 来显示 newgoup 的信息。
4.1.3 /etc/master.passwd 介绍
FreeBSD 使用 shadow password 的方式来保护密码文件,只有 root 才可以读取编码后的密码文件 /etc/master.passwd。但是这并不是系统用来验证的档案,为了加快速度,FreeBSD 将该文件做成数据库 /etc/spwd.db 及 /etc/pwd.db, 因此在修改完 master.passwd 后,必须使用指令 pwd_mkdb 来将 master.passwd 做成数据库档案。不过一般而言,我会使用 vipw 这个指令来修改 master.passwd,vipw 会先将 master.passwd 以预设的文书编辑软件打开,修改完存盘后,它会视需要自动更新数据库。如果您没有修改过 ~/.cshrc,则预设的文书编辑软件是 vi。vi 在使用上比较复杂,如果您要离开编辑器,请依序按 [Esc] : q ! 再按 Enter 即可不存档离开。关于 vi 的用法,您可以参考第三章相关章节。
在执行 vipw 之后,会出现:
# $FreeBSD: src/etc/master.passwd,v 1.25.2.6 2002/06/30 17:57:17 des Exp $
#
root:$1$94sxalyM$w1lBLBGAsRPfdVciGqNfL/:0:0::0:0:Charlie &:/root:/bin/tcsh
toor:*:0:0::0:0:Bourne-again Superuser:/root:
daemon:*:1:1::0:0:Owner of many system processes:/root:/sbin/nologin
operator:*:2:5::0:0:System &:/:/sbin/nologin
bin:*:3:7::0:0:Binaries Commands and Source:/:/sbin/nologin
tty:*:4:65533::0:0:Tty Sandbox:/:/sbin/nologin
kmem:*:5:65533::0:0:KMem Sandbox:/:/sbin/nologin
games:*:7:13::0:0:Games pseudo-user:/usr/games:/sbin/nologin
news:*:8:8::0:0:News Subsystem:/:/sbin/nologin
man:*:9:9::0:0:Mister Man Pages:/usr/share/man:/sbin/nologin
sshd:*:22:22::0:0:Secure Shell Daemon:/var/empty:/sbin/nologin
smmsp:*:25:25::0:0:Sendmail Submission User:/var/spool/clientmqueue:/sbin/nologin
mailnull:*:26:26::0:0:Sendmail Default User:/var/spool/mqueue:/sbin/nologin
bind:*:53:53::0:0:Bind Sandbox:/:/sbin/nologin
uucp:*:66:66::0:0:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
pop:*:68:6::0:0:Post Office Owner:/nonexistent:/sbin/nologin
www:*:80:80::0:0:World Wide Web Owner:/nonexistent:/sbin/nologin
nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/sbin/nologin
tom:Bk5AI4MiRKCJ2:1000:1000::0:0:Tom Chang:/home/tom:/bin/tcsh
master.passwd 这个档案内容中,每个使用者都是独立的一行,每个字段使用冒号分开,它的格式是:name:password:UID:GID:class:change:expire:fullname:home:shell
每个字段的说明如下:
name:使用者账号名称,也就是您 login 时所需输入的名字。使用者名称长度最长可以是 16 个字符,但如果您要使用 NIS,则最多只可以使用8个字符。每个使用者名称不可重复。而且使用者名称中只能包英文字、减号 "-"、底线 "_"、及数字,而且最好不要使用大写的英文字,而开头的第一个字也不可以是减号 "-"。在 master.passwd 这个档案中,每个字段都不可以使用冒号 ":",因为冒号是用来分割字段的特殊符号。
password:可以是空的,代表不用密码就可以登入,这样很危险;也可以是 *,表示不可以登入;上面 vipw 显示出来的项目中,以使用者 root 而言,他的密码是使用 MD5 编码过的,特征是开头为 $1 且看起来比较长;而使用者 tom 的密码是使用 DES 编码过的,DES 会将密码编成一串13个字符的符号。FreeBSD 预设使用比较安全的 MD5 编码,但您也可以修改 /etc/login.conf 以设定某些使用者改用旧的 DES 编码。
UID:使用者代号,每个使用者都不一样,不可重复,如果有多个账号使用同样的 UID,FreeBSD 会将它当成同一个账号。编号从 0 到 65535。UID 0 为系统中超级使用者的代号,内定只有 root 和 toor 的 UID 为 0。toor 账号是 bash 所建立的使用者,内定不能使用该使用者登入。
GID:群组代号,编号从 0 到 65535。
class:除了群组外,class是更有弹性的控制方法,可以针对 /etc/login.conf 中不同的使用者设定来调整每个使用者的可使用的资源设定。
change:强迫使用者变更密码的时间,以从1970年到所要变更日期所经过的秒数来表示。你可以使用 date +%s 来求出从1970年到现在时间所经过的秒数,每天为86400秒,以现在时间的秒数加上86400*天数即为你要设定的时间。你可以使用指令下列指令来取得30天后的秒数,再将其填入即可。若设为0则表示不使用此功能:
# expr `date +%s` + 86400 \* 30
expire:账号的有效日期,一样是以从1970年到到期日所经过的秒数来代表。若设为0则表示不使用此功能。
fullname:使用者全名,你可以在此键入真实姓名。请注意这个字段也不可以使用冒号哦。
home:使用者的家目录,即使用者登入后的所在目录。
shell:使用者的 shell。如果使用 /sbin/nologin 表示该名使用者不可以登入。
我们可以看到在 master.passwd 中已经有许多使用者,这些使用者是系统服务的使用者。例如 smmsp 是邮件服务器的 daemon 所使用的使用者名称。nobody 这个使用者是预设无任何权限的使用者,但有很多系统服务软件的预设使用者都是 nobody,我们应该要注意不要以 nobody 负责为太多服务,否则它不就变成了拥有许多权限的使用者了吗!
4.1.4 删除使用者
知道了新增使用者的步骤后,您大概已经知道要怎么删除使用者了吧。只要把新增使用者的步骤反过来即可。
如果该使用者有设定使用定时排程的工作,如 crontab 或 at,则先将它移除。crontab 的工作排程会被放在 /var/cron/tabs/username,而 at 的工作排程则放在 /var/jobs/username 中。
如果该使用者有正在执行的程序,则送出 SIGKILL 给该行程以将它停止。
以 vipw 移除让使用者在 /etc/master.passwd 中的账号。
使用者的家目录 /home/username,使用指令 rm -rf /home/username。
再移除使用者邮件目录 /var/mail/username。
如果暂存的目录中 (/tmp 及 /var/tmp) 有该使用的暂存盘,则将它移除。
若该使用者所属群组已无人使用,则编辑 /etc/group 来移除群组。
以上这些步骤其实就是指令 rmuser 所做的事。我们可以使用这个指令来快速的移除使用者账号。以下即为 rmuser test 的执行结果:
Matching password entry:
test:J7kPK0pKTn2oQ:1001:1001::0:0:Tom:/home/test:/bin/tcsh
Is this the entry you wish to remove? y →真的要移除这一个使用者吗?
Remove user's home directory (/home/test)? y →是否要移除使用者家目录?
# 移除使用者正在执行的程序及更新系统数据
Removing user's at jobs:Updating password file, updating databases, done.
# 移除使用者群组
Updating group file: (removing group test -- personal group is empty) done.
# 移除使用者家目录
Removing user's home directory (/home/test): done.
# 移除使用者信件
Removing user's incoming mail file /var/mail/test: done.
# 移除使用者暂存目录
Removing files belonging to test from /tmp: done.
Removing files belonging to test from /var/tmp: done.
Removing files belonging to test from /var/tmp/vi.recover: done.
4.2 系统资源限制
如果您的 FreeBSD 系统允许多位使用者同时使用,每个使用者可能同时执行许多工作,例如 Alex 可能会执行庞大的数学运作程序,而 Tom 在系统中执行占用海量存储器的数据库程序。如此一来,我们的系统资源将全部被几个使用者耗尽,其它正常的系统服务便无法拥有较高的效能。我们不能单纯的假设系统中所有使用者都会乖乖的使用单纯的服务,因此,在一个多重使用者的环境中,系统管理者有必要针对每个使用者限于他们所可以使用的系统资源,例如 CPU、内存、磁盘空间的使用量等。
4.2.1 登入类别
我们在新增使用者时会设定使用者的 login class,所谓的 login class 就是将使用者分类管理,以限制不同类别的使用者对于系统资源的使用。
/etc/login.conf 定义了不同的 login class。这个档案中所有对于使用者限制的设定都是以 key=value 的方式来表示。这些限制大部份是针对某个使用者所执行的某一个行程 (process) 所能占用的资源,而非该使用者全部执行的行程所占用的资源总合。因此,除了每个行程所能占用的资源外,我们还会设定使用者最多可以执行多少个行程。
以下为 /etc/login.conf 中关于 default class 的设定:
# defaults
# These settings are used by login(1) by default for classless users
# Note that entries like "cputime" set both "cputime-cur" and "cputime-max"
default:\
        :passwd_format=md5:\
        :copyright=/etc/COPYRIGHT:\
        :welcome=/etc/motd:\
        :setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES:\
        :path=/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin
        :nologin=/var/run/nologin:\
        :cputime=unlimited:\
        :datasize=unlimited:\
        :stacksize=unlimited:\
        :memorylocked=unlimited:\
        :memoryuse=unlimited:\
        :filesize=unlimited:\
        :coredumpsize=unlimited:\
        :openfiles=unlimited:\
        :maxproc=unlimited:\
        :sbsize=unlimited:\
        :vmemoryuse=unlimited:\
        :priority=0:\
        :ignoretime@:\
        :umask=022:
       
以下为关于系统资源限制的字段说明,每一个字段都有可使用的数值类型,例如 size、time 等,让我们来看看每个字段的说明:
[b]字段名称[/b]
[b]数值类型[/b]
[b]说明[/b]
coredumpsize
Size
当使用者所执行的程序出了问题 (coredump),系统会将该程序的执行状况从内存中写到硬盘上,这个值就是在限制 core file 的档案大小。如果使用者所执行的程序是需要消耗许多内存的程序,则所产生的 core file 也会很大。这个值不应该比使用者的磁盘配额限制大。
cputime
Time
这是一个行程所能使用的最长 CPU 时间,这个时间指的不是我们在 top 或 ps 中看到的 CPU usage 百分比,而是一个行程所使用的 CPU 时间。当超过时间,系统核心会自动停止该行程。
filesize
Size
使用者单一档案的最大容量。我们对于使用者磁盘配额只能限制使用者对于硬盘的使用总额,而这个设定可以限制单一档案的大小。
maxproc
Number
限制使用者最多可以执行的行程总量。这个限制包含所有以该使用者名称所执行的程序,有的程序在执行时,会自动产生许多子行程,如果这个值设定的太小,可能会造成使用者的困扰。
memorylocked
Size
FreeBSD 系统中有所谓的虚拟内存空间,当物理内存不足时,系统会将某部份的内存数据放到虚拟内存中。而有的程序会使用 mlock() 这个系统呼叫要求系统将它所占用的内存空间全部放在物理内存中,memorylocked 就是限制使用 mlock() 的内存大小。
memoryuse
Size
限制行程最大的内存使用量,包含物理内存及虚拟内存。
openfiles
Number
限制使用者同一时间最多可以开启的档案数量。所谓的档案数量包含了一般的档案及 socket。
sbsize
Size
用以限制最大的网络缓冲区的使用量。
stacksize
Size
行程可使用的最大堆栈 (stack) 空间。
以下为上表中数值类型的说明:
[b]类型[/b]
[b]说明[/b]
Size
我们可以单纯的以数字来表示 Size,预设的单位是 byte。例如 1234 表示 1234 bytes。除此之外,我们也可以在数字之后加上单位。例如:     b: 表示 512-byte block (1b = 512bytes)。
    k: 表示 kilobytes,即 KB (1k=1024 bytes)。
    m: 表示 megabytes,即 MB (1m=1048576 bytes)。
    g: 表示 gigabytes,即 GB。
    t: 表示 terabytes,即 TB。
Time
当我们只写数字时,预设的单位是秒。或者我们也可以在数字后加上单位 y (年)、w (周)、d (天)、h (时)、m (分)、s (秒)。
例如,三小时四十分可以表示为:13200s、220m、或是 3h40m。
Number
您可以使用 0 到 9 的数字,预设为十进制。您也可以使用开头为 0x 的数字来表示十六进制。
当要修改类别时,我们以将 default class 复制一份,并更名为其它类别,最后再进行编辑。类别新增完毕后,我们必须执行下列指令以重建系统数据库。# cap_mkdb /etc/login.conf
接下来我们就可以执行 vipw 在想要限制的使用者的 class 的字段填入我们新增的类别了。
除了限制系统资源的使用外,我们也可以使用 login.conf 来客制化每个使用者的登入环境、所使用的语言等,请 man login.conf 以得到更多的说明。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
使用 login.conf 来设定 class 的好处是您可以统一在一个地方设定不同类别使用者的权限及系统资源的使用量,对于需要管理大量使用者时十分有用。
4.2.2 磁盘配额
当系统中有多位使用者时,如果其中一个人拥有大量档案,那么其它使用者便无法有足够的空间来使用。如果系统有许多使用者,而又不限制他们对磁盘的使用量,那么磁盘很容易就会爆掉,因此我们必须对使用者加以限制。您可以限制系统中每个使用者可使用的硬盘大小(quota)。步骤如下:
在核心设定中加入 options QUOTA 这一行,并重新编译核心。
在 /etc/rc.conf 中加入一行 enable_quotas="YES"。
在 /etc/fstab 中要启加磁盘限制的分割区中加入参数 userquota ,您也可以加入 groupquota 来限制群组的配额。
# Device        Mountpoint        FStype        Options        Dump        Pass#
/dev/ad0s1b        none        swap        sw        0        0
/dev/ad0s1a        /        ufs        rw        1        1
/dev/ad1s1f        /home        ufs        rw,userquota        2        2
/dev/ad0s1e        /usr        ufs        rw        2        2
/dev/ad1s1e        /var        ufs        rw        2        2
重开机并设定使用者的 quota 限制。
完成了上述的步骤并重新开机之后,我们就可以使用指令 edquota 来编辑磁盘配额。首先,以指令 edquota -u tom 进入文书编辑,我们通常会加入二行,一行限制档案大小,一行限制档案数:
Quotas for user tom:
/home: blocks in use: 65, limits (soft = 50000, hard =55000)
        inodes in use: 7, limits (soft = 5000, hard = 6000)
共中 blocks 代表使用者使用档案大小总合,而 inodes 代表档案数目。soft limits 代表使用量达到多少时提出警告,而 hard limits 代表使用量达多少时立刻禁止写入。
上面的范例中,使用者 tom 目前使用的档案大小为 65K,在档案大小总合为 50000K 时提出警告,55000K 时禁止写入。目前该使用者有7个档案,在档案数达 5000 个时提出警告,达 6000 个时禁止写入。
我们也可以使用 edquota -p tom 2000-3000 来以使用者 tom 的设定为范例,将 UID 为 2000 到 3000 的使用者设定为和 tom 一样。或者使用指令 edquota -p tom jack rose 来以使用者 tom 为范例,将 jack 及 rose 的设定变成和 tom 一样。
您可以使用 quota -v tom 来看使用者 tom 目前的使用情形,或使用 repquota 来查看所有使用者目前的使用情形。
在 FreeBSD 3.2 以后的版本,系统开机后预设会检查所有使用者的 quota,但这必须要花上一段时间,如果您不想在开机时自动检查 quota 的话,请在 /etc/rc.conf 中加入下列设定:
check_quotas="NO"
在 FreeBSD 3.2 版以前,开机内定是不检查 quota 的,如果你想在开机时即检查的话,请在 /etc/rc.conf 中加入下列设定:
check_quotas="YES"
4.3 大量新增账号
对于大型主机的管理者而言,要大量新增账号时,若没有一套"撇步"的话,使用 adduser 指令来新增账号将会非常累人,所以我们必须要想出一个大量新增账号的方法。
大量新增账号的方法有很多,最简单的就是写一个程序来处理,只要依照之前提及的新增账号步骤使用程序来一步步建立或在程序中呼叫 FreeBSD 系统中新增账号的指令并经由循环来完成。但是 adduser 指令会问一堆问题,不适合拿来作程序中要呼叫的指令,所幸在 FreeBSD 中还有一个管理使用者账号及群组的程序 pw ,所以笔者就以指令 pw 加上一些控制来写成 script。
一般而言,如果要新增的账号是没有规则性的,那么就必须先将账号做成一个文字文件,再以程序读入。若账号是有规则性的,则可以给定参数来完成。您可以在本书所附的第二片光盘中的 examples 目录中找到笔者所写的「新增大量账号」程序,文件名是 adduser.tar.gz。
这个程序可以使用档案汇入账号及密码,或只给账号并自动产生密码,最后将账号及密码存成一个档案(预设是 adduser.log)。我们也可以使用连续产生账号的方式,产生一堆连续的账号,产生的结果同样会放成 adduser.log 中。
首先,将第二片光盘放入光驱中,并使用下列指令将档案复制到 root 的目录下:# mount /cdrom
# cp /cdrom/examples/adduser.tar.gz /root/
将档案放到硬盘中后,请切换目录到 /root 并以下列指令解压缩:# cd /root
# tar zxvf adduser.tar.gz
解压缩后,进入 adduser 目录,你可以看到该目录中有下列档案:
[b]檔名[/b]
[b]用途[/b]
adduser.pl
主要执行档。
adduser.cfg
这是 pw 这个指令所要使用的设定档,我们可以在其中设定预设所要使用的群组名称、shell、最大及最小的 uid、及家目录等。您也可以 man pw.conf 来取得这个档案格式的用法。
建议您至少应该要修改 defaultgroup 这个字段,它是我们新增使用者预设所要使用的群组名称,您必要先在 /etc/group 中加入所要使用的群组。如果 defaultgroup 所指定的群组不在 /etc/group 中,则预设会以让使用者的名称作为群组名称。
readme.txt
这是 adduser.pl 的说明档。
user.txt
你可以使用档案汇入使用者的方式来新增使用者,这个档案存放了我们所要新增的使用者及密码。其格式是 username,password。如果只有使用者名称而无密码,我们会随机产生新的密码,并将密码及使用者名称存放在 adduer.log 中。
adduser.pl 这个程序的使用方式如下:
./adduser.pl -f users.txt
参数 -f 或 -file 表示使用档案汇入,文件名称可以自由命名,档案每一行内容即一个账号 的设定,每一行的格式可以是只有账号或者是有账号及密码,账号和密码间使用逗点 "," 隔开。本范例中将以档案 user.txt 来产生账号。
./adduser.pl -u alex 001 003
参数 -u 或 -user 表示使用连续账号,此范例将产生 alex001 alex002 alex003 三个账号。
在执行完 adduser.pl 之后,在该目录下会产生一个 adduser.log,这个档案将记录我们新增的使用者及其密码。
4.4 备份与移转
在了解了新增使用者的步骤后,您对于备份使用者的作法在心中应该也有个谱了吧。在更新系统时,使用者的数据需要备份的有:
/etc/master.passwd
/etc/group
使用者目录 /home
使用者邮件目录 /var/mail
使用者定时执行的档案 /var/cron/tabs 及 /var/at/jobs
4.4.1备份
除非我们和使用者间已有共识,不帮使用者备份其邮件及档案,否则平常想要备份使用者数据的话,这是一件麻烦且费时的工作。不管是外在因素或是硬件固障,系统都有可能数据流失。对于一个公众服务器的管理者而言,事前明白告知使用者系统管理的原则是一件十分重要的事。如果未事前请使用者自行备份个人的档案及邮件的话,首先,备份的工作将非常耗时,尤其是使用者拥有大量档案时。再者,若未备份文件,当系统数据流失时,容易和使用者产生争议,就算平常每天都有备份,也只能保住备份当时的档案,从备份到系统出问题的时候所产生的档案就无法回复了。
如果不必备份使用者个人数据的话,就只需把 /etc/master.passwd 及 /etc/group 存在别的储存设备或计算机中,要回复时只要依下列移转的步骤做即可。
4.4.2 移转
如果系统中已有其它使用者,要先编辑 /etc/group,加入和备份的 group 档案有差异的地方,再使用 vipw 来将加入和备份的 master.passwd 有差异的地方。如果新系统中无其它使用者,则将所备份的 master.passwd 及 group 放到新计算机的 /etc 下,再执行下列指令以将密码文件转成数据库格式即可:# pwd_mkdb -p -d /etc /etc/master.passwd
如果没有要移转使用者个人数据的话,也必须建立使用者家目录及邮件目录。如果要移转使用者目录的话,记得移转后要检查一下该目录的所有人是不是该使用者。如果不是,就必须使用下列指令来将使用者目录拥有者更改为所属的使用者:# chown -R user:group /home/user
上面这个指令是将 /home/user 这个目录及其下所有目录的所有人变成使用者名称为 user,群组为 group。
我们也可以在密码文件及群组数据移转后,将旧的硬盘存放使用者数据的扇区(假设是 /home) mount 到 /mnt 下,再到 /mnt 下存放使用者数据的目录中使用指令# tar clf - . | tar xvpf - -C /home
来将使用者数据复制到 /home 中。并依此方法 mount 使用者邮件目录扇区并复制到 /var/mail 下即可。
4.5 使用历程记录
4.5.1 记录使用者指令
为什么要记录使用者下过的指令?并不是为了要监视使用者,而是在系统有问题时,可以找出原因。找出使用者曾经使用过哪些指令,以了解问题的所在。FreeBSD 提供指令 lastcomm 让你查看系统中使用者执行的指令,但是你必须先修改 /etc/rc.conf,加上下列一行设定:
accounting_enable="YES"
系统会将使用者的历程记录在 /var/account/acct* 中,最新的记录是 acct,随着数据越来越多,系统每天会将该档案移成 acct1,而 acc1 将变成 acct2,依此类推。如果站上使用者很多的话,acct 的档案将变得非常大,所以你必须确保该目录有足够的空间存放数据,为了避免档案过多,系统内定只会保留最近四天的数据。
当下达指令 lastcomm 时,如果我们未使用任何参数,则系统会以 /var/account/acct 为参考,印出所记录的数据。你也可以使用 lastcomm -f acct1 来查看前一天的资料。
4.5.2 监看使用者
当使用者登入系统后,root 可以使用 watch 指令来取得在线使用者的窗口画面。也就是说当下达指令后,root 所看到的画面就会和该在线使用者一样。我们可以观察该使用者在做些什么事,输出的结果又是什么。
这个指令并不是要给人拿来做坏事用的。如果有不友善的使用者登入系统时,可以使用它来观察该使用者的动作,并适时阻止。
只有超级使用者 root 可以执行 watch,而且如果您使用的是 FreeBSD 4.6-RELEASE 以前的版本,在执行前必须先在 kernel 中加入下列的设定并重新编译核心:
pseudo-device snp
最后使用下列指令新增 snoop device: # cd /dev
# ./MAKEDEV snp0 snp1 snp2 snp3
接下来就可 watch 指令了。首先,先下指令 w 来看一下站上有哪些使用者。指令结果的第二个字段部份,有使用者的 tty,例如 p0、v0 等,选定要监看的使用者后,使用 watch ttyp0 来监看该使用者,其中 ttyp0 即该使用者的 tty。你可以使用 CTRL+X 来切换不同的 tty,也可以使用 CTRL+G 离开回到自己的画面。
4.5.3 控制 root 的使用
如果我们有在 wheel 群组中加入一般的使用者,则该使用者可以使用指令 su 并输入 root 的密码后变成超级使用者。但如果系统中有多位使用者具有 root 的权限,我们根本不知道是谁使用了 root 的权限、执行了哪些指令;如果我们想针对不同人给予不同的权限,例如一个人只有备份的权限、另一个人只能观看系统设定,su 也无法达成我们的要求。因此有人发展出 sudo 这个软件来支持系统的管理。
不过 sudo 并不是 FreeBSD 系统内定的指令,我们必须自己安装。所幸 FreeBSD 己将该软件移植到 "port" 中,我们只要执行下列指令即可轻松的安装了。由于在 port 中 sudo 的安装设定并未打开 sudo 执行指令记录,如果你希望它能将执行 sudo 的 log 记下来的话,必须先编辑 /usr/ports/security/sudo/Makefile,将 CONFIGURE_ARGS 中的参数 --disable-log-wrap 拿掉。 # cd /usr/ports/security/sudo
# make install clean
安装完后,我们要先执行 /usr/local/sbin/visudo 以设定 sudo 的设定档 (/usr/loca/etc/sudoers)。以下简单说明该设定档如何设定,详细说明及范例请参考 /usr/local/etc/sudoers.sample:
# Host alias specification(如果你只有一台机器,可以不必设)
Host_Alias     CUNETS = 128.138.0.0/255.255.0.0
Host_Alias     SERVERS = master, mail, www, ns
# User alias specification(把使用者分成群组,也可以不用分)
User_Alias     PARTTIMERS = millert, mikef, dowdy
User_Alias     WEBMASTERS = will, wendy, wim
User_alias     BACKUP = tom, jack
# Cmnd alias specification(把可以执行的指令分成一个个群组)
Cmnd_Alias     READ=/bin/ls,/bin/cat,/usr/bin/tail,/usr/bin/head
Cmnd_Alias     BACKUP=/sbin/dump,/usr/bin/tar,/usr/bin/find, \
               /usr/bin/cpio,/bin/cp,/sbin/mount,/bin/dd
# User privilege specification(设定使用者的权限)
root       ALL=(ALL) ALL
%wheel     ALL = (ALL) ALL
# 表示 jack 在 CUNET 中所有机器都可执行指令群组中 BACKUP 指令
jack       CUNETS = BACKUP
# 表示使用者群组中 PARTTIMERS 群组的人,只能在 SERVERS
#群组中的机器里执行 READ 群组的指令
PARTTIMERS SERVERS = READ
设定完后,使用者即可执行 sudo  ,使用者只要输入自己的密码即可,不必知道 root 的密码,而且 5 分钟内再次执行 sudo 时不需再输入密码。如果你有打开 log 记录功能,sudo 执行成功或失败的 log 都将被记录到 /var/log/sudo.log 中。详细说明请阅读说明 man sudo。

逍遥 发表于 2006-6-5 15:06

第五章 网络设定
几乎所有计算机都必须要有网络才有乐趣,了解网络的使用是让 FreeBSD 迈向世界的第一步。本章将介绍如何在 FreeBSD 使用网络,读完本章后,您将了解下列网络相关的主题:
何谓 IP 地址及子网掩码。
如何选择何适的 ADSL。
如何申请网域名称。
申请 IP 反解。
如何设定 IP。
设定 ADSL、cable modem、及拨接网络。
网络相关的基本指令。
5.1 网络概念介绍
现在的计算机大部份都需要连上网络,如果您想要使用 FreeBSD 来架站,自然一定要让 FreeBSD 连上网络。在说明如何进行 FreeBSD 网络设定前,我们先来介绍一些网络基本概念及名词解释,这些概念都是我们在架设服务器时常会用到的喔。
5.1.1 IP 地址与子网掩码
IP 地址
IP (Internet Protocol) 地址就好像是计算机的地址一样,在因特网世界中,计算机必须使用 IP 做为通讯识别。当计算机要传送信息给另一台计算机时,必须指定 IP 地址才能正确地将信息送达。IP 地址在系统中是一个 32 位的数字,但我们一般看到的格式大多是以 4 个 8 位 (8-bit, 又称字节) 所组成的数字。为了方便人类读写,这 4 个字节中,每一个字节会被转换成一个十进制的数字,转换之后,它的范围是 0 到 255。下表中即是一个我们常见的 IP 地址转换成 32 位数字的范例:
[b]以十进制加 . 的方式表示[/b]
[b]二进制表示[/b]
140.115.75.5
10001100  01110011  01001011  00000101
您可以看到,140 这个数字的二进制是 10001100,115 的二进制是 01110011。计算机是 0 与 1 的世界,所以计算机中存放的都是 0 和 1,一个 bit 只能存一个 0 或 1。在表示数字时,计算机其实是将数字存成二进制,而 32 bits 表示计算机使用 32 个 0/1 来存放数字。十进制的数字 2 会被表示成 10、数字 3 是 11、十进制的 4 是 100、5 是 101。我们以 115 这个数字为例,十进制的 115 以二进制来表示是 01110011,二进制转换的方式是:
图 5-1
[img]http://homepage.cqwu.net/wxfy/images/ch05_01.png[/img]
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
以上的 IP 地址是使用 IPv4,因此只有 4 个字节的长度。但由于 IP 渐渐不足,所以目前有新的标准是 IPv6,IPv6 有 16 个字节。虽然大多数的操作系统都已支持 IPv6,但 IPv6 还不普及,目前因特网还是使用 IPv4。
所有的 IP 地址是由 IANA (Internet Assigned Numbers Authority) 组织授权给各地区的单位分派,在台湾则是由 TWNIC ([url]http://www.twnic.net.tw)[/url] 所管理。IP 地址可以区分为 A、B、C 三个等级,分别说明如下:
Class A:理论上A级的范围是从 0.0.0.0 到 127.255.255.255。它的第一个字节由 IANA 所分派,后面的三个字节可以自行运用。例如,18.x.x.x,每一个 x 的范围为 0 到 255,所以一个 Class A 可以有 256 x 256 x 256 = 16777216 个 IP。像麻省理工学院的 WWW 主机 web.mit.edu,它的IP地址是 18.69.0.27,很明显的,是属于A级的。
Class B:理论上B级的范围是从 128.0.0.0 到 191.255.255.255。它的前二个字节是由 IANA 所指派,而后面二个字节可以自行运用。例如,140.115.x.x,每一个 x 的范围为 0 到 255,所以一个 Class B 可以有 256 x 256 = 65536 个 IP。像中央大学的 DNS 服务器是 140.115.1.31,就是隶属于中大所分配到的B级网络之中。
C Class:理论上C级的范围是从 192.0.0.0 到 223.255.255.255。它的最后一个字节可以自行运用,例如 210.202.102.x。一个 Class C 最多可以有 256 个 IP 地址。
为什么我要说是「理论上」呢?因为有些 IP 地址另有特殊用途。譬如说,A级范围内,127.x.x.x 是用来做 loopback 的(习惯上,大部份系统都指定 127.0.0.1 为 loopback 地址,如果您打指令 ifconfig lo0,您也会看到 127.0.0.1 这个 IP),所以实际上能用的A级地址就减少了。另外,以 Class C 为例,如果有一个 Class C 是 210.202.102.x,则 210.202.102.0 是 Network ID,代表网络本身,而 210.202.102.255 是用来做为网络广播,这些 IP 都不可以用在计算机的 IP 上。
可想而知,如果每世界上每一台计算机都需要一个 IP,IPv4 的 IP 一定不够用。所以除了一般可以在 Internet 上使用的 IP 之外,还有所谓的 Private IP Address (私有 IP),这些 IP 不得出现在公众网络上,但却可以用在私有的 Intranet 中。RFC 1597 所定义的私有 IP 范围如下:
Class A 的私有 IP:10.0.0.0 到 10.255.255.255,也就是说可以使用 10.x.x.x 这范围的 IP。
Class B 的私有 IP:172.16.0.0 到 172.31.255.255,也就是从 172.16.x.x 到 172.31.x.x,共有 16 个 Class B 的 IP。
Class C 的私有 IP:192.168.0.0 到 192.168.255.255,也就是 192.168.0.x 到 192.168.255.x,共有 256 个 Class C 的 IP。
上述这些 IP 就是我们可以在自行拿来在 Intranet 中使用的 IP。如果您没有分配到足够的 IP 地址,您可以在公司或家中使用这些 IP,再透过 NAT (Network Address Transation) 让家中使用私有 IP 的计算机透过一台拥有真实 IP 的计算机连上 Internet。关于 NAT 的设定及说明,我们会在「NAT 及防火墙」一章中说明。
子网掩码
IP 地址可以分为二个部份,一个是由 IANA 或 TWNIC 或 ISP 所分派的固定部份,称之为 Network ID,以及可以自行运用的部份,称之为 Host ID。例如,以 140.115.x.x 为例,140.115 就是 Network ID。然而,为了让计算机可以判断出 IP 地址的 Network ID 及 Host ID,必须靠子网掩码 (Subnet Mask) 的帮忙。
因为每个网络都可以再切割为更小的子网络,例如,中央大学的网络是 140.115.x.x,而中央企管可以使用 140.115.75.x 这个子网络。以整个中央大学而言,它的 Network ID 是 140.115,而中央企管的 Network ID 是 140.115.75。因为中大的前二个字节是 Network ID,所以子网掩码的前二个字节要设成 255,而最后二个字节为 Host ID,则子网掩码设为 0。因此,IP 地址为 140.115.x.x 的子网掩码为 255.255.0.0,而 140.115.75.x 的子网掩码为 255.255.255.0。
简而言之,子网掩码就是将所有和 Network ID 同一个字段的位都设成 1,所有和 Host ID 同字段的位都设成 0。
[b]Class[/b]
[b]二进制的子网掩码[/b]
[b]子网掩码[/b]
Class A
11111111 00000000 00000000 00000000
255.0.0.0
Class B
11111111 11111111 00000000 00000000
255.255.0.0
Class C
11111111 11111111 11111111 00000000
255.255.255.0
当我们在表示一个子网络时,我们可以使用 140.115.0.0/255.255.0.0 来表示。然而,我们也常看到另一种表示方式:140.115.0.0/16。16 的意思是子网掩码中,高位的部份有 16 个 1。以上表中各个子网掩码为例,我们可以表示为:
[b]Class[/b]
[b]二进制的子网掩码[/b]
[b]子网掩码[/b]
Class A
11111111 00000000 00000000 00000000
/8
Class B
11111111 11111111 00000000 00000000
/16
Class C
11111111 11111111 11111111 00000000
/24
那么计算机又是如何从一个 IP 及子网掩码判断出 Network ID 的呢?计算机会将 IP 和 Netmask 做 AND 运算,运算结果就是 Network ID,如下表中所示:
IP (140.115.75.5)
10001100 01110011 01001011 00000101
Netmask (255.255.255.0)
11111111 11111111 00000000 00000000
Network ID (140.115.0.0)
10001100 01110011 00000000 00000000
切割网络
我们可以利用子网掩码将 Class A、B、C 再细切为更小的子网络。例如,台湾的 ISP 会将网络切割成每个子网络 8 个 IP,再分派给客户。以笔者的公司为例,我所得到的 IP 范围是 210.202.102.128 ~ 210.202.102.135,这就是将一个 Class C 切割成 32 个子网络。在这个例子中,Network ID 就是整个网络范围的第一个 IP,也就是 210.202.102.128,由下表得知,因为这个 Network ID 中,前 29 个 bits 都是固定的,所以子网掩码是 255.255.255.248。我们可以使用 210.202.102.128/255.255.255.248 或是 210.202.102.128/29 来表示这个子网络。
Network ID (210.202.102.128)
11010010 11001010 01100110 10000000
Max IP (210.202.102.135)
11010010 11001010 01100110 10000111
Netmask (255.255.255.248)
11111111 11111111 11111111 11111000
虽然笔者被分配到 8 个 IP,但是第一个 IP 210.202.102.128 是用来表示整个网络,而 210.202.102.135 则是用来做此子网络广播使用。因此,实际可用 IP 只有 6 个,也就是 210.202.102.129 ~ 210.202.102.134。不过 210.202.102.134 会被拿来做 ADSL router 使用,所以真正可以用的 IP 只有 5 个。
如果我们来看一个被切割成 8 个子网络的 Class C 192.168.5.x,每个子网络会有 32 个 IP,Netmask 是 255.255.255.224 或 /27:
[b]IP 范围[/b]
[b]Network ID[/b]
[b]Host ID[/b]
192.168.5.0 ~ 192.168.5.31
192.168.5.0
0~31
192.168.5.32 ~ 192.168.5.63
192.168.5.32
32~63
192.168.5.64 ~ 192.168.5.95
192.168.5.64
64~95
192.168.5.96 ~ 192.168.5.127
192.168.5.96
96~127
192.168.5.128 ~ 192.168.5.159
192.168.5.128
128~159
192.168.5.160 ~ 192.168.5.191
192.168.5.160
160~191
192.168.5.192 ~ 192.168.5.223
192.168.5.192
192~223
192.168.5.224 ~ 192.168.5.255
192.168.5.224
224~255
私有 IP 范围
一般 ISP 所分配的 IP 都可以让我们在因特网上使用,但如果您没有要在因特网上使用,只是要在公司或家中架设内部局域网络,我们可以使用私有 IP (Private IP)。私有 IP 是 RFC 1981 所定义的私人 IP,这些 IP 不能够直接在因特网中出现,只能在局域网络中使用。如果您想在公司或家中架设内部使用的服务器,您可以区网中的计算机 IP 设为下列范围之一:
Class
范围
子网掩码
网域
Class A
10.0.0.0 ~ 10.255.255.255
255.0.0.0
10/8
Class B
172.16.0.0 ~ 172.31.255.255
255.255.0.0
172.16/12
Class C
192.168.0.0 ~ 192.168.255.255
255.255.255.0
192.168/16
例如,你家中有三台计算机,可以分别设定 IP 为 192.168.0.1、192.168.0.2、192.168.0.3。
私有 IP 不可以在因特网中使用,如果这些设定为私有 IP 的计算机有连上因特网的需求,则必需经由 NAT 服务器的转换,将它们伪装成是由 NAT 服务器连向外部网络。详细 NAT 服务器的设定请参考本书「NAT 及防火墙」一章的说明。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
看得头晕眼花了吗?没关系,本节的重点在于了解 IP 地址和子网络的关系。您只要了解子网掩码 255.255.255.0 也可以使用 /24 表示 (因为一个 255 有 8 个 1,三个 255 就是 24)。其它的细节等您有需要时再来参考即可。
5.1.2 申请 ADSL/Cable  的选择
随着国内固网开放,有越来越多的厂商提供宽频上网服务。然而,各家厂商竞争激烈,纷纷提出各种网络方案,在众多方案中,如何有效益地选择适合自己的方案呢?
如果您要使用 FreeBSD 来架站,第一个要考量的自然是上传频宽必须足够。就算流量不大,上传频宽在 512 K 以上是最基本的要求。如果您主要需要的是以 FreeBSD 做为 NAT 服务器来提供频宽共享,则下传的频宽也要注意。
现在比较少听到有人使用 Cable 宽频,一方面 Cable 的频宽会因同一条线路上的用户多寡而影响连品质,另一方面它的普及度也不是太高,但部份地区的 Cable 还是有不错的联机品质。使用 Cable 大致上可以分为固定 IP 及 DHCP 二种,如果您需要架站,则固定 IP 会比较方便。
目前宽频还是以 ADSL 为主,各家 ISP 提供的方案很多,您可以比较一下价格及速度,来决定要使用何种方案。目前主要方案可以分成二大类:固定式及非固定式。固定式的 ADSL 指的是 ISP 会提供固定 IP 给您,您无须透过 PPPoE 或 DHCP 来取得 IP。而非固定式的 ADSL 通常须以 PPPoE 或 DHCP 来取得 IP,而这个 IP 可能是不变的,也有可能每次取得的 IP 都不一样。我们详细的将各方案分类如下:
固定式 ADSL
单机型:单机型的 ADSL 通常只有一个固定 IP,如果您只需要让少数的计算机有固定 IP,则可以使用单机型。
网络型:通常提供 4 到 16 个固定 IP,适合较大的公司使用,您可以同时让很多台机器都有固定 IP 可以对外联机。不过网络型的 ADSL 价格贵很多。
非固定式 ADSL
有提供固定 IP 者:现在的非固定式 ADSL 通常会提供一个固定 IP 及数个浮动 IP,我们可以使用 PPPoE 或 DHCP 来取得固定 IP,并用该 IP 来架站。
无固定 IP 者:较低速率的 ADSL 通常没有提供固定 IP 服务,这种联机较不适合架站,尤其不适合做为邮件服务器使用。但您也可以用动态的 DNS (Dynamic DNS, DDNS) 让没有固定 IP 也可以达到固定 IP 的效果。
在价格上,固定式的 ADSL 会比非固定式的贵二倍之多,而固定 IP 越多则越贵。以个人或小公司而言,选择有固定 IP 的 ADSL 是比较合乎效益的做法。
另外,在频宽上,目前比较广泛使用的频宽有 1M/64K、2M/256K、2M/512K、8M/640K、12M/1M 等。如果您要架站,建议您使用上传频宽 512K 以上的速率。不过 8M/640K 及 12M/1M 必须由您所在位置和 ISP 机房的距离来决定是否可以申装。笔者的个人网站就是使用 8M/640K 的 ADSL,速度上还算不错,这个速度对于 50 人以下的公司也是绰绰有余。
理论上固定式的联机品质会比非固定式好,不过以笔者实际使用的结果差异并不大。笔者公司使用固定式双向 512K 的 ADSL,由于下载频宽不如 8M/512 非固定式,所以速度上慢很多,而且价格比较贵。目前许多 ISP 的 8M/512K 都比 2M/512K 还便宜,您可以自行评估一下再决定要使用何种速率。
5.1.3 申请网域名称
如果您要架站,一定会需要一个网域名称 (Domain name),例如笔者的网域有 alexwang.com、twbsd.org 等。有了网域名称,可以让人使用更容易记得的方式连到您的服务器。
申请网域名称
申请网域名称十分容易,如果您要申请的网域名称是 .tw 结尾,如 xxx.com.tw、xxx.org.tw、xxx.idv.tw 等,您必须上 TWNIC ([url]http://www.twnic.net.tw)[/url] 所授权的网站申请,您可以到 TWNIC 去查询申请方式。如果您要申请的是 .com.tw 或 .org.tw,您必须准备公司或组织的登记证;而 .idv.tw 是给个人使用,只要准备身份证字号即可,其费用为每年新台币 $450 元。
如果您要申请的是 .com、.net、.org 等,您可以上 YAHOO! (
[url=http://domains.yahoo.com/]http://domains.yahoo.com[/url]
) 申请,费用大约为每年美金 $9.95。申请 .com、.org、.net 等十分容易,只要按网页上的说明填入数据,花个五分钟就可以完成,不过您必须要有信用卡喔。
在申请完网域名称后,必须填入二台负责管理您网域的 DNS 服务器 IP,您可以自己架以二台 DNS 服务器,或是交由申请单位代管。为什么要有 DNS 服务器管理您的网域名称呢?因为我们申请到的网域名称可能是 twbsd.org,如果我们希望将
[url=http://www.twbsd.org/]www.twbsd.org[/url]
对映到 61.23.21.11 这个 IP,则必须在 DNS 服务器中加入这个信息。同样的,我们可能会有
[url=ftp://ftp.twbsd.org、mail.twbsd.org、bbs.twbsd.org/]ftp.twbsd.org、mail.twbsd.org、bbs.twbsd.org[/url]
等等设定,都必须由 DNS 服务器代为管理网域名称和 IP 的正解。
TWNIC 可以代为管理 DNS,但数量有限,最多只有三个,而且没有邮件服务器用的 MX (请参考本书 DNS 服务器一章的说明)。如果您在 YAHOO! 申请网域名称,YAHOO 可以帮您管理很多的 DNS 设定,您就不需要自行架设 DNS 服务器了。所以我个人比较偏好由 YAHOO 申请,便宜又方便。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
申请完网域或是您有更动网域及 IP 的对映后,必须经过 24 小时才会有作用。因为 DNS 必须经过一段时间才会在整个网络上生效。
申请完网域并设定好您的 IP 后,隔天您就可以查看看您所设定的网域名称是否有生效,您可以在 FreeBSD 或是 Windows 中使用下列指令:# nslookup [url]www.twbsd.org[/url]
Server:         168.95.192.1
Address:        168.95.192.1#53
[url]www.twbsd.org[/url]   canonical name = twbsd.org.
Name:   twbsd.org
Address: 220.132.178.72
您可以看到当我们使用 nslookup 这个指令去查
[url=http://www.twbsd.org/]www.twbsd.org[/url]
时,它所对映到的 IP 是 220.132.178.72。如果您的查询失败,表示您的设定有问题或是该设定尚未生效。
申请 IP 反解
在设定完网域对映到 IP 的正解后,如果您有固定 IP,我们还要设定将固定 IP 转换为网域名称的正解。尤其当您要架设邮件服务器时,如果没有 IP 反解,可能会被退信。以笔者的网域为例,我设定了
[url=http://www.twbsd.org/]twbsd.org[/url]
对映到 IP 220.132.178.72,接下来要设定让使用者从 220.132.178.72 可以反查到 twbsd.org。# nslookup 220.132.178.72
Server:         168.95.192.1
Address:        168.95.192.1#53
72.178.132.220.in-addr.arpa     name = twbsd.org.
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
我们可以设定多个网域名称对映到同一个 IP,但一个 IP 只能对映到一个网域名称。例如,我设定
[url=http://www.alexwang.com、alexwang.com、[url]www.twbsd.org[/url]、twbsd.org/]www.alexwang.com、alexwang.com、[url]www.twbsd.org[/url]、twbsd.org[/url]
都对映到 220.132.178.72 这个 IP。但反查时,IP 只能对映到 twbsd.org。
依照规定,未满一个 Class C 的 IP 反解必需由 ISP 设定,如果您使用的是非固定式 ADSL,并有一个固定 IP,可以上您 ISP 的网站免费申请 IP 反解。以 Hinet 为例,您可以到
[url=http://hidomain.hinet.net/reexp.html]http://hidomain.hinet.net/reexp.html[/url]
进行 IP 反解的申请。当您连到 Hinet 申请的页面时,您会看到下列画面:
图 5-2
[img]http://homepage.cqwu.net/wxfy/images/ch05_02.png[/img]
您必须在「配发之 IP addrsss」中填入您的 IP,并在「用户之 Domain Name」中填入您的网域名称,如果您要将 IP 反解设为 [url]www.example.com[/url],则在「用户之 Domai Name」中要填 example.com。接着最重要的是「IP 及 Host」,如果您的 IP 是 11.22.33.44,并要对应到 [url]www.example.com[/url],则要填入「44 IN PTR [url]www.example.comf[/url]」。
如果您有多个 IP 要设定反解,您可以按最上方的参考范例,如图 5-3 所示:
图 5-3
[img]http://homepage.cqwu.net/wxfy/images/ch05_03.png[/img]
申请动态 DNS
如果您不想花钱申请网域名称,或者您没有固定 IP,我们可以使用网络上提供的免费 DNS,例如
[url=http://www.dyndns.org/]www.dyndns.org[/url]
。我们可以申请一个类似 xxx.dyndns.org 的网域名称,只要到该网站注册申请即可。在连到该网站后,请先按「Sign Up Now」:
图 5-4
[img]http://homepage.cqwu.net/wxfy/images/ch05_04.png[/img]
接下来,请依序填入您的数据并按「Create Account」送出资料,如图 5-5 所示:
图 5-5
[img]http://homepage.cqwu.net/wxfy/images/ch05_05.png[/img]
接着您就可以到所设定的信箱收信,收到信后,请按下信内容中确认的连结,之后再到
[url=http://www.dyndns.org/]www.dyndns.org[/url]
登入:
图 5-6
[img]http://homepage.cqwu.net/wxfy/images/ch05_06.png[/img]
登入后,请选择「Services」,进入 Service 页面后再选择 「Dynamic DNS」,如图 5-7 所示:
图 5-7
[img]http://homepage.cqwu.net/wxfy/images/ch05_07.png[/img]
接着请进入「Add Dynamic DNS」:
图 5-8
[img]http://homepage.cqwu.net/wxfy/images/ch05_08.png[/img]
进入后,您就可以填入您想要名称,例如,我们要申请 twbsd.dyndns.org,则先填入 twbsd 后,再用下接选单选择 dynnas.org,然后请在「IP Address」中输入您的服务器 IP,最后按下「Add Host」即可完成。
图 5-9
[img]http://homepage.cqwu.net/wxfy/images/ch05_09.png[/img]
申请完 DDNS 后,您就拥有一个免费的网域名称了。由于申请时我们已经设定好主机和 IP 的对映,所以您应该可以使用该名称连到您的服务器了。如果您没有固定 IP,在每次 IP 更动时,我们都必须连到 DynDNS 做设定,这样太麻烦了。还好我们可以在 FreeBSD 中安装一套工具,让它自动帮我们做更新 IP 的动作。
请到 Port 中安装 ddup 这支程序:# cd /usr/ports/dns/ddup
# make install
安装完后,请执行下列指令产生设定文件:# /usr/local/sbin/ddup --makeconf
Please enter your user name:
your_account
Please enter your password:
your_password
your_account:your_password
OK..now you need to enter the users who can use ddup:
Seperate the users with a , ie. root,test,this,that
root
最后请执行下列指令,系统即会自动取得您的 IP,并更新网域及 IP 的对映,请将下列 your_domain.dyndns.org 换成您所申请的名称:# /usr/local/sbin/ddupcron.sh your_domain.dyndns.org
最后,我们将上面这一行指令放在 crontab 中,让系统每 5 分钟检查一次,如果 IP 有更动,即立刻更新。请编辑 /etc/crontab 这个档,并加入下列这一行:
*/5 * * * *  root  /usr/local/sbin/ddupcron.sh your_domain.dyndns.org
5.2 固接网络
如果您的网络连结方式是固接网络,如学校的宿网、固接式 ADSL、固接式 Cable,恭喜你,这种设定最简单,而且你的联机速度应该令人羡慕。值得注意的是,有些 ADSL 业者虽然号称享有固定 IP,但您并不可以使用本节所使用的设定方式,而必须以一般非固接的 ADSL 设定方法。本节所介绍的固接网络指的是只要设定好 IP、通讯闸即可上连上网络,这样的网络设定可以经由下列任一方式达成:
使用 sysinstall
手动设定
5.2.1 使用 sysinstall
请以 root 身份,执行 sysinstall 进入安装时的画面。
图 5-10
[img]http://homepage.cqwu.net/wxfy/images/ch05_10.png[/img]
选择 Configure 进入,出现图 5-11:
图 5-11
[img]http://homepage.cqwu.net/wxfy/images/ch05_11.png[/img]
接着选择 Networking 进入,进入图 5-12:
图 5-12
[img]http://homepage.cqwu.net/wxfy/images/ch05_12.png[/img]
接着选第一个 Interfaces,出现图 5-13:
图 5-13
[img]http://homepage.cqwu.net/wxfy/images/ch05_13.png[/img]
上图中的 fxp0 即是您的网络卡,fxp0 可能会因为网络卡的不同而有不同的代号,如 ed0、vr0 等。如果有多张网络卡,还会有 ed1、vr1、fxp1等。通常第一个就是网络卡,而 lp0、sl0 及 ppp0 都不是。选择您想要设定的网络卡后按空格键进入,程序会先问是否要使用IPv6,回答否。接着会问您是否要使用 DHCP,视您的网络决定,如果不是动态取得 IP 的话,拥有固定 IP 就不要使用 DHCP。接着会出现图 5-14:
图 5-14
[img]http://homepage.cqwu.net/wxfy/images/ch05_14.png[/img]
我们要先知道我们的 Domain Name 及 IP 等,如果没有 Domain Name 的话,就随便输入吧。假设我们的机器 [url]www.mydomain.com[/url] ,Host 一栏中就输入 [url]www.mydomain.com[/url],在 Domain 中就输入 mydomain.com。我的机器在中央大学,所以 Gateway 就输入 140.115.1.254,Name server 输入 140.115.1.31,IPv4 Address 就输入我的 IP 也就是 140.115.75.1,Netmask 也就是子网络就输入 255.255.0.0。接着按 OK 离开就完成了,它会问你是否用立即使用新的网络设定,回答是就会立即更新网络设定了,接着就可以离开程序了。
虽然 sysinstall 有问我们是否要立即使用新的网络设定,但它不一定会立即更新设定,所以我们需要重新开机或是使用指令来将网络立刻更新。至于如何不重开机而更换 IP 设定,我们在下面手动设定时将提及。
5.2.2 手动设定
手动设定比用 sysinstall 设定还要快且简单。只要知道我们的网络卡代号、IP 、Netmask等资料就可以开始设定了。您可以使用指令 dmesg | grep Ethernet 或是 ifconfig 去看网络卡代号为何。首先,为了在一开机即设定,必须在 /etc/rc.conf 中依你的数据加入下列几行:
# 预设的通讯网关 (Gateway)
defaultrouter="140.115.1.254"
#Host,机器的Domain Name
hostname="www.mydomain.com"
#网络卡代号是 fxp0,设定 IP为 140.115.75.2,
#子网掩码为 255.255.0.0
ifconfig_fxp0="inet 140.115.75.1 netmask 255.255.0.0"
接着编辑 /etc/resolv.conf,依您的数据加入下列几行:
#网域(domain)
domain mydomain.com
#DNS服务器地址
nameserver 140.115.1.31
以上资料都设定好了之后就可以重新开机使用新的设定了。或者你也可以使用下列指令来更新 IP。下面的指令中,网络卡代号为 fxp0,IP 是 140.115.75.1,子网掩码是 255.255.255.0。# ifconfig fxp0 down
# ifconfig fxp0 140.115.75.1 netmask 255.255.255.0
# ifconfig fxp0 up
上述指令将立即更新网络卡信息,接着我们必须加入 gateway 的设定:# route add default 140.115.1.254
现在您可以使用 ping 这个指令来查看网络是否正常运作:# ping 168.95.1.1
如果您使用固定 IP,并想让家中网络的其它计算机透过本服务器上网,请参考「NAT 及防火墙」一章。
5.3 DHCP 动态取得 IP
如果您所处的网络环境中有 DHCP 服务器,那么您可以使用 DHCP 动态取得 IP 的方式连上网络。一般的 Cable Modem 通当是经由 DHCP 动态取得 IP,如果您的 Cable 是以 DHCP 联机的话也可以适用于本小节的设定说明。
首先,将网络卡和 Cable Modem 连接好,假设网络卡代号是 fxp0。我们先执行下列指令来试试看 DHCP 是否可以正常联机:# dhclient fxp0
接着打 ifconfig fxp0,你应该可以看到下列画面:
fxp0: flags=8843 mtu 1500
inet6 fe80::250:baff:fe00:dcdd%vr0 prefixlen 64 scopeid 0x1
inet 61.58.76.14 netmask 0xffffff00 broadcast 61.58.76.255
上面画面中的 61.58.76.14 是我们动态取得的 IP,如果有出现 IP 就表示正常了。然后试一下可不可以 ping 到外面的网络:# ping 216.136.204.21
都没问题后就可以开始编辑 /etc/rc.conf 了,请在 rc.conf 中加入下列设定:
ifconfig_fxp0="DHCP"
上面这一行表示要在开机时自动将网络卡 fxp0 设定使用 DHCP 联机。
5.4 ADSL
如果家里有多台计算机要上网,使用 FreeBSD 来做联机分享是一件很棒的事。ADSL 的拨号是使用 PPPoE (PPP over Ethernet) 的方式,由于拨接式 ADSL 只有一个 IP,因此家中其它的计算机必须使用保留 IP 再经由 FreeBSD 的 NAT (Network Address Translation) 功能来将保留 IP 转成可以在因特网上出现的 IP。关于 NAT 的设定,请参考「NAT 及防火墙」一章。
5.4.1 编译核心
如果您使用的是 FreeBSD 4.4-Release 以后的版本,您不需要修改核心设定就可以支持 PPPoE 了,因为当系统要求使用 PPPoE 时,会以动态的方式加载。如果使用的是 4.4 以前的版本,还是要加上关于 PPPoE 的设定。首先我们要先确定在核心中已经有加上网络卡的设定,也就是开机时已经有抓到网络卡了。接着请先在 kernel 设定档中加入下列几行:
# PPPoE 方面(FreeBSD 4.4-RELEASE 以后的版本不需加入下列三行)
options NETGRAPH
options NETGRAPH_PPPOE
options NETGRAPH_SOCKET
接着请参考「编译核心」一章的说明来重新编译核心。
5.4.2 修改 /etc/ppp/ppp.conf
这里我们以 Hinet 的 ADSL 为范例说明,其它家的 ADSL 设定大都差不多。首先,将 /etc/ppp/ppp.conf 更名为 /etc/ppp/ppp.conf.old,更名的目的是只为了备份原本的设定档,您也可以直接删除它:# mv /etc/ppp/ppp.conf /etc/ppp/ppp.conf.old
再来,使用文书编辑软件来新增并编辑 /etc/ppp/ppp.conf,加入下列的设定,请记得要修改下列设定中的 "set device PPPoE:---" 那一行,在那一行设定连接到 ADSL 的网络卡代号,范例中是使用 vr0 。接着要修改 authname 及 authkey 成为你的账号及密码。
# /etc/ppp/ppp.conf
default:
   set log Phase Chat LCP IPCP CCP tun command
   nat enable yes
   nat same_ports yes
   nat use_sockets yes
   set redial 15 28800
   set reconnect 15 28800
pppoe:
   set device PPPoE:fxp0:
   set mru 1492
   set mtu 1492
   set speed sync
   enable lqr
   set lqrperiod 5
   set cd 5
   set dial
   set login
   set timeout 0
   set authname [email]b1xxxxxx@hinet.net[/email]
   set authkey yourpassword
   set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0
   add default HISADDR
   enable dns
# end of ppp configuration
完成后即可存档离开。
5.4.3 修改 /etc/rc.conf
再来是修改 /etc/rc.conf,在这里我们一样是以 fxp0 为连接到 ADSL 的网络卡代号,请记得要修改成你的网络卡代号。 然后请在 /etc/rc.conf 中加入下列几行:
# /etc/rc.conf
#设定自动选择联机装置
network_interfaces="auto"
ifconfig_fxp0="inet 10.0.0.1 netmask 255.0.0.0 -arp up"
#一开机就执行 PPPoE(建议)
ppp_enable="YES"
#ddial 表示只要断线便自动联机(建议),或设 auto 表示有数据要
#出去则自动联机,也可以设为 background 只连一次后放到背景
ppp_mode="ddial"
ppp_profile="pppoe"
#end of  /etc/rc.conf
完成了上述步骤之后,就可以重新开机以启动 PPPoE了。如果您在 /etc/rc.conf 中并未设定一开机就自动联机的话,可以在重开机之后使用以下的指令来连上 internet:# ppp -background pppoe
请注意,我们在 ifconfig_fxp0 的项目中,有设定「-arp」,该项目的意思是不要使用 Ethernet 的网络卡地址方式。由于 PPPoE 的网络适配卡只会用来连接 Internet,我们可以将它的 ARP 功能取消,以提升效能。但是如果您只有一个网络卡,同时连接 Internet 及 Ethernet,则不可以加上该项目,否则在联机内部网络时会有问题。
5.5 Modem 拨接
如果你是使用 modem 拨接上网的话,你同样可以在 FreeBSD 中设定。只要是用需要拨接的联机方式,都是使用 PPP 来连接。而且就算使用 modem 拨接一样可以分享给局域网络中其它计算机使用。
5.5.1 编辑 /etc/ppp/ppp.conf
这里我们以 Hinet 为例加以说明。首先,先将原本的 ppp.conf 更名为 ppp.conf.old,再编辑 /etc/ppp/ppp.conf,如下:
default:
   set log phase chat connect LCP IPCP CCP tun command
   #设定使用哪一个 com,com1 是 cuaa0、com2 是 cuaa1
   set device /dev/cuaa1
   set speed 115200
   deny lqr
   set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \"\" \
   AT OK-AT-OK ATE1Q0 OK\\dATDT\\T TIMEOUT 40 CONNECT"
hinet:
   set openmode active
   #设定拨接的号码
   set phone 4125678
   # 设定共拨3次,每次隔5秒
   set redial 5 3
   #设定闲置几秒就自动断线,0表示不会自动断线
   set timeout 1200
   #设定可以使用 ppp 的系统使用者账号
   allow users xxx
   deny chap
   disable chap
   accept pap
   #Hinet 的拨接账号 xxxx
   set authname xxxx
   #Hinet 的拨接密码 xxxx
   set authkey xxxx
   set ifaddr 10.1.1.1/0 10.2.2.2/0
设定完后存档离开进入下一个步骤。
5.5.2 编辑 /etc/ppp.linkup
接着编辑 /etc/ppp.linkup 如下:
hinet:
      delete ALL
      add 0 0 HISADDR
存盘离开,现在可以使用下列指令来拨接:# ppp -backgroud hinet
如果您希望让 modem 联机分享给其它区网中的计算机使用,您可以使用下列指令来拨号:# ppp -nat -backgroud hinet
5.6 网络相关指令
这里我们将介绍一些常用到的网络相关指令,如果你想知道更多、更详细的指令,请参考指令应用篇,或使用指令 man 来查询相关使用方法。在这里我们的目的只是告诉你有这些工具可以使用,并未针对每一个指令作详细的使用方法说明,你应该使用 man 来查询该指令更完整的参数。我只列出较常用的几个方法。
5.6.1 telnet
大家都知道这个指令吧!如果你要联机到别台 UNIX 主机或是连到 BBS,就使用 telnet 这个指令。例如,要telnet 到 sparc20.cc.ncu.edu.tw 这台机器:$ telnet sparc20.cc.ncu.edu.tw
如果你在登入时想离开,可以按 CTRL+] 回到自己的主机,再打 quit 离开 telnet。
如果你在 telnet 时想输入中文的话,必须加入参数 -8:$ telnet -8 bbs.ba.mgt.ncu.edu.tw
5.6.2 ftp
FreeBSD 中也有提供命令列的 ftp client 工具,如果你要连到 freebsd.csie.nctu.edu.tw 这台机器的话:$ ftp freebsd.csie.ncu.edu.tw
允许昵登入的 ftp 主机,账号只要输入 anonymous 或 ftp 即可,密码可以随便输入,或者在 ftp 指令之后加上参数 -a 即可自动以昵名登入。进入 ftp 站台后,你可以使用下列指令:
?
列出所有指令。
ls
查看所在目录的档案,使用方法和在 FreeBSD 机器中一样。
cd
进入某一个目录,如 cd pub。
get
取回某一个档案,如 get ve-1.0.tgz。
reget
续传某一档案。
put
上传档案,如 put homework01.zip。
send
上传档案,和 put 一样。
size
查看档案大小。
less
观看文字文件内容
5.6.3 ping
送出 ICMP 封包,用以查看网络上主机的联机状况。$ ping 216.136.204.21
你也可以加入以下的参数:
-c count 只计算 count 次。
-s size 不使用预设的 64 bytes 当作封包大小,而改用新的 size。$ ping -c 10 -s 108 216.136.204.21
5.6.4 nslookup
查询网络主机信息。此指令可以用来查询网络主机的 Domain name,或以 Domain name 反查 IP 地址。$ nslookup 216.136.204.21
$ nslookup [url]www.freebsd.org[/url]
5.6.5 netstat
显示网络状况。可以用来看网络的组态及各项服务的情形。
参数:
-a 显示所有信息
-n 以 number 方式显示 IP 地址
-i 显示网络接口$ netstat -a
$ netstat -ni
5.6.6 traceroute
追踪网络路径,用这个指令,你可以知道从你的主机到某一台主机的过程中经过了哪些机器。
使用方法:$ traceroute [url]www.freebsd.org[/url]
5.6.7 sockstat
查看主机 internet 或 domain socket。你可以用来查询有谁连到你的机器中,由哪一个网络服务接收,该网络服务的 PID 是多少等。还可以查询本机开放了哪些 port、提供了哪些服务。
5.6.8 ifconfig
设定或检查网络接口,ifconfig 可以用来设定你的网络卡,显示网络接口的信息。
参数:
-a 详细显示所有接口
-u 显示目前使用中的装置
interface 显示该interface 的信息,此 interface 为你的网络卡代号或其它代号。
down 停用某一装置
up 启用某一装置$ ifconfig -a                显示所有接口的信息
$ ifconfig vr0                显示网络卡 vr0 的信息
$ ifconfig vr0 down        停用网络卡 vr0
$ ifconfig vr0 192.168.0.1netmask 255.255.255.0        设定网络卡 vr0 的 ip
$ ifconfig vr0 up                启用网络卡 vr0
5.6.9 tcpdump
列出所有到达本机的 tcp 封包。
5.6.10 lynx
文字浏览器。这并不是 FreeBSD 内定的指令,所以必须先使用 port 安装:# cd /usr/ports/www/lynx
# make install clean
安装完就可以使用 lynx 来上网浏览网页:$ lynx [url]www.freebsd.org[/url]
我们也可以使用 lynx 来下载网页上的档案。例如,我们要档案位置是 [url]http://www.apache.org/dist/httpd/apache_1.3.33.zip[/url],可以使用下列指令来下载它,并存成 apache.zip 这个档名:$ lynx -dump [url]http://www.apache.org/dist/httpd/apache_1.3.33.zip[/url] > apache.zip

逍遥 发表于 2006-6-5 15:07

第六章 档案系统管理
管理档案系统是系统管理者最重要的工作之一,我们必须确定使用者可以存取他们需要的数据,而且储存装置必须随时都保持正常运作。
本章读完后,您将可以了解下列基本的档案系统管理知识:
如何得知目前档案系统的使用情形。
如何挂入与卸载档案系统。
如何使用 FAT/FAT32/NTFS 硬盘。
如何使用光驱。
如何分割及格式化硬盘。
使用 USB 大姆哥或硬盘。
如何进行档案系统检查与修复。
FreeBSD SWAP 及虚拟磁盘。
档案系统快照
6.1 FreeBSD 的档案系统架构
我们知道在 UNIX 系统中,档案系统结构是一个树状结构,一个目录下还有很多的目录及档案,而这些目录下又会有更多的目录及档案,就像是一颗树一样,从根开始往上扩展。
对于硬盘的使用,在 UNIX 系统中,硬盘分割区会被挂在一个目录下,在存取磁盘前,「挂入」(mount) 是必要的过程。也就是说,系统会将一个硬盘的分割区挂在一个目录下,就好像 Windows 会将硬盘分割区放在 C:、D: 同样意思。所以,在 UNIX 系统中,磁盘分割区会和现有的系统目录合并。
在说明 FreeBSD 如何硬盘挂在目录下使用之前,我们先来看一下 FreeBSD 对于储存装置的命名规则。FreeBSD 会给每个硬盘、光驱的储存装置一个代号,并在 /dev 目录下产生一个相对映的装置文件。例如,我们的 IDE 硬盘代号就是 ad。以下为常见的储存装置代号:
ad:IDE 硬盘。
acd:IDE 光驱。
da:SCSI 硬盘、USB 硬盘及大姆哥。
cd:SCSI 光驱。
fd:软盘机。
sa:SCSI 磁带机。
ast:IDE 磁带机。
装置的代号由 0 开始算,第一个 IDE 硬盘的代号是 ad0,第二个是 ad1,依此类推。如果您有一个 IDE 硬盘,则可以在 /dev/ 中看到一个档名为 /dev/ad0 的装置文件。
大多数的操作系统都支持将一个硬盘分割成多个扇区,以 Windows 而言,我们可以将一个硬盘分割成 C:、D: 等多个扇区。在 Windows 中,我们称这个分割区为 Partition。然而,在 FreeBSD 中,我们称之为 slice。不管是 Windows 的 Partition 或是 FreeBSD 的 slice,在这里我们统称为主要扇区。PC 架构下,BIOS 认得的主要扇区最多只有四个。
FreeBSD 和其它操作系统不同的地方是我们会先分割在主要扇区 (slice) 下再细分成多个分割区,而这个细分之后的分割区才叫做 Partition。以下面这个图为例:
图 6-1
[img]http://homepage.cqwu.net/wxfy/images/ch06_01.png[/img]
我们看到第一个主要扇区是 Windows 用的掉的,它在 FreeBSD 中的代号是 ad0s1,而第二个主要扇区是 FreeBSD 所使用,其代号是 ad0s2,代号 s1、s2 指的就是主要扇区 slice 1 及 slice 2。而在 ad0s2 这个主要扇区中,我们又细分为三个分割区,分别是 ad0s2a、ad0s2b 及 ad0s2d。
分割区代号 a、b、d 等在 FreeBSD 有一些规则:
a:代号 a 通常会分配给根目录使用。
b:代号 b 通常是给 swap 空间使用。
c:代号 c 通常是代表整个主要扇区,所以不会被拿来使用。
defgh:其它的代号都是可以被用在任何分割区上。以前代号 d 有一些特别用意,不过现在已经没有了。
所以当您看到一个分割区代号 ad0s1a 时,就可以知道它是第一个 IDE 硬盘 (ad0) 的第一个主要扇区 (ad0s1) 的第一个分割区 (ad0s1a)。
让我们回到硬盘分割区和目录之间的关系。在 FreeBSD 中,硬盘分割区会被挂在目录下使用,例如下列的 df 指令输出结果:# df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ad0s1a    1.9G    389M    1.4G    21%    /
devfs          1.0K    1.0K      0B   100%    /dev
/dev/ad0s1d    989M     54K    910M     0%    /var
/dev/ad0s1e    4.8G    3.8G    657M    86%    /usr
/dev/ad1s1d    10.9G   149M   10.6G     1%    /usr/local
我们可以看到分割区 ad0s1a 是挂在根目录 (/) 下,而 ad0s1d 挂在 /var 中。上述 df 指令输出的范例中,/、/dev、/var、/usr 等都是磁盘分割区的挂入点 (mount points)。下图即为分割区示意图:
图 6-2
[img]http://homepage.cqwu.net/wxfy/images/ch06_02.png[/img]
除了根目录外,每一个挂入点都可以被卸载。例如 ad1s1d 被挂在 /usr/local 中,我们可以动态卸载它。/usr/local 在挂入磁盘分割区前,它可能空的或是已经有一些档案或目录,但挂入后,我们看到该目录中的东西会全部变成存在于 ad1s1d 这个硬盘中的数据。通常这些系统用的挂入点在还没挂入磁盘前都是一些空目录,而挂入后才会出现该目录下的其它档案及数据。以 /var 为例,在挂入前它是空的目录,而挂入后,才会出现 db、mail 等目录。
请注意,挂入点和磁盘分割区之间并没有什么特殊关联。例如,如果您有二个挂入点 /volume1 及 /volume2,而有二个分割区 ad0s1d 及 ad0s1e,您可以任意将 ad0s1d 挂在 /volume1 或 /volume2。以上图中的挂入点为例,您也可以将 ad1s1d 挂在 /mnt 下,只是 ad1s1d 这个分割区原本是挂在 /usr/local 下,已有一些 /usr/local 下的目录结构及数据,所以还是挂在 /usr/local 下才不会有系统档案找不到的问题。
6.2 监看档案系统使用情形
几乎所有 FreeBSD 上的应用都必须使用硬盘。我们必须注意系统磁盘空间足够,并了解磁盘的使用效率。本小节中,我们将介绍一些 FreeBSD 常用的磁盘管理指令,让我们可以更快的了解目前的系统使用状态。
6.2.1 磁盘空间使用情形
在大部份的 UNIX 系统中都有二个指令可以了解硬盘的使用情形:df 及 du。
指令 df 可以显示目前所有档案系统的最大可用空间及使用情形,请看下列这个例子:# df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ad0s1a    1.9G    389M    1.4G    21%    /
devfs          1.0K    1.0K      0B   100%    /dev
/dev/ad0s1d    989M     54K    910M     0%    /tmp
/dev/ad0s1f    4.8G    3.8G    657M    86%    /usr
/dev/ad0s1e    1.9G    149M    1.6G     8%    /var
/dev/ad0s1g     26G    890K     24G     0%    /volume2
/dev/da0s1d    325G    261G     38G    87%    /volume1
我们加了参数 -h 表示使用「Human-readable」的输出,也就是在档案系统大小使用 GB、MB 等易读的格式。
上面的指令输出的第一个字段及最后一个字段分别是档案系统及其挂入点。我们可以看到 /dev/ad0s1a 这个分割区被挂在根目录下。我们在上一小节提到过 ad 所代表的是 IDE 的硬盘,而 s1 表示第一个主要扇区。我另外有一个 SCSI 硬盘,它的代号是 da,它的容量很大,主要用来存放数据。devfs 是一个特别的档案系统,该档案系统并非真的磁盘,而是 FreeBSD 用来管理系统硬件装置的虚拟档案系统。
接下来的四个字段 Size、Used、Avail、及 Capacity 分别是该分割区的容量、已使用的大小、剩下的大小、及使用的百分比。当硬盘容量已满时,您可能会看到已使用的百分比超过 100%,因为 FreeBSD 会留一些空间给 root,让 root 在档案系统满时,还是可以写东西到该档案系统中,以进行管理。
另外,我们还可以使用参数 -i 来查看目前档案系统 inode 的使用情形。有的时候虽然档案系统还有空间,但若没有足够的 inode 来存放档案的信息,一样会不能增加新的档案。# df -ih
Filesystem     Size    Used   Avail Capacity iused    ifree %iused  Mounted on
/dev/ad0s1a    1.9G    389M    1.4G    21%   20495   262127    7%   /
devfs          1.0K    1.0K      0B   100%       0        0  100%   /dev
/dev/ad0s1d    989M     62K    910M     0%      24   141286    0%   /tmp
/dev/ad0s1f    4.8G    3.8G    657M    86%  311439   348015   47%   /usr
/dev/ad0s1e    1.9G    149M    1.6G     8%    1758   280864    1%   /var
/dev/ad0s1g     26G    890K     24G     0%      12  3532786    0%   /volume2
/dev/da0s1d    325G    261G     38G    87%  707277 43311409    2%   /volume1
我们可以看到根目录的已经用掉的 inode 数量为 20495,还有 262127 的可用 inode。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
还记得什么是 inode 吗?所谓的 inode 是用来存放档案及目录的基本信息 (metadata),包含时间、档名、使用者及群组等。在分割扇区时,系统会先做出一堆 inode 以供以后使用,inode 的数量关系着系统中可以建立的档案及目录总数。如果要存的档案大部分都很小,则同样大小的硬盘中会有较多的档案,也就是说需要较多的 inode 来挂档案及目录。
指令 df 只能用来查看整个档案系统的使用情形,如果您需要知道某个目录的使用情形,可以用指令 du。
指令 du 能以指定的目录下的子目录为单位,显示每个目录内所有档案所占用的磁盘空间大小。例如:# du -h /etc
104K        /etc/defaults
6.0K        /etc/X11
8.0K        /etc/bluetooth
4.0K        /etc/gnats
52K        /etc/isdn
388K        /etc/mail
68K        /etc/mtree
2.0K        /etc/ntp
38K        /etc/pam.d
44K        /etc/periodic/daily
6.0K        /etc/periodic/monthly
42K        /etc/periodic/security
16K        /etc/periodic/weekly
110K        /etc/periodic
6.0K        /etc/ppp
318K        /etc/rc.d
2.0K        /etc/skel
130K        /etc/ssh
10K        /etc/ssl
1.7M        /etc
我们目样使用 -h 参数来显示 human-readable 的格式。在应用时,我们可以使用 du 这个指令来查看哪个目录占用最多的空间。不过,du 的输出结果通常很长,我们可以加上 -s 参数来省略指定目录下的子目录,而只显示该目录的总合即可:# du -sh /etc
1.7M    /etc
在查看目录的使用情形时,我们可以将输出结果导到 sort 指令进行排序,以了解哪个档案用了最多的空间:# du /etc | sort -nr | more
1746        /etc
388        /etc/mail
318        /etc/rc.d
130        /etc/ssh
110        /etc/periodic
104        /etc/defaults
68        /etc/mtree
52        /etc/isdn
44        /etc/periodic/daily
42        /etc/periodic/security
38        /etc/pam.d
16        /etc/periodic/weekly
10        /etc/ssl
8        /etc/bluetooth
6        /etc/ppp
6        /etc/periodic/monthly
6        /etc/X11
4        /etc/gnats
2        /etc/skel
2        /etc/ntp
sort 的参数 -nr 表示要以数字排序法进行反向排序,因为我们要对目录大小做排序,所以不可以使用 human-readable 的大小输出,不然目录大小中会有 K、M 等字样,会造成排序不正确。
6.2.2 磁盘使用效率
除了查看硬盘的空间使用情形外,我们还可以查看目前硬盘是否忙碌中,以了解硬盘的使用效率。我们可以使用 systat 这个指令:# systat -vm 1
   3 users    Load  0.12  0.12  0.09                   6 26 00:38
Mem:KB    REAL            VIRTUAL                     VN PAGER  SWAP PAGER
       Tot   Share      Tot    Share    Free         in  out     in  out
Act  130120    5436   385556    11716   30540 count  146
All  233584   17544  2762124    45604         pages  846
                                                                Interrupts
Proc:r  p  d  s  w    Csw  Trp  Sys  Int  Sof  Flt      8 cow     474 total
            75      1514  379 2525  690   66  375   70564 wire    100 0: clk
                                                   132932 act         1: atkb
14.0%Sys   1.6%Intr  2.3%User  0.0%Nice 82.2%Idl    18024 inact       3: sio1
|    |    |    |    |    |    |    |    |    |      13024 cache       4: sio0
=======+>                                           17516 free        7: ppc0
                                                          daefr   128 8: rtc
Namei         Name-cache    Dir-cache                  38 prcfr    40 9: fxp0
   Calls     hits    %     hits    %                  228 react    31 10: fxp
    1020      672   66                                    pdwak       11: hpt
                                      43 zfod             pdpgs       12: psm
Disks   ad0   da0 pass0                43 ofod            intrn       13: npx
KB/t  28.20  0.00  0.00                   %slo-z    35664 buf     175 14: ata
tps     164     0     0                70 tfree       334 dirty       15: ata
MB/s   4.52  0.00  0.00                             17810 desiredvnodes
% busy   43     0     0                             16852 numvnodes
                                                    13772 freevnodes
systat 有许多信息,我们使用参数 -vm1 来显示最详细的信息,并设定每 1 秒更新一次信息。在上面一堆复制的信息中,请将重点于在中间「====+>」及左下角的 Disks,中间部份的「====+>」表示目前 CPU 的使用情形,我们可以看到有 82.2% 的 Idle (闲置)。而硬盘的使用情形中,我的第一个硬盘 ad0 正在忙碌中,有 43% 的忙碌。而另一个 SCSI 硬盘 da0 则是完全闲置,也就是没有人正在使用它。
如果您想要知硬盘本身的存取速度,可以使用 diskinfo 这个指令。diskinfo 加了 -t 参数会对硬盘做一些测试并回报结果:# diskinfo -v -t ad0
ad0
       512             # sectorsize
       40020664320     # mediasize in bytes (37G)
       78165360        # mediasize in sectors
       77545           # Cylinders according to firmware.
       16              # Heads according to firmware.
       63              # Sectors according to firmware.
Seek times:
       Full stroke:      250 iter in   5.199255 sec =   20.797 msec
       Half stroke:      250 iter in   4.011383 sec =   16.046 msec
       Quarter stroke:   500 iter in   6.797812 sec =   13.596 msec
       Short forward:    400 iter in   2.774055 sec =    6.935 msec
       Short backward:   400 iter in   3.257613 sec =    8.144 msec
       Seq outer:       2048 iter in   0.352483 sec =    0.172 msec
       Seq inner:       2048 iter in   0.369383 sec =    0.180 msec
Transfer rates:
       outside:       102400 kbytes in   4.511970 sec =    22695 kbytes/sec
       middle:        102400 kbytes in   4.770641 sec =    21465 kbytes/sec
       inside:        102400 kbytes in   4.174557 sec =    24530 kbytes/sec
diskinfo 指令的 -r 参数会先印出一些分割区的基本信息,包含 sector size、分割区大小、磁柱数量等。接下来的测试会花一点时间,测试结果包含了「Seek times」及「Transfer rates」。「Seek times」指的是硬盘的搜寻速度,而「Transfer rates」是数据找到后从硬盘传到系统的速度。
6.3 挂入档案系统
6.3.1 挂入与卸载 FreeBSD 档案系统
我们知道在存取磁盘前,必须先将该磁盘「挂入」(mount) 一个目录中,而挂入档案系统的指令为 mount。它的用法如下:# mount device mount-point
例如,我们要将 ad0s1e 挂入 /home2 中:# mount /dev/ad0s1e /home2
在执行 mount 指令前,我们必须确定挂入点存在,如果不在必须先建立目录。
如果执行 mount 时不加任何参数则可以显示目前已挂入的档案系统:# mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1d on /tmp (ufs, local, soft-updates)
/dev/ad0s1f on /usr (ufs, local, soft-updates)
/dev/ad0s1e on /var (ufs, local, soft-updates)
/dev/ad0s1g on /volume2 (ufs, local, soft-updates)
/dev/da0s1d on /volume1 (ufs, local, soft-updates)
如果您要卸载一个档案系统,可以使用 umount 指令。例如,我们要卸载 /usr/local:# umount /usr/local
如果在卸载档案系统时出现下列讯息,表示该档案系统忙碌中,有可能有其它人正在存取它。# umount /var
umount: unmount of /var failed: Device busy
6.3.2 挂入与卸载其它档案系统
mount 指令除了可以让我们挂入 FreeBSD 的预设的档案系统 UFS 外,我们还可以用它来挂入其它 FreeBSD 支持的档案系统格式。例如,FreeBSD 安装光盘是一般标准的数据光盘,它的档案系统格式是 CD9660,我们将该 CD 挂入系统目录中。首先,请先将光盘放入光驱中,接着请使用下列指令来挂入光盘片:# mount -t cd9660 /dev/acd0 /cdrom
在使用 mount 指令时,我们加上参数 -t cd9660 以指定档案系统格式为 cd9660。我们可以看到在挂入之前,/cdrom 这个目录是空的,而挂入后就出现了许多资料。光驱挂入后,您会发现光驱的退片键将失去作用,我们必须先卸载它才可以取出光盘片。
如果您要卸载它,可以使用 umount 指令。如果您在卸载时发生错误,请注意您的所在目录是不是在 /cdrom 下,如果是,必须先离开才可以顺利 umount:# cd /
# umount /cdrom
我们说过,挂入点和磁盘分割区之间并没有必然的关系,您也可以将光盘挂入 /mnt 中,不一定要挂入 /cdrom,将 CDROM 挂入 /cdrom 只是习惯用法而已。
除了一般数据光盘的 cd9660 档案格式外,FreeBSD 还支持下列常用的档案格式:
[b]档案系统格式[/b]
[b]说明[/b]
ufs
FreeBSD 预设的档案系统。
ext2fs
Linux EXT2 档案格式。
msdosfs
FAT/FAT32,DOS 兼容的档案系统。
ntfs
Windows 的 NTFS。
cd9660
CD-ROM 的档案系统。
udf
DVD 数据光盘格式。
nfs
和 Sun Microsystems 相容的 "Network File System"。
smbfs
CIFS/SMB 档案格式,也就是 Windows 的网络芳邻,请参考 Samba 网络芳邻一章。
mfs
本地的 memory-based UNIX 档案系统。
swap
用来作 swapping 的档案系统。
procfs
用来存取执行程序(process)的档案系统。
kernfs
用来存取核心参数(kernel parameter)的档案系统。
您可以在 mount 指令的参数 -t 之后加入上述档案格式做为参数以挂入正确的档案系统。或者,您也可以依档案系统的不同使用 mount_xxxx 指令。例如,要挂入 msdos 档案系统时,可以使用 mount_msdosfs;要挂入 cd9660 时,可以使用指令 mount_cd9660。您可以在 /sbin 目录下看到这些 mount 的指令:# ls /sbin/mount*
/sbin/mount*             /sbin/mount_mfs*        /sbin/mount_procfs*
/sbin/mount_cd9660*      /sbin/mount_msdosfs*    /sbin/mount_std*
/sbin/mount_devfs*       /sbin/mount_nfs*        /sbin/mount_udf*
/sbin/mount_ext2fs*      /sbin/mount_nfs4*       /sbin/mount_umapfs*
/sbin/mount_fdescfs*     /sbin/mount_ntfs*       /sbin/mount_unionfs*
/sbin/mount_linprocfs*   /sbin/mount_nullfs*
实际上,当您执行 mount 加参数 -t 时,mount 就是会依据 -t 所给的档案系统去执行相对映的 mount_xxx。
必须注意的是,在 Windows/DOS 操作系统中,有所谓的延伸扇区 (Extended Partitions)。延伸扇区有点像是 FreeBSD 的 slice,在延伸扇区下,会在细分成多个逻辑扇区 (Logical Partitions),当 FreeBSD 遇到这种扇区时,会将各个逻辑扇区编号从第五个 slice 开始 (跳过最多 4 个 slice 的限制)。所以,DOS 中第一个逻辑扇区在 FreeBSD 中的编号就是 ad0s5,第二个逻辑扇区就是 ad0s6,依此类推。
另外,有些档案系统在 FreeBSD 中只有只读的能力。例如 NTFS,我们只能够读取该扇区的数据,而无法进行任何写入的动作。
6.3.3 开机时自动挂入
如果您在安装 FreeBSD 时是以光盘安装,您也许会发现只要以下列二个指令其中一个就可以挂入光驱:# mount /cdrom
# mount /dev/acd0
我们之所以可以这么做是因为在 /etc/fstab 中已经记录了 /cdrom 应该要挂入另一个装置。让我们来看一下这个档:
# Device        Mountpoint        FStype        Options                Dump        Pass#
/dev/ad0s1b        none                swap        sw                0        0
/dev/ad0s1a        /                ufs        rw                1        1
/dev/ad0s1d        /tmp                ufs        rw                2        2
/dev/ad0s1f        /usr                ufs        rw                2        2
/dev/ad0s1e        /var                ufs        rw                2        2
/dev/acd0        /cdrom                cd9660        ro,noauto        0        0
我们可以看到最后一行挂入点 (Mount point) /cdrom 所对映的装置是 /dev/acd0,而档案系统格式的字段中 (FStype) 所指定的格式是 cd9660,所以我们可以不必打完整的指令就可以挂入光盘。
在系统开机时,FreeBSD 会参考 fstab 来决定要将哪些档案系统挂进来。在 fstab 各个字段所代表的意义如下:
Device:装置名称,就是要挂入的来源,最常用的是 /dev/ 的档案,我们说过FreeBSD 将装置视为档案,所以这里填的是 /dev/*。装置也可以是NFS或是其它的虚拟装置,如 proc,linpro 等。
Mountpoint:挂入点,就是你要将来源挂到什么地方,其中 swap 没有挂入点,所以是 none。
FStype:档案系统就是要挂入的类型,必须在 kernel 中有定义。一般 FreeBSD 的档案是 ufs,硬盘要挂入的设定就是 ufs。如果是 cdrom 就是 cd9660。请参考上方的档案系统格式说明。
Options:参数依各装置而有所不同,如果开机时不挂入的话(如 cdrom),就必须加入参数 noauto。defaults 设定为 rw、dev、exec、auto、nouser、async。可用的参数如下,加上no 则为相反,如 nouser、noauto:
  
rw
可读可写。
ro
只可读不可写。
async
所有数据以异步方式完成。
atime
每次存取动作都更新档案时间。
auto
能被 mount -a 自动挂入系统。
dev
解译档案系统特性与储存装置规格。
exec
允许档案系统中的二进制元文件被执行。
user
允许一般user 挂入。
sync
所有数据以同步方式完成。
sw
swap。
noauto
开机时不挂入。
userquota
使用者磁盘配额限制 (须 kernel 支持 quota)。
groupquota
群组磁盘配额限制 (须 kernel 支持 quota)。
dump:表示使用指令 dump 时要备份的档案系统,0表示不要、1表示要。
pass:这个字段是给指令 fsck 用的,是检查的顺序。/ 的数字应该是1而其它的档案系统为2。不需检查的就是0(如 cdrom,swap 等)。
如果您新增一个分割区,并且希望在开机时自动加载,可以编辑 fstab,并加入您所要挂入的扇区。
6.4 磁盘分割与格式化
如果您目前系统只有一个硬盘,并想加上第二个硬盘时,如果是 Windows 或 DOS,我们都会先做硬盘的切割 (partition),再做格式化 (format)。在 FreeBSD 中,要使用一个新硬盘的动作也类似,必须先切割扇区,再进行格式化。
切割扇区的意思就是指定要让系统使用多大的硬盘空间,之后我们在将这个空间格式化成 FreeBSD 的档案系统格式。FreeBSD 大家应该听过 FAT 档案系统,它是以前 DOS 时代所使用的档案系统,后来又发展了 FAT32,以支持大于 2GB 的磁盘分割区。而 Windows NT/2000/XP 预设使用的档案系统为 NTFS。FreeBSD 4.x 预设使用的档案系统格式为 UFS (Unix File System),在 5.x 之后,加入了新的档案系统格式 UFS2。UFS2 和 UFS 最大的差别是 UFS2 支持 1TB 以上的硬盘分割区,除此之外, UFS2 还有一些新的功能,但都是在 UFS 上进行小修改,所以就速度上而言应该差不多。如果您有兴趣可以参考这一份
[url=http://sixshooter.v6.thrupoint.net/jeroen/faq.html]Little UFS2 FAQ[/url]
(
[url=http://sixshooter.v6.thrupoint.net/jeroen/faq.html]http://sixshooter.v6.thrupoint.net/jeroen/faq.html[/url]
)。
总而言之,新增一个硬盘的步骤为:
切割出 Slice:就是在硬盘切割出一个扇区供 FreeBSD 使用。
切割 Partition:就是在 Slice 下再切割 Partition。
进行格式化。
我们假设您要加入的是一颗 IDE 硬盘,而希望将这个硬盘挂入 /volume1 这个目录下。您第一步要做的就是先将硬盘插入计算机后,开机看看 BIOS 有没有侦测到这个硬盘。我们假设这个硬盘接在第一个排线,是计算机中的第二颗硬盘,则开机后,这个硬盘的代号就是 ad1。请使用 root 登入后,执行指令 dmesg 或是 more /var/run/dmesg.boot,看看 FreeBSD 有没有侦测新的硬盘 ad1。
接下来,您就可以使用指令 sysinstall (如果是 FreeBSD 5.2 以前的版本,请使用 /stand/sysinstall) 来新增硬盘了。
6.4.1 使用 sysinstall
在使用 sysinstall 来设定新的硬盘之前,请先确定您是以 root 身份执行。接下来,您就可以依照下列步骤来新增硬盘:
[b]进入 sysinstall[/b]
进入 sysinstall 的主选单后,首先请选择 [Configure],进入后,再选择 [Fdisk] 项目以进入 Fdisk 选单。第一次进入 Fdisk 时,sysinstall 会要求您选择所要设定的硬盘,请选择 ad1。
[b]使用 Fdisk[/b]
相信您对于 Fdisk 的画面应该很熟悉,我们在安装 FreeBSD 时就使用过它。如果您要让 FreeBSD 使用整个硬盘,请按 [A],接下来请按 [W] 以将设定写入硬盘。在按了 [W] 后,会出现一个确认的窗口,选 [Yes] 即可。最后会出现要您选择所要使用的 Boot Manager,因为这一个硬盘不是要用来开机用的,所以我们选 [None]。写入后,请按 [Q] 离开 Fdisk 的画面,并回到 Configure 画面。接着请离开 sysinstall,再重新执行 sysinstall 以让 sysinstall 重新侦测硬盘设定。
[b]使用 Disk Label Editor[/b]
重新执行 sysinstall 后,请选择 [Configure] -> [Label] 以进入 Disk Label Editor。Disk Label Editor 会帮我们在 Slice 下切割 Partition 并格式化硬盘。在 Disk Label Editor 中,我最多可以建八个分割区 (Partition),编号从 a 到 h。不过有的代号有特殊用途。例如,分割区 a 通常会保留给根目录使用,所以我们开机时所使用的分割区代号会是 a。而代号 b 表示是 swap partition,我们可以在多个硬盘中都有 swap partition。代号 c 是用来表示整个硬盘或是整个 Slice。所以最后 d-h 才是一般我们会使用到的分割区代号。
我们要让 FreeBSD 使用整个硬盘,所以必须将整个 Slice 切成一个 Partition。所以一进入 Disk Label Editor 后,请按 [C],在画面上会显示整个 Slice 的大小,直接按 Enter 即可建立一个分割区。接下来,我们必须选择所要挂入本分割区的目录,请选择  FS 后,再输入您所要挂入的目录,例如 /volume1。如果是在安装 FreeBSD 时,我们所设定的挂入点会被写到 /etc/fstab 中,开机后就会自动将磁盘挂入该目录。但是我们这里所指定的挂入点并不会被写入 /etc/fstab 中,最后我们还是必须再设定 /etc/fstab。
最后请按 [W]以进行分割及格式化。完成后,系统会将该才所建立的磁盘挂入您所指定的目录下。接着请离开 sysinstall 回到命令列。
[b]设定 /etc/fstab[/b]
为了让系统在开机时可以自动将此分割区挂入,我们必须再设定 /etc/fstab。请在 /etc/fstab 中增加下列数据:
# Device          Mountpoint   FStype  Options     Dump    Pass#
/dev/ad1s1d       /volume1     ufs     rw          2       2
6.4.2 使用命令列
您不一定要使用 sysinstall 来分割及格式化硬盘,sysinstall 只是提供一个比较容易使用的界面,最后还是会呼叫命令列的指令以完成硬盘的设定。使用命令列的方式比较复杂,而且较容易出错,但却可以让您有更灵活的应用。看了如何从命令列新增一个硬盘可以让您对 sysinstall 所做的事更了解。
我们一样假设要新增的硬盘为 ad1,并且将整个硬盘切成一个扇区给 FreeBSD 使用。第一步要做的就是先使用 dd 这个指令来清除硬盘上旧的设定:# dd if=/dev/zero of=/dev/ad1 bs=1k count=1
上述指令的意思是从 /dev/zero 这个装置读出数据写到 /dev/ad1 中,每次写入的 block size (bs) 为 1KB,做一次写入的动作即可 (count)。我们知道 FreeBSD 各动硬件装置当做档案来看待,/dev/zero 这个档案其实是一个虚拟的档案,我们从这个档案读出来的数据都是 0。上述指令的动作的目的就是要将硬盘 ad1 的开头 1024KB 清成 0,而硬盘开头的部份存放的就是一些分割区设定的数据 (Partition Table)。
接下来呢我们就必须使用 fdisk 这个指令来切割 slice 了:# fdisk -BI ad1
******* Working on device /dev/ad1 *******
fdisk: invalid fdisk partition table found
上述 fdisk 指令表示我们要将 ad1 切割成一个 slice (参数 -I),并清除放开机信息的第 0 个 sector。您可以忽略「invalid fdisk partition table found」的警告,因为我们一开始并没有任何分割区。接下来我们就可以使用下列 bsdlabel 指令来建立预设的 partition label,再使用 bsdlabel 加参数 e 以修改建立的 lable:# bsdlabel -B -w ad1s1 auto
# bsdlabel -e ad1s1
接着会使用您预设的文书编辑软件跳出一个窗口,请将 a: 改成 d: 后存档离开,因为我们新增加的分割区不是要给根目录使用,所以不用代号 a,而是使用第一个不具特别意义的代号 d。
# /dev/ad1s1:
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
[b]
[color=#ff0000]d[/color]
[/b]: 78156146       16    unused        0     0
c: 78156162        0    unused        0     0 # "raw" part, don't edit

将 a: 改成 d: 后,存档离开即可。接下来我们就可以格式化这一个分割区了。FreeBSD 中用来格式化 UFS 档案系统的指令为 newfs:# newfs /dev/ad1s1d
以上即为新增一颗硬盘所要做的事。请注意,bsdlabel 这个指令是 FreeBSD 5.1 以后才有的,在 5.1 以前,请使用 disklabel。
接下来您就可以将新的硬盘挂入了,假设您要挂入的目录是 /volume1,则请使用下列指令:# mkdir /volume1
# mount /dev/ad1s1d /volume1
最后,如果您希望一开机就将此分割区挂入,请修改 /etc/fstab,并加入此分割区的设定。
6.5 使用 USB 磁盘驱动器
现在有很多 USB 装置:USB 大姆哥、USB 硬盘外接盒、USB 光驱等。大多数的操作系统都是将 USB 设备看模拟成 SCSI 装置,FreeBSD 也是一样。USB 硬盘、大姆哥等都会被当做 SCSI 硬盘,代号会是 da0、da1;而 USB 光驱则是 cd0。
6.5.1 事前的准备
在开始使用 USB 磁盘驱动器之前,我们必须先确定系统有支持 USB 装置。在核心 (Kernel) 中,关于 USB 硬盘及光驱的支持必须要有下列项目:
device        scbus        # SCSI bus (required for SCSI)
device        da        # Direct Access (disks)
device        cd        # 支援 CD-ROM/DVD
device        pass        # Passthrough device (direct SCSI access)
device        uhci        # UHCI PCI->USB interface (支援 USB 1.x)
device        ohci        # OHCI PCI->USB interface (支援 USB 1.x)
device        ehci        # EHCI PCI->USB interface (支援 USB 2.0)
device        usb        # USB Bus (required)
device        umass        # Disks/Mass storage - Requires scbus and da
如果您不使用 USB 光驱,可以将「device cd」移除。如果您使用的是 GENERIC 核心 (FreeBSD 预设的核心),那么您的核心已经支持 USB 硬盘了。如果您使用的是 FreeBSD 6.0 以前的版本,您必须再修改修改核心,以支持 USB 2.0。请在核心设定档中加入下列这一行以使用 USB 2.0:
device        ehci        # EHCI PCI->USB interface (USB 2.0)
不过您必须注意 FreeBSD 4.10 以后才开始支持 USB 2.0 喔。如果没有加入 USB 2.0 的支持,所有装置将会以 USB 1.1 速度运作。关于如何编译核心请参考「编译核心」一章的说明。
另外,我们必须启动 usbd 以支持某些 USB 装置,例如 USB hub 等。FreeBSD 安装完成后,预设可能有启动 usbd,如果没有,请修改 /etc/rc.conf 加入下列设定:
usbd_enable="YES"
重新编译核心,并修改 /etc/rc.conf 后,您必须重新开机才可以继续下列动作喔。
重开机后,您就可以将 USB 装置插入。插入后,您会在 console 看到下列讯息:
umass0: USB Flash Disk, rev 2.00/2.00, addr 2
da0 at umass-sim0 bus 0 target 0 lun 0
da0:  Removable Direct Access SCSI-2 device
da0: 1.000MB/s transfers
da0: 125MB (256000 512 byte sectors: 64H 32S/T 125C)
我们可以看到这个装置的名称为 da0,我们以下的操作都会以 da0 做为范例。如果您没有看到上述讯息,表示没有抓到 USB 装置,请检查核心设定后再试一次。
由于 USB 磁盘驱动器会被仿真成 SCSI 装置,所以您也可以使用 SCSI 工具 camcontrol 来查看目前所有 USB 装置:# camcontrol devlist
at scbus1 target 0 lun 0 (da0,pass0)
6.5.2 挂入已格式化的磁盘驱动器
如果您要挂入已从 Windows/DOS 中格式化好的 USB 磁盘驱动器,它的档案格式有可能是 FAT/FAT32 或是 NTFS。如果您不知道它的档案格式,可以使用指令 fdisk 查看:# fdisk da0
******* Working on device /dev/da0 *******
parameters extracted from in-core disklabel are:
cylinders=125 heads=64 sectors/track=32 (2048 blks/cyl)
parameters to be used for BIOS calculations are:
cylinders=125 heads=64 sectors/track=32 (2048 blks/cyl)
Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
[b]The data for partition 1 is:[/b]
sysid 11 (0x0b),([b]DOS or Windows 95 with 32 bit FAT[/b])
start 32, size 255968 (124 Meg), flag 80 (active)
beg: cyl 0/ head 1/ sector 1;
end: cyl 124/ head 63/ sector 32
The data for partition 2 is:
The data for partition 3 is:
The data for partition 4 is:
请注意粗体字的部份,我们可以看到在 da0 中有一个分割区,其档案系统格式为 FAT32。所以要挂入档案系统时,分割区代号为 da0s1 (请参考本章最开头分割区代号的说明)。以下我们的操作都是使用 da0s1。
挂入 FAT/FAT32 档案格式
如果您要挂入的档案系统为 FAT/FAT32,在 FreeBSD 5.x 以后,请使用指令 mount_msdosfs,若是 FreeBSD 4.x 请使用 mount_msdos:# mount_msdosfs -L zh_TW.Big5 /dev/da0s1 /mnt
我们在 mount_msdosfs 指令中使用参数 -L,并指定 locale 为 zh_TW.Big5 以支持中文档名。如果没有加此参数,中文档名将会是乱码。
如果您在挂入时出现下列错误讯息,表示您需要安装 libiconv 模块:# mount_msdosfs -L zh_TW.Big5 /dev/da0s1 /mnt
mount_msdosfs: Unable to load iconv library: Shared object "libiconv.so"
not found, required by "mo"
: No such file or directory
mount_msdosfs: msdosfs_iconv: No such file or directory
我们可以使用 port 来安装 libiconv 模块: # cd /usr/ports/converters/libiconv
# make install
接着您就可以重新执行挂入的指令了。
挂入 NTFS 档案格式
如果您要挂入的档案系统格式为 NTFS,则必须使用指令 mount_ntfs:# mount_ntfs -C Big5 /dev/da0s1 /mnt
同样的,我们使用参数 -C 以支持 NTFS 的中文档名。不过,NTFS 在 FreeBSD 中只能只读而无法写入,所以您无法在 NTFS 分割区中进入任何写入的动作。
6.5.3 格式化 USB 磁盘驱动器
如果您要在 FreeBSD 中格式化 USB 磁盘驱动器,首先要考量的是这个磁盘是否要再拿到其它操作系统中使用。FreeBSD 可以格式化磁盘成为 FAT/FAT32 及 UFS。但是 Windows 操作系统只支持 FAT/FAT32。所以如果您要将磁盘拿到 Windows 中使用,请格式化成 FAT32。
FAT 档案系统格式的效率很差,尤其是大容量的档案系统时,存取的速度很慢。所以如果这个 USB 磁盘只要给 FreeBSD 使用,建议您格式化成 UFS 格式。如果您要将 USB 磁盘格式化成 FreeBSD 的 UFS 格式,请参考本章关于磁盘分割的说明,只要在格式化时选 da0 即可。我们这里只针对如何格式化成 FAT/FAT32 做说明。
分割扇区
在格式化之前,我们必须先进行磁盘分割。理论上,不同的磁盘分割区有不同的代号,例如,FreeBSD 磁盘分割区的代号为 165,而 FAT32 分割区的代号为 11。165 这个数字有没有很熟的感觉,我们在安装 FreeBSD 切割 slice 时就曾经使用过它。
您可以使用 sysinstall 来切割扇区,也可以使用命令列的指令。如果您要使用 sysinstall,请在进入 sysinstall 后,选择 [Configure] -> [Fdisk],将整个硬盘分割成一个扇区。请注意在输入分割区类型代号时,请将 165 改成 11 表示使用 FAT32。
如果您要使用命令列模式来切割扇区,和分割 FreeBSD 硬盘一样,我们使用 fdisk 这个指令。但因为 fdisk 在分割磁盘区时预设会使用 FreeBSD 的分割区代号,所以我们必须使用互动模式来进行磁盘分割:# dd if=/dev/zero of=/dev/da0 bs=1k count=1
# fdisk -B da0
******* Working on device /dev/da0 *******
parameters extracted from in-core disklabel are:
cylinders=125 heads=64 sectors/track=32 (2048 blks/cyl)
parameters to be used for BIOS calculations are:
cylinders=125 heads=64 sectors/track=32 (2048 blks/cyl)
Do you want to change our idea of what BIOS thinks ? [n] [b]
Do you want to change it? [n] [b]
Do you want to change it? [n] [b]
Do you want to change it? [n] [b]
3:
4:
Should we write new partition table? [n] [b]y
分割好磁盘后,我们就可以开始格式化了。
格式化成 FAT/FAT32
FreeBSD 中格式化 FAT 的指令为 newfs_msdos:# newfs_msdos /dev/da0s1
newfs_msdos 指令会自动依您的磁盘大小选择使用 FAT 或是 FAT32。现在您可以试着挂入看看可不可以使用:# mount_msdosfs -L zh_TW.Big5 /dev/da0s1 /mnt

6.6 档案系统修复
Unix 系统中大多有一个用来检查及修复档案系统的程序 - fsck。在不正常关机的情形下 (例如停电),FreeBSD 在开机时会自动执行 fsck。fsck 是 File System Consitency checK 的缩写,主要的用途在于检查档案系统的一致性 (consistency)。在系统开机时,要挂入档案系统前,FreeBSD 会先检查档案系统是否被标示为「clean」,如果不是,则会进行档案系统检查。在挂入档案系统时,系统会将档案系统标示为「not clean」。而在正常关机时,系统会先卸载档案系统,并于卸载时将档案系统标示为「clean」。这也就是为什么不正常关机后,在开机时会进行档案系统检查的原因。因为在不正常关机时,没有人去将档案系统设为「clean」。
为什么档案系统会有不一致呢?这要从档案系统的格式说起。一个档案可以分为档案属性 (meta-data) 和档案数据 (file content) 二个部分,档案的属性可能包含了档案长度、档案拥有者、连结数目等。而档案数据就是档案的实际内容。目录的结构也类似,只是目录的档案数据部份存放的是档案的档名、档案在档案系统中的位置等。这些数据在写入或删除时,可能都会被快取在内存中,再慢慢写入硬盘里。而硬盘的速度相对于内存而言很慢,在写入数据时,可能有写入一半就因为电源中断而写入不完全。例如,在新增档案时,有可能档案数据的部份已经写入硬盘中,但却还来不及更新档案属性及目录数据。这种情形就称为档案系统不一致。
基本上,fsck 会检查一致性,比较一些项目,例如 inode 的地址是否指向对的数据、空白区块的数目是否正确、目录结构是否完整等。但是实际上,fsck 修复档案的能力有限,它只能确保结构完整,但对于数据内容并没有修复的能力。而且,在开机过程中进行 fsck 需要花很久的时间。因此,尽量避免不正常关机才是比较好的方法。
然而,减少档案系统不一致的方法有很多种,在 Linux 中常见的方法是使用 journaling 或称为 logging 的方式。就是档案系统有任何更新时,系统都会先将档案属性的部份记录在一个日志里,因为比较重要的属性数据都很小,在写入日志时失败的机率比较低。等到系统更新完硬盘数据后才清除日志中的数据。如果更新到一半就关机,下次开机时,会使用倒推法回复原来的样子,或是将没写完的东西继续写下去。这种档案系统就叫做 Journaling File System,Linux 的 Ext3、Reiserfs 都是属于这种档案系统。不过 Journaling 的缺点就是要写二次属性数据,所以在速度上会慢一点。
FreeBSD 目前没有 Journaling File System,不过,在 FreeBSD 5.x 以后的 GENERIC Kernel 中,内建有 Soft Update 的技术。Soft Update 就是将要写入硬盘的属性数据利用特殊方法按顺序先写在内存中,在更新大量属性数据时,可以保证数据的一致性,并让不正常关机后的档案系统修复动作减到最少。而且,Soft Update 还结合了「Background fsck」的功能,让系统在开机时不必花很长的时间进行 fsck,而是将这个动作放在背景执行。Background fsck 结合了「档案系统快照」(我们会在下一小节说明),它会将开机时的档案系统状态快速的记录下来,再慢慢进行检修。
使用 Soft Update 可以增加资料写入的效率,避免数据不一致的情形,所以在 5.x 以后,除了根目录外,所有分割区预设都启用 Soft Update。不过 Soft Update 有几个缺点,因为它记录许多将属性数据在内存中,所以实际更新硬盘数据的时间可能会延迟个几秒钟,在不正常关机时,实际数据不见的比率也比较高。另外,在删除档案后,档案空间被真正释放的时间也会有点延迟。
总之,当不正常关机或档案系统上次没有被正常卸载时,在开机时就会自动进行 fsck。如果您要手动执行 fsck,必须先将分割区卸载后才可以执行。而执行的方式就是在 fsck 指令后面加上所要检查的分割区代号。例如:# fsck -y /dev/ad0s1d
** /dev/ad1s1d
** Last Mounted on
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cyl groups
2 files, 2 used, 506337 free (25 frags, 63289 blocks, 0.0% fragmentation)
我们在上述指令中加入了 -y 参数,表示遇到问题时自动修复,不要再询问。但是因为 fsck 要在档案系统卸载后才能执行,所以如果是系统分割区,您必须要先进入单人模式 (Single user mode)。进入单人模式的方法在 FreeBSD 5.x 以后只要在开机选单中选取「Boot FreeBSD in single user mode」即可,在 4.x 中,只要在开机时看到「boot:」时,输入「boot -s」即可。这样一来,除了根目录外,其它的分割区在开机时都不会被自动挂入。
6.7 档案系统快照
档案系统快照 (File System Snapshots) 顾名思义就是在档案系统上照张相片,也就是将档案系统当时的情形记录下来,就好像照相一样。日后您可以一张一张照片翻出来看。例如,您目前档案系统中有十个档案,我们先使用档案系统快照拍一张照片。之后我们可以删除档案,在目前档案系统中已经没有东西了。但如果您将照片挂入,您还是可以看到这些档案。简单的来说,档案系统快照的功能就是记录当时档案系统的状态。
档案系统快照只能用在独立的「档案系统」。例如我们的 /home、/var 分别是独立的分割区 /dev/ad0s1d 及 /dev/ad0s1e,则我们可以对 /home 及 /var 做档案系统快照。
让我们实际操作一次如何进行快照。建立档案系统快照的方法有二个,一是使用 mount 指令,另一个是使用 mksnap_ffs。例如我们在将 /home 这一个分割区做一个档案系统快照,并将快照存成 /home/snapshot20050730,可以使用下列指令:# mount -u -o snapshot /home/snapshot20050730 /home
或是:# mksnap_ffs /home /home/snapshot20050730
您会发现在 /home 中多了一个文件名为 snapshot20050730。这个档案就是现在这个时间点的档案系统状态。必须要注意的是,如果您要对 /home 做快照,在快照时只能将结果放在 /home 目录下。例如,你可以放在 /home/snapshot/20050730,或是 /home/alex/backup/0730。但是不能放在 /var/snap.0730。也就是对某一个档案系统进行快照的结果只能放在该档案系统中。但是快照完成后,您就可以将它复制到其它地方。
现在,您可以在 /home 中先建一些档案,等一下我们再将刚才的 snapshot 翻开来看,您会发现这些新建的档案都不会出现在「照片」中。
我们现在来看看要怎么把「照片」翻开来看。要看快照的内容可以使用下列指令:# mdconfig -a -t vnode -f /home/snapshot20050730 -u 3
# mount -r /dev/md3 /mnt
上面的指令是将快照档案挂入第 3 个 md 装置,再使用 mount 指令将它像档案系统一样挂入。因为这是快照,照片是不能修改的,所以我们只能以只读格式挂入。您现在可以看一下 /mnt 中的档案,是不是和您 /home 中的档案一样,但却没有新建的档案存在。而且您可以试着开启档案,连档案内容都一样。很神奇吧,杰克!
md 是 FreeBSD 中一种特别的装置,它可以让我们将档案仿真成档案系统,您可以随意指定没有在使用中的 md 装置,如 md1、md2、md3 等。我们使用 mdconfig 这个指令将设定档案使用某一个编号的装置,在挂入时必须也使用相对的编号 (例如上面的 md3)。而在使用完快照后,我们必须将它卸载,并释放 md 装置:# umount /mnt
# mdconfig -d -u 3
以上就是档案系统快照,是不是很好用。
同一个档案系统中最多可以有 20 个档案统快照,如果您有旧的快照不用了,可以直接使用 rm 指令删除它。如果您要查找某一目录下所有的快照,可以使用下列指令:# find /home -flags snapshot
如果您查看一下我们做出来的快照,您会发现它的档案大小和档案系统大小一模一样。但是如果您将它放在原本的档案系统中,它是不占空间的。如果您将 /home 的快照复制到其它的分割区中,它才会真正的占空间。
这么神奇的档案系统快照有什么功用呢?实际上的应用可多了。您有没有发现档案系统快照的速度非常快,这一点可以让我们在备份时更快。传统上,如果您要备份系统,您必须先停止网络服务,以免使用者数据备份到一半却有人修改而造成错误,接着您才可以备份数据。而这样一来,服务中断的时间会非常长,直到整个档案备份完为止。
而利用档案系统快照,您先停止网络服务,将档案系统进行快照,快照完后立即启用网络服务。接下来,再将快照挂入后依正常程序备份即可。或者,您也可以直接备份快照的档案即可。如此一来,服务中断的时间就可以大幅减少了,是不是很赞!

逍遥 发表于 2006-6-5 15:09

第七章 系统安全
系统安全是每个管理者都必须注重的课题。有人说:「没有不安全的系统,只有懒惰的管理者。」每个系统都有可能会出现漏洞,而有安全性的漏洞产生时,发行的单位都会立即发布通告及修补的方式,而系统管理者的职责便是要随时注意是否需要更新漏洞、随时注意系统是否有异常的讯息。
本章将针对 FreeBSD 系统安全做详细的说明,读完本章后,您将可以了解下列主题:
基本系统管理应注重的安全项目。
如果安全的管理账号。
网络安全管理。
如何进行漏洞修补。
7.1 概论
FreeBSD 相对而言虽然是比较安全的操作系统,但是有时候问题不是在操作系统本身,而是所安装的软件。在 FreeBSD 中常见的情形是安装非 FreeBSD 内定的软件,但该软件被收录在 ports 中,FreeBSD 也会提出警告。因此,我们必须到 FreeBSD 的网站上查看是否有系统安全的消息,网址是
[url=http://www.freebsd.org/security/index.html]http://www.freebsd.org/security/index.html [/url]
。当发现问题时,可以依照发布的文件中所提供的修正方式来进行修补。
基本上只要计算机电源打开,系统就没有安全的一天,更何况要连上网络提供服务。系统安全的范围很广,从硬设备的保全、人员管理、网络规划、到系统本身的管理,我们并不打算说明如何制定一个安全性政策,也无法在这里说明所有系统安全的相关议题,我们所提及的只是笔者在 FreeBSD 使用上的建议。如果想要更多 FreeBSD Security 的信息,可以参考 FreeBSD Handbook,我们在安装 FreeBSD 时己经将 doc 安装在 /usr/share/doc 中,你可以使用 lynx 来观看 FreeBSD 的文件。例如:# lynx /usr/share/doc/en_US.ISO8859-1/books/handbook/security.html
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
lynx 并非 FreeBSD 内附的软件,您必须先到 /usr/ports/www/lynx 中进行安装后才可以使用喔。
系统安全并不局限在如何防止他人入侵,对于防止系统内部问题的产生一样重要。主要的概念就是要让我们的系统能正常的提供服务,并且对于我们不想让他人取得的信息加以保护。然而,为了系统安全往往必须限制某些功能的使用,而牺牲了便利性。身为系统管理者往往因为对于系统限制太多而受到来自使用者的抱怨,在取舍上本来就不是件容易的事。正因为如此,一个尽责的管理者在行事上必须具有高度的抗压性及对安全性的偏执。
由于系统安全十分重要,我们在开始说明各种软件安装、服务器架设之前,先说明系统安全应注意的事项,希望读者在读完本章之后,能对系统安全更有概念。
7.2 系统管理
7.2.1 执行程序的路径
有没有注意到当我们要执行所在目录中的某一个程序时,例如,在执行所在目录中的 myscript.sh,我们必须要打 ./myscript.sh。预设的 PATH 中,并没有将所在目录 "." 加入路径中。如果把 "." 加入 PATH 的设定中,可能会产生安全性的问题。例如,如果使用者在 /tmp 中加入一个名为 ls 的 shell script,内容为 rm -rf /usr,而我们又将 "." 加入路径中,当以 root 在 /tmp 中执行 ls 指令时,后果可想而知。因此,我们在执行指令时,最好能指定路径名称,如 /bin/ls,并检查在 shell 设定中是否有将 "." 加入路径中:# echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin
为了避免 /bin 及 /sbin 等重要执行档遭到修改,我们可以为这些档案设定禁止修改的 schg flag:# chflags schg /bin/*
# chflags scgh /sbin/*
当然,设定了 schg 之后,我们要将 Kernel Security Level 调高到 1 以上,这样连 root 都不可以移除 flags。不过设了 schg 之后,我们可能不能执行一些指令,如 make world 等。
7.2.2 降低安装软件的风险
我们可以在网络上找到许多免费的软件,这些软件固然可以让我们在系统的使用上更加便利,但却难保它们不会对系统安全造成任何危害。有的软件可能存在某些漏洞,即使在我们安装前尚无任何安全性的问题,日后还是有可能会被人发现软件的缺陷。因此,我们应该尽可能不要安装一些杂七杂八的软件,而安装之后,一发现有安全性问题也要随时更新。基本上,要下载软件时,最好到该软件的官方网站下载,以确保安全。
并非所有软件都是正确无误的,请不要直接在重要的服务器上安装一套新的软件,最好先在较不重要的计算机上测试,没问题后再安装。另外,在安装软件时,应注意软件取得来源是否可靠。如果软件提供 MD5 或 PGP 的检查,最好下载后先检查,再解压缩。而安装软件时,最好取得软件的原始码来编译 (或使用 port 安装),我们可以浏览程序代码,以了解其架构。阅读 Makefile 的内容,了解软件将安装的确认位置,先确保程序不会在不该出现的地方产生。
7.2.3 kernel Security Level
FreeBSD 中有所谓的 Security Level,它掌控了系统核心的行为运作。只有超级使用者可以使用指令提高 Secruity Level,但不能降低它。如果要降低它必须在 rc.conf 中设定,并重开机。以下为各 Secruity Level 的意义:
-1:永远不安全模式。这是默认值,如果设为 -1,它将永远以 level 0 的模式执行。
0:不安全模式。使用者或 root 可以使用 chflags 来移除「不可更动 ( immutable)」及 「只能附加 (append-only)」的 flags。所有的装置只能依其权限来存取。
1:安全模式。不可以移除「不可更动 ( immutable)」及 「只能附加 (append-only)」的 flags。不可以手动加载或移除 LKM,使用, /dev/mem, and /dev/kmem 只能为只读,且不能 newfs 已挂上的档案系统。
2:高度安全模式。除了和安全模式同样的限制外,不管硬盘是否挂上,都不可以 newfs。另外,kernel time 的改变限制在一秒内,如果超过,会记录 "Time adjustment clamped to +1 second"。
3:网络安全模式。除了和安全模式同样的限制外,还有 IP 封包过滤的规则 (参考 ipfw 及 ipfirewall),而且不可以调整 dummynet 的设定。
我们可以使用 sysctl 来显示或设定 Security Level:# sysctl kern.securelevel
如果要将 Security Level 设为 1:# sysctl -w kernel.securelevel=1
当我们将 Security Level 设为 1 以上时,我们会发现没有办法安装新的 kernel (因为不能移除 schg flag),也没有办法使用 big5con 、X Window 等软件。如果我们的 FreeBSD 只作为服务器,而不使用 big5con 或 X Window 的话,可以将 Security Level 的值调高一点。
如果要在开机时设定 Security Level,可以在 /etc/rc.conf 中以下面二行来设定:
kern_securelevel_enable="YES" # 是否启动 Security Level
kern_securelevel="1" # level 从 -1 到 3
7.2.4 检视系统记录
在 /var/log 中,记录了许多系统的信息,我们应该要时常检视它们。这些档案如下表:
[b]档案[/b]
[b]用途[/b]
adduser
使用 adduser 的记录。
cron
定时排程的记录。
maillog
邮件记录。
messages
系统讯息记录。
security
安全性记录,如防火墙。
除了系统的记录外,如果有提供其它服务,会有更多的 log 数据。
如果我们有其它程序为留下 log 文件,最好在 /etc/newsyslog.conf 中设定定时备份压缩,以免档案过大。另外,这些备份的 log 档在 newsyslog.conf 中设定权限 (mode) 时,最好设为 600,以避免其它使用者可以读取。
FreeBSD 预设每天定时执行一些分析的工作,并将结果寄给 root,建议你最好每天阅读它们。我们可以在 /etc/mail/aliases 的开头中加入下面这一行:
root: [email]me@my.domain.com[/email]
将 [email]me@my.doma[/email]in 改成你的 email,设定完后,请执行 newaliases 来让设定生效。如此一来,所有寄给 root 的信件,都会自动转给所设定的信箱。root 每天会收到 "daily run output" 及 "security check output" 这二封信,这是依照我们在 /etc/defaults/periodic.conf 中所设定的定时执行工作输出的结果。在 daily 执行的任务中,预设并没有设定定期清除 /tmp,原则上,在开机时系统会清理 /tmp。如果我们不常重开机,可以在 periodic.conf 中设定每天清理 /tmp。
7.2.5 数据的保全
UNIX 系统的安全防护中,第一道防线是计算机实体的安全防护,防止不相干的人接触计算机及周边设施。如果很不幸的,外人可接近系统时,第二道防线是系统密码保护,我们将在下一章说明账号的防护。然而,如果密码泄露或被破解,还有第三道防线,就是在 UNIX 系统中的使用者权限及档案权限控制。如果某一个使用者账号遭到入侵,我们能限制其活动范围及资源的存取。而第四道防线就是将重要的数据加以编码保护,即使数据被使用者窃取,至少还多一道防护措施。而最后一首防线就是数据备份了,我们平时应该有完善的备份计划,一旦系统发生错误或是被摧毁,至少还可以复原。
我们先来谈谈数据编码加密的方法,我们可以使用 crypt 这个指令来为我们的档案加密。例如,有一个档名为 myfile.txt 的档案,我们使用的金钥 (key)是 mykey 这个字符串,加密后的文件名为 myfile.cyp,可以使用下列指令:# crypt mykey  myfile.cyp
加密后,就可以将 myfile.txt 删除。如果日后要解密,只要执行下列指令:# crypt mykey  myfile.out
crypt 是一个历史悠久的编码软件,实际上并非十分安全,不过我们可以多加密几次,让档案加密后再加密,只要记得所使用的 key 就好了:# crypt mykey1 myfile.cyp
如果要解密,只要再反过来即可:# crypt mykey3  myfile.out
除了 crypt 外,我们也可以使用其它比较好的编码程序,例如 pgp。pgp 并非 FreeBSD 内附的软件,但我们可以使用 ports 来安装它:# cd /usr/ports/security/pgp
# make install
安装完 pgp 之后,我们必须先产生 key pair。请执行 pgpk -g:
首先请在自己的家目录中建立一个存放 pgp 金钥的目录。
$ mkdir ~/.pgp
$ pgp -kg
Pretty Good Privacy(tm) 2.6.3ia - Public-key encryption for the masses.
(c) 1990-96 Philip Zimmermann, Phil's Pretty Good Software. 1996-03-04
International version - not for use in the USA. Does not use RSAREF.
Current time: 2004/04/27 18:05 GMT
Pick your RSA key size:
1) 512 bits- Low commercial grade, fast but less secure
2) 768 bits- High commercial grade, medium speed, good security
3) 1024 bits- "Military" grade, slow, highest security
Choose 1, 2, or 3, or enter desired number of bits: 3 (输入金钥的长度)
Generating an RSA key with a 1024-bit modulus.
You need a user ID for your public key. The desired form for this
user ID is your name, followed by your E-mail address enclosed in
, if you have an E-mail address.
For example: John Q. Smith
Enter a user ID for your public key: (输入使用者名称)
John Chung
You need a pass phrase to protect your RSA secret key.
Your pass phrase can be any sentence or phrase and may have many
words, spaces, punctuation, or any other printable characters.
Enter pass phrase: (输入密码)
Enter same pass phrase again: (再输入一次密码,以确认无误)
Note that key generation is a lengthy process.
We need to generate 944 random bits. This is done by measuring the
time intervals between your keystrokes. Please enter some random text
on your keyboard until you hear the beep:
(随机在键盘上输入一些字,直到数字为零)
0 * -Enough, thank you.
..........................**** ..****
Pass phrase is good. Just a moment....
Key signature certificate added.
Key generation completed.
产生了 pgp key 之后,我们就可以使用 pgp 来编码了。
[b]指令[/b]
[b]用途[/b]
pgp -kx user -o outfile
取出 user 的公开金钥至outfile 中
pgp -ka keyfile
将公开钥匙 keyfile 加入钥匙环中
pgp -kvc user
印出 user 的公开金钥
pgp -e textfile -o outfile user
加密 txtfile 至 outfile
pgp -s textfile -o outfile user
加签 txtfile 至 outfile
pgp -d cypfile -o outfile
解密 cypfile 至 outfile
例如,我们要将 myfile.txt 加密,输出档为 myfile.cyp:# pgp -e myfile.txt -o myfile.cyp john
这里的使用者是 john,他的全名是 John Chung ,我们只要输入名字的部份关键词即可。而解密可以使用:# pgp -d myfile.cyp -o myfile.out
上面的指令会问你通行码,输入后即完成解密。目前 PGP 的主要应用是在于网络传输文件的加密,我们可以使用它来为 E-mail 加密,PGP 的用法很多,请自行 man pgp。
不过,即使加密也无法对抗数据的损毁,对于放在计算机中的重要数据,必须维持完整的备份。就算系统都没有问题,我们永远不知道哪天会因为我们自己失手删除重要数据,或是数据遭到破坏。需要备份的不只是程序所产生的数据,自己开发的程序也应该备份。否则即便有了数据可以复原,而没有程序可以执行。
举例而言,一个 BBS 站应该要备份的除了使用者数据、精华区及看版文章外,BBS 本身运作的程序也要备份,毕竟那是我们精心撰写或修改的结晶。备份的数据不应该和运作的系统放在一起,不仅不应放在同一台计算机中,最好不要放在同一个房间、同一栋大楼、同一个城市,甚至同一个国家。
7.3 账号管理
7.3.1 慎选合宜的密码
对于系统安全的维护,密码可以说是最基础的防线,因此慎选密码绝对是必要的。不管是超级使用者或是一般的使用者,在设定密码时,都应该注意一些原则:
不要使用和账号相同的密码。
不要使用字典中找得到的单字,也不要把单字反转后当成密码。
最好大小写混用,英文及数字混合,并加入特殊符号。
不要使用自己、老婆、小孩的生日、身份证字号等。
不要使用键盘上连续的字母,如 asdf。
不要把密码写下来。
一个好的密码应该是容易记忆,不必另外以纸笔记下的。例如,Gohiy!m (Get out here if you aren't me),或 ru4@xj4# (以注音输入法输入「记录」)。总之就是要让别人意想不到,这里提到的密码也不要使用。
我们可以使用一些工具来找出系统中密码太简单的使用者,例如位于 /usr/ports/security/crack 这套软件。
7.3.2 控制 root 的使用
在 FreeBSD 中,如果要使用指令 su 来取得 root 的权限,必须将该使用者加入 wheel 群组中。但是 su 并未对使用者执行过的指令留下记录,如果系统中有许多使用者,我们要针对不同使用者给予不同的权限,也不是 su 所能做到的,因此我们可以使用 sudo。关于 sudo 的使用,请参考第「使用者管理」一章中的「控制 root 的使用」。
root 账号不应该可以使用 telnet、ssh、或 ftp 的方式登入,在 /etc/ftpuser 中应该有 root 的账号来限制 root 使用 ftp 登入。而在 /etc/ssh/sshd_config 中,应该有 PermitRootLogin no 的字样来限制 root 使用 ssh 登入。我们注意的就是避免 root 能从网络上直接登入,以减少安全性的问题。在 /etc/ttys 中,预设了 root 只能有某些 tty 登入系统,这种允许 root 直接登入的 tty 设定中有 secure 的字样。例如,ttyv0 指的是 console,该行设定最后有 secure,表示 root 可以从该 tty 登入。而 ttyp* 等是远程登入的 tty,所以禁止 root 直接登入。
7.3.3 限制系统资源的使用
如果使用者登入系统后,执行大量消耗 CPU、内存或磁盘的程序,我们的系统将无法正常提供服务,因此,限制使用者对于系统资源的存取是必要的。针对系统所提供的服务,来限制系统的资源,并避免提供不必要的服务。例如,以一台单纯的网页服务器、DNS 服务器而言,并不需要开放使用者远程登入的服务。远程登入提供使用者对系统有直接的操作,而往往也是漏洞开放的起点。一般使用者对于安全的要求不一定和系统管理者的期望相符,他可能会将密码写在自己办公桌上、或是登入系统执行一些不必要的程序。如果迫不得已一定要为使用者在系统上开一个账号,也应该视情况限制其使用远程登入。如果只要为使用者开一个 FTP 账号或是邮件账号,只要设定使用者所用的 shell 为 /sbin/nologin 即可。例如,在 /etc/master.passwd 中,使用者 jack 的账号数据如下:
jack:Bk5AI4MiRKDJ4:1000:1000::0:0:Tom Chang:/home/tom:/sbin/nologin
就算使用者不能登入,但能使用磁盘空间,所以还是要为使用者设定磁盘配额。虽说现在硬件价格便宜,但若每个使用者都有数百 MB 的邮件,集合起来也十分惊人。关于磁盘配额的设定,请参考「使用者管理」一章中的「磁盘配额」。在限制使用者邮件容量方面,最简单的方式就是将使用者的邮件从 /var/mail 中搬移到使用者的目录中,再对使用者目录做磁盘配额的限制。例如,使用者 jack 的家目录位于 /home/jack,我们可以:# cd /var/mail
# mkdir /home/jack/mail
# mv /var/mail/jack /home/jack/mail/
# ln -s /home/jack/mail/jack
如此就可以将使用者原本的邮件放在其家目录下,我们只要将该档案再链接到 /var/mail 中,如此就可以不必更动邮件软件的设定,而达到限制空间的效果了。
如果你坚持要让使用者登入的话,除了磁盘配额外,应该要再为他们设定其它系统资源的使用限制,例名 CPU 的使用量、内存等。我们可以经由设定 /etc/login.conf 来做到。而 login.conf 的设定,请参考「使用者管理」一章中的说明。。
7.3.4 限制 crontab 及 at 的使用
使用者可以用 crontab 和 at 指令来安排自己定时执行的工作。一般的使用者并不需要拥有 crontab 或 at 的执行权,我们可以为这个指令设限,只允许必要的使用者执行。如果要限制使用 crontab,只需要在 /var/cron 目录中,加入 allow 或是 deny 这个档即可。例如,我们只允许少数几个使用者执行 crontab,我们可以新增 /var/cron/allow 这个档,内容为该使用者的名称。相对的,如果我们要限制少数几个使用者执行 crontab,只要编辑 /var/cron/deny 这个档即可。而指令 at 的限制也是一样,不同的只是允许执行 at 指令的名单是 /var/at/at.allow,而拒绝的名单是 /var/at/at.deny。
7.4 网络管理
7.4.1 关闭不必要的服务
一台计算机可以提供的服务很多,我们要做的是在许可的范围内,尽量减少所提供的服务。许多安全性的问题来自于非第三者 (Third Party) 所提供的软件,如果没有必要就停止这些服务吧。
我们先来看一下目前系统提供哪些服务:# netstat -a|grep LISTEN
tcp4       0      0  *.http                 *.*                    LISTEN
tcp4       0      0  *.https                *.*                    LISTEN
tcp6       0      0  *.telnet               *.*                    LISTEN
tcp4       0      0  *.telnet               *.*                    LISTEN
tcp6       0      0  *.ftp                  *.*                    LISTEN
tcp4       0      0  *.ftp                  *.*                    LISTEN
tcp4       0      0  *.imaps                *.*                    LISTEN
tcp4       0      0  *.pop3s                *.*                    LISTEN
tcp4       0      0  *.imap                 *.*                    LISTEN
tcp4       0      0  *.pop3                 *.*                    LISTEN
tcp4       0      0  *.smtp                 *.*                    LISTEN
tcp4       0      0  *.ssh                  *.*                    LISTEN
tcp6       0      0  *.ssh                  *.*                    LISTEN
这里所看到的就是目前系统中所提供的服务。我们可以检视一下有没有不必要的服务,并将它移除。最明显的例子是 sendmail,如果我们的系统不提供邮件处理,就将它停掉吧。即使我们要提供邮件服务,也应该限制寄信者的身份或来源地址。一台没有设限的邮件服务器,最后的结果是恶名昭彰,再也没有机器会愿意转送我们发送的信件。如果我们要停止 sendmail,只要在 /etc/rc.conf 中加入下面这一行:
sendmail_enable="NONE"
我们可以使用 sysctl 来设定当外部机器要使用我们没有提供的服务时便记录下来,例如有人尝试扫我们的 port,或者我们没有开放 telnet,却有人尝试从 port 23 连接,在 /var/log/messages 中便会留下记录。这个设定只要执行下列指令:# sysctl -w net.inet.tcp.log_in_vain=1
# sysctl -w net.inet.udp.log_in_vain=1
如果要在开机时就启动这个设定,可以将上面二行指令加到 /etc/rc.local 或是在 /etc/sysctl.conf 中加入下面二行:
net.inet.tcp.log_in_vain=1
net.inet.udp.log_in_vain=1
另外,FreeBSD 自从 4.4-Release 起,预设将 telnet 及 ftp 的服务也停止了。原因除了 telnet 本身有漏洞外(己修补),就是这些以明码方式在网络上传送使者账号及密码的服务其实是系统安全的另一个潜在危险。我们可以检视一下 /etc/inetd.conf,发现每一行前面都有批注符号 "#",也就是说目前根本没有任何经由 inetd 启动的服务,我们可以经由 /etc/rc.conf 加入下列这一行来停止 inetd 服务:
inetd_enable="NO"
如果我们必须使用远程登入来管理系统,不要使用 telnet,请使用 ssh。ssh 对于在网络上流动的数据有加密保护,比起 telnet 安全多了。如果真的有必要使用 inetd 来启动某些服务,例如 ftp,建议将使用情形记录下来 。
FreeBSD 安装后,预设会将所有登入成功及失败的记录都写在 /var/log/xferlog 中。因为我们在 /etc/syslog.conf 有下列这一行:
ftp.info                                     /var/log/xferlog
如果您使用的是 FreeBSD 之 4.x 版,您可能要自行编辑 /etc/syslog.conf 并在该档案的最后加入下面这二行:
!ftpd
*.*                                /var/log/xferlog
这个设定会让所有登入成功及失败的记录都写在 /var/log/xferlog 这个档案中,我们必需先手动建立 xferlog 这个档案:# touch /var/log/xferlog
因为我们已经修改了 /etc/syslog.conf ,所以必须重新启动 syslogd。syslogd 是 FreeBSD 专门记录系统信息的 daemon,您可以使用下列指令重跑 syslogd:# kill -1 `cat /var/run/syslog.pid`
由于每次使用 ftp 的情形都会被记录下来,为了避免 log 档肥大,我们在 newsyslog.conf 中加入 ftpd.log 的备份移转:
/var/log/xferlog       600  7  100  *  J
另外,对于 ftpd 还有一个小建议,为了避免使用者 ftp 登入后可以到系统所有数据夹,我们最好将使用者的活动范围限制在自己的家目录中,这就叫做 chroot。方法很简单,只要建立一个档案 /etc/ftpchroot,内容为使用 chroot 的使用者名称即可,我们会在「FTP 服务器」一章中做更详细的说明。
其它的 inetd 服务,能不用就不要用,尤其是 telnet。如果要管理计算机,我们可以使用 ssh。
除此之外,为了防止一些 DoS (Deny of Service),建议最好把 ICMP 重导向 (redirect) 的封包丢弃,我们可以在 /etc/rc.conf 中加入以下的设定:
icmp_drop_redirect="YES"  # YES 表示丢弃 ICMP REDIRECT 封包
icmp_log_redirect="YES"    # YES 表示将丢弃的封包记录下来
7.4.2 使用 ssh
ssh 是一个好用的软件,FreeBSD 安装预设启动 sshd。我们可以检查一下它是否己启动:# netstat -a | grep ssh
如果没有,请在 /etc/rc.conf 中加入下面这一行:
sshd_enable="YES"
sshd 预设并未将使用者登入的数据记录下来,不过我们可以修改 /etc/syslog.conf 来记录,请找到 security 的项目,并将它修改成下面这样:
security.*;auth.info                /var/log/security
如此一来,当使用者利用 ssh 登入时,便会记录在 /var/log/security 中。
我们知道 ssh 类似一个加密的 telnet,使用 ssh 以取代 telnet 是一定要的。然而 ssh 还有一个比较少人知道的功能,就是提供加密的 ftp 联机,称为 sftp。
当您启动 ssh 时,预设就已经有提供 sftp 的功能。如果您要在 FreeBSD 中使用 sftp 连到另一台开于 ssh 的机器,可以使用下列指令:# sftp alex@192.168.0.1
接下来的所有操作就好像一般的 ftp client 一样,您可以任意上传下载档案,而且都是以加密传输喔。如果您要在 Windows 中使用 sftp,您可以下载 Filezilla (
[url=http://filezilla.sourceforge.net/]http://filezilla.sourceforge.net/[/url]
)。
7.4.3 TCP Wrapper
对于 inetd 所提供的服务,我们可以使用 TCP Wrapper 来限制 TCP 协议联机来源。让我们来检视一下 /etc/hosts.allow 这个档案:
ALL : ALL : allow
ftpd : localhost : allow
ftpd : .nice.guy.example.com : allow
ftpd : .evil.cracker.example.com : deny
ftpd : ALL : allow
语法:daemon_list : client_list : option
其中 daemon_list 是我们在 /etc/services 中定义的服务名称,client_list 是来源地址,option 则是我们要给的权限,简单的设定如 allow(允许)、deny(拒绝)。ALL 可以代表所有服务或来源。这个档案的设定是以先入为主 (first match wins) 的方式,也就是以先设定的项目为优先。
在档案开头的地方有一行是 ALL : ALL : allow,表示预设所有服务允许所有来源使用。如果我们要使用 TCP Wrapped,必须先将该行批注,再针对每一个服务来设定开放的权限。以 ftpd 为例,假设除了 bad.cracker.com 以外,其它人都可以使用 ftpd 服务,我们可以这样设定:
ftpd : bad.cracker.com : deny
ftpd : ALL : allow
又如,假设我们的 telnet 只要让 192.168.0.1 及 mydomain.com 网域下的计算机可以使用:
telnetd : 192.168.0.1 .mydomain.com : allow
telnetd : ALL : deny
TCP Wrapped 只针对 TCP 服务,如果我们要功能更强大的防火墙,可以使用 ipfw。
7.4.4 ipfw
ipfw 是 FreeBSD 内附的防火墙软件,它直接针对 IP Layer 来做网络控制,因此可以说是最有效的方法。在使用 ipfw 之前,我们必须先重编核心。关于防火墙的设定,请参考「NAT 及防火墙」一章的说明。
7.5 漏洞修补
FreeBSD 总部会不定期公布己知的安全漏洞,并提供修补方式,我们必须时常到 FreeBSD 的网站注意关于安全性的消息,该网站的位置是
[url=http://www.freebsd.org/security/index.html]http://www.freebsd.org/security/index.html[/url]

连到上述页面后,我们可以看到在 FreeBSD Security Advisories 区段中,有下列项目:
Advisories are always signed using the FreeBSD Security Officer PGP key and are archived, along with their associated patches, at our FTP CERT repository. At the time of this writing, the following advisories are currently available (note that this list may be a few days out of date - for the very latest advisories please check the FTP site):
FreeBSD-SA-05:17.devfs.asc
FreeBSD-SA-05:16.zlib.asc
FreeBSD-SA-05:15.tcp.asc
FreeBSD-SA-05:14.bzip2.asc
FreeBSD-SA-05:13.ipfw.asc
FreeBSD-SA-05:12.bind9.asc
FreeBSD-SA-05:11.gzip.asc
FreeBSD-SA-05:10.tcpdump.asc
FreeBSD-SA-05:09.htt.asc
FreeBSD 5.4-RELEASE released.
FreeBSD-SA-05:08.kmem.asc
FreeBSD-SA-05:07.ldt.asc
FreeBSD-SA-05:06.iir.asc
FreeBSD-SA-05:05.cvs.asc
FreeBSD-SA-05:04.ifconf.asc
我们可以看到自从 FreeBSD 5.4 release 之后,FreeBSD 公布了 9 个安全性修补,我们可以打开这些连结,并了解这些修补的用途。例如 FreeBSD-SA-05:17.devfs.asc,顾名思义是用来修补 FreeBSD devfs 装置虚拟的档案系统。
我们现在以 FreeBSD-SA-05:17.devfs.asc 来做修补的范例。首先看到这个公告一开头的部份:
FreeBSD-SA-05:17.devfs                              Security Advisory
                                                    The FreeBSD Project
Topic:          devfs ruleset bypass
Category:       core
Module:         devfs
Announced:      2005-07-20
Credits:        Robert Watson
Affects:        All FreeBSD 5.x releases
Corrected:      2005-07-20 13:35:44 UTC (RELENG_5, 5.4-STABLE)
                2005-07-20 13:36:32 UTC (RELENG_5_4, 5.4-RELEASE-p5)
                2005-07-20 13:37:27 UTC (RELENG_5_3, 5.3-RELEASE-p19)
CVE Name:       CAN-2005-2218
For general information regarding FreeBSD Security Advisories,
including descriptions of the fields above, security branches, and the
following sections, please visit
.
这里的信息包含了主旨 (Topic)、分类 (Category)、影响的模块名称 (Module)、公布时间 (Announced)、发现者(Credits)、受到影响的版本(Affects)、已修正的版本(Corrected)、漏洞编号(CVE Name, Common Vulnerabilities and Exposures)。
如果我们的系统是受影响的版本之一,我们必须进行漏洞修补。在上述开头信息之后,会有一些说明,包含这个模块的背景(Background)、问题描述(Problem Description)、所产生的影响(Impact)。我们可以先读一下这个部份,以了解这个漏实际上所带来的影响。
接下来会有避免发生的方法(Workaround)、及解决之道(Solution)。Workaround 的意思是如果不进行修补,我们是否有方法可以避掉这个问题。例如当 CVS 服务器有漏洞时,可能的 workaround 方式是停止 CVS 的运作,而 Solution 是告诉我们下载修补程序的方式及修补方式。以下我们就以这个范例来说明如何进行漏洞修补:
V.   Solution
Perform one of the following:
1) Upgrade your vulnerable system to 5-STABLE, or to the RELENG_5_4,
or RELENG_5_3 security branch dated after the correction date.
2) To patch your present system:
The following patches have been verified to apply to FreeBSD 5.3, and
5.4 systems.
a) Download the relevant patch from the location below, and verify the
detached PGP signature using your PGP utility.
# fetch [url]ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-05:17/devfs.patch[/url]
# fetch [url]ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-05:17/devfs.patch.asc[/url]
b) Apply the patch.
# cd /usr/src
# patch  and reboot the
system.
我们可以选择下列二种方式其中之一来进行修补,第一种方式是将您的 FreeBSD 升级至 5-STABLE、RELENG_5_4、或 RELENG_5_3。第二种方式是我们最常用的方法,也就是下载修补的原始码。通常我们必须依照所使用的 FreeBSD 系统来下载不同版本所使用的补丁。上述范例中,其修补文件分别供 FreeBSD 5.3 及 5.4 使用。
我们以 FreeBSD 5.4 为例,首先,我们必须下载更新档,请使用下列指令下载:# cd /usr/src
# fetch [url]ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-05:17/devfs.patch[/url]
我们将档案下载到 /usr/src 目录下,这个档案是修补的档案,而 devfs.patch.asc 是用来检查 pgp 签名的签名档,如果您不使用 pgp 检查所下载的档案是否正确,您可以忽略这个档案。
我们所下载的 patch 档是将漏洞修补前及修补后的原始码差异存成一个档案,接下来我们必须将这个差异和我们系统中的原始码合并。因此,我们系统中一定要安装 FreeBSD 的原始码,也就是 /usr/src 这个目录下有原始码的数据,如果您在安装 FreeBSD 时并未安装原始码,您可以使用 sysinstall 来安装原始码套件。接下来我们就可以将所下载的档案合并到系统中:# cd /usr/src
# patch
最后,依照这个修补档的说明,我们必须重新编译系统核心,请参考「编译核心」一章,并于安装新核心之后重新开机即可。并非所有修补都必须重新编译系统核心,有的修补可能要重新编译其它非核心程序,甚至整个系统,我们必须按照 Solution 的说明执行适当的步骤。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
常常进行漏洞修补是系统管理者一定一定一定要做的事。所以您一定要常常上 FreeBSD 网站看是否有新的 patch 喔。

逍遥 发表于 2006-6-5 15:10

第八章 编译核心
核心 (kernel) 顾名思义是整个操作系统的核心,系统一开机即加载核心,它控制了整个系统的运作,包含和硬件沟通、系统资源配置、内存管理、档案系统管理等等。
本章将介绍如何客制化一个核心,它可以缩小您的系统、增加支持的软硬件、更改系统限制等。读完本章后,您将了解下列主题:
FreeBSD 核心的功用。
如何修改核心。
核心中每一个项目的用途。
如何处理核心错误无法开机的情形。
8.1 为什么要重新编译核心
传统上,我们将所有支持的硬件、档案系统等全部放到核心中,每次有新增的硬件或功能都必须重新编译核心,并重新启动计算机。但随着支持的功能越来越多,系统核心变得越来越肥大,而重新开机以加载新加入的功能也不符合现代操作系统的需求。
目前 FreeBSD 许多可以独立出来的功能都能做成所谓的核心模块 (kernel module),当系统有需要使用该模块时,才将它加载核心中。这么做的好处就是可以让我们更快加入硬件驱动程序,更方便地加入我们想要的功能。所有可以独立出来的模块都可以编译放入核心中,然而,使用动态加载的方式和直接编入核心中各有优缺,直接编入核心中可以减少加载的时间,而动态加载可以让我们在不需要用到该功能时立即从系统中移除其所占用的资源。以 DVD 所使用的档案系统格式为例,我们平常可能很少用到 DVD,所以并未将它加入核心中。但当需要时,我们可以 kldload 这支程序来动态加载该模块,使用完毕后,也可以立即使用 kldunload 将它从核心中移除,在使用上方便许多。
我们刚安装完 FreeBSD 时,所使用的核心是一般性的核心,称之为 GENERIC kernel。为了要支持常见的软硬件,因此 GENERIC 核心中可能包含了许多我们用不到的驱动程序,也可能不支持一些特殊的硬件。例如,单单网络卡驱动程序就有数十种被加入 GERERIC 核心中,其实我们只需要使用其中一种。在硬件方面,核心中包含了太多的东西不仅会占去内存的空间,不同程序间也有可能造成冲突。
在软件方面,如果要启动 FreeBSD 的防火墙功能,或是使用 ADSL 联机 (4.4 以前的版本),都需要重新将支持这些功能的参数加到核心中。另外,如果要改变系统的效率,你必须修改核心中的参数,例如增加同时上线的人数、或最大同时开启的档案数等。当然,有的功能在 FreeBSD 中可以经由 sysctl 这个指令来修改,而毋需修改核心,但大部份的功能是一定要修改核心的。过于肥大的核心,开机需要的时间较长,所以我们可以将不必要的设定移除,以加速开机速度。
除此之外,我们常看到 FreeBSD 总部发布安全性漏洞修补程序,在完成原始码的修补之后,大多数的修补都必须重新编译核心。所以我们还是要来了解一下如何为自己量身订做一个新的核心。
请放心,编译核心并不难,其实只有几个步骤,只要依下列的方法去做,相信您对于系统核心将有更深入的了解。
8.2 修改核心
首先,您必须确认在安装 FreeBSD 时,有将所有 FreeBSD 的原始码 src 装进来。请先检查 /usr/src/sys/i386/conf/ 目录存在,您可以在这个目录中看到一个名为 GENERIC 的文字文件,GENERIC 就是安装时用的一般核心。在 FreeBSD 4.x 的版本中,这个目录下还有一个 LINT 的档案,这个档案中包含了所有可用的核心参数,您可以参考这个档以取出所需的设定加入自己的核心中。如果您使用的是 FreeBSD 5.x 以后的版本,请参考 NOTES 这个档。
如果系统中没有 /usr/src/sys 这个目录,表示您在安装时并未安装 FreeBSD 的原始码,您可以使用 sysinstall 这个指令来执行安装的选单工具,并安装原始码。执行了 sysinstall 后,请选择 [Configure] -> [Distribution] -> [src] -> [sys],即可安装核心的原始码。除了使用 sysinstall 外,您也可以先将本书所附第一张光盘放入光驱中,并使用下列指令来安装:# mount /cdrom
# mkdir -p /usr/src/sys
# ln -s /usr/src/sys /sys
# cat /cdrom/6.0-RELEASE/src/ssys.[a-d]* | tar -xzvf -
有了核心的原始码后,我们就可以开始进行修改。首先,我们要做的就是将 GENERIC 复制一份,并修改复制的那一份。# cd /usr/src/sys/i386/conf
# cp GENERIC MYKERNEL
上面那一行指令就是把 GENERIC 复制一份叫做 MYKERNEL,新的 KERNEL 要叫什么名字你可以自己取一个比较有意义的名字。建议您不要将自己所修改的核心设定放在 /usr/src/sys/i386/conf 目录下,有时候我们可能会因为硬盘空间不足而删除 /usr/src 这个目录,或者日后进行升级时忘了备份我们编辑过的核心设定档。所以建议您将 GENERIC 复制到其它目录下,再建立一个 link 到 /usr/src/sys/i386/conf,如此一来,我们可以更方便的备份及保存设定。例如,我们可以将它复制到 /root 目录下:# cd /usr/src/sys/i386/conf
# cp GENERIC /root/MYKERNEL
# ln -s /root/MYKERNEL
接着就要来修改 MYKERNEL 了,请使用文字处理软件打开 MYKERNEL 后,再依文件中的说明来修改,把不必要的项目移除。必须要注意的是,核心中有的参数是互相依赖的,也就是说某些参数的存在一定要有某一行的支持。现在使用指令 ee 来修改刚才复制的核心:# ee MYKERNEL
在核心中,如果在一行的开头有"#"表示该行为批注,以下我们针对 GENERIC 核心中每一个参数的说明。
8.2.1 基本的设定
machine        i386
这一行是必备的,代表的是使用 i386 的计算器架构 (architecture),也就是 IBM 兼容个人计算机。FreeBSD 支持的硬件架构包含了 i386、pc98、alpha、sparc64 等。
cpu        I486_CPU
cpu        I586_CPU
cpu        I686_CPU
上面这四行指的是 CPU 的类型,最近的 CPU 都是 I686_CPU。有些 CPU 如 Cyrix 233Hz CPU 或 Pentume Pro 也都是 I686。我们可以在开机后使用 dmesg 指令或参考 /var/run/dmesg.boot 来看 CPU 类型,并移除不必要的类型。
ident        GENERIC
这个可以说是核心的名字,我们在开机时会看到这个字符串,建议将它修改成和您核心设定档同名,例如,MYKERNEL 或 WEBSERVER 等。
maxusers        0
这个项目在 FreeBSD 5.x 后已经不必设定了。这是用来控制系统内部表格(internal system tables)大小的参数,它的值大约是您期望系统同一时间会上线使用的使用者数量。如果您使用的是 FreeBSD 4.5 以上的版本,建议您将它设定 0。如果设成非 0 的数字,这个值一定要设定大于四,maxusers 的值决定了处理程序所容许的最大值,20+16*maxusers 就是你将得到的所容许处理程序。
系统一开机就必须要有 18 个处理程序 (process),即便是简单的执行指令 man 又会产生 9 个 process,所以将这个值设为 64 应该是一个合理的数目。如果你的系统会出现 proc table full 的讯息的话,可以就把它设大一点,例如 128。不过现在的 FreeBSD 很聪明,您只要将它设为 0,FreeBSD 会动态分配合理的值。
值得注意的是 maxusers 的值和同时可以上线的最大使用者人数并无关系,它只是决定你的 kernel 中一些数据结构的大小,真正影响上线人数的是 pseudo-device pty。
8.2.2 一般选项
#makeoptions        DEBUG=-g
这个参数是用来将核心编辑成除错模式。加了这个参数之后,核心会包含一些除错用的信息,除非您需要做核心开发或协助测试核心程序,否则不需要加入这个参数。除错模式的核心会比一般核心庞大许多,而且也会影响系统效能。
options        SCHED_4BSD        # 4BSD scheduler
这是传统的 FreeBSD 排程方式,它会被用来控制系统中所要执行的工作顺序。FreeBSD 5.x 之后加入新的排程方法,称之为 ULE。ULE 主要是为了 SMP 多颗 CPU 排程而设计,但您也可以用来做为一般排程使用。若您想试试 ULE 排程的功能,您可以将 SCHED_4BSD 改为 SCHED_ULE。
options        MATH_EMULATE
这个参数让 kernel 用软件的方式仿真浮点运算,如果你的 CPU 不含浮点运算器,你就必须打开此参数。486-DX 以上的 CPU 可以不需要这一行。不过 FreeBSD 所提供的一般浮点仿真器并不是十分精准,如果你没有浮点运算器却又需要最好的准确度,建议你把这一行改成 GPL_MATH_EMULATE 来使用 GNU 浮点模拟。因为 GNU 版权的关系,因此 FreeBSD 不以它来当作内定的仿真器。由于目前我们所使用的 CPU 都支持浮点运算,所以在 FreeBSD 5.x GENERAL kernel 预设并未加入这个参数。
options        INET                #InterNETworking
options        INET6                #IPv6 communications protocols
上述这二行是因特网沟通协议,就算您不打算连上网络,至少必需保留第一个 INET 的设定,因为大多数的程序都会要求使用 lookback 网络 (就是自己的机器和自己的机器沟通)。INET6 指的是 IPv6 协议,如果您要使用 IPv6 则必需加入该参数。
8.2.3 各种档案系统的支持
options        FFS                #Berkeley Fast Filesystem
options        FFS_ROOT                #FFS usable as root device [请勿删除]
这是最基本的档案系统支持,如果你是从硬盘开机的,你一定需要它。FreeBSD 5.x 已经不再需要 FFS_ROOT 这个选项了,所以如果您使用 5.x 并不会看到这一行。
options        SOFTUPDATES        #Enable FFS soft updates support
使用 soft update 可以加速对硬盘的在取速度,我们必须先再核心中加入对于 soft update 的支持,再针对不同的档案分割区启动此功能。您可以打指令 mount 来查看各个分割区是否已启动 soft update,如果没有,tunefs 这个指令来启动它。我们在安装 FreeBSD 时,预设除了根目录的分割区外,其它的磁盘分割区都会将此功能打开。
options        UFS_ACL                #Support for access control lists
FreeBSD 5.x 才加入这个选项,它是一种权限控制的功能,预设是开启的状态。一旦这个选项打开始,并开始使用档案系统之后,最好不要将它关闭,以避免奇怪的问题产生。
options        UFS_DIRHASH        #Improve performance on big directories
这个选项可以加快 FreeBSD 对于大型目录的处理速度,但将需要很大的内存空间。如果此核心是供大型服务器使用,加入这个参数可以有比较好的效能。
options        MFS                #Memory Filesystem
options        MD_ROOT                #MD is a potential root device
内存映对档案系统 (Memory-mapped Filesystem)。基本上它容许我们将一块内存空间当做档案系统来使用,以达到快速存取暂存盘的功能。例如,我们可以分割出一个 MFS 供 /tmp 使用,因为许多程序会利用 /tmp 建立暂时档案,而 MFS 是将档案系统挂在内存中,对于数据的存取会快很多。不过 FreeBSD 5.x 后已经不再使用 MFS 而改由 md-backed 档案系统所取代。
options        NFSCLIENT                #Network Filesystem Client
options        NFSSERVER                #Network Filesystem Server
options        NFS                        #Network Filesystem (4.x 才有)
options        NFS_ROOT                #NFS usable as /, requires NFSCLIENT
这些选项是传统的 UNIX 都支持的网络档案系统,在 FreeBSD 4.x 中,只有 NFS 及 NFS_ROOT 这二个选项。而 FreeBSD 5.x 将 NFS 分成 NFS 客户端及服务器二个选项。传统的 NFS 是使用 UDP 的方式传输。但 FreeBSD 的 NFS 支持 TCP 模式,如果您不打算使用 TCP 模式,您可以将这些选项移除。
options        MSDOSFS                #MSDOS Filesystem
支持 MS-DOS 档案系统。除非你每次开机都要使用 MS-DOS 档案系统,否则您可以将它移除,系统会在你使用到 MSDOS 档案系统时自动加载核心模块。除此之外,你也可以使用 mtools来存取 DOS 的软盘,这并不需要有 MSDOS 档案系统的支持。
options        CD9660                #ISO 9660 Filesystem
options        CD9660_ROOT        #CD-ROM usable as root, CD9660 required
ISO 9660 是 CD-ROM 的档案系统,如果你只是偶尔用到 CD-ROM,你可以此功能移除,同样的,系统会在使用到 CD-ROM 时自动加载核心模块。此外,当我们使用 CD-ROM 听音乐时并不需要 CD9660 的支持。CD9660_ROOT 只有当我们要拿 ISO 9660 档案系统做根目录时才需要,FreeBSD 5.x 后预设已将它移除。
options        PROCFS                #Process filesystem
处理程序档案系统,它是将一些系统信息伪装成档案系统并挂入 /proc 目录下,让一些系统监控软件 (如 ps 这个指令) 可以从中得到执行中的处理程序的信息。在 FreeBSD 5.0 以后的版本预设不再使用 /proc,大多数的监控程序也都改成不必使用 /proc 来得到系统信息。如果您使用的是 FreeBSD 5.x 以后的版本,要使用 PROCFS 还必须加入下列这一个参数:
options        PSEUDOFS                #Pseudo-filesystem framework
这个参数只出现在 FreeBSD 5.x 后,FreeBSD 4.x 并无此参数。
8.2.4 软硬件兼容性设定
options        COMPAT_43                #Compatible with BSD 4.3 [KEEP THIS!]
这是为了要和 4.3 BSD 兼容所使用的参数,请不要将它移除,否则有些应用程序可能会出现奇怪的影响。
options        COMPAT_FREEBSD4        #Compatible with FreeBSD4
options        COMPAT_FREEBSD5        #Compatible with FreeBSD5
FreeBSD 6.x 做了许多修改,为了兼容于 FreeBSD 4.x、5.x 的系统呼叫 (system call),建议您保参这个设定。
options        SCSI_DELAY=5000        #Delay (in ms) before probing SCSI
这个选项控制了开机时寻找 SCSI 设备时要延迟多久 (MILLISECONDS),预设是 5 秒。有的 SCSI 需要一段时间来进行被始化的动作,当使用 IDE 的硬盘开机时,我们可以忽略这一行。如果您是以 SCSI 硬盘开机,您可以把这一行的数字调小一点以加快开机的速度。当然,如果因此抓不到硬盘,您就必须再把这个值调高一点。
options        UCONSOLE                #Allow users to grab the console
允许使用者抓取console 所印出的讯息。这个选项对于 X window 使用者尤其有用。例如,我们可以使用 xterm -C 来模拟 console,以得到 talk、write (一种在 UNIX 网络聊天的功能) 所传来的讯息,或是任何从系统发出的讯息。不过 FreeBSD 5.x 后已不再需要这个选项。
options        USERCONFIG                #boot -c editor
options VISUAL_USERCONFIG        #visual boot -c editor
这个选项可以让我们在开机时编辑开机选项。FreeBSD 5.x 后已不再支持这二个选项,而改用 device.hints,请 man device.hints。
options        KTRACE                #ktrace(1) support
允许使用核心除错追踪,通常只有对于核心开发者比较有用。
options        SYSVSHM                #SYSV-style shared memory
这个参数提供 System V 共享内存的支持。最常使用 SYSVSHM 的是 X Windows 的 XSHM 功能,有些图形化的程序用使用它来提高执行速度。如果你使用 X Windows 或是 BBS,你一定要打开此参数。
options        SYSVMSG                #SYSV-style message queues
提供 System V messages 的支持,虽然不常用到,但是它只占一点点 kernel 的空间。如果你架 bbs 站,这是一定要的啦。
options        SYSVSEM                #SYSV-style semaphores
提供 System V semaphores 的支持,虽然不常用到,但是它只占一点点 kernel 的空间。您可以使用 ipcs 这个指令来查看是否有应用程序使用 System V 的这些选项,例如 Postsgre SQL 就必须用到。
options        P1003_1B                #Posix P1003_1B real-time extensions
options        _KPOSIX_PRIORITY_SCHEDULING
Real-time extensions added in the 1993 POSIX。有些程序 (如 star office) 会用到它。FreeBSD 5.x 后不再需要 P1003_1B 这个选项。
options        ICMP_BANDLIM        #Rate limit bad replies
这个选项限制 ICMP 封包错误回应所使用的频宽,它可以降低我们被阻断式攻击 (denial of service packet) 的危险。如果您使用 FreeBSD 4.x,建议您保留该选项。FreeBSD 5.x 后预设已将此功能打开,所以这个选项在 6.x 已经不需要了。
# To make an SMP kernel, the next two are needed
options        SMP                # Symmetric MultiProcessor Kernel
device        apic                # I/O APIC
这二个选项可以使用多颗 CPU,FreeBSD 5.x 后对于多颗 CPU 的支持有更好的效率,如果您只使用单颗 CPU,可以将此选项关闭。
8.2.5 总线及软盘机
device        isa
device        eisa
device        pci
所有 FreeBSD 支持的硬件一定有上述其中之一的总线,isa 总线在现在的 i386 机器上已经很少见了。而 eisa 在 586 以后的主机板已经没见过了。pci 应该是目前的主流,只要您有 pci 适配卡就必须打开此选项。
device        agp                # support several AGP chipsets
这个选项是用来支持 AGP 适配卡,大多数的显示卡都是 AGP 接口。
#FreeBSD 4.x
device        fdc0 at isa? port IO_FD1 irq 6 drq 2
device        fd0 at fdc0 drive 0
device        fd1 at fdc0 drive 1
# FreeBSD 5.x 以后
device        fdc
以上几个选项用以支持软盘机,在 FreeBSD 5.x 后只需要一个 fdc 即可。而使用 FreeBSD 4.x 时,如果您只有一个软盘机,您可以将 fd1 移除。
8.2.6 IDE 接口装置
device        ata
这是 ATA 及 ATAPI 的驱动程序,如果您有 ATA 硬盘或光驱,一定要打开这个选项。如果要支持以下任何 IDE 接口装置都必须将这个选项打开。
device        atadisk                # ATA disk drives
device        ataraid                # ATA RAID drives
device        atapicd                # ATAPI CDROM drives
device        atapifd                # ATAPI floppy drives
device        atapist                # ATAPI tape drives
以上装置分别是 ATA 硬盘、ATA 磁盘阵列装置、IDE 光驱、IDE 软盘机、及 IDE 磁带机。您可以将不必要的装置移除,例如 IDE 软盘机等。
options        ATA_STATIC_ID        #Static device numbering
这个选项用来将 ATA 控置单元设定为固定的控制编号,通常用在一些比较旧的设备上。
8.2.7 SCSI 装置
device        ahb                # EISA AHA1742 family
device        ahc                # AHA2940 and onboard AIC7xxx devices
device        ahd                # AHA39320/29320 and onboard AIC79xx devices
device        amd                # AMD 53C974 (Tekram DC-390(T))
device        isp                # Qlogic family
device        mpt                # LSI-Logic MPT-Fusion
#device        ncr                # NCR/Symbios Logic
device        sym                # NCR/Symbios Logic (newer chipsets + 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 适配卡的驱动程序,如果您有 SCSI 适配卡,您可以使用 dmesg 去查看您的适配卡型号,并留下所需的驱动程序即可。如果您只有 IDE 设备,您可以将所有项目移除。
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)
这些是 SCSI 接口的设备,如果您有任何 SCSI 接口的设备或是 USB 硬盘、大姆哥,一定要保留 scbus 这个 SCSI 总线的选项。ch 是 SCSI media changer (一种备份用的设备)。如果您有 SCSI 硬盘或是 USB 硬盘,请保留 da 这个选项。而 sa 及 cd 分别是 SCSI 磁带机及光驱。
# RAID controllers interfaced to the SCSI subsystem
device        amr                # AMI MegaRAID
device        asr                # DPT SmartRAID V, VI and Adaptec SCSI RAID
device        ciss                # Compaq Smart RAID 5*
device        dpt                # DPT Smartcache III, IV - See NOTES for options
device        iir                # Intel Integrated RAID
device        ips                # IBM (Adaptec) ServeRAID
device        mly                # Mylex AcceleRAID/eXtremeRAID
device        twa                # 3ware 9000 series PATA/SATA RAID
# RAID controllers
device        aac                # Adaptec FSA RAID
device        aacp                # SCSI passthrough for aac (requires CAM)
device        ida                # Compaq Smart RAID
device        mlx                # Mylex DAC960 family
device        pst                # Promise Supertrak SX6000
device        twe                # 3ware ATA RAID
以上是磁盘阵列装置,如果您没有任何磁盘阵列,可以将它们全部移除。
8.2.8 基本外围设备
# atkbdc0 controls both the keyboard and the PS/2 mouse
device        atkbdc                # AT keyboard controller
device        atkbd                # AT keyboard
device        psm                # PS/2 mouse
atkbdc 这个选项用来控制键盘及鼠标。而 atkbd 及 psm 分别为 AT 键盘及 PS/2 鼠标的驱动程序。
device        vga                # VGA video card driver
这是显示卡的驱动程序。
# FreeBSD 4.x
pseudo-device        splash
# FreeBSD 5.x 以后的版本
device        splash                # Splash screen and screen saver support
启动时更新屏幕,屏幕保护程序会使用到它。FreeBSD 4.x 及 5.x 后所使用的选项不太一样喔。
# syscons is the default console driver, resembling an SCO console
# FreeBSD 4.x
device        sc0 at isa? flags 0x100
# FreeBSD 5.x 以后的版本
device        sc
这是预设的 console 驱动程序,如果有屏幕一定要保留这个选项。
# 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
支持 vt 200 及 vt100 等兼容终端机。
# Floating point support - do not disable.
device        npx
这是支持 FreeBSD 浮点运算,请勿移除。
device        agp
这是用来支持 AGP 显示卡的驱动程序。
# Power management support (see NOTES for more options)
# FreeBSD 4.x
device        apm0        at nexus? disable flags 0x20
# FreeBSD 5.x 以后的版本
#device        apm
支持 APM 电源管理,在 FreeBSD 4.x 下,如果您想要在打指令 shutdown -p 时能自动关机,请将 disable 字样移除。FreeBSD 5.x 后请将 apm 该行的井字号移除。接着必须在 /etc/rc.conf 中加入下列二行:
apm_enable="YES"
apmd_enable="YES"

# Add suspend/resume support for the i8254.
device        pmtimer
这是用来支持 i82454 休眠待命模式。
# PCCARD (PCMCIA) support
# FreeBSD 4.x
device        card
device        pcic0        at isa? irq 0 port 0x3e0 iomem 0xd0000
device        pcic1        at isa? irq 0 port 0x3e2 iomem 0xd4000 disable
# FreeBSD 5.x 以后的版本
# Pcmcia and cardbus bridge support
device        cbb                # cardbus (yenta) bridge
device        pccard                # PC Card (16-bit) bus
device        cardbus                # CardBus (32-bit) bus
这些是 PCMCIA 适配卡的驱动程序,如果您使用的是笔记型计算机,请保留这些项目。FreeBSD 5.x 后支持 32 bit 的 PCMCIA 接口,但 FreeBSD 4.x 不支援喔。
# Serial (COM) ports
# FreeBSD 4.x
device        sio0        at isa? port IO_COM1 flags 0x10 irq 4
device        sio1        at isa? port IO_COM2 irq 3
device        sio2        at isa? disable port IO_COM3 irq 5
device        sio3        at isa? disable port IO_COM4 irq 9
# FreeBSD 5.x 以后的版本
device        sio                # 8250, 16[45]50 based serial ports
支持串行端口 Serial (COM) ports。在 FreeBSD 4.x 下,sio0、sio1 等分别代表着 COM1、COM2、COM3、COM4。而 FreeBSD 5.x 后只要一个 sio 即可。通常我们只有 COM1 及 COM2,如果您有内接式的调制解调器,您可能要保留 COM3 或 COM4。
# Parallel port
device        ppc
device        ppbus                # Parallel port bus (required)
device        lpt                # Printer
device        plip                # TCP/IP over parallel
device        ppi                # Parallel port interface device
#device        vpo                # Requires scbus and da
这些是并列端口及其它并列端口装置 (如列表机) 的驱动程序。
8.2.9 网络卡设定
device        de                # DEC/Intel DC21x4x (``Tulip'')
device        em                # Intel PRO/1000 adapter Gigabit
device        ixgb                # Intel PRO/10GbE Ethernet Card
device        txp                # 3Com 3cR990 (``Typhoon'')
device        vx                # 3Com 3c590, 3c595 (``Vortex'')
这些是网络卡的驱动程序,您可以使用 dmesg 去查看自己的网络卡型号,并保留所需要的型号设定即可。
# 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
如果您使用的是下列这些 PCI 10/100 的网络卡,请保留 MII bus 这个选项。
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        nge                # NatSemi DP83820 gigabit ethernet
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 and SK-982x gigabit ethernet
device        ste                # Sundance ST201 (D-Link DFE-550TX)
device        ti                # Alteon Networks Tigon I/II gigabit ethernet
device        tl                # Texas Instruments ThunderLAN
device        tx                # SMC EtherPower II (83c170 ``EPIC'')
device        vge                # VIA VT612x gigabit ethernet
device        vr                # VIA Rhine, Rhine II
device        wb                # Winbond W89C840F
device        xl                # 3Com 3c90x (``Boomerang'', ``Cyclone'')
上列为 PCI 的网络卡,请使用 dmesg 查看您的网络卡型号,并保留所需的型号即可。请注意上列网络卡都必须要有 MII bus 的支持。
# 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接口的网络卡。如果很不幸的你的网络卡是 ISA 接口,建议你换成 PCI 的适配卡,否则你应该要先知道你使用的 irq 及 port。如果你的型号是 ed0 ,则请勿移除上述的 miibus。
# Wireless NIC cards
device        wlan                # 802.11 support
device        an                # Aironet 4500/4800 802.11 wireless NICs.
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.
这些是无线网络卡。
8.2.10 虚拟装置
device random # Entropy device
# FreeBSD 4.x
pseudo-device        loop        # Network loopback
# FreeBSD 5.x 以后的版本
device        loop                # Network loopback
这二个虚拟的装置分别用来做随机运算及 loopback 网络,请保留这二个选项。
device        mem                # Memory and kernel memory devices
这是系统的内存装置。
device        io                # I/O device
这是支持 user space 程序直接存取系统 I/O,X Windows 需要这个项目。
device        radom                # Entropy device
这是用来产生随机密码数字之类的装置。
# FreeBSD 4.x
pseudo-device        ether        # Ethernet support
# FreeBSD 5.x 以后的版本
device        ether                # Ethernet support
这是用来支持以太网络,只要您有网络卡都必须保留这个项目。
# FreeBSD 4.x
pseudo-device        sl 1
# FreeBSD 5.x 以后的版本
device        sl                # Kernel SLIP
sl 用以支持 SLIP,SLIP已经几乎被 PPP 所取代,ppp 可以更简单、快速的建立 modem-to-modem 联机。在 sl 后面的数字是要仿真多少条 SLIP。
# FreeBSD 4.x
pseudo-device        ppp 1        # Kernel PPP
# FreeBSD 5.x 以后的版本
device        ppp                # Kernel PPP
支持 ppp 拨接连线。
# FreeBSD 4.x
pseudo-device        tun        # Packet tunnel.
# FreeBSD 5.x 以后的版本
device        tun                # Packet tunnel.
tun 会被 ppp 所使用,如果您有拨接网络 (含 ADSL 拨号) 一定要保留这个选项。
# FreeBSD 4.x
pseudo-device        pty        # Pseudo-ttys (telnet etc)
# FreeBSD 5.x 以后的版本
device        pty                # Pseudo-ttys (telnet etc)
最大的 ttys,如 telnet 同时上线最大人数,在 FreeBSD 4.x 预设是 16。你可以在 pty 的后面加上数字来提高人数,最大是 256。FreeBSD 5.x 后则毋需担心这个问题。
# FreeBSD 4.x
pseudo-device        md        # Memory "disks"
# FreeBSD 5.x 以后的版本
device        md                # Memory "disks"
用来支持虚拟的 Memory disk,这是一种将某块内存拿来当成磁盘驱动器使用的虚拟装置。
# FreeBSD 4.x
pseudo-device        gif        # IPv6 and IPv4 tunneling
# FreeBSD 5.x 以后的版本
device        gif                # IPv6 and IPv4 tunneling
支持 IPv6 和 IPv4 之间的沟通。
# FreeBSD 4.x
pseudo-device        faith 1        # IPv6-to-IPv4 relaying (translation)
# FreeBSD 5.x 以后的版本
device        faith                # IPv6-to-IPv4 relaying (translation)
用以支持 IPv6 和 IPv4 之间的转换。
# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# FreeBSD 4.x
pseudo-device        bpf        # Berkeley packet filter
# FreeBSD 5.x 以后的版本
device        bpf                # Berkeley packet filter
这是 Berkeley Packet Filter,可以让我们的网络卡支持 promiscuous mode,一些网络监控程序会需要使用这个装置,例如 tcpdump、ethereal 等。
8.2.11 USB 装置
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 装置的驱动程序,请参考井字号之后的批注。如果您要使用 USB 2.0 的装置,请记得将 ehci 装置前面的井号移除。
# 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 Ethernett
这些是 USB 接口的网络卡,如果您要支持任何一种,都必须将 miisub 的选项打开。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
看了这么多项目头都晕了。如果您不知道怎么修改,我的建议是:
移除不必要的网络卡驱动程序。
移除不必要的 SCSI 装置。但不要移除 scbus、ch、da 等项目。
移除不必要的 IDE 装置,如 IDE 软盘。
如果您不使用 USB,也可以将 USB 装置移除。
8.3 编译与安装
8.3.1 编译新的核心
修改完核心之后,记得要先存盘,接着可以开始编译了。编译核心有二种方式,大部份的时候,我们可以任意使用这二种方法其中之一,使用第二种方式所需要的时间稍微长一点,以下是一些参考的法则:
如果您并未安装完整的 FreeBSD 原始码,只有安装 /usr/src/sys 这个目录,则只能使用方式一。
如果您使用的是 FreeBSD 4.0 以前的版本,只能使用方式一。
如果我们只是在核心设定档中加了几个选项,例如只是加了新的网络卡或是加上防火墙的设定,则只需使用方式一即可。
FreeBSD 支持一种名为 CVSup 更新所有原始码的方式,更新完原始码后,要执行 make world 来重新编译所有程序,这时候就要使用方式二。
方式一:
第一种是使用传统的编译方式,以下范例所使用的核心设定档名为 MYKERNEL,请改成您所使用的档名。首先我们先使用 config 这个指令会依照我们所修改的设定档成出编译核心所需要的档案。# cd /usr/src/sys/conf
# config MYKERNEL
config 这个指令会产生一个编译所使用的目录,如果您在执行 config 后发现错误讯息,请检查您所修改的档案是否有问题,例如语法错误等。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
如果您想要知道您修改过什么,可以使用下列指令来看二个档案的差异:# diff -ub GENERIC MYKERNEL
这样一来,您就可以看看是改了什么东西造成错误的发生,不错吧!
接下来就要到编译用的目录下。FreeBSD 5.0 以前的目录和 5.x 后的目录不一样哦:
FreeBSD 4.x:# cd ../../compile/MYKERNEL/
FreeBSD 5.x 以后:# cd ../compile/MYKERNEL/
接下来就可以开始进行编译了:# make depend
# make
上面的指令完成后,应该就完成了核心的编译。如果在过程中出现错误的讯息,注意一下错误是什么,并再次修改核心设定档。一般常见的错误可能是某一个设备的设定需要另一个设定,例如网络卡驱动程序要求 miibus,而却将它移除了。
完成了上述的步骤确定没问题时,就要安装新的核心了。使用下列指令加以安装:# make install
完成安装后,我们就可以移除编译过程所产生的档案了:
如果是 FreeBSD 4.x:# cd / ; rm -rf /usr/src/sys/compile/MYKERNEL
如果是 FreeBSD 5.x 以后:# cd / ; rm -rf /usr/src/sys/i386/compile/MYKERNEL
方式二:
在 FreeBSD 4.2-STABLE 2001年2月以后的版本,我们可以使用新的方式来编译及安装新的核心:# cd /usr/src
# make buildkernel KERNCONF=MYKERNEL
# make installkernel KERNCONF=MYKERNEL
安装完成后,将编译过程中使用的档案删除:# rm -rf /usr/obj/usr/src/sys/MYKERNEL
最后我们就可以重新开机了,在重新开机之前,我们多下了几个 sync 这个指令。这个指令的用意是要求系统将所有暂存在内存内的数据都写入硬盘。# sync;sync;sync;reboot
8.3.2 新的核心有问题
万一很不幸的,你发现编完核心后,无法开机进入 FreeBSD,这时候就要使用旧的核心来开机了。
如果是 FreeBSD 4.x,请在开机时看到倒数计时的时候,按 Enter 以外的键,会出现 boot: 这时候就先打 unload 来将已加载的数据移除,再打 /kernel.old 以使用旧的核心。boot: unload
boot: /kernel.old
万一连旧的核心也无法使用时,就使用安装时的核心。boot: /kernel.GENERIC
如果您使用的是 FreeBSD 5.x 以后,请在看到开机选单时按 6 以进入 loader 模式,并输入下列指令以使用旧的 kernel 开机:OK unload
OK boot /boot/kernel.old
在 FreeBSD 4.x 下,如果你想要删除坏的核心,由于 kernel 文件有特殊的档案属性,因此必须先使用下列指令修改属性,之后才可以删除。# chflags noschg /kernel
# rm -rf /kernel
值得注意的是FreeBSD 5.x 后的 kernel 放在 /boot/kernel 目录下,而旧的核心在 /boot/kernel.old。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
如果您一直卡在 compile kernel 无法成功,不要气馁,其实使用 GENERIC kernel 也没什么不好。您可以先将时间花在系统其它的设定上,等有时间再回来研究,这样比较不会因为一点小问题拖延您学习的时间。

逍遥 发表于 2006-6-5 15:12

第九章 系统调校
FreeBSD 是一个高效能的操作系统,预设的系统参数已符合大多数应用的需求。然而,针对不同的系统服务及软件应用,我们可以使用系统内附的工具来进行细部的调校。
本章包含下列关于效能调校的几个主题:
如何监看系统使用情形。
何谓 sysctl,如何使用它来进行调校。
如何提高硬盘效率。
9.1 监看系统效能
在进行调校之前,我们可以先使用一些系统内附的工具来查看目前系统效能。我们之前已经介绍过 top 这个指令,它可以让我们看目前系统中所有行程的状况、CPU、内存、及虚拟内存的使用情形。这里我们介绍另一个好用的工具 systat。systat 可以用来显示网络使用情形、硬盘 I/O、CPU 等信息,可以说是最完整的系统监看工具。它的使用方法如下:systat [-display] [refresh-interval]
其中 display 为我们所要显示的信息项目,我们也可以在进入 systat 后变更显示项目,而 refresh-interval 为多久要更新一次屏幕,单位是秒。以下为可用的 display 参数:
[b]显示模式[/b]
[b]意义[/b]
pigs
显示目前系统中使用 CPU 最多的行程名称。如果所有行程的 CPU 使用量未满 100%,则多出来的部份显示为 IDLE。
icmp
统计目前 ICMP 封包的进出情形。
icmp6
显示 IPv6 的 ICMP 封包进出情形。
ip
显示 IP 层的封包统计及 UDP 封包信息。
ip6
和 IP 一样,但只显示 IPv6 的封包。
tcp
显示 TCP 的封包统计。
iostat
显示 I/O 状况统计,并分类为各种模式显示。
swap
显示目前各个储存空间上的虚拟内存的使用情形。
mbufs
显示 mbufs 被使用的状态。
vmstat
这是我们最常用的显示模式,它显示了最多的信息,包含 I/O、虚拟内存、mbufs、网络等信息。
netstat
显示网络的使用情形。
ifstat
显示各个网络适配卡的使用情形。
进行 systat 之后,我们可以先按冒号「:」再打上述各种显示模式来变更显示的信息,如果要离开,则先按冒号,再按 quit 即可,或者也可以直接打「:q」。
让我们来看一下 vmstat 的情形,并指定每一秒钟更新一次画面:# systat -vm 1
   4 users    Load  0.02  0.02  0.00                   6 11 13:35
Mem:KB    REAL            VIRTUAL                     VN PAGER  SWAP PAGER
        Tot   Share      Tot    Share    Free         in  out     in  out
Act   39068    4900   130008    10864   80100 count
All  182200    7440  2692520    17828         pages
                                                                Interrupts
Proc:r  p  d  s  w    Csw  Trp  Sys  Int  Sof  Flt        cow     368 total
             48       751    2  467  543   20       58304 wire    100 0: clk
                                                    66744 act         1: atkb
2.3%Sys   0.0%Intr  0.8%User  0.0%Nice 96.9%Idl    47532 inact   128 8: rtc
|    |    |    |    |    |    |    |    |    |      10760 cache    71 9: vr0
=>                                                  69340 free     69 11: vr1
                                                          daefr       12: psm
Namei         Name-cache    Dir-cache                     prcfr       13: npx
   Calls     hits    %     hits    %                      react       14: ata
                                                          pdwak       15: ata
                                          zfod            pdpgs
Disks   ad0                               ofod            intrn
KB/t   0.00                               %slo-z    35664 buf
tps       0                               tfree        54 dirtybuf
MB/s   0.00                                         17812 desiredvnodes
% busy    0                                         16909 numvnodes
                                                     8706 freevnodes
如果您对于 systat 所显示的各个字段有疑问,请 man systat。
9.2 使用 sysctl 调校
sysctl 是一个用来在系统运作中查看及调整系统参数的工具。有的 sysctl 参数只是用来回报目前的系统状况,例如回报目前已开机时间、所使用的操作系统版本、核心名称等等;而有的可以让我们修改参数以调整系统运作的行为,例如网络暂存内存的大小、最大的上线人数等等。而这些可以调整的参数中必须在一开机系统执行其它程序前就设定好,有的可以在开机完后任意调整。
首先我们可以使用下列指令来查看目前所有的 sysctl 参数及其状况:# sysctl -a | more
kern.ostype: FreeBSD
kern.osrelease: 5.2.1-RELEASE
kern.osrevision: 199506
kern.version: FreeBSD 5.2.1-RELEASE #0: Sun Apr 11 16:16:08 CST 2004
   [email]alex@alexwang.com[/email]:/usr/src/sys/i386/compile/ALEX
kern.maxvnodes: 17812
kern.maxproc: 2020
kern.maxfiles: 4040
kern.argmax: 65536
kern.securelevel: -1
kern.hostname: alexwang.com
kern.hostid: 0
kern.clockrate: { hz = 100, tick = 10000, profhz = 1024, stathz = 128 }
kern.posix1version: 200112
kern.ngroups: 16
kern.job_control: 1
kern.saved_ids: 0
kern.boottime: { sec = 1081672724, usec = 885137 } Sun Apr 11 16:38:44 2004
kern.domainname:
kern.osreldate: 502010
kern.bootfile: /boot/kernel/kernel
kern.maxfilesperproc: 3636
kern.maxprocperuid: 1818
kern.ipc.maxsockbuf: 262144
kern.ipc.sockbuf_waste_factor: 8
kern.ipc.somaxconn: 128
kern.ipc.max_linkhdr: 16
kern.ipc.max_protohdr: 60
kern.ipc.max_hdr: 76
kern.ipc.max_datalen: 132
kern.ipc.nmbclusters: 9024
………略………
我们也可以使用 sysctl 显示单一的参数值,例如:# sysctl kern.ipc.maxsockbuf
kern.ipc.maxsockbuf: 262144
并非所有的参数都可以使用 sysctl 进行调整,而且有的参数对于效能的影响并不大。我们仅在此说明一些影响较明显的设定。
9.2.1 kern.ipc.maxsockets
这是用来设定系统最大可以开启的 socket 数目。如果您的服务器会提供大量的 FTP 服务,而且常快速的传输一些小档案,您也许会发现常传输到一半就中断。因为 FTP 在传输档案时,每一个档案都必须开启一个 socket 来传输,但关闭 socket 需要一段时间,如果传输速度很快,而档案又多,则同一时间所开启的 socket 会超过原本系统所许可的值,这时我们就必须把这个值调大一点。除了 FTP 外,也许有其它网络程序也会有这种问题。
然而,这个值必须在系统一开机就设定好,所以如果要修改这项设定,我们必须修改 /boot/loader.conf 才行。例如,我们要将它改成最多同时可以有 16424 个 socket,则必须在 /boot/loader.conf 中加入下列这一行:
kern.ipc.maxsockets="16424"
9.2.2 net.inet.ip.portrange.*
net.inet.ip.portrange.* 是用来控制 TCP 及 UDP 所使用的 port 范围,这个范围被分成三个部份,低范围、预设范围、及高范围。让我们看一下目前各范围 port 的情形:# sysctl -a|grep portrange
net.inet.ip.portrange.lowfirst: 1023
net.inet.ip.portrange.lowlast: 600
net.inet.ip.portrange.first: 1024
net.inet.ip.portrange.last: 5000
net.inet.ip.portrange.hifirst: 49152
net.inet.ip.portrange.hilast: 65535
一般的网络程序都会用到预设范围的 port,然而,这个预设范围只从 1024 到 5000,这对于一台忙碌的 FTP server 或 proxy server 可能会有不足的情形。所以我们可以手动调整一下 net.inet.ip.portrange.last 这个值,将它调为 10000、20000、甚至 40000 都是合理的。如果要在一开机就调整这个值,我们可以修改 /etc/sysctl.conf,并增加下列这一行:
net.inet.ip.portrange.last=40000
9.2.3 kern.ipc.shm_use_phys
kern.ipc.shm_use_phys 这个选项预设为 0 (关闭),我们可以将它设为 1 (打开)。如果我们将它设成 1,则所有 System V 共享内存 (share memory,一种程序间沟通的方式)部份都会被留在实体的内存 (physical memory) 中,而不会被放到硬盘上的 swap 空间。我们知道物理内存的存取速度比硬盘快许多,而当物理内存空间不足时,部份数据会被放到虚拟的内存上,从物理内存和虚拟内存之间移转的动作就叫作 swap。如果时常做 swap 的动作,则需要一直对硬盘作 I/O,速度会很慢。因此,如果我们有大量的程序 (数百个) 需要共同分享一个小的共享内存空间,或者是共享内存空间很大时,我们可以将这个值打开。
这个值可以在开机完成后才设定,因此只要放在 /etc/sysctl.conf 中即可:
kern.ipc.shm_use_phys=1
9.2.4 vfs.vmiodirenable
这个选项预设被设为 1,也就是打开的状态。它被用来决定一个目录中的结构 (目录下的其它文件名称等等) 被快取在内存中的行为。一般的目录结构可能都不大,而这些目录结构会被快取在物理内存中。物理内存中所存放的目录结构快取有限,所以不管我们的物理内存有多大,预设都只会快取一定大小的目录结构。如果我们将这个选项打开,系统将 buffer cache 放在虚拟内存的快取中,目录结构也就会被存放在虚拟内存中。这样的好处是所有的内存空间都可以被拿来做目录的快取,而缺点是最小用来存放目录结构的快取会从 512 bytes 变成 4K。
如果您的系统物理内存空间有限,建议您将这个选项关闭。但如果您的系统需要进行大量档案操作,例如 proxy、多人使用的邮件服务器、或是 news server 等,建议将这个选项打开。
9.2.5 vfs.write_behind
这个选项预设为 1,也就是打开的状态。在打开时,在系统需要写入数据在硬盘或其它储存设备上时,它会等到收集了一个 cluster 单位的数据后再一次写入,否则会在一个暂存区空间有写入需求时就立即写到硬盘上。这个选项打开时,对于一个大档案写入速度非常有帮助。但如果您遇到有很多行程延滞在等待写入动作时,您可能必须关闭这个功能。
9.2.6 vfs.hirunningspace
这个值决定了系统可以将多少数据放在写入储存设备的等候区。通常使用默认值即可,但当我们有多颗硬盘时,我们可以将它调大为 4MB 或 5MB。但必须注意的是,太大的值反而会造成效能低落。
9.2.7 net.inet.tcp.sendspace 及 net.inet.tcp.recvspace
这二个选项分别控制了网络 TCP 联机所使用的传送及接收暂存区的大小。预设的传送暂存区为 32K,而接收暂存区为 64K。如果需要加速 TCP 的传输,可以将这二个值调大一点,但缺点是太大的值会造成系统核心占用太多的内存。如果我们的机器会同时服务数百或数千个网络联机,那么这二个选项最好维持默认值,否则会造成系统核心内存不足。但如果我们使用的是 gigabite 的网络,将这二个值调大会有明显效能的提升。传送及接收的暂存区大小可以分开调整,例如,假设我们的系统主要做为网页服务器,我们可以将接收的暂存区调小一点,并将传送的暂存区调大,如此一来,我们就可以避免占去太多的核心内存空间。
还有要注意的是,除了这二个选项可以控制网络传输暂存区大小外,route 这个指令也可以用来依路由路径的不同指定暂存区大小。另外 ipfw 等防火墙软件也可以用来限制每个联机所能使用的网络频宽。
如果我们将传送或接收的暂存区设为大于 65535,除非我们的服务器本身及客户端所使用的操作系统支持 TCP 协议的 windows scaling extension (请参考 RFC 1323 文件)。FreeBSD 预设已支援 rfs1323 (即 sysctl 的 net.inet.tcp.rfc1323 选项)。
9.2.8 net.inet.tcp.always_keepalive
当这个选项打开时,系统会定期送出「keepalives」以检查一个 TCP 联机是否中断。在打开的状况下,所有运作的网络程序都会有定时检查联机是否中断的功能,否则只有当应用程序本身支持时才有此功能。这个选项打开的好处是让系统更便于管理网络联机,尤其是当我们系统中常有一些莫名其妙就中断联机的使用者时。例如,当一个使用者利用拨接连到系统时,很可能在完成一个完整的 TCP 联机之前,就因为拨接中断而造成联机异常中断。当然,在某些情况下,也有可能会造成系统误判网络联机已中断而结束这个 TCP 联机。
9.2.9 net.inet.tcp.delayed_ack
TCP 协议有一个特性,就是当收到客户端的数据时,会传回一个 ACK (acknowledgement) 的封包,以确认已收到数据。然而,我们也可以将 ACK 封包和所要回传的资料一起送出。例如,当我使用 telnet 进入系统时,在输入指定时,当我们在键盘上敲打一个字符,系统会送回一个表示已接收到该字符的 ACK 封包,并传回一个含有该字符的封包以在终端机上显示。当 net.inet.tcp.delayed_ack 打开时,系统会将 ACK 和显示该字符的封包一传送,而不需分成二个封包。所以这个选项打开时,可以将封包数量减少一半,以加速网络传输。其它的网络服务,例如,WWW、SMTP、POP3 等也都具有这种特性。
9.2.10 kern.ipc.somaxconn
这个选项控制了 TCP 联机等候区最多可以等待的联机数量,其默认值为 128,不过这个值对于一台忙碌的服务器而言可能小了点。例如大型的网页服务器、邮件服务器,我们可以将它设为 1024。要注意的是在一些网络服务的程序中,如 Apache 及 sendmail 也有自己的等待数量设定,我们可能也要在那些软件上做一些设定才会让 kern.ipc.somaxconn 发生作用。将这个选项的值调大一点还有一个好处,就是在面对 Denial of service 的攻击时,有较好的防卫能力。
9.2.11 kern.maxfiles
这个选项控制了系统中支持最多开启的档案数量,这个值通常是几千个档,但对于一台忙碌的数据库系统或是会开启许多档案的服务器而言,我们可以将它调高为一、二万。
9.2.12 kern.maxusers
这是用来控制系统内部表格(internal system tables)大小的参数,它的值大约是您期望系统同一时间会上线使用的使用者数量。我们在核心设定档中有一个 maxusers 的选项,如果您使用的是 FreeBSD 4.5 以上的版本,建议您只要在核心设定档中将它 0 即可,系统会在一开机时自动依您的内存大小调整这个值。如果我们使用的是 FreeBSD 4.5 以后的版本,要调整这个值时,我们可以在 /boot/loader.conf 中加入该选项的设定,例如:
kern.maxusers=256
如果您使用 FreeBSD 4.4 以前的版本,则只能重新编译核心以改变这项设定。
这个值一定要设定大于四,maxusers 的值决定了处理程序所容许的最大值,20+16*maxusers 就是你将得到的所容许处理程序。系统一开机就必须要有 18 个处理程序 (process),即便是简单的执行指令 man 又会产生 9 个 process,所以将这个值设为 64 应该是一个合理的数目。如果你的系统会出现 proc table full 的讯息的话,可以就把它设大一点,例如 128。除非您的系统会需要同时开启很多档案,否则请不要设定超过 256。
9.2.13 kern.ipc.nmbclusters
这个值用来调整系统在开机后所要分配给网络 mbufs 的 cluster 数量,由于每个 cluster 大小为 2K,所以当这个值为 1024 时,也是会用到 2MB 的核心内存空间。我们可以简单的估计出大约需要的大小,例如,假设我们的网页同时约有 1000 个联机,而 TCP 传送及接收的暂存区大小都是 16K,则最糟的情况下,我们会需要 (16K+16K) * 1024,也就是 32MB 的空间,然而所需的 mbufs 大概是这个空间的二倍,也就是 64MB,所以所需的 cluster 数量为 64MB/2K,也就是 32768。对于内存有限的机器,建议值是 1024 到 4096 之间,而当拥有海量存储器空间时,我们可以将它设定为 4096 到 32768 之间。我们可以使用 netstat 这个指令并加上参数 -m 来查看目前所使用的 mbufs 数量。
当我们要修改这个值是,必须在一开机就修改,所以只能在 /boot/loader.conf 中加入修改的设定,例如:
kern.ipc.nmbclusters=16384
9.2.14 hw.ata.wc
这个选项用来打开 IDE 硬盘快取。当打开时,如果有数据要写入硬盘时,硬盘会假装已完成写入,并将数据快取起来。这种作法会加速硬盘的存取速度,但当系统异常关机时,比较容易造成数据遗失。不过由于关闭这个功能所带来的速度差异实在太大,建议您还是保留原本打开的状态吧。
9.3 调整硬盘参数
磁盘空间的配置对于系统效能影响很大,当我们在分割磁盘时,应该分割一个小型的空间给根目录,接着再分割一个空间给 swap,让这二个空间放在硬盘最外圈,以加速存取速度。最后再慢慢的分割其它的空间,并将最大的空间放到最后。例如,我们在建立磁盘空间时,可以依序建立以下的空间:/ (256MB)、Swap (512MB)、/tmp (512MB)、/var (256MB)、/usr (4GB)、/home (25GB),让最大的空间放到最后。
在分割硬盘时,我们可以依我们所提供的服务来决定各个分割区的大小。将整个硬盘只分割一个大的 / 分割区往往不一个好主意。首先,对于主要作为读取用途的目录和以写入为主的目录最好分开为不同的分割区,如此一来,我们可以针对这些不同用途的分割区进行调校。例如,/var 及 /var/tmp 常会被写入数据,而 /usr 通常只用来读取,在分割磁盘时,我们将最常写入的 /var、/var/tmp 放在最大的磁盘分割区 /home 之前,将有助于速度的提升。另外,我们将 / 独立分割成一个只会做读取动作的空间,在异常关机时,磁盘空间也比较不会损毁。分割成多个磁盘空间可以让我们使用 newfs 或 tunefs 等工具来进行调效,这也是只分割一个单一的空间所做不到的事。
FreeBSD 的档案系统在 block size 为 8K 或 16K 时有最好的表现,而使用 newfs 进行格式化时,预设的 block size 为 16K。然而,当我们的服务器是做为数据库用途时,由于数据库的存取是随机存取,所以在 block size 为 8K 时会有比较好的表现。如果我们将 block size 设为 16K 以上,比较容易造成空间浪费及空间破碎的问题,进而造成效能低落。
当我们的分割区主要存放大量小型档案时,例如 BBS 或 news server,我们会将 block size 调小一点,如 8K 或是 4K。而在 newfs 时,我们也会指定 fragment size,它的值最好是 block size 的八分之一,例如当 block size 为 8K 时,我们会使用 newfs -b 8192 -f 1024 来格式化硬盘。如果您使用的是 /stand/sysinstall 来分割硬盘,您可以在分割硬盘时按 N 来设定 newfs option。
当我们的分割区主要用来存放少量大文件时,例如数据库,我们可以使用 newfs 参数 -i 设定 inode 所占空间大一点以减少 inode 的数量 (也就是可以建立的档案及目录数量),让系统在不正常关机后,开机时进行 fsck 时可以快一点。不过在修改 inode 数量时要注意,否则您可能会遇到硬盘空间明明未满却无法新增档案的窘境。若要使用大型的 inode,FreeBSD 建议的 inode 大小为 32768、65536、或 262144,再大的话只会降低效能。
我们在使用 /stand/sysinstall 新增一个分割区时,您会发现在 Newfs 字段中,除了 / 及 swap 外,其它的分割区 newfs 字段都有一个 UFS2+S 的设定,如图 9-1 所示:
图 9-1
[img]http://homepage.cqwu.net/wxfy/images/ch09_01.png[/img]
您所看到的 S 表示使用 Soft Updates。Soft Updates 可以用来加速系统写入档案及目录的系统数据,对于新增及删除档案的速度有明显的提升。Soft Updates 可以让我们在写入资料时保有完整性,在面临系统不正常关机时,能让所写入的数据尽量完整。而其缺点是在删除或更新档案时,硬盘空间的释放较慢,这个缺点在于一个快要满的分割区中比较明显。例如,当我们的 / 目录快满时,我们更新该分割区的数据时,可能会因为分割区在删除数据后空间释放较慢而使空间不足而失败,进而造成某些档案无法使用。所以 FreeBSD 预设并未在 / 目录中使用 Soft Updates。
Soft Update 除了可以在格式化硬盘时就将它启动外,FreeBSD 有一个用来调整硬盘参数的指令 tunefs 可以在分割完硬盘后启用 Soft Updates。不过 tunefs 只能在该储存空间尚未被挂入前使用,所以如果您要使用 tunefs,只能在单人模式下使用。
9.4 虚拟内存管理
如果您的内存很小,或者是您会跑一些需要用到海量存储器的程序时,您可能常常使用到虚拟内存 (swap partition)。当我们在分割 Swap 空间时,它的大小最少必须是物理内存的2.5 倍。例如,当我们有 128 MB RAM 时,最小应该要有 384MB 的 Swap。因为 FreeBSD 核心对于虚拟内存的管理上,当 Swap 有物理内存二倍以上时有最佳的效能。现在的内存价格都不高,建议您最好让内存大一点以免使用到硬盘做为虚拟内存。如果一定会用到虚拟内存,太小的 swap 空间会造成效能低落,即使您不必用到那么大的空间,因为目前硬盘都很大,建议您还是将它的值调大一点。另外,当我们有多颗硬盘时,建议将 Swap 空间分别存放在每一个硬盘上,而且每颗硬盘上的 Swap 空间大小要一致,虽然大小不一致时,FreeBSD 还是可以处理,但效能会差很多。

逍遥 发表于 2006-6-5 15:13

第十章 软件安装
安装了 FreeBSD 后,您一定还会需要安装其它非 FreeBSD 内附的软件。在 FreeBSD 上安装软件有许多种方法,我们将一一为各位介绍。
本章包含了下列软件安装必备的课题:
各种安装方式的优缺点。
如何使用 package。
如何使用 port。
如何使用传统安装方法自行编译软件。
10.1 概论
传统上,要在一个 UNIX 系统上安装其它软件时,有几个步骤:
下载该软件,有可能是 binary 档或是原始码。
解压缩该档案,通常是以 tar 或 gzip 压缩的。
读一下该目录中的说明文件,可能是 readme 或是 doc/ 的文件,来了解如何安装该软件。
如果所下载的是原始码,可能要先编辑一下 Makefile 或是执行 configure,接着再编译该软件。
最后再测试与安装。
当然,我们可以在 FreeBSD 上使用传统的方式来安装软件,但是还有更简单的选择。FreeBSD提供了 package 和 ports 这二种简单的安装软件方式。
所谓的 pakcage 是别人帮你将程序编译成 binary 文件,并定义了该安装在什么地方。我们只要下载一个压缩档,并使用 pkg_add 这个指令就可以快速的将软件安装在 FreeBSD 上。这是安装软件最简单的步骤,所安装的东西也是最标准的,和自己依需求修改并编译原始码比较起来较缺乏弹性。
而 port 就是使用原始码来安装软件。我们只要进入 /usr/ports/ 里想要安装的软件目录中,打指令 make install 就可以完成安装了。FreeBSD 己经帮我们定义了安装该软件所须的步骤、所要求的其它套件。不管是 package 或是 ports,当安装的软件需要依靠其它软件才能继续安装时,它们会自动帮你安装该软件。所有安装好的软件都将记录在 /var/db/pkg 中,日后如果我们想要移除软件时,可以用一个简单的指令 pkg_delete 加上软件名称就可以了。
即然 port 这么好用,为什么 FreeBSD 要同时有 package 和 ports 呢?我们来比较一下 ports 和 package 的优点:
package 的优点:
一个己经编译过的压缩档通常比包含原始码的档案还要小。
使用 pakcage 并不需要再做任何的编译动作,如果你的计算机速度很慢,在安装像 KDE、GNOME 等大型软件时,不用编译可以省下很多时间。
使用 package 来安装软件时,你不必事先了解在 FreeBSD 上编译时所使用的软件及其过程。
ports 的优点:
package 为了要在多数的计算机执行,考虑兼容性问题,通常编译的比较保守。而使用 ports 你可以依自己的系统修改,例如选择使用 Pentium III 或是 Athlon 的处理器。
在编译 package 时,就已经限制了该软件的功能,无法再依自己需求扩充。例如 Apache 这套软件就有许多的功能可以在编译时挂进来,使用 ports 来安装时,你可以依自己的需求来加以修改。
我们可以经由更新 Port Tree 来使用较新的软件,而 package 通常只和系统一起 release。
有些软件不允许使用 binary 文件的方式散播,只能下载原始码。
有了原始码,你可以自己修改并加以应用。
有的人喜欢拥有原始码,他们可以读它、从中学习。
接着我们就针对 package 及 ports 来说明它们的使用方式。   
10.2 使用 package
10.2.1 安装 Package
安装package 有二种方式,第一种是使用 sysinstall (也就是我们安装 FreeBSD 时所看到的画面) 来安装,另一种是使用手动安装。使用 sysinstall 安装时,我们必需选择安装的来源,最常使用的来源是网络及光盘片。但是由于光盘片容量有限,所以在 FreeBSD 安装光盘中所含的 package 软件数量并不多,因此我通常都选择使用网络安装。而使用手动安装必须自行抓回所需的档案,并以指令安装。以下我们就分别针对这二种方式来说明:
方式一:使用 sysinstall
假设我们要安装在 FreeBSD 上收信的软件 pine,首先我们要执行 sysinstall 以进入安装时的画面:# sysinstall
图 10-1
[img]http://homepage.cqwu.net/wxfy/images/ch10_01.png[/img]
接着选取 Configure选项,进入图 10-2 的画面:
图 10-2
[img]http://homepage.cqwu.net/wxfy/images/ch10_02.png[/img]
我们选 Packages 选项来安装 package:
图 10-3
[img]http://homepage.cqwu.net/wxfy/images/ch10_03.png[/img]
在图 10-3 中,我们必须选择安装来源,在这里我们选择 FTP ,从 FTP 中我们可以找到较多的软件。选择了 FTP 之后,将出现图 10-4 的画面,让我们选择要使用哪一个 FTP 站台:
图 10-4
[img]http://homepage.cqwu.net/wxfy/images/ch10_04.png[/img]
我们选择「URL」来自订要使用的 FTP 站台。接着便会出现一个要求我们输入站台地址的窗口,如图 10-5 所示,假设我们要使用交大资工的站台,则输入 freebsd.csie.nctu.edu.tw/pub/releases/i386/:
图 10-5
[img]http://homepage.cqwu.net/wxfy/images/ch10_05.png[/img]
输入站台后,会问您是否要使用目前的网络设定。如果我们己经连上网络,则选 YES,否则请选 NO 来设定网络。接着会出现一个软件分类选单,这一份分类选单将各个软件分门别类放在不同的选项下,其中 All 是所有软件的所在,如图 10-6。
图 10-6
[img]http://homepage.cqwu.net/wxfy/images/ch10_06.png[/img]
我们以安装邮件软件 pine 为例,由于 pine 位于 mail 分类下,所以我们选择mail。如果您要安装中文版本的 pine ,应该选择 Chinese 选项而非 mail。选择了 mail 之后,将出现 mail 分类下的所有软件,我们选 pine-4.58 这一项,如图 10-7:
图 10-7
[img]http://homepage.cqwu.net/wxfy/images/ch10_07.png[/img]
选了pine 之后,就可以选 OK 回到前一个分类画面,接着按照这种方式选了其它我们要安装的软件之后,就可以选「Install」来安装了。选了 Install 之后,将出现所有我们已选取的软件列表,如图 10-8,如果要继续安装则选 OK 即可。
图 10-8
[img]http://homepage.cqwu.net/wxfy/images/ch10_08.png[/img]
方式二:使用手动安装
如果以手动的方式安装,我们必须先取回所要安装的package。只要是 package ,它的扩展名就是 .tgz。我们可以用 pkg_add 这个指令来安装它。下面是一个简单的范例,使用 package 来安装 lsof-4.66.1.tgz:# ftp -a freebsd.csie.nctu.edu.tw
Connected to freebsd.csie.nctu.edu.tw.
220---------- Welcome to Pure-FTPd ----------
220-You are user number 139 of 200 allowed.
220-Local time is now 17:49. Server port: 21.
220-Only anonymous FTP is allowed here
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
331 Any password will work
230 Any password will work
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /pub/FreeBSD/ports/packages/sysutils/
250 CWD command successful.
ftp> get lsof-4.71.tgz
local: lsof-4.71.tgz remote: lsof-4.71.tgz
227 Entering Passive Mode (140,113,17,209,189,16)
150-Accepted data connection
150 96.1 kbytes to download
100% |*********************************************************| 98372 136.87 KB/s 00:00 ETA
226-File successfully transferred
226 0.362 seconds (measured here), 265.35 Kbytes per second
98372 bytes received in 00:00 (136.70 KB/s)
ftp> bye
221-Goodbye. You uploaded 0 and downloaded 97 kbytes.
221 Logout.
# pkg_add lsof-4.71.tgz
要使用 package 安装软件,首先必须取得想要安装的软件。我们可以先 ftp 到各大学 FTP 站台去取得。packaeg 的副档案是 .tgz,可以在各 FTP 站台的 ports/packages 中取得。以交大资工的 FTP 站而言是放在 [url]ftp://freebsd.csie.nctu.edu.tw/pub/ports/packages[/url] ;而中央资工的 FTP 是放在 [url]ftp://freebsd.csie.ncu.edu.tw/FreeBSD/ports/packages[/url] 。当进入 ports 的目录后,我们会发现还有一堆目录,您可以依您的系统版本选择要使用哪一个目录,其中 packages 这个目录包含了最新的 packages。如果您想要使用 packages-5.4-release 的 packages,我们就可以选择进入 packages-5.4-release 这个目录。进入这个目录后,又有一堆目录,这里的目录结构和你系统中 /usr/ports/ 下的目录一样,每个目录都是软件的分类,而 All 这个目录是所有软件。
如果您只知道想要安装的软件名称,却不知道版本及完整的档名,例如您要下载 popa3d 这个软件,但不知道是哪一版的,你可以先进入 All 的目录下,再以下列方式查询:ftp> ls popa3d*
227 Entering Passive Mode (140,113,209,200,159,54)
150 Opening ASCII mode data connection for /bin/ls.
-r--r--r-- 1 FTP CSIE 19007 Nov 11 12:43 popa3d-0.6.4.1.tgz
226 Transfer complete.
ftp> get popa3d-0.6.4.1.tgz
找到了想要下载的版本是 0.6.4.1,接着就以 get 指令去取回该软件,最后下 exit 离开。
接着你就可以使用 pkg_add popa3d-0.6.4.1.tgz 来安装该软件。
10.2.2 管理 Package
如果我们后悔了,想要移除之前安装过的软件,可以下指令 pkg_delete popa3d-0.6.4.1 来移除 popa3d-0.6.4.1 这套软件,所有我们安装过的软件都会记录在 /var/db/pkg 的目录中。
我们可以使用 pkg_info 这个指令来得到软件的信息。例如在我们下载完一个 package 后,你想要知道这个软件的信息,以 popa3d-0.6.4.1.tgz 而言,如果我们想知道它的信息,你使用下列指令来取得:# pkg_info popa3d-0.6.4.1.tgz
您也可以只打 pkg_info 来得知所有你安装过的软件有哪些。
10.3 使用 ports
如果你要使用 ports 安装软件,你必须先确认 /usr/ports 这个目录是否有安装。如果没有的话,使用 /stand/sysinstall 来安装 ports 的目录:
以 root 执行 /stand/sysinstall
选择 Configure 后按 Enter
选择 Distributions 后按 Enter
选择 ports 后按空格键
选择 Exit 后按 Enter
选择你要从 CDROM 或 FTP 安装等
跟着选单照做,最后离开 sysinstall
或者我们也可以到 [url]http://www.freebsd.org/ports/[/url] 去手动抓回 port.tar.gz 这个档案,将它放在 /usr/ 下。并以下列指令来安装:# cd /usr
# tar zxvf port.tar.gz
现在可以进入 /usr/ports 的目录中,安装软件了。
通常每一个软件都有一个独立的目录,而目录中都存在着一些档案,每个档案都有其特定用途,我们简列如下:
Makefile
安装软件的编译设定,您可以修改这个档案来设定我们在编译及安装软件时的参数。
README.html
我们可以经由浏览 README.html 来查看所有 ports 目录下的软件说明。
distinfo
说明安装所需要的档案及其 MD5 的检查数据。
pkg-comment
简单的软件描述。
pkg-descr
较详细的描述,我们通常可以在里面找到该软件网页的位置,使我们能到该网页得到更多信息。
pkg-plist
列出软件将安装的清单,安装后会放在硬盘中的什么地方。
如果您想安装某一个软件,却不知道它的目录位置,您可以使用 whereis 这个指令来找出它来。例如我们想安装 qpopper ,可以使用 whereis qpopper 来找出它所在的目录。 或者果我们只知道某个程序的关键词,确不知道它放在哪个目录,我们可以使用下列指令:# cd /usr/ports
# make search key='关键词'
进入该目录后,最简单的安装方式是直接打 make install,系统就会自动去网络上抓取需要的软件回来安装。安装 ports 时,make 时找档案的顺序是:先去 /usr/ports/distfiles 、再去找 /cdrom/ports/distfiles、最后是网络中下载。如果您不使用网络安装的话,您可以自己去抓回软件,并将它放在 /usr/ports/distfiles/ 下,这样子在我们打 make install 时,就不会去网络上抓取档案。如果您所需档案存在光盘中,在安装软件之前,必须先将光驱 mount 在 /cdrom 中。。但有的软件并不会到光盘中去寻找档案,所以建议您还是将光盘中 /ports/distfiles 目录内容复制到 /usr/ports/distfiles 目录中,或者先连上网络吧。
当使用网络取得档案时,预设抓取档案的服务器通常在国外,因此,您可以修改 /etc/make.conf 来指定使用国内的 FTP 站台,例如编辑 /etc/make.conf 并加入:
MASTER_SITE_BACKUP?= \
   [url]ftp://freebsd.csie.ncu.edu.tw/distfiles/$[/url]{DIST_SUBDIR}/ \
   [url]ftp://freebsd.csie.nctu.edu.tw/pub/distfiles/$[/url]{DIST_SUBDIR}/
MASTER_SITE_OVERRIDE?=    ${MASTER_SITE_BACKUP}
当安装完 ports 后,我们可以再下指令 make clean 来清除编译过程产生的档案,建议最好这么做,否则有的过程中产生大量档案可是很惊人的。如果您安装了一堆软件之后,才想到之前没有 make clean,没关系,在安装 ports 时,编译过程的档案都存在于该软件目录下的 work 目录中。我们可以使用下列指令来找出所有未 make clean 的软件,并将暂存数据删除:# find /usr/ports -depth -name work -exec rm -rf {} \;
如果您使用网络安装,它会将所下载的原始码存在 /usr/ports/distfiles 中,当你下 make clean 后,并不会将它们清除。
当你安装完后,想要移除该软件时,只要在该软件的 ports 目录中打 make deinstall 即可。请注意,不要在 /usr/ports 的目录中打 make deinstall,这样可是会将 "所有" 软件都移除喔。
还有一些较不常用的 make 方式,简述如下:
make fetch:抓回所需的原始档。
make fetch-list:显示安装所需的档案。
make checksum:抓回原始档并以 MD5 检查其正确性。
make extract:抓回并解开原始档。
make configure:进行组态,但不继续编译。
make all install:抓回原始档、编译且安装。
make reinstall:若先前发生意外中断,以此命令继续尝试安装。
make package:将做好的 ports 打包制作成 packages。
如果安装完新的软件之后,如果使用的 Shell 是 Csh 或 Tcsh,我们可能必须执行指令 rehash 来重建 hash table,之后才能在所设定的指令路径中找到刚安装的程序,不然的话就必须输入该程序的完整路径或重新登入才能使用。
我们可以在 /var/db/pkg 的目录中看到我们已安装的软件,每一个软件有一个目录,目录中存放着软件安装的信息,包含了软件说明、安装到哪些目录中。有的软件要安装前,会要求先安装某一套软件,如果你事先没有安装它所要求的软件,通常该软件会自动帮你安装。所以我们会在 /var/db/pkg 下看到一些不是我们主动安装的软件。既然软件之间可能会相互依赖,我们要如何得知这些软件彼此间的关系呢?pkg_tree 这套软件可以让我们检视软件间的关系。我们可以使用 port 来安装这套软件:# cd /usr/ports/sysutils/pkg_tree
# make install clean
之后我们就可以使用 pkg_tree | more 来看各个软件之间的关系了 (别忘了要 rehash 喔)。
10.4 更新 port tree
当 FreeBSD release 时,会事先测试过 ports 目录中的所有软件是否能正常安装。因为不同软件之间时常是相互依赖的,有的时候我们要安装 A 软件,系统会自动抓取所需要的其它软件。这些软件对于彼此的版本可能会有相互依赖,所以在 release 之前,ports 会暂停更新各个软件的版本,以确保 release 的版本能正常运作。
但在 release 之后,ports 目录中的软件版本可能已有更新,有的软件版本更新可能只是增加新的功能,而有的更新更涉及系统安全。如果您想使用 ports 安装软件最新的版本,在安装软件之前,我们可以先使用一些工具来更新整个 port tree。
有时候更新了 port tree 之后,因为版本相依问题,有些软件可能会因此而无法顺利安装,您只要在过几天后重新做一次 port tree 的更新应该就可以解决了。
更新 port tree 的方法很简单,我们可以使用 CVSup 来保持 ports 在最新状态。CVSup 是一套用来维持软件原始码和开发团队同步的工具,在我们执行了 CVSup 之后,它会经由网络向所设定的软件服务器检查并更新原始码的版本。我们可以使用 CVSup 来更新 port tree,也可以用来更新 /usr/src 目录下的 FreeBSD 原始码。
首先,我们必须安装 CVSup,因为我们不使用图形接口,所以安装 cvsup-without-gui:# cd /usr/ports/net/cvsup-without-gui
# make install clean
在系统中有一份以 CVSup 更新 port tree 的设定文件范例,您可以直接加以修改或着先复制一份后再修改。我们将该设定文件范例复制到 /root 之后再加以修改:# cp /usr/share/examples/cvsup/ports-supfile /root/
接着请以文书编辑软件打开 /root/ports-supfile 后,找到 host 的部份来设定所要使用的 CVSup 服务器。
# Defaults that apply to all the collections
#
# IMPORTANT: Change the next line to use one of the CVSup mirror sites
# listed at [url]http://www.freebsd.org/doc/handbook/mirrors.html.[/url]
[b]*default host=cvsup.tw.freebsd.org[/b]
*default base=/usr
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix
# If your network link is a T1 or faster, comment out the following line.
*default compress
## Ports Collection.
#
# The easiest way to get the ports tree is to use the "ports-all"
# mega-collection.  It includes all of the individual "ports-*"
# collections,
ports-all
# These are the individual collections that make up "ports-all".  If you
# use these, be sure to comment out "ports-all" above.
#
# Be sure to ALWAYS cvsup the ports-base collection if you use any of the
# other individual collections below. ports-base is a mandatory collection
# for the ports collection, and your ports may not build correctly if it
# is not kept up to date.
#ports-base
#ports-archivers
#ports-astro
#ports-audio
#ports-benchmarks
………略…………
上面的范例中,我们将 CVSup 服务器设为 cvsup.tw.freebsd.org,这一台服务器是由交大资工所维护,您可以依您所在位置使用其它 cvsup1 ~ cvsup13.tw.freebsd.org 的服务器。例如 cvsup3 位于中山大学,cvsup13 是 giga 和信超媒体的服务器。最后一行的 ports-all 表示我们要更新 /usr/ports 目录下的所有档案。您也可以只更新其中的部份目录,只要将 ports-all 以井字号 "#" 标示起来,并将档案中 ports-base 那一行的 # 移除,接着您就可以依您所要更新的目录来要移除其它的 # 字号。例如,我们只要更新 /usr/ports/www 这个目录,将 ports-all 以 # 标示起来之后,我们还要移除 ports-base 及 ports-www 开头的 #。
设定完毕之后,我们就可以开始进行 ports 的更新了。# cvsup -g -L 2 /root/ports-supfile
上述指令中,参数 g 表示不使用图形接口,而参数 L 及其后所跟随的数字 2 表示我们要看到更新过程的记录的详细程度,数字可以从 0 ~ 2,最后的档名表示所要使用的设定档。
在使用 ports 安装软件之前,先执行 CVSup 是一个不错的习惯,您可以随时取得软件的最新版本,不过您的机器一定要连上因特网才能进行更新。
10.5 使用 portupgrade 更新软件
在使用 Port 安装了一堆软件后,如果软件有新的版本出来怎么办?FreeBSD 的 ports 管理工具中有一个好用的软件 - portupgrade。
通常 ports 中的软件都有相依性,例如安装 Apache 会自动安装 libexpat、安装防垃圾信软件会自动安装一堆 Perl 模块。而在更新软件时,我们必须要确定更新过后,相依的软件都一并更新,才不会造成更新后有东西不能运作的情形。不过这并不表示我们一定要常常更新软件,建议您只有在必要时才使用 portupgrade 来更软件,不要有事没事就跑一次。因为软件并不是最新的就最好,没有人能保证更新的软件是否还维持您原本期望的行为。
portupgrade 在更新软件时,会保留您原本的设定档。例如,在更新 Apache 时,它会保留 httpd.conf 的设定。使用 portupgrade 是更新 ports 软件比较安全的方式。
在您使用 cvsup 更新 port tree 后,我们可以使用下列指令查看目前安装的软件版本是否和 port tree 中的版本一样:# pkg_version -v
ispell-3.2.06_12 = up-to-date with port
jasper-1.701.0 = up-to-date with port
jpeg-6b_3 = up-to-date with port
kde-3.3.0
上列输出中需要更新的软件会有「# cd /usr/ports/sysutils/portupgrade
# make install clean
如果您只想要升级某一个软件本身,而非所有相依的软件,只要使用 portupgrade pkgname 即可。如果您要升级所有和该软件相依的其它软件,则可以加上参数 -r。如果您要更新包含相依软件的相依软件,则可以使用参数 -R。另外,您可以使用参数 -m 来要求编译 (make) ports 时多传入一些参数,还可以使用参数 -f 要求就算版本一样也强制更新。
假设我们要更新的软件是 perl-5.8,我们可以使用下列指令来更新:# portupgrade -rf "perl-5.8.*" -m "ENABLE_SUIDPERL=yes"
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
笔者并不建议您使用 portupgrade 来安装所有软件,尤其不建议使用参数 -a 来更新所有软件。一方面新的软件不一定会更好,另一方面,我们很难保证更新后的软件会正常运作。而且我们在安装软件时,并不一定只使用 make install,还有可能在 make 后加上一些参数以支持更多的功能,直接使用 portupgrade 并不一定还能保留这些功能。我们介绍 portupgrade 的目只是为了让您在安装 Open WebMail 时更新 perl 时更顺畅。
10.6 传统安装方式
我们介绍了 FreeBSD 独有的 package 及 port 安装方式后,接下来我们还是要详细说明一下传统上在 UNIX 机器上安装软件的方式。
有的时候,我们要想要装的软件可能不在 port 里,或者 port 中的软件版本尚未更新,这时候我们就必须使用传统的安装方式来安装软件。基本上,传统安装方式就像本章开头所说的,大多必须要有下列步骤:
从该软件网站或其它 FTP 站台下载该软件,有可能是 binary 档或是原始码。
解压缩该档案,通常是以 tar 或 gzip、bzip2 压缩的。
读一下该目录中的说明文件,可能是 readme 或是 doc/ 的文件,来了解如何安装该软件。
如果所下载的是原始码,可能要先编辑一下 Makefile 或是执行 configure,接着再编译该软件。
最后再测试与安装。
我们以 MySQL 这个软件为例。
下载及解压缩
首先我们到 MySQL 网站上下载最新的原始码。一般原始码大多以指令 tar 包成一个档案,再压缩成 gzip 或是 bzip2 格式。所以您下载的档案扩展名大多为 .tar.gz、.tgz、或是 .tar.bz2。
扩展名为 .tar.gz 或是 .tgz 的档案为 tar + gzip 格式,MySQL 的原始码就是这一种类型。我们可以使用下列指令来解压缩:# tar zxvf mysql-4.1.13.tar.gz
如果扩展名为 .tar.bz2 的档案,则是 tar + bzip2 的格式,遇到这种格式时,我们可以使用下列指令解压缩:# tar jxvf mysql-4.1.13.tar.bz2
我们可以看到上述二种格式都可以使用 tar 来解压缩,只是 gzip 格式必须使用参数 z,而 bzip2 的格式必须使用参数 j。指令 tar 的其它参数所代表的意义为:x 是解开的意思、v 是要观看解开的过程、f 是指定要解压缩的文件名称。
解开之后,我们就可以进入下一步开始安装。
查看说明档
每个软件在安装上大同小异,但有的软件除了一般安装流程外,可能还有自己独特步骤。所以在安装之前,我们必须先看一下说明档,以了解如何进行安装。
大部份的开放原始码软件都会有 README 或是 INSTALL 这二个档案,用以说明安装的步骤。有的软件可能有其它档案,但我们可以从档名了解应该要看哪一个说明档。以 MySQL 为例,在它的原始码包装中,有一个档名为 INSTALL-SOURCE 的档案,应该就是我们要看的安装说明档。我们使用文书编辑器打开该档后,可以看到一些关于安装的说明。MySQL 的说明档写的蛮详细的,但我们可以将重点放在 Installation 的地方:
2.8.1 Source Installation Overview
----------------------------------
The basic commands you must execute to install a MySQL source
distribution are:
    shell> groupadd mysql
    shell> useradd -g mysql mysql
    shell> gunzip  cd mysql-VERSION
    shell> ./configure --prefix=/usr/local/mysql
    shell> make
    shell> make install
    shell> cp support-files/my-medium.cnf /etc/my.cnf
    shell> cd /usr/local/mysql
    shell> bin/mysql_install_db --user=mysql
    shell> chown -R root  .
    shell> chown -R mysql var
    shell> chgrp -R mysql .
    shell> bin/mysqld_safe --user=mysql &
我们可以看到它的安装步骤写的很详细,还有指令范例。简单来看,应该就是要先增加一个使用者为 mysql,并增加 mysql 群组。接着再解压缩原始码、进行编译、安装、并做一些安装后的设定。
编译
在 MySQL 的安装步骤中,编译前要先进行 configure。事实上,大多数的开放原始码软件编译流程都使用下列三个步骤:# ./configure
# make
# make install
第一个指令是 configure,这个指令可以用来检查您目前系统的设定,并依您的使用环境决定要不要加入某些功能。您也可以使用下列指令查看 configure 指令中可以使用哪些参数:# ./configure --help | more
原则上,除非有特殊要求,否则我们直接执行 configure 即可。以 MySQL 为例,我们在 configure 指令后面加上下列参数:# ./configure --prefix=/usr/local/mysql \
    --with-low-memory \
    --with-charset=big5
我们使用 --prefix 以指定要安装的路径,这是所有使用 configure 的软件都会有的参数。另外,我们还指定编译时不要使用太多内存 (--with-low-memory),并设定 MySQL 支持中文字集 (--with-charset=big5)。
执行完 configure 检查环境并设定安装的项目后,我们就可以使用 make 来进行编译。指令 make 会呼叫编译器 gcc 来将原始码转换成执行档。
安装
编译完后,我们可以使用下列指令安装:# make install
您可以看到程序安装的过程。安装完成后,我们必须依不同的软件要求进行安装后的设定。以 MySQL 为例,我们必须先使用 mysql_install_db 以初始化数据库,并将一些目录的拥有者设定为 mysql。
最后就可以启动 mysql 了。而如果我们要在开机时启动 MySQL,必须将它的启动指令加入 /etc/rc.local 中,或是在 /usr/local/etc/rc.d 中加入一个 mysql.sh 并将启动的指令写在该档案中,然后将 mysql.sh 设为可执行。如此一来,FreeBSD 在开机时就会自动执行它。
以上就是一般传统软件安装的流程:configure、make、make install,其实使用上也不太难。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
传统的安装流程比较容易遇到的问题可能是在执行 make 时发生错误,如果您遇到问题,可以在 google 上查找 make 所产生的第一个错误的关键词,应该可以找到类似的问题及解决的方法。

逍遥 发表于 2006-6-5 15:16

第十一章 X Window 的使用
在 UNIX 的世界中,一样有图形化的接口可以使用。本章将介绍 UNIX 中最有名的窗口软件:X Window。X Window 提供了 FreeBSD 图形化的接口,但它只提供了图形化的能力,我们还必须另外安装一些常用的图形化程序及工具。读完本章后,您将了解下列主题:
X Windows 的介绍及安装。
KDE 窗口管理接口的使用。
中文化的图形接口。
11.1 安装 X Window
X11 是在 UNIX 系统下的窗口软件,它分为二种版本,一个是原本 FreeBSD 5.2.1 以前用的 XFree86,另一个是 FreeBSD 5.3 以后预设使用的 Xorg。
原本的 X11 是以 XFree86 为主,但最近由于版权争议及管理问题,分裂成二套软件。事实上,Xorg 也发展了很久,许多 Xorg 的人都是 XFree86 的开发者。在近期分裂时,Xorg 及 XFree86 的原始码做过同步,日后的开发才会有比较明显的差异。您可以选用 Xorg 或是 XFree86,不过 FreeBSD 预设是用 Xorg,而像 Redhat Linux 也都是使用 Xorg。照趋势及 Xorg 的开发愿景看来,似乎较多人会选用 Xorg。
我们在本章中会以 Xorg 设定为主,如果您使用 FreeBSD 5.2.1 以前的版本,您可以参考本章的设定,并将指令或设定名为 Xorg 的都改成 XFree86 即可。
X11 是一个 Client/Server 架构的软件,之所以会是 Client/Server 架构是因为在一开始设计 X 时,为了做到网络集中管理。「X Server」指的是有鼠标及键盘的机器,而「X Client」是画面显示的机器。不过我们在安装时,会将 Client 及 Server 都安装在同一台机器上。
X11 只是用来做基本的图形显示,我们除了介绍安装 X11 外,另外我们会再加装窗口管理软件,如果没有了它,X Windows 就只能看到白白一片。在众多的窗口管理软件中,我们选用 KDE,因为它提供了很多常用的工具,例如浏览器、Office 软件等。因此,我们将安装 X Windows + KDE 3 及并将其界面中文化。当然您也可以选用 GNOME 等其它的窗口管理接口。
您可以使用 port 来安装 X Window 及 KDE 3,但是必须花费很长的一段时间来进行编译。为了加快安装,我们使用 sysinstall 经由 packages 来快速安装。
Step1:安装X Window
在安装 FreeBSD 时,我们应该己经选择要安装 X Windows 套件,如果您安装 FreeBSD 时并未安装该套件,您可以在开机后执行 sysinstall 来进入安装时的选单。进入安装画面后,选择 [Configure]->[Distributions]->[X.Org],如图 11-1 所示。
图 11-1
[img]http://homepage.cqwu.net/wxfy/images/ch11_01.png[/img]
接下来会出现一个选单让您选择所要安装的 X.Org 套件,如图 11-2 所示,请进入每一个目录选取 ALL。
图 11-2
[img]http://homepage.cqwu.net/wxfy/images/ch11_02.png[/img]
接着选择 [EXIT] 回到选择安装来源。因为 X Window 已包含在 Installation CD 中,所以您可以选择 CD/DVD 为安装来源并放入本书所附的第一片 CD即可开始安装 X Window。
Step2:安装KDE 3
我们可以使用 Package 或 Ports 来安装 KDE,但是由于 Package 只会在 FreeBSD release 时产生,如果您之前有更新过 Port Tree,并安装过很多软件,则在使用 Package 安装 KDE 时,可能会发生无法安装的情形。而如果使用 Ports 来安装,光编译可能就要花很长的时间喔,大概要一、二天吧。所以,我们先试着使用 Package 来安装,以节省时间。
首先,请先将本书的第二片光盘放入光驱,并执行下列指令,以挂入光驱,并进入 sysinstall:# mount /cdrom
# sysinstall
进入 sysinstall 后,请选择 [Configure] -> [Packages] -> [CD/DVD] -> [kde] -> [kde-3.4.2]。选了 kde-3.4.2 后,系统会自动帮您选择其它需要的套件。接下来就可以按 OK 并回到上一页按 [Install] 开始安装。
万一您安装失败,可能是因为之前有安装过其它软件,造成冲突。这时候,我们可以改用 Port 来安装 KDE。如果您要使用 Port 安装,请使用下列指令:# cd /usr/ports/x11/kde3
# make BATCH=yes WITH_KDE_PATCHES=yes install
在使用 Ports 安装时,您可能会遇到有软件安装过其它类似的版本,结果就造成安装中断。这时候,您可以在 make 时,加上 「FORCE_PKG_REGISTER=y」,以强迫安装。
Step3:安装中文化字型
接着我们要让 KDE 支持中文的选单及讯息,我们必须先安装中文讯息文件 (i18n):# cd /usr/ports/chinese/kde3-i18n-zh_TW
# make install clean
接下来,我们要安装中文字型。XWindow 支持 TrueType 的字型,而在 MS Windows 上,我们常使用的细明体就是 TrueType 的字型。因此,您可以支接将「C:\WINDOWS\Fonts\mingliu.ttc」复制到 FreeBSD 的「/usr/X11R6/lib/X11/fonts/TrueType」目录中即可使用:# mkdir /usr/X11R6/lib/X11/fonts/TrueType
# cp mingliu.ttc /usr/X11R6/lib/X11/fonts/TrueType/
由于 mingliu.ttc 中实际上包含了二个字型:细明体及新细明体。KDE 在判断字型宽度及大小时有点问题,造成字型有点难看,所以,我们必须编辑 ~/.fonts.conf,并加入下列内容,以改善字型:
   
        MingLiU
        true
        true
        false
   
   
        MingLiU
        12
        false
        true
   
   
        MingLiU
        false
   
   
        MingLiU
        0
   
您可以在直接打开本书电子文件,并使用复制贴上的方式来编辑上列档案,以节省时间。
Step4:产生设定档
我们接着要执行 Xorg -configure 来产生设定档 XF86Config.new,然后将它搬到 /etc/X11/:# Xorg -configure
# cp /root/xorg.conf.new /etc/X11/xorg.conf
接着编辑 /etc/X11/xorg.conf,在 FontPath 区段最前面加入 TrueType 及 local 二个路径,以期使 X Window 能找到正确的字型路径:
Section "Files"
       RgbPath      "/usr/X11R6/lib/X11/rgb"
       ModulePath   "/usr/X11R6/lib/modules"
[b]       FontPath     "/usr/X11R6/lib/X11/fonts/TrueType/"
       FontPath     "/usr/X11R6/lib/X11/fonts/local/"[/b]
       FontPath     "/usr/X11R6/lib/X11/fonts/misc/"
       FontPath     "/usr/X11R6/lib/X11/fonts/TTF/"
       FontPath     "/usr/X11R6/lib/X11/fonts/Type1/"
       FontPath     "/usr/X11R6/lib/X11/fonts/CID/"
       FontPath     "/usr/X11R6/lib/X11/fonts/75dpi/"
       FontPath     "/usr/X11R6/lib/X11/fonts/100dpi/"
EndSection
如果您有滚轮鼠标,您可以在下列「InputDevice」区段中加入「ZAxisMapping "4 5"」,以支援滚轮:
Section "InputDevice"
       Identifier  "Mouse0"
       Driver      "mouse"
       Option      "Protocol" "auto"
       Option      "Device" "/dev/sysmouse"
[b]       Option      "ZAxisMapping" "4 5"[/b]
EndSection
接下来,我们来设定屏幕的分辨率等。请先找到 Section "Monitor" 的部份,并查看 Identifier 那行已经找到您所使用的屏幕。如果有,您可以不必设定水平及垂直更新频率。如果没有,请参考您的屏幕使用手册,并将 Horizsync(水平更新频率) 及 VerRefresh(垂直更新频率) 设定一个适合您的范围。
Section "Monitor"
        Identifier "Monitor0"
        VendorName "Monitor Vendor"
        ModelName "Monitor Model"
        Horizsync 30-70
        VertRefresh 50-100
接着要设定屏幕的分辨率,我希望以 16bit 色彩显示,1024x768 而且不要虚拟桌面。则请先找到 Section "Screen" 的部份:
Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        [b]DefaultColorDepth 16[/b]
        SubSection "Display"
                Viewport   0 0
                Depth     1
        EndSubSection
        .......略......
        SubSection "Display"
                ViewPort 0 0
                Depth 16
[b]                Modes "1024x768"
                Virtual 1024 768[/b]
        EndSubSection
我们加入了 DefaultColorDepth 16,表示内定以16 bit 的色彩显示。接着找到 Depth 16 的部份,加入了 Modes 及 Virtual。这二行表示可以用 1024x768 的分辨率、虚拟桌面为 1024x768。接着存档离开。
Step 5:进入 X Window
为了一进入 X Window 即有 KDE 要先编辑 ~/.xinitrc 加入下列二行:
#!/bin/sh -
export LANG=zh_TW.Big5  # 设定使用中文
exec /usr/local/bin/startkde
接着我们就可以执行 startx 来进入 X Window 了。如果您找不到 startx 的指令,请先执行来 rehash 更新指令,再执行一次 startx。
进入 X Window 后,画面会出现 KDE 的桌面设定选单,您只要依画面提示即可完成 KDE 的安装。设定完后,您就可以看到完整的 KDE 了:
图 11-3
[img]http://homepage.cqwu.net/wxfy/images/ch11_03.png[/img]
如果您在X Window中无法使用鼠标,请先同时按 [Ctrl] + [Alt] + [Backspace] 离开 X Windows,再执行 sysinstall 来设定鼠标。设定鼠标的位置在 [Configure]->[Mouse],先设定 [Type] 选择鼠标的类型,再选 [Enable] 让一开机即驱动鼠标。
进入 KDE 后,您可以在控制中心里调整字型,建议您先将所有字型调为细明体 (MingLiu)。如果您要调整字型,请按画面左下角的 K 图示,并选择「控制中心」,即出现下列画面:
图 11-4
[img]http://homepage.cqwu.net/wxfy/images/ch11_04.png[/img]
调整后,请重新启动 X Window。
在 KDE3 中有许多的附属软件,从简单的文字编辑器、绘图软件,到常用的办公室软件、浏览器及邮件软件都有。由于是图形接口,您可以自行摸索尝试。KDE 的浏览器是 Konqueror,它的使用接口和 IE 差不多,除了是网页浏览器外,也结合了档案总管的功能,下图即 Konqueror 的画面:
图 11-5
[img]http://homepage.cqwu.net/wxfy/images/ch11_05.png[/img]
您也许会发现 KDE 简直可以和MS Windows 抗衡,它的办公室软件功能齐全,不论是 KWord、KExcel、KPowerPoint 都是威力强大的软件。
图 11-6
[img]http://homepage.cqwu.net/wxfy/images/ch11_06.png[/img]

11.2 X Window下的中文软件
11.2.1 中文终端机
KDE 所附的终端机 Konsole 已经支持中文的显示,而且还有许多强大的功能。例如我们可以设定终端机背景、字型等,而且操作十分容易。只要您在 ~/.xinitrc 中有设定 LANG 为为 zh_TW.Big5 即可显示中文。
图 11.7
[img]http://homepage.cqwu.net/wxfy/images/ch11_07.png[/img]
11.2.2 中文输入
我们安装的 X Window 目前为止只能看到中文,但无法使用中文输入,如果要使用中文输入,必须安装 Xcin 这套软件。xcin 是 X Chinese Input 的缩写,这个软件提供许多输入法,例如注音、大易、仓颉、简易、酷音、行列等。他们的网址是
[url=http://xcin.linux.org.tw/]http://xcin.linux.org.tw[/url]
,您可以在这里获得更多信息。
xcin 采用标准的 XIM 协议,XIM 协议是 X Window 下中文输入的标准,只要支持 XIM 的软件,我们都可以使用 xcin 来输入中文。而在 KDE 中,除了 Konsole 外,其它常用的软件都支持 XIM 中文输入。
安装 xcin 十分容易,我们可以使用 Ports 来安装:# cd /usr/ports/chinese/xcin25
# make install
安装完 Xcin 后,我们还要修改 ~/.xinitrc 来加入中文输入法的设定,请使用文书编辑软件来编辑 ~/.xinitrc 这个档案:
#!/bin/sh -
export LANG=zh_TW.Big5  # 设定使用中文
[b]# 加入下列二行
export XMODIFIERS=@im=xcin
xcin2.5&
[/b]
# 启动 KDE
exec /usr/local/bin/startkde
修改完后存盘,接着进入 X Window 您将看到输入法的窗口,然后我们就可以执行支持其它软件来输入中文了。例如我们开启 Konsole 的窗口后,就可以使用 Ctrl+Space 来切换中英文输入法。其它像 Konqueror 或 Kword 下的中文输入也没问题,如下图。
图 11-8
[img]http://homepage.cqwu.net/wxfy/images/ch11_08.png[/img]
在输入法的切换方面,我们可以使用下列几个预设的热键来切换:
Ctrl+Space
中文 / 英文的切换
Ctrl+Shift
依序切换输入法 (正向切换)。
Shift+Ctrl
依序切换输入法 (反向切换)。
Ctrl+Alt+数字
选择输入法,数字部份由 1~8
预设的 XCIN 在输入中文时,输入法窗口不会在最上方,所以我们必须修改一下 XCIN 的设定档。设定文件的位置是 /usr/X11R6/etc/xcinrc,使用文书编辑软件打开后,找到 "OVERSPOT_WINDOW_ONLY" 的部份,并修改成 YES:
;  XIM Input Style Adjustments.
(define INPUT_STYLE            '(Root OverTheSpot))
(define OVERSPOT_USE_USRCOLOR   "YES")
(define OVERSPOT_USE_USRFONTSET "YES")
[b](define OVERSPOT_WINDOW_ONLY    "YES")[/b]
接着重新启动 X 窗口,当要输入中文时,只要以 Ctrl+Space 就可以打开输入法窗口。
在 X Window 中,有一些使用上的小技巧,例如您可以使用 Ctrl+Alt+Backspace 来强迫离开 X Window。如果您要使用鼠标在 Konsole 中来做复制贴上,你只要用鼠标选取所要复制的地方,就已完成复制的动作,接着再按 Shift+Insert 即可贴上。你可以发掘更多的小技巧喔。

逍遥 发表于 2006-6-5 15:17

第十二章 NAT 及防火墙
如果您家中有多台计算机需要同时上网,但却只有一个 IP 可以使用,这时 NAT 就派上用场了。NAT 可以让很多计算机经由一台 FreeBSD 服务器上网,而且还可以让 FreeBSD 的防火墙功能保护内部网络的计算机。本章将介绍以 FreeBSD 架设 NAT 服务器及使用 FreeBSD 防火墙功能。读完本章后,您将了解下列主题:
如何使用 FreeBSD 架设 NAT 服务器。
如何限制每一台计算机的最大上下传频宽。
如何架设防火墙。
如何架设具封包过滤功能的桥接器。
12.1 概论
这个部份我们将说明如何以 FreeBSD 做为防火墙,介绍 FreeBSD 内建的封包过滤功能。欲建立一台防火墙,就是要将一台机器放在二个网域的中间,并经由它来做封包过滤的工作。因此我们必须先确定网络封包能通过这台防火墙,再来设定要阻文件的规则。以 FreeBSD 作为二个网域中间的连接器,可以用路由器 (router)、网关、或是桥接器的方式来实作,再在该机器上设定防火墙的规则。当然,我们也可以只在一台单机上设定防火墙规则,以取代原本只能监控 inetd 服务的 TCP Wrapper。
我们举二种最常被应用结合防火墙设定来保护整个网络的方法,一个是 NAT,另一个是具封包过滤的桥接器。
12.1.1 NAT
所谓的 NAT 就是 (Network Address Translation),它可以让你在只有一个 IP 的情形下让多台计算机一起连上网络。举个实例而言,一个公司有三十台计算机,而 ISP 所提供的 ADSL 却只有八个实体 IP,这种情况下,我们可以将每台计算机的 IP 设定为 private IP,再让它们经由一台有实体 IP 的 NAT 服务器连上网络即可。
Private IP 是 RFC 所定义的私人 IP,这些 IP 不能够直接在因特网中出现,所以必需经由 NAT 的转换,将它们伪装成是由 NAT 服务器连向外部网络。这些可以用的私人 IP 如下:
Class
范围
子网掩码
Class A
10.0.0.0 ~ 10.255.255.255
255.0.0.0
Class B
172.16.0.0 ~ 172.31.255.255
255.255.0.0
Class C
192.168.0.0 ~ 192.168.255.255
255.255.255.0
我们只需在 NAT 服务器中做好设定,再将其它使用 private IP 的计算机设定 gateway 为该服务器的 IP 即可。另外,我们也可以在服务器中设定一些防火墙的规则,来保全内部网络。
12.1.2 具封包过滤的桥接器
如果我们的网络中有多台不同网域的计算机,这些计算机都有它们的 IP 及网络设定,我们可以将 FreeBSD 设定成为桥接器 (bridge),让这台桥接器作封包过滤的工作。这种做法对于网域内其它计算机原本的网络设定不会有影响,如果没有设定任何防火墙规则,对它们而言几乎不会发现桥接器的存在。我们可以使用桥接器来过滤同一个网域内的网络交通,如果您有一个很大的网域,想要降低同一网域内彼此网络封包的交互影响,却又不想将这个大网域分割成数个小网域,您可以使用具封包过滤功能的桥接器来达成网络封包分割的功能。我们也可以使用路由器来取代桥接器,但是路由器只能遶送二个不同网域,而且设定比较复杂,因此,我会使用桥接器来做为防火墙。
FreeBSD 内建有 ipfw 这个程序可以让我们轻易的设定一个简单的防火墙,我们只要在 kernel 中加上一些设定就可以打开它。在这里我们也将简单的介绍一些防火墙的语法,让我们可以保护我们不想、不需要被外界使用的网络服务。
在设定防火墙之前,有个观念必须先厘清。防火墙并不能够完全保护我们的网络安全,防火墙只是限制我们不想公开的服务、限制已知的 IP。就算架了防火墙,没有适当的管理也是枉然。
12.2 NAT
这里我们假设使用二张网络卡,一张是对外的网卡,代号是 fxp0;另一张是对内的网卡,代号 fxp1。以下的设定中请依您的网卡代号来加以修改。当然,你也可以只使用一张网络卡,将所有的计算机及对外网络都接在一台 HUB 上,再利用 alias 的功能将一张网卡设定二个 IP。在开始前,请先参考「网络设定」一章中的说明设定好第一张对外的网络卡喔。
在开始设定之前,请先检查一下内部网络的配置是否正确。我们内部网络的线路应该如图 12-1 所示。
图 12-1
[img]http://homepage.cqwu.net/wxfy/images/ch12_01.gif[/img]
上图中,内部网络的计算机全部都接到同一个 HUB 中,而 FreeBSD 有二个网络卡,对内的网络卡 fxp1 接在内部的 HUB 上,而对外的网络卡直接接在 ADSL Modem 或是对外的 HUB 上。上图的网络配置只是一个建议,您也可以将 fxp0、fxp1、及 ADSL Modem 全部接在内部的 HUB 上,只是这样 FreeBSD 就没有真正的隔离内外部网络了。
12.2.1 设定 kernel
首先,我们必须先确定核心有支持 NAT 及防火墙功能。FreeBSD 预设的 GENERIC 核心并未加入此功能,因此,请先编辑您的核心设定档,加入下列设定,并重新编译核心。如果您不知道如何修改核心设定,请参考「编译核心」一章的说明。假设我们要修改的核心设定档为 /usr/src/sys/i386/conf/GENERIC,先 cd /usr/src/sys/i386/conf/,再 ee GENERIC 加入下列几行:
# 防火墙
options IPFIREWALL
# 支援 NAT
options IPDIVERT
# 下面这一行是预设允许所有封包通过,如果没有这一行,
# 就必须在 /etc/rc.firewall 中设定封包的规则。
# 这条规则内定编号是 65535,也就是所有规则的最后一条
# 如果没有加这一条规则,内定就是拒绝所有封包,
# 只允许规则中允许的封包通过。
options IPFIREWALL_DEFAULT_TO_ACCEPT
# 这一行是让你可以在 ipfw 中设定要记录哪些封包,
# 如果没有这一行,就算设定了要留下记录也不会有作用。
options IPFIREWALL_VERBOSE
# 这一行是限制每一条规则所要记录的封包数量,
# 因为同样的规则可能有许多记录,加上这一条可以使
# 同样的记录重复数减少,以避免记录文件爆增。
options IPFIREWALL_VERBOSE_LIMIT=10
# 下面这一行是用来支援封包转向,
# 当你要使用 fwd 动作时必须要有这一项设定。
options IPFIREWALL_FORWARD
# 如果要使用 pipe 来限制频宽,必须加入下列选项以支持 dummynet。
options DUMMYNET
我们在上述设定中加入了许多项目,基本上,一定要有的项目为 IPFIREWALL 及 IPDIVERT,其它项目是为了支持限制频宽或记录信息使用。编辑完核心设定后,请重新编译并安装新的核心,重开机之后核心就己经支持防火墙及 NAT 了。
12.2.2 设定 rc.conf
请先参考「网络设定」一章,设定好您的第一张网络卡,并确定可以上网后,才开始下列设定。我们要修改 /etc/rc.conf 以启动 NAT 功能。我们假设网络卡代号是 fxp0 及 fxp1,请自行变更成您的网络卡代号:
# 设定第二张网络卡的 IP。
ifconfig_fxp1="inet 192.168.0.1  netmask 255.255.255.0"
# 设定启用 gateway 的功能。
gateway_enable="YES"
# 设定启用防火墙功能,并设定防火墙类型为 OPEN。
# FreeBSD 的防火墙设定档会自动为 NAT 加入相关的设定。
firewall_enable="YES"
firewall_type="OPEN"
# 设定 NAT 所使用的对外网络卡
natd_interface="fxp0"
natd_enable="YES"
设定结束之后,重开机应该就可以设定其它计算机使用这台 NAT 服务器来连上网络了。
12.2.3 设定 rc.firewall
我们在 /etc/rc.conf 中设定 firewall_type="OPEN",如果是使用原本 /etc/rc.firewall 的话,这样就已经就已经驱动了 NAT 的功能。
如果您想要加上更多的防火墙规则,可以编辑 /etc/rc.firewall ,并在档案最后加上您的设定。例如,我们要设定每一个内部计算机 (192.168.0.0/16) 最多只能使用的上传频宽为 64 Kb/s,下传频宽为 256 Kb/s,则可以在 rc.firewall 中加入下列设定:
# 限制频宽
/sbin/ipfw pipe 20 config bw 64Kbits/s
/sbin/ipfw pipe 21 config bw 256Kbits/s
/sbin/ipfw add pipe 20 ip from 192.168.0.0/16 to any
/sbin/ipfw add pipe 21 ip from any to 192.168.0.0/16
修改完后,执行 sh /etc/rc.firewall 就可以更新防火墙的设定了。其它关于防火墙规则的详细说明,请 man ipfw 或参考下一节的说明。
12.2.4 client 端的设定
在内部其它计算机方面,我们必须要再做一些设定才能让它们经由 FreeBSD 上网。首先,你的网络架构应该如图 12-1 所示。
而内部的其它的计算机设定方面,我们必须将其它计算机的 IP 设定为和 FreeBSD 服务器同一个子网络。以上列设定为例,您必须将其它计算机的 IP 设为 192.168.0.X (除了 192.168.0.1 以外的其它 IP)、子网掩码是 255.255.255.0,gateway 设定为 FreeBSD 连到局域网络的网络卡 IP,在此范例中是 192.168.0.1。然后再设定你的 DNS 为你 ISP 的 DNS 即可。
完成上述的设定后,我们就能享受以 FreeBSD 为NAT上网了。
如果您的其它计算机还是无法上网,您可以依下列步骤除错:
从 FreeBSD ping 因特网上的 IP,看看 FreeBSD 连到因特网是否正常。如果 ping 不到,表示 FreeBSD 对外网络设定有误。
从内部其它计算机 ping FreeBSD 对内的 IP。如果 ping 不到,请检查二方的 IP 及子网络设定是否正确,或是防火墙是否设定无误。
从内部计算机 ping 因特网上的 IP,如果 ping 不到,可能是 NAT 的设定有误。
12.2.5 NAT Port Forwarding
NAT 还有一个功能叫作 Port Forwarding,它的用途在于从连到本机的封包导向到别的计算机或本机其它连接埠。例如,我们对外有一台防火墙,在 DNS 设定方面,我们设定了 ftp.mydomain.com 及 [url]www.mydomain.com[/url] 都指向这台防火墙。但我们希望所有 HTTP 联机都重新导向到内部的 192.168.0.2 这台机器上,而所有 FTP 联机都交由 192.168.0.3 来处理。这时候我们就可以使用 port forwarding 的方式来达成。
首先,我们知道 HTTP 使用 TCP 协议 port 80,而 FTP 使用了 TCP 协议 port 20 及 port 21,接着我们就可以在 /etc 目录下新增一个 NAT 的设定档,名为 natd.conf,并编辑内容如下:
redirect_port tcp 192.168.0.2:80 80
redirect_port tcp 192.168.0.3:20 20
redirect_port tcp 192.168.0.3:21 21
第一行的目的就是将 port 80 的 tcp 联机重新导向到 192.168.0.2 的 port 80,而二、三行是将 port 20 及 port 21 的联机交由 192.168.0.3 来处理。在 192.168.0.2 及 192.168.0.3 这二台机器上,我们只要设定它们的 gateway 为防火墙的 IP,例如 192.168.0.1 即可。
接下来我们必须在 /etc/rc.conf 中加入下列这一行,让 natd 在启动时能读取 /etc/natd.conf 的设定:
natd_flags="-f /etc/natd.conf"
重新启动后,您就可以进行测试了。假设防火墙的对外 IP 是 11.22.33.44,当我们从外部网络使用 HTTP 联机到该 IP 时,虽然该服务器并未架设 HTTP server,但你却可以看到网页,表示网络封包有被重导至内部的另一台服务器。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
Port Forwarding 的功能是将外部联机转向到内部的计算机。所以,如果您从内部计算机连到 NAT 服务器时,并不会被转向到内部 IP 喔。
12.3 防火墙
ipfw 是 FreeBSD 内建的防火墙指令,我们可以用它来管理进出的网络交通。如果防火墙服务器是扮演着路由器 (gateway 例如上一篇中的 NAT 服务器) 的角色,则进出的封包会被 ipfw 处理二次,而如果防火墙扮演的是桥接器 (bridge) 的角色,则封包只会被处理一次。这个观念关系着我们以下所要介绍的语法,有的语法并不适用于桥接器。
另外,我们在设定防火墙时有二种模式,一种模式是预设拒绝所有联机,再一条一条加入允许的联机;另一种是预设接受所有联机,加入几条拒绝的规则。如果是非常强调安全性,应该是使用预设拒绝所有联机,再一条一条加入我们允许的规则。
我们会将 firewall 的设定写在 /etc/rc.firewall 中,每一条设定都是以先入为主 (first match wins) 的方式来呈现,也就是先符合的规则 (rules) 为优先。所有进出的封包都会被这些规则过滤,因此我们会尽量减少规则的数量,以加速处理的速度。
在 kernel 中,关于防火墙的设定有下列几条:
# 防火墙
options IPFIREWALL
# 支援 NAT
options IPDIVERT
# 下面这一行是预设允许所有封包通过,如果没有这一行,
# 就必须在 /etc/rc.firewall 中设定封包的规则。
# 这条规则内定编号是 65535,也就是所有规则的最后一条
# 如果没有加这一条规则,内定就是拒绝所有封包,
# 只允许规则中允许的封包通过。
options IPFIREWALL_DEFAULT_TO_ACCEPT
# 这一行是让你可以在 ipfw 中设定要记录哪些封包,
# 如果没有这一行,就算设定了要留下记录也不会有作用。
options IPFIREWALL_VERBOSE
# 这一行是限制每一条规则所要记录的封包数量,
# 因为同样的规则可能有许多记录,加上这一条可以使
# 同样的记录重复数减少,以避免记录文件爆增。
options IPFIREWALL_VERBOSE_LIMIT=10
# 下面这一行是用来支援封包转向,
# 当你要使用 fwd 动作时必须要有这一项设定。
options IPFIREWALL_FORWARD
# 如果要使用 pipe 来限制频宽,必须加入下列选项以支持 dummynet。
options DUMMYNET
ipfw 也支持状态维持 (keep-state) 的功能,就是可以让符合设定的规则以动态的方式来分配增加规则 (地址或连接端口) 来让封包通过。也就是说防火墙可以记住一个外流的封包所使用的地址及连接端口,并在接下来的几分钟内允许外界响应。这种动态分配的规则有时间的限制,一段时间内会检查联机状态,并清除记录。
所有的规则都有计数器记录封包的数量、位数、记录的数量及时间等。而这些记录可以用 ipfw 指令来显示或清除。
在说明 ipfw 规则的语法之前,我们先来看这个指令的用法。ipfw 可以使用参数:
[b]指令[/b]
[b]说明[/b]
ipfw add [rule]
新增一条规则。规则 (rule) 的语法请参考下一节的说明。
ipfw delete [number]
删除一条编号为 number 的规则。
ipfw -f flush
清除所有的规则。
ipfw zero
将计数统计归零。
ipfw list
列出现在所有规则,可以配合下列参数使用。
-a
使用 list 时,可以列出封包统计的数目。
-f
不要提出确认的询问。
-q
当新增 (add)、归零(zero)、或清除 (flush) 时,不要列出任何回应。当使用远程登入,以 script (如 sh /etc/rc.firewall) 来修改防火墙规则时,内定会列出你修改的规则。但是当下了 flush 之后,会立即关掉所有联机,这时候响应的讯息无法传达终端机,而规则也将不被继续执行。此时唯一的方法就是回到该计算机前重新执行了。在修改防火墙规则时,最好在计算机前修改,以免因为一个小错误而使网络联机中断。
-t
当使用 list 时,列出最后一个符合的时间。
-N
在输出时尝试解析 IP 地址及服务的名称。
-s [field]
当列出规则时,依哪一个计数器 (封包的数量、位数、记录的数量及时间) 来排序。
12.3.1 ipfw 规则
我们在过滤封包时,可以依据下列的几个封包所包含的信息来处理该封包:
接收或传送的接口,可以使用接口名称或地址。
方向,流入或流出。
来源或目的地的 IP 地址,也可以加上子网掩码。
通讯协议,TCP,UDP,ICMP 等。
TCP flags。
IP fragment flag。
IP options。
ICMP 的类型。
和封包相关的 socket User/group ID。
使用 IP 地址或 TCP/UDP 的端口号来做为规则可能蛮危险的,因为这二种都有可能被以假的信息所蒙骗 (spoof)。但是这二种却也是最常被使用的方法。
下列为 ipfw rules 的语法:[number] action [log] proto from src to dist [interface_spec] [option]
使用 [ ] 包起来的表示可有可无,我们一一为大家说明它们的意义:
number:
number 是一个数字,用来定义规则的顺序,因为规则是以先入为主的方式处理,如果你将规则设定放在一个档案中 ( 如 /etc/rc.firewall ),规则会依每一行排列的顺序自动分配编号。你也可以在规则中加上编号,这样就不需要按顺序排列了。如果是在命令列中下 ipfw 指令来新增规则的话,也要指定编号,这样才能让规则依我们的喜好排列,否则就会以指令的先后顺序来排。这个编号不要重复,否则结果可能不是你想要的样子。
action:
action 表示我们这条规则所要做的事,可以用的 action 有下列几个:
[b]命令[/b]
[b]意义[/b]
allow
允许的规则,符合则通过。也可以使用 pass,permit, accept 等别名。
deny
拒绝通过的规则。
reject
拒绝通过的规则,符合规则的封包将被丢弃并传回一个 host unreachable 的 ICMP。
count
更新所有符合规则的计数器。
check-state
检查封包是否符合动态规则,如果符合则停止比对。若没有 check-state 这条规则,动态规则将被第一个 keep-state 的规则所检查。
divert port
将符合 divert sock 的封包转向到指定的 port。
fwd ipaddr[,port]
将符合规则封包的去向转向到 ipaddr,ipaddr 可以是 IP 地址或是 hostname。如果设定的 ipaddr 不是直接可以到达的地址,则会依本机即有的 routing table 来将封包送出。如果该地址是本地地址 (local address),则保留本地地址并将封包送原本指定的 IP 地址。这项设定通常用来和 transparent proxy 搭配使用。例如: # ipfw add 50000 fwd 127.0.0.1,3128 tcp from \
  192.168.1.0/24 to any 80
如果没有设定 port ,则会依来源封包的 port 将封包送到指定的 IP。使用这项规则时,必须在 kernel 中设定选项 IPFIREWALL_FORWARD。
pipe pipe_nr
传递封包给 dummynet(4) "pipe",用以限制频宽。使用本语法必须先在核心中加入 option DUMMYNET。请 man ipfw 及 man dummynet。
基本语法是先将要设定频宽的规则加入: ipfw add pipe pipe_nr ....
再设定该规则的频宽:ipfw pipe pipe_nr config bw B delay D queue Q plr P
这里的 pipe_nr 指的是 pipe 规则编号,从 1~65535;B 是指频宽,可以表示为 bit/s、Kbit/s、Mbit/s、Bytes/s、KBytes/s、或 MBytes/s。D 是延迟多少 milliseconds (1/1000)。Q 是 queue size 的大小 (单位为 packages 或 Bytes)。P 是要随机丢弃的封包数量。
例如我们要限制内部网域的计算机对外上传的最大频宽是 20 KBytes:ipfw add pipe 1 ip from 192.168.0.1/24 to any in
ipfw pipe 1 config bw 20KBytes/s
log:
如果该规则有加上 log 这个关键词,则会将符合规则的封包记录在 /var/log/security 中。前提是在核心中有设定 IPFIREWALL_VERBOSE 的选项。有时因为同样的封包太多,会使记录文件保有大量相同的记录,因此我们会在核心中再设定 IPFIREWALL_VERBOSE_LIMIT 这个选项,来限制要记录多少相同的封包。
proto:
proto 表示 protocol,即网络协议的名称,如果使用 ip 或 all 表示所有协议。可以使用的选项有 ip,all,tcp,udp,icmp 等。
src 及 dist:
src 是封包来源;dist 是封包目的地。在这二个项目可以用的关键词有 any, me, 或是以 [ports] 的方式明确指定地址及端口号。
若使用关键词 any 表示使这条规则符合所有 ip 地址。若使用关键词 me 则代表所有在本系统接口的 IP 地址。而使用明确指定地址的方式有下列三种:
IP 地址,指定一个 IP,如 168.20.33.45。
IP/bits,如 1.2.3.4/24,表示所有从 1.2.3.0 到 1.2.3.255 的 IP 都符合规则。
IP:mask,由 IP 加上子网掩码,如 1.2.3.4:255.255.240.0 表示从 1.2.0.0 到 1.2.15.255 都符合。
而在 me, any 及 指定的 ip 之后还可以再加上连接埠编号 (ports),指定 port 的方法可以是直接写出 port ,如 23;或给定一个范围,如 23-80;或是指定数个 ports,如 23,21,80 以逗点隔开。或者是写出在 /etc/services 中所定义的名称,如 ftp,在 services 中定义是 21,因此写 ftp 则代表 port 21。
interface-spec:
interface-spec 表示我们所要指定的网络接口及流入或流出的网络封包。我们可以使用下列几个关键词的结合:
[b]关键词[/b]
[b]意义[/b]
in
只符合流入的封包。
out
只符合流出的封包。
via ifX
封包一定要经过接口 ifX,if 为接口的代号,X 为编号,如 vr0。
via if*
表示封包一定要经过接口 ifX,if 为接口的代号,而 * 则是任何编号,如 vr* 代表 vr0,vr1,...。
via any
表示经过任何界面的封包。
via ipno
表示经过 IP 为 ipno 界面的封包。
via 会使接口永远都会被检查,如果用另一个关键词 recv ,则表示只检查接收的封包,而 xmit 则是送出的封包。这二个选项有时也很有用,例如要限制进出的接口不同时:ipfw add 100 deny ip from any to any out recv vr0 xmit ed1
recv 接口可以检查流入或流出的封包,而 xmit 接口只能检查流出的封包。所以在上面这里一定要用 out 而不能用 in,只要有使用 xmit 就一定要使用 out。另外,如果 via 和 recv 或 xmit 一起使用是没有效的。
有的封包可能没有接收或传送的接口:例如原本就由本机所送出的封包没有接收接口,而目的是本机的封包也没有传送界面。
options:
我们再列出一些常用的 option 选项 ,更多选项请 man ipfw:
[b]选项名称[/b]
[b]意义[/b]
keep-state
当符合规则时,ipfw 会建立一个动态规则,内定是让符合规则的来源及目的地使用相同的协议时就让封包通过。这个规则有一定的生存期限 (lift time,由 sysctl 中的变量所控制),每当有新的封包符合规则时,便用重设生存期限。
bridged
只符合 bridged 的封包。
established
只适用于 TCP 封包,当封包中有 RST 或 ACK bits 时就符合。
uid xxx
当使用者 uid 为 xxx 则符合该规则。例如,我们如果要限制 Anonymous FTP 的下载速度最大为 64KB/s,则可以使用:ipfw pipe 1 config bw 512Kbit/s
ipfw add pipe 1 tcp from me to any uid 21
上列规则第一行是先建一个编号为 1 的 pipe,限制频宽为 512 Kbit/s (也就是 64 KByte/s),接着第二条是当使用者 uid 为 21 时,从本机 (me) 下载的 tcp 封包都使用编号 1 的 pipe。因为 Anonymous FTP 的使用者是 ftp,它的预设 uid 为 21,所以这条规则会被套用在 Anonymous FTP user 上。
setup
只适用于 TCP 封包,当封包中有 SYN bits 时就符合。
以上的说明只是 man ipfw 中的一小部份。如果你想要对 ipfw 更了解,例如如何使用 ipfw 来限制频宽等,建议你 man ipfw。
不知道您看了这么多的规则是否觉得眼花撩乱,如果不了解 TCP/IP 的原理,彻底了解 ipfw 的设定还真不容易。没关系,我们下面将举几个简单、常用的设定,这些范例应该够平常使用了。
12.3.2 范例
我将原本的 /etc/rc.firewall 备份成 rc.firewal.old,并将它改成下列内容,请注意,这里只是范例,只供参考:
# 设定我的 IP
myip="1.2.3.4"
# 设定对外的网络卡代号
outif="vr0"
# 设定对内的网络上代号
inif="vr1"
#清除所有的规则
/sbin/ipfw -f flush
# Throw away RFC 1918 networks
${ipfw} add deny ip from 10.0.0.0/8 to any in via ${oif}
${ipfw} add deny ip from 172.16.0.0/12 to any in via ${oif}
${ipfw} add deny ip from 192.168.0.0/16 to any in via ${oif}
# 只允许内部网络对 192.168.0.1 使用 telnet 服务
/sbin/ipfw add 200 allow tcp from 192.168.0.1/24 to 192.168.0.1 telnet
# 拒绝其它人连到 port 23,并记录尝试联机的机器
/sbin/ipfw add 300 deny log tcp from any to me 23
# 拒绝任何 ICMP 封包
/sbin/ipfw add 400 deny icmp from any to any
# 下面这台机器是坏人,不让它进来,并记录下来
/sbin/ipfw add 1100 deny log all from 211.21.104.102 to any
# NAT 的设定
/sbin/ipfw add divert natd all from any to any via vr0
# 限制内部网域对外下载最大频宽为 20KBytes/s,上传最大频宽为 5KBytes/s
ipfw pipe 20 config bw 20KBytes/s
ipfw add pipe 20 ip from any to 192.168.0.1/24 out
ipfw pipe 30 config bw 5KBytes/s
ipfw add pipe 30 ip from 192.168.0.1/24 to any in
# 允许本机对任何地方联机
/sbin/ipfw add check-state
/sbin/ipfw add 2000 allow udp from ${myip} to any keep-state
/sbin/ipfw add 2100 pass ip from ${myip}  to any
# 允许外界使用邮件服务
/sbin/ipfw add 3000 pass tcp from any to ${myip} 25 in via ${outif}
# 不允许内部的 IP 从外部连进来
/sbin/ipfw add 1200 add deny ip from ${myip}/24 to any in via ${oif}
# 其它都拒绝,如果没有在 kernel 中设定
# IPFIREWALL_DEFAULT_TO_ACCEPT 则内定就有下列这一条
/sbin/ipfw 65535 add deny all from any to any
存盘后就可以使用 sh rc.firewall 来执行新的规则了。如果您将规则放在 /etc/rc.firewall 中,则开机时会自动执行。
12.3.3 一些小建议
在建立一个封包过滤的防火墙时,应该尽可能阻挡一些不必要的服务。避免开放 port 1024 以下的 TCP 服务,例如只通过 SMTP 封包 (port 25) 给邮件服务器;拒绝所有 UDP 联机 (只有少部份服务如 NFS 会用到);一些只有内部才会使用的服务,如数据库等也不必对外开放。
另外,同样的防火墙限制可以使用不同的语法来展现,应该要试着让规则数量越少越好,以加快处理速度。
在更新 firewall 规则时,如果规则没有写好,而你又是以远程登入的方式修改规则,很可能会因此无法继续登入。因此建议更新规则时最好在 console 前执行,若迫不得已一定要使用远程登入,建议您执行 /usr/share/examples/ipfw/change_rules.sh 这支程序来编辑规则:# cd /usr/share/examples/ipfw
# sh change_rules.sh
接着会出现文书编辑软件并最动加载 /etc/rc.firewall 让你编辑,结束离开后,会询问是否要执行更新。如果执行新的规则后造成断线,它会自动加载旧的规则,让我们可以再次联机。
12.4 封包过滤桥接器
如果您有三台机器全部都有 public IP,而您想使用其中一台做为防火墙,在不改变另外二台机器的设定下,我们可以使具封包过滤的桥接器来架设防火墙。只要将这台桥接器放在另外二台和对外网络之间即可。
另外,当我们的内部网络有不同 class 的主机时,例如内部有 140.115.2.3 及 140.115.5.6 这二台计算机时,就无法使用传统的防火墙。如果要在这二台机器连到因特网中途中使用防火墙,我们必须使用新的方式,也可以使用这里介绍的桥接器。
我们可以使用 FreeBSD 为桥接器,利用它来做封包过滤的动作,而丝毫不影响内部的主机原本的设定。为了达到这个功能,我们必需要有二张支持 promiscuous mode 的网络卡,现在的网络卡大部份都有支持。二张网络卡当中,一张需要设定 IP,另一张不需要。至于您要将 IP 设定在哪一张卡都可以,建议是设在对外的网络卡上。
首先,我们必须在核心中加入关于桥接器的设定:
# 支援桥接器
options BRIDGE
# 防火墙设定
options IPFIREWALL
options IPFIREWALL_VERBOSE
# 我们这里不将防火墙预设为接收所有封包
#options IPFIREWALL_DEFAULT_TO_ACCEPT
如果您要让桥接器具有流量控制的功能,则可以加上之前提到的选项「options DUMMYNET」。重新编译核心后,在重开机前,我们先设定一下 /etc/rc.conf:
firewall_enable="YES"
firewall_type="open"
还有一件事要做,当在以太网络上跑 IP 协议时,事实上使用二种以太网络协议,一个是 IP,另一个是 ARP。ARP 协定是当机器要找出给定 IP 地址所对应的以太网络地址时使用的。ARP 并不是 IP 层的一部份,只是给 IP 应用在以太网络上运作。标准的防火墙规则中并未加入对于 ARP 的支持,幸运的是,高手们的在 ipfirewall 程序代码中加入了对封包过滤桥接器的支持。如果我们在 IP 地址 0.0.0.0 上建立一个特别的 UDP 规则,UDP 端口的号码将被使用来搭配被桥接封包的以太网络协议号码,如此一来,我们的桥接器就可以被设定成传递或拒绝非 IP 的协议。请在 /etc/rc.firewall 中接近文件顶端处理 lo0 的那三行之下(就是有写 Only in rare cases do you want to change these rules 的地方)加入下面一行:
${fwcmd} add allow udp from 0.0.0.0 2054 to 0.0.0.0
现在我们就可以重新开机了。重开机之后,先执行下列指令来启动桥接器:
如果您使用的是 FreeBSD 4.x:# sysctl -w net.link.ether.bridge_ipfw=1
# sysctl -w net.link.ether.bridge=1
如果您使用的是 FreeBSD 5.x:# sysctl -w net.link.ether.bridge.ipfw=1
# sysctl -w net.link.ether.bridge.enable=1
现在我们可以将机器放在内外二个网域之间了。因为我们之前在 /etc/rc.conf 中,设定防火墙完全打开,不阻挡任何封包,所以放在二个网域之间时,运作应该没有问题。我们之前只设了一张网络上的 IP,而在执行了上述的指令之后,第二张网络卡便开始运作。
下一步就是将我们启动桥接器的指令放在 /etc/rc.local 中,让系统在开机时自动执行。或者,我们可以在 /etc/sysctl.conf 中加入下面二行:
# 如果您使用的是 FreeBSD 4.x
net.link.ether.bridge_ipfw=1
net.link.ether.bridge=1
# 如果您使用的是 FreeBSD 5.2 以后的版本
net.link.ether.bridge.enable=1
net.link.ether.bridge.ipfw=1
接下来我们就可以依自己的需求在 /etc/rc.firewall 文件的最后面加上我们自己想要的防火墙规则了。以下是一个简单的设定规则,假设桥接器的 IP 是 140.115.75.137,内部有二台主机,一台提供网页服务,一台是 BBS:
us_ip=140.115.75.137
basrv_ip=140.115.3.4
bbs_ip=140.115.5.6
oif=fxp0
iif=fxp1
ipfw="/sbin/ipfw"
# Things that we've kept state on before get to go through in a hurry.
${ipfw} 1000 add check-state
# Throw away RFC 1918 networks
${ipfw} 1100 add deny ip from 10.0.0.0/8 to any in via ${oif}
${ipfw} 1200 add deny log ip from 172.16.0.0/12 to any in via ${oif}
${ipfw} 1300 add deny log ip from 192.68.0.0/16 to any in via ${oif}
# 允许桥接器本身所有想做的联机 (keep state if UDP)
${ipfw} 1400 add pass udp from ${us_ip} to any keep-state
${ipfw} 1500 add pass ip from ${us_ip} to any
# 允许内部网络任何想做的联机 (keep state if UDP)
${ipfw} 1600 add pass udp from any to any in via ${iif} keep-state
${ipfw} 1700 add pass ip from any to any in via ${iif}
# 允许任何的 ICMP 联机
${ipfw} 1800 add pass icmp from any to any
# 不允许使用 port 888 联机
${ipfw} 2000 add deny log tcp from any to ${bbs_ip} 888
# TCP section
# 任何地方都可以建立 TCP 联机
${ipfw} 3000 add pass tcp from any to any via ${oif}
# Pass the "quarantine" range.
${ipfw} 3100 add pass tcp from any to any 49152-65535 in via ${oif}
# Pass ident probes. It's better than waiting for them to timeout
${ipfw} 3200 add pass tcp from any to any 113 in via ${oif}
# Pass SSH.
${ipfw} 3300 add pass tcp from any to any 22 in via ${oif}
# Pass DNS. 当内部网络有名称服务器时才需要
#${ipfw} add pass tcp from any to any 53 in via ${oif}
# 只传递 SMTP 给邮件服务器
${ipfw} 3400 add pass tcp from any to ${bbs_ip} 25 in via ${oif}
${ipfw} 3500 add pass tcp from any to ${basrv_ip} 25 in via ${oif}
# UDP section
# Pass the "quarantine" range.
${ipfw} 4000 add pass udp from any to any 49152-65535 in via ${oif}
# Pass DNS. 当内部网络有名称服务器时才需要
#${ipfw} 4100 add pass udp from any to any 53 in via ${oif}
# 其它的都拒绝
${ipfw} 60000 add deny ip from any to any

逍遥 发表于 2006-6-5 15:18

第十三章 网页服务器
我们最常使用的网络应用莫过于网页服务器了, 这里我们将介绍如何安装一个功能完整的网页服务器。读完本章后,您可以了解下列网页服务器的管理项目:
如何安装 Apache+PHP+MySQL+PostgreSQL。
如何设定 Apache 及 PHP。
如何查看网页服务器的使用状态。
测试服务器效能。
经由记录文件分析网页使用情形。
13.1 概论
Apache 是 UNIX 系统中普遍使用的网页服务器软件。根据  Netcraft 的统计 (
[url=http://news.netcraft.com/archives/web_server_survey.html]http://news.netcraft.com/archives/web_server_survey.html[/url]
),目前因特网中,有超过百分之六十的服务器是使用 Apache 来提供网页浏览的服务。Apache 可以说是目前世界上使用人数最多的网页服务器软件,它不仅可以在 FreeBSD、UNIX、Linux 中运行,也可以安装在 Windows 操作系统中。
Apache 和 FreeBSD 一样,在软件版本上也有多个分支,目前较稳定的版本有 1.3.33 及 2.0.x。Apache 1.3 系列开发已久,已经十分稳定了,不会再有重大的修改。而 Apache 2 系列是一个开发较活跃的版本,它和 1.3 最大的不同在于多执行绪 (multithreaded) 的支援。目前 Apache 2.0.x 是最主要的稳定版本,而 2.1.x 则还处于开发中的状态。笔者建议您使用 Apache 2.0 来做为您的网页服务器。
Apache 之所以风行的原因,除了免费、历史悠久、稳定外,它提供了弹性化的接口,可以让我们依需求加入各种模块,以提供更强大的功能。例如,我们可以在网页服务器上加入 PHP,以支持更多的网页应用。PHP 是一个用来写网页程序的软件,就像 ASP、JAVA servlet、CGI 等等有类似的用途,我们可以使用 PHP 建立留言版、电子相簿、购物车等应用。PHP 十分容易学习,程序代码也很简洁,速度更是没话说。如果你有些微的程序语言基础,不出二个礼拜,你就能对 PHP 有十足的认识,并且可以自己写出留言版、权限控制等简单的程序。
如果要使用 PHP,那你一定也要使用一套数据库系统做为程序后端的数据储存。在众多免费的数据库软件中,最有名的应该是 MySQL 和 PostgreSQL 了。不论是 MySQL 或 PostgreSQL,它们的功能及速度都令人赞赏。使用 PHP 加上数据库软件,你可以制作出网页的各式数据库,如会员管理、产品数据库等等。总之,我十分建议使用 Apache+PHP+数据库的组合,就算目前不会用到,不久的将来也会使用它们的功能。全部一股脑的装起来,省得日后麻烦。
目前 PHP 一样有二个主要的版本分支:4.x 及 5.x,4.4.0 是目前 4.x 的最新版本,而 5.0.x 则是 5.x 中的稳定版。我们将介绍如何使用 PHP 5.0 及数据库。
13.2 安装及设定 Apache
13.2.1使用 ports 安装
使用 FreeBSD port 安装 Apache  十分容易,我们只要使用下列指令即可完成安装:# cd /usr/ports/www/apache2
# make install clean
我们已经完成了最基本的 Apache 服务器安装,如果您不需要支持 PHP 及数据库,可以跳过下列步骤。
安装 PHP# cd /usr/ports/www/mod_php5
# make install clean
执行了上述指令后,会出现一个窗口让您选择进阶设定,请记得选取 APACHE2,如下图所示:
图 13-1
[img]http://homepage.cqwu.net/wxfy/images/ch13_01.png[/img]
接下来我们必须安装一些常用的 PHP 模块,请执行下列指令:# cd /usr/ports/lang/php5-extensions
# make install clean
执行了 make install 后,会出现一个选单,除了预设的项目外,我们必须再选择下列几个常用的项目:CTYPE、EXIF、GD、ICONV、IMAP、PCRE、SESSION、ZLIB。这些项目非常常用,尤其是 SESSION。
安装完 PHP 后,我们将下来要安装数据库,您可以选择安装 MySQL 或 PostgreSQL,或者干脆二者都安装,以利日后使用不同的数据库应用。
安装 MySQL# cd /usr/ports/databases/mysql41-server
# make WITH_CHARSET=big5 WITH_XCHARSET=all install clean
# cd /usr/ports/databases/php5-mysql
# make install clean
安装 PostgreSQL# cd /usr/ports/databases/postgresql80-server
# make install clean
# cd /usr/ports/databases/php5-pgsql
# make install clean
安装了 MySQL 及 PostgreSQL 后,必须再进行数据库的细部设定。相关的数据库详细设定说明,请参考「数据库系统」一章的说明。
13.2.2 Apache 基本设定
安装完 Apache 后,我们必须先进行一些基本设定才可以开始使用。本节中,我们先介绍较常使用的设定项目,让您可以快速的设定好网页服务器,而更详细的 Apache 设定将于下一小节中说明。Apache 的设定档位于 /usr/local/etc/apache2/httpd.conf,请使用文章编辑软件打开 httpd.conf。
我们按照设定项目在 httpd.conf 中出现的顺序说明每一个项目,您可以使用搜寻的方式查找每一个项目的关键词,以进行设定。
ServerAdmin 设定管理者邮件
设定您的信箱,这个信箱地址当网页出现错误讯息时将出现在该页面上。以下范例为默认值:
ServerAdmin [email]you@example.com[/email]
ServerName 设定主机名称及端口号
ServerName 可以让您设定您的主机名称,如果您没有主机名称,可以设定为您机器所使用的 IP。ServerName 会被用来重新转向网址,例如,当您输入一个网址 「[url]http://www.example.com/dir[/url]」时,Apache 会参考您在 ServerName 中的设定,将 [url]www.example.com[/url] 改成 ServerName,并在您所输入的网址后加上一个斜线「/」以连到 dir 目录中,也就是将网址转向到「[url]http://www.example.com/dir/[/url]」。如果您的网址设定不正确,则使用者可能会连到一个不存在的地址。
所以,如果您没有主机名称,可以将这个值设定为 IP,让网址转向后还是可以连到正确的地方。在 ServerName 的设定中,我们也指定了 HTTP 的连接埠 80。
如果您的服务器是位于 NAT 后面,使用 NAT 做 Port Forwarding,建议不要设定这个项目,改将下一个设定选项 UseCanonicalName 设为 On,才不会在转向网址时导到错误的位置。
ServerName [url]www.example.com:80[/url]
UseCanonicalName 设定导向网址的方式
Apache 在导向网址时,会参考您所设定的服务器名称及端口号,但当主机使用 NAT Port Forwarding 时,主机名称及端口号可能会不同,这时候我们必须将这个选项设为 On,以免 Apache 转向到错误的地址。
UseCanonicalName Off
DocumentRoot 设定网页根目录
DocumentRoot 可以让我们指定网页根目录的位置,也就是我们存放网页的目录。
DocumentRoot "/usr/local/www/data"
设定好 DocumentRoot 后,我们必须要再设定该目录的权限。在 DocumentRoot 之后,有下列区段:
   Options Indexes FollowSymLinks
   AllowOverride None
   Order allow,deny
   Allow from all
您必须将  也改成您的网页根目录位置。
DirectoryIndex 指定预设网页档名
当使用者使用网址「[url]http://www.example.com/dir[/url]」连到一个目录中时,如果没有指定网页,Apache 会去查找 DirectoryIndex 中所设定的网页在不在,如果存在则秀出预设的网页。
预设的网页只有二个,我们可以再加上 index.htm、index.php 等常用的网页:
DirectoryIndex index.php index.htm index.html index.html.var
加入 PHP 支持
如果您要使用 PHP,则必须在 httpd.conf 中加入 PHP 的支持,请在 httpd.conf 档案最后加入下列内容:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
上述设定完成后,您就可以存盘离开。
接下来,我们必在修改 /etc/rc.conf ,并加入下列设定以在开机时启动 Apache:
apache2_enable="YES"
最后,我们就可以使用下列指令以启动 Apache 了:# /usr/local/etc/rc.d/apache2.sh start
如果您要停止 Apache,可以使用下列指令:# /usr/local/etc/rc.d/apache2.sh stop
我们可以在网页根目录中新增一个档案来测试 PHP 是否有正常运作,请使用文书编辑软件开一个新文件 test.php,并加入下列内容:
接下来您就可以连到该网页 [url]http://192.168.0.1/test.php[/url] (请将 192.168.0.1 改成您的主机 IP) 看看是否可以使用 PHP。如果有支持 PHP,则会显示 PHP 组态,如果没有,则只会出现上述档案内容。
13.3 http.conf 说明
/usr/local/etc/apache2/httpd.conf 是 Apache 的主要设定档。档案中有 # 为开头者是批注,用以说明设定的情形及方式,如果一行的开头有 # 的话,该行对 Apache 就不会产生作用。
我们按照 httpd.conf 中各选项出现的顺序说明几个重要的项目,比较不可能更动的项目我们就不在此说明。这些细部 Apache 的设定看起来有点无趣,但不看过一遍不知道有什么是我们可以调整的项目。建议您先大略浏览过即可,日后有调整的需要时,再回过头来参考即可。
ServerRoot 设定 Apache 执行的根目录
ServerRoot 用以设定 Apache 的根目录位置,记录文件、设定文件的相对目录位置。
ServerRoot "/usr/local"
必须注意的是,如果您的此目录设定为 NFS 或是其它以网络挂入的档案系统中,请先阅读
[url=http://httpd.apache.org/docs-2.0/mod/mpm_common.html#lockfile]http://httpd.apache.org/docs-2.0/mod/mpm_common.html#lockfile[/url]
关于 LockFile 的说明,以避免一些不必须的问题发生。另外,请勿在 ServerRoot 的路径名称最后面加入 "/" 符号。
LockFile 设定 lock 文件的位置
LockFile 通常只有在您的网页数据使用 NFS 挂入时才会需要设定,否则使用默认值即可。如果您有设定 LockFile,LockFile 必须设定在非网络挂入的档案系统中。
#LockFile /var/log/accept.lock
我们看到 LockFile 这个项目被   包起来,这表示当没有使用 winnt 模块时这个设定才会生效。在下列其它设定中,我们会看到有其它的选项也是以   包起来,意思是一样的。
PidFile 设定 httpd.pid 位置
Apache 在启动时,会将自己的 process id 写入 PidFile 中。
PidFile /var/run/httpd.pid
Timeout 设定联机逾时
Timeout 设定了等待 Client 端响应的时间,以秒为单位。如果 Client 端在指定的时间内没有传送任何数据,即切断联机。
Timeout 300
KeepAlive 是否使用保持联机
设定是否使用保持联机的功能 (Presistent Connections)。当 KeepAlive 设为 On 时,一个已经建立的联机会用来处理多个 HTTP 的请求,也就是一个联机会用来传送多个档案,以避免每一个请求都要重新建立新的联机而降低效能。您可以将 KeepAlive 设为 Off 以关闭保持联机的功能。
KeepAlive On
MaxKeepAliveRequests 最多有几个保持联机
设定最多可以有几个 KeepAlive 的联机。您可以将这个项目设为 0 表示无限制。当有太多的保持联机时,会造成系统资源占用太多。但如果是一个忙录的服务器,建议您提高限制,以增加执行效率。
MaxKeepAliveRequests 100
KeepAliveTimeout 保持联机的逾时时间
同一个 Client 的「保持联机」功能,在多少秒后没有联机的请求即为联机逾时。如果二次请求的时间超过这个设定值,联机就会中断。
KeepAliveTimeout 15
prefork MPM 控制 process 数量
您会看到有很多个 StartServers、MinSpareServers、MaxClients 等设定,每个设定都使用   包起来。这是因为不同的平台会使用不同的模块,而设定就会依平台而有所不同。在 FreeBSD 中,我们使用的是 perfork 这个模块,因此,我们只要设定这个模块中的值即可。
在这个群组中,各个项目所代表的意义如下:
StartServers:设定 Apache 在启动时要产生多少个 process 来等待 Client 端的联机。我们使用默认值即可,除非您的服务器同时会有很多新的联机,则可以提高这个值。
MinSpareServers:最小要保持多少个空闲的 Apache process 以等待客户端的联机。除非您的网站真的很忙,否则这个值不需要设得太大,太大只会造成资源浪费。
MaxSpareServers:设定最多要有多少个空闲的 Apache process。如果您没有设定这个值,则 Apache 会自动将它设为 MinSpareServers+1。如果有太多闲置的 process,Apache 会自动将多余的 process 杀掉。
MaxClients:同时可以有多少个联机。MaxClients 应该是这个群组中最重要的设定,它关系着您的主机可以同时处理多少个联机。这个设定应该和您的系统资源相关,如果您的内存不大,而且同时处理很多联机,则 Apache 可能会需要用到 SWAP,而造成处理效能大幅下降。而设得太小时,却会使联机处理变慢。所以,MaxClients 应该由您的主机忙录情形及实际内存大小而决定。
MaxRequestsPerChild:当一个 process 联机处理了多少个联机要求后,要将它删除、回收,并启用新的 process 来接受新的要求。预设是没有限制。

StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
Listen 设定接受联机的 IP 及埠号
设定 Apache 所要使用的连接埠号。预设的 HTTP 连接埠为 80,我们使用默认值即可,所以我们使用默认值即可。如果您希望 Apache 只接受连到某一个 IP 的联机 (当您同一台主机有多个 IP 时),可以设定只监听某一个 IP、埠号的联机。
例如,我们可以设定只接受客户端连到 192.168.0.1 的连接埠 8000,则可以设定为 192.168.0.1:8000。
Listen 80
LoadModule 动态加载的模块
Apache Dynamic Shared Object (DSO) 允许我们在启动 Apache 时动态加载模块,例如加载认证模块、PHP 模块等。在这个区段中,您可以看到 Apache 加载了很多模块。我们之后在设定虚拟主机、目录模限控制时,都必须检查 Apache 是否有加载我们想要的模块。这个部份的设定只要保持默认值即可。
LoadModule access_module libexec/apache2/mod_access.so
LoadModule auth_module libexec/apache2/mod_auth.so
LoadModule auth_anon_module libexec/apache2/mod_auth_anon.so
LoadModule auth_dbm_module libexec/apache2/mod_auth_dbm.so
... 略 ...
ExtendedStatus 显示详细状态信息
Apache 有一个 CGI 可以显示 Apache 服务器的状态信息 (server-status),当 ExtendedStatus 打开后,会显示更多信息。我们会在本章下一小节中说明如何使用这些信息。
#ExtendedStatus On
User Group 设定执行时的使用者及群组
系统要使用什么使用者名称及群组执行 Apache。使用 FreeBSD ports 安装后,预设的使用者及群组为 www。
User www
Group www
ServerAdmin 设定邮件
设定您的 Email。这个 Email 会显示在一些由 Apache 所产生的页面中。例如,当使用者连到一个不存在的网页、或是网页发生错误时,Apache 会秀出您所设定的 Email。
ServerAdmin [email]you@example.com[/email]
ServerName 设定主机名称
ServerName 可以让您设定您的主机名称,如果您没有主机名称,可以设定为您机器所使用的 IP。ServerName 会被用来重新转向网址,例如,当您输入一个网址 「[url]http://www.example.com/dir[/url]」时,Apache 会参考您在 ServerName 中的设定,将 [url]www.example.com[/url] 改成 ServerName,并在您所输入的网址后加上一个斜线「/」以连到 dir 目录中,也就是将网址转向到「[url]http://www.example.com/dir/[/url]」。如果您的网址设定不正确,则使用者可能会连到一个不存在的地址。
所以,如果您没有主机名称,可以将这个值设定为 IP,让网址转向后还是可以连到正确的地方。在 ServerName 的设定中,我们也指定了 HTTP 的连接埠 80。
如果您的服务器是位于 NAT 后面,使用 NAT 做 Port Forwarding,建议不要设定这个项目,改将下一个设定选项 UseCanonicalName 设为 On,才不会在转向网址时导到错误的位置。
ServerName [url]www.example.com:80[/url]
UseCanonicalName 设定导向网址的方式
Apache 在导向网址时,会参考您所设定的服务器名称及端口号,但当主机使用 NAT Port Forwarding 时,主机名称及端口号可能会不同,这时候我们必须将这个选项设为 On,以免 Apache 转向到错误的地址。
UseCanonicalName Off
DocumentRoot 设定网页根目录
DocumentRoot 可以让我们指定网页根目录的位置,也就是我们存放网页的目录。除非您有使用 symbolic links 或是 aliases,否则所有的网页都会放在这个目录中。
DocumentRoot "/usr/local/www/data"
设定目录权限
接下来的几个区段中,您会看到   的设定。这个设定是用来指定某个目录的存取权限,例如是否允许执行 CGI、是否要列出该目录下的所有档案等等。
我们以之前所设定的网页根目录「DocumentRoot」为例,当您修改了网页根目录后,您也必须将这个区段中的  改成您的网页目录。由于 Apache 将一般的网页和 CGI 分别放在不同的目录,所以您的 DocumentRoot 设定和这里的设定稍有不同。但您可以将  及 DocumentRoot 都改成 /home/www。
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# [url]http://httpd.apache.org/docs-2.0/mod/core.html#options[/url]
# for more information.
#
    Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
    AllowOverride None
#
# Controls who can get stuff from this server.
#
    Order allow,deny
    Allow from all
我们后续再来说明一下   这个区段中每个项目的用途。
Options 设定目录可以使用的功能
我们在   中指定了要设定哪一个目录后,可以再使用 Option 来设定该目录可以使用哪些功能。以下为功能的列表及说明:
All:允许使用除了 MultiViews 以外的所有功能,此项目为默认值。
ExecCGI:允许在此目录中执行 CGI。
FollowSymLinks:允许在目录中使用 Symbolic links。使用者可以在此目录中建一个 symbolic link 连结到网页根目录以外的地方。例如,如果你在网页根目录中建一个 symbolic link 到 /etc/master.passwd,则使用 [url]http://192.168.0.1/master.passwd[/url] 就可以看到 /etc/master.passwd 的内容。建议您将这个项目移除,以避免安全性问题产生。
Includes:允许使用 Server-side includes (SII)。
IncludesNOEXEC:允许使用 SII,但不可以使用 #exec 去执行系统指令或是 CGI。
Indexes:当目录中没有 DirectoryIndex 所设定的网页时 (如 index.html),是否要由 Apache 自动产生目录中的档案列表。除非您的网页是要开放改使用者下载档案,并希望由 Apache 产生档案列表,否则建议您关闭这项功能。
MultiViews:允许使用 Content negotiated 的功能,自动经由服务器和 Client 的内容协商,决定要使用哪一种语言的档案。
SymLinksIfOwnerMatch:如果 symbolic link 所指向的档案拥有者符合 Apache 执行的使用者,则允许使用 symbolic link。
当我们对目录设定 Option 的项目后,它的子目录也会继承该目录的设定值。如果我们同时设定一个目录及其子目录的 Option 的设,会以最接近的目录设定为主。例如,我们为 /home/www 及 /home/www/photo 设定权限如下:
    Options Indexes FollowSymLinks
    Options Includes
我们设定了 /home/www 可以使用 Indexes 及 FollowSymLinks,但 /home/www/photo 只能使用 Includes。虽然 /home/www/photo 是 /home/www 的子目录,但是其目录的设定只会以自己的 Options 为主,也就是不具有 Indexes 及FollowSymLinks,只有 Includes 的权限。
如果您希望子目录可以继承上一层的设定,可以使用 + 及 - 的符号表示。例如:
    Options Indexes FollowSymLinks
    Options +Includes -Indexes
我们在 /home/www/photo 的 Option 中使用了 + 及 -,所以它会继承 /home/www 的设定,但是加上 Includes 的功能,并取消 Indexes,所以最后 /home/www/photo 的权限就是 Includes 及 FollowSymLinks。
AllowOverride 设定 .htaccess 中可以使用的项目
Apache 允许使用者对于目录中使用 .htaccess 文件来控制权限,例如使用密码保护、设定权限等。我们会在下一章中说明如何使用 .htaccess 来做密码保护。
您可以将 AllowOverride 设成 All 或 None 来表示允许或不允许。或者,您也可以指定只允许下列某几个功能:
AuthConfig:允许设定不同的认证方式。
FileInfo:允许设定档案类型。
Indexes:允许设定列出目录索引时所要使用的选项。
Limit:允许使用 Allow、Deny、Order 来设定存取权限。
Options:允许设定目录权限。
Order 设定 Allow 及 Deny 的顺序
我们可以在目录中设定允许 (Allow) 及拒绝 (Deny) 的规则先后顺序,当二者抵触时,以后者为主。以下列范例为例,我们先设定了 Order 为 Deny, Allow,再设定拒绝所有联机,但只允许 192.168.0.2 来存取 /home/www/mp3。
    Order Deny,Allow
    Deny from all
    Allow from 192.168.0.2
UserDir 设定使用者个人网页
在 mod_userdir 区段中,包含了使用者个人网页的设定。使用者可以使用 [url]http://www.example.com/~username[/url] 连到个人网页。预设的设定是每个使用者都可以在自己的家目录中建立一个名为 putblic_html 的目录,该目录就使用者的个人网页目录。UserDir 这个项目即定义了使用者个人网页的路径名称。如果您觉得这个名称太长,更改它的设定,但记得要修改  中的相对设定。
如果您不想让使用者有个人网页,可以将这个区段前面使用 # 批注起来。
UserDir public_html
UserDir disabled root toor daemon ..... pop www nobody mailnull smmsp
#
# Control access to UserDir directories. The following is an example
# for a site where these directories are restricted to read-only.
#
    AllowOverride FileInfo AuthConfig Limit Indexes
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
   
        Order allow,deny
        Allow from all
   
   
        Order deny,allow
        Deny from all
   
DirectoryIndex 设定预设网页档名
当使用者使用网址「[url]http://www.example.com/dir[/url]」连到一个目录中时,如果没有指定网页,Apache 会去查找 DirectoryIndex 中所设定的网页在不在,如果存在则秀出预设的网页。
预设的网页只有二个,我们可以再加上 index.htm、index.php 等常用的网页:
DirectoryIndex index.php index.htm index.html index.html.var
HostnameLookups 设定将客户端 IP 转为 hostname
是否要在 Apache 的记录文件中将 Client 的 IP 转成 hostname。由于将 IP 转成 hostname 需要一点时间,将这个功能设为 On 会造成联机的效率变慢很多。
HostnameLookups Off
ErrorLog 指定错误记录文件位置
设定 Apache 错误讯息的记录文件位置。
ErrorLog /var/log/httpd-error.log
CustomLog 指定联机记录文件位置
设定 Apache 联机记录文件的位置。
CustomLog /var/log/httpd-access.log combined
Alias 设定别名
我们可以为一个目录或联机的 URI 设定别名,以简化目录名称。例如,您可以将 /home/alex/mp3/ 取一个别名为 /mp3/,让使用者在联机到
[url=http://www.example.com/mp3/]http://www.example.com/mp3/[/url]
时,指向 /home/alex/mp3/。
Alias /mp3/ /home/alex/mp3/
别名可以设定很多个,您可以依需求简化连结的位置。设定的别名目录不一定要是 DocumentRoot 的子目录,我们可以指定网页根目录以外的目录。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
为了精准起见,我们使用 /mp3/ 而非 /mp3,以免将 /mp3files 变成了 /home/alex/mp3files。也就是多加了一个 "/" 在 mp3 之后。
AliasMatch 使用常规表示的别名
除了一般的别名外,我们还可以使用常规表示来设定别名。例如,我们要设定所有要使用 *.php 的档案都连到 /usr/local/php 目录中,则可以使用:
AliasMatch ^(.+\.php)$ /usr/local/php$1
ScriptAlias 设定 CGI 目录
ScriptAlias 可以让我们设定 CGI 的所在目录,它的功用其实看 Alias 差不多。下面的范例就是当使用者要连到 [url]http://www.example.com/cgi-bin/[/url] 时,我们将 cgi-bin 指向 /usr/local/www/cgi-bin/ 目录中。
ScriptAlias /cgi-bin/ "/usr/local/www/cgi-bin/"
ErrorDocument 指定错误讯息页面
当使用者连到一个不存在的网页,或是网页发生错误时,Apache 预设会帮我们产生一个错误讯息的网页。我们可以修改这个设定,以秀出我们自己设定的页面。例如,当您连到 YAHOO! 时,如果网页不存在,它的页面中还是秀出一些 YAHOO 自己的信息。
在 ErrorDocument 之后,首先要加的是错误代码。错误代码 404 在 HTTP 协议中表示找不到页面。在下列设定中,我们设定当找不到页面时,就秀出 /missing.html。/missing.html 的「/」指的并非系统的根目录,而是您网页的根目录。
ErrorDocument 404 /missing.html

[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
修改 httpd.conf 是调校 Apache 的第一步,更多关于 Apache 的调校,可以参考 Apache 的使用手册,或是参考
[url=http://httpd.apache.org/docs/2.0/misc/perf-tuning.html]http://httpd.apache.org/docs/2.0/misc/perf-tuning.html[/url]

13.4 PHP 进阶设定
php.ini 是 PHP 的设定档,若您使用 ports 安装,则你必须将设定文件范例 /usr/local/etc/php.ini.dist 复制成 /usr/local/etc/php.ini。我们可以经由修改 php.ini 来调整 PHP 的功能。
在 php.ini 中,开头为 ";" 的项目为批注、以 [ ] 包起来的是区段的名称,二种都不会代表任何意义。在修改完 php.ini 后,我们必须也要重跑 Apache 才可以有作用。
以下就让我们针对最常调整的几个项目做说明。
max_execution_time
这个选项设定了 PHP scripts 最长的执行时间,如果您的 PHP 程序需要执行很长的时间,则可以将它延长。预设的最长执行时间是 30 秒。
max_execution_time = 30
memory_limit
设定每一个 scripts 所能耗用的内存大小,预设是 8 MB。
memory_limit = 8M
error_reporting
预设的错误回报内容为何。这个选项设定了 PHP scripts 在发生何种错误时要回报讯息。预设是除了 NOTICE 及 STRICT 的错误以外都回报。这个选项的设定使用了 bit operation,在 php.ini 运算表示式可以使用「|」表示 bit OR、「&」表示 AND、「~」表示 NOT。以下列范例而言,就是 E_ALL AND (NOT E_NOTICE) AND (NOT E_STRICT)。
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT
error_log
我们可以将错误讯息记录在档案中,或是使用 syslog 将错误记录在 /var/log/messages 中。以下的范例即是使用 syslog。
error_log = syslog
register_globals
PHP 自从 4.1.0 开始,支持一种比较安全的变量传递方式。原本我们在写 PHP 程序时,从窗体以 POST 方式传入 PHP 程序时,PHP 可以直接拿来使用。例如,有一个窗体是下面这个样子:
当上述的 HTML 按了送出之后,在 test.php 这个程序就会有一个变量名为 $username,其值是我们所填入的名称。
但是使用者也可以直接在网址列输入 [url]http://url/test.php?username=myname[/url] 来设定 $username 这个变量的值为 myname。
这会有什么问题呢?让我们以 PHP 4.1.0 release note 所提出的例子来说明。假设我们有一个程序如下:
使用者可以经由网址列输入一个变量 $authenticated=true,这样一来,不管是否通过 authenticate_user() 的检查,$authenticated 永远都是 true。
所以在 4.1.0 之后,有一个新的方式可以让我们使用,就是将传进来的变量全部都存在数组中。以第一个例子而言,我们以 POST 的方式从窗体传来变量 $username,新的取得变量方式是:$_POST["username"],也就是说所有以 POST 传递过来的变量全部存在 $_POST 这个数组中。详细说明请参考
[url=http://www.php.net/release_4_1_0.php]http://www.php.net/release_4_1_0.php[/url]

在 4.2.0 之前,新旧二种方式都可以使用,但是在 4.2.0 之后,Default 只能使用新的方式来传递变量。所以如果你安装的了新 PHP 而发现无法使用旧的 PHP 程序,别惊讶。
如果您还是要以旧的方式来传递变量,请修改 php.ini,将原本的 register_globals = Off 改成下列这个样子,并移除开头的批注符号 ";":
; register_globals = Off
register_globals = On
post_max_size
当使用者从网页中使用 HTML FORM 以 POST method 送出数据时,最大的数据上限为何。默认值是 8 MB。
error_log = syslog
file_uploads
是否允许使用者以 HTTP 上传档案。预设为 On。
file_uploads = On
upload_max_filesize
当使用者从网页中使用 PHP 上传档案时,档案最大的大小为何。预设是 2 MB。
upload_max_filesize = 2M
13.5 Apache 服务器状态与管理
身为系统管理者,必须时常查看系统状态,检查、注意主机是否有异常的情形发生。Apache 提供了详细的系统记录文件,我们可以经由这些档案了解服务器、网页是否有异常的情形。另外,Apache 也提供了一些工具,可以让我们了解服务器的运作情形。
13.5.1 Apache 状态信息
在安装完 Apache 后,如果您所管理的是一个大型的网页服务器,您一定会需要了解服务器的系统负荷是否足以处理庞大的网络流量。Apache 内建了 server-status 及 server-info 二种观看服务器信息的方法。
server-status 服务器状态信息
server-status 可以让我们了解 Apache 目前运作的情形,包括占用的系统资源、目前联机数量等。在使用 server-status 之前,我们必须先修改 httpd.conf,以打开此功能。
...
LoadModule status_module libexec/apache2/mod_status.so
...
#
# ExtendedStatus controls whether Apache will generate "full" status
# information (ExtendedStatus On) or just basic information (ExtendedStatus
# Off) when the "server-status" handler is called. The default is Off.
#
ExtendedStatus On
...
#
# Allow server status reports generated by mod_status,
# with the URL of [url]http://servername/server-status[/url]
# Change the ".example.com" to match your domain to enable.
#
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 192.168.0.
...
首先要确认的是 Apache 有载入 mod_status.so 这个模块,接着我们将 ExtendedStatus 设为 On,以显示详细的服务器状态。最后是找到 server-status 的区段,并移除开头的 #。在 server-status 区段中,我们设定了 Deny、Allow,以限制只有从某个地方联机进来的使用者可以查看服务器状态。在上述的范例中,我们限制只有从 192.168.0.x 的使用者才可以看到 server-status。
修改完 httpd.conf 后,我们必须使用下列指令重新启动 Apache:# /usr/local/etc/rc.d/apache2.sh restart
接下来,我们就可以使用浏览器连到 [url]http://192.168.0.1/server-status[/url]。请将 192.168.0.1 改成您的主机 IP。连到 server-status 后,您可以看到下列画面:
图 13-2
[img]http://homepage.cqwu.net/wxfy/images/ch13_02.png[/img]
server-status 的输出中每个字段所代表的意义如下:
[b]字段[/b]
[b]说明[/b]
Server Version
Apache 服务器的版本。
Server Built
Apache 服务器编译安装的时间。
Current Time
目前的系统时间。
Restart Time
Apache 重新启动的时间。
Parent Server Generation
Apache 父程序 (parent process) 的世代编号,就是 httpd 接收到 SIGHUP 而重新启动的次数。
Server uptime
Apache 启动后到现在经过的时间。
Total accesses
到目前为此 Apache 接收的联机数量及传输的数据量。
CPU Usage
目前 CPU 的使用情形。
_SWSS....
所有 Apache process 目前的状态。每一个字符表示一个程序,最多可以显示 256 个程序的状态。
Scoreboard Key
上述状态的说明。以下为每一个字符符号所表示的意义:
_:等待连结中。
S:启动中。
R: 正在读取要求。
W:正在送出回应。
K:处于保持联机的状态。
D:正在查找 DNS。
C:正在关闭连结。
L:正在写入记录文件。
G:进入正常结束程序中。
I:处理闲置。
.:尚无此程序。
Srv
本程序与其父程序的世代编号。
PID
本程序的 process id。
Acc
分别表示本次联机、本程序所处理的存取次数。
M
该程序目前的状态。
CPU
该程序所耗用的 CPU 资源。
SS
距离上次处理要求的时间。
Req
最后一次处理要求所耗费的时间,以千分之一秒为单位。
Conn
本次联机所传送的数据量。
Child
由该子程序所传送的数据量。
Slot
由该 Slot 所传送的数据量。
Client
客户端的地址。
VHost
属于哪一个虚拟主机或本主机的 IP。
Request
联机所提出的要求信息。
我们在查看 server-status 时,可以在输入的网址中加上参数 refresh 来让网页自动更新。例如,您可以输入 [url]http://192.168.0.1/server-status?refresh=5[/url],让网页每 5 秒钟自动重新加载。
server-info 服务器组态信息
server-info 和 server-status 的设定类似,我们可以经由 server-info 知道 Apache 的组态信息,包括版本、加载的模块等。
同样的,在使用 server-info 之前,我们必须先修改 httpd.conf,以打开此功能。
...
LoadModule info_module libexec/apache2/mod_info.so
...
#
# Allow remote server configuration reports, with the URL of
# [url]http://servername/server-info[/url] (requires that mod_info.c be loaded).
# Change the ".example.com" to match your domain to enable.
#
    SetHandler server-info
    Order deny,allow
    Deny from all
    Allow from 192.168.0.
...
server-info 所使用的模块是 mod_info.so,我们先要确认的是 Apache 有该模块。接着我们找到 server-info 的区段,并移除开头的 #。在 server-info 区段中,我们一样设定了 Deny、Allow,以限制只有从某个地方联机进来的使用者可以查看服务器组态设定。
修改完 httpd.conf 后,我们必须使用下列指令重新启动 Apache 才可以使用:# /usr/local/etc/rc.d/apache2.sh restart
最后您就可以使用 [url]http://192.168.0.1/server-info[/url] 连到 Apache 的服务器组态信息页面:
图 13-3
[img]http://homepage.cqwu.net/wxfy/images/ch13_03.png[/img]
在 server-info 中,我们可以看到最上方是 Apache 所有己加载的模块信息,接着是 Apache 主要的设定状态,而最下方是目前 Apache 设定文件和默认值不同的地方。在本页面的其它部份为每一个已加载的模块状态供您参考。
13.5.2 效能测试
Apache 提供了一个测试 Apache 效能的工具 - ab。你可以使用 ab 针对某个 URL 来模拟出连续的联机请求 (不限本地主机),并设定同时间要模拟多少联机。
以下为 ab 这个指令比较常用的参数说明:
[b]参数[/b]
[b]说明[/b]
-n requests
要做多少次联机请求,requests 为次数。
-c concurrency
同时有多少个联机,concurrency 为个数。
-t timelimit
最多等待回应的秒数。
-p postfile
要以 POST 方法联机所欲送出的参数档案。postfile 为存放参数的文件名称。
例如,我要对自己的机器中的 index.php 作测试,模拟 1000 次请求,每次最多同时 20 个联机,只要在命令列执行指令:# /usr/local/sbin/ab -n 1000 -c 20 [url]http://127.0.0.1/index.php[/url]
等了几秒之后出现:
This is ApacheBench, Version 2.0.41-dev  apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, [url]http://www.zeustech.net/[/url]
Copyright (c) 1998-2002 The Apache Software Foundation, [url]http://www.apache.org/[/url]
Benchmarking 127.0.0.1 (be patient).....done
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests
Server Software: Apache/2.0.54
Server Hostname: 192.168.0.4
Server Port: 80
Document Path: /index.php
Document Length: 3803 bytes
Concurrency Level: 20
Time taken for tests: 9.543791 seconds
Complete requests: 1000
Failed requests: 1002
(Connect: 0, Length: 1002, Exceptions: 0)
Write errors: 0
Total transferred: 6286345 bytes
HTML transferred: 6124788 bytes
Requests per second: 104.78 [#/sec] (mean)
Time per request: 190.876 [ms] (mean)
Time per request: 9.544 [ms] (mean, across all concurrent requests)
Transfer rate: 643.25 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 3 62 106.7 28 771
Processing: 13 125 163.3 55 860
Waiting: 5 89 120.1 46 786
Total: 26 187 229.5 94 1558
Percentage of the requests served within a certain time (ms)
50% 94
66% 168
75% 198
80% 218
90% 488
95% 772
98% 898
99% 950
100% 1558 (longest request)
您可以增加最多同时联机数目及联机次数,操看看你机器的上限在哪里。
还有更多的参数,详细用法请 man ab。
13.5.3 维护服务器记录文件
查看服务器记录文件可以让我们了解服务器的运作情形。Apache 预设会有二个记录文件,一个是所有联机的记录,预设的名称是 /var/log/httpd-access.log;另一个是联机错误记录文件,预设的位置是 /var/log/httpd-error.log。记录文件的位置及文件名是由 httpd.conf 决定,如果您修改过记录文件的设定,则路径可能就不太一定。以下为 httpd.conf 关于记录文件的设定:
...
ErrorLog /var/log/httpd-error.log
...
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
...
CustomLog /var/log/httpd-access.log combined
...
我们来看一下 httpd-access.log 的内容:
图 13-4
[img]http://homepage.cqwu.net/wxfy/images/ch13_04.png[/img]
我们截取一条记录加以说明。第一行开头的部份是客户端的 IP,接下来是联机的时间、所查看的网页、及所使用的操作系统、浏览器等。在存取记录中要显示什么信息是由 httpd.conf 中的 LogFormat 所控制。因为我们设定了 CustomLog 所使用的格式是 combined,而 combined 在 LogFormat 中的设定就是显示上述格式。LogFormat 的格式中,每一个字段使用都可以用 %X 表示,例如 %h 表示客户端的 IP。
基本上我们比较少直接查看 access log,我们会使用一些外挂软件来析记录文件。例如,统计每个网页的使用量、哪一个网页最常被存取、每天有多少联机等等。下一章中,我们会介绍如何安装使用网页分析软件。
我们可能比较常看的是错误记录文件。经由查看错误记录文件,我们可以知道网页中没有有连结是坏的、使用者有没有尝试连到一个不存在的网页。我们选三条错误记录来说明:
[Fri Dec 10 19:45:45 2004] [error] [client 163.30.0.2]
File does not exist: /home/www/style.css
[Fri Dec 10 20:55:44 2004] [error] [client 220.165.54.39]
request failed: URI too long
[Fri Dec 10 20:56:09 2004] [error] [client 220.165.54.39]
File does not exist: /home/www/c/winnt/system32/cmd.exe
第一个错误记录是有人要存取 style.css,但却找不到该档案,这可能是我们网页的 HTML 中有错误的连结。第二、三条记录看来应该是 Windows 的病毒,它试着去存取 system32/cmd.exe,想要找 Windows 网页服务器的漏洞。您可以在错误记录文件中看到很多这种病毒的讯息,很庆幸我们是使用 FreeBSD + Apache,不需要担心病毒的入侵。
随着使用人数的增加,网站的 log 档可能会越来越大,我们可以使用 FreeBSD 的 newsyslog 来把旧的 log 备份起来。在 newsyslog 中,我们可以指定要备份多少个 log 档,超过之后会自动删除最旧的档案。
首先编辑 /etc/newsyslog.conf 加入下列二行:
/var/log/httpd-access.log 644  7   *  $W0D1  J  /var/run/httpd.pid
/var/log/httpd-error.log  644  7   *  $W0D2  J  /var/run/httpd.pid
以上二行的意义是将 /var/log/httpd-access.log 这个档案做备份,备份后的文件名称像这样 httpd-access.log.0.bz2 。备份后该档案的权限是 644,最大的数字到 7,也就是最多八个档案,不限制档案多大时要备份,选在每周日半夜 1 点时备份,并将该档以 bzip2 压缩。在备份完后,要将 /var/run/httpd.pid 所记录的 Process ID 重新启动。

逍遥 发表于 2006-6-5 15:19

第十四章 网页服务器进阶应用
网页服务器架设之后,世界各地的使用者都可以经由因特网连到您的主机,如何维护网站安全是一大课题。管理者更需要知道网站的使用情形,系统资源、网络频宽是否足够。本章将说明网页服务器使用上常见的管理议题,并介绍一些好用的管理工具。读完本章后,您将进一步了解下列主题:
如何使用 SSL 建立安全的 HTTP 联机。
使用密码保护目录存取权限。
如何在一台主机上提供不同网址的网页。
如何管理一般使用者的个人网页。
加速 PHP scripts 的处理速度。
分析网页的使用情形。
网站使用流量分析。
14.1 HTTP 安全与 SSL 协定
当我们使用网络服务时,经由网络传送的数据都有可能被他人拦截窃听。简单的说,当您从网页上输入账号密码时,如果有人在您所使用的计算机和服务器之间拦截,就可以轻易的从网络封包中窃听到您所输入的数据。
随着网络的蓬勃发展,在线交易的使用量日益增加,对于数据的保护更是重要。如果一个在线交易的网站使用普通的 HTTP,则使用者输入的账号密码、交易数据、信用卡号等等都有可能会外泄,更别说交易数据被假造的风险了。为了解决 HTTP 的网络安全,发展出许多加密、认证的机制。其中最常见的就是使用金钥加密法的 HTTP over SSL (Secure Socket Layer),又称为 HTTPS,目前国内许多网络银行都是使用 HTTPS 作为交易安全的第一道关卡。
SSL 的加密方式是由服务器端提供了一组加解密用的金钥,在服务器端所使用的是私密金钥 (Private key),而客户端所使用的是公开金钥 (Public key)。在联机建立后,HTTP 服务器会将公开金钥传给客户端使用。公开金钥加密过的资料只能由私密金钥解密,在客户端要送出数据之前,会先使用公开金钥进行加密的动作,而服务器收到数据后,会使用私密金钥进行解密。
在 Apache 2 中,预设安装即支持 SSL,我们只需产生一组金钥,并设定启动 SSL 即可。
14.1.1 产生金钥
正确的凭证产生方法是先产生服务器用的公钥及 CSR (Certificate Signing Request),接着将 CSR 送给专门做凭证签发的公正单位做签章。或者,我们也可以自己做为一个凭证签发单位,自己为自己签发凭证。但由于我们自己产生的凭证不具公信力,所以使用者使用 HTTPS 连到网站时,会出现下列的警告讯息:
图 14-1
[img]http://homepage.cqwu.net/wxfy/images/ch14_01.png[/img]
这个警告讯息并不影响加密,不过如果您所架设的是商用网站,您还是得交由公正单位作签证。
如果您要使用自我签发的凭证,第一步是要产生签发单位凭证,我们先建立一个目录名为 ssl,并将产生的凭证放在该目录下:# mkdir ssl
# cd ssl
# openssl genrsa -out ca.key 1024
# openssl req -new -key ca.key -out ca.csr
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]:TW
State or Province Name (full name) [Some-State]:Taiwan
Locality Name (eg, city) []:Taipei
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
Organizational Unit Name (eg, section) []:Certificate Authority
Common Name (eg, YOUR name) []:MyCA
Email Address []:alex@alexwang.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:按 Enter 即可
An optional company name []:按 Enter 即可
# openssl x509 -days 365 -signkey ca.key -in ca.csr -req -out ca.crt
我们在第二个 openssl 指令中必须输入一些基本信息,最后产生一个有效期限 365 天的凭证。接着,必须产生 Apache 服务器用的凭证:# openssl genrsa -out server.key 1024
# openssl req -new -key server.key -out server.csr
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]:TW
State or Province Name (full name) [Some-State]:Taiwan
Locality Name (eg, city) []:Taipei
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
Organizational Unit Name (eg, section) []:Web Team
Common Name (eg, YOUR name) []:[url]www.alexwang.com[/url]
Email Address []:alex@alexwang.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:按 Enter 即可
An optional company name []:按 Enter 即可
# openssl x509 -days 365 -CA ca.crt -CAkey ca.key -in server.csr -req -out server.crt
同样的,我们必须输入关于这个凭证的一些数据,最后,我们使用之前所产生的凭证签发一个有效期限 365 天的服务器用凭证。必须注意的是,在 Common Name 必须输入您的主机名称,以避免联机时凭证名称和网页名称不符的警告。另外,我们在产生凭证时,当 OpenSSL 要求输入用来保护凭证的密码时,我们都没有输入密码。如果您输入密码,则以后 Apache 要启动时都必须输入密码才可以启动。
最后,我们将服务器用的凭证复制到 Apache 的设定文件位置:# mkdir /usr/local/etc/apache2/ssl.crt
# mkdir /usr/local/etc/apache2/ssl.key
# cp server.crt /usr/local/etc/apache2/ssl.crt/server.crt
# cp server.key /usr/local/etc/apache2/ssl.key/server.key
# chmod 400 /usr/local/etc/apache2/ssl.crt/server.crt
# chmod 400 /usr/local/etc/apache2/ssl.key/server.key
最后,请将我们制作过程中的凭证删除:# rm -rf ssl
凭证制作完成后,我们就可以开始设定支持 SSL 的 Apache 了。
14.1.2 设定及启动 HTTPS
首先,我们必须先修改 /usr/local/etc/apache2/ssl.conf 以设定 SSL,请先找到下列区段:
# General setup for the virtual host
DocumentRoot "/home/www"
ServerName [url]www.example.com:443[/url]
ServerAdmin [email]you@example.com[/email]
ErrorLog /var/log/httpd-error.log
TransferLog /var/log/httpd-access.log
我们必须修改 DocuemntRoot,并将它设为我们网页根目录,然后要修改 ServerName,将它设定为我们的主机名称。
为了要该 Apache 启动时可以支持 SSL,请在 /etc/rc.conf 中加入 Apache SSL 的设定:
apache2ssl_enable="YES"
最后,请重新启动 Apache 即可:# /usr/local/etc/rc.d/apache2.sh restart
接下来,您就可以使用 [url]https://192.168.0.1[/url] 连到您的主机了。请注意,我们使用的联机方法是 https,而非 http。如果您联机的主机名称和凭证产生的名称不同,将会有名称不符的警告讯息。
图 14-2
[img]http://homepage.cqwu.net/wxfy/images/ch14_02.png[/img]
14.2 对目录设定密码保护
在架设网站时,如果您有特殊需求,必须指定某个目录只能由某些使用者才能存取,我们可以使用 Apache 内建的目录保护功能,让使用者必须输入使用者名称及密码才能存取该目录。
在开始设定目录的保护之前,我们必须先修改 httpd.conf,允许使用者可以在网页目录中使用认证功能。首先,请编辑 /usr/local/etc/apache2/httpd.conf,找到网页目录设定的区段:
...
LoadModule auth_module libexec/apache2/mod_auth.so
...
        Options Indexes FollowSymLinks MultiViews ExecCGI
        [b]AllowOverride AuthConfig[/b]
        Order allow,deny
        Allow from all
...
AccessFileName .htaccess
...
我们必须先确定 Apache 有加载 mod_auth.so 模块。接着,我们在网页目录的区段中 AllowOverride 的部份设定了使用 AuthConfig。如果 AllowOverride 设为 None 表示不允许使用者变更目录设定,设为 AuthConfig 表示可以使用 AuthDBMGroupFile、 AuthDBMUserFile, AuthGroupFile、AuthName、AuthType 等认证的功能。另外,在 AccessFileName 中,我们设定了用来保护目录的设定文件名称,预设为 .htaccess。
Apache 允许使用者在目录下放置一个档案来控制该目录的存取权限,预设是使用 .htaccess。我们可以自行用文书软件编辑一个文件名为 .htaccess 的档案来设定档案所在目录的权限。假设我们要保护的目录是 /home/www/private/ 这个目录,请新增一个文字文件 /home/www/private/.htaccess,内容如下:
AuthName "管理专区"
AuthType "Basic"
AuthUserFile "/var/http.pw"
require valid-user
其中请注意各参数的大小写。这里我们设定储存使用者账号及密码的档案是 /var/http.pw。
接下来我们就可以新增使用者及密码了。Apache 用来新增密码的指令为 htpasswd:# /usr/local/sbin/htpasswd -c /var/http.pw username
New password: 输入 username 的密码
Re-type new password: 再输入一次
上述指令会建立密码文件 /var/http.pw 并加入使用者 username。如果您还要再加入第二个使用者,不需要加参数 -c。
接着,我们使用使用浏览器连到该目录时,将出现下列画面:
图 14-3
[img]http://homepage.cqwu.net/wxfy/images/ch14_03.png[/img]
此时输入你设定的使用者名称及密码即可。若输入的账号密码正确,即可正常看到该目录的内容,否则在输入三次错误之后,将出现禁止存取的页面。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
在您通过身份认证后,浏览器会自动将身份认证的数据暂存起来,以便下次联机时使用。所以在通过认证后,您不会每次要连受保护的目录时都要输入账号密码。如果您将浏览器关闭后,下次再连到该页面时,才会再被要求输入密码。
14.3 虚拟主机
如果您想要使用一台主机管理多个不同名称的网页,例如,[url]www.alexwang.com[/url] 及 [url]www.twbsd.org[/url] 全都连到同一台服务器,我们可以经由 Apache 虚拟主机的功能,让不同的网址秀出不同的网页内容。其本上,就是在一台机器上设定多个主机名称或 IP,并依不同名称来决定其根目录所在。当使用者联机到我们的主机时,每一个不同的名称所看到的根目录都不同。
要达到这样的功能,我们必须先确定主机有多个 DNS 名称,这样别人打该主机名称才会对应到你的 IP。假设你的主机 IP 是 111.222.78.9 ,上面有二个主机名称,一个是 [url]www.abc.com[/url],另一个是 [url]www.cde.net[/url]。您必须先在 DNS 中设定让这二个主机名称都可以对应到 11.22.78.9 这个 IP。
在确认 DNS 设定没问题后,我们就可以开始设定 Apache 虚拟主机的功能了。请编辑 httpd.conf,在虚拟主机的部份加入下列设定:
# 设定使用名称的虚拟本机
NameVirtualHost *:80
# 设定 [url]www.abc.com[/url] 的管理者账号、存放网页的目录及log 所在
        ServerAdmin [email]jack@abc.com[/email]
        DocumentRoot /home/www/abc
        ServerName [url]www.abc.com[/url]
        ErrorLog /var/log/abc_error.log
        CustomLog /var/log/abc_access.log common
# 设定 [url]www.cde.com[/url] 的资料
        ServerAdmin [email]tom@cde.net[/email]
        DocumentRoot /home/www/cde
        ServerName [url]www.cde.net[/url]
        ErrorLog /var/log/cde_error.log
        CustomLog /var/log/cde_access.log common
做完上面的设定后,就可以重新启动 Apache 了。如果你还有别的 Domain Name 指向 111.222.78.9 的话,例如 [url]www.fgh.org[/url] ,但你并未设定其 Virtual Host 数据,Apache 将以第一个设定的 Virtual Host 数据为主。在这个范例里,当你打 [url]www.fgh.org[/url] 会连到 [url]www.abc.com[/url] 的设定。
必须要注意的是,有些客户端的联机软件并不支持 Name-Based 的虚拟主机,要支持 name-based virtual host,客户端必须送出 HTTP 的标头,也就是浏览器必须支持 HTTP/1.1。不过,请放心,我们常用的 IE、Netscape、lynx 都有支援。
14.4 网页记录分析
在我们将所制作好的网页放在网页服务器之后,我们会想知道每一个网页的浏览次数、使用者的停留时间等等,以做为改善网页的依据。这些信息都可以从 Apache 的联机记录文件中获得,但由于 Apache 的联机记录中,只有一笔一笔使用者浏览网页的记录,我们需要使用一些工具来分析记录文件,让这些记录文件能更易于阅读。
本章将介绍 Webalizer 这套软件。Webalizer 会读取 Apache 的联机记录文件,并将分析结果存成网页,让我们可以经由网页的图形更轻松的了解每一个页面的使用情形。由于 Webalizer 所进行的分析是经由读取 log 档,因此 log 文件的数据越多,分析出来的结果也就越详尽。
我们使用下列指令安装 Webalizer:# cd /usr/ports/www/webalizer
# make install clean
在安装完 Webalizer 之后,我们必须先做一些简单的设定。在 /usr/local/etc/ 有一个 Webalizer 的设定文件范例 webalizer.conf-dist,我们先将它复制一份再开始编辑:# cp /usr/local/etc/webalizer.conf-dist /usr/local/etc/webalizer.conf
# ee /usr/local/etc/webalizer.conf
以下我们将一一说明此设定档的内容,如果您想要更改其中的设定,请将该行开头的井字号移除再开始修改:
# 设定 Apache 联机记录文件的位置。
#LogFile        /var/lib/httpd/logs/access_log
LogFile        /var/log/httpd-access.log
# 设定 log 文件的型式,Webalizer 除了 Apache 外,还可以支持分析 FTP 软件
# 或 proxy 软件 squid 的 log 文件。LogType 预设的值是 'clf',表示分析
# 网页数据,你也可以设定为 ftp 或 squid。
#LogType        clf
# OutputDir 是我们想要输出分析数据的位置。请设定为网页根目录下的某一个
# 目录。例如我们的网页根目录是 /home/www,请先在该目录下建立一个子目录
# 名为 traffic,接着再设定 OutputDir 为 /home/www/traffic。
#OutputDir      /var/lib/httpd/htdocs/usage
OutputDir      /home/www/traffic
# HistoryName 可以让我们设定 webalizer 所产生的历史记录文件的文件名。这个档
# 可以用来产生 主要的 HTML 页面 (index.html),我们不需要修改。
#HistoryName        webalizer.hist
# 由于我们可能会设定某一段时间自动将 Apache 的 log 压缩或删除。而
# Incremental 这个变量可以让我们在产生分析资料时,只更新增加的部份
# 而分析过的资料就不再分析,以免覆盖了旧有的资料。
#Incremental        no
Incremental        yes
# 若您设定 Incremental 为 yes,IncrementalName 可以让您设定目前增加
# 的分析数据存放位置。
#IncrementalName        webalizer.current
# ReportTitle 是分析结果网页的标题。在该标题后会加上您的主机名称。
#ReportTitle    Usage Statistics for
# 设定您的主机名称。
#HostName       localhost
# HTMLExtension 是所产生的 HTML 档的扩展名。
#HTMLExtension  html
# PageType 可以让您设定何种扩展名结尾的页面要加入分析数据。因为在
# log 文件中有一些图片,而这些图版我们并不希望加入分析数据中,或者我
# 们也可以增加 PHP 页面的分析数据。所以在这里,我们加上一行用来分析
# PHP 页面的设定。
PageType        htm*
PageType        cgi
PageType        php
#PageType        phtml
#PageType        php3
#PageType        pl
# 如果您希望只使用 https 才可以连到分析页面,则将 UseHTTPS 设为 yes。
#UseHTTPS       no
# DNSCache 可以设定 DNS 快取的文件名称,在分析数据时,可能会一直需要
# 做 DNS 的分析,这个档可以提高 DNS 查询的效率。
#DNSCache        dns_cache.db
# DNSChildren 可以设定要使用多少 process 来做 DNS 查询,预设是 0,表示
# 不查询,我们可以设定的值从 1 到 100。最好不要设太多,以免消耗太多系统
# 资源。
#DNSChildren        0
# HTMLPre 是用设定每个 HTML 档案开头第一行要插入的字,最长 80 个字符。
#HTMLPre
# HTMLHead 可以让我们设定 HTML 页面  中间要插入的字。最长
# 也是 80 个字符。
#HTMLHead
# HTMLBody 会取代在 HTML 页面中的   这个标签。可以让我们设定网页
# 的一些属性。最长也是 80 个字符。
#HTMLBody
# HTMLPost 会将设定的字符串插入 HTML 第一个  标签之后,最长也是 80 个
# 字。
#HTMLPost        
# HTMLTail 可以设定 HTML 页面的结尾所要插入的字符串。最长 80 个字符。
#HTMLTail
# HTMLEnd可以设定 HTML 页面的最后结尾所要插入的字符串。我们最少要有
#  和  这二个标签,最长 80 个字符。
#HTMLEnd
# Quiet 可以让我们设定在分析时是否要输出讯息,因为我们会使用 crontab
# 定时执行,所以不要输出分析过程的讯息比较好。
Quiet                yes
# ReallyQuiet 可以设定档有错误产生时,是否要输出讯息。
#ReallyQuiet        no
# TimeMe 可以设定在分析之后是否要输出时间。
#TimeMe                no
# GMTTime 可以设定是否要使用 GMT (UTC) 时间而非本地时间。
#GMTTime                no
# Debug 可以设定是否要输出除错讯息。
#Debug                no
# FoldSeqErr 可以让 Webalizer 忽略读取 log 档的错误。
#FoldSeqErr        no
# VisitTimeout 可以设定 session 的到期时间,默认值是 30 分钟。
#VisitTimeout        1800
# IgnoreHist 请保持 no。
#IgnoreHist        no
# Country Graph 是用来显示分析资料中关于国家的统计资料是否要显示。
#CountryGraph        yes
# DailyGraph 及 DailyStats 是设定是否显示每日分析资料。
#DailyGraph        yes
#DailyStats        yes
# HourlyGraph 是 HourlyStats是设定是否显示每小时分析资料。
#HourlyGraph        yes
#HourlyStats        yes
# GraphLegend 是设定是否要显示彩色图表。
#GraphLegend        yes
# GraphLines 是用来设定图表的网格线数量,最多 20。
#GraphLines        2
# "Top" 的选项是每一个分格表格中,要显示多少笔前几名的资料。
#TopSites        30
#TopKSites       10
#TopURLs         30
#TopKURLs        10
#TopReferrers    30
#TopAgents       15
#TopCountries    30
#TopEntry        10
#TopExit         10
#TopSearch       20
#TopUsers        20
# The All* 可以让我们显示所有 log 文件中有记录的数据,而非只有前几名而
# 已。如果设定了某一个 All 的选项,webalizer 将会为该设定新增一个页面。
#AllSites        no
#AllURLs        no
#AllReferrers        no
#AllAgents        no
#AllSearchStr        no
#AllUsers       no
# Webalizer 会自动使用让网址 /somedir/ 可以连结到 /somedir/index.htm
# 如果你想要设定让除了 index. 结尾的网址有此效果外,还要让其它网
# 址也有同样效果,您可以在此设定。
#IndexAlias     home.htm
#IndexAlias        homepage.htm
# Hide*, Group*, Ignore* 及Include* * 可以设定让 Webalizer 忽略
# log 中的关键词,让 log 中某些记录不要被加入分析数据中。例如
# 有的搜寻引擎会自动连到您的网页来找数据,您可以设定忽略这样的
# 联机。请自行参阅说明。
… 略 …
# End of configuration file...  Have a nice day!
接着我们必须依您的设定在网页根目录中建立一个数据夹以储存 Webalizer 所产生的图表,假设我们的网页根目录是 /home/www,并在其目录下建立一个子目录名为 traffic:# mkdir /home/www/traffic
紧接着我们就可以使用下列指令来产生统计图表:# /usr/local/bin/webalizer
因为我们在 webalizer.conf 中设定了所要使用的 apache 使用记录的文件名及所产生的图表存放位置,所以在执行 webalizer 时不必再加任何参数。如果您想指定使用其它的联机记录文件来做分析,您可以在指令后面加上该记录文件的文件名,例如:# /usr/local/bin/webalizer /var/log/httpd-access.log
产生了图表之后,我们就可以使用浏览器输入 [url]http://www.mydomain.com/traffic[/url] 连到该网页。连到该页面后,您可以看到下列画面:
图 14-5
[img]http://homepage.cqwu.net/wxfy/images/ch14_05.png[/img]
我们可以看到八月份每天平均有 294 人造访,该月共有 7945 人。点选了该月份后,可以再看该月份更详细的数据。例如,一天中哪一个时间最多人造访、哪一个网页最点选最多次、使用者来源、进到本网站后第一个看的页面是什么等等。下图为最常被点选的页面统计:
图 14-6
[img]http://homepage.cqwu.net/wxfy/images/ch14_06.png[/img]
最后,为了让分析图表能定时自动更新,我们可以使用 crontab 每小时定期执行一次分析。# crontab -e
13      *       *       *       *       /usr/local/bin/webalizer
在上述的 crontab 的设定中,我们让系统在每小时的第 13 分时执行一次 webalizer,您也可以依您的需求调整更新的时间。存盘离开之后,crontab 会自动加载新的设定,如此一来我们就可以随时拥有最新的统计信息了。
14.5 MRTG 流量分析
我们除了可以使用 Webalizer 来了解网页内容的使用情形外,网站管理者还必须知道目前网站频宽是否足够。如果您想要知道网站流量的使用情形,我们可以安装 MRTG 这套软件经由网页来监看网络流量。MRTG 会去收取 SNMP (Simple Network Management Protocol) 所产生的数据,因此所要记录的机器必须要安装 SNMP。在你的主机上安装 MRTG 后,你不仅可以收集自己的流量数据,也可以收集局域网络上其它可以接收到的 SNMP 数据。
14.5.1 安装 SNMP
在安装 MRTG 之前,我们先使用 ports 来安装 SNMP:# cd /usr/ports/net-mgmt/net-snmp
# make install clean
安装完成后,我们必须要先新增一个可以读取 SNMP 信息的 community name。所谓的 community name 是一个明码的字符串,我们可以将它视为 management station 和 agent 之间的密码,是 MRTG 和 net-SNMP 沟通时必须要先传送的字符串。我们可以依不同的网域或主机给予不同的权限,依 community name 的设定来决定不同权限。
一个网络组件可以有多个 community name,一般 SNMP Agent 所预设公开的 community name 是 public。我们不一定要将 community name 设定为 public,因为 public 是一般 SNMP 的默认值,为了安全的问题,我们不将它设为 public。这里我们将设定 community name 为 mrtg,而且只有 read only 的权限。
要设定 community name 请先新增一个文字文件 /usr/local/share/snmp/snmpd.conf 并加入下列设定:
rocommunity     mrtg
syslocation     Office
syscontact      [email]alex@alexwang.com[/email]
上述设定中,mrtg 为只读的 community name,Office 是您机器所在位置,而 syscontact 所接的字符串是您的 Eamil。另外,我们还必须在 /etc/rc.conf 中加入下列这一行:
snmpd_enable="YES"
接着,请使用下列指令启动 SNMP:# /usr/local/etc/rc.d/snmpd.sh start
14.5.2 安装 MRTG
我们使用 ports 来安装 MRTG:# cd /usr/ports/net-mgmt/mrtg
# make install
接着要产生 MRTG 的设定档# cd /usr/local/etc/mrtg
# rehash
# cfgmaker [email]mrtg@alexwang.com[/email] >mrtg.cfg
这里的 mrtg 是我们在安装 net-snmp 时所设定的值。如果你使用错的 community name,你可能会从要记录的设备上得到错误响应。而 alexwang.com 是你所要记录的主机位置。mrtg.cfg 就是所要产生的设定档名。
如果您想要记录多个主机,只要在 cfgmaker 时多加入主机名称即可,例如:# cfgmaker [email]mrtg@alexwang.com[/email] [email]public@ftp.alexwang.com[/email] >mrtg.cfg
这样就会同时记录上面二台主机的流量了。
产生基本的设定档后,我们可以再编辑刚才产生的设定档 ee mrtg.cfg,在档案开头的部份加入一些客制化的设定:
# 如果要使用中文的 MRTG 则加入下面这一行
Language: big5
# 设定你的 MRTG 要放在哪个目录,应该要放在网页可以
# 连结到的地方,我的网页根目录是 /home/www,所以我将
# MRTG 放在下面的目录。
WorkDIR:/home/www/mrtg
# 预设的 MRTG 所产生的图时间是由右到左
# 我喜欢由左到右,故加入下面这一行
Options[_]: growright
接着请建立一个你在 mrtg.cfg 中设定的 WorkDIR 的目录:# mkdir /home/www/mrtg
然后使用指令 indexmaker 来建立 MRTG 的首页:# indexmaker -title '流量统计' -output /home/www/mrtg/index.html mrtg.cfg
这里的参数 -title 是该 index.html 档的 title,而 -output 就是要输出的档案位置,预设是stdio(通常指的是屏幕) 。
输出的档案 index.html 你也可以使用其它的网页编辑软件再去修改美化它。接下来要将 MRTG 的一些图片文件复制到 mrtg 的目录里:# cd /usr/ports/net-mgmt/mrtg/work/mrtg*
# cd images
# cp * /home/www/mrtg/
最后执行 MRTG:# /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg.cfg
第一次执行上面的指令可能会有一些错误讯息,不要理它,因为是第一次执行 mrtg,所没有一些旧的图,只要再多执行几次就好了。没问题之后,使用指令 crontab -e 来让上述指令每 5 分钟执行一次,加入下面这一行:
*/5    *    *    *    *    /usr/local/bin/mrtg  /usr/local/etc/mrtg/mrtg.cfg
现在你可以使用 [url]http://yourserver/mrtg[/url] 来连去看看。
图 14-7
[img]http://homepage.cqwu.net/wxfy/images/ch14_07.png[/img]
最后别忘了移除安装过程的暂存档:# cd /usr/ports/net/mrtg/
# make clean

逍遥 发表于 2006-6-5 15:20

第十五章 FTP 服务器
FTP (File Transfer Protocol) 是常用的网络协议,主要的功能是用来传输档案,我们时常从 FTP 站台下载档案。本章将介绍如何使用 FreeBSD 架设 FTP 服务器,并说明各种 FTP 服务器的管理技巧。本章除了 FreeBSD 内附的 FTP 服务器软件外,并将介绍笔者开发的 SmbFTPD。读完本章后,您将进一步了解下列主题:
FTP 协定的运作方法。
如何使用 FreeBSD FTP。
加强权限控制以建立安全的 FTP 服务器。
安装设定 SmbFTPD。
如何使用具 SSL 加密的 FTP。
如何进行流量控制。
15.1 FTP 概论
FTP 是一个历史悠久的网络通讯协议,和大多数的网络协议一样,它采用 Client/Server 架构,各地的使用者可以经由网络连到服务器上传或下载档案。FTP 协议比较特别的地方在于它在使用时必须建立二个联机:一个用来传输指令、一个用来传输档案。
图 15-1
[img]http://homepage.cqwu.net/wxfy/images/ch15_01.png[/img]
当我们使用 FTP 软件连到 FTP 服务器时,客户端会先连到服务器的连接埠 21,并建立一条「控制联机」(Control Stream)。接下来,您会输入账号、密码等指令,这些指令及 FTP 的响应都是使用都是使用「控制联机」。当您要下载档案时,或者是执行 ls 以列出目录中的档案时,档案或目录列表的下载是经另一个联机「数据联机」(Data Stream)。「数据联机」和「控制联机」不同的是数据联机所传输的数据比较大,而控制联机只是用来传输指令及简单的响应。
基本上,一个完整的 FTP 联机建立过程为:
客户端打开自已机器大于 1024 的连接埠,并连到服务器的连接埠 21,建立「控制联机」。
客户端开始对服务器下指令,告诉服务器客户端用来传输档案的连接埠为何。
服务器从连接埠 20 连到客户端所开放的埠号 (大于 1024),以建立「数据联机」。
上述这种联机建立的方式是由服务器主动建立「数据联机」,我们称之为「主动模式」(Active Mode)。基本上主动模式的运作在没有防火墙或 NAT 的情形下没有什么问题,但若客户端有防火墙,则可能会无法建立联机。
图 15-2
[img]http://homepage.cqwu.net/wxfy/images/ch15_02.png[/img]
因为「控制联机」是由客户端主动连到服务器,所以在客户端有防火墙或 NAT 时,还是可以连到服务器。接下来在建立「数据联机」时,客户端会从「控制联机」中告诉服务器它的 IP 及埠号,请服务器连过来。但是由于客户端有防火墙,所以服务器要连到客户端时会失败,而无法建立联机。
基本上,如果客户端使用的是 FreeBSD 的 NAT 不会有这种问题,FreeBSD 会自动做转换,但若是使用其它的防火墙就不一定可以支持 FTP 的 Active Mode。
何谓 Passive Mode
要解决 FTP Active Mode 的问题,可以在联机时改用「被动模式」(Passive Mode)。所谓的被动模式就是由服务器打开一个连接埠,被动地等客户端连过来建立「数据联机」。被动模式的联机建立过程为:
客户端打开自已机器大于 1024 的连接埠,并连到服务器的连接埠 21,建立「控制联机」。
客户端开始对服务器下指令,告诉服务器进入「被动模式」。
服务器打开一个大于 1024 的连接埠,等待客户端的联机。
客伺端打开自已机器大于 1024 的连接埠,并连到服务器以建立「数据联机」。
图 15-3
[img]http://homepage.cqwu.net/wxfy/images/ch15_03.png[/img]
由于控制联机及数据联机都是由客户端主动连过去服务器,如此即可避开防火墙及 NAT 的问题。我们来看看如何判断联机失败是否因为主动模式的原因:# ftp ftp.freebsd.org
Trying 204.152.184.73...
Connected to ftp.freebsd.org (204.152.184.73).
220 Welcome to freebsd.isc.org.
Name (ftp.freebsd.org:alex): anonymous
331 Please specify the password.
Password:
230-
230-You have reached the freebsd.isc.org FTP server, serving the
230-full FreeBSD FTP archive over IPv4 (204.152.184.73) and IPv6
230-(2001:4f8:0:2::e) networks. This server is also known as:
230-
230- ftp.freebsd.org
230- ftp4.freebsd.org
230- ftp4.us.freebsd.org
230-
230-This server is operated by Internet Systems Consortium (ISC),
230-on behalf of the FreeBSD Project, with hardware donations from
230-Apple, Intel and Iron Systems.
230-
230-Questions about this service can be sent to: [email]freebsd@isc.org[/email].
230-
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
^C
ftp> passive
Passive mode on
ftp> ls
227 Entering Passive Mode (204,152,184,73,54,200)
150 Here comes the directory listing.
drwxrwxr-x 3 0 0 512 Apr 17 2003 pub
226 Directory send OK.
ftp>
当您登入一台 FTP 服务器后,如果您输入 ls,却等了很久都没有响应,您可以输入 +C 以中断命令。接着输入 passive 以进入被动模式,再打 ls 就可以看到目录内容,则无法联机的问题一定是主动模式的原故。
15.2 设定 FTP 服务器
FreeBSD 内建有 FTP 服务器的功能,如果您要使用内建的 ftpd,我们不需要特别进行任何安装的动作,只要做好设定即可。本小节中,我们将介绍如何设定启动 FTP 服务器的功能,并进行一些基本的配置。
15.2.1 启动 FTP 服务器
我们有二种方式启动 ftpd,一种是使用 standalone daemon,另一种是使用 inetd。inetd 是 UNIX 系统中一个强大的「超级服务器」,我们可以使用它来管理许多系统服务,例如 telnet、ssh、ftp 等。大部份的系统服务都是使用 inetd 来启动,使用它的好处在于可以统一管理各种服务,并经由它来设定服务规则,例如是否要阻挡某些 IP 来源等。不过,使用 inetd 的方式缺点是每次有联机要求时,inetd 的 daemon 必须依联机的种类去执行相对映的指令,所以速度比较慢。
另一种启动 FTP 的方式是使用 standalone daemon,也就是直接执行 FTP daemon,当它接收到新的联机时,就 fork() 出来处理,这种方式联机建立的速度较快,比较适合专门的 FTP 服务器。
使用 inetd
我们先来介绍如何使用 inetd 的方式启动 FTP 服务器。首先,请编辑 /etc/inetd.conf,将 ftp 设定开头的 # 移除:
ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l
ftp     stream  tcp6    nowait  root    /usr/libexec/ftpd       ftpd -l
接下来,我们必须使用下列指令重跑 inetd:# kill -1 `cat /var/run/inetd.pid`
现在您就可以开始使用 FreeBSD 的 FTP 服务了。
使用独立 Daemon
如果您要以独立的 daemon 方式启动 FTP,请先确定在 inetd.conf 中没有启动 FTP 服务。接下来,请在新增一个档案 /usr/local/etc/rc.d/ftpd.sh 内容如下:
#!/bin/sh
ftpd_program="/usr/libexec/ftpd"
ftpd_flags="-D -l"
case $1 in
start)
        echo "Starting FTPD"
        $ftpd_program $ftpd_flags
;;
stop)
        echo "Stopping FTPD"
        killall ftpd
;;
restart)
        $0 stop
        sleep 1
        $0 start
;;
esac
编辑完后,我们必须将该档案变成可执行:# chmod 755 /usr/local/etc/rc.d/ftpd.sh
接下来,您就可以使用下列指令启动 FTPD 了:# /usr/local/etc/rc.d/ftpd.sh start
如果您要停止 FTPD 服务,则使用下列指令:# /usr/local/etc/rc.d/ftpd.sh start
15.2.2 编辑欢迎讯息
当我们联机到一个 FTP 站台时,我们可以看到二个欢迎讯息,一个是登入前的讯息,另一个是登入后的讯息。以下列讯息为例:# ftp localhost
Trying ::1...
Connected to localhost.alexwang.com.
220- Welcome to My FTP Server.
220-
220- This is a welcome message
220-
220- Nice to see you.
220 vmware.alexwang.com FTP server (Version 6.00LS) ready.
Name (localhost:alex):
331 Password required for alex.
Password:
230- This is the message of the day.
230-
230- It will be shown after user login.
230 User alex logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
开头为 220- 的就是登入前的讯息,我们称它为欢迎讯息。以 230- 为开头的是登入后的讯息,我们称它为本日讯息 (Message of the day)。这二种讯息我们都可以自行设定。
如果您要设定的是登入前的讯息,请新增一个档案 /etc/ftpwelcome,并将您的讯息写入该文件中。以下为上述范例中的讯息内容:
Welcome to My FTP Server.
This is a welcome message
Nice to see you.
您不需要写 220- 等数据,FTP 服务器会自动帮您加上这种代码。而登入后的讯息是存放在 /etc/ftpmotd,您可以编辑该档以进行设定。
15.2.3 FTP 服务器管理
在启动 FTP 服务器时,我们可以加入一些参数以调整服务器的行为。例如,修改预设的连接端口、记录使用者上传、下载的档案等等。有些参数必须要在使用独立的 daemon 方式启动时才有用,而有的参数在 inetd 模式下也可以使用。
下表为我们常用的参数:
[b]参数[/b]
[b]是否只能在 Daemon 模式下使用[/b]
[b]意义[/b]
-a

当您有二张网络卡或是二个 IP 时,我们可以设定只接受联机到某一个 IP 的联机要求。例如:
ftpd -D -a 192.168.0.1
此范例表示只接受使用者联机到 192.168.0.1 这个 IP。
-d

记录 FTP 的除错讯息。除了加入这个参数外,您必须修改 /etc/syslog.conf,并加入下列内容以记录 FTP 的讯息。
!ftpd
*.*                    /var/log/ftpd.log
-h

不要显示 FTP 服务器的主机名称、软件信息、版本等。
-l

记录 FTP 登入成功及失败的讯息。如果您使用二次 -l,则使用者上传、下载、删除、建立目录时都会留下记录。预设的记录会留在 /var/log/xferlog 中。
-P

我们知道 FTP 预设会监听连接埠 21,以接受客户端的联机要求。不过如果您是以独立的 daemon 方式启动 FTP,则 可以使用 -P 加上连接埠号以改变预设连接埠。
另外,还有很多用来控制使用者权限的参数,我们会在下一小节中说明。您也可以使用 man ftpd 以查看更多关于 ftpd 的参数。
如果您要修改 ftpd 启动的参数,在 inetd 模式下,您可以修改 /etc/inetd.conf,并在 ftp 设定的最后面加入参数,如下列粗体字所示:
ftp  stream  tcp     nowait  root   /usr/libexec/ftpd    [b]ftpd -l -l -d[/b]
ftp  stream  tcp6    nowait  root   /usr/libexec/ftpd    [b]ftpd -l -l -d[/b]
上面的范例中,我们多加入了参数 -l -d,以记录更多 ftpd 的讯息。
如果您是以独立的 Daemon 方式启动 ftpd,则请修改 /usr/local/etc/rc.d/ftpd.sh:
#!/bin/sh
ftpd_program="/usr/libexec/ftpd"
ftpd_flags="[b]-D -l -l -d[/b]"
...
我们只要修改 ftpd_flags 的部份,加入您所要的参数即可。
15.3 FTP 权限控制
预设的 FTP 启动后,使用者可以上传、下载任何他们有权存取的档案。在登入后,使用者可以进到任何系统中的目录 (如果目录权限允许的话)。本小节将告诉您一些 FTP 读写权限的控制,让您可以更进一步控制服务器的系统安全。
15.3.1 限制账号与联机来源
我们可以设定限制某些账号不可以使用 FTP 登入。使用者在登入 FTP 服务器时,有几个规则会拒绝该账号登入:
如果 /var/run/nologin 存在,则所有账号都不可以登入。这个档案可以用来暂时停止 FTP 服务。
使用者一定要有密码才能登入,没有密码的使用者无法登入。
使用者名称不可以出现在 /etc/ftpusers 中。
使用者群组不可以出现在 /etc/ftpusers 中。
使用者所使用的 shell 必须要时合法的 shell。合法的 shell 会被定义在 /etc/shells 中。
除了匿名模式外,使用者名称不可以是 ftp 或 anonymous。关于匿名模式,我们会在下一小节中说明。
/etc/ftpusers 定义了不可以使用 FTP 服务的使用者及群组。我们来看一下该档案的内容:
# $FreeBSD: src/etc/ftpusers,v 1.13 2004/06/30 16:47:08 maxim Exp $
#
# list of users disallowed any ftp access.
# read by ftpd(8).
root
toor
daemon
operator
bin
tty
kmem
games
news
@guest
...
我们可以看到该档案中已经有一些使用者不可以登入 FTP。这些使用者都是系统预设的账号,我们也可以经由修改它来加入其它使用者。
在 /etc/ftpusers 中,如果开头是 "@" 表示群组名称。例如上述档案内容中的 @guest 表示群组 guest 不可以登入系统。
除了控制使用者账号外,在「inetd」模式下,我们还可以控制联机来源。所有 FreeBSD 中由 inetd 所启动的服务都可以经由修改 /etc/hosts.allow 以使用 TCP Wrappd 来限制联机来源。下列为预设的 /etc/hosts.allow 内容:
# Provide a small amount of protection for ftpd
ftpd : localhost : allow
ftpd : .nice.guy.example.com : allow
ftpd : .evil.cracker.example.com : deny
ftpd : ALL : allow
如果我们要限制某几个 IP 或网域不能使用 FTP,可以使用下列范例:
# Provide a small amount of protection for ftpd
ftpd : localhost : allow
ftpd : 210.122.13.5 : deny
ftpd : .evil.cracker : deny
ftpd : ALL : allow
我们在上述范例中拒绝 IP 210.122.13.5 及 evil.cracker 网域的主机使用 FTP,并在最后一行设定其它来源都许可。
如果您要设定只有某些来源可以使用 FTP,而拒绝大多数的主机,则可以设定:
# Provide a small amount of protection for ftpd
ftpd : localhost : allow
ftpd : 192.168.0. : allow
ftpd : my.friend.com : allow
ftpd : ALL : deny
我们设定了只有本机 (localhost)、192.168.0.x、及 my.friend.com 才可以使用 FTP,其它联机都拒绝。
15.3.2 限制上传下载权限
在使用者登入后,只要目录、档案权限许可,它们可以自由的上传、下载档案。如果您希望加以限制读写的权限,可以在启动 FTP 时加上下列几个参数:
[b]参数[/b]
[b]意义[/b]
-o
限制所有使用者只能上传档案,而无法下载任何档案。
-r
限制所有使用者对于服务器内所有档案只能只读,不可以建立目录、上传、更改档名、或任何会动到档案目录的指令。
上述的参数必须在启动 FTP 服务器时指定,请参考15.2.3 一节,针对 inetd 及独立的 Daemon 有不同的设定方法。
15.3.3 chroot
一般使用者登入后,预设会进入自己的家目录中。使用者可以改变工作路径到系统的任何目录中。如果您希望使用者登入后只能在自己的家目录中活动,而不能进入其它系统目录中,可以使用 chroot 的功能。
所谓的 chroot 就是将某一个目录变成使用者看到的根目录。例如,我们让使用者 alex 登入后,将 /home/alex 变成根目录。则 alex 在使用指令「cd /」时,还是会停留在 /home/alex。如果他使用指令「pwd」查看目前所在路径,则会显示 /。如此一来,我们就可以确保使用者不会到处乱跑,进入一些不该进入的地方。这个功能对于提升 FTP 的安全性有莫大的助益。
设定 chroot 的方法很简单,只要修改 /etc/ftpchroot 即可。chroot 的设定是以使用者、群组的基础,以下是几个设定范例:
alex
@guest
john /var/ftp
@other /var/ftp
上述范例中的第一行是设定使用者 alex 登入后,以自己的家目录为根目录。第二行的 @guest 表示只要是群组为 guest 的使用者,都以自己的家目录为根目录。而第三、四行分别表示使用者 john 及群组 other 都以 /var/ftp 为根目录。
只要我们善用 chroot 的功能,就可以加强保护系统其它目录,让没有权利的使用者不可以进入系统目录中。建议您在开放 FTP 服务时,将所有使用者都加入 /etc/ftpchroot 中。
15.3.4 匿名的 FTP
我们平常在登入 FreeBSD 的 FTP 站台时,可以使用 anonymous 或是 ftp 这二个使用者登入,而且在登入时,任何密码都可以通过。这种可以使用 anonymous 登入的 FTP 就叫作匿名 FTP。anonymous 及 ftp 这二个账号是预设的匿名账号,当使用者以匿名登入时,服务器会将匿名账号对映到系统内的真实使用者 ftp。所以,如果您要提供匿名的 FTP 服务,请使用下列指令新增使用者账号 ftp:# pw adduser ftp
# mkdir /home/ftp
# chown ftp:ftp /home/ftp
我们建立了使用者 ftp 及其家目录 /home/ftp。使用 pw 指令所建立的使用者在 /etc/master.passwd 中的密码字段预设为 *,表示不可以登入。这个使用者除了匿名 FTP 外,将不可以使用 telnet、SSH、或是其它服务。
在新增了使用者 ftp 之后,我们就已经支持匿名 FTP 的功能了。现在您可以使用 anonymous 或 ftp 账号登入,而且不需任何密码。由于开放了匿名 FTP 后,任何人都可以登入系统,所以匿名账号登入后一定会使用 chroot,以将匿名使用者限制在家目录中。
除了强制使用 chroot 外,我们还可以在启动 FTP 时加上一些参数,以针对匿名使用者进行更多的限制。下表为启动 FTP 服务时可以使用的参数:
[b]参数[/b]
[b]意义[/b]
-M
禁止匿名使用者建立新的目录。
-m
允许匿名使用者覆写一个存在的档案。预设启动 FTP 时,并不允许匿名使用者覆写已经存在的档案。当使用者上传档案时,如果已经有同档名的档案存在,系统会自动为上传的档案改名。
-O
让匿名使用者只能上传档案,下载档案的功能会被取消。
匿名使用者权限除上表中的几个参数外,一样可以使用 -r、-o 等用来控制一般使用者权限的参数来控制匿名使用者。
匿名的 FTP 服务器可以说是危险的开始,如果您没有对匿名的使用者进行权限控制,在开于匿名 FTP 后,将会产生许多安全性的问题。最常见的就是您的 FTP 服务器会被做为档案交流的跳板或是病毒的集散地。例如,当您的匿名 FTP 站台允许使用者上传、下载档案时,一定会有人将自己的档案上传到您的服务器中,并告诉其它人可以到您的服务器中下载档案。此时,您的服务器莫名其妙就会变成别人的服务器,任何人都可以用您的服务器、网络频宽来分享档案。所以,在匿名模式下,最好还是在启动 FTP 时加上参数 -r 以取消上传的功能吧。
15.4 SmbFTPD
SmbFTPD 是笔者从 FreeBSD 5.4 的 FTP daemon 修改而成的软件。FreeBSD 内建的 FTP 服务器比较简单,它不支持流量控制、不支持 SSL 加密、对中文档名的支持也比较差。例如,您无法使用「许」、「功」等中文字。SMbFTPD 除了拥有原本 FreeBSD ftpd 所有功能外,还有更多使用者权限控制、支持特殊中文字、整合设定文件路径及更多功能。另外,它也支持 SSL/TLS 加密的功能,该功能是由 BSDftpd-ssl 移植而来。
SmbFTPD 和一般 FTP daemon 最大的不同在于它使用类似 Samba 的数据夹权限设定,您可以设定让 FTP 使用者登入后所看到的目录跟使用 Windows 登入 Samba 时一模一样。也就是说 FTP 登入的使用者对于数据夹的存取权限和使用 Windows 登入 Samba 一模一样。
而您也可以将 SmbFTPD 做为一般 FTP daemon 使用,或同时支持 Samba 模式。FreeBSD 的 FTP daemon 本来效能就很好,修改过的 SmbFTPD 效能也十分优越,而且程序文件本身体积很小。
效能优越。
档案很小 (约 70KB),占用内存空间小。
支援 SSL/TLS 加密。
可以更改 port。
针对使用者、群组做流量控制。
针对使用者、群组设定 chroot 的路径。
类似 Samba 的数据夹权限,可以针对目录设定使用者的读写权限。
限制 FTP 指令的使用,如上传、下载等。
匿名使用者登入。
诸多匿名使用者的权限控制。
同时支持 Samba 权限控制模式及一般 FTP 模式。
可以拒绝某些使用者 "ls" 出某一个 share 下的档案。
可以拒绝某些使用者下载档案或是修改已存在的档案。
可以让某个数据夹处于只能上传的模式。
15.4.1 安装 SmbFTPD
您可以到
[url=http://www.twbsd.org/cht/smbftpd/index.php]http://www.twbsd.org/cht/smbftpd/index.php[/url]
下载最新版的 SmbFTPD,下载 SmbFTPD 后,解压缩后进行该目录。接着您就可以执行下列指令进行编译:# ./configure
# make
configure 指令会侦测您的系统,并依您的环境以决定编译时所要加入的功能。例如,是否支持 IPv6、SSL/TLS、TCP Wrapper、或是 PAM 等。
编译完成后,如果您支持 SSL/TLS,您必须有 SSL 凭证。如果您有安装 Apache+SSL,您也可以和 Apache 共享它的凭证。如果您要产生凭证,您必须再执行下列指令以产生凭证。# make cert
执行上述指令后,我们会先产生一个根凭证,再产生 FTP 所使用的凭证,接着再用我们产生的根凭证为 FTP 用的凭证签章。全部都完成后,我们就可以使用下列指令来安装:# make install
和 FreeBSD 内建的 FTP 服务器一样,SmbFTPD 可以使用 inetd 或是独立的 Daemon 方式启动。如果您要使用 inetd 的方式启动 SmbFTPD,请修改 /etc/inetd.conf 并加入下列内容:
ftp     stream  tcp     nowait  root    /usr/local/sbin/smbftpd smbftpd
接下来请执行下列指令重跑 inetd:# kill -1 `cat /var/run/inetd.pid`
如果您要以独立的 Daemon 方式启动 SmbFTPD,请先在 /etc/rc.conf 加入下列这一行,以在开机时启动 SmbFTPD:
smbftpd_enable="Yes"
接下来就可以使用下列指令看看是否能启动 SmbFTPD:# /usr/local/etc/rc.d/smbftpd.sh start
如果您要停止 SmbFTPD:# /usr/local/etc/rc.d/smbftpd.sh stop
SmbFTPD 是由 FreeBSD 的 FTP Deamon 改写而成,所以有些设定和 FreeBSD 的 FTPD 相同。例如登入前及登入后的讯息可以经由设定 /etc/ftpwelcome 及 /etc/ftpmotd 这二个档来达成。另外,您也可以设定 /etc/hosts.allow  以限制联机来源。不同的是,不管是以独立的 Daemon 或是 inetd 方式启动 SmbFTPD,都可以使用 hosts.allow 的功能。
另外,SmbFTPD 将所有设定项目放在 /usr/local/etc/smbftpd/smbftpd.conf 中,您可以经由修改它来客制化您的服务器。经由修改 smbftpd.conf,您可以设定使用不同的连接埠、更改服务器名称、设定最大联机数目、目录权限、流量控制、SSL 设定等等。
下列几个小节中,我们将介绍一些比较特别的设定,关于更多选项及其详细的设定请参考 smbftpd.conf 一章中的说明。
15.4.2 限制登入账号
我们可以设定限制某些账号不可以使用 FTP 登入。使用者在登入 FTP 服务器时,除了账号密码要符合外,还有几个规则会拒绝该账号登入:
如果 /var/run/nologin 存在,则所有账号都不可以登入。这个档案可以用来暂时停止 FTP 服务。
如果 smbftpd.conf 中 EmptyPasswdLogin 没有设为 Yes,则使用者一定要有密码才能登入,没有密码的使用者无法登入。
使用者名称及群组不可以出现在 smbftpd.conf 中的 NoLoginList 中。
如果 smbftpd.conf 中 RequireValidShell 设为 Yes,则使用者所使用的 shell 必须要时合法的 shell。合法的 shell 会被定义在 /etc/shells 中。
我们可以看到在 smbftpd.conf 中有三个选项控制了使用者可以登入与否:EmptyPasswdLogin、NoLoginList、RequrieValidShell。 其中,NoLoginList 这个项目可以让我们设定不允许登入的使用者清单。
我们在安装了 SmbFTPD 后,即限制了某些系统使用者登入。我们来看一下该选项的内容:
NoLoginList root,toor,daemon,operator,lp,bin,tty,shutdown,kmem,...
这个项目中,每个使用者或群组都是使用逗号分开。如果一个项目的开头是 "@" 表示群组名称。例如 @guest 表示群组 guest 不可以登入系统。
15.4.3 限制上下传频宽
SmbFTPD 支持针对不同的使用者设定不同的上下传频宽限制。smbftpd.conf 中的 MaxDownloadRate 及 MaxUploadRate 控制了使用者上下传的频宽。
这二个选项可以重复设定多次,以支持多个使用者及群组。MaxDownloadRate 及 MaxUploadRate 的格式如下:MaxDownloadRate @group|user rate
其格式就是在选项后面加上群组或使用者名称,最后再加上频宽的限制,频宽是以 KB/s 为单位。如果是群组名称,其开头必须加上 "@"。我们来看看下列的设定范例:
MaxDownloadRate @group100 100
MaxDownloadRate ftp 20
MaxDownloadRate @friends 1000
我们可以看到目前有三个控制下传频宽的项目。第一个项目表示群组为 group100 的使用者,其下载频宽为 100 KB/s。第二个项目表示使用者 ftp 的下载频宽为 20 KB/s。如果您支持匿名的 FTP,匿名 FTP 使用者对于系统而言实质账号是 ftp,您只要针对 ftp 使用者做设定即可套用在匿名使用者 anonymous 及 ftp 上。
15.4.4 匿名的 FTP
我们平常在登入 FreeBSD 的 FTP 站台时,可以使用 anonymous 或是 ftp 这二个使用者登入,而且在登入时,任何密码都可以通过。这种可以使用 anonymous 登入的 FTP 就叫作匿名 FTP。anonymous 及 ftp 这二个账号是预设的匿名账号,当使用者以匿名登入时,服务器会将匿名账号对映到系统内的真实使用者 ftp。所以,如果您要提供匿名的 FTP 服务,必须先增加一个真实的使用者账号 ftp。
在新增了使用者 ftp 之后,我们还必须设定一下 smbftpd.conf 中关于匿名登入的项目。在 smbftpd 中,关于匿名 FTP 的项目有:AnonymousLogin、AnonymousOnly。
AnonymousLogin 控制了是否要启用匿名使用者登入的功能。如果 AnonymousLogin 设为 Yes,表示可以使用匿名使用者登入。另外,AnonymousOnly 控制了在允许匿名使用者登入后,是否还要允许一般使用者登入。如果 AnonymousOnly 设为 Yes,则只有匿名使用者才可以登入,一般使用者都不可以登入哦。
请注意,虽然匿名使用者登入的账号有二个:anonymous 及 ftp。但我们不管是在设定流量、目录权限时,都只要设定真实使用者 "ftp" 账号即可。
15.5 SmbFTPD 的目录权限控制
15.5.1 何谓 SMB Mode
SmbFTPD 和一般的 FTP 服务器最大的不同在于它的目录权限管理方式。SmbFTPD 有二种目录权限管理方式:一般模式及 SMB 模式。一般模式下,SmbFTPD 的行为就和一般的 FTP 服务器一样,使用者登入后可以看到所有的系统目录。
SMB 模式比较特别,它会依照您的设定产生一个虚拟的根目录,在根目录中,只会显示该使用者可以使用的资料夹。如果您使用过 Samba,SmbFTPD 的 SMB 模式就和 Samba 的共享数据夹设定类似。例如,您可以设定一个数据夹名为「音乐」,它的真实目录是在 /home/mp3,并可以设定哪些使用者可以存取此数据夹、只读或可擦写、是否可以下载档案等等。
以下列数据夹设定文件为例:
[音乐]
path = /home/mp3
rw = alex
ro = @guest, john
disable_download = ftp
[upload]
path = /var/ftp
rw = ftp,alex
disable_ls = ftp
disable_download = ftp
上述的范例中,我们有二个共享数据夹:「音乐」及「upload」。其中,path 为该数据夹位于系统中的真实目录。rw 为具有读写权限的使用者 清单,而 ro 为只读的使用者清单。在上述的设定下,使用者 alex 登入后,如果他在根目录中下「ls」指令,他将看到下列内容:
ftp> ls /
200 PORT command successful.
150 Opening ASCII mode data connection for 'file list'.
dr-x------ 1 root users 512  Feb  3 21:40 音乐
dr-x------ 1 root users 2048 Aug 28 03:18 upload
226 Transfer complete.
ftp>
我们可以看到使用者 alex 登入后,他所看到的根目录只有二个数据夹:「音乐」及「upload」。他的活动范围也将只限于这二个数据夹,而无法进入系统中的其它目录。也就是说,如果 alex 输入指令「cd /upload」则会进入「upload」这个数据夹中 (在系统中的真正路径是 /var/ftp)。
SMB 模式的好处在于您可以将不同目录集中设定成位于虚拟的根目录中,并针对这些目录设定不同使用者的权限。使用者权限可以是只读、可擦写、禁止下载档案、禁止看到目录中的档案内容,您甚至可以设定其一个资料夹为隐藏,「ls」时看不到该目录,但却可以「cd」进入目录中。
SMB 模式是一个比较有弹性的目录权限管理方式,您可以经由设定 SMB 模式达到多种不同的目录权限控制。
我们还可以让某些使用者使用一般模式,某些使用者使用 SMB 模式。这些设定十分容易,我们将在下一小节中做说明。
15.5.2 如何设定 SMB Mode
在 smbftpd.conf 中有三个选项和 SMB 模式的目录权限管理有关:DefaultMode、ExceptionList、ShareConfPath。
DefaultMode 设定了预设的目录权限管理模式为何,而 ExecptionList 为例外的清单。如果 DefaultMode 为 Normal,而 ExceptionList 中有使用者 alex,则除了 alex 会使用 SMB 模式外,其它使用者都会使用一般模式。反之,如果 DefaultMode 为 SMB,则 ExceptionList 中的使用者或群组将使用一般模式,其它的使用者会使用 SMB 模式的目录权限管理方式。
ShareConfPath 设定了共享数据夹设定文件的位置,预设为 /usr/local/etc/smbftpd/smbftpd_share.conf。每一个以中括号括起来的区段都是一个数据夹的设定,下列即为数据夹设定的范例:
[音乐]
path = /home/mp3
rw = alex
ro = @guest, john
disable_download = ftp
每一个资料夹的区段都有下列这几个关键词可用:
path:设定数据夹的实际路径。
rw:设定具有读写权限的使用者及群组。
ro:设定只能进行只读的使用者及群组。
disable_download:设定禁止使用下载功能的使用者及群组。
disable_ls:设定在数据夹中 ls 看不到数据夹内容的使用者及群组。
disable_modify:设定不可以修改此资料夹中已经在的档案之使用者及群组。在此项目中的使用者或群组无法更名、删除、修改已存在的档案或目录,只能上传及建立新目录。但前提是使用者必须具有 rw 的权限。
browseable:设定此数据夹在列出根目录的所有数据夹时是否要显示。这个项目只能设定 Yes 或 No,如果设定为 No,则使用者 「ls /」时将看不到此数据夹,但可以使用「cd」指令进入该数据夹内。
除了 path 及 browseable 外,每一个项目可以加上使用者及群组的设定。如果是群组名称,其开头必须加上 "@" 符号。例如,上述范例中,@guest 表示 guest 群组。
您必须要特别注意的是,当您设定了使用者对于数据夹的权限是只读或可擦写后,该使用者或群组在系统中的 UNIX 权限也必须要符合设定才会有作用。例如,如果一个数据夹对使用者 alex 设定为可擦写,您必须确定 alex 对于数据夹在系统中的权限是可擦写,如果不是,您必须使用 chmod 的指令改变该目录的属性。
另外,我们有一个特别的数据夹名称「homes」,如果有 homes 这个数据夹的设定,则使用者登入后会看到一个数据夹名为「home」,该数据夹即为使用者的家目录。家目录预设是该使用者具有读写的权限,所以您无法设定 rw、ro 这二个参数。而且,您也无法设定 path,使用者家目录的所在路径是由系统密码文件中的设定而决定。您只能设定 browseable、disable_ls、disable_modify、及 disable_download。
如果您的 SmbFTPD 支持匿名使用者,匿名使用者 anonymous 及 ftp 会被对映到真实的使用者 ftp,您只要针对 ftp 使用者做设定即会套用在匿名使用者上。
在修改了 smbftpd_share.conf 后,您必须重新启动 SmbFTPD 后设定才会生效。
15.5.3 设定范例
我们列举几个设定的范例让您参考。
范例一:
我们设定一个数据夹名为「public」,其真实路径是 /home/public。只有 wheel 群组的使用者具有读写权限,而匿名使用者及 guest 群组只具有只读的权限。
[public]
path = /home/public
rw = @wheel
ro = @guest, ftp
范例二:
我们设定一个数据夹名为「private」,其真实路径是 /home/movie。只有使用者 alex 具有读写的权限,而 friend 群组只能只读,另外,guest 群组的使用者无法下载该数据夹中的任何档案。
[public]
path = /home/movie
rw = alex
ro = @guest, @friend
disable_download = @guest
范例三:
我们设定一个数据夹名为「upload」,其真实路径是 /var/ftp/pub。只有使用者 alex 具有完整的读写权限,匿名使用者无法下载档案、看不到目录中的档案、无法修改目录中的档案、只能上传档案。
[upload]
path = /var/ftp/pub
rw = alex,ftp
disable_download = ftp
disable_modify = ftp
disable_ls = ftp
15.5.4 chroot
我们除了可以使用 SMB 模式以创造出虚拟的根目录外,SmbFTPD 还支持 chroot 的功能。
所谓的 chroot 就是将某一个目录变成使用者看到的根目录。例如,我们让使用者 alex 登入后,将 /home/alex 变成根目录。则 alex 在使用指令「cd /」时,还是会停留在 /home/alex。如果他使用指令「pwd」查看目前所在路径,则会显示 /。如此一来,我们就可以确保使用者不会到处乱跑,进入一些不该进入的地方。这个功能对于提升 FTP 的安全性有莫大的助益。
当一个使用者同时属于 SMB 模式及 chroot 时,我们会使用 chroot 而非 SMB 模式。
设定 chroot 的方法很简单,只要修改 smbftpd.conf,将使用者加入 ChrootSet 即可。ChrootSet 选项的设定是以使用者、群组的基础,我们可以同时设定多个 ChrootSet。以下是几个设定范例:
ChrootSet ftp /var/spool/ftp
ChrootSet @ftpgroup ~
ChrootSet @webusers ~/public_html
上述范例中的第一行是设定所有匿名的使用者都以 /var/spool/ftp 为根目录。第二行表示只要是群组为 ftpgroup 的使用者都以自己的家目录为根目录。而第三行表示只要是群组为 webusers 的使用者都以自己家目录下的 public_html 为根目录。
在 ChrootSet 的选项中,群组名称开头都会有 "@" 符号。而目录名称 "~" 表示是使用者的家目录。
另外,如果只有一个 "@" 符号,表示所有使用者。下列范例即表示所有的使用者都以自己的家目录为根目录:
ChrootSet @ ~
只要我们善用 chroot 的功能,就可以加强保护系统其它目录,让没有权利的使用者不可以进入系统目录中。
15.6 SSL/TLS 联机加密
15.6.1 设定启用 SSL/TLS
当我们使用网络服务时,经由网络传送的数据都有可能被他人拦截窃听。简单的说,当您从网页上输入账号密码时,如果有人在您所使用的计算机和服务器之间拦截,就可以轻易的从网络封包中窃听到您所输入的数据。
SSL 的加密方式是由服务器端提供了一组加解密用的金钥,在服务器端所使用的是私密金钥 (Private key),而客户端所使用的是公开金钥 (Public key)。在联机建立后,HTTP 服务器会将公开金钥传给客户端使用。公开金钥加密过的资料只能由私密金钥解密,在客户端要送出数据之前,会先使用公开金钥进行加密的动作,而服务器收到数据后,会使用私密金钥进行解密。
如果您的系统有安装 OpenSSL,则 SmbFTPD 安装后即支持 SSL 的功能。在下列 configure 的讯息中,「Check SSL support」为「YES」表示有支持 SSL。# ./configure
opie..................  [YES]
libutil.h.............  [YES]
O_EXLOCK..............  [YES]
FD_COPY...............  [YES]
TCP Wrapper...........  [YES]
Have printflike.......  [YES]
pw_expire.............  [YES]
bsd glob..............  [YES]
MD5File...............  [YES]
user_from_uid.........  [YES]
Shadow passowd........  [NO]
Linux sendfile........  [NO]
FreeBSD sendfile......  [YES]
Use PAM...............  [YES]
Check setproctitle....  [YES]
Check fgetln..........  [YES]
Check sin_len.........  [YES]
Check IPv6 support....  [YES]
[b]Check SSL support.....  [YES][/b]
Finished configure.
在执行完 configure 及 make 之后,即完成编译。在安装前,我们会执行「make cert」以产生 SSL 凭证。最后「make install」会将 SSL 凭证安装在 /usr/local/etc/smbftpd/ 目录中。
在启动 SmbFTPD 之前,您必须先设定 smbftpd.conf 以启用 SSL 功能。smbftpd.conf 中所有 SSL 相关的选项说明请参考下一章的说明,我们这里只说明几个常用的项目。
首先是「SecurityPolicy」,这个项目用来控制是否要启用 SSL 的功能。「secure」 为只允许使用 SSL 联机,「nosecure」 为不使用 SSL 联机,「both」 为二种联机都支持,预设为 「both」。
「NormalUserMustSecure」用来控制是否要强制一般使用者使用 SSL 联机。因为 SSL 主要是用来保护密码、个人数据,如果您强制将「NormalUserMustSecure」设为 Yes,则一般使用者一定要使用 SSL 才能登入。
「AnonymDisableSecure」用以控制匿名使用者是否要使用 SSL。当 AnonymDisableSecure 设为「Yes」时,系统将不允许匿名的使用者使用加密的联机。既然 SSL/TLS 的目的是避免使用者数据在网络上流传,而匿名使用者是任何人都可以使用,保护匿名使用者的数据似乎比较不需要。所以您可以将这个选项设为「No」,以避免匿名使用者也使用加密联机登入,徒然耗费 CPU 的资源。
15.6.2 安装支持 SSL/TLS 的客户端软件
在支持 SSL/TLS 的客户端软件方面,如果您使用 Windows,建议您使用 Filezilla ([url]http://filezilla.sourceforge.net/)[/url]。Filezilla 支持 SSL 及 TLS,而且 FTP client 的功能相当完整。它是一套免费、持续更新中的软件。
如果您使用 FreeBSD,可以使用下列指令安装 ftp-tls:# cd /usr/ports/ftp/ftp-tls
# make install
接下来您就可以使用下列指令连到您的 FTP Server 了:# /usr/bin/ftp-tls 192.168.0.1
15.7 smbftpd.conf
15.7.1 系统区段
ServerName 定义服务器名称
这个选项可以用来定义您的服务器名称,当使用者登入后将看到:
Connected to localhost.com.
220
[color=#ff0000][b]Server Name[/b][/color]
FTP server (SmbFTPD Ver 0.9) ready.
Name (localhost:alex):
如果您没有设定 ServerName,则 SmbFTPD 将显示系统的 Hostname。
ServerName "Server Name"
ListenOnAddress 设定要提供服务的 IP
当使用 -D 模式 (standalone) 启动 FTP 时,您可以指定只接受连到这个地址的联机。例如,假设您有二张网络卡,一个 IP 是 172.16.1.1,另一个是 61.62.63.64,您可以设定 ListenOnAddress 172.16.1.1 以表示只接受连到这个 IP 的联机。
如果您要接受所有联机,则请移除这个选项。
ListenOnAddress 192.168.0.1
Port 设定连接埠
当使用 -D 模式 (standalone) 启动 FTP 时,您可以指定 SmbFTPD 所要使用的 Port。一般的 FTP port 为 21,您也可以使用 ftp 这个字符串表示,系统会自动去 /etc/service 中查到相对的 port。
Port 21
Umask 设定新建档案的权限
当使用者建立档案或目录时,所要使用的 umask。例如,您想要让使用者新增档案时的权限为 644,则设 umask 为 022。详细关于 umask 的设定请 man 2 umask。这个选项的值必须为 8 进位的数字,如 022、027 等。
Umask 022
PidFile 设定存放 Process ID 的档案
这是您要存放 smbftpd pid 档的地方,当使用 daemon 模式时,我们会将 smbftpd 的 process id 写到这个档案中。
PidFile /var/run/smbftpd.pid
DebugMode 启用除错模式
是否要用 syslog 记录更多除错用的讯息。这个选项的值可以是 Yes 或 No,默认值为 No。
DebugMode No
LogCommand 记录使用者执行过的指令
是否要使用 syslog 的 LOG_FTP 记录使用者执行过的 FTP 指令。如果您将这个指令设为 Yes, 则使用者所执行的 retrieve(get)、store(put)、append、delete、mkdir、rmdir、rename 等都会被记录下来,并用记录该指令的文件名参数。在 FreeBSD 中,syslogd 会将这些记录在 /var/log/xferlog 中。 这个选项的值可以是 Yes 或 No,默认值为 No。
LogCommand No
DoWtmpLog 记录登入记录
是否要将 ftp 联机记录在 /var/log/wtmp 中。这个选项的值可以是 Yes 或 No,默认值为 No。
DoWtmpLog No
DisableEPSV 停用指令 EPSV
是否要停用 EPSV 这个指令。如果您的服务器位于一些旧的防火墙后面,而一直无法联机,您可以设着停用 EPSV。这个选项的值可以是 Yes 或 No,默认值为 No。
DisableEPSV No
ShowSymlink 是否要显示符号连结文件
当 ShowSymlink 为 No ,我们在使用者 ls 时不会列出 symbolic link 的档案或目录。这个选项的值可以是 Yes 或 No,默认值为 No。
ShowSymlink No
RestrictedPorts 禁止使用小于 1024 的埠号
当这个选项设为 No 时,smbftpd 将不检查限制使用者使用的连结埠。我们预设限制使用者在使用 PORT 命令时,只能使用 unprivileged ports (> 1024),不过这样将违反 FTP protocol。
这个选项的值可以是 Yes 或 No,默认值为 No。
RestrictedPorts Yes
RestrictedDataPorts 限制数据联机所使用的端口号
这个指令设成 NO 时,smbftpd 将只使用 port 定义范围在 IP_PORTRANGE_DEFAULT 的 port,而非 IP_PORTRANGE_HIGH 的 port。这个选项对于某些特殊的防火墙设定蛮有用的。请 man 4 ip 以得到更多信息。
这个选项的值可以是 Yes 或 No,默认值为 No。
RestrictedDataPorts Yes

15.7.2 使用者登入控制
MaxConnection 设定最多联机数目
这个选项可以让您控制最多同时联机的数量。如果 MaxConnection 大于 0,则在联机数目到达您所设定的值时,使用者就无法再登入。如果值为 0,则表示不做任何限制。
MaxConnection 30
RequireValidShell 登入的使用者是否要有合法 Sheel
当 RequireValidShell 为 Yes 时,使用者必须有合法的 shell 才可以登入。合法的 shell 是以 getusershell(3) 这个函数取得,大多数的操作系统中,合法的 shell 都被定义在 /etc/shells 中。这个选项的值可以是 Yes 或 No,默认值为 No。
RequireValidShell No
EmptyPasswdLogin 是否允许空白密码
是否允许空密码的使用者登入。
这个选项的值可以是 Yes 或 No,默认值为 No。
EmptyPasswdLogin No
NoLoginList 设定禁止登入的使用者清单
设定您不想让其登入的使用者,在 NoLoginList 中的使用者或群组不可以登入。
NoLoginList 的参数可以是使用者或是群组,如果是设定群组,请在群组名称前加上 @。当要设定多个使用者或群组时,请使用逗号 , 分开。 匿名使用者「ftp」及「anonumous」会被对映到真实的使用者「ftp」,如果您要设定的是匿名的使用者「ftp」及「anonymous」,请使用「ftp」这个使用者。
例如:
NoLoginList user1,@group1,user2
表示不允许使用者 user1, user2 及群组 group1 登入。
NoLoginList user1,user2,@group1,@group2
TimeOut 设定联机逾时秒数
当使用者超过这个时间没有任何动作时,则中断联机。单位为秒。
TimeOut 900
MaxTimeOut 设定最大联机逾时秒数
使用者可以自行设定 timeout 的时间,但我们可以在这里设定最长 timeout 的时间。预设是 2 小时。
MaxTimeOut 7200

15.7.3 FTP 目录权限控制
DefaultMode 预设的权限控制模式
SmbFTPD 有二种模式,一个是 SMB mode,另一个是 Normal mode。在 SMB 模式中,SmbFTPD 会使用类似 Samba 的共享数据夹权限设定,系统会读取 ShareConfPath 中的使用者目录权限控制来设定他对于数据夹的存取权限。而 Normal 模式中,SmbFTPD 就像一般 FTP Daemon 一样。
这个选项的值可以是 Normal 或 SMB,预设为 Normal。
DefaultMode Normal
ExceptionList 设定不使用预设权限控制模式的使用者
您可以在 ExceptionList 中设定不要使用 DefaultMode 的使用者及群组。例如,您如果希望所有人都使用 SMB 模式,但群组 wheel 要使用一般模式,则请将 DefaultMode 设为 SMB,再在 ExceptionList 中设定 @wheel 即可。
ExceptionList 的参数可以是使用者或群组,如果是群组的话,请在群组名称前加上 @。例如:
ExceptionList user1,user2,@group1,@group2
ShareConfPath 设定数据夹权限设定文件位置
设定数据夹设定的 smbftpd_share.conf 所在路径。如果您设定 DefaultMode 为 SMB,或是 DefaultMode 为 Normal 但有 ExceptionList,则一定要指定 smbftpd_share.conf 的所在路径。
我们会检查 smbftpd_share.conf 中的下列关键词设定:
path:数据夹的路径。
rw:可以有写入权限的使用者或群组。
ro:可以有只读权限的使用者或群组。
browseable:资料夹是否要设为隐藏。若设为 no,则使用者在根目录 ls 时,将看不到该数据夹,但依然可以 cd 到该数据夹中。
disable_download:设定不可以下载的使用者。若使用者可以读取该资料夹内容,您还可以设定让它无法执行下载的动作。
disable_ls:设定在资料夹中执行 ls 时,不可以看到资料夹内容的使用者及群组。
disable_modify:设定不可以修改该资料夹中的档案或目录的使用者及群组。如果该使用者具有读写的权限,但又在此列表中,则该使用者只能上传档案或是建立新的目录,而无法执行 rename、delete、rmdir、chmod 等指令。
范例一:
这个范例是有一个数据夹名为 public,其所在目录为 /home/public,在 samba 群组中的使用者可以有只读的权限,而 root 可以有写入的权限。[public]
        path = /home/public
        rw = root
        ro = @samba
范例二:
数据夹名称为 private,只有 wheel 群组的人可以写入,而且这个数据夹是隐藏的,wheel 群组的人登入后使用 ls 看不到这个资料夹,但是可以 cd 进去资料夹中。[private]
        path = /root/ftp
        rw = @wheel
        browseable = no
范例三:
数据夹名称为 upload, 使用者「ftp」及「anonymous」只能上传档案或建立新目录,但是无法看到该数据夹中的内容,也不可以下载或是修改现有的档案。但在使用者「wheel」群组中的使用者可以具有全部的读写权限。[upload]
        path=/home/upload"
        rw=ftp,@wheel
        disable_ls=ftp
        disable_modify=ftp
        disable_download=ftp
请注意,匿名使用者「ftp」及「anonumous」会被对映到真实的使用者「ftp」,如果您要设定的是匿名的使用者「ftp」及「anonymous」,请使用「ftp」这个使用者。
如果您设定某个使用者对于某个数据夹有写入的权限,但该使用者却无法写入,因为除了 SmbFTPD 的权限控制外,您还必须对数据夹的 UNIX 权限做一些设定,让该数据夹的 UNIX 权限允许该使用者写入。
ShareConfPath /some/where/smbftpd_share.conf
ChrootSet 设定使用 chroot 的使用者
在这个列表中的使用者或群组会被 chroot 到您所指定的路径中,也就是让它将您所设定的路径做为根目录,使用者无法到该路径以外的地方。如果有需要,您可以同时设定多条 ChrootSet 的规则。
这个参数的第一个字段是使用者名称或群组,如果在名称之前加上 @,表示是群组,所有在该群组中的使用者都会被套用到群组的设定中。而另一个特别的用法是只有一个 @ 符号,表示所有使用者都会被套用到这个设定中。
请注意,被设定为 chroot 的使用者就算 DefaultMode 被归类为 SMB mdoe 也一定会被强制使用 Normal mode。
这里有几个设定的范例:
范例一:
使用者 ftp 登入时,将它 chroot 到 /var/spool/ftpChrootSet ftp /var/spool/ftp
范例二:
所有群组为 ftpgroup 的使用者都使用他们的家目录 (home) 做为根目录。例如,使用者 alex 的家目录为 /home/alex,则其根目录为 /home/alex,而 jack 则是 /home/jack。我们以 ~ 符号表示家目录,系统会自动转换为真正的路径。ChrootSet @ftpgroup ~
范例三:
所有 webusers 这个群组的人都以其家目录下的 public_html 为根目录。这对于您要开放 FTP 给某些使用者,但又不想让他们去存取系统中其它路径时十分有用。ChrootSet @webusers ~/public_html
范例四:
所有使用者都必须以其家目录为根目录。ChrootSet @ ~
ChrootSet @webusers ~/public_html
ChrootSet @ ~

15.7.4 匿名使用者控制
AnonymousLogin 是否支持匿名使用者登入
是否允许匿名使用者登入。匿名的使用者账号为 ftp 或 anonymous。如果您要允许匿名使用者登入,您必须先新增一个 ftp 的系统使用者。
这个选项的值可以是 Yes 或 No,默认值为 No。
AnonymousLogin No
AnonymousOnly 是否只允许匿名使用者登入
是否只允许匿名使用者登入。若设为 Yes,则一般使用者无法登入。
AnonymousOnly No

15.7.5 档案传输控制
TransferLog 设定上下传记录文件位置
这个选项用来设定使用者上传及下载的档案记录。您可以设定当使用者下载或上传档案时,将它所上传或下载的档名、传输时间、大小等数据写在这个档案中。
TransferLog /var/run/smbftpd.log
MaxDownloadRate 设定最大下传速度
您可以针对使用者及群组设定最大的下载频宽。频宽 rate 的单为是 KB/s。您也可以设定多条 MaxDownloadRate 规则。
这个选项的第一个参数可以是使用者或群组,如果是群组,则名称开头必须加上 @。而若只有一个 @ 符号,表示所有使用者都要套用到该规则。
MaxDownloadRate @group100 100
MaxDownloadRate ftp 20
MaxDownloadRate @friends 1000
MaxUploadRate 设定最大上传速度
您可以针对使用者及群组设定最大的上传频宽。频宽 rate 的单为是 KB/s。您也可以设定多条 MaxDownloadRate 规则。
这个选项的第一个参数可以是使用者或群组,如果是群组,则名称开头必须加上 @。而若只有一个 @ 符号,表示所有使用者都要套用到该规则。
MaxUploadRate @group100 100
MaxUploadRate ftp 20
MaxUploadRate @friends 1000

15.7.6 SSL/TLS 控制
SecurityPolicy 设定是否使用 SSL/TLS
这个选项可以让您设定是否要启用 SSL/TLS 加密。您可以 强制一定要使用加密联机,或是关闭加密功能,或是同时允许加密及非加密模式。各种模式的说明如下:
secure:只允许加密联机。
nosecure:只允许非加密联机。
both:同时允许加密及非加密联机。
您可以将 SecurityPolicy 设为 secure、nosecure、或 both,默认值是同时允许加密及非加密联机。
SecurityPolicy both
EncryptionType 设定加密类型
当您要使用加密联机时,您可以选择要支持哪一种加密模式。SmbFTPD 支持二种模式:SSL 及 TLS,您可以使用下列设定值以选择要使用另一种模式:
TLS:只使用 RFC 2228 所定义的 FTP-TLS 模式。
SSL:只支持 FTP-SSL 模式。
Both:同时支持 SSL 及 TLS。
默认值是同时支持 SSL 及 TLS。
EncryptionType both
NormalUserMustSecure 强制一般使用者使用加密联机
当 NormalUserMustSecure 设为「Yes」时,表示一般使用者登入时一定要使用加密的联机,否则无法登入。
我们在 FTP 服务中使用 SSL/TLS 的目的是为了避免使用者的机密数据在网络上以明码流传,为了强制所有使用者都使用比较安全的模式联机,您可以将这个选项设为「Yes」。
NormalUserMustSecure No
AnonymDisableSecure 设定不允许匿名使用者使用加密联机
当 AnonymDisableSecure 设为「Yes」时,系统将不允许匿名的使用者使用加密的联机。
既然 SSL/TLS 的目的是避免使用者数据在网络上流传,而匿名使用者是任何人都可以使用,保护匿名使用者的数据似乎比较不需要。所以您可以将这个选项设为「No」,以避免匿名使用者也使用加密联机登入,徒然耗费 CPU 的资源。
AnonymDisableSecure No
SSLCertFile 设定公开金钥位置
设定所要使用的凭证,这个凭证会被送到客户端做为加密用。如果您没有设定这个选项,预设会使用 /usr/local/etc/smbftpd/ssl.crt/server.crt。
您也可以和 Apache+SSL 共享凭证,Apache 的 SSL 凭证通常位于 /usr/local/etc/apache2/ssl.crt/server.crt。
SSLCertFile /usr/local/etc/smbftpd/ssl.crt/server.crt
SSLKeyFile 设定私密金钥位置
这个选项是用来设定您上述设定的凭证所对映的 private key。这个 private key 和凭证是成对的,预设是在 /usr/local/etc/smbftpd/ssl.key/server.key。
如果您使用 Apache SSL 凭证,则这里也必须设定使用 Apache 的 key,通常位于 /usr/local/etc/apache2/ssl.key/server.key。
SSLKeyFile /usr/local/etc/smbftpd/ssl.key/server.key
SSLDebugMode 是否启用 SSL 的除错模式
设定是否要启动 SSL 的除错模式,当设为「Yes」时,您还必须要设定记录文件位置 SSLDebugLog。
SSLDebugMode No
SSLDebugLog 设定除错记录文件位置
设定 SSL 除错模式的记录文件要放在什么地方。
SSLDebugLog /var/log/smbftpd-ssl.log

逍遥 发表于 2006-6-5 15:20

第十六章 邮件服务器
邮件服务器是因特网上常用的服务器,我们平常收发电子邮件都必须经过邮件服务器。通常一般人都是使用 ISP 或免费的电子邮件信箱,由于这种服务的使用者很多,您的电子邮件账号通常很长,而且不是您所喜欢的名称。例如 ,如果您的名字是 Alex,您大概很难申请到 [email]alex@yahoo.com[/email] 这么好记的地址,只能申请到类似 [email]alex0706_tw@yahoo.com[/email] 这种又臭又长的信箱。如果您想要有比较好的信箱地址,则必须自行架设一台邮件服务器。
本章将介绍如何使用 FreeBSD 架设邮件服务器,读完本章后,您将可以对邮件服务器的运作更加了解。本章将包含下列主题:
电子邮件的运作原理。
如何架设安全的邮件服务器。
如何架设 POP3 及 IMAP 服务器。
如何设定邮件别名及自动转寄。
如何限制信件大小。
邮件结构及限制寄件者来源。
邮件收发问题处理。
16.1 电子邮件概论
一个电子邮件地址可以分为二个部份,第一个部份是使用者名称,第二个部份是主机名称。以 [email]john@yahoo.com[/email] 为例,yahoo.com 就是主机名称,而 john 为使用者名称。[email]john@yahoo.com[/email] 可以念作「John at yahoo.com」,翻成中文就是在 yahoo.com 上的使用者 John。
假设 Alex 使用的信箱是 [email]alex@gmail.com[/email],则当 Alex 要寄信给 [email]john@yahoo.com[/email] 时,会经过下列步骤:
首先 Alex 从个人计算机中写好一封信,送到他所属的 gmail.com 的主机中。
gmail.com 会先将信件存在自己的机器上的暂存区。
gmail.com 会检查信件目的地,并查找 yahoo.com 的 IP 地址。
接着经由因特网将信件送到 yahoo.com 的主机。
yahoo.com 的主机收到信后,发现是给自己机器中的使用者,所以将信件存放到使用者的新件匣中。
当 John 有空时,从家里打开计算机,并主动去 yahoo.com 检查是否有新的信件,当发现有新的信,则下载到自己的计算机中。
图 16-1
[img]http://homepage.cqwu.net/wxfy/images/ch16_01.png[/img]
如果 [email]alex@gmail.com[/email] 要寄信给 [email]john@gmail.com[/email],因为寄信者和收信者使用同一个邮件服务器,所以在上述步骤二中,gmail.com 的主机发现收信者是自己机器的使用者,则会将该信件存放在使用者的新件匣中。
从寄信到收信的流程中,每一个网络上的组件都扮演着不同的角色,我们分别来谈一下每一个角色的功能:
Mail User Agent (MUA):邮件使用者代理人,这是使用者用来写信、收信的程序。例如,我们常用的 Outlook Exporess、Thunderbird 等。它的作用在于提供使用者一个好用的收发信件接口,并将信传到自己的邮件服务器。
Mail Transfer Agent (MTA):邮件转送代理人,是一个负责转送信件的服务器。UNIX 中使用的 Sendmail、Postfix 就是 MTA 软件。它的作用在于收到 MTU 寄来的信后,根据信件地址,将信件转送到目的地。在目的地中,也有另一台 MTA 会负责接收信件。有时候信件并不会一次就从使用者的计算机传送到目的地的主机,而是会经由许多 MTA 转送到目的地的主机。这种 MTA 接收非自己的信件,并转送到别台 MTA 的动作就叫作「Relay」。
Mail Delivery Agent (MDA):邮件递送代理人,负责将要给本地使用者的邮件分配到使用者的信箱中。在 UNIX 中,MDA 通常是 mail 这支程序。
图 16-2
[img]http://homepage.cqwu.net/wxfy/images/ch16_02.png[/img]
当我们在寄信时,所使用的是 SMTP (Simple Mail Transfer Protocol) 通讯协议,在一台邮件服务器上,必须要先安装邮件服器软件,以接收 SMTP 协议所寄来的信件。MTA 和 MTA 之间传送信件时也是使用 SMTP 协定。而收信时,使用的是 POP3 (Post Office Protocol) 或是 IMAP (Internet Message Access Protocol) 协定。
一般常用的 SMTP 软件为 FreeBSD 内附的 Sendmail、Qmail、或 Postfix。而收信时所使用的 POP3 及 IMAP 软件 FreeBSD 并未内建,因此我们必须自行安装。然而做为一台 Mail Server,我们要设定的是最少要做到可以正常使用 POP3 及 SMTP 来让使用者收发信。另外,我们也将介绍使用 Web 接口的邮件收发软件,Web 接口的邮件收发软件可以让使用者不必使用 Outlook 等软件即可经由任何操作系统的浏览器轻松收发信件。
传统上,SMTP 在接受使用者寄信时,并不须经过身份认证,任何人都可以使用你的主机来制造垃圾信。因此 FreeBSD 内建的 Sendmail 是不接受 SMTP 寄信的。而一般的 ISP 业者大多是以控制联机来源的方式,禁止非允许网域的使用者 RELAY。但如果我们以控制联机来源的方式,便无法在其它非允许的IP地址使用SMTP,这对于想要任何地方都可以发信的人十分不分便。因此,本章里我们将介绍如何让使用者透过 FreeBSD 使用 SMTP 身份认证的功能来寄信,让要使用诸如 Outlook 以 SMTP 寄信的使用者必须先通过本机的身份认证。
在开始架设邮件服务器之前,您必须先设定好 DNS。由于传送信件时,必须查找目的地主机的 IP。如果您的主机没有合法的 DNS 设定,信件将无法正确送达。假设您要架设一台处理 twbsd.org 的邮件服务器,在 DNS 设定方面有二种方式。第一种是直接将您的主机名称设为 twbsd.org,并设定 DNS 将 twbsd.org 对映到您的主机 IP。第一种方法是使用 DNS 的 MX 设定,将 twbsd.org 的邮件交由另一台主机处理。如果您的 DNS 是交由申请单位代管,则只要到申请单位设定好名称对映即可。如果您要自行架设 DNS 服务器,请参考「DNS 服务器」一章的说明。
另外,您的服务器 IP 也必须设好反解,IP 名称必须和您的主机名称对映,如果反解不正常,有的服务器可能会拒收您所送出的信件。
16.2 具身份认证的 sendmail
本文参考自中央研究院计算器中心张毓麟先生所发表的「具身分认证的邮件传送系统」,该文件的网址是 [url]http://beta.wsl.sinica.edu.tw/~ylchang/Email/sendmail-auth[/url]。张先生对于在 FreeBSD 系统上建立安全的邮件服务器有多篇文章,您可以自 [url]http://beta.wsl.sinica.edu.tw/~ylchang/Email/index.html[/url] 取得更多内容。
由于本章有许多指令,为了避免打字错误造成安装失败,笔者将这些安装过程写成一个快速安装的程序,您可以自本书光盘二中取出安装。安装方式如下:# mount /cdrom
# cp -R /cdrom/mailserver /tmp/
# cd /tmp/mailserver
# sh mailserver.sh
接着依照画面指示即可快速安装本章具身份认证的 sendmail 了。安装完成之后,您可以使用下列指令以启动 sendmail:# /usr/local/etc/rc.d/saslauthd.sh
# /usr/sbin/sendmail -bd -q30m
如果我们希望在一开机便启动 Sendmail,请在 /etc/rc.conf 中加入下面这一行:
sendmail_enable="YES"
如果您希望自行一步步操作,请依下列各小节的说明来安装,但请特别注意一些标点符号的差异,例如 ` (位于键盘左上角) 及 ' (位于键盘右边) 等符号。笔者建议您如果要自行安装,在输入设定档内容时请使用本书光盘片中的范例,以免打字错误。
16.2.1 安装 Cyrus SASL
SASL (Simple Authentication and Security Layer) 可以让一些通讯协议 (例如 SMTP、IMAP 等) 具有身份认证的功能。Sendmail 自从 8.10 就支持 SASL 的功能。目前 cyrus-sasl 版本是 cyrus-sasl-2.1.21.tar.gz,我们可以 ftp 到各大 FTP 站台的 distfiles 目录下去取得最新版的 cyrus-sasl 或从本书光盘中的 mailserver 目录中取得。取回后以下列指令安装。# tar zxf cyrus-sasl-2.1.21.tar.gz
# cd cyrus-sasl-2.1.21
# ./configure --enable-login --enable-plain
# make
# make install
# cd /usr/lib
# ln -s /usr/local/lib/sasl2 .
# ln -s /usr/local/lib/sasl2 sasl
# ln -s /usr/local/lib/libsasl* .
# echo "pwcheck_method: saslauthd " > /usr/lib/sasl2/Sendmail.conf
接着我们要在一开机时就执行 saslauthd 这支认证用的程序,请新增文件名为 /usr/local/etc/rc.d/saslauthd.sh 的执行档,内容如下:
#!/bin/sh
case $1 in
"start")
        echo "Starting saslauthd"
        /usr/local/sbin/saslauthd -a pam
        ;;
"stop")
        echo "Stoping saslauthd"
        killall saslauthd
        ;;
*)
        echo "Usage $0 start|stop"
        ;;
esac
然后将该档案属性变为可执行,并建立一个 saslauthd 所需使用的工作目录:# chmod 755 /usr/local/etc/rc.d/saslauthd.sh
# mkdir -p /var/state/saslauthd
16.2.2 安装 Sendmail
在安装 Sendmail 之前,如果系统中正在执行旧版的 Sendmail,请先使用以下指令将它停掉:# kill -9 `cat /var/run/sendmail.pid|head -1`
接着请到 [url]www.sendmail.org[/url] 去下载最新版的 sendmail,您也可以在光盘二的 /ports/mailserver 目录中找到 Sendmail 8.13.5。Sendmail 自 8.12.0 版起,需要先建立一个使用者smmsp及所属群组供 Sendmail 使用。而 FreeBSD 自从 4.5-RELEASE 起己经内建了该使用者,如果你使用的是 4.5-RELEASE 以前的版本,请先编辑 /etc/group 加入下面一行:
smmsp:*:25:
再来增加使用者,执行 vipw 并增加下面一行:
smmsp:*:25:25::0:0:Sendmail user:/var/spool/clientmqueue:/sbin/nologin
将抓回来的 sendmail.8.13.5.tar.gz 放到 /tmp 底下,并以下列指令解压缩:# tar zxvf sendmail.8.13.5.tar.gz
接着 ee /tmp/sendmail-8.13.5/devtools/Site/site.config.m4 建立档案并加入下列内容:
PREPENDDEF(`confENVDEF', `-DMAP_REGEX')
PREPENDDEF(`confOPTIMIZE', `-O2')
APPENDDEF(`confENVDEF', `-DTCPWRAPPERS -DSASL=2')
APPENDDEF(`conf_sendmail_LIBS', `-lwrap -lsasl2')
APPENDDEF(`confLIBDIRS', `-L/usr/local/lib')
APPENDDEF(`confINCDIRS', `-I/usr/local/include')
APPENDDEF(`confENVDEF', `-DMILTER')
由于上述档案内容中,有很多特殊的符号,为了避免打错字,建议您直接使用本书所附第二片光盘中的 /examples/site.config.m4 。完成后就可以开始安装 Sendmail 了:# cd /tmp/sendmail-8.13.5
# sh Build
# sh Build install
为了要让本地的使用者不必经由身份认证使用 SMTP,还须再做下列设定:# cd /tmp/sendmail-8.13.5/obj*
# cd mail.local
# make force-install
# chown root /usr/libexec/mail.local
# chmod u+s /usr/libexec/mail.local
接下来编辑 sendmail 设定模板档案以便产生出具有身分认证功能的 sendmail.cf 设定文件,请以下列指令执行:# cd /tmp/sendmail-8.13.5/cf/cf
# cp generic-bsd4.4.mc MYCF.mc
# cd ../feature
# cat access_db.m4 >> ../cf/MYCF.mc
# cat delay_checks.m4 >> ../cf/MYCF.mc
# cat virtusertable.m4 >> ../cf/MYCF.mc
# cd ../cf
# cat >> MYCF.mc
TRUST_AUTH_MECH(`LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `LOGIN PLAIN')dnl
^D(同时按Ctrl+D)
上述要增加到 MYCF.mc 的二行字符串,您一样可以在本书所附第二片光盘中的 /examples/ 目录中找到 MYCF.mc.append 。为了避免打字错误,您可以使用下列指令来将上述二行附加在 MYCF.mc 中:# mount /cdrom
# cat /cdrom/example/MYCF.mc.append >> MYCF.mc
接着我们要建立 sendmail.cf:# sh Build MYCF.cf
# cp MYCF.mc /etc/mail/sendmail.mc
# cp MYCF.cf /etc/mail/sendmail.cf
接下来请编辑 /etc/mail/access 这个档案,我们可以在 access 指定哪些 IP 或 domain 来源的机器是否可以经由我们的服务器寄信。如果您希望自己内部网域的机器可以不必使用身份认证,你可以在这个档案中加入内部网域的 IP。
127.0.0.1             RELAY
192.168.0.1        RELAY
# 内部网络不需要认证
192.168.0            RELAY
接着请产生二个 sendmail 所需要的档案:# touch /etc/mail/virtusertable
# touch /etc/mail/aliases
然后请新增 /etc/mail/local-host-names 的档案,里面填入 localhost 以及机器的完整名字 (如 mail.abc.com),当收到信的收件者不是给 mail.abc.com 时便会拒绝。接着,再新增一个档名为 /etc/mail/relay-domains 的档案填入本地的 domainname,例如 mydomain.com,这样一来由本地的 domain 发信时便不需再一次做使用者认证。然后将这些档案做成 sendmail 能接受的 DB 格式:# cd /etc/mail
# makemap hash access.db
# makemap hash virtusertable.db
# newaliases
这样就完成了。您可以执行 sendmail -d0.1 -bv root | grep SASL 应该会出现 SASL 的字样,表示己可认证。
最后,我们可以使用下列指令来启动认证所需的程序及 Sendmail:# /usr/local/etc/rc.d/saslauthd.sh start
# /usr/sbin/sendmail -bd -q30m
在启动 Sendmail 之后,如果执行 telnet localhost 25 ,再打ehlo localhost,我们应该看到一堆 250- 开头的讯息,其中有一行 250-AUTH LOGIN PLAIN 就代表 Sendmail 己经具有身份认证的功能,此时请输入 quit 结束。万一没有出现,请阅读 /var/log/maillog 里面的讯息可以知道错在哪里。# telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 vmware.alexwang.com ESMTP Sendmail 8.13.5/8.13.5; Sat, 24 Sep 2005 19:16:09 +0800 (CST)
ehlo localhost  
250-vmware.alexwang.com Hello localhost [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
[b]250-AUTH LOGIN PLAIN  quit  
221 2.0.0 vmware.alexwang.com closing connection
Connection closed by foreign host.
如果我们希望在一开机便启动 Sendmail,请在 /etc/rc.conf 中加入下面这一行:
sendmail_enable="YES"
16.2.3 Client 端的设定
微软的 outlook 由 4.0 版开始支持发信时身分认证功能,只要在 outlook 的设定里面将『外寄邮件服务器需要查验身分』的选项打勾就可以了。
第一步骤,选取『工具』菜单的『账号』选项:
图 16-3
[img]http://homepage.cqwu.net/wxfy/images/ch16_03.png[/img]
第二步骤,选取账号选单中的『内容』按钮:
图 16-4
[img]http://homepage.cqwu.net/wxfy/images/ch16_04.png[/img]
步骤三,将『外寄邮件服务器需要查验身分』功能项打勾:
图 16-5
[img]http://homepage.cqwu.net/wxfy/images/ch16_05.png[/img]
按确定钮回到 outlook 中,即可使用身分认证功能发信。
16.3 POP3 及 IMAP 设定
传统上使用 Outlook 等收信软件时,我们会使用 POP3 来下载服务器上的信件。使用者有新的信件时,该信件会存放于 /var/mail/username 中,这个档案我们称之为 inbox。当我们使用 POP3 收信软件下载信件时,在下载完毕后,除非我们有设定在服务器上保留原本的信件,否则预设会在下载后自动将该信件自服务器中移除,以节省空间。
然而,如果您平常使用多台计算机,或是想在不同的地方依然可以看到之前的信件,则 POP3 就不太符合需求。除了 POP3 外,还有一个邮件通讯协议名为 IMAP。IMAP 和 POP3 最主要的差异在于 IMAP 一开始只下载信件标题,直到点选该信件后,它才会将信件下载至您所使用的计算机中。而在下载之后,IMAP 并不会将服务器上的邮件删除,所有浏览过的信件依然保存于 /var/mail/username 中。随着信件越来越多,inbox 的资料也会越来越大。此时我们可以使用 IMAP 建立新信夹的功能,在使用者家目录中建立许多新的数据夹,并将 inbox 的信件移至新建立的数据夹中,以减少 inbox 的大小,并加快收信的速度。而且,当我们寄出新信件时,若使用 POP3 协定,则寄件备份只会存放于您寄信时所使用的计算机中,但 IMAP 则会将寄件备份存于于服务器中。因此,如果您常使用多台不同的计算机收信,使用 IMAP 会蛮方便的,但 IMAP 在使用上速度会比 POP3 慢。
本章中,我们将介绍二种不同的 POP3 及 IMAP 收信软件,您可以依自己的需求安装合适的软件。
16.3.1 简单的 POP3 服务器
POP3 的设定很简单,我们只要选一个喜欢的 pop3 软件,以 ports 安装完后再做一些设定就好了。在这里我选用 popa3d:# cd /usr/ports/mail/popa3d
# make install clean
接着编辑 /etc/inetd.conf,找到 pop3 的部份,将开头的 # 拿掉后,并加以修改如下:
#
# example entry for the optional pop3 server
#
pop3    stream  tcp     nowait  root    /usr/local/libexec/popa3d       popa3d
接着重新跑 inetd 即可:# kill -HUP `cat /var/run/inetd.pid`
16.3.2 加密的 POP3 及 IMAP
在 FreeBSD ports 中,收录了许多 IMAP 及 POP3 的软件,我们选择了 IMAP-UW 这套软件来安装。IMAP-UW 不仅支持 IMAP 及 POP3,我们也可以设定要求使用加密过的 POP3 及 IMAP-UW 以加强密码及信件传送的安全性。首先,请使用下列指令安装 IMAP-UW:# cd /usr/ports/mail/imap-uw
# make WITH_SSL_AND_PLAINTEXT=yes install
接下来,我们要产生 IMAP 及 POP3 所需使用的 SSL 凭证:# cd /usr/ports/mail/imap-uw
# make cert
接着屏幕会出现一些问题,请依序回答:
输入国家代码,例如 TW。
Country Name (2 letter code) [NO]:TW
输入所在省份,例如 Taiwan。
State or Province Name (full name) [Some-State]:Taiwan
输入所在城市,例如 Taipei。
Locality Name (eg, city) []:Taipei
输入您的组织名称,你可以输入公司或学校名称,或直接按 Enter 即可。
Organization Name (eg, company) [FooBar Inc.]:My Company
输入单位名称,可以直接按 Enter 跳过。
Organizational Unit Name (eg, section) []:
输入您的机器完整名称,也就是您在 Outlook 等收信软件中所设定的服务器名称。
Common Name (FQDN of your server) []:mydomain.com
接下来我们必须设定一下 /etc/inetd.conf,并加入 POP3 及 IMAP 的相关设定:
pop3        stream        tcp        nowait        root        /usr/local/libexec/ipop3d        ipop3d
imap4        stream        tcp        nowait        root        /usr/local/libexec/imapd        imapd
pop3s        stream        tcp        nowait        root        /usr/local/libexec/ipop3d        ipop3d
imaps        stream        tcp        nowait        root        /usr/local/libexec/imapd        imapd
若您在开机时并未执行 inetd,请在 /etc/rc.conf 中加入下列设定:
inetd_enable="YES"
若您已启动 inetd,则设定完 inetd.conf 之后,我们必须重新启动 inetd:# kill -HUP `cat /var/run/inetd.pid`
现在我们就可以设定使用 Outlook 来收发。如果您想使用加密的 IMAP 或 POP3 联机,您可以在设定完新的邮件账号后,点选内容,并选取 [进阶] 的部份,将 [这个服务器需要安全联机] 打勾,即可设 IMAP 或 POP3 收信时使用加密的联机。
图 16-6
[img]http://homepage.cqwu.net/wxfy/images/ch16_06.png[/img]
16.4 进阶邮件服务器设定
架设邮件服务器只是服务器管理的第一步,后续的维护更是重要。好的系统管理者不仅仅是把机器架好,而是要管理好系统安全、解决使用者问题、并尽可能满足使用者需求。因此,我们接下来必须说明服务器的进阶管理议题,在使用者有问题时,我们才知道要如何处理。
16.4.1 设定邮件别名及自动转寄
当有同事离职时,我们常会被要求将该同事的信件转给某人。这种自动转寄的功能在 Sendmail 中很容易就可以做到,我们只要设定 /etc/aliases 即可。
/etc/aliases 是用以告知 sendmail 要将信转给哪个使用者或是交由哪个程序处理。aliases 这个档案是用来设定邮件的别名,也就是可以设定要将某人的信件转给其它地方(人员或程序),你也可以同时将某人的信转给很多人。这个档案的位置是由 sendmail.cf 档案中的 AliasFile 这个选项所决定的。当 sendmail 收到信时,会一行一行比对,当第一行符合后,就不会再继续下去,所以应注意优先级。
我们来看下列几个设定的范例:
#本档案的语法开头的 "#" 代表该行是批注,大小写都视为一样。
# 范例一
root: alex
# 范例二
john: alex,john
# 范例三
webmanager: alex,jack,[email]jim@other.hostname.com[/email]
# 范例四
nobody: /dev/null
# 范例五
homework: |/usr/local/bin/homework.sh
# 范例六
olduser: :include: /usr/local/olduser_list
范例一是将寄给 root 的信转给本机中的使用者 alex。
范例二是将寄给 john 的信转给本机中的使用者 alex 及 john,也就是除了原本的 john 外,alex 也会收到寄给 john 的信。
范例三是将寄给 webmanager 的信转给本地的使用者 alex,jack及 [email]jim@other.hostname.com[/email]。
范例四是将寄给 nobody 的信直接丢掉,丢入 /dev/null 这个无底深渊,也就是所有给 nobody 的信都直接删除。
范例五是将寄给 homework 的信交给 /usr/local/bin/homework.sh 这支程序处理。
范例六是将寄给 olduser 的信转给档案 /usr/local/olduser_list中所列出的所有使用者。olduser_list 为使用者清单的文字文件。
当设定了一堆复杂的别名之后,我们要看最后信会寄到哪里时,可以使用下面指令来看寄给 username 的信最后寄给谁:# sendmail -bv username
aliases 档中将很多东西都转向 root,因此你可以去读 root 的信箱或是将 root 的信转给别的地方,下面这一行是将 root 的信都转给 [email]my@my.doma[/email]in:
root:        [email]me@my.doma[/email]in
当邮件无法送出被退回时给使用者时,都是以 MAILER-DEAMON 为账号寄出。因为使用者可能会回复那封被退回的信,所以这个别名是必备的。而 postmaster 则负责处理所有关于邮件问题的信件,因此也是必备的,一定要保留下面二行,这是必要的系统基本设定:
MAILER-DAEMON: postmaster
postmaster: root
请注意,修改完 /etc/aliases 后,我们必须使用下列指令来让所做的修改在 Sendmail 中发生作用:# newaliases
16.4.2 一舨使用者设定自动转寄及自动回信
除了管理者可以经由设定 /etc/aliases 来转信使用者的信件外,一般使用者也可以设定将寄给自己的信转寄一份给其它人。
一般使用者只要在自己的家目录中新增一个档名为 .forward 的档案,并设定要转寄的对象即可。以下为 .forward 的设定范例:
\alex
[email]alexwang@yahoo.com[/email]
如果我们在使用者 john 的家目录中新的上述的 .forward 档,则所有寄给 john 的信都会转寄给本机的 alex 及 [email]alexwang@yahoo.com[/email]。我们必须要注意的是在上述的设定中,使用者 john 并不会收到寄给自己的信。如果自己也要收到信的设,必须在 .forward 檔中加入自己的名字。
另外,如果您要出国旅游,可能有很长的一段时间无法收信,并希望当有人寄信给您时,系统能自动回信告诉寄件者,则可以使用 .forward 的功能加上 vacation 这个指令来达成。
假设您的使用者名称是 alex,首先,我们先在 alex 的家目录下新增档案 .forward,其内容如下:
\alex
"|/usr/bin/vacation alex"
接着,我们要在家目录下新增档案 .vacation.msg 并加入下列内容:
From: "Alex Wang"
Subject: I am on vacation now
Hello,
I will not be reading my mail for a while.
Your mail will be read when I return.
Thanks,
Alex
如果有人寄信给 alex 的话,除了 alex 会收到信外,寄件者也会收到一封标题为「I am on vacation now」的信,内容就是 .vacation.msg 中的内容。
vacation 这个指令名字取的很有趣,作者大概认为无法收信就是渡假去了。我们在 .forward 档中设定了当有信件进来时,就交由 vacation 去处理,而 vacation 会自动将 .vacation.msg 的内容回复给寄件者,这样就达到了自动回信的功能了。
[img]http://homepage.cqwu.net/wxfy/images/note.png[/img]
小提示
一般使用者可以经由设定 .forward 及 .vacation.msg 来自动回信,但是这种设定方式对于一般使用者而言可能不太方便。我们可以使用下一章要介绍的 Openwebmail 来提供从网页中设定自动回复的功能。
16.4.3 限制每封邮件大小上限
不论您的系统硬盘多大、网络多快,在复杂的网络世界中,难保没有人会恶意寄送大型邮件来灌瀑您的信箱。不论如何,我们还是应该要做好基本的防护。在 Sendmail 的设定档中,可以让我们限制接收的邮件大小。
如果您要限制接收信件的大小,可以修改 /etc/mail/sendmail.cf,将下列项目开头的批注移除:
# maximum message size
O MaxMessageSize=5000000
我们限制最大的信件大小为 5000000 bytes (即 5MB)。修改完后,您必须重新启动 sendmail 设定才会生效。# killall sendmail
# /usr/sbin/sendmail -bd -q30m
16.5 邮件问题处理
在管理邮件服务器时,我们常会遇到使用者报怨信件无法送出、信件收不到、寄信出现错误等等。在遇到这类问题时,我们必须具备问题追踪的能力,以协助使用者解决寄信的问题。
在处理收发信件问题时,您可能必须查询 DNS 的设定、了解邮件结构。在说明如何处理收发信件问题前,我们先来了解一些基本的邮件管理知识。
16.5.1 邮件结构
Sendmail 会将所有的使用者新收到的信件放在 /var/mail 中,并将使用者刚寄出的信放在 /var/spool/mqueue 中。在 /var/mail 目录中,每个使用者的新件匣都是一个和使用者名称一样的档案。例如,使用者 alex 的新件匣是 /var/mail/alex、使用者 john 的新件匣是 /var/mail/john。当我们使用 Outlook 或 webmail 收信时,随然我们看到的是一封封的邮件,但在系统中,这些邮件是以纯文字模式全部存放在同一个档案中。所以,当使用者的信件很多时,该档案会越来越大,在使用 IMAP 或 webmail 收信时,速度也会变得比较慢。
由于 /var/mail 及 /var/spool/mqueue 中的信件都是以纯文字格式存放信件,管理者可以直接使用任何文书编辑软件打开使用者的信箱。因此,管理者本身的操守很重要,否则所有人的机密都会被看见。
为了了解一封信的结构,我们还是要看一下信件的内容。您可以打开 /var/mail 目录中自己的信件,或是在 Outlook Express 中对着信按右键 -> [内容],再选 [详细资料] -> [邮件原始文件],即下图示:
图 16-7
[img]http://homepage.cqwu.net/wxfy/images/ch16_07.png[/img]
接下来,我们可以看到一个邮件原始数据如下:
# Return-Path 表示要回信则会回给 [email]edm@ebp.eracom.com.tw[/email]
Return-Path:
# 这是由 alexwang.com 的 Sendmail 所产生的标头。表示信件是由 ebp135.eranet.net
# 所寄出,并由 alexwang.com 处理此信件。
Received: from eracom.com.tw (ebp135.eranet.net [203.95.231.171])
        by alexwang.com (8.13.5/8.13.5) with ESMTP id j8QE1IpL059750
        for ; Mon, 26 Sep 2005 22:01:24 +0800 (CST)
# 这是由 eracom 的邮件软件所产生的标头。
Received: from mail pickup service by eracom with Microsoft SMTPSVC;
         Mon, 26 Sep 2005 22:01:25 +0800
# Thread-index 及 Thread-Topic 是用来在回信时让客户端的软件判断信件是和哪几封信
# 同一个主题用的。
thread-index: AcXCg/dY0ifrCKOiTJO8PTlqFlJD/A==
Thread-Topic: =?big5?B?pn6lTrDiVkqvqVPVIp9yp2qq6xV2kT6FJsXqkU6vnr+A=?=
        =?big5?B?v/m5TA==?=
# From 是寄件者的名称及 Email。
From: =?big5?B?pn6lTrDisrw=?=
# 这是收件者的信箱。
To:
# CC 是复本收件者。
Cc:
# Subject 是本封信件的主题。
Subject: =?big5?B?pn6lTrDisrwgLqvmhqVPVIp9yp2qq6xV2kT6FJsXqkU6vnr+A=?=
        =?big5?B?v/m5TA==?=
# Date 是收信的时间。
Date: Mon, 26 Sep 2005 18:20:49 +0800
# Message-ID 是由发信软件所产的邮件编号。
Message-ID:
# 此封邮件所使用的 MIME 版本。
MIME-Version: 1.0
# 邮件内容格式。
Content-Type: multipart/alternative;
        boundary="----=_NextPart_000_9A3D5_01C5C2C7.057BB140"
# 邮件的优先级。
Priority: normal
# 表示这是 multi-part MIME 格式的邮件。
This is a multi-part message in MIME format.
# 以下为邮件本文
... 略 ...
我们可以从邮件的标头中看到信件真正的来源。有的邮件来源可能会假造,我们也可以从邮件的标头中看出来。
16.5.2 限制寄件者来源
邮件信箱用久了,难免会收到垃圾信。如果您常收到垃圾信,或是想要阻挡某一个网域寄来的信件,最简单的做法是使用 Sendmail 内建的阻挡功能。
我们可以经由设定 /etc/mail/access 来阻挡某个网域的信件。以下是几个设定的范例:
192.168                RELAY
free.spammail.com      REJECT
cyperspammer.com       550 We don't accept from spammers
somespammer.com        DISCARD
sendmail.org           OK
/etc/mail/access 的格式是先列出网域、网址、或 Email,再加上 DISCARD、REJECT、RELAY、OK、或是一串有错误代码的讯息。如果是 OK,表示可以寄信到这一台机器中,这是默认值,所以我们很少用到 OK 这个关键词。而 RELAY 表示可以使用这台机器送信到其它的机器。REJECT 表示不可以使用这台机器的邮件服器。DISCARD 表示将信收下,并直接删除,寄件者会以为信件正常被送出。550 加上一个字符串表示响应此字符串给寄件者。
在设定完 /etc/mail/access 后,我们必须执行下列指令,以将该档案做成 Sendmail 所使用的数据文件:# makemap hash /etc/mail/access
我们当我们收到垃圾信时,寄件者往往是假造的,但我们还是可以从邮件标头中看出该信件的真正来源。以下列标头为例:
Received: from hoho88_nserver.cx ([b]10p2.ppp.odn.ad.jp[/b] [[b]219.66.191.46[/b]])
by alexwang.com (8.13.1/8.13.1) with SMTP id j8P6ke57004728
for ; Sun, 25 Sep 2005 14:46:40 +0800 (CST)
Date: Sun, 25 Sep 2005 14:46:40 +0800 (CST)
Delivered-To:
Message-ID: [email]20030120467mail@mail.hi[/email]9658754215_starweb88_mainserver.cx
From: [email]mikas_mail_0911@yahoo.co.jp[/email]
To: [email]alex@alexwang.com[/email]
Subject: =?iso-2022-jp?B?gXWCqJCimGKCyYLIgsGCxIKoguiC3IK3gUk=?=
MIME-Version: 1.0
Content-Type: text/plain;
charset="iso-2022-jp"
我们可以看到虽然寄件者是 [email]mikas_0911@yahoo.co.jp[/email]、发信的主机是 hoho88_nserver.cx,但实际上是的来源 IP 是 219.66.191.46,这个 IP 就是我们要阻挡的地址。或者,您可以阻挡整个 ppp.odn.ad.jp 的信件。
16.5.3 处理未寄出之信件
系统中所有未寄出的信件都会放在 /var/spool/mqueue 中,在该目录中,一封未寄出的信会有二个档案,这二个档案包含了原始信件及寄件失败的原因。我们可以使用下列指令列出所有未寄出的信件。# mailq
               /var/spool/mqueue (1 request)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
j8NFunJe071657    15472 Fri Sep 23 23:56
                (Deferred: Connection refused by mail.somewhere.com.)
                                       
               Total requests: 1
我们可以看到有一封信未送出,原因是被 mail.somewhere.com 拒绝了。
一般而言,Sendmail 每隔一段时间 (依启动 Sendmail 所加的 -q 参数而决定) 会自动重新送出队列中的信件,最后都无法送出则会通知寄件者。如果您要立即重新送出队列中的信件,可以使用下列指令:# sendmail -qf
如果您要删除某一封在队列中的信件,请先使用 mailq 查看 Q-ID,再到 /var/spool/mqueue 中删除 qfXXXX 及 dfXXXX 的档案,其中 XXXX 是您要删除的 Q-ID。
16.5.4 收发信件问题处理
电子邮件在现在的企业中使用非常频繁,很多公司几乎所有事务都经由电子邮件处理,收发信不正常往往是 MIS 人员的恶梦。很多时候问题可能不是出现在邮件服务器本身,而是网络设定、DNS 问题、或是对方服务器的问题。当您遇到收发信件问题时,就必须要从系统记录、发信软件中查出蛛丝马迹。在检查问题之前,请先确认您的邮件服务器的 DNS 设定没问题,而且邮件服务器 IP 和主机名称正反解都正确。DNS 设定不正常的服务器往往是不能收发信件的主因。
发信问题处理
在发信问题方面,如果您使用发信软件寄不出信件,请先检查发信软件所秀出的讯息,再找解决之道。通常发信问题可以分为二类,一种是在使用 Outlook Express 送信时就已经送不出去,另一种是信送出了,但对方没收到。第一种问题比较好解决,我们只要看 Outlook Express 的错误讯息即可看出端倪。以下列讯息为例:
图 16-8
[img]http://homepage.cqwu.net/wxfy/images/ch16_08.png[/img]
我们可以看到错误讯息中有「Relaying denied. Proper authentication required.」,很明显的是因为这一台服务器必须经过身份认证后才可以使用,我们只要在送信设定中使用身份认证即可。在 Outlook Express 的讯息中,也有可能出现类似 DNS 找不到、主机找不到、使用者不存在等问题。我们只要依这些讯息来查看设定、Email 地址,即可找到原因。
第二种问题是信件寄出了,但是对方没收到。这种情形,我们就必须要多花点心力了。首先,我们先到服务器上 /var/spool/mqueue 查看信件是否在队列中。如果在,则查看一下送出去出的原因,并依错误讯息解决问题。如果从错误讯息中看不出问题,则可以查阅 /var/log/maillog,并找出该信件的寄送讯息:
Sep 23 00:22:42 mail sendmail[22426]: j8MGMKkE022408:
to=john@myfriend.com, ctladdr=john@myfriend.com (1029/501),
delay=00:00:22, xdelay=00:00:05, mailer=esmtp, mailer=esmtp,
relay=alexwang.com, dsn=5.1.2, stat=Host unknown (Name server:
myfriend.com: host not found)
以上述范例为例,就是因为找不到 myfriend.com 这台主机。这时候,我们可以手动使用 nslookup 查找该主机,并检查 DNS 的设定是否有问题。如果是 DNS 主机的问题,则可以更换 DNS 服务器设定。
如果收件者的服务器有安装防垃圾信软件,有的时候我们的服务器所使用的 IP 可能会因为某些列为垃圾信。在发信后,您可能会收到下列退信:
----- The following addresses had permanent fatal errors -----
(reason: 554 EMail from mailserver at 10.22.102.129 is refused.
See
[url]http://spamblock.outblaze.com/10.22.102.129)[/url]
----- Transcript of session follows -----
... while talking to sultant-com.outblaze.com.:
>>> DATA
这时候我们就必须依该信件指示,到该黑名单网站中要求对方将我们的 IP 从黑名单中移除。
如果从 /var/log/maillog 中确认信已经从本机寄出而对方还是没收到,则接下来就要请对方 MIS 人员查看对方服务器是否有问题了。
总结关于发信问题处理步骤如下:
检查 DNS 设定。
查看发信软件的错误讯息。
检查服务器的队列。
查看 /var/log/maillog。
依联机记录找出问题并解决。
收信问题处理
在收信问题方面,和发信问题一样,最关键的还是 DNS 设定。我们必须先检查客户端所使用的计算机是不是可以正常的找到邮件服务器。如果找不到,则必须修改 DNS 设定。
接下来,必须确认客户端的发信软件有连到服务器,并可以正常使用 POP3 或 IMAP。如果在联机时出现错误,您一样可以从 /var/log/maillog 中看出问题。以下列联机记录为例:
Sep 23 02:16:12 mail sm-mta-in[24776]: j8MV5024776: ruleset=check_rcpt,
arg1=, relay=[219.93.1.218], reject=550 5.7.1
... Relaying denied. IP name lookup failed
从记录中,我们可以看出来是因为反查 mail1.stofane.dk 失败,所以我们的服务器拒收此封信件。这就是为什么邮件服务器最好还是要设定好 IP 反查的原因。
如果有人抱怨一直没有收到客户寄来的信,我们可以从 /var/log/maillog 中找出该寄件者到底有没有将信件寄到我们的服务器。如果没有,则可以请对方检查邮件信箱是否正确、对方服务器中是否有其它讯息。

逍遥 发表于 2006-6-5 15:21

第十七章 邮件服务器进阶应用
基本的邮件服务器已能满足大多数人的需求,但经过一段时间之后,您可能会遇到更多的使用者要求。例如,开始有人报怨垃圾信太多、有人希望可以使用网页收发信件等等。本章将介绍一些邮件服务器的应用,让您的服务器功能更加强大。
读完本章后,您将了解下列主题:
如何架设虚拟邮件主机。
如何阻挡垃圾信及病毒信。
如何架设 Openwebmail 以使用网页收发信件。
17.1 虚拟邮件主机
如果我们想要在同一台机器上收多台主机的信件,或者想要在一台主机上设定可以 "收" "发" 信件的虚拟账号 (如果只要收,可以简单的设定 aliases 即可),我们可以经由虚拟主机的设定来达成。假设有二个 Domain Name,一个是 abc.com,另一个是 old.cde.com。这份文件包含了二种设定方式:一个是让二个 domain name 收到的信对映到一台机器上的使用者,也就是说不能有不存在的虚拟使用者;另一个设定是让你可以设定不同的虚拟使用者对映到不同机器上的任何使用者。不管我们要做哪一种设定,都必需要先设定 DNS。
请注意,这份文件中的设定并不会让你可以拥有一个真正的虚拟账号,因为这里是将虚拟账号对映到一个存在的邮件地址。使用这份文件的设定和设定 /etc/aliases 最大的不同在于设定 aliases 只能让虚拟的账号收信,而无法寄信。
17.1.1 DNS 设定
为了要让寄出去的信知道要往哪一台主机上送,必须要先设定 DNS。假设我们现在已经有一台设定好 DNS 的主机,hostname 是 abc.com。我们要让 abc.com 处理 old.cde.com 的信件的话,最简单的方式就是将 mail.cde.com 指向 abc.com (CNAME records),也就是二个 doamin 有同样的 IP。不过这样一来,old.cde.com 就不能独立存在了,也就是说不会有一台机器的 hostname 名为 old.cde.com,并提供 FTP、www(也可以有虚拟主机)、telnet等服务。
因此,我们要使用的是改变 DNS 的 MX record。设定只有处理该主机的邮件时,才将 old.cde.com 转向 abc.com。请在你的 DNS 中加入下列设定:
old.cde.com        IN  MX  10    abc.com.
完成后要重新读设定档并等一段时间设定才会在网络上生效。接着我们就可以来做 sendmail 的设定了。
17.1.2 对映到同一台机器的真实使用者
第一种设定的使用时机,例如你的公司主机原来是 mail.cde.com,现在换成了 abc.com,你希望让原本的使用者 [email]jack@mail.cde.com[/email] 和新的 [email]jack@abc.com[/email] 都能由 [email]jack@abc.com[/email] 来收信。这种设定很简单,只要编辑 /etc/mail/relay-domains 及 /etc/mail/local-host-names 这二个档案,加入要增加收信的主机名称即可。以本例而言,除了那二个档案原本的内容外,要再增加一行:
mail.cde.com
这样了不管是原本 mail.cde.com 或是真正主机名称 abc.com 的信件,都可以由 abc.com 的相同的使用者收信。
17.1.3 可以拥有虚拟使用者
第二种设定是让我们可以设定一个虚拟的账号,并且可以利用它来送信。这个设定是经由编辑 /etc/mail/virtusertable 来达成。相同的,我们在 abc.com 这台主机中设定它的 virtusertable。我们以下列二个 virtusertable 的例子来说明,请注意,二个字段间的空白是用 tab 键,而非使用空格键:
范例一:
[email]joe@mail.cde.com[/email]            jschmoe
[email]jane@mail.cde.com[/email]           [email]jdoe@othercompany.com[/email]
@mail.cde.com               jschmoe
上面的例子中,凡是寄给 [email]joe@mail.cde.com[/email] 的信都会送给本地使用者 jschmoe。而以 [email]joe@mail.cde.com[/email] 寄出的信收件人所看到的寄件人一样是 [email]joe@mail.cde.com[/email],如果在寄信时要身份认证的话,必须使用 jschmoe 的账号及其密码。接下来,寄给 [email]jane@mail.cde.com[/email] 的信会送给 [email]jdoe@othercompany.com[/email],剩下来所有给 mail.cde.com 的信都会送给本地 jschmoe 这个使用者。
范例二:
[email]joe@mail.cde.com[/email]            jschmoe
[email]bogus@mail.cde.com[/email]          error:nouser No such user here
[email]list@mail.cde.com[/email]           yourdomain-list
@mail.cde.com               %[email]1@othercompany.com[/email]
这一个例子中,第一行和范例一一样,凡是寄给 [email]joe@mail.cde.com[/email] 的信都会送给本地使用者 jschmoe。而凡是寄给 [email]bogus@mail.cde.com[/email] 都会响应没有这个使用者。第三行如果是寄给 [email]list@mail.cde.com[/email] 的信,都会转给本地的 yourdomain-list 这个虚拟使用者,你可以在 /etc/aliases 中加入关于 yourdomain-list 这个使用者的信要怎么处理,怎么设定别名。最后一行,凡是其它非上述三行使用者的信,都交由在 othercompany.com 这台机器上相对映的使用者来处理。
你可以依照上面的范例来编辑你的 virtusertable,完成编辑后,必须要使用以下指令来将这些档案做成 sendmail 能接受的 DB 格式:# makemap hash virtusertable.db
# newaliases
都完成后,我们就可以到别台机器使用虚拟账号来试试收发信。假设我们要使用的虚拟账号是上述范例一中的第二行 [email]jane@mail.cde.com[/email],以 outlook 中的设定为例,所设定的 E-mail 仍然是 [email]jane@mail.cde.com[/email],如下图所示:
图 17-1
[img]http://homepage.cqwu.net/wxfy/images/ch17_01.png[/img]
所设定的 pop3 及 smtp 主机也是 mail.cde.com。但是使用者及密码是 othercompany.com 上的使用者 jdoe 及其密码,如下图所示:
图17-2
[img]http://homepage.cqwu.net/wxfy/images/ch17_02.png[/img]
在上图中,如果 othercompany.com 在寄信时要身份认证,则上图中 "外寄邮件服务器" 的选项 "我的服务器需要验证"必须打勾。如此一来您就可以使用 [email]jane@mail.cde.com[/email] 来收发信,而且在别人收到信时会显示寄件人是 [email]jane@mail.cde.com[/email]。
17.2 垃圾信及病毒防护
全拜电子邮件所赐,经由因特网,我们可以很快的传送邮件。然而,却有人利用电子邮件从事令人不悦的广告发送行为。垃圾邮件可以说是目前网络上最令人厌恶的行为,相信常使用电子邮件的读者们每天一定都会收到许多垃圾信件。所有服务器上处理的使用者都要处理这些垃圾邮件简直是太浪费资源了。而且,除了垃圾信外,邮件中所夹带的病毒也十分危险,万一有人不小心打开了具有病毒的信件,接下来又是另一场灾难。
面对这些垃圾信及病毒信,我们有更好的解决方式,就是使用 MailScanner 加上病毒防护的功能,让我们的邮件服务器更加安全、好用。MailScanner 是一套免费的软件,很多网站都使用它来过滤垃圾信件。除了垃圾信外,我们还可以外挂其它模块,以支持病毒扫瞄。另外,我们也可以用它来阻挡具有特定的扩展名附件的邮件。您可以到
[url=http://www.sng.ecs.soton.ac.uk/mailscanner/]http://www.sng.ecs.soton.ac.uk/mailscanner/[/url]
找到更多关于 MailScanner 的说明。
使用 MailScanner 的好处是我们原本安装的 Sendmail 不需要做任何的修改,只要将 Sendmail 跑在 MTA only 的模式即可。
17.2.1 MailScanner 架构说明
在没有安装任何垃圾信处理软件之前,在寄信、或者由其它服务器收到信件时,我们的服务器会先判断该信件是否为本机的信件,如果是,则呼叫 MDA (mail 这支指令),将信件放到 /var/mail 目录下。如果是要给其它服务器的信件,则放到 /var/spool/mqueue 下,Sendmail 会定时检查该目录,并将信件传送出去。示意图如下所示:
图 17-3
[img]http://homepage.cqwu.net/wxfy/images/ch17_03.png[/img]
在有了 MailScanner 后,当 Sendmail 收到信后,会先将信件放到 /var/spool/mqueue.in 中。接下来 MailScanner 会定时去检查该目录下的档案,经过 MailScanner 扫瞄检查后,合法的邮件会被放到 /var/spool/mqueue 中。接下来的处理程序就和原本 Sendmail 的处理一样。示意图如下:
图 17-4
[img]http://homepage.cqwu.net/wxfy/images/ch17_04.png[/img]
MailScanner 在检查邮件时有很多功能,它使用了一些外挂模块来检查垃圾信及病毒信。详细的检查过程如下:
定时检查 /var/spool/mqueue.in 中的邮件。
先使用 RBL 检查寄件者的 IP 是否在黑名单中。
使用 SpamAssassin 来检查信件内容,看看信件格式是否有不合法或是具有垃圾信特征。
呼叫病毒检查的模块来扫瞄邮件。
进行其它的内容检查,包含附件的扩展名、邮件内容是否包含特定的 HTML 格式等等。
全都都合法则将信件放到 /var/spool/mqueue 中。如果不合法,则依我们的设定进行退信、隔离、删除、或加上标记后送出。
图 17-5
[img]http://homepage.cqwu.net/wxfy/images/ch17_05.png[/img]
当 MailScanner 判断某封信件为垃圾信时,它有几种处理模式,包含附加标记在主旨上后送出、退信、删除、隔离、转寄等等。我们在使用 MailScanner 之后,应该要先在邮件的主旨上附上标记后送出。当有使用者发现不是垃圾信却被设为垃圾信时,我们可以将该信件的寄件者加入白名单中 (就是不检查信件的寄件者清单)。如此运作一段时间都没问题后,再使用比较严格的方式,进行退信或删除。如此一来,我们才不会遗漏正常的信件。
MailScanner 的功能十分强大,但是设定却很容易,我们只要进行一些基本设定,即可以拥有强大的垃圾信及病毒扫瞄功能。
17.2.2 安装 MailScanner
FreeBSD 已经将 MailScanner 放入 ports 中,我们只要使用 ports 来安装即可。除了 MailScanner 外,我们还要安装 SpamAssassin 及防毒软件 ClamAV。
首先请使用下列指令安装 MailScanner:# cd /usr/ports/mail/mailscanner/
# make install
# make initial-config
接着安装 ClamAV:# cd /usr/ports/security/clamav/
# make install clean
执行了 make install 后,会出现一个选单,请记得要选取「MILTER」。
最后安装 SpamAssassin:# cd /usr/ports/mail/p5-Mail-SpamAssassin/
# make install clean
安装完后,我们必须先进行一些基本的设定。首先是防毒软件方面,我们必须设定定时更新病毒码。请先编辑 /etc/rc.conf 并加入下列这一行:
clamav_freshclam_enable="YES"
上述设定将会在开机时启动 freshclam 这支程序,预设每二小时会去检查一次是否有新的病毒码要下载。
由于 MailScanner 会取代原本 Sendmail 的部份功能,而 Sendmail 只要启用 MTA 模式即可,所以我们先编辑 /etc/rc.conf 并停用原本的 Sendmail。
sendmail_enable="NONE"
接着我们使用下列指令来将 MailScanner 及 Sendmail 开机时所必须使用的启动程序更名,这样系统在开机时才会启动 MailScanner 及 Sendmail 的 MTA 模式:# cd /usr/local/etc/rc.d
# mv mta.sh.sample mta.sh
# mv mailscanner.sh.sample mailscanner.sh
由于 MailScanner 会在信件进来时,先将信件放到 /var/spool/mqueue.in 中,我们必须先建立下列 MailScanner 所必须使用的目录:# mkdir -p /var/spool/mqueue.in
# mkdir -p /var/spool/MailScanner/incoming
# mkdir -p /var/spool/MailScanner/quarantine
这样我们就已经完成了大部份的设定,接下来我们必须进行 MailScanner 的细部设定。MailScanner 的设定档位于 /usr/local/etc/MailScanner/MailScanner.conf,如果您希望快速的设定好 MailScanner,以下是几个必须修改的地方:
# MailScanner 会检查档案的扩展名、格式。如果是 zip 档,它也会将它解压缩并检查压缩
# 档中的内容。我们常会遇到因为扩展名问题而副件被 MailScanner 的问题。如果您将下列选
# 选项设为 0,则 MailScanner 就不会去检查压缩档中的档案格式。
Maximum Archive Depth = 0
# 设定使用 clamav 做为病毒扫瞄工具。
Virus Scanners = clamav
# 是否启用 SpamAssassin。我们将它改为 yes,以使用 SpamAssassin 来检查垃圾信。
Use SpamAssassin = yes
# 下列选项控制了当被 MailScanner 判定为垃圾信时要如何处理。预设是在主旨加上标记并
# 送出。我们可以将它改为 delete (删除)、store (隔离)、bounce (退信) 等。建议您
# 先设定为 deliver,等过一阵子确定都没有误判后,再将它改为 bounce。
Spam Actions = deliver
# 下列选项控制了当被 MailScanner 判定为高分数的垃圾信时要如何处理。所谓的高分数垃
# 圾信就是 MailScanner 有很高的把握认为这是垃圾信。预设是在主旨加上标记并送出。我
# 们一样可以将它改为 delete (删除)、store (隔离)、bounce (退信) 等。建议您先设
# 定为 deliver,等过一阵子确定都没有误判后,再将它改为 delete。
High Scoring Spam Actions = deliver
最后,您就可以重开机以使用 MailScanner 的功能了。
17.2.3 设定 MailScanner
除了上述的设定外,MailScanner 及 SpamAssassin 还有很多的设定项目可以修改,相关的设定档全部都放在 /usr/local/etc/MailScanner 中。我们先来说明一下这些设定档的用途:
[b]檔名[/b]
[b]用途[/b]
MailScanner.conf
这是 MailScanner 的主要设定档。
filename.rules.conf
用来设定拒绝的邮件附件的扩展名格式。
spam.whitelist.rules
用来设定白名单,也就是不会被判断为垃圾信的寄件者清单。
spam.blacklist.rules
用来设定黑名单,也就是一定是垃圾信的来源清单。
MailScanner.conf 是最主要的设定档,我们先来看看几个比较常用的项目:
# 设定您的组织缩写。这个项目会被 MailScanner 用在信件的标头中。必须注意的是这个设
# 定最好只使用英字及数字。
%org-name% = twbsd
# 用来设定您的组织全名。这个名称会出现在 MailScanner 所寄出的回报信件中,它会被当
# 成签名档附在信件的最下方。
%org-long-name% = Taiwan BSD Group
# 用来设定您的组织网址。这个网址会出现在 MailScanner 所寄出的回报信件中,在信件最
# 方会出现这个连结。
%web-site% = [url]http://www.twbsd.org[/url]
# 设定 MailScanner 多久要检查一次是否有新的信件进来,以秒为单位。
Queue Scan Interval = 6
# 设定允许的最大附件大小。如果设为 -1 表示不检查,0 表示不允许附件。
Maximum Attachment Size = -1
# MailScanner 会检查档案的扩展名、格式。如果是 zip 档,它也会将它解压缩并检查压缩
# 档中的内容。我们常会遇到因为扩展名问题而副件被 MailScanner 的问题。如果您将下列选
# 选项设为 0,则 MailScanner 就不会去检查压缩档中的档案格式。
Maximum Archive Depth = 0
# 设定使用 clamav 做为病毒扫瞄工具。
Virus Scanners = clamav
# 是否要检查网络钓鱼。网络钓鱼 (Phishing) 的意思是使用伪装的信件,让使用者以为是另
# 一个网站所寄来的数据,让使用者上勾。例如,伪造某银行的信件,要您输入信用卡号等。不
# 过这个项目可能会让您信件中有类似 192.168.1.1 这种 IP 时出现警告讯息。
Find Phishing Fraud = yes
# 是否要在信件中出现 IP 的连结时提出警告。
Also Find Numeric Phishing = yes
# 下列几个项目都是用来检查一些信件中的 HTML 格式,并将比较可能有危险的格式移除。如果
# 将它们设为 yes,表示允许;no 表示不允许;disarm 表示以该格式的功能取消,但信件还
# 是送出。
Allow IFrame Tags = disarm
Allow Form Tags = disarm
Allow Script Tags = disarm
... 略 ...
# 是否启用 SpamAssassin。我们将它改为 yes,以使用 SpamAssassin 来检查垃圾信。
Use SpamAssassin = yes
# SpamAssassin 会检查信件内容,并依内容格式给予信件分数,分数越高表示越有可能是垃
# 圾信。您可以在收到信件后,查看邮件原始档,在原始档中有一行
# 「X-twbsd-MailScanner-SpamScore」,其后接的「s」数目就是分数。这个选项设定
# 了分数多少会被当作垃圾信。
Required SpamAssassin Score = 6
# 这个选项设定了分数多少表示是高分数的垃圾信。
High SpamAssassin Score = 10
# 下列选项控制了当被 MailScanner 判定为垃圾信时要如何处理。预设是在主旨加上标记并
# 送出。我们可以将它改为 delete (删除)、store (隔离)、bounce (退信) 等。建议您
# 先设定为 deliver,等过一阵子确定都没有误判后,再将它改为 bounce。
Spam Actions = deliver
# 下列选项控制了当被 MailScanner 判定为高分数的垃圾信时要如何处理。所谓的高分数垃
# 圾信就是 MailScanner 有很高的把握认为这是垃圾信。预设是在主旨加上标记并送出。我
# 们一样可以将它改为 delete (删除)、store (隔离)、bounce (退信) 等。建议您先设
# 定为 deliver,等过一阵子确定都没有误判后,再将它改为 delete。
High Scoring Spam Actions = deliver
# 是否要在扫瞄发现信件没问题后,在信件最后加下 "Inline HTML Signature" 或
# "Inline Text Signature" 这二个选项所设定的内容。如果设为 yes,则信件最
# 后都会有使用 MailScanner 扫瞄过的讯息。
Sign Clean Messages = no
filename.rules.conf 可以用来设定邮件附件中不允许哪些扩展名。在 filename.rules.conf 中已经有一些预设的扩展名,如果您想要允许某些扩展名,可以修改该档案。例如,我们如果想要允许 .exe 档,则可以在下列这一行前加上「#」:
#deny \.exe$ Windows/DOS Executable
spam.whitelist.rules 及 spam.blacklist.rules 可以用来设定黑白名单。如果您有信件被误判为垃圾信,可以在白名单中加入让寄件来源,如此一来,该信件就不会再被当作垃圾信了。反之,如果有垃圾信没有被判断为垃圾信,则可以自行在黑名单中加入。这二个档案的格式一样,以 spam.whitelist.rules 为例:
From: *@*.friends.net yes
From: *@friends.net ye
From: 220.132.178.149 yes
From: 192.168. yes
它有三个字段,第一个字段是指定要检查的是来源或目的地,第二个是设定来源,第三个字段为 yes 表示是白名单。以上述内容为例,是设定所有从 friends.net 所寄来的信件都不是垃圾信。另外,我们也可以直接使用 IP 或网域。
17.2.4 MailScanner 进阶管理
在 MailScanner 上线后,我们必须先将设定放松一点,例如在判断是垃圾信时,不要退件或删除,还是先寄给使用者。如果使用者发现不该是垃圾信的邮件被误判,则可以将该信件加入白名单中。经过一段时间的测试都没问题了,再设定将高分数的垃圾信删除、并退回低分数的垃圾信。
当有误判时,我们必须要检查邮件源始档,知道误判原因后,才能将该寄信者加入白名单中。我们来看一下一封垃圾信的标头:
图 17-6
[img]http://homepage.cqwu.net/wxfy/images/ch17_06.png[/img]
我们可以看到这封信的分数是 7 (有 7 个 s),表示这是垃圾信。如果您觉得判断是否为垃圾信的分数太低,很多不是垃圾信也会被当成垃圾信,则可以将 MailScanner.conf 中的「Required SpamAssassin Score」调低。笔者使用的是 5。
当一封信被判断是垃圾信时,如果您选择将它隔离,则隔离的信件会放在 /var/spool/MailScanner/quarantine 中。当邮件附件中包含不合法的档名时,收信者会收到下列信件:
图 17-7
[img]http://homepage.cqwu.net/wxfy/images/ch17_07.png[/img]
如果您打附件,则会有下列内容:
This is a message from the MailScanner E-Mail Virus Protection Service
----------------------------------------------------------------------
The original e-mail attachment "netuse.bat"
is on the list of unacceptable attachments for this site and has been
replaced by this warning message.
If you wish to receive a copy of the original attachment, please
e-mail helpdesk and include the whole of this message
in your request. Alternatively, you can call them, with
the contents of this message to hand when you call.
At Sat Oct 1 21:37:13 2005 the virus scanner said:
MailScanner: Batch files are often malicious (netuse.bat)
Note to Help Desk: Look on the twbsd MailScanner in
[b]/var/spool/MailScanner/quarantine/20051001 [/b]
(message [b]j91Db6xx015931[/b]).
--
Postmaster
MailScanner thanks transtec Computers for their support
如果有使用者要求要取回该档案,您可以看一下上列附件的内容,并依它所说明的地址 (以上列为例是 /var/spool/MailScanner/quarantine/20051001/j91Db6xx015931 这个目录) 取回档案。
17.3 Open WebMail
Open WebMail 是一套由国人开发的多国语 Web Base 的邮件软件。它不仅可以让我们从网页上收发信件,还包含了一些强大的功能。例如,拼字检查、行事历、网络硬盘等等。安装它之后,使用者可以从任何计算机经由浏览器收发信件,真的很方便。
17.3.1 系统需求
在安装 Open WebMail 前,你必须先安装具有 CGI 功能的 Apache 服务器,如果你是照本书的说明安装,那么你的服务器就具有这项功能了,只要你有编辑 httpd.conf 将 CGI 的功能启动。除此之外,在开始安装 Open Webmail 之前,我们必须先安装下列套件。
Open WebMail 使用具有 SUID 功能的 suidperl,但由于 suidperl 有危险性,所以 FreeBSD 将 suidperl 的功能关闭了。因此,在安装之前,我们必须先安装具 SUID 功能的 Perl。请注意,由于 Perl 有很多相关的模块,如果您之前有更新过 port tree,则现在要安装的 Perl 版本可能和原本系统中的版本不同,将会造成很多程序无法运作。所以,如果您之前有做过 port 的更新,您应该要使用 portupgrade 来安装 Perl。
我们使用 portupgarde 来安装 Perl,如果您还没有安装 portupgrade,请使用下列指令安装:# cd /usr/ports/sysutils/portupgrade
# make install clean
关于 portupgrade 的说明,请先参考「软件安装」一章。接下来,我们就可以使用 portupgrade 来更新 Perl 了。请先使用 perl -v 来查看您目前所使用的 Port 版本,FreeBSD 6.0 预设是使用 Perl 5.8.x,所以我们使用下列指令更新:# portupgrade -rf "perl-5.8.*" -m "ENABLE_SUIDPERL=yes"
# ln -s /usr/local/bin/suidperl /usr/bin/suidperl
接下来,我们就可以来安装一些 Open WebMail 所需的软件了,如果在安装过程中,您发现这些软件已经安装过了,则可以跳过该软件。首先,为了要有检查附加档案的功能,必须安装 MIME-Base64,我们可以使用下列指令安装:# cd /usr/ports/converters/p5-MIME-Base64
# make install clean
为了具有拼字检查功能,必须安装 ispell,请以 ports 安装:# cd /usr/ports/textproc/ispell
# make install clean
为了要支持 MD5 加密,我们必须安装 perl 的 MD5 模块:# cd /usr/ports/security/p5-MD5
# make install clean
为了要让 Open Webmail 可以有语言转换的能力,我们必须安装Text-Iconvv:# cd /usr/ports/converters/p5-Text-Iconv
# make install clean
另外,还要先安装 libnet 这个网络模块:# cd /usr/ports/net/p5-Net
# make install clean
您的 Apache 必须支持 CGI,请编辑 httpd.conf,找到关于你网页根目录设定的地方,并在 Options 选项中加入 ExecCGI,并设定好 cgi-bin 的所在目录:
#
# This may also be "None", "All", or any combination of "Indexes",
# "Includes", "FollowSymLinks", "ExecCGI", or "MultiViews".
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
    Options Indexes FollowSymLinks MultiViews ExecCGI
... 略 ...
ScriptAlias /cgi-bin/ "/home/www/cgi-bin/"
... 略 ...
接着请重新启动 Apache 就做好事前的准备了。
17.3.2 安装 Open WebMail
您可以到下列网址取得最新版的 Open Web Mail。
[url=http://turtle.ee.ncku.edu.tw/openwebmail/download/]http://turtle.ee.ncku.edu.tw/openwebmail/download/[/url]
假设您网页根目录在 /home/www 中,而在 apache 中所设定的 cgi-bin 目录是在 /home/www/cgi-bin 中。请将取得的档案放到你的网页根目录去,并 cd 到你的网页根目录。执行下列指令以将取得的档案解压缩:# tar -zxvBpf openwebmail-2.51.tar.gz
解压缩后会在 cgi-bin 中产生一个目录为 openwebmail,存放 Open WebMail 的主要程序;另外会产生一个 data 的目录,在 data 目录下也有一个 openwebmail 的目录,该目录存放 openwebmail 非 cgi 的数据(如图片、声音等)。我将 /home/www/data/openwebmail 的目录搬到 /home/www/openwebmail。并将 cgi-bin 目录下的 openwebmail 搬移到 /home/www/cgi-bin 目录中。现在 openwebmail 的 cgi 程序位于 /home/www/cgi-bin/openwebmail 中,非 cgi 档案位于 /home/www/openwebmail 中,我们要记住的就是这二个目录的位置以方便下列的设定。
最后要修改 /home/www/cgi-bin/openwebmail/etc/openwebmail.conf,更改你的参数设定,尤其是路径。基本上要修改的地方有:
# ow_cgidir : openwebmail cgi 程序的目录
ow_cgidir /home/www/cgi-bin/openwebmail
# ow_cgiurl : 以 openwebmail 的 cgi 程序目录所在的 url
ow_cgiurl /cgi-bin/openwebmail
# ow_htmldir : openwebmail 非 cgi 的目录
ow_htmldir /home/www/openwebmail
# ow_htmlurl : 非 cgi 程序所在的 url
ow_htmlurl /openwebmail
我们接着要初始化 Open Webmail,请执行下列指令:# /home/www/cgi-bin/openwebmail/openwebmail-tool.pl --init
您会被要求是否要送出系统信息到 Open Webmail 的总部,如果您不想送出任何数据,只需按 N 即可。最后我们就可以使用 [url]http://yourhost/cgi-bin/openwebmail/openwebmail.pl[/url] 来连到登入的首页,请使用系统中的使用者账号 (root 不能登入) 及密码登入,登入后画面如下图所示。
图 17-8
[img]http://homepage.cqwu.net/wxfy/images/ch17_08.png[/img]
Open WebMail 是台湾人写的软件,它的使用手册非常丰富,您可以点选登入首页的「说明」部份来查看使用手册。

逍遥 发表于 2006-6-5 15:22

第十八章 DHCP服务器
DHCP (Dynamic Host Configuration Protocol) 服务器可以用来让网络中的计算机自动取得 IP 设定。架设 DHCP 服务器可以让网络中的计算机设定更容易,您不必再去一台台为每一台计算机设定 IP,这对于大型网络而言可以大幅减少管理者的负担。
读完本章后,您将了解下列主题:
如何架设 DHCP 服务器。
DHCP 服务器的运作原理。
如何使用 DHCP 服务器来追踪网络问题。
18.1 DHCP 简介
一台计算机要连上网络必须要先设定 IP、子网掩码、路由、DNS 等。一般使用者对这些网络设定并不熟,如果要使用者自己设定这些项目很麻烦。而且,如果网络上有十几台,甚至几百台计算机,如果由 MIS 人员分配 IP、设定计算机实在太累人了。日后如果有新的计算机加入您的网域,系统管理者又要一台台去设定网络数据。这种无趣又乏味的设定工作对管理者而言实在是浪费时间。如果您有使用笔记型计算机,在没有 DHCP 的情形下,在公司要设定一次 IP,回到家又要再设定一次,太麻烦了。
如果有了 DHCP 服务器,网络上的计算机只要设定好自动取得 IP,系统开机后就可以自动取得网络设定。管理者不需要告诉使用者该使用什么 IP,不必再为一台台计算机设定 IP,生活从此更美好了。有了 DHCP 服务器之后,使用笔记型计算机的人只要设定好使用 DHCP,将计算机插上网络线后就可以自动取得 IP,而不必再做任何设定。
在设定 DHCP 服务器时,我们会设定要让使用者自动取得的 IP 地址范围、路由、DNS,在启动 DHCP 服务器之后,这些信息就会放到内存中等客户端来问。当一台使用 DHCP 自动取得 IP 的计算机连上网络后,它会以广播的方式询问网络上有没有 DHCP 服务器,而 DHCP 服务器会响应,并送给客户端网络设定的数据。客户端收到这些信息后,就将它设定为自己的 IP、DNS 等。
如果以 DHCP 的术语来说,DHCP 分配出一个 IP 的情形叫做 DHCP「出租」IP 给客户端。DHCP 的租约是有期限的,时间到了之后,客户端就必须重新取得一次 IP,不过客户端可以要求继续使用同一个 IP。为了避免有机器一直要求使用同一个 IP,我们也可以设定同一个 IP 最长的租期是多久。
除了动态的分配 IP 外,DHCP 也可以同时设定指派固定 IP。每一张网络卡都会有一个固定的网络卡地址 (MAC、Physical Address),例如,我们可以在 FreeBSD 中使用指令 ifconfig 或是在 Windows 中使用 ipconfig/all 来看到 MAC 的信息。以下列为例:# ifconfig
fxp0: flags=88c3 mtu 1500
options=b
inet6 fe80::202:b3ff:fe48:7c74%fxp0 prefixlen 64 scopeid 0x1
inet 10.0.0.1 netmask 0xff000000 broadcast 10.255.255.255
ether [b]00:02:b3:48:7c:74[/b]
media: Ethernet autoselect (100baseTX )
status: active
上列粗体部份「00:02:b3:48:7c:74」就是网络卡地址,我们可以设定某个网络卡地址一定使用固定 IP,如此一来,只要这一台机器使用 DHCP 要求 IP 时,DHCP 服务器都会给它固定的地址。
如果您的机器有多张网络卡,在设定 DHCP 时,我们可以指定只要接受某个网卡进来的要求。DHCP 服务器所需要的系统资源很少,所以通常除了 DHCP 外,我们还会在同一台机器上架设其它服务。例如,NAT、防火墙、网页服务器、或 DNS 等。以一个公司而言,DHCP 是一种内部所使用的服务器,它和网络上要使用 DHCP 服务的计算机一定有所连结,中间不会有防火墙阻挡了 DHCP 的封包。通常我会将 DHCP 和 NAT、或 DNS 服务器放在一起。
18.2 安装 DHCP 服务器
在安装 DHCP 服务器之前,请确定您的核心有支持 bpf 装置。FreeBSD 的 GENERIC 核心预设就有支持 bpf 装置,如果您有修改过核心,请重新加入 bpf 的支持。
DHCP 服务器有很多软件可以使用,我们使用 ISC DHCP,请使用下列指令安装:# cd /usr/ports/net/isc-dhcp3-server
# make install clean
执行上述指令后,将出现下列画面:
图 18-1
[img]http://homepage.cqwu.net/wxfy/images/ch18_01.png[/img]
我们只要使用预设的设定即可。
安装完后,在 /usr/local/etc/dhcpd.conf.sample 有一份预设的 DHCP 设定档。我们可以将它复制成 /usr/local/etc/dhcpd.conf 并进行修改。以下是笔者的设定文件范例:
option domain-name "twbsd.org";
option domain-name-servers 168.95.1.1;
option subnet-mask 255.255.0.0;
option broadcast-address 192.168.255.255;
# 本地时间与格林威治时间差(快八小时)。
option time-offset 28800;
# 预设租期时间长度: 一天(秒)。
default-lease-time 86400;
# 最大租期长度: 十天(秒)。
max-lease-time 864000;
ddns-update-style none;
# 子网络与网络屏蔽。
subnet 192.168.0.0 netmask 255.255.0.0 {
        # 动态分配 IP 位置范围。
        range dynamic-bootp 192.168.100.1 192.168.100.253;
        range dynamic-bootp 192.168.101.1 192.168.101.253;
        # 子网络路由器。
        option routers 192.168.1.1;
}
# 设定使用固定 IP 的机器
host alexserver {
        hardware ethernet 00:07:e9:03:39:80;
        fixed-address 192.168.1.2;
}
dhcpd.conf 设定文件中,每一个项目的说明如下:
option domain-name:用来设定网域名称。
option domain-name-servers:设定 DNS 服务器 IP。
option subnet-mask:设定要给 client 的预设子网掩码。
option broadcast-address:设定要给 client 的预设广播地址。
option time-offset:设定本地时间和格林威治时间差几秒。
default-lease-time:设定预设的租期。租期以秒计算,租约到期后,服务器会回收该 IP。
max-lease-time:当租约到期后,客户端可以继续要求使用同一个 IP,这个选项控制该 IP 最长可以被使用多久。
ddns-update-style:这是用来设定是否支持 ddns 更新 IP,这个选项一定要存在才不会有错误。
接下来的 subnet 设定中,我们所使用的子网络是 192.168.0.0/255.255.0.0,DHCP 的 IP 分配范围是 192.168.100.1~192.168.100.253 及 192.168.101.1~192.168.100.253。并设定预设的路由器为 192.168.1.1。
另外,我们设定了一个命名为 alexserver 的设定,只要网络卡地址是 00:07:e9:03:39:80 的计算机则指派 192.168.1.2 这个固定 IP 给它。
接下来请在 /etc/rc.conf 中加入下列这一行,以在开机时启动 DHCP 服务器:
dhcpd_enable="YES"
如果您有多张网络卡分属于不同的网域,则在 dhcpd.conf 必须设定这些网域都必须要有设定值。如果您只想要 DHCP 监听某个网络卡,则可以在 /etc/rc.conf 中加入下列设定,让 DHCP 只接收该网卡进来的要求:
dhcpd_ifaces="fxp1"
最后我们就可以使用下列指令启动 DHCP 服务器了:# /usr/local/etc/rc.d/isc-dhcpd.sh start

18.3 客户端 DHCP 设定
在客户端设定方面,如果您使用的是 FreeBSD,请参考「网络设定」一章中关于使用 DHCP 动态取得 IP 的设定说明。
如果您使用的是 Windows 2000/XP,请以鼠标右键点选桌面上的「网络上的芳邻」,选「内容」后出现「网络联机」的画面后,点选「局域网络」后出现下列画面:
图 18-2
[img]http://homepage.cqwu.net/wxfy/images/ch18_02.png[/img]
接着请选则「Internet Protocol (TCP/IP)」后,点选「内容」出现下列画面:
图 18-3
[img]http://homepage.cqwu.net/wxfy/images/ch18_03.png[/img]
接下来按确定即可使用 DHCP。
18.4 DHCP 及系统管理
DHCP 服务器会将所有出租过的 IP 信息存放在 /var/db/dhcpd/dhcpd.leases 中。我们来看看该档案的内容:
lease 192.168.101.99 {
   starts 1 2005/10/03 01:47:16;
   ends 2 2005/10/04 01:47:16;
   binding state active;
   next binding state free;
   hardware ethernet 00:02:b3:1d:61:7a;
   uid "\001\000\002\263\035az";
   client-hostname "test-winxp";
}
lease 192.168.101.44 {
   starts 1 2005/10/03 02:09:40;
   ends 2 2005/10/04 02:09:40;
   binding state active;
   next binding state free;
   hardware ethernet 00:02:b3:26:ca:64;
   uid "\001\000\002\263&\312d";
   client-hostname "build";
}
我们可以看到每一个区段都是一次 IP 出租的信息。这些信息中包含了 IP、开始时间、网络卡地址、客户端计算机名称等等。这些信息有的时候对于我们管理网络中的计算机还蛮有用的。
举例而言,假设有人不小心将计算机设定成您的 IP,在 FreeBSD 的 console 下您会看到下列讯息:
arp: 192.168.1.9 moved from 00:c5:b5:5d:9c:94 to 00:aa:00:01:b7:54 on fxp1
arp: 192.168.1.9 moved from 00:aa:00:01:b7:54 to 00:e9:38:54:92:c3 on fxp1
arp: 00:0c:29:07:0e:7d is using my IP address 192.168.0.4!
如果是有人在使用您的 IP,您会看到如上述最后一条讯息「xxx is using my IP address」。如果是另外一台机器的 IP 改变了,您会看到「xxx moved from xxx to xxx」的讯息。从这些讯息中,我们可以知道误用 IP 的人的网络卡地址。以上述范例的第三行为例,其网络卡地址是「00:0c:29:07:0e:7d」。接下来,您就可以去 dhcpd.leases 中检查,该网络卡地址是不是曾经使用过 DHCP 服务器。如果有,则您可以找到它的「client-hostname」,并经由该信息找到该计算机。

页: [1] 2

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.