大家论坛

 找回密码
 注册
查看: 5988|回复: 14

FreeBSD 6.0 架设管理与应用(第1-4章) [复制链接]

Rank: 18Rank: 18

积分
4008
帖子
975
精华
6
经验
2965 点
威望
0 点
金币
2844
发表于 2009-6-18 13:32:46 |显示全部楼层


文中使用大量图片附件,请注册并登录论坛后浏览。





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

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

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

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

本书将带领读者从基本的系统使用、网络服务器架设、到深入系统管理所需的知识,并将笔者在管理公司及学校服务器的经验和读者分享,期望对有心学习 FreeBSD 的使用者有所助益。
经过一年的漫长等待,FreeBSD 终于又释出最新的 6.0 版本了。FreeBSD 6.0 可以说是继 4.x 以后最稳定的分支。由于之前 FreeBSD 5.x 加入了许多新的功能,不论是稳定性或效能都比不上 4.x。然而 6.0 改善了 5.x 的稳定性,它可以说是 FreeBSD 近年来最重要的一次更新。因此,其释出的时间也一再延期,最主要的目的就是要提供使用者一套好用的操作系统。

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

王俊斌

2005 年 11 月

附件: 你需要登录才可以下载或查看附件。没有帐号?注册

使用道具 举报

Rank: 18Rank: 18

积分
4008
帖子
975
精华
6
经验
2965 点
威望
0 点
金币
2844
发表于 2009-6-18 13:38:51 |显示全部楼层

第一章 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

在 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 都是你可以下载安装的版本。

1.6 如何得到更多信息?

笔者网站有本书所有内容及一些关于 FreeBSD 的文章。除此之外,FreeBSD 的使用者众多,且十分热心,在国内外有许多高手们将自己的经验开放给使用者参考。以下即为部份 FreeBSD 的站台。

中文站台

英文站台


1.7 本书光盘使用说明

本书附有二片随书光盘,第一片光盘为 FreeBSD 6.0-RELEASE 安装光盘,第二片为本书所需的所有软件及笔者设定文件的范例。
光盘二档案说明:

文件名称说明
/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 安装软件时(参考「软件安装」一章的说明),它会先检查计算机中是否也有该软件的原始文件,如果没有则将自动从网络下载。
附件: 你需要登录才可以下载或查看附件。没有帐号?注册

使用道具 举报

Rank: 18Rank: 18

积分
4008
帖子
975
精华
6
经验
2965 点
威望
0 点
金币
2844
发表于 2009-6-18 13:53:14 |显示全部楼层

第二章 安装 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 站台的网址:

下载时您会发现该目录中有一个档案叫做 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 以后的版本:
  1. c:>fdimage -f 1.44M kern1.flp A:
  2. c:>fdimage -f 1.44M kern2.flp A:
  3. c:>fdimage -f 1.44M boot.flp A:
复制代码
如果您使用 FreeBSD 4.x:
  1. c:>fdimage -f 1.44M kern.flp A:
  2. 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。举例说明:


分割区名称说明
ad0s1ad0 代表第一个硬盘,s1 是第一个主要扇区,我放 MSDOS。
ad0s2as2 代表第二个主要扇区,最后一个 a 在传统上是指根目录。
ad0s2bb 在传统上是指 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

在一般 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.....等。
swap512 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 用都没用到。我们会在档案系统管理一章中做更详细的说明。
/usr10 GB放执行档、设定档等,日后安装的软件都会放在这里,所以要大一点。如果要安装X Window的话,至少要有 7 GB,因为在安装过程中,编译时会用去很大的空间,安装完清除暂存档后大概还是需要 3GB 吧。如果不安装 X Window,只当服务器用的其它数据又位于另一个独立的分割区,则 /usr 2GB 一定足够。
/tmp1 GB/tmp 是许多程序的暂存区,其权限通常是所有使用者都可以读写,而且这个目录写入频繁,所以我将它独立出来。如果您的服务器上所执行的程序会用到大量的暂存空间,您可以切大一点。您也可以将 /var/tmp 也独立分割一个扇区,因为像 /tmp 及 /var/tmp 这二个目录都是一般使用者可以写入的地方,如果使用者在里面放大量档案而造成磁盘空间满了,会影响原本的系统运作 (例如必须用到 /var/log、/var/mail、及 /var/spool 的邮件服务器等)。
/var5 GB这是放使用者信件、寄信时暂存区及一些系统记录(log) 的地方,如果信都不大、使用者不多,设成 100MB 也没关系,如果要做邮件服务器的话,就设大一点吧。使用者新进的信件都会放在 /var/mail 目录下,您也可以将这个扇区独立出来,并在这个扇区上设定限制使用者磁盘空间配额。
/home22 GB这里是放使用者的目录,我通常把网页都放在这里。这个分割区会被用来存放使用者的数据,所以我将剩下的空间都给 /home 使用。如果您没有分割出 /home 这个扇区,/home 这个目录将使用 /usr 的扇区。

小提示

如果您有多颗硬盘,建议您可以将数据放在独立的一颗硬盘,例如将 /home 分割在另一个硬盘上。这样一来,日后升级时,由于数据在独立的分割区,我们只要把该分割区挂入即可。


2.1.4 多重开机

FreeBSD 本身就支持多重开机,如果您想在计算机中安装不同的操作系统,例如同时安装 Windows 98 及 FreeBSD 的话,请先安装 Windows 98 再安装 FreeBSD。在安装 FreeBSD 时,可以选择使用 FreeBSD 内定的多重开机程序,也可以安装您喜欢的多重开机软件。FreeBSD 的多重开机就只有二行字,画面比较简单,但是安装容易,不需做额外的设定。如果您对于这种画面不满意,您可以使用其它多重开机软件在安装完 FreeBSD 后再在 Windows 98 下设定多重开机。

顺道一提,如果您使用了 FreeBSD 或是其它的多重开机, 日后要移除多重开机管理员时只要在 MS-DOS 下执行下列指令即可:
  1. 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 就可以继续开机了。

小提示

请记得先在 BIOS 中设定使用光驱或软盘机做为第一个开机来源,这样我们才可以进入 FreeBSD 的安装喔。一般进入 BIOS 设定的方式是按 <Del> 或是 <Ctrl>+<Alt>+<Esc>,或是 <F10> 等,请参考您主机版的使用手册以得知正确设定方式。


2.2.2 设定核心

如果您使用 FreeBSD 5.x 以后的版本,系统一开机时会先出现一个选单:

图 2-2


请直接按 Enter 即可进入开机模式。如果您使用的是 FreeBSD 5.x 以后的版本,请直接跳到 2.2.3 小节;如果您使用 FreeBSD 4.x,开机完后会出现下列的画面:

图 2-3


这时候您可以选第一个跳过 kernel configure,也可以选第二个来设定核心。我通常第二个,因为有些硬件的驱动程序间会相冲,例如我的 SCSI 卡就不能选第一个直接进入,必须先移除其它的 SCSI 卡驱动程序。好吧,就选第二个 「Start kernel configuration in full-screen visual mode.」

图 2-4


在这里分成上下二个窗口,最上面的 Active-Drivers 是您要使用的驱动程序,下面是您移除的。如果在上面移除的话,就会跑到下面来。您可以用 [TAB] 键在二个窗口中移动,使用 [DEL] 键来删除设备。在这里只要设定 Storage 及 Network 的选项即可。设定完后按 Q 存档离开。

如果您的 SCSI 卡都是 PCI 接口的话,您可以把 Storage 中所有出现 SCSI 的选项都按 [DEL] 来删除,因为 PCI 的装置都是即插即用,都自动抓得到。其它设备网络卡等也都是这样,在 Network 选项中,里面的设备都是给 ISA 接口用的,如果您的是 PCI 的网络卡的话,就把它们都删了吧。如果您的设备有 ISA 接口的话,而您又不知道自己的设备是哪一个,就把它们都留着。

在 Storage 选项中,有 IDE 硬盘及软盘机用的设备,请不要把它们删除,最后的 Storage 选项至少应有下列图 2-5 所示的三个:

图 2-5


完成了上面的步骤,就可以按 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


我们选择第四项 Custom 来自订安装。请使用上下键来选择,并以空格键来确定进入。如果要把光棒从 Select 移到 Exit Install 的话,请使用左右键来移动。进入 Custom 后会出现下列画面:

图 2-7


如果您所使用的开机片并不是您想要安装的版本的开机片的话,您要先选第二项 Options 进去修改 Release Name 的部份,否则就可以略过这一步,直接选 3 Partition 来选择要安装 FreeBSD 的硬盘扇区。

2.2.4 分割硬盘

进入 Partition 选单时,如果您有二颗以上的硬盘,首先会出现硬盘选单,如图 2-8 所示:

图 2-8


您会看到上面的图,我们之前说过 ad0 是第一个硬盘,而这里的 ad2 是指第二个硬盘排线的第一个硬盘(master disk on the second IDE controller)。把光棒移到您要使用的硬盘,再按空格键进入即出现下面的画面。如果二个硬盘都要使用,等一下分割完第一颗之后再来设定第二颗。

图 2-9


在图 2-9 中,光棒所指的就是未使用的空间,如果您这个硬盘只要给 FreeBSD 使用的话,您可以直接按 A 使用整个硬盘。如果您有 DOS 分割区的话,应该会出现一列是 fat 的扇区。

我们把光棒移到 unused 的地方,按 C 来建立扇区,它会问您要使用多大的空间,您可以输入 10000M 代表 10000 MB 也就是 10 GB 。接着按 Enter 键,它会问您 TYPE ,预设是 165 ,这是 FreeBSD 档案系统代号,请直接按 Enter 就可以了。好了之后再对着刚设定好的 freebsd 扇区按 S 设定为可以开机,如果没有设定也没关系,FreeBSD 会自动将它设定可开机。最后按 Q 离开画面。离开后会出现下列画面:

图 2-10


上图是问您要使用哪一种开机管理员,如果要使用其它操作系统,您可以使用 FreeBSD 的多重开机管理员,即选择第一个 BootMgr 选项。如果要使用其它多重开机管理员就选 None,不过这样一来如果没有安装其它多重开机管理员便无法使用 FreeBSD 开机。如果您的计算机中只有 FreeBSD 这个操作系统,就选中间这一个 Standard。我只要使用 FreeBSD ,并没有其它操作系统,所以我选 Standard。选完后会回到刚才的硬盘选单,如果您还有其它的硬盘要加入的话,您可以选其它硬盘重复刚才的步骤,如果要加入的是 DOS 的硬盘,只要选择进入后,什么都不做,直接按 Q 离开即可。当所有的硬盘都设定好了,回到硬盘选单时,按 Cancel 离开选单,回到自订安装选单。

回到自订安装选单后,选第 3 个 Lable 进入 Disk Lable 编辑。即图 2-11 的画面:

图 2-11


我们之前在安装前的须知中说过关于扇区的分割方式及大小配置,您可以直接按 A 自动配置,不过这样出来的结果可能不是我们想要的。所以我们手动来做吧,最上方蓝色光棒的位置就是您现在要分割的硬盘及其使用空间。如果有二个硬盘,所看到的就不是像上面那样,而是有比较多个硬盘。不管硬盘有多少个,只要对着您要的硬盘按 C 去建立一个分割区,它会先问您大小,如图 2-12 所示:

图 2-12


在图 2-12 询问您所要分割的大小时,您可以输入想要的空间大小,接着会出现图 2-13 的画面,询问您要给哪一种类型的分割区,如果是要给目录使用的话,就选 A file system,如果是 swap 就选 A swap partition。我们先来分割给根目录使用,如下图:

图 2-13


接着选择挂入点,如果是分割给 swap 使用的话,并不会问您挂入点是什么。这里我们先分割根目录,如图 2-14:

图 2-14


这时您就输入 / 就代表根目录。接着再继续分割给其它目录,如 /usr、/home等。最后如图 2-15 所示:

图 2-15


在图 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 离开,回到自订安装选单吧。接下来就开始选择要安装的套件。

小提示

如果您之前安装过 FreeBSD,而且将数据存在另一个硬盘,您可以使用 M 将它挂入一个目录中。硬盘分割安装完成后,除非重新安装,否则就无法再做更动,所以请小心规划硬盘的使用空间。如果您真的不知道怎么分割,您可以先分割成一个根目录及 swap 空间,下次再安装时,您就可以依照当时实际的使用情形来分割硬盘了。


2.2.5 安装自订套件

回到了自订安装选单后,选择 Distribution 来选择要安装的套件。进入图 2-16 的画面后,选择最下方的 Custom:

图 2-16


在上图中选 Custom 后,会进入图 2-17 的选单:

图 2-17


您最简单的方式就是选择所有的套件 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


如果您是以光盘安装的话,就选第一个 CD/DVD 作为安装来源,选了之后就可以回到自订安装选单,选 Commit 开始安装,并按下确定开始。

如果您是以网络安装的话,就选第二个 FTP。选了 FTP 之后,会问您要使用哪一个 FTP 站台,这时候请选第二个 URL Specify some other ftp site by URL 来自订要使用的 FTP 站台。进入后会问您要使用的站台位置,您要先去找出该 FTP 站台放 FreeBSD 的目录为何,以交大资工而言,您应该输入 ftp://freebsd.csie.nctu.edu.tw/pub/releases/i386/

接着会要求您设定网络,使用网络安装必需先设定网络,出现图 2-19 的画面,要您选择网络卡:

图 2-19


图 2-19 中,您的网络卡会出现在第一个,如果您有二张网络卡的话,就会有二个不同编号。选择一个对外连到网络的卡后,接着会问您是否要使用 IPv6 选否,再来是问您要不要使用 DHCP (自动取得 IP 地址....这就看您有没有 DHCP server 可以自动取得 IP 啰),接着就进入图 2-20 的画面。

图 2-20


您要先知道您的 Domain Name 及 IP 等,如果没有 Domain Name 的话,就随便输入吧。假设我们的机器是 www.mydomain.com ,所以在 Host 一栏中就输入 www.mydomain.tw,在 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


这时候就选 Configure 进入设定选单,在 Configure 选单中,我们可以设定本机的基本资料。在这里我们仅设定下列几项:
  • 设定网络:进入后选择 Networking 设定网络,如果您是用网络安装的话,您已经设定好了。如果是用光盘安装的话,就必须进入进行设定。请参考前面安装时选择安装媒体时所做的网络设定方式。
  • 设定键盘速度及屏幕保护程序。
  • 设定时区 Time Zone。

如果您要设定键盘速度,请选择 Configure 以进入设定选单,如图 2-22 所示:

图 2-22


这个设定选单中,各个选项的说明如下:


Distributions让我们新增 FreeBSD 的安装套件。
Packages安装其它 packages 软件。
Root Password设定超级使用者密码。
Fdisk分割硬盘的工具,日后要再加入新硬盘时可以使用。
LabelDisk Label editor,让我们将己分割的硬盘再分割成不同扇区,以挂入 FreeBSD 中使用。
User Management使用者账号管理工具。
Console文字模式下屏幕的设定。
Time Zone设定时区。
Media让定安装软件的来源。
Mouse设定鼠标。如果您要使用鼠标,可以在此驱动。
Networking设定网络。
Security设定 FreeBSD Security Level。
Startup设定开机时要启动的选项,我们可以在 /etc/rc.conf 中设定。
TTYs设定不同 TTY 的权限。
Options设定一些安装时选项。
XFree86X Window 的设定。
DesktopX Window 的桌面管理员设定。
HTML Docs显示 FreeBSD HTML文件。
Load LKM从磁盘中加载 kernel module。

这里的设定只要先设定 Console 及 Time zone 即可,其余的设定(如新增使用者及设定密码等)我们都可以在重新开机后,于文字模式设定。

首先请选择 Console 进入图 2-23 的选单:

图 2-23


在 System Console Configuration 选单中,第二及第三个选项 Font、Keymap 可以让我们设定屏幕字型及键盘对映,不过我们不需要设定。第四项 Repeat 是设定键盘按键重复的速度,因为笔者喜欢按下一个键时,能快速的重复输入该键,所以我选了 Repeat 设定,并将速度设定 Fast。第五个选项是 Saver,我们可以选择喜欢的屏幕保护程序,也可以选择 Timeout 来设定启动屏幕保护的时间。当您设定完成之后,请选择 Exit 回到 Configuration Menu ,接着我们再选取 Time zone 来设定时区:

选择了 Time zone 后,它会问您目前 BIOS 是否设定为 UTC (格林威治时区),如图 2-24 所示,如果您不清楚,请选 NO。

图 2-24


接着要选择所在区域,我们选择第 5 项 Asia,如图 2-25:

图 2-25


然后再选择国家 Taiwan 即可。

图 2-26


最后系统会询问您所选择的是 CST 时区是否正确,如图 2-27,我们便选取 [Yes] 即可。

图 2-27


我们在 Configuration Menu 所做的设定最后都会存放在 /etc/rc.conf 中,如果日后有需要更改,可以经由修改 /etc/rc.conf 来完成。

最后就一直选 Exit ,最后 Exit Install 离开安装程序,重新开机即完成 FreeBSD 的安装。如果您在过程中遇到问题,可以到各大 BBS 的 386bsd 版中发问。
附件: 你需要登录才可以下载或查看附件。没有帐号?注册

使用道具 举报

Rank: 18Rank: 18

积分
4008
帖子
975
精华
6
经验
2965 点
威望
0 点
金币
2844
发表于 2009-6-18 14:09:09 |显示全部楼层

第三章 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


这里的 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 的提示符号是井字号 #。

我们可以在命令列提示之后输入指令,例如:
  1. # date
  2. Wed Jun 15 03:20:44 CST 2005
复制代码
我们输入指令 date 之后可以看到目前的系统时间。

指令语法

在 UNIX 系统中的指令大多是下列格式:
  1. command [-options] arg1 arg2 ...
复制代码
command 的部份就是指令本身,而 [-options] 表示指令的选项,arg1、arg2 则是要给该指令的参数。-option 使用 [] 括起来表示指令的选项可有可无,有的指令可能可以不必加任何选项及参数,如我们刚才输入的指令 date。而在指令之后输入参数会有不同的作用,例如,我们可以使用 date 这个指令来修改目前的系统时间:
  1. # date 200507141730
复制代码
上述指令即是设定时间为 2005 年 7 月 14 日下午 17 点 30 分。 下面这个范例是有加上选项的指令:
  1. # 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 这个指令的用法:
  1. # 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] + :用以清除整个命令列所输入的数据。
  • [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。

我们在下指令时,可以使用「~」这个符号表示家目录。例如,下列指令表示查看自己家目录中的档案:
  1. # ls ~
复制代码
如果您要查看其它使用者的家目录,可以在「~」之后加上使用者名称,例如:
  1. # ls ~alex
复制代码
目前工作目录

目前工作目录 (Current working directory) 顾名思义就是您目前在系统中的所在路径。您可以使用指令 pwd 来查看目前所在路径。

当我们在执行指令时,如果没有告诉该指令目录或文件名称,预设就是会使用目前的工作目录。例如,ls 这个指令,如果没有加上任何参数,表示我们要查看目前工作目录中的档案。

我们可以使用指 cd 来切换工作目录。例如,我们要将目前工作路径切换到 /usr:
  1. # cd /usr
  2. # pwd
  3. /usr
复制代码
我们可以看到在 cd 到 /usr 后,使用指令 pwd 的结果变成了 /usr 了。

您可以使用下列指令来回到之前的工作目录:
  1. # cd -
复制代码
目录结构

在 Windows 操作系统中,在档案总管中可以看到 Windows 的 "树状" 目录结构。而 FreeBSD 中的目录也是像一颗树,一个目录下还有很多个目录,和 Windows 不同的是在 UNIX 系统中每一个目录都有一定用途。我们了解 FreeBSD 目录结构的用意就是让我们知道每个目录的用途,日后我们要安装新软件或使用 FreeBSD 时,能按照这种规则来做,这样一来在管理维护上比较方便,目录也会比较有条理。

图 3-2


以下我们就简单的说明 FreeBSD 的目录结构,您也可以使用指令 man hier 来查看目录结构说明。


目录名称说明
/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 这个指令:
  1. # cat /etc/shells

  2. # $FreeBSD: src/etc/shells,v 1.5 2000/04/27 21:58:46 ache Exp $
  3. #
  4. # List of acceptable shells for chpass(1).
  5. # Ftpd will not allow users to connect who are not using
  6. # one of these shells.

  7. /bin/sh
  8. /bin/csh
  9. /bin/tcsh
复制代码
cat 这个指令会印出档案内容。不过如果档案案很大时,画面会一下子就卷走了。

如果您想要看一个比较大的文字文件,可以使用 more 或是 less 的指令,这二个指令会将档案内容分页显示,我们只要按 [Page Up]、[Page Down]、或是空格键就显示可以上一页或下一页。您也可以使用上下键来一行一行往上或往下卷。
  1. # more /etc/rc.firewall
复制代码
如果您看到一半想要离开,可以按 [q] 键即可。另外,如果您想要在 more 及 less 的输出中搜寻一个字符串,可以按 [/] 之后,再输入相要找的字即可。

小提示

您有没有注意到我们在使用指令 man 时也是分页显示,它其实就是使用 more,所以您也可以按 「q」来离开,或「/」来查找一个关键词。


档案与目录管理

我们简单介绍一下如何建立目录、复制档案、删除及搬移档案。首先,如果您要建立目录,可以使用 mkdir 这个指令:
  1. # mkdir myfolder
复制代码
我们给 mkdir 指令一个参数 myfolder,表示建立一个名为 myfolder 的目录。这个目录的参数可以是相对路径也可以是绝对路径。建立了目录后,您可以使用 ls 看一下它是不是真的建出来了。

如果您要复制一个档案或目录,可以使用 cp 这个指令:
  1. # cp /etc/rc.firewall ./firewall
  2. # cp /etc/rc ./
  3. # cp -R myfolder folder1
复制代码
上述第一行指令表示将 /etc/rc.firewall 复制一分到目前目录下,并命名为 firewall。如果您不指定档名,例如第二行指令,表示将该档案复制后维持同样的文件名称。如果您所要复制的是目录,必须加上 -R 的参数,如第三行指令所示。

接下来是重新命名档案或目录名称,重新命名或是搬移档案都是使用 mv 这个指令:
  1. # mv folder1 folder2
  2. # mv firewall /tmp/tmpfile
  3. # mv /tmp/tmpfile folder2
复制代码
第一行指令表示将 folder1 更名为 folder2,第二行指令是将 firewall 这个档案搬到 /tmp 目录下,并更名为 tmpfile。而第三行指令是将 /tmp/tmpfile 搬到 folder2 目录下。我们可以看到第三行指令比较特别,因为 folder2 是已经存在的一个目录,所以在更名时,档案会直接被放在该目录下。如果 folder2 不存在时,第三行指令的结果就会变成是将 /tmp/tmpfile 搬到目录所在目录下,并更名为 folder2。

接下来我们看看要如何删除档案及目录:
  1. # rm folder2/tmpfile
  2. # rm -rf folder2
复制代码
第一行指令就是要删除 folder2 目录下的 tmpfile。如果您要删除的是目录,则必须加上 -r 的参数,如第二行所示。而参数 -f 表示强制删除,如果档案或目录不存在时,不要显示任何错误讯息。

文件名称规则

我们在命名档案或目录时,有一些特殊字符是不可以使用的,例如「/」表示根目录,而且会用来分开目录名称,所以不可以使用。另外,还有一些规则:
  • 档案或目录不可以命名为「.」及「..」,因为它们分别代表目前的目录及上一层目录。
  • 档案开头最好不要使用「-」,因为「-」会被 shell 认为是参数而忽略。
  • 如果文件名称开头为「.」表示是隐藏档,在 ls 时,必须使用参数 -a 才会显示出来。

除此之外,有三个特殊字符在使用上要特别小心,分别是「\」、「*」及「?」。「\」在 UNIX 中是一个换行符号,也是一个跳脱字符。当我们在命令列要下一个指令太长时,可以使用「\」来换成,例如:
  1. # ls /usr/bin \  <- 按 [Enter]
  2. ? /usr/local
复制代码
在上述指令中,我们第一行最后有一个「\」,按下 [Enter] 后,会出现一个问号的提示字符,接着我们可以再继续输入未完成的指令,最后的结果就好像是二行指令变成一行一样。

另外「\」还可以做为跳脱字符。例如,我们要建立一个文件名称就叫做「\」,这时候我们可以在 「\」的前面再加一个「\」,表示取消「\」的特殊意义。

「 * 」及「 ? 」分别代表了「任何字」及「任何字符」,例如下列二行指令:
  1. # ls /etc/net*
  2. /etc/netconfig     /etc/netstart     /etc/network.subr    /etc/networks
  3. # ls /etc/rc.con?
  4. /etc/rc.conf
复制代码
第一行指令是要列出 /etc 目录下任何开头为 net 的档案,不管 net 后面有几个字都列出来。而第二个指令是要列出 /etc 下,任何开头是 rc.con,而最后一个字符是任何字的档案。

「 * 」表示任何字,不管是几个字符,而「?」表示任何字符,因为这二个字是特殊字符,我们不建议您用在档案命名上。如果您非要以这二个字为档名,必须在该字前面加上「\」来跳脱它的特殊意义。例如:
  1. # mkdir abc\*
  2. # rm -r abc\*
复制代码
搜寻档案

我们已经知道基本的档案管理了,接下来我们来看看要如何在茫茫人海中寻找一个档案。

如果您要找的是指令所在路径,可以使用 whereis:
  1. # whereis pwd
  2. pwd: /bin/pwd /usr/share/man/en.ISO8859-1/man1/pwd.1.gz /usr/src/bin/pwd
复制代码
我们可以看到 pwd 这个指令的位置是 /bin/pwd,另外还有它的使用手册及原始码路径也列出来了。

如果你要找的是任何类型的档案,可以使用 find。例如,我们要在 /etc 找 rc.conf 这个档案的位置:
  1. # find /etc -name rc.conf
  2. /etc/defaults/rc.conf
  3. /etc/rc.conf
复制代码
find 的第一个参数是要找的路径名称,接着我们使用 -name 后面加上文件名称来找 rc.conf 这个档。如果您要找所有扩展名为 .conf 的档案,可以用下列指令:
  1. # find /etc -name "*.conf"
  2. /etc/apmd.conf       /etc/host.conf    /etc/natd.conf       /etc/rc.conf
  3. /etc/auth.conf       /etc/inetd.conf   /etc/newsyslog.conf  /etc/resolv.conf
  4. /etc/devd.conf       /etc/login.conf   /etc/nsmb.conf       /etc/sysctl.conf
  5. /etc/devfs.conf      /etc/mac.conf     /etc/nsswitch.conf   /etc/syslog.conf
  6. /etc/dhclient.conf   /etc/make.conf    /etc/pf.conf         /etc/usbd.conf
复制代码
更多 find 指令的用法请参考「指令应用」一章的说明。

3.2.4 重导 I/O 及管道

所谓的重导 I/O 就是重新导向输入或输出的数据。在 UNIX 中有所谓的标准输入和标准输出。标准输入指的是预设的输入方式,例如我们在输入指令时,标准输入就是键盘,而标准输出就是将结果输出到预设的输出装置,也就是我们的屏幕。

然而,我们也可以使用一些特殊字符将标准输入、输出导向到其它地方。如果我们要重新导向标准输出,可以使用「大于」符号「>」,例如,我们可以让指令 ls 的结果不要显示在屏幕上,而导向输出在档案中:
  1. # ls /etc > /tmp/result
复制代码
上述指令的结果就会在 /tmp/result 中新增一个档案,内容就是 /etc 的档案列表。另外,我们可以使用 cat 这个指令及「>」来建立一个小的文字文件。cat 这个指令会将我们所输入的数据印在屏幕上,我们可以将输出重新导向到一个档案中:
  1. # cat > /tmp/result
  2. /etc/rc.conf
  3. /etc/rc.firewall
  4. [Ctrl]+[d]
复制代码
我们在输入指令后就可以开始输入内容,最后要离开只要按 [Ctrl]+[d] 即可。

上述指令中,我们使用一个「>」,它会建立一个新的档案 /tmp/result,如果该档案已存在,它会将档案清空。如果我们使用二个「大于」符号「>>」,则会在档案后面附加上内容,而不会清除档案原本的内容:
  1. # cat >> /tmp/result
  2. /etc/rc
  3. [Ctrl]+[d]
复制代码
经过上述指令后,/tmp/result 就会变成有三行资料了。

那我们要如何重导标准输入呢?既然标准输出是「>」,标准输入自然就是「<」了。例如,在 FreeBSD 中有一个 nslookup 指令可以用来查主机名称,它的使用方式如下:
  1. # nslookup
  2. > twbsd.org
  3. Server:         168.95.192.1
  4. Address:        168.95.192.1#53

  5. Name:   twbsd.org
  6. Address: 220.132.178.72
  7. > exit
复制代码
执行了 nslookup 后,我们必须输入所要查找的主机名称,最后输入 exit 离开。我们可以新增一个档案,内容为多个主机名称,最后使用下列指令一次喂给 nslookup:
  1. # nslookup < filename
复制代码
除了重导 I/O 外,还有一个类似重导的功能,称之为管道 (pipe)。我们可以将一个指令的输出转向到另一个指令的输入,而转向的方式就是使用「|」的符号。例如,我们可以将 ls 指令的输出,转向到 more 这个指令进行分页:
  1. # ls /etc | more
复制代码
另外有二个常用来和管道配合使用的指令「sort」及「grep」。sort 指令是用来做排序用,例如,我们可以将 ls 的输出结果依文件名称排序:
  1. # ls /etc | sort
复制代码
而 grep 指令可以用来过滤我们想要的数据,例如,我们可以将 ls 的结果导向到 grep 去找出文件名有包含 rc 的档案:
  1. # ls /etc | grep rc
复制代码
我们也可以在 grep 指令中加上参数 -v 表示要滤掉的字符串。例如下列指令就会滤掉文件名包含 host 的档案:
  1. # ls /etc | grep -v host
复制代码
3.3 文书编辑器

因为许多系统设定都必须修改设定档,而修改设定文件必须使用文书编辑软件,所以在开始所有设定之前,让我们先来了解文书编辑器的用法。

我们将介绍 FreeBSD 内附的二套文书编辑软件 ee 及 vi。这二套软件都是在命令列模式下使用的软件,ee 是一套比较适合初学者的编辑器,它的使用方式和我们一般的使用习惯较接近,操作简单又容易上手。不过 ee 是 FreeBSD 特有的编辑软件,在其它的 UNIX 系统中无法使用。因此,我们也将介绍另一套所有 UNIX 系统都内附的编辑器 vi。

vi 是一套威力强大的工具,操作熟练的人会觉得如有神助,而对于初学者而言却是望之却步。是否要将 vi 练到出神入化见人见智,但对于一个 UNIX 系统管理者而言,我们至少要知道一些基本的操作方式。
  1. 3.3.1 ee
复制代码
ee 是 FreeBSD 系统内附较适合初学者的文书编辑软件,它是 Easy Editor 的简称,顾名思义 ee 使用上十分容易。当您要编辑档案 example.txt 时,只要在命令列上打 ee example.txt 即可。执行 ee 之后将会出现下列画面:

图 3-3


在画面最上方有使用说明,几乎我们所有的会使用到的功能都在最上方的说明中。您可以使用上下左右键来移动游标,并直接输入内容,以下为 ee 的指令说明,请注意我们将键盘上独立的按键以小于及大于的符号括起来,例如 <Ctrl> 表示键盘上 Ctrl 这个键:


按键意义
<Ctrl> + [ 或 <ESC> 键显示主选单。
<Ctrl> + o输入 ASCII code,例如输入 65 就会显示 A。
<Ctrl> + u跳到档案结尾。
<Ctrl> + t跳到档案开头。
<Ctrl> + c输入指令。在按了 Ctrl+c 后,上方选单会出现命令说明,例如您可以直接输入数字,表示将光标移到某一行。
<Ctrl> + y搜寻。按了 Ctrl+y 之后,你可以输入欲搜寻的字符串。如果要搜寻下一个该字符串,只要再按 Ctrl+x 即可。预设的搜寻是不分大小写的,如果要区分大小写,您可以按 Ctrl+c 并输入 case 即可。如果要取消只要再按 Ctrl+c 并输入 nocase。
<Ctrl> + a跳到行首。
<Ctrl> + e跳到行尾。
<Ctrl> + d删除光标所在位置的字符。
<Ctrl> + j贴上上一次所删除的字符。
<Ctrl> + k删除光标所在位置的一整行。
<Ctrl> + l贴上上一次删除的一整行内容。
<Ctrl> + w删除一个字。
<Ctrl> + r贴上上一次所删除的字。
<Ctrl> + p将光标移到上一行。
<Ctrl> + n将光标移到下一行。
<Ctrl> + b将光标移到上一个字,和方向键左键一样。
<Ctrl> + f将光标移到下一个字,和方向键右键一样。
<Ctrl> + g下一页。
<Ctrl> + v上一页。
<Ctrl> + z移到下一个字。
<Esc> + <Enter>离开 ee。如果档案有修改过,它会问您是否要储存档案。

当我们按了 <Esc> 键时,会出现一个主选单,在选单中我们可以进行一些设定,如果您储存这些设定,它会被存在您的 home 目录下的 .init.ee,以 root 为例,设定档会存放在 /root/.init.ee。如果您要还原默认值,只需将该档删除即可。

3.3.2 vi

Vi 是一个历史悠久且功能强大的 UNIX 文书编辑器。在古早的年代,许多键盘都只有一些基本按键,连上下左右键都没有,所以 vi 大多数的功能都必须使用一些特殊的按键。

Vi 在使用时可以分成二种模式,一种是「编辑模式」,另一种则为「命令模式」。在编辑模式时,我们可以使用上下左右键来移动光标并编辑输入我们所要编辑的文字内容。而命令模式时,我们可以进行档案操作 (开文件、存盘等)、搜寻等功能。使用 vi 时,我们会很常按 <Esc> 键,<Esc> 键可以让我们离开编辑模式并进入命令模式。请执行 vi example.txt 来编辑 example.txt 这个档案,一进入 vi 时,预设会处于命令模式,我们必需先输入 "o"、"i"、或"a"才能进入编辑模式。

以下即为进入编辑模式的指令:

按键意义
iInsert (插入),在目前光标前开始输入。
aAppend (附加),在目前光标后开始输入。
o在光标下方新增一空白行并开始编辑。
O在光标上方新增一空白行并开始编辑。

如果您输入错误,您无法使用 <Delete> 或 <Backspace> 来删除,我们必须使用 vi 的其它命令来进行。请先按 <Esc> 来进入命令模式,接着您就可以使用下列指令来进行进阶编辑:

按键意义
x删除光标所在位置的字符。
dw删除游标所在到字尾,即删除一个字。
dd删除游标所在一整行。
d + 数字 + <Enter>删除从光标所在位置到其下方 n 行。例如输入 d5 <Enter>,将删除光标所在位置起 6 行。
yw复制光标开始到字尾。
yy复制游标所在一整行。
y + 数字 + <Enter>复制从光标所在位置到其下方 n 行。例如输入 y4 <Enter>,将复制光标所在位置起 5 行。
p贴上上一次复制的内容。
:w <Enter>存档。
:w 文件名称 <Enter>另存新檔。您必输在 w 后输入新的档名。
:q <Enter>离开 vi。如果档案有修改过会无法离开。
:wq <Enter>存档并离开。
:q! <Enter>不存档并离开。

接下来我们说明一下如何在档案中穿梭移动:

按键意义
h游标向左移。
j游标向下移。
k游标向上移。
l游标向右移。
^跳到行首。
$跳到行尾。
w游标跳到下个字的开头。
e游标跳到下个字的结尾。
b游标跳到上个字的开头
<Ctrl> + d光标往下移动半个屏幕。
<Ctrl> + u光标往上移动半个屏幕。
<Ctrl> + f光标往上移动一个屏幕。
<Ctrl> + b光标往下移动一个屏幕。
:数字 <Enter>跳到 n 行,例如输入 :100 即可将光标移到第 100 行。
/欲搜寻的字符串 <Enter>输入 / 后,您可以在 / 后输入所要搜寻的字符串,如果要找下一个,则直接按 / <Enter> 即可。

只要您熟悉了上列指令,您大概就可以很轻松的使用 vi 了。Vi 还有许多功能,你可以 man vi 来获得更多信息。
附件: 你需要登录才可以下载或查看附件。没有帐号?注册

使用道具 举报

Rank: 18Rank: 18

积分
4008
帖子
975
精华
6
经验
2965 点
威望
0 点
金币
2844
发表于 2009-6-18 14:09:54 |显示全部楼层
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 节中提及的使用 <Tab> 键自动完成档名外,最重要的一点是它会自动搜寻上一次输入的指令 (history-search-backward)。

例如,我们输入下列指令:
  1. # ls /usr/port/www
  2. # cd /usr/port/www
  3. # cd /usr
复制代码
在输入上述指令后,现在我们如果使用键盘方向键按上,将出现上一次所输入的指令内容。如果我们先打了 ls 再按方向键上,则 tcsh 会自动找出最近输入过开头为 ls 的指令,多按几次上它还会继续出现上上一次输入过的 ls 指令,很棒吧。

小提示

FreeBSD 的 tcsh 有 history search backward 的功能是因为在 ~/.cshrc 中有二行:

bindkey -k up history-search-backward
bindkey -k down history-search-forward

如果您不想使用 history search backware,只要将该二行删除即可。


如果您想变更自己所使用的 Shell,可以执行下列指令:
  1. # 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 这个变量的内容:
  1. # echo $PATH
  2. /sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin
复制代码
如果您使用 tcsh,您也可以打 setenv 来看目前所有的环境变量。以下为一些常用的环境变量:


变量名称描述
USER目前所使用的使用者名称。
PATH执行指令所要搜寻的位置,以冒号隔开。
SHELL目前所使用的 Shell。
TERM目前所使用的终端机模式。
OSTYPE操作系统名称。
MACHTYPE系统所使用的 CPU 架构。
PAGER当需要分页时,所要使用的分页软件,如 more 或 less。例如 man 这个指令就会参考您所设定的 PAGER 而使用 more 或 less。
EDITOR预设所要使用的编辑器。

您也可以使用 setenv 来改变一个环境变量的值。例如,我们要将预设的文书编辑器改成 ee,在 tcsh 中可以使用:
  1. # setenv EDITOR ee
复制代码
如果您使用的是 Bourne Shell:
  1. # 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 加入下列设定:
  1. setenv EDITOR ee
  2. alias ls ls -F
  3. set prompt = "%B%m [%~] -%n-> "
复制代码
第一行设定是将预设的文书编辑器改成 ee。第二行是要将指令 ls 变成 ls -F,就是每次打 ls 时,系统会出现 ls -F 的效果。而第三行是将命令列的提示符号改成下面这样:
  1. mydomain [/home/john] -john->
复制代码
就是开头是机器名称,再来是路径名称,最后是使用者名称。修改完 csh.cshrc 或 ~/.cshrc 后,您必须注销再登入才会看到修改后的效果。或者,您也可以使用下列指令来让修改立即生效:
  1. # 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 并在最后面加入以下的设定:
  1. # 支持中文的环境,让我们可以在 console 下或 telnet 中使用中文。
  2. setenv LANG zh_TW.Big5
复制代码
上述的环境变量设定会在使用者登入时自动被加载,一些程序 (例如 date) 会自动读取这些变量,并产生中文的讯息。不过由于我们的 console 尚未支持中文,我们必须先安装中文终端机软件,或在支持中文的 PC 上使用 telnet 登入。别急,我们会在下面几节中说明如何安装中文终端机。

3.5 使用者及权限管理

由于 FreeBSD 和所有的 UNIX 系统一样,在设定上都是为了支持多个使用者的环境,所以在使用者管理上必须考量到多个使用者同时使用时所会造成的影响。例如使用者 A 不可以删除使用者 B 的数据,某些使用者可以存取某些数据夹,某些则否。为了让系统管理更有效率,在支持多人使用的操作系统中,都有群组及权限的观念。

在 UNIX 系统中,每个使用者「至少」会属于一个群组,我们可以针对不同使用者或不同群组来设定他们在系统中的使用权限。以学校为例,每一个不同科系的学生都可以自由使用该科系中的资源。例如,只有资工系的学生可以使用资工系计算机教室、研究室等,这个「科系」就是使用者的预设群组。管理者可以针对这个群组去设定该群组可以使用的资源,而不必针对一个个学生设定。而每个学生还可以参加多个社区,例如管乐社、吉他社等。而只有该社团的成员才可以使用社团资源,如借用乐器、申请经费。这时候我们就可以把社团看成一个个使用者额外加入的群组。

上述例子中,在 UNIX 系统的实际情形可能是有一个使用者「u654321」,它的预设群组是「csie」,同时,他也是「guitar」群组。日后有新的资工学生时,我们只要将它加入「csie」群组即可,他就会具有资工学生的所有功能,而不必在新增使用者时去设定很多权限。

所以我们在新增使用者时,必须指定他的群组,预设的群组是一个和使用者同名的新群组,我们先来看看新增使用者的过程,请使用指令 adduser 来新增使用者。系统会问您一些问题:
  1. # adduser
  2. Username: jack
复制代码
执行了 adduser 之后,首先要输入使用者名称,使用者名称除了英文字、数字及 -_ 外不可以包含其它特殊字符。
  1. Full name: Jack
复制代码
接着我们要输入使用者全名,这个字段可以是空的,如果您不输入则直接按 Enter 即可。
  1. Uid (Leave empty for default):        
复制代码
这个字段是使用者编号,直接留白按 Enter 即可,系统会自动指定。
  1. Login group [jack]:
复制代码
输入使用者群组名称,群组名称预设会自动产生一个和新增的使用者同名的群组,如果要使用不同的群组,必须先手动新增群组。我们直接按 Enter 即可。
  1. Login group is jack. Invite jack into other groups? []: wheel
复制代码
是否要将新的使用者加入其它群组,由于这是我们新增的第一个一般使用者,所以我们将它加入系统管理者 wheel 这个群组,让他可以使用 su 这个指令来切换身份成 root。
  1. Login class [default]:
复制代码
登入的类别,这是用来分类控制使用者对于系统资源的使用,请参考「使用者管理」一章中关于系统资源限制的说明。在这里我们直接按 Enter 使用默认值即可。
  1. Shell (sh csh tcsh nologin) [sh]: tcsh
复制代码
输入所要使用的 Shell,建议输入 tcsh,如果您不想让该使用者登入系统,可以输入 nologin。
  1. Home directory [/home/jack]:
复制代码
输入使用者的家目录,也就是使用者在系统中的数据夹,所有使用者的目录我们都放在 /home 下,所以我们直接按 Enter 即可。
  1. Use password-based authentication? [yes]:
复制代码
是否要使用密码认证的方式,预设为是,我们直接按 Enter 即可。
  1. Use an empty password? (yes/no) [no]:
复制代码
是否要使用空密码,预设为否。
  1. Use a random password? (yes/no) [no]:
复制代码
是否使用随机产生的密码,如果使用随机产生的密码,在新增完毕后,系统会告知我们产生的密码,预设为否。
  1. Enter password:
复制代码
输入该使用者的密码。
  1. Enter password again:
复制代码
再输入一次密码,以确认输入无误。
  1. Lock out the account after creation? [no]:
复制代码
在新增完使用者后,是否要先将该账户关闭。

最后会显示我们刚才输入的结果:
  1. Username : jack
  2. Password : *****
  3. Full Name : Jack
  4. Uid : 1003
  5. Class :
  6. Groups : jack
  7. Home : /home/jack
  8. Shell : /bin/tcsh
  9. Locked : no
  10. OK? (yes/no): y
复制代码
如果全部 ok 则输入 y。
  1. adduser: INFO: Successfully added (jack) to the user database.
  2. Add another user? (yes/no): n
  3. Goodbye!
复制代码
最后系统会询问我们是否要新增另一个使用者,如果没有则按 n 离开。

新增完使用者后,我们可以看到 /home 目录下多了一个使用者 jack 的目录:
  1. # ls -la /home
  2. drwxr-xr-x  10 root    wheel      512  3 21 16:12 ./
  3. drwxr-xr-x  21 root    wheel      512  1 14 06:29 ../
  4. drwxr-xr-x  13 jack    jack      1024  3 21 16:05 jack/
复制代码
"." 及 ".." 这二个目录分别代表着目前所在的目录及上一层目录,我们可以看到它的拥有者是 root,群组是 wheel。而 jack 这个目录的目录的拥有者是 jack,其群组也是 jack。

图 3-4


在 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


假设我们要更改档案 file.txt 的权限为 rwxr-xr-- (754),我们可以使用 chmod 这个指令:
  1. # chmod 754 file.txt
复制代码
我们上面提及的权限都是以三位数字来表示,另外我们也可以使用四位数字表示。所谓的四位数字是指在原本的三位数之前加上一个关于档案形态的设定。
  • 数字 4,Set User ID (SUID) 或 Set Group ID (SGID)。表示该档案在执行时会以档案拥有人或群组的身份执行。
  • 数字 2,如果该档案可以被执行(具 x 权限),则在执行时会以拥有者群组的身份执行。如果是不能被执行的档案,在读写时会控制不能让多个程序同时存取(locked)。
  • 数字 1,sticky。如果将档案设为所有人都可以读写,并设定 sticky,则所有人都可以修改该档案,但是不能删除。如果是目录开放读写权限,但设定了 sticky,则使用者只能新增档案,不能删除,这个可以应用于 FTP 的上传区。

假设我们要设定档案 myfile 可以被所有人读、写、执行,并设定 sticky:
  1. # chmod 1777 myfile
复制代码
除了使用数字一次设定权限之外,我们也可以分别针对档案的使用者、群组及其它人来设定权限。chmod 这个指令在权限的参数部份,除了使用数字外,也可以使用 (对谁)(做什么动作)(权限) 这种语法。


项目使用的字符代表意义
对谁u使用者 (User)
对谁g群组 (Group)
对谁o其它人 (Others)
对谁a所有人 (All)
做什么动作+增加权限
做什么动作-移除权限
做什么动作=直接设定权限
权限r读取
权限w写入
权限x执行
权限tSticky
权限sSet UID 或 GID

例如,我们要设定其它人对档案 file.txt 只有读取及执行的权利:
  1. # 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 指令的输出结果:
  1. # ps
  2. PID    TT  STAT   TIME      COMMAND
  3. 77393  p0  ILs    0:00.02   login [pam] (login)
  4. 78056  p0  IL     0:00.02   su
  5. 78057  p0  SL     0:00.02   _su (tcsh)
  6. 78074  p0  RL+    0:00.00   ps
  7. 89678  v0  ILs+   0:00.01   /usr/libexec/getty Pc ttyv0
  8. 78073  v1  SLs+   0:00.01   /usr/libexec/getty Pc ttyv1
  9. 616   v2  ILs+   0:00.00   /usr/libexec/getty Pc ttyv2
  10. 617   v3  ILs+   0:00.00   /usr/libexec/getty Pc ttyv3
  11. 618   v4  ILs+   0:00.00   /usr/libexec/getty Pc ttyv4
  12. 619   v5  ILs+   0:00.00   /usr/libexec/getty Pc ttyv5
  13. 620   v6  ILs+   0:00.00   /usr/libexec/getty Pc ttyv6
  14. 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 来查看所有行程的状态:
  1. # top
  2. last pid: 78151;  load averages:  1.11, 1.04, 1.01   up 27+14:45:03  18:02:07
  3. 51 processes:  3 running, 48 sleeping
  4. CPU states:  0.2% user, 96.8% nice, 1.5% system, 1.5% interrupt, 0.0% idle
  5. Mem: 114M Active, 45M Inact, 64M Wired, 12M Cache, 34M Buf, 7952K Free
  6. Swap: 512M Total, 372K Used, 512M Free

  7. PID USERNAME  PRI NICE   SIZE    RES STATE    TIME   WCPU    CPU COMMAND
  8. 235  root      96    0  1616K  1044K select 114:50  0.05%  0.05%  natd
  9. 425  root      96    0  9644K  4836K select   2:02  0.00%  0.00%  httpd
  10. 4872 root      96    0  3900K  2048K select   1:40  0.00%  0.00%  top
  11. 470  root      96    0  3776K  2240K select   1:39  0.00%  0.00%  sendmail
  12. 290  root      96    0  1312K   764K select   0:30  0.00%  0.00%  syslogd
  13. 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 的用法,请参考「指令应用」一章的说明。
附件: 你需要登录才可以下载或查看附件。没有帐号?注册

使用道具 举报

Rank: 18Rank: 18

积分
4008
帖子
975
精华
6
经验
2965 点
威望
0 点
金币
2844
发表于 2009-6-18 14:10:35 |显示全部楼层
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 的程序,我们可以使用下列指令:
  1. # kill -HUP 199
复制代码
上述指令中的参数 -HUP 也可以使用 -1 来取代。

值得注意的是,只有超级使用者 root 可以送信号给不属于自己的行程,而一般使用者只能管理自己的行程。

小提示

管理者可以对系统有最大的控制权,您可以使用 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 中加入下列设定:
  1. inetd_enable="YES"
复制代码
小提示

修改了 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 前的 "#" 拿掉,如下所示:
  1. # $FreeBSD: src/etc/inetd.conf,v 1.63 2003/06/09 21:04:30 markm Exp $
  2. #
  3. # Internet server configuration database
  4. #
  5. # Define *both* IPv4 and IPv6 entries for dual-stack support.
  6. # To disable a service, comment it out by prefixing the line with '#'.
  7. # To enable a service, remove the '#' at the beginning of the line.
  8. #
  9. ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l
  10. ftp     stream  tcp6    nowait  root    /usr/libexec/ftpd       ftpd -l
  11. #ssh    stream  tcp     nowait  root    /usr/sbin/sshd          sshd -i -4
  12. #ssh    stream  tcp6    nowait  root    /usr/sbin/sshd          sshd -i -6
  13. telnet  stream  tcp     nowait  root    /usr/libexec/telnetd    telnetd
  14. telnet  stream  tcp6    nowait  root    /usr/libexec/telnetd    telnetd
  15. #shell  stream  tcp     nowait  root    /usr/libexec/rshd       rshd
  16. #shell  stream  tcp6    nowait  root    /usr/libexec/rshd       rshd
  17. #login  stream  tcp     nowait  root    /usr/libexec/rlogind    rlogind
  18. #login  stream  tcp6    nowait  root    /usr/libexec/rlogind    rlogind
  19. #finger stream  tcp     nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
  20. #finger stream  tcp6    nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
  21. #exec   stream  tcp     nowait  root    /usr/libexec/rexecd     rexecd
复制代码
接着,再使用下列指令来启动 inetd 服务:
  1. # /usr/sbin/inetd -wW -C 60
复制代码
如果 inetd 已经被启动了,而我们修改过 inetd.conf 必须要求 inetd 重新读取设定档:
  1. # kill -HUP `cat /var/run/inetd.pid`
复制代码
请注意这里 `cat /var/run/inetd.pid` 所使用的 ` 是键盘左上角的那一个符号,而非单引号。

不过我们建议您使用 ssh 联机以取代 telnet,因为 ssh 是以加密过的方式联机,比较不会以明码的方式传送数据。您可以使用 putty 这个软件在 MS windows 下联机到 FreeBSD 中。您可以从 http://www.chiark.greenend.org.uk/~sgtatham/putty/ 下载 putty,也可以在本书光盘二的 wintools 目录下找到该软件。

当然,您也可以在FreeBSD中使用 ssh 的方式连到别台机器,FreeBSD 中内建有 ssh 软件,你可以使用下列指令:
  1. # ssh jack@123.123.78.9
复制代码
这个指令表示以使用者 jack 身份联机到 123.123.78.9,我们也可以使用主机名称的方式,例如jack@dns.abc.edu.tw ,或者也可以只打 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 的权限:
  1. 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 的内容说明:
  1. # 设定使用的 shell, 路径
  2. SHELL=/bin/sh
  3. PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
  4. # 设定执行指令时的目录
  5. HOME=/var/log
  6. # 当指令有输出数据时,要将输出的东西寄给谁。
  7. MAILTO=""
  8. #
  9. # 分        小时        天        月        星期几        身份        指令
  10. #minute        hour        mday        month        wday        who        command
  11. #
  12. */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,表示每五分钟一次。

除此之外,在时间的字段中,我们也可以用一个开头为 @ 的字符串来表示各种排程时间意义:


字符串代表意义
@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 = ""」表示不要将输出结果寄出。

以下为几个时间设定的范例:
  1. # 分        小时        天        月        星期几        身份        指令
  2. #minute        hour        mday        month        wday        who        command
  3. #
  4. # 设定每 5 分钟执行一次atrun。
  5. */5        *        *        *        *        root        /usr/libexec/atrun

  6. # 设定每天一点零一分时执行 /bin/check
  7. 1        1        *        *        *        root        /bin/check

  8. # 设定每周一 3:11 分执行 week_check
  9. 11        3        *        *        1        root        /usr/local/week_check

  10. # 设定每天一点及四点的零到二十三分中间,每二分钟执行一次 something。
  11. 0-23/2        1,4        *        *        root        /bin/something

  12. # 设定每天半夜十二点执行 something。
  13. @daily        root        /bin/something
复制代码
如果你以一般使用者或是管理者的身份执行 crontab -e 来设定 crontab,你不必设定身份的字段,因为 crontab 会自动取得您的身份。使用 crontab -e 所设定的工作会被放在 /var/cron/tabs 目录中,所以如果要备份或升级时,应该要注意这些档案是否要备份。

小提示

我们在安排 crontab 时,应该要错开每个程序的执行时间,才不会有一大堆程序同时执行,造成系统负荷过高。


「at」设定只执行一次的程序

cron 可以用来设定不断的重复定时执行一些工作,然而,如果您只希望在某个时间执行「一次」某个指令,可以使用「at」。

「at」的设定可以分为三个指令:「at」用来建立工作、「atq」用来列出目前待执行的工作有哪些、「atrm」用来删除 atq 中所列出的工作。当您执行了 at 后,它会要求您在命令列中以 shell scripts 的写法输入想要执行的指令,而您也可以先将所要执行的指令写再一个档案中,再让 at 去执行。

在使用 at 指令时,必须先输入您要在什么时候执行工作,而时间的格式可以是下列任何一种:


格式说明
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」后按 <Enter>,接着您必须开始输入所要执行的指令,在全部输入完成后,请按 <Ctrl>+<D>结束编辑。如果您不想使用命令列编辑的方式输入所要执行的工作,您可以先写一个 shell script 并使用下列指令设定:
  1. # at -f mycommand.sh 10pm
复制代码
上述指令中,您所写的 shell scripts 档案是 mycommand.sh。

在设定之后,接着您可以使用下列指令列出目前等待执行的 at 工作:
  1. # atq
  2. Date                                 Owner          Queue   Job#
  3. 2005年 6月 5日 周日 22时00分00秒 CST    root             c      2
复制代码
如果您要删除某一个工作,只要使用 atrm 并输入该工作在 atq 中的 job id 即可。例如,我们要删除 ID 为 2 的工作:
  1. # 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 这个档案中。
  1. console none                            unknown off secure
  2. #
  3. ttyv0   "/usr/libexec/getty Pc"         cons25  on  secure
  4. # Virtual terminals
  5. ttyv1   "/usr/libexec/getty Pc"         cons25  on  secure
  6. ttyv2   "/usr/libexec/getty Pc"         cons25  on  secure
  7. ttyv3   "/usr/libexec/getty Pc"         cons25  on  secure
  8. ttyv4   "/usr/libexec/getty Pc"         cons25  on  secure
  9. ttyv5   "/usr/libexec/getty Pc"         cons25  on  secure
  10. ttyv6   "/usr/libexec/getty Pc"         cons25  on  secure
  11. ttyv7   "/usr/libexec/getty Pc"         cons25  on  secure
  12. ttyv8   "/usr/X11R6/bin/xdm -nodaemon"  xterm   off secure
  13. # Pseudo terminals
  14. ttyp0   none                    network
  15. ttyp1   none                    network
  16. ttyp2   none                    network
  17. ……
复制代码
这个档案中设定了每一个不同的终端机类型可以使用的权限,例如 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 这个软件。
  1. # cd /usr/ports/chinese/ve
  2. # make install clean
复制代码
再使用 ve /etc/motd 来修改讯息。例如笔者所使用的画面如下:

图 3-6


您可以在本书第二片光盘 /examples/etc/motd 找到笔者所使用的 motd 设定档。

3.7.2 登入前的讯息

在登入系统前 FreeBSD 时,你会看到下面的画面:

FreeBSD/i386 (example.com) (ttyv0)
login:


我们在这里要做的就是把它改成想要的样子。更改 login 前的画面有二种方式,一种是修改 /etc/gettytab 及 /etc/issue,另一种方式是修改 telnetd。

方式一:

编辑 /etc/gettytab,找到 default的地方。
  1. default:\
  2. :cb:ce:ck:lc:fd#1000:im=\r\n%s/%m (%h) (%t)\r\n\r\n:sp#1200:\
  3. :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 内容如下:
  1. #!/bin/sh
  2. TTY=`/usr/bin/tty | /usr/bin/cut -c9`

  3. if [ "$TTY" = 'v' ]; then
  4.     exec /usr/libexec/telnetd
  5. else
  6.     /bin/cat /etc/issue
  7.     echo "颜色句柄`/usr/bin/uptime`控制结束码"
  8.     exec /usr/libexec/telnetd
  9. fi
复制代码
上面句柄部份,你可以使用 ve 来加入颜色句柄,编辑完后要把该档变成可执行的档案,使用下列指令:
  1. # chmod 755 /usr/local/libexec/telnetd.sh
复制代码
再编辑 /etc/inetd.conf,将原来的 "/usr/libexec/telnetd telnetd" 换成 "/usr/local/libexec/telnetd.sh telnetd.sh":
  1. 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 的身份直接使用下列指令来安装:
  1. # cd /usr/ports/chinese/big5con
  2. # make install clean
复制代码
安装完后,先执行 rehash 来更新一下 tcsh 指令的快取,之后我们就可以使用指令 b5c 来出现像 DOS 下倚天中文的环境,如图 3-7。

图 3-7


小提示

您可以使用 <Ctrl>+<Alt>+<数字> 来切换不同的输入法,并使用 <Ctrl>+<Space> 来切换中英文。
附件: 你需要登录才可以下载或查看附件。没有帐号?注册

使用道具 举报

Rank: 18Rank: 18

积分
4008
帖子
975
精华
6
经验
2965 点
威望
0 点
金币
2844
发表于 2009-6-18 14:35:39 |显示全部楼层

第四章 使用者管理



FreeBSD 是一个多重使用者的操作系统,在系统可有存在多个使用者。使用者的管理可以说是系统管理最基本的议题,在系统一安装完成时,我们就必须进行使用者的新增及设定。

本章将介绍和使用者相关的管理知识,包括:
  • 如何新增及删除使用者。
  • 使用者及群组相关的重要档案设定。
  • 如何限制系统资源 (如硬盘空间) 的使用。
  • 如何备份及移转使用者数据。
  • 大量新增账号。
  • 记录使用者执行过的指令。
  • 控制 root 的使用。

4.1 账号管理

4.1.1 新增使用者

新增使用者时,我们会以 adduser 这个指令来进行,adduser 指令其实是将新增使用者所必须做的事写成一个执行档来自动帮我们做,在 FreeBSD 4.x 是以 perl 所写成,而 FreeBSD 5.x 改以 shell scripts 来实作。为了了解系统对于使用者管理细节,让我们先回顾一下上一章关于使用 adduser 新增使用者的过程。在 4.x 和 5.x adduser 指令的细节有一点不同,但大同小异。
  1. # adduser
  2. Username: jack
复制代码
执行了 adduser 之后,首先要输入使用者名称,使用者名称除了英文字、数字及 -_ 外不可以包含其它特殊字符。
  1. Full name: Jack
复制代码
接着我们要输入使用者全名,这个字段可以是空的,如果您不输入则直接按 Enter 即可。
  1. Uid (Leave empty for default):
复制代码
这个字段是使用者编号,直接留白按 Enter 即可,系统会自动指定。
  1. Login group [jack]:
复制代码
输入使用者群组名称,群组名称预设会自动产生一个和新增的使用者同名的群组,如果要使用不同的群组,必须先手动新增群组。我们直接按 Enter 即可。
  1. Login group is jack. Invite jack into other groups? []:wheel
复制代码
是否要将新的使用者加入其它群组,由于这是我们新增的第一个一般使用者,所以我们将它加入系统管理者 wheel 这个群组,让他可以使用 su 这个指令来切换身份成 root。
  1. Login class [default]:
复制代码
登入的类别,这是用来分类控制使用者对于系统资源的使用,请参考下一节系统资源限制的说明。在这里我们直接按 Enter 使用默认值即可。
  1. Shell (sh csh tcsh nologin) [sh]: tcsh
复制代码
输入所要使用的 Shell,建议输入 tcsh,如果您不想让该使用者登入系统,可以输入 nologin。
  1. Home directory [/home/jack]:
复制代码
输入使用者的家目录,也就是使用者在系统中的数据夹,所有使用者的目录我们都放在 /home 下,所以我们直接按 Enter 即可。
  1. Use password-based authentication? [yes]:
复制代码
是否要使用密码认证的方式,预设为是,我们直接按 Enter 即可。
  1. Use an empty password? (yes/no) [no]:
复制代码
是否要使用空密码,预设为否。
  1. Use a random password? (yes/no) [no]:
复制代码
是否使用随机产生的密码,如果使用随机产生的密码,在新增完毕后,系统会告知我们产生的密码,预设为否。
  1. Enter password:
复制代码
输入该使用者的密码。
  1. Enter password again:
复制代码
再输入一次密码,以确认输入无误。
  1. Lock out the account after creation? [no]:
复制代码
在新增完使用者后,是否要先将该账户关闭。

看了 adduser 指令的过程,您对于新增使用者应有的步骤应该已经有初步的了解了,接下来我们要介绍 adduser 这个指令到底做了哪些事。
  • 在 /etc/group 中加入使用者的群组
  • 在 /etc/master.passwd 中加入使用者
  • 在 /home 中建立使用者目录,并建立 dotfile
  • 在 /var/mail 中建立使用者邮件目录

知道了以上的流程,我们也可以手动自己做上述的步骤,但我们必须先知道 group 及 master.passwd 等档案的格式。所以我们接下来要介绍这些档案。

小提示

在旧版的 FreeBSD 中,adduser 一开始会先问您使用者名称要符合怎样的规则,通常我们会直接按 ENTER 跳过,您要注意看清楚喔,不要在那个时候输入使用者名称,否则在新增使用者时可能会有问题。如果您已经输入错了,可以将 /etc/adduser.conf 删除,就可以恢复原本的设定。


4.1.2 /etc/group 介绍

在使用者的管理方面,FreeBSD 大致上可以分为群组管理及账号管理。每一个账号至少属于一个群组,这样子有利于权限控制。例如学生的账号就有一个学生群组,而老师的账号就属于教师群组,某几位老师属于管理者的群组。这样一来,我们除了可以针对个人设定权限外,也可以针对不同群组给予不同的权限。

每个使用者预设都会有一个群组,这个预设群组是设定在 /etc/master.passwd,我们会在下一小节中说明。而您也可以将使用者加入其它群组中,这些其它加入的群组设定是在 /etc/group 中,在群组后面加上使用者名称即可。

/etc/group 这个档案就是记录群组的档案,这是一个文字文件,我们可以使用 ee 等文字编辑软件打开它。在 group 档案中,其格式如下:
  1. wheel:*:0:root,alex
  2. students:*:1000:
  3. teachers:*:1001:
  4. webadmin:*:1002:alex,john,tom
复制代码
每一个字段以冒号分开,以最后一行为例,第一个字段代表群组名称为 teachers,而群组代号(gid) 是 1001。我们可以自行使用文字编辑器加入想要的群组名称及 gid,但要注意的是群组名称和 gid 不能重复。

第一行的最后面是 root,alex,表示该群组成员。由于记录使用者数据的档案中只能记录使用者的预设群组,如果使用者还属于其它群组,则必须记录在 /etc/group 中。例如使用者 alex 的预设群组是 alex,我们希望他同时是 webadmin 群组,则我们必须在 webadmin 群组后加上该使用者。

在 FreeBSD 中,如果其它使用者要能使用 su 变成超级使用者的话,必须将其账号加入 wheel 群组中。
新增群组时,除了可以使用文字编辑外,也可以使用指令 pw 来新增群组:
  1. # pw groupadd newgroup
  2. # pw groupshow newgroup
  3. 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 之后,会出现:
  1. # $FreeBSD: src/etc/master.passwd,v 1.25.2.6 2002/06/30 17:57:17 des Exp $
  2. #
  3. root:$1$94sxalyM$w1lBLBGAsRPfdVciGqNfL/:0:0::0:0:Charlie &:/root:/bin/tcsh
  4. toor:*:0:0::0:0:Bourne-again Superuser:/root:
  5. daemon:*:1:1::0:0:Owner of many system processes:/root:/sbin/nologin
  6. operator:*:2:5::0:0:System &:/:/sbin/nologin
  7. bin:*:3:7::0:0:Binaries Commands and Source:/:/sbin/nologin
  8. tty:*:4:65533::0:0:Tty Sandbox:/:/sbin/nologin
  9. kmem:*:5:65533::0:0:KMem Sandbox:/:/sbin/nologin
  10. games:*:7:13::0:0:Games pseudo-user:/usr/games:/sbin/nologin
  11. news:*:8:8::0:0:News Subsystem:/:/sbin/nologin
  12. man:*:9:9::0:0:Mister Man Pages:/usr/share/man:/sbin/nologin
  13. sshd:*:22:22::0:0:Secure Shell Daemon:/var/empty:/sbin/nologin
  14. smmsp:*:25:25::0:0:Sendmail Submission User:/var/spool/clientmqueue:/sbin/nologin
  15. mailnull:*:26:26::0:0:Sendmail Default User:/var/spool/mqueue:/sbin/nologin
  16. bind:*:53:53::0:0:Bind Sandbox:/:/sbin/nologin
  17. uucp:*:66:66::0:0:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
  18. pop:*:68:6::0:0:Post Office Owner:/nonexistent:/sbin/nologin
  19. www:*:80:80::0:0:World Wide Web Owner:/nonexistent:/sbin/nologin
  20. nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/sbin/nologin
  21. tom:Bk5AI4MiRKCJ2:1000:1000::0:0:Tom Chang:/home/tom:/bin/tcsh
复制代码
master.passwd 这个档案内容中,每个使用者都是独立的一行,每个字段使用冒号分开,它的格式是:
  1. 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则表示不使用此功能:
    1. 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 的执行结果:
  1. Matching password entry:
  2. test:J7kPK0pKTn2oQ:1001:1001::0:0:Tom:/home/test:/bin/tcsh
  3. Is this the entry you wish to remove? y →真的要移除这一个使用者吗?
  4. Remove user's home directory (/home/test)? y →是否要移除使用者家目录?
  5. # 移除使用者正在执行的程序及更新系统数据
  6. Removing user's at jobs:Updating password file, updating databases, done.
  7. # 移除使用者群组
  8. Updating group file: (removing group test -- personal group is empty) done.
  9. # 移除使用者家目录
  10. Removing user's home directory (/home/test): done.
  11. # 移除使用者信件
  12. Removing user's incoming mail file /var/mail/test: done.
  13. # 移除使用者暂存目录
  14. Removing files belonging to test from /tmp: done.
  15. Removing files belonging to test from /var/tmp: done.
  16. 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 的设定:
  1. # defaults
  2. # These settings are used by login(1) by default for classless users
  3. # Note that entries like "cputime" set both "cputime-cur" and "cputime-max"

  4. default:\
  5.         :passwd_format=md5:\
  6.         :copyright=/etc/COPYRIGHT:\
  7.         :welcome=/etc/motd:\
  8.         :setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES:\
  9.         :path=/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin
  10.         :nologin=/var/run/nologin:\
  11.         :cputime=unlimited:\
  12.         :datasize=unlimited:\
  13.         :stacksize=unlimited:\
  14.         :memorylocked=unlimited:\
  15.         :memoryuse=unlimited:\
  16.         :filesize=unlimited:\
  17.         :coredumpsize=unlimited:\
  18.         :openfiles=unlimited:\
  19.         :maxproc=unlimited:\
  20.         :sbsize=unlimited:\
  21.         :vmemoryuse=unlimited:\
  22.         :priority=0:\
  23.         :ignoretime@:\
  24.         :umask=022:
  25.         
复制代码
以下为关于系统资源限制的字段说明,每一个字段都有可使用的数值类型,例如 size、time 等,让我们来看看每个字段的说明:



字段名称数值类型说明
coredumpsizeSize当使用者所执行的程序出了问题 (coredump),系统会将该程序的执行状况从内存中写到硬盘上,这个值就是在限制 core file 的档案大小。如果使用者所执行的程序是需要消耗许多内存的程序,则所产生的 core file 也会很大。这个值不应该比使用者的磁盘配额限制大。
cputimeTime这是一个行程所能使用的最长 CPU 时间,这个时间指的不是我们在 top 或 ps 中看到的 CPU usage 百分比,而是一个行程所使用的 CPU 时间。当超过时间,系统核心会自动停止该行程。
filesizeSize使用者单一档案的最大容量。我们对于使用者磁盘配额只能限制使用者对于硬盘的使用总额,而这个设定可以限制单一档案的大小。
maxprocNumber限制使用者最多可以执行的行程总量。这个限制包含所有以该使用者名称所执行的程序,有的程序在执行时,会自动产生许多子行程,如果这个值设定的太小,可能会造成使用者的困扰。
memorylockedSizeFreeBSD 系统中有所谓的虚拟内存空间,当物理内存不足时,系统会将某部份的内存数据放到虚拟内存中。而有的程序会使用 mlock() 这个系统呼叫要求系统将它所占用的内存空间全部放在物理内存中,memorylocked 就是限制使用 mlock() 的内存大小。
memoryuseSize限制行程最大的内存使用量,包含物理内存及虚拟内存。
openfilesNumber限制使用者同一时间最多可以开启的档案数量。所谓的档案数量包含了一般的档案及 socket。
sbsizeSize用以限制最大的网络缓冲区的使用量。
stacksizeSize行程可使用的最大堆栈 (stack) 空间。

以下为上表中数值类型的说明:


类型说明
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 复制一份,并更名为其它类别,最后再进行编辑。类别新增完毕后,我们必须执行下列指令以重建系统数据库。
  1. # cap_mkdb /etc/login.conf
复制代码
接下来我们就可以执行 vipw 在想要限制的使用者的 class 的字段填入我们新增的类别了。

除了限制系统资源的使用外,我们也可以使用 login.conf 来客制化每个使用者的登入环境、所使用的语言等,请 man login.conf 以得到更多的说明。

小提示

使用 login.conf 来设定 class 的好处是您可以统一在一个地方设定不同类别使用者的权限及系统资源的使用量,对于需要管理大量使用者时十分有用。


4.2.2 磁盘配额

当系统中有多位使用者时,如果其中一个人拥有大量档案,那么其它使用者便无法有足够的空间来使用。如果系统有许多使用者,而又不限制他们对磁盘的使用量,那么磁盘很容易就会爆掉,因此我们必须对使用者加以限制。您可以限制系统中每个使用者可使用的硬盘大小(quota)。步骤如下:

  • 在核心设定中加入 options QUOTA 这一行,并重新编译核心。
  • 在 /etc/rc.conf 中加入一行 enable_quotas="YES"。
  • 在 /etc/fstab 中要启加磁盘限制的分割区中加入参数 userquota ,您也可以加入 groupquota 来限制群组的配额。
    1. # Device        Mountpoint        FStype        Options        Dump        Pass#
    2. /dev/ad0s1b        none        swap        sw        0        0
    3. /dev/ad0s1a        /        ufs        rw        1        1
    4. /dev/ad1s1f        /home        ufs        rw,userquota        2        2
    5. /dev/ad0s1e        /usr        ufs        rw        2        2
    6. /dev/ad1s1e        /var        ufs        rw        2        2
    复制代码
  • 重开机并设定使用者的 quota 限制。


完成了上述的步骤并重新开机之后,我们就可以使用指令 edquota 来编辑磁盘配额。首先,以指令 edquota -u tom 进入文书编辑,我们通常会加入二行,一行限制档案大小,一行限制档案数:
  1. Quotas for user tom:
  2. /home: blocks in use: 65, limits (soft = 50000, hard =55000)
  3.         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 中加入下列设定:
  1. check_quotas="NO"
复制代码
在 FreeBSD 3.2 版以前,开机内定是不检查 quota 的,如果你想在开机时即检查的话,请在 /etc/rc.conf 中加入下列设定:
  1. check_quotas="YES"
复制代码
4.3 大量新增账号

对于大型主机的管理者而言,要大量新增账号时,若没有一套"撇步"的话,使用 adduser 指令来新增账号将会非常累人,所以我们必须要想出一个大量新增账号的方法。

大量新增账号的方法有很多,最简单的就是写一个程序来处理,只要依照之前提及的新增账号步骤使用程序来一步步建立或在程序中呼叫 FreeBSD 系统中新增账号的指令并经由循环来完成。但是 adduser 指令会问一堆问题,不适合拿来作程序中要呼叫的指令,所幸在 FreeBSD 中还有一个管理使用者账号及群组的程序 pw ,所以笔者就以指令 pw 加上一些控制来写成 script。

一般而言,如果要新增的账号是没有规则性的,那么就必须先将账号做成一个文字文件,再以程序读入。若账号是有规则性的,则可以给定参数来完成。您可以在本书所附的第二片光盘中的 examples 目录中找到笔者所写的「新增大量账号」程序,文件名是 adduser.tar.gz。

这个程序可以使用档案汇入账号及密码,或只给账号并自动产生密码,最后将账号及密码存成一个档案(预设是 adduser.log)。我们也可以使用连续产生账号的方式,产生一堆连续的账号,产生的结果同样会放成 adduser.log 中。

首先,将第二片光盘放入光驱中,并使用下列指令将档案复制到 root 的目录下:
  1. # mount /cdrom
  2. # cp /cdrom/examples/adduser.tar.gz /root/
复制代码
将档案放到硬盘中后,请切换目录到 /root 并以下列指令解压缩:
  1. # cd /root
  2. # tar zxvf adduser.tar.gz
复制代码
解压缩后,进入 adduser 目录,你可以看到该目录中有下列档案:


檔名用途
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 下,再执行下列指令以将密码文件转成数据库格式即可:
  1. # pwd_mkdb -p -d /etc /etc/master.passwd
复制代码
如果没有要移转使用者个人数据的话,也必须建立使用者家目录及邮件目录。如果要移转使用者目录的话,记得移转后要检查一下该目录的所有人是不是该使用者。如果不是,就必须使用下列指令来将使用者目录拥有者更改为所属的使用者:
  1. # chown -R user:group /home/user
复制代码
上面这个指令是将 /home/user 这个目录及其下所有目录的所有人变成使用者名称为 user,群组为 group。
我们也可以在密码文件及群组数据移转后,将旧的硬盘存放使用者数据的扇区(假设是 /home) mount 到 /mnt 下,再到 /mnt 下存放使用者数据的目录中使用指令
  1. # tar clf - . | tar xvpf - -C /home
复制代码
来将使用者数据复制到 /home 中。并依此方法 mount 使用者邮件目录扇区并复制到 /var/mail 下即可。

4.5 使用历程记录

4.5.1 记录使用者指令

为什么要记录使用者下过的指令?并不是为了要监视使用者,而是在系统有问题时,可以找出原因。找出使用者曾经使用过哪些指令,以了解问题的所在。FreeBSD 提供指令 lastcomm 让你查看系统中使用者执行的指令,但是你必须先修改 /etc/rc.conf,加上下列一行设定:
  1. 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 中加入下列的设定并重新编译核心:
  1. pseudo-device snp
复制代码
最后使用下列指令新增 snoop device:
  1. # cd /dev
  2. # ./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 拿掉。
  1. # cd /usr/ports/security/sudo
  2. # make install clean
复制代码
安装完后,我们要先执行 /usr/local/sbin/visudo 以设定 sudo 的设定档 (/usr/loca/etc/sudoers)。以下简单说明该设定档如何设定,详细说明及范例请参考 /usr/local/etc/sudoers.sample:
  1. # Host alias specification(如果你只有一台机器,可以不必设)
  2. Host_Alias     CUNETS = 128.138.0.0/255.255.0.0
  3. Host_Alias     SERVERS = master, mail, www, ns

  4. # User alias specification(把使用者分成群组,也可以不用分)
  5. User_Alias     PARTTIMERS = millert, mikef, dowdy
  6. User_Alias     WEBMASTERS = will, wendy, wim
  7. User_alias     BACKUP = tom, jack

  8. # Cmnd alias specification(把可以执行的指令分成一个个群组)
  9. Cmnd_Alias     READ=/bin/ls,/bin/cat,/usr/bin/tail,/usr/bin/head
  10. Cmnd_Alias     BACKUP=/sbin/dump,/usr/bin/tar,/usr/bin/find, \
  11.                /usr/bin/cpio,/bin/cp,/sbin/mount,/bin/dd

  12. # User privilege specification(设定使用者的权限)
  13. root       ALL=(ALL) ALL
  14. %wheel     ALL = (ALL) ALL

  15. # 表示 jack 在 CUNET 中所有机器都可执行指令群组中 BACKUP 指令
  16. jack       CUNETS = BACKUP

  17. # 表示使用者群组中 PARTTIMERS 群组的人,只能在 SERVERS
  18. #群组中的机器里执行 READ 群组的指令
  19. PARTTIMERS SERVERS = READ
复制代码
设定完后,使用者即可执行 sudo <允许的指令> ,使用者只要输入自己的密码即可,不必知道 root 的密码,而且 5 分钟内再次执行 sudo 时不需再输入密码。如果你有打开 log 记录功能,sudo 执行成功或失败的 log 都将被记录到 /var/log/sudo.log 中。详细说明请阅读说明 man sudo。

使用道具 举报

Rank: 18Rank: 18

积分
4008
帖子
975
精华
6
经验
2965 点
威望
0 点
金币
2844
发表于 2009-6-18 14:42:49 |显示全部楼层
第五章及以后章节待续。。。

使用道具 举报

Rank: 6Rank: 6

积分
241
帖子
60
精华
0
经验
169 点
威望
0 点
金币
102
发表于 2009-9-15 19:41:48 |显示全部楼层
ddddddddddddd

使用道具 举报

Rank: 6Rank: 6

积分
225
帖子
29
精华
0
经验
182 点
威望
0 点
金币
101
发表于 2009-10-9 21:25:25 |显示全部楼层
支持一下!

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

手机版|Archiver|大家网 ( 京ICP备06071611号 )  

GMT+8, 2012-5-25 16:53 , Processed in 0.524271 second(s), 12 queries , Gzip On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部