大家论坛

 找回密码
 注册
查看: 6077|回复: 6

FreeBSD 6.0 架设管理与应用(第5-8章)

[复制链接]

91

主题

984

帖子

6920

金币

大家网研究生一年级

Rank: 18Rank: 18

积分
4066
发表于 2009-6-19 07:55 | 显示全部楼层 |阅读模式


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



第五章 网络设定


几乎所有计算机都必须要有网络才有乐趣,了解网络的使用是让 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 位数字的范例:

以十进制加 . 的方式表示: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


小提示

以上的 IP 地址是使用 IPv4,因此只有 4 个字节的长度。但由于 IP 渐渐不足,所以目前有新的标准是 IPv6,IPv6 有 16 个字节。虽然大多数的操作系统都已支持 IPv6,但 IPv6 还不普及,目前因特网还是使用 IPv4。


所有的 IP 地址是由 IANA (Internet Assigned Numbers Authority) 组织授权给各地区的单位分派,在台湾则是由 TWNIC (http://www.twnic.net.tw) 所管理。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。


Class二进制的子网掩码子网掩码
Class A11111111 00000000 00000000 00000000255.0.0.0
Class B11111111 11111111 00000000 00000000255.255.0.0
Class C11111111 11111111 11111111 00000000255.255.255.0

当我们在表示一个子网络时,我们可以使用 140.115.0.0/255.255.0.0 来表示。然而,我们也常看到另一种表示方式:140.115.0.0/16。16 的意思是子网掩码中,高位的部份有 16 个 1。以上表中各个子网掩码为例,我们可以表示为:


Class二进制的子网掩码子网掩码
Class A11111111 00000000 00000000 00000000/8
Class B11111111 11111111 00000000 00000000/16
Class C11111111 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:


IP 范围Network IDHost ID
192.168.5.0 ~ 192.168.5.31192.168.5.00~31
192.168.5.32 ~ 192.168.5.63192.168.5.3232~63
192.168.5.64 ~ 192.168.5.95192.168.5.6464~95
192.168.5.96 ~ 192.168.5.127192.168.5.9696~127
192.168.5.128 ~ 192.168.5.159192.168.5.128128~159
192.168.5.160 ~ 192.168.5.191192.168.5.160160~191
192.168.5.192 ~ 192.168.5.223192.168.5.192192~223
192.168.5.224 ~ 192.168.5.255192.168.5.224224~255


私有 IP 范围

一般 ISP 所分配的 IP 都可以让我们在因特网上使用,但如果您没有要在因特网上使用,只是要在公司或家中架设内部局域网络,我们可以使用私有 IP (Private IP)。私有 IP 是 RFC 1981 所定义的私人 IP,这些 IP 不能够直接在因特网中出现,只能在局域网络中使用。如果您想在公司或家中架设内部使用的服务器,您可以区网中的计算机 IP 设为下列范围之一:


Class范围子网掩码网域
Class A10.0.0.0 ~ 10.255.255.255255.0.0.010/8
Class B172.16.0.0 ~ 172.31.255.255255.255.0.0172.16/12
Class C192.168.0.0 ~ 192.168.255.255255.255.255.0192.168/16


例如,你家中有三台计算机,可以分别设定 IP 为 192.168.0.1、192.168.0.2、192.168.0.3。

私有 IP 不可以在因特网中使用,如果这些设定为私有 IP 的计算机有连上因特网的需求,则必需经由 NAT 服务器的转换,将它们伪装成是由 NAT 服务器连向外部网络。详细 NAT 服务器的设定请参考本书「NAT 及防火墙」一章的说明。

小提示

看得头晕眼花了吗?没关系,本节的重点在于了解 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 (http://www.twnic.net.tw) 所授权的网站申请,您可以到 TWNIC 去查询申请方式。如果您要申请的是 .com.tw 或 .org.tw,您必须准备公司或组织的登记证;而 .idv.tw 是给个人使用,只要准备身份证字号即可,其费用为每年新台币 $450 元。

如果您要申请的是 .com、.net、.org 等,您可以上 YAHOO! (http://domains.yahoo.com) 申请,费用大约为每年美金 $9.95。申请 .com、.org、.net 等十分容易,只要按网页上的说明填入数据,花个五分钟就可以完成,不过您必须要有信用卡喔。

在申请完网域名称后,必须填入二台负责管理您网域的 DNS 服务器 IP,您可以自己架以二台 DNS 服务器,或是交由申请单位代管。为什么要有 DNS 服务器管理您的网域名称呢?因为我们申请到的网域名称可能是 twbsd.org,如果我们希望将 www.twbsd.org 对映到 61.23.21.11 这个 IP,则必须在 DNS 服务器中加入这个信息。同样的,我们可能会有 ftp.twbsd.org、mail.twbsd.org、bbs.twbsd.org 等等设定,都必须由 DNS 服务器代为管理网域名称和 IP 的正解。

TWNIC 可以代为管理 DNS,但数量有限,最多只有三个,而且没有邮件服务器用的 MX (请参考本书 DNS 服务器一章的说明)。如果您在 YAHOO! 申请网域名称,YAHOO 可以帮您管理很多的 DNS 设定,您就不需要自行架设 DNS 服务器了。所以我个人比较偏好由 YAHOO 申请,便宜又方便。

小提示

申请完网域或是您有更动网域及 IP 的对映后,必须经过 24 小时才会有作用。因为 DNS 必须经过一段时间才会在整个网络上生效。


申请完网域并设定好您的 IP 后,隔天您就可以查看看您所设定的网域名称是否有生效,您可以在 FreeBSD 或是 Windows 中使用下列指令:
  1. # nslookup www.twbsd.org
  2. Server:         168.95.192.1
  3. Address:        168.95.192.1#53

  4. www.twbsd.org   canonical name = twbsd.org.
  5. Name:   twbsd.org
  6. Address: 220.132.178.72
复制代码
您可以看到当我们使用 nslookup 这个指令去查 www.twbsd.org 时,它所对映到的 IP 是 220.132.178.72。如果您的查询失败,表示您的设定有问题或是该设定尚未生效。

申请 IP 反解

在设定完网域对映到 IP 的正解后,如果您有固定 IP,我们还要设定将固定 IP 转换为网域名称的正解。尤其当您要架设邮件服务器时,如果没有 IP 反解,可能会被退信。以笔者的网域为例,我设定了 twbsd.org 对映到 IP 220.132.178.72,接下来要设定让使用者从 220.132.178.72 可以反查到 twbsd.org。
  1. # nslookup 220.132.178.72
  2. Server:         168.95.192.1
  3. Address:        168.95.192.1#53

  4. 72.178.132.220.in-addr.arpa     name = twbsd.org.
复制代码
小提示

我们可以设定多个网域名称对映到同一个 IP,但一个 IP 只能对映到一个网域名称。例如,我设定 www.alexwang.com、alexwang.com、www.twbsd.org、twbsd.org 都对映到 220.132.178.72 这个 IP。但反查时,IP 只能对映到 twbsd.org。


依照规定,未满一个 Class C 的 IP 反解必需由 ISP 设定,如果您使用的是非固定式 ADSL,并有一个固定 IP,可以上您 ISP 的网站免费申请 IP 反解。以 Hinet 为例,您可以到 http://hidomain.hinet.net/rever.html 进行 IP 反解的申请。当您连到 Hinet 申请的页面时,您会看到下列画面:

图 5-2


您必须在「配发之 IP addrsss」中填入您的 IP,并在「用户之 Domain Name」中填入您的网域名称,如果您要将 IP 反解设为 www.example.com,则在「用户之 Domai Name」中要填 example.com。接着最重要的是「IP 及 Host」,如果您的 IP 是 11.22.33.44,并要对应到 www.example.com,则要填入「44 IN PTR www.example.comf」。

如果您有多个 IP 要设定反解,您可以按最上方的参考范例,如图 5-3 所示:

图 5-3


申请动态 DNS

如果您不想花钱申请网域名称,或者您没有固定 IP,我们可以使用网络上提供的免费 DNS,例如 www.dyndns.org。我们可以申请一个类似 xxx.dyndns.org 的网域名称,只要到该网站注册申请即可。在连到该网站后,请先按「Sign Up Now」:

图 5-4


接下来,请依序填入您的数据并按「Create Account」送出资料,如图 5-5 所示:

图 5-5


接着您就可以到所设定的信箱收信,收到信后,请按下信内容中确认的连结,之后再到 www.dyndns.org 登入:

图 5-6


登入后,请选择「Services」,进入 Service 页面后再选择 「Dynamic DNS」,如图 5-7 所示:

图 5-7


接着请进入「Add Dynamic DNS」:

图 5-8


进入后,您就可以填入您想要名称,例如,我们要申请 twbsd.dyndns.org,则先填入 twbsd 后,再用下接选单选择 dynnas.org,然后请在「IP Address」中输入您的服务器 IP,最后按下「Add Host」即可完成。

图 5-9


申请完 DDNS 后,您就拥有一个免费的网域名称了。由于申请时我们已经设定好主机和 IP 的对映,所以您应该可以使用该名称连到您的服务器了。如果您没有固定 IP,在每次 IP 更动时,我们都必须连到 DynDNS 做设定,这样太麻烦了。还好我们可以在 FreeBSD 中安装一套工具,让它自动帮我们做更新 IP 的动作。

请到 Port 中安装 ddup 这支程序:
  1. # cd /usr/ports/dns/ddup
  2. # make install
复制代码
安装完后,请执行下列指令产生设定文件:
  1. # /usr/local/sbin/ddup --makeconf
  2. Please enter your user name:
  3. your_account
  4. Please enter your password:
  5. your_password
  6. your_account:your_password
  7. OK..now you need to enter the users who can use ddup:
  8. Seperate the users with a , ie. root,test,this,that
  9. root
复制代码
最后请执行下列指令,系统即会自动取得您的 IP,并更新网域及 IP 的对映,请将下列 your_domain.dyndns.org 换成您所申请的名称:
  1. # /usr/local/sbin/ddupcron.sh your_domain.dyndns.org
复制代码
最后,我们将上面这一行指令放在 crontab 中,让系统每 5 分钟检查一次,如果 IP 有更动,即立刻更新。请编辑 /etc/crontab 这个档,并加入下列这一行:
  1. */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


选择 Configure 进入,出现图 5-11:

图 5-11


接着选择 Networking 进入,进入图 5-12:

图 5-12


接着选第一个 Interfaces,出现图 5-13:

图 5-13


上图中的 fxp0 即是您的网络卡,fxp0 可能会因为网络卡的不同而有不同的代号,如 ed0、vr0 等。如果有多张网络卡,还会有 ed1、vr1、fxp1等。通常第一个就是网络卡,而 lp0、sl0 及 ppp0 都不是。选择您想要设定的网络卡后按空格键进入,程序会先问是否要使用IPv6,回答否。接着会问您是否要使用 DHCP,视您的网络决定,如果不是动态取得 IP 的话,拥有固定 IP 就不要使用 DHCP。接着会出现图 5-14:

图 5-14


我们要先知道我们的 Domain Name 及 IP 等,如果没有 Domain Name 的话,就随便输入吧。假设我们的机器 www.mydomain.com ,Host 一栏中就输入 www.mydomain.com,在 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 中依你的数据加入下列几行:
  1. # 预设的通讯网关 (Gateway)
  2. defaultrouter="140.115.1.254"
  3. #Host,机器的Domain Name
  4. hostname="www.mydomain.com"
  5. #网络卡代号是 fxp0,设定 IP为 140.115.75.2,
  6. #子网掩码为 255.255.0.0
  7. ifconfig_fxp0="inet 140.115.75.1 netmask 255.255.0.0"
复制代码
接着编辑 /etc/resolv.conf,依您的数据加入下列几行:
  1. #网域(domain)
  2. domain mydomain.com
  3. #DNS服务器地址
  4. nameserver 140.115.1.31
复制代码
以上资料都设定好了之后就可以重新开机使用新的设定了。或者你也可以使用下列指令来更新 IP。下面的指令中,网络卡代号为 fxp0,IP 是 140.115.75.1,子网掩码是 255.255.255.0。
  1. # ifconfig fxp0 down
  2. # ifconfig fxp0 140.115.75.1 netmask 255.255.255.0
  3. # ifconfig fxp0 up
复制代码
上述指令将立即更新网络卡信息,接着我们必须加入 gateway 的设定:
  1. # route add default 140.115.1.254
复制代码
现在您可以使用 ping 这个指令来查看网络是否正常运作:
  1. # ping 168.95.1.1
复制代码
如果您使用固定 IP,并想让家中网络的其它计算机透过本服务器上网,请参考「NAT 及防火墙」一章。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

91

主题

984

帖子

6920

金币

大家网研究生一年级

Rank: 18Rank: 18

积分
4066
 楼主| 发表于 2009-6-19 08:16 | 显示全部楼层
5.3 DHCP 动态取得 IP

如果您所处的网络环境中有 DHCP 服务器,那么您可以使用 DHCP 动态取得 IP 的方式连上网络。一般的 Cable Modem 通当是经由 DHCP 动态取得 IP,如果您的 Cable 是以 DHCP 联机的话也可以适用于本小节的设定说明。

首先,将网络卡和 Cable Modem 连接好,假设网络卡代号是 fxp0。我们先执行下列指令来试试看 DHCP 是否可以正常联机:
  1. # dhclient fxp0
复制代码
接着打 ifconfig fxp0,你应该可以看到下列画面:
  1. fxp0: flags=8843 mtu 1500
  2. inet6 fe80::250:baff:fe00:dcdd%vr0 prefixlen 64 scopeid 0x1
  3. inet 61.58.76.14 netmask 0xffffff00 broadcast 61.58.76.255
复制代码
上面画面中的 61.58.76.14 是我们动态取得的 IP,如果有出现 IP 就表示正常了。然后试一下可不可以 ping 到外面的网络:
  1. # ping 216.136.204.21
复制代码
都没问题后就可以开始编辑 /etc/rc.conf 了,请在 rc.conf 中加入下列设定:
  1. 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 设定档中加入下列几行:
  1. # PPPoE 方面(FreeBSD 4.4-RELEASE 以后的版本不需加入下列三行)
  2. options NETGRAPH
  3. options NETGRAPH_PPPOE
  4. options NETGRAPH_SOCKET
复制代码
接着请参考「编译核心」一章的说明来重新编译核心。

5.4.2 修改 /etc/ppp/ppp.conf

这里我们以 Hinet 的 ADSL 为范例说明,其它家的 ADSL 设定大都差不多。首先,将 /etc/ppp/ppp.conf 更名为 /etc/ppp/ppp.conf.old,更名的目的是只为了备份原本的设定档,您也可以直接删除它:
  1. # mv /etc/ppp/ppp.conf /etc/ppp/ppp.conf.old
复制代码
再来,使用文书编辑软件来新增并编辑 /etc/ppp/ppp.conf,加入下列的设定,请记得要修改下列设定中的 "set device PPPoE:---" 那一行,在那一行设定连接到 ADSL 的网络卡代号,范例中是使用 vr0 。接着要修改 authname 及 authkey 成为你的账号及密码。
  1. # /etc/ppp/ppp.conf
  2. default:
  3.    set log Phase Chat LCP IPCP CCP tun command
  4.    nat enable yes
  5.    nat same_ports yes
  6.    nat use_sockets yes
  7.    set redial 15 28800
  8.    set reconnect 15 28800

  9. pppoe:
  10.    set device PPPoE:fxp0:
  11.    set mru 1492
  12.    set mtu 1492
  13.    set speed sync
  14.    enable lqr
  15.    set lqrperiod 5
  16.    set cd 5
  17.    set dial
  18.    set login
  19.    set timeout 0
  20.    set authname b1xxxxxx@hinet.net
  21.    set authkey yourpassword
  22.    set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0
  23.    add default HISADDR
  24.    enable dns
  25. # end of ppp configuration
复制代码
完成后即可存档离开。

5.4.3 修改 /etc/rc.conf

再来是修改 /etc/rc.conf,在这里我们一样是以 fxp0 为连接到 ADSL 的网络卡代号,请记得要修改成你的网络卡代号。 然后请在 /etc/rc.conf 中加入下列几行:
  1. # /etc/rc.conf
  2. #设定自动选择联机装置
  3. network_interfaces="auto"
  4. ifconfig_fxp0="inet 10.0.0.1 netmask 255.0.0.0 -arp up"
  5. #一开机就执行 PPPoE(建议)
  6. ppp_enable="YES"

  7. #ddial 表示只要断线便自动联机(建议),或设 auto 表示有数据要
  8. #出去则自动联机,也可以设为 background 只连一次后放到背景
  9. ppp_mode="ddial"
  10. ppp_profile="pppoe"

  11. #end of  /etc/rc.conf
复制代码
完成了上述步骤之后,就可以重新开机以启动 PPPoE了。如果您在 /etc/rc.conf 中并未设定一开机就自动联机的话,可以在重开机之后使用以下的指令来连上 internet:
  1. # 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,如下:
  1. default:
  2.    set log phase chat connect LCP IPCP CCP tun command

  3.    #设定使用哪一个 com,com1 是 cuaa0、com2 是 cuaa1
  4.    set device /dev/cuaa1
  5.    set speed 115200
  6.    deny lqr
  7.    set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \"\" \
  8.    AT OK-AT-OK ATE1Q0 OK\\dATDT\\T TIMEOUT 40 CONNECT"

  9. hinet:
  10.    set openmode active

  11.    #设定拨接的号码
  12.    set phone 4125678

  13.    # 设定共拨3次,每次隔5秒
  14.    set redial 5 3

  15.    #设定闲置几秒就自动断线,0表示不会自动断线
  16.    set timeout 1200

  17.    #设定可以使用 ppp 的系统使用者账号
  18.    allow users xxx
  19.    deny chap
  20.    disable chap
  21.    accept pap

  22.    #Hinet 的拨接账号 xxxx
  23.    set authname xxxx

  24.    #Hinet 的拨接密码 xxxx
  25.    set authkey xxxx
  26.    set ifaddr 10.1.1.1/0 10.2.2.2/0
复制代码
设定完后存档离开进入下一个步骤。

5.5.2 编辑 /etc/ppp.linkup

接着编辑 /etc/ppp.linkup 如下:
  1. hinet:
  2.       delete ALL
  3.       add 0 0 HISADDR
复制代码
存盘离开,现在可以使用下列指令来拨接:
  1. # ppp -backgroud hinet
复制代码
如果您希望让 modem 联机分享给其它区网中的计算机使用,您可以使用下列指令来拨号:
  1. # ppp -nat -backgroud hinet
复制代码
5.6 网络相关指令

这里我们将介绍一些常用到的网络相关指令,如果你想知道更多、更详细的指令,请参考指令应用篇,或使用指令 man 来查询相关使用方法。在这里我们的目的只是告诉你有这些工具可以使用,并未针对每一个指令作详细的使用方法说明,你应该使用 man 来查询该指令更完整的参数。我只列出较常用的几个方法。

5.6.1 telnet

大家都知道这个指令吧!如果你要联机到别台 UNIX 主机或是连到 BBS,就使用 telnet 这个指令。例如,要telnet 到 sparc20.cc.ncu.edu.tw 这台机器:
  1. $ telnet sparc20.cc.ncu.edu.tw
复制代码
如果你在登入时想离开,可以按 CTRL+] 回到自己的主机,再打 quit 离开 telnet。

如果你在 telnet 时想输入中文的话,必须加入参数 -8:
  1. $ telnet -8 bbs.ba.mgt.ncu.edu.tw
复制代码
5.6.2 ftp

FreeBSD 中也有提供命令列的 ftp client 工具,如果你要连到 freebsd.csie.nctu.edu.tw 这台机器的话:
  1. $ ftp freebsd.csie.ncu.edu.tw
复制代码
允许昵登入的 ftp 主机,账号只要输入 anonymous 或 ftp 即可,密码可以随便输入,或者在 ftp 指令之后加上参数 -a 即可自动以昵名登入。进入 ftp 站台后,你可以使用下列指令:


?列出所有指令。
ls查看所在目录的档案,使用方法和在 FreeBSD 机器中一样。
cd进入某一个目录,如 cd pub
get <filename>取回某一个档案,如 get ve-1.0.tgz
reget <filename>续传某一档案。
put <filename>上传档案,如 put homework01.zip
send <filename>上传档案,和 put 一样。
size <filename>查看档案大小。
less <filename>观看文字文件内容


5.6.3 ping

送出 ICMP 封包,用以查看网络上主机的联机状况。
  1. $ ping 216.136.204.21
复制代码
你也可以加入以下的参数:

    -c count 只计算 count 次。
    -s size 不使用预设的 64 bytes 当作封包大小,而改用新的 size。
  1. $ ping -c 10 -s 108 216.136.204.21
复制代码
5.6.4 nslookup

查询网络主机信息。此指令可以用来查询网络主机的 Domain name,或以 Domain name 反查 IP 地址。
  1. $ nslookup 216.136.204.21
  2. $ nslookup www.freebsd.org
复制代码
5.6.5 netstat

显示网络状况。可以用来看网络的组态及各项服务的情形。

参数:

    -a 显示所有信息
    -n 以 number 方式显示 IP 地址
    -i 显示网络接口
  1. $ netstat -a
  2. $ netstat -ni
复制代码
5.6.6 traceroute

追踪网络路径,用这个指令,你可以知道从你的主机到某一台主机的过程中经过了哪些机器。

使用方法:
  1. $ traceroute www.freebsd.org
复制代码
5.6.7 sockstat

查看主机 internet 或 domain socket。你可以用来查询有谁连到你的机器中,由哪一个网络服务接收,该网络服务的 PID 是多少等。还可以查询本机开放了哪些 port、提供了哪些服务。

5.6.8 ifconfig

设定或检查网络接口,ifconfig 可以用来设定你的网络卡,显示网络接口的信息。

参数:

    -a 详细显示所有接口
    -u 显示目前使用中的装置
    interface 显示该interface 的信息,此 interface 为你的网络卡代号或其它代号。
    down 停用某一装置
    up 启用某一装置
  1. $ ifconfig -a                显示所有接口的信息
  2. $ ifconfig vr0                显示网络卡 vr0 的信息
  3. $ ifconfig vr0 down        停用网络卡 vr0
  4. $ ifconfig vr0 192.168.0.1netmask 255.255.255.0        设定网络卡 vr0 的 ip
  5. $ ifconfig vr0 up                启用网络卡 vr0
复制代码
5.6.9 tcpdump

列出所有到达本机的 tcp 封包。

5.6.10 lynx

文字浏览器。这并不是 FreeBSD 内定的指令,所以必须先使用 port 安装:
  1. # cd /usr/ports/www/lynx
  2. # make install clean
复制代码
安装完就可以使用 lynx 来上网浏览网页:
  1. $ lynx www.freebsd.org
复制代码
我们也可以使用 lynx 来下载网页上的档案。例如,我们要档案位置是 http://www.apache.org/dist/httpd/apache_1.3.33.zip,可以使用下列指令来下载它,并存成 apache.zip 这个档名:
  1. $ lynx -dump http://www.apache.org/dist/httpd/apache_1.3.33.zip > apache.zip
复制代码
回复 支持 反对

使用道具 举报

91

主题

984

帖子

6920

金币

大家网研究生一年级

Rank: 18Rank: 18

积分
4066
 楼主| 发表于 2009-6-19 08:24 | 显示全部楼层
第六章 档案系统管理


管理档案系统是系统管理者最重要的工作之一,我们必须确定使用者可以存取他们需要的数据,而且储存装置必须随时都保持正常运作。

本章读完后,您将可以了解下列基本的档案系统管理知识:
  • 如何得知目前档案系统的使用情形。
  • 如何挂入与卸载档案系统。
  • 如何使用 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


我们看到第一个主要扇区是 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 指令输出结果:
  1. # df -h
  2. Filesystem     Size    Used   Avail Capacity  Mounted on
  3. /dev/ad0s1a    1.9G    389M    1.4G    21%    /
  4. devfs          1.0K    1.0K      0B   100%    /dev
  5. /dev/ad0s1d    989M     54K    910M     0%    /var
  6. /dev/ad0s1e    4.8G    3.8G    657M    86%    /usr
  7. /dev/ad1s1d    10.9G   149M   10.6G     1%    /usr/local
复制代码
我们可以看到分割区 ad0s1a 是挂在根目录 (/) 下,而 ad0s1d 挂在 /var 中。上述 df 指令输出的范例中,/、/dev、/var、/usr 等都是磁盘分割区的挂入点 (mount points)。下图即为分割区示意图:

图 6-2


除了根目录外,每一个挂入点都可以被卸载。例如 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 可以显示目前所有档案系统的最大可用空间及使用情形,请看下列这个例子:
  1. # df -h
  2. Filesystem     Size    Used   Avail Capacity  Mounted on
  3. /dev/ad0s1a    1.9G    389M    1.4G    21%    /
  4. devfs          1.0K    1.0K      0B   100%    /dev
  5. /dev/ad0s1d    989M     54K    910M     0%    /tmp
  6. /dev/ad0s1f    4.8G    3.8G    657M    86%    /usr
  7. /dev/ad0s1e    1.9G    149M    1.6G     8%    /var
  8. /dev/ad0s1g     26G    890K     24G     0%    /volume2
  9. /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 来存放档案的信息,一样会不能增加新的档案。
  1. # df -ih
  2. Filesystem     Size    Used   Avail Capacity iused    ifree %iused  Mounted on
  3. /dev/ad0s1a    1.9G    389M    1.4G    21%   20495   262127    7%   /
  4. devfs          1.0K    1.0K      0B   100%       0        0  100%   /dev
  5. /dev/ad0s1d    989M     62K    910M     0%      24   141286    0%   /tmp
  6. /dev/ad0s1f    4.8G    3.8G    657M    86%  311439   348015   47%   /usr
  7. /dev/ad0s1e    1.9G    149M    1.6G     8%    1758   280864    1%   /var
  8. /dev/ad0s1g     26G    890K     24G     0%      12  3532786    0%   /volume2
  9. /dev/da0s1d    325G    261G     38G    87%  707277 43311409    2%   /volume1
复制代码
我们可以看到根目录的已经用掉的 inode 数量为 20495,还有 262127 的可用 inode。

小提示

还记得什么是 inode 吗?所谓的 inode 是用来存放档案及目录的基本信息 (metadata),包含时间、档名、使用者及群组等。在分割扇区时,系统会先做出一堆 inode 以供以后使用,inode 的数量关系着系统中可以建立的档案及目录总数。如果要存的档案大部分都很小,则同样大小的硬盘中会有较多的档案,也就是说需要较多的 inode 来挂档案及目录。


指令 df 只能用来查看整个档案系统的使用情形,如果您需要知道某个目录的使用情形,可以用指令 du。

指令 du 能以指定的目录下的子目录为单位,显示每个目录内所有档案所占用的磁盘空间大小。例如:
  1. # du -h /etc
  2. 104K        /etc/defaults
  3. 6.0K        /etc/X11
  4. 8.0K        /etc/bluetooth
  5. 4.0K        /etc/gnats
  6. 52K        /etc/isdn
  7. 388K        /etc/mail
  8. 68K        /etc/mtree
  9. 2.0K        /etc/ntp
  10. 38K        /etc/pam.d
  11. 44K        /etc/periodic/daily
  12. 6.0K        /etc/periodic/monthly
  13. 42K        /etc/periodic/security
  14. 16K        /etc/periodic/weekly
  15. 110K        /etc/periodic
  16. 6.0K        /etc/ppp
  17. 318K        /etc/rc.d
  18. 2.0K        /etc/skel
  19. 130K        /etc/ssh
  20. 10K        /etc/ssl
  21. 1.7M        /etc
复制代码
我们目样使用 -h 参数来显示 human-readable 的格式。在应用时,我们可以使用 du 这个指令来查看哪个目录占用最多的空间。不过,du 的输出结果通常很长,我们可以加上 -s 参数来省略指定目录下的子目录,而只显示该目录的总合即可:
  1. # du -sh /etc
  2. 1.7M    /etc
复制代码
在查看目录的使用情形时,我们可以将输出结果导到 sort 指令进行排序,以了解哪个档案用了最多的空间:
  1. # du /etc | sort -nr | more
  2. 1746        /etc
  3. 388        /etc/mail
  4. 318        /etc/rc.d
  5. 130        /etc/ssh
  6. 110        /etc/periodic
  7. 104        /etc/defaults
  8. 68        /etc/mtree
  9. 52        /etc/isdn
  10. 44        /etc/periodic/daily
  11. 42        /etc/periodic/security
  12. 38        /etc/pam.d
  13. 16        /etc/periodic/weekly
  14. 10        /etc/ssl
  15. 8        /etc/bluetooth
  16. 6        /etc/ppp
  17. 6        /etc/periodic/monthly
  18. 6        /etc/X11
  19. 4        /etc/gnats
  20. 2        /etc/skel
  21. 2        /etc/ntp
复制代码
sort 的参数 -nr 表示要以数字排序法进行反向排序,因为我们要对目录大小做排序,所以不可以使用 human-readable 的大小输出,不然目录大小中会有 K、M 等字样,会造成排序不正确。

6.2.2 磁盘使用效率

除了查看硬盘的空间使用情形外,我们还可以查看目前硬盘是否忙碌中,以了解硬盘的使用效率。我们可以使用 systat 这个指令:
  1. # systat -vm 1
  2.    3 users    Load  0.12  0.12  0.09                   6 26 00:38

  3. Mem:KB    REAL            VIRTUAL                     VN PAGER  SWAP PAGER
  4.        Tot   Share      Tot    Share    Free         in  out     in  out
  5. Act  130120    5436   385556    11716   30540 count  146
  6. All  233584   17544  2762124    45604         pages  846
  7.                                                                 Interrupts
  8. Proc:r  p  d  s  w    Csw  Trp  Sys  Int  Sof  Flt      8 cow     474 total
  9.             75      1514  379 2525  690   66  375   70564 wire    100 0: clk
  10.                                                    132932 act         1: atkb
  11. 14.0%Sys   1.6%Intr  2.3%User  0.0%Nice 82.2%Idl    18024 inact       3: sio1
  12. |    |    |    |    |    |    |    |    |    |      13024 cache       4: sio0
  13. =======+>                                           17516 free        7: ppc0
  14.                                                           daefr   128 8: rtc
  15. Namei         Name-cache    Dir-cache                  38 prcfr    40 9: fxp0
  16.    Calls     hits    %     hits    %                  228 react    31 10: fxp
  17.     1020      672   66                                    pdwak       11: hpt
  18.                                       43 zfod             pdpgs       12: psm
  19. Disks   ad0   da0 pass0                43 ofod            intrn       13: npx
  20. KB/t  28.20  0.00  0.00                   %slo-z    35664 buf     175 14: ata
  21. tps     164     0     0                70 tfree       334 dirty       15: ata
  22. MB/s   4.52  0.00  0.00                             17810 desiredvnodes
  23. % busy   43     0     0                             16852 numvnodes
  24.                                                     13772 freevnodes
复制代码
systat 有许多信息,我们使用参数 -vm1 来显示最详细的信息,并设定每 1 秒更新一次信息。在上面一堆复制的信息中,请将重点于在中间「====+>」及左下角的 Disks,中间部份的「====+>」表示目前 CPU 的使用情形,我们可以看到有 82.2% 的 Idle (闲置)。而硬盘的使用情形中,我的第一个硬盘 ad0 正在忙碌中,有 43% 的忙碌。而另一个 SCSI 硬盘 da0 则是完全闲置,也就是没有人正在使用它。

如果您想要知硬盘本身的存取速度,可以使用 diskinfo 这个指令。diskinfo 加了 -t 参数会对硬盘做一些测试并回报结果:
  1. # diskinfo -v -t ad0
  2. ad0
  3.        512             # sectorsize
  4.        40020664320     # mediasize in bytes (37G)
  5.        78165360        # mediasize in sectors
  6.        77545           # Cylinders according to firmware.
  7.        16              # Heads according to firmware.
  8.        63              # Sectors according to firmware.

  9. Seek times:
  10.        Full stroke:      250 iter in   5.199255 sec =   20.797 msec
  11.        Half stroke:      250 iter in   4.011383 sec =   16.046 msec
  12.        Quarter stroke:   500 iter in   6.797812 sec =   13.596 msec
  13.        Short forward:    400 iter in   2.774055 sec =    6.935 msec
  14.        Short backward:   400 iter in   3.257613 sec =    8.144 msec
  15.        Seq outer:       2048 iter in   0.352483 sec =    0.172 msec
  16.        Seq inner:       2048 iter in   0.369383 sec =    0.180 msec
  17. Transfer rates:
  18.        outside:       102400 kbytes in   4.511970 sec =    22695 kbytes/sec
  19.        middle:        102400 kbytes in   4.770641 sec =    21465 kbytes/sec
  20.        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。它的用法如下:
  1. # mount device mount-point
复制代码
例如,我们要将 ad0s1e 挂入 /home2 中:
  1. # mount /dev/ad0s1e /home2
复制代码
在执行 mount 指令前,我们必须确定挂入点存在,如果不在必须先建立目录。

如果执行 mount 时不加任何参数则可以显示目前已挂入的档案系统:
  1. # mount
  2. /dev/ad0s1a on / (ufs, local)
  3. devfs on /dev (devfs, local)
  4. /dev/ad0s1d on /tmp (ufs, local, soft-updates)
  5. /dev/ad0s1f on /usr (ufs, local, soft-updates)
  6. /dev/ad0s1e on /var (ufs, local, soft-updates)
  7. /dev/ad0s1g on /volume2 (ufs, local, soft-updates)
  8. /dev/da0s1d on /volume1 (ufs, local, soft-updates)
复制代码
如果您要卸载一个档案系统,可以使用 umount 指令。例如,我们要卸载 /usr/local:
  1. # umount /usr/local
复制代码
如果在卸载档案系统时出现下列讯息,表示该档案系统忙碌中,有可能有其它人正在存取它。
  1. # umount /var
  2. umount: unmount of /var failed: Device busy
复制代码
6.3.2 挂入与卸载其它档案系统

mount 指令除了可以让我们挂入 FreeBSD 的预设的档案系统 UFS 外,我们还可以用它来挂入其它 FreeBSD 支持的档案系统格式。例如,FreeBSD 安装光盘是一般标准的数据光盘,它的档案系统格式是 CD9660,我们将该 CD 挂入系统目录中。首先,请先将光盘放入光驱中,接着请使用下列指令来挂入光盘片:
  1. # mount -t cd9660 /dev/acd0 /cdrom
复制代码
在使用 mount 指令时,我们加上参数 -t cd9660 以指定档案系统格式为 cd9660。我们可以看到在挂入之前,/cdrom 这个目录是空的,而挂入后就出现了许多资料。光驱挂入后,您会发现光驱的退片键将失去作用,我们必须先卸载它才可以取出光盘片。

如果您要卸载它,可以使用 umount 指令。如果您在卸载时发生错误,请注意您的所在目录是不是在 /cdrom 下,如果是,必须先离开才可以顺利 umount:
  1. # cd /
  2. # umount /cdrom
复制代码
我们说过,挂入点和磁盘分割区之间并没有必然的关系,您也可以将光盘挂入 /mnt 中,不一定要挂入 /cdrom,将 CDROM 挂入 /cdrom 只是习惯用法而已。

除了一般数据光盘的 cd9660 档案格式外,FreeBSD 还支持下列常用的档案格式:


档案系统格式说明
ufsFreeBSD 预设的档案系统。
ext2fsLinux EXT2 档案格式。
msdosfsFAT/FAT32,DOS 兼容的档案系统。
ntfsWindows 的 NTFS。
cd9660CD-ROM 的档案系统。
udfDVD 数据光盘格式。
nfs和 Sun Microsystems 相容的 "Network File System"。
smbfsCIFS/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 的指令:
  1. # ls /sbin/mount*
  2. /sbin/mount*             /sbin/mount_mfs*        /sbin/mount_procfs*
  3. /sbin/mount_cd9660*      /sbin/mount_msdosfs*    /sbin/mount_std*
  4. /sbin/mount_devfs*       /sbin/mount_nfs*        /sbin/mount_udf*
  5. /sbin/mount_ext2fs*      /sbin/mount_nfs4*       /sbin/mount_umapfs*
  6. /sbin/mount_fdescfs*     /sbin/mount_ntfs*       /sbin/mount_unionfs*
  7. /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 时是以光盘安装,您也许会发现只要以下列二个指令其中一个就可以挂入光驱:
  1. # mount /cdrom
  2. # mount /dev/acd0
复制代码
我们之所以可以这么做是因为在 /etc/fstab 中已经记录了 /cdrom 应该要挂入另一个装置。让我们来看一下这个档:
  1. # Device        Mountpoint        FStype        Options                Dump        Pass#
  2. /dev/ad0s1b        none                swap        sw                0        0
  3. /dev/ad0s1a        /                ufs        rw                1        1
  4. /dev/ad0s1d        /tmp                ufs        rw                2        2
  5. /dev/ad0s1f        /usr                ufs        rw                2        2
  6. /dev/ad0s1e        /var                ufs        rw                2        2
  7. /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所有数据以同步方式完成。
    swswap。
    noauto开机时不挂入。
    userquota使用者磁盘配额限制 (须 kernel 支持 quota)。
    groupquota群组磁盘配额限制 (须 kernel 支持 quota)。
  • dump:表示使用指令 dump 时要备份的档案系统,0表示不要、1表示要。
  • pass:这个字段是给指令 fsck 用的,是检查的顺序。/ 的数字应该是1而其它的档案系统为2。不需检查的就是0(如 cdrom,swap 等)。

如果您新增一个分割区,并且希望在开机时自动加载,可以编辑 fstab,并加入您所要挂入的扇区。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

91

主题

984

帖子

6920

金币

大家网研究生一年级

Rank: 18Rank: 18

积分
4066
 楼主| 发表于 2009-6-19 08:31 | 显示全部楼层
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 上进行小修改,所以就速度上而言应该差不多。如果您有兴趣可以参考这一份 Little UFS2 FAQ (http://sixshooter.v6.thrupoint.net/jeroen/faq.html)。

总而言之,新增一个硬盘的步骤为:
  • * 切割出 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 身份执行。接下来,您就可以依照下列步骤来新增硬盘:
  • 进入 sysinstall

    进入 sysinstall 的主选单后,首先请选择 [Configure],进入后,再选择 [Fdisk] 项目以进入 Fdisk 选单。第一次进入 Fdisk 时,sysinstall 会要求您选择所要设定的硬盘,请选择 ad1。
  • 使用 Fdisk

    相信您对于 Fdisk 的画面应该很熟悉,我们在安装 FreeBSD 时就使用过它。如果您要让 FreeBSD 使用整个硬盘,请按 [A],接下来请按 [W] 以将设定写入硬盘。在按了 [W] 后,会出现一个确认的窗口,选 [Yes] 即可。最后会出现要您选择所要使用的 Boot Manager,因为这一个硬盘不是要用来开机用的,所以我们选 [None]。写入后,请按 [Q] 离开 Fdisk 的画面,并回到 Configure 画面。接着请离开 sysinstall,再重新执行 sysinstall 以让 sysinstall 重新侦测硬盘设定。
  • 使用 Disk Label Editor

    重新执行 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 回到命令列。
  • 设定 /etc/fstab

    为了让系统在开机时可以自动将此分割区挂入,我们必须再设定 /etc/fstab。请在 /etc/fstab 中增加下列数据:
    1. # Device          Mountpoint   FStype  Options     Dump    Pass#
    2. /dev/ad1s1d       /volume1     ufs     rw          2       2
    复制代码

6.4.2 使用命令列

您不一定要使用 sysinstall 来分割及格式化硬盘,sysinstall 只是提供一个比较容易使用的界面,最后还是会呼叫命令列的指令以完成硬盘的设定。使用命令列的方式比较复杂,而且较容易出错,但却可以让您有更灵活的应用。看了如何从命令列新增一个硬盘可以让您对 sysinstall 所做的事更了解。

我们一样假设要新增的硬盘为 ad1,并且将整个硬盘切成一个扇区给 FreeBSD 使用。第一步要做的就是先使用 dd 这个指令来清除硬盘上旧的设定:
  1. # 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 了:
  1. # fdisk -BI ad1
  2. ******* Working on device /dev/ad1 *******
  3. fdisk: invalid fdisk partition table found
复制代码
上述 fdisk 指令表示我们要将 ad1 切割成一个 slice (参数 -I),并清除放开机信息的第 0 个 sector。您可以忽略「invalid fdisk partition table found」的警告,因为我们一开始并没有任何分割区。接下来我们就可以使用下列 bsdlabel 指令来建立预设的 partition label,再使用 bsdlabel 加参数 e 以修改建立的 lable:
  1. # bsdlabel -B -w ad1s1 auto
  2. # bsdlabel -e ad1s1
复制代码
接着会使用您预设的文书编辑软件跳出一个窗口,请将 a: 改成 d: 后存档离开,因为我们新增加的分割区不是要给根目录使用,所以不用代号 a,而是使用第一个不具特别意义的代号 d。
  1. # /dev/ad1s1:
  2. 8 partitions:
  3. #        size   offset    fstype   [fsize bsize bps/cpg]
  4. d: 78156146       16    unused        0     0
  5. c: 78156162        0    unused        0     0 # "raw" part, don't edit
复制代码
将 a: 改成 d: 后,存档离开即可。接下来我们就可以格式化这一个分割区了。FreeBSD 中用来格式化 UFS 档案系统的指令为 newfs:
  1. # newfs /dev/ad1s1d
复制代码
以上即为新增一颗硬盘所要做的事。请注意,bsdlabel 这个指令是 FreeBSD 5.1 以后才有的,在 5.1 以前,请使用 disklabel。

接下来您就可以将新的硬盘挂入了,假设您要挂入的目录是 /volume1,则请使用下列指令:
  1. # mkdir /volume1
  2. # 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 硬盘及光驱的支持必须要有下列项目:
  1. device        scbus        # SCSI bus (required for SCSI)
  2. device        da        # Direct Access (disks)
  3. device        cd        # 支援 CD-ROM/DVD
  4. device        pass        # Passthrough device (direct SCSI access)
  5. device        uhci        # UHCI PCI->USB interface (支援 USB 1.x)
  6. device        ohci        # OHCI PCI->USB interface (支援 USB 1.x)
  7. device        ehci        # EHCI PCI->USB interface (支援 USB 2.0)
  8. device        usb        # USB Bus (required)
  9. device        umass        # Disks/Mass storage - Requires scbus and da
复制代码
如果您不使用 USB 光驱,可以将「device cd」移除。如果您使用的是 GENERIC 核心 (FreeBSD 预设的核心),那么您的核心已经支持 USB 硬盘了。如果您使用的是 FreeBSD 6.0 以前的版本,您必须再修改修改核心,以支持 USB 2.0。请在核心设定档中加入下列这一行以使用 USB 2.0:
  1. 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 加入下列设定:
  1. usbd_enable="YES"
复制代码
重新编译核心,并修改 /etc/rc.conf 后,您必须重新开机才可以继续下列动作喔。

重开机后,您就可以将 USB 装置插入。插入后,您会在 console 看到下列讯息:
  1. umass0: USB Flash Disk, rev 2.00/2.00, addr 2
  2. da0 at umass-sim0 bus 0 target 0 lun 0
  3. da0: <OTi Flash Disk 2.00> Removable Direct Access SCSI-2 device
  4. da0: 1.000MB/s transfers
  5. da0: 125MB (256000 512 byte sectors: 64H 32S/T 125C)
复制代码
我们可以看到这个装置的名称为 da0,我们以下的操作都会以 da0 做为范例。如果您没有看到上述讯息,表示没有抓到 USB 装置,请检查核心设定后再试一次。

由于 USB 磁盘驱动器会被仿真成 SCSI 装置,所以您也可以使用 SCSI 工具 camcontrol 来查看目前所有 USB 装置:
  1. # camcontrol devlist
  2. <OTi Flash Disk 2.00> at scbus1 target 0 lun 0 (da0,pass0)
复制代码
6.5.2 挂入已格式化的磁盘驱动器

如果您要挂入已从 Windows/DOS 中格式化好的 USB 磁盘驱动器,它的档案格式有可能是 FAT/FAT32 或是 NTFS。如果您不知道它的档案格式,可以使用指令 fdisk 查看:
  1. # fdisk da0
  2. ******* Working on device /dev/da0 *******
  3. parameters extracted from in-core disklabel are:
  4. cylinders=125 heads=64 sectors/track=32 (2048 blks/cyl)

  5. parameters to be used for BIOS calculations are:
  6. cylinders=125 heads=64 sectors/track=32 (2048 blks/cyl)

  7. Media sector size is 512
  8. Warning: BIOS sector numbering starts with sector 1
  9. Information from DOS bootblock is:
  10. The data for partition 1 is:
  11. sysid 11 (0x0b),(DOS or Windows 95 with 32 bit FAT)
  12. start 32, size 255968 (124 Meg), flag 80 (active)
  13. beg: cyl 0/ head 1/ sector 1;
  14. end: cyl 124/ head 63/ sector 32
  15. The data for partition 2 is:
  16. <UNUSED>
  17. The data for partition 3 is:
  18. <UNUSED>
  19. The data for partition 4 is:
  20. <UNUSED>
复制代码
请注意粗体字的部份,我们可以看到在 da0 中有一个分割区,其档案系统格式为 FAT32。所以要挂入档案系统时,分割区代号为 da0s1 (请参考本章最开头分割区代号的说明)。以下我们的操作都是使用 da0s1。

挂入 FAT/FAT32 档案格式

如果您要挂入的档案系统为 FAT/FAT32,在 FreeBSD 5.x 以后,请使用指令 mount_msdosfs,若是 FreeBSD 4.x 请使用 mount_msdos:
  1. # mount_msdosfs -L zh_TW.Big5 /dev/da0s1 /mnt
复制代码
我们在 mount_msdosfs 指令中使用参数 -L,并指定 locale 为 zh_TW.Big5 以支持中文档名。如果没有加此参数,中文档名将会是乱码。

如果您在挂入时出现下列错误讯息,表示您需要安装 libiconv 模块:
  1. # mount_msdosfs -L zh_TW.Big5 /dev/da0s1 /mnt
  2. mount_msdosfs: Unable to load iconv library: Shared object "libiconv.so"
  3. not found, required by "mo"
  4. : No such file or directory
  5. mount_msdosfs: msdosfs_iconv: No such file or directory
复制代码
我们可以使用 port 来安装 libiconv 模块:
  1. # cd /usr/ports/converters/libiconv
  2. # make install
复制代码
接着您就可以重新执行挂入的指令了。

挂入 NTFS 档案格式

如果您要挂入的档案系统格式为 NTFS,则必须使用指令 mount_ntfs:
  1. # 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] <== 按 Enter 即可
fdisk: invalid fdisk partition table found
Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
   start 32, size 255968 (124 Meg), flag 80 (active)
       beg: cyl 0/ head 1/ sector 1;
       end: cyl 124/ head 63/ sector 32
Do you want to change it? [n] y <== 输入 y 以修改 Partition 1 的设定

The static data for the slice 1 has been reinitialized to:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
   start 32, size 255968 (124 Meg), flag 80 (active)
       beg: cyl 0/ head 1/ sector 1;
       end: cyl 124/ head 63/ sector 32
Supply a decimal value for "sysid (165=FreeBSD)" [165] 11 <== 输入 FAT32 分割区代号 11
Supply a decimal value for "start" [32] <== 按 Enter 即可
Supply a decimal value for "size" [255968] <== 按 Enter 即可
Explicitly specify beg/end address ? [n] <== 按 Enter 即可
sysid 11 (0x0b),(DOS or Windows 95 with 32 bit FAT)
   start 32, size 255968 (124 Meg), flag 80 (active)
       beg: cyl 0/ head 1/ sector 1;
       end: cyl 124/ head 63/ sector 32
Are we happy with this entry? [n] y <== 输入 y 以确定 Partition 1 的设定
The data for partition 2 is:
<UNUSED>
Do you want to change it? [n] <== 按 Enter 即可,我们不修改 Partition 2
The data for partition 3 is:
<UNUSED>
Do you want to change it? [n] <== 按 Enter 即可,我们不修改 Partition 3
The data for partition 4 is:
<UNUSED>
Do you want to change it? [n] <== 按 Enter 即可,我们不修改 Partition 4
Partition 1 is marked active
Do you want to change the active partition? [n] <== 按 Enter 即可

We haven't changed the partition table yet. This is your last chance.
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)

Information from DOS bootblock is:
1: sysid 11 (0x0b),(DOS or Windows 95 with 32 bit FAT)
start 32, size 255968 (124 Meg), flag 80 (active)
beg: cyl 0/ head 1/ sector 1;
end: cyl 124/ head 63/ sector 32
2: <UNUSED>
3: <UNUSED>
4: <UNUSED>
Should we write new partition table? [n] y <== 输入 y 以写入设定


分割好磁盘后,我们就可以开始格式化了。

格式化成 FAT/FAT32

FreeBSD 中格式化 FAT 的指令为 newfs_msdos:
  1. # newfs_msdos /dev/da0s1
复制代码
newfs_msdos 指令会自动依您的磁盘大小选择使用 FAT 或是 FAT32。现在您可以试着挂入看看可不可以使用:
  1. # 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 指令后面加上所要检查的分割区代号。例如:
  1. # fsck -y /dev/ad0s1d
  2. ** /dev/ad1s1d
  3. ** Last Mounted on
  4. ** Phase 1 - Check Blocks and Sizes
  5. ** Phase 2 - Check Pathnames
  6. ** Phase 3 - Check Connectivity
  7. ** Phase 4 - Check Reference Counts
  8. ** Phase 5 - Check Cyl groups
  9. 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,可以使用下列指令:
  1. # mount -u -o snapshot /home/snapshot20050730 /home
复制代码
或是:
  1. # mksnap_ffs /home /home/snapshot20050730
复制代码
您会发现在 /home 中多了一个文件名为 snapshot20050730。这个档案就是现在这个时间点的档案系统状态。必须要注意的是,如果您要对 /home 做快照,在快照时只能将结果放在 /home 目录下。例如,你可以放在 /home/snapshot/20050730,或是 /home/alex/backup/0730。但是不能放在 /var/snap.0730。也就是对某一个档案系统进行快照的结果只能放在该档案系统中。但是快照完成后,您就可以将它复制到其它地方。

现在,您可以在 /home 中先建一些档案,等一下我们再将刚才的 snapshot 翻开来看,您会发现这些新建的档案都不会出现在「照片」中。

我们现在来看看要怎么把「照片」翻开来看。要看快照的内容可以使用下列指令:
  1. # mdconfig -a -t vnode -f /home/snapshot20050730 -u 3
  2. # mount -r /dev/md3 /mnt
复制代码
上面的指令是将快照档案挂入第 3 个 md 装置,再使用 mount 指令将它像档案系统一样挂入。因为这是快照,照片是不能修改的,所以我们只能以只读格式挂入。您现在可以看一下 /mnt 中的档案,是不是和您 /home 中的档案一样,但却没有新建的档案存在。而且您可以试着开启档案,连档案内容都一样。很神奇吧,杰克!

md 是 FreeBSD 中一种特别的装置,它可以让我们将档案仿真成档案系统,您可以随意指定没有在使用中的 md 装置,如 md1、md2、md3 等。我们使用 mdconfig 这个指令将设定档案使用某一个编号的装置,在挂入时必须也使用相对的编号 (例如上面的 md3)。而在使用完快照后,我们必须将它卸载,并释放 md 装置:
  1. # umount /mnt
  2. # mdconfig -d -u 3
复制代码
以上就是档案系统快照,是不是很好用。

同一个档案系统中最多可以有 20 个档案统快照,如果您有旧的快照不用了,可以直接使用 rm 指令删除它。如果您要查找某一目录下所有的快照,可以使用下列指令:
  1. # find /home -flags snapshot
复制代码
如果您查看一下我们做出来的快照,您会发现它的档案大小和档案系统大小一模一样。但是如果您将它放在原本的档案系统中,它是不占空间的。如果您将 /home 的快照复制到其它的分割区中,它才会真正的占空间。

这么神奇的档案系统快照有什么功用呢?实际上的应用可多了。您有没有发现档案系统快照的速度非常快,这一点可以让我们在备份时更快。传统上,如果您要备份系统,您必须先停止网络服务,以免使用者数据备份到一半却有人修改而造成错误,接着您才可以备份数据。而这样一来,服务中断的时间会非常长,直到整个档案备份完为止。

而利用档案系统快照,您先停止网络服务,将档案系统进行快照,快照完后立即启用网络服务。接下来,再将快照挂入后依正常程序备份即可。或者,您也可以直接备份快照的档案即可。如此一来,服务中断的时间就可以大幅减少了,是不是很赞!
回复 支持 反对

使用道具 举报

91

主题

984

帖子

6920

金币

大家网研究生一年级

Rank: 18Rank: 18

积分
4066
 楼主| 发表于 2009-6-19 08:38 | 显示全部楼层
第七章 系统安全


系统安全是每个管理者都必须注重的课题。有人说:「没有不安全的系统,只有懒惰的管理者。」每个系统都有可能会出现漏洞,而有安全性的漏洞产生时,发行的单位都会立即发布通告及修补的方式,而系统管理者的职责便是要随时注意是否需要更新漏洞、随时注意系统是否有异常的讯息。

本章将针对 FreeBSD 系统安全做详细的说明,读完本章后,您将可以了解下列主题:
  • 基本系统管理应注重的安全项目。
  • 如果安全的管理账号。
  • 网络安全管理。
  • 如何进行漏洞修补。

7.1 概论

FreeBSD 相对而言虽然是比较安全的操作系统,但是有时候问题不是在操作系统本身,而是所安装的软件。在 FreeBSD 中常见的情形是安装非 FreeBSD 内定的软件,但该软件被收录在 ports 中,FreeBSD 也会提出警告。因此,我们必须到 FreeBSD 的网站上查看是否有系统安全的消息,网址是 http://www.freebsd.org/security/index.html 。当发现问题时,可以依照发布的文件中所提供的修正方式来进行修补。

基本上只要计算机电源打开,系统就没有安全的一天,更何况要连上网络提供服务。系统安全的范围很广,从硬设备的保全、人员管理、网络规划、到系统本身的管理,我们并不打算说明如何制定一个安全性政策,也无法在这里说明所有系统安全的相关议题,我们所提及的只是笔者在 FreeBSD 使用上的建议。如果想要更多 FreeBSD Security 的信息,可以参考 FreeBSD Handbook,我们在安装 FreeBSD 时己经将 doc 安装在 /usr/share/doc 中,你可以使用 lynx 来观看 FreeBSD 的文件。例如:
  1. # lynx /usr/share/doc/en_US.ISO8859-1/books/handbook/security.html
复制代码
小提示

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 设定中是否有将 "." 加入路径中:
  1. # echo $PATH
  2. /sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin
复制代码
为了避免 /bin 及 /sbin 等重要执行档遭到修改,我们可以为这些档案设定禁止修改的 schg flag:
  1. # chflags schg /bin/*
  2. # 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:
  1. # sysctl kern.securelevel
复制代码
如果要将 Security Level 设为 1:
  1. # sysctl -w kern.securelevel=1
复制代码
当我们将 Security Level 设为 1 以上时,我们会发现没有办法安装新的 kernel (因为不能移除 schg flag),也没有办法使用 big5con 、X Window 等软件。如果我们的 FreeBSD 只作为服务器,而不使用 big5con 或 X Window 的话,可以将 Security Level 的值调高一点。

如果要在开机时设定 Security Level,可以在 /etc/rc.conf 中以下面二行来设定:
  1. kern_securelevel_enable="YES" # 是否启动 Security Level

  2. kern_securelevel="1" # level 从 -1 到 3
复制代码
7.2.4 检视系统记录

在 /var/log 中,记录了许多系统的信息,我们应该要时常检视它们。这些档案如下表:


档案用途
adduser使用 adduser 的记录。
cron定时排程的记录。
maillog邮件记录。
messages系统讯息记录。
security安全性记录,如防火墙。

除了系统的记录外,如果有提供其它服务,会有更多的 log 数据。

如果我们有其它程序为留下 log 文件,最好在 /etc/newsyslog.conf 中设定定时备份压缩,以免档案过大。另外,这些备份的 log 档在 newsyslog.conf 中设定权限 (mode) 时,最好设为 600,以避免其它使用者可以读取。

FreeBSD 预设每天定时执行一些分析的工作,并将结果寄给 root,建议你最好每天阅读它们。我们可以在 /etc/mail/aliases 的开头中加入下面这一行:
  1. root: me@my.domain.com
复制代码
me@my.domain 改成你的 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,可以使用下列指令:
  1. # crypt mykey < myfile.txt > myfile.cyp
复制代码
加密后,就可以将 myfile.txt 删除。如果日后要解密,只要执行下列指令:
  1. # crypt mykey < myfile.cyp > myfile.out
复制代码
crypt 是一个历史悠久的编码软件,实际上并非十分安全,不过我们可以多加密几次,让档案加密后再加密,只要记得所使用的 key 就好了:
  1. # crypt mykey1< myfile.txt | crypt mykey2 | crypt mykey3 > myfile.cyp
复制代码
如果要解密,只要再反过来即可:
  1. # crypt mykey3 < myfile.cyp | crypt mykey2 | crypt mykey1 > myfile.out
复制代码
除了 crypt 外,我们也可以使用其它比较好的编码程序,例如 pgp。pgp 并非 FreeBSD 内附的软件,但我们可以使用 ports 来安装它:
  1. # cd /usr/ports/security/pgp
  2. # 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
<angle brackets>, if you have an E-mail address.
For example: John Q. Smith <12345.6789@compuserve.com>
Enter a user ID for your public key: (输入使用者名称)
John Chung <john@mydomain.com>

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 来编码了。


指令用途
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:
  1. # pgp -e myfile.txt -o myfile.cyp john
复制代码
这里的使用者是 john,他的全名是 John Chung <john@mydomain.com>,我们只要输入名字的部份关键词即可。而解密可以使用:
  1. # 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 的账号数据如下:
  1. jack:Bk5AI4MiRKDJ4:1000:1000::0:0:Tom Chang:/home/tom:/sbin/nologin
复制代码
就算使用者不能登入,但能使用磁盘空间,所以还是要为使用者设定磁盘配额。虽说现在硬件价格便宜,但若每个使用者都有数百 MB 的邮件,集合起来也十分惊人。关于磁盘配额的设定,请参考「使用者管理」一章中的「磁盘配额」。在限制使用者邮件容量方面,最简单的方式就是将使用者的邮件从 /var/mail 中搬移到使用者的目录中,再对使用者目录做磁盘配额的限制。例如,使用者 jack 的家目录位于 /home/jack,我们可以:
  1. # cd /var/mail
  2. # mkdir /home/jack/mail
  3. # mv /var/mail/jack /home/jack/mail/
  4. # 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) 所提供的软件,如果没有必要就停止这些服务吧。

我们先来看一下目前系统提供哪些服务:
  1. # netstat -a|grep LISTEN
  2. tcp4       0      0  *.http                 *.*                    LISTEN
  3. tcp4       0      0  *.https                *.*                    LISTEN
  4. tcp6       0      0  *.telnet               *.*                    LISTEN
  5. tcp4       0      0  *.telnet               *.*                    LISTEN
  6. tcp6       0      0  *.ftp                  *.*                    LISTEN
  7. tcp4       0      0  *.ftp                  *.*                    LISTEN
  8. tcp4       0      0  *.imaps                *.*                    LISTEN
  9. tcp4       0      0  *.pop3s                *.*                    LISTEN
  10. tcp4       0      0  *.imap                 *.*                    LISTEN
  11. tcp4       0      0  *.pop3                 *.*                    LISTEN
  12. tcp4       0      0  *.smtp                 *.*                    LISTEN
  13. tcp4       0      0  *.ssh                  *.*                    LISTEN
  14. tcp6       0      0  *.ssh                  *.*                    LISTEN
复制代码
这里所看到的就是目前系统中所提供的服务。我们可以检视一下有没有不必要的服务,并将它移除。最明显的例子是 sendmail,如果我们的系统不提供邮件处理,就将它停掉吧。即使我们要提供邮件服务,也应该限制寄信者的身份或来源地址。一台没有设限的邮件服务器,最后的结果是恶名昭彰,再也没有机器会愿意转送我们发送的信件。如果我们要停止 sendmail,只要在 /etc/rc.conf 中加入下面这一行:
  1. sendmail_enable="NONE"
复制代码
我们可以使用 sysctl 来设定当外部机器要使用我们没有提供的服务时便记录下来,例如有人尝试扫我们的 port,或者我们没有开放 telnet,却有人尝试从 port 23 连接,在 /var/log/messages 中便会留下记录。这个设定只要执行下列指令:
  1. # sysctl -w net.inet.tcp.log_in_vain=1
  2. # sysctl -w net.inet.udp.log_in_vain=1
复制代码
如果要在开机时就启动这个设定,可以将上面二行指令加到 /etc/rc.local 或是在 /etc/sysctl.conf 中加入下面二行:
  1. net.inet.tcp.log_in_vain=1
  2. net.inet.udp.log_in_vain=1
复制代码
另外,FreeBSD 自从 4.4-Release 起,预设将 telnet 及 ftp 的服务也停止了。原因除了 telnet 本身有漏洞外(己修补),就是这些以明码方式在网络上传送使者账号及密码的服务其实是系统安全的另一个潜在危险。我们可以检视一下 /etc/inetd.conf,发现每一行前面都有批注符号 "#",也就是说目前根本没有任何经由 inetd 启动的服务,我们可以经由 /etc/rc.conf 加入下列这一行来停止 inetd 服务:
  1. inetd_enable="NO"
复制代码
如果我们必须使用远程登入来管理系统,不要使用 telnet,请使用 ssh。ssh 对于在网络上流动的数据有加密保护,比起 telnet 安全多了。如果真的有必要使用 inetd 来启动某些服务,例如 ftp,建议将使用情形记录下来 。

FreeBSD 安装后,预设会将所有登入成功及失败的记录都写在 /var/log/xferlog 中。因为我们在 /etc/syslog.conf 有下列这一行:
  1. ftp.info                                     /var/log/xferlog
复制代码
如果您使用的是 FreeBSD 之 4.x 版,您可能要自行编辑 /etc/syslog.conf 并在该档案的最后加入下面这二行:
  1. !ftpd
  2. *.*                                /var/log/xferlog
复制代码
这个设定会让所有登入成功及失败的记录都写在 /var/log/xferlog 这个档案中,我们必需先手动建立 xferlog 这个档案:
  1. # touch /var/log/xferlog
复制代码
因为我们已经修改了 /etc/syslog.conf ,所以必须重新启动 syslogd。syslogd 是 FreeBSD 专门记录系统信息的 daemon,您可以使用下列指令重跑 syslogd:
  1. # kill -1 `cat /var/run/syslog.pid`
复制代码
由于每次使用 ftp 的情形都会被记录下来,为了避免 log 档肥大,我们在 newsyslog.conf 中加入 ftpd.log 的备份移转:
  1. /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 中加入以下的设定:
  1. icmp_drop_redirect="YES"  # YES 表示丢弃 ICMP REDIRECT 封包
  2. icmp_log_redirect="YES"    # YES 表示将丢弃的封包记录下来
复制代码
7.4.2 使用 ssh

ssh 是一个好用的软件,FreeBSD 安装预设启动 sshd。我们可以检查一下它是否己启动:
  1. # netstat -a | grep ssh
复制代码
如果没有,请在 /etc/rc.conf 中加入下面这一行:
  1. sshd_enable="YES"
复制代码
sshd 预设并未将使用者登入的数据记录下来,不过我们可以修改 /etc/syslog.conf 来记录,请找到 security 的项目,并将它修改成下面这样:
  1. security.*;auth.info                /var/log/security
复制代码
如此一来,当使用者利用 ssh 登入时,便会记录在 /var/log/security 中。

我们知道 ssh 类似一个加密的 telnet,使用 ssh 以取代 telnet 是一定要的。然而 ssh 还有一个比较少人知道的功能,就是提供加密的 ftp 联机,称为 sftp。

当您启动 ssh 时,预设就已经有提供 sftp 的功能。如果您要在 FreeBSD 中使用 sftp 连到另一台开于 ssh 的机器,可以使用下列指令:
  1. # sftp alex@192.168.0.1
复制代码
接下来的所有操作就好像一般的 ftp client 一样,您可以任意上传下载档案,而且都是以加密传输喔。如果您要在 Windows 中使用 sftp,您可以下载 Filezilla (http://filezilla.sourceforge.net/)。

7.4.3 TCP Wrapper

对于 inetd 所提供的服务,我们可以使用 TCP Wrapper 来限制 TCP 协议联机来源。让我们来检视一下 /etc/hosts.allow 这个档案:
  1. ALL : ALL : allow

  2. ftpd : localhost : allow
  3. ftpd : .nice.guy.example.com : allow
  4. ftpd : .evil.cracker.example.com : deny
  5. ftpd : ALL : allow
复制代码
语法:
  1. 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 服务,我们可以这样设定:
  1. ftpd : bad.cracker.com : deny
  2. ftpd : ALL : allow
复制代码
又如,假设我们的 telnet 只要让 192.168.0.1 及 mydomain.com 网域下的计算机可以使用:
  1. telnetd : 192.168.0.1 .mydomain.com : allow
  2. telnetd : ALL : deny
复制代码
TCP Wrapped 只针对 TCP 服务,如果我们要功能更强大的防火墙,可以使用 ipfw。

7.4.4 ipfw

ipfw 是 FreeBSD 内附的防火墙软件,它直接针对 IP Layer 来做网络控制,因此可以说是最有效的方法。在使用 ipfw 之前,我们必须先重编核心。关于防火墙的设定,请参考「NAT 及防火墙」一章的说明。

7.5 漏洞修补

FreeBSD 总部会不定期公布己知的安全漏洞,并提供修补方式,我们必须时常到 FreeBSD 的网站注意关于安全性的消息,该网站的位置是 http://www.freebsd.org/security/index.html

连到上述页面后,我们可以看到在 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
<URL:http://www.freebsd.org/security/>.



这里的信息包含了主旨 (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 ftp://ftp.FreeBSD.org/pub/FreeBS ... A-05:17/devfs.patch
# fetch ftp://ftp.FreeBSD.org/pub/FreeBS ... :17/devfs.patch.asc

b) Apply the patch.

# cd /usr/src
# patch < /path/to/patch

c) Recompile your kernel as described in
<URL:http://www.freebsd.org/handbook/kernelconfig.html> and reboot the
system.


我们可以选择下列二种方式其中之一来进行修补,第一种方式是将您的 FreeBSD 升级至 5-STABLE、RELENG_5_4、或 RELENG_5_3。第二种方式是我们最常用的方法,也就是下载修补的原始码。通常我们必须依照所使用的 FreeBSD 系统来下载不同版本所使用的补丁。上述范例中,其修补文件分别供 FreeBSD 5.3 及 5.4 使用。

我们以 FreeBSD 5.4 为例,首先,我们必须下载更新档,请使用下列指令下载:
  1. # cd /usr/src
  2. # fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-05:17/devfs.patch
复制代码
我们将档案下载到 /usr/src 目录下,这个档案是修补的档案,而 devfs.patch.asc 是用来检查 pgp 签名的签名档,如果您不使用 pgp 检查所下载的档案是否正确,您可以忽略这个档案。

我们所下载的 patch 档是将漏洞修补前及修补后的原始码差异存成一个档案,接下来我们必须将这个差异和我们系统中的原始码合并。因此,我们系统中一定要安装 FreeBSD 的原始码,也就是 /usr/src 这个目录下有原始码的数据,如果您在安装 FreeBSD 时并未安装原始码,您可以使用 sysinstall 来安装原始码套件。接下来我们就可以将所下载的档案合并到系统中:
  1. # cd /usr/src
  2. # patch < /usr/src/devfs.patch
复制代码
最后,依照这个修补档的说明,我们必须重新编译系统核心,请参考「编译核心」一章,并于安装新核心之后重新开机即可。并非所有修补都必须重新编译系统核心,有的修补可能要重新编译其它非核心程序,甚至整个系统,我们必须按照 Solution 的说明执行适当的步骤。

小提示

常常进行漏洞修补是系统管理者一定一定一定要做的事。所以您一定要常常上 FreeBSD 网站看是否有新的 patch 喔。
回复 支持 反对

使用道具 举报

91

主题

984

帖子

6920

金币

大家网研究生一年级

Rank: 18Rank: 18

积分
4066
 楼主| 发表于 2009-6-19 08:48 | 显示全部楼层
第八章 编译核心


核心 (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 外,您也可以先将本书所附第一张光盘放入光驱中,并使用下列指令来安装:
  1. # mount /cdrom
  2. # mkdir -p /usr/src/sys
  3. # ln -s /usr/src/sys /sys
  4. # cat /cdrom/6.0-RELEASE/src/ssys.[a-d]* | tar -xzvf -
复制代码
有了核心的原始码后,我们就可以开始进行修改。首先,我们要做的就是将 GENERIC 复制一份,并修改复制的那一份。
  1. # cd /usr/src/sys/i386/conf
  2. # cp GENERIC MYKERNEL
复制代码
上面那一行指令就是把 GENERIC 复制一份叫做 MYKERNEL,新的 KERNEL 要叫什么名字你可以自己取一个比较有意义的名字。建议您不要将自己所修改的核心设定放在 /usr/src/sys/i386/conf 目录下,有时候我们可能会因为硬盘空间不足而删除 /usr/src 这个目录,或者日后进行升级时忘了备份我们编辑过的核心设定档。所以建议您将 GENERIC 复制到其它目录下,再建立一个 link 到 /usr/src/sys/i386/conf,如此一来,我们可以更方便的备份及保存设定。例如,我们可以将它复制到 /root 目录下:
  1. # cd /usr/src/sys/i386/conf
  2. # cp GENERIC /root/MYKERNEL
  3. # ln -s /root/MYKERNEL
复制代码
接着就要来修改 MYKERNEL 了,请使用文字处理软件打开 MYKERNEL 后,再依文件中的说明来修改,把不必要的项目移除。必须要注意的是,核心中有的参数是互相依赖的,也就是说某些参数的存在一定要有某一行的支持。现在使用指令 ee 来修改刚才复制的核心:
  1. # ee MYKERNEL
复制代码
在核心中,如果在一行的开头有"#"表示该行为批注,以下我们针对 GENERIC 核心中每一个参数的说明。

8.2.1 基本的设定
  1. machine        i386
复制代码
这一行是必备的,代表的是使用 i386 的计算器架构 (architecture),也就是 IBM 兼容个人计算机。FreeBSD 支持的硬件架构包含了 i386、pc98、alpha、sparc64 等。
  1. cpu        I486_CPU
  2. cpu        I586_CPU
  3. cpu        I686_CPU
复制代码
上面这四行指的是 CPU 的类型,最近的 CPU 都是 I686_CPU。有些 CPU 如 Cyrix 233Hz CPU 或 Pentume Pro 也都是 I686。我们可以在开机后使用 dmesg 指令或参考 /var/run/dmesg.boot 来看 CPU 类型,并移除不必要的类型。
  1. ident        GENERIC
复制代码
这个可以说是核心的名字,我们在开机时会看到这个字符串,建议将它修改成和您核心设定档同名,例如,MYKERNEL 或 WEBSERVER 等。
  1. 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 一般选项
  1. #makeoptions        DEBUG=-g
复制代码
这个参数是用来将核心编辑成除错模式。加了这个参数之后,核心会包含一些除错用的信息,除非您需要做核心开发或协助测试核心程序,否则不需要加入这个参数。除错模式的核心会比一般核心庞大许多,而且也会影响系统效能。
  1. options        SCHED_4BSD        # 4BSD scheduler
复制代码
这是传统的 FreeBSD 排程方式,它会被用来控制系统中所要执行的工作顺序。FreeBSD 5.x 之后加入新的排程方法,称之为 ULE。ULE 主要是为了 SMP 多颗 CPU 排程而设计,但您也可以用来做为一般排程使用。若您想试试 ULE 排程的功能,您可以将 SCHED_4BSD 改为 SCHED_ULE。
  1. options        MATH_EMULATE
复制代码
这个参数让 kernel 用软件的方式仿真浮点运算,如果你的 CPU 不含浮点运算器,你就必须打开此参数。486-DX 以上的 CPU 可以不需要这一行。不过 FreeBSD 所提供的一般浮点仿真器并不是十分精准,如果你没有浮点运算器却又需要最好的准确度,建议你把这一行改成 GPL_MATH_EMULATE 来使用 GNU 浮点模拟。因为 GNU 版权的关系,因此 FreeBSD 不以它来当作内定的仿真器。由于目前我们所使用的 CPU 都支持浮点运算,所以在 FreeBSD 5.x GENERAL kernel 预设并未加入这个参数。
  1. options        INET                #InterNETworking
  2. options        INET6                #IPv6 communications protocols
复制代码
上述这二行是因特网沟通协议,就算您不打算连上网络,至少必需保留第一个 INET 的设定,因为大多数的程序都会要求使用 lookback 网络 (就是自己的机器和自己的机器沟通)。INET6 指的是 IPv6 协议,如果您要使用 IPv6 则必需加入该参数。

8.2.3 各种档案系统的支持
  1. options        FFS                #Berkeley Fast Filesystem
  2. options        FFS_ROOT                #FFS usable as root device [请勿删除]
复制代码
这是最基本的档案系统支持,如果你是从硬盘开机的,你一定需要它。FreeBSD 5.x 已经不再需要 FFS_ROOT 这个选项了,所以如果您使用 5.x 并不会看到这一行。
  1. options        SOFTUPDATES        #Enable FFS soft updates support
复制代码
使用 soft update 可以加速对硬盘的在取速度,我们必须先再核心中加入对于 soft update 的支持,再针对不同的档案分割区启动此功能。您可以打指令 mount 来查看各个分割区是否已启动 soft update,如果没有,tunefs 这个指令来启动它。我们在安装 FreeBSD 时,预设除了根目录的分割区外,其它的磁盘分割区都会将此功能打开。
  1. options        UFS_ACL                #Support for access control lists
复制代码
FreeBSD 5.x 才加入这个选项,它是一种权限控制的功能,预设是开启的状态。一旦这个选项打开始,并开始使用档案系统之后,最好不要将它关闭,以避免奇怪的问题产生。
  1. options        UFS_DIRHASH        #Improve performance on big directories
复制代码
这个选项可以加快 FreeBSD 对于大型目录的处理速度,但将需要很大的内存空间。如果此核心是供大型服务器使用,加入这个参数可以有比较好的效能。
  1. options        MFS                #Memory Filesystem
  2. options        MD_ROOT                #MD is a potential root device
复制代码
内存映对档案系统 (Memory-mapped Filesystem)。基本上它容许我们将一块内存空间当做档案系统来使用,以达到快速存取暂存盘的功能。例如,我们可以分割出一个 MFS 供 /tmp 使用,因为许多程序会利用 /tmp 建立暂时档案,而 MFS 是将档案系统挂在内存中,对于数据的存取会快很多。不过 FreeBSD 5.x 后已经不再使用 MFS 而改由 md-backed 档案系统所取代。
  1. options        NFSCLIENT                #Network Filesystem Client
  2. options        NFSSERVER                #Network Filesystem Server
  3. options        NFS                        #Network Filesystem (4.x 才有)
  4. 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 模式,您可以将这些选项移除。
  1. options        MSDOSFS                #MSDOS Filesystem
复制代码
支持 MS-DOS 档案系统。除非你每次开机都要使用 MS-DOS 档案系统,否则您可以将它移除,系统会在你使用到 MSDOS 档案系统时自动加载核心模块。除此之外,你也可以使用 mtools来存取 DOS 的软盘,这并不需要有 MSDOS 档案系统的支持。
  1. options        CD9660                #ISO 9660 Filesystem
  2. 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 后预设已将它移除。
  1. options        PROCFS                #Process filesystem
复制代码
处理程序档案系统,它是将一些系统信息伪装成档案系统并挂入 /proc 目录下,让一些系统监控软件 (如 ps 这个指令) 可以从中得到执行中的处理程序的信息。在 FreeBSD 5.0 以后的版本预设不再使用 /proc,大多数的监控程序也都改成不必使用 /proc 来得到系统信息。如果您使用的是 FreeBSD 5.x 以后的版本,要使用 PROCFS 还必须加入下列这一个参数:
  1. options        PSEUDOFS                #Pseudo-filesystem framework
复制代码
这个参数只出现在 FreeBSD 5.x 后,FreeBSD 4.x 并无此参数。

8.2.4 软硬件兼容性设定
  1. options        COMPAT_43                #Compatible with BSD 4.3 [KEEP THIS!]
复制代码
这是为了要和 4.3 BSD 兼容所使用的参数,请不要将它移除,否则有些应用程序可能会出现奇怪的影响。
  1. options        COMPAT_FREEBSD4        #Compatible with FreeBSD4
  2. options        COMPAT_FREEBSD5        #Compatible with FreeBSD5
复制代码
FreeBSD 6.x 做了许多修改,为了兼容于 FreeBSD 4.x、5.x 的系统呼叫 (system call),建议您保参这个设定。
  1. options        SCSI_DELAY=5000        #Delay (in ms) before probing SCSI
复制代码
这个选项控制了开机时寻找 SCSI 设备时要延迟多久 (MILLISECONDS),预设是 5 秒。有的 SCSI 需要一段时间来进行被始化的动作,当使用 IDE 的硬盘开机时,我们可以忽略这一行。如果您是以 SCSI 硬盘开机,您可以把这一行的数字调小一点以加快开机的速度。当然,如果因此抓不到硬盘,您就必须再把这个值调高一点。
  1. options        UCONSOLE                #Allow users to grab the console
复制代码
允许使用者抓取console 所印出的讯息。这个选项对于 X window 使用者尤其有用。例如,我们可以使用 xterm -C 来模拟 console,以得到 talk、write (一种在 UNIX 网络聊天的功能) 所传来的讯息,或是任何从系统发出的讯息。不过 FreeBSD 5.x 后已不再需要这个选项。
  1. options        USERCONFIG                #boot -c editor
  2. options VISUAL_USERCONFIG        #visual boot -c editor
复制代码
这个选项可以让我们在开机时编辑开机选项。FreeBSD 5.x 后已不再支持这二个选项,而改用 device.hints,请 man device.hints。
  1. options        KTRACE                #ktrace(1) support
复制代码
允许使用核心除错追踪,通常只有对于核心开发者比较有用。
  1. options        SYSVSHM                #SYSV-style shared memory
复制代码
这个参数提供 System V 共享内存的支持。最常使用 SYSVSHM 的是 X Windows 的 XSHM 功能,有些图形化的程序用使用它来提高执行速度。如果你使用 X Windows 或是 BBS,你一定要打开此参数。
  1. options        SYSVMSG                #SYSV-style message queues
复制代码
提供 System V messages 的支持,虽然不常用到,但是它只占一点点 kernel 的空间。如果你架 bbs 站,这是一定要的啦。
  1. options        SYSVSEM                #SYSV-style semaphores
复制代码
提供 System V semaphores 的支持,虽然不常用到,但是它只占一点点 kernel 的空间。您可以使用 ipcs 这个指令来查看是否有应用程序使用 System V 的这些选项,例如 Postsgre SQL 就必须用到。
  1. options        P1003_1B                #Posix P1003_1B real-time extensions
  2. options        _KPOSIX_PRIORITY_SCHEDULING
复制代码
Real-time extensions added in the 1993 POSIX。有些程序 (如 star office) 会用到它。FreeBSD 5.x 后不再需要 P1003_1B 这个选项。
  1. options        ICMP_BANDLIM        #Rate limit bad replies
复制代码
这个选项限制 ICMP 封包错误回应所使用的频宽,它可以降低我们被阻断式攻击 (denial of service packet) 的危险。如果您使用 FreeBSD 4.x,建议您保留该选项。FreeBSD 5.x 后预设已将此功能打开,所以这个选项在 6.x 已经不需要了。
  1. # To make an SMP kernel, the next two are needed
  2. options        SMP                # Symmetric MultiProcessor Kernel
  3. device        apic                # I/O APIC
复制代码
这二个选项可以使用多颗 CPU,FreeBSD 5.x 后对于多颗 CPU 的支持有更好的效率,如果您只使用单颗 CPU,可以将此选项关闭。

8.2.5 总线及软盘机
  1. device        isa
  2. device        eisa
  3. device        pci
复制代码
所有 FreeBSD 支持的硬件一定有上述其中之一的总线,isa 总线在现在的 i386 机器上已经很少见了。而 eisa 在 586 以后的主机板已经没见过了。pci 应该是目前的主流,只要您有 pci 适配卡就必须打开此选项。
  1. device        agp                # support several AGP chipsets
复制代码
这个选项是用来支持 AGP 适配卡,大多数的显示卡都是 AGP 接口。
  1. #FreeBSD 4.x
  2. device        fdc0 at isa? port IO_FD1 irq 6 drq 2
  3. device        fd0 at fdc0 drive 0
  4. device        fd1 at fdc0 drive 1
  5. # FreeBSD 5.x 以后
  6. device        fdc
复制代码
以上几个选项用以支持软盘机,在 FreeBSD 5.x 后只需要一个 fdc 即可。而使用 FreeBSD 4.x 时,如果您只有一个软盘机,您可以将 fd1 移除。

8.2.6 IDE 接口装置
  1. device        ata
复制代码
这是 ATA 及 ATAPI 的驱动程序,如果您有 ATA 硬盘或光驱,一定要打开这个选项。如果要支持以下任何 IDE 接口装置都必须将这个选项打开。
  1. device        atadisk                # ATA disk drives
  2. device        ataraid                # ATA RAID drives
  3. device        atapicd                # ATAPI CDROM drives
  4. device        atapifd                # ATAPI floppy drives
  5. device        atapist                # ATAPI tape drives
复制代码
以上装置分别是 ATA 硬盘、ATA 磁盘阵列装置、IDE 光驱、IDE 软盘机、及 IDE 磁带机。您可以将不必要的装置移除,例如 IDE 软盘机等。
  1. options        ATA_STATIC_ID        #Static device numbering
复制代码
这个选项用来将 ATA 控置单元设定为固定的控制编号,通常用在一些比较旧的设备上。

8.2.7 SCSI 装置
  1. device        ahb                # EISA AHA1742 family
  2. device        ahc                # AHA2940 and onboard AIC7xxx devices
  3. device        ahd                # AHA39320/29320 and onboard AIC79xx devices
  4. device        amd                # AMD 53C974 (Tekram DC-390(T))
  5. device        isp                # Qlogic family
  6. device        mpt                # LSI-Logic MPT-Fusion
  7. #device        ncr                # NCR/Symbios Logic
  8. device        sym                # NCR/Symbios Logic (newer chipsets + those of `ncr')
  9. device        trm                # Tekram DC395U/UW/F DC315U adapters

  10. device        adv                # Advansys SCSI adapters
  11. device        adw                # Advansys wide SCSI adapters
  12. device        aha                # Adaptec 154x SCSI adapters
  13. device        aic                # Adaptec 15[012]x SCSI adapters, AIC-6[23]60.
  14. device        bt                # Buslogic/Mylex MultiMaster SCSI adapters

  15. device        ncv                # NCR 53C500
  16. device        nsp                # Workbit Ninja SCSI-3
  17. device        stg                # TMC 18C30/18C50
复制代码
以上这些项目都是 SCSI 适配卡的驱动程序,如果您有 SCSI 适配卡,您可以使用 dmesg 去查看您的适配卡型号,并留下所需的驱动程序即可。如果您只有 IDE 设备,您可以将所有项目移除。
  1. device        scbus # SCSI bus (required for SCSI)
  2. device        ch                # SCSI media changers
  3. device        da                # Direct Access (disks)
  4. device        sa                # Sequential Access (tape etc)
  5. device        cd                # CD
  6. device        pass                # Passthrough device (direct SCSI access)
  7. device        ses                # SCSI Environmental Services (and SAF-TE)
复制代码
这些是 SCSI 接口的设备,如果您有任何 SCSI 接口的设备或是 USB 硬盘、大姆哥,一定要保留 scbus 这个 SCSI 总线的选项。ch 是 SCSI media changer (一种备份用的设备)。如果您有 SCSI 硬盘或是 USB 硬盘,请保留 da 这个选项。而 sa 及 cd 分别是 SCSI 磁带机及光驱。
  1. # RAID controllers interfaced to the SCSI subsystem
  2. device        amr                # AMI MegaRAID
  3. device        asr                # DPT SmartRAID V, VI and Adaptec SCSI RAID
  4. device        ciss                # Compaq Smart RAID 5*
  5. device        dpt                # DPT Smartcache III, IV - See NOTES for options
  6. device        iir                # Intel Integrated RAID
  7. device        ips                # IBM (Adaptec) ServeRAID
  8. device        mly                # Mylex AcceleRAID/eXtremeRAID
  9. device        twa                # 3ware 9000 series PATA/SATA RAID


  10. # RAID controllers
  11. device        aac                # Adaptec FSA RAID
  12. device        aacp                # SCSI passthrough for aac (requires CAM)
  13. device        ida                # Compaq Smart RAID
  14. device        mlx                # Mylex DAC960 family
  15. device        pst                # Promise Supertrak SX6000
  16. device        twe                # 3ware ATA RAID
复制代码
以上是磁盘阵列装置,如果您没有任何磁盘阵列,可以将它们全部移除。

8.2.8 基本外围设备
  1. # atkbdc0 controls both the keyboard and the PS/2 mouse
  2. device        atkbdc                # AT keyboard controller
  3. device        atkbd                # AT keyboard
  4. device        psm                # PS/2 mouse
复制代码
atkbdc 这个选项用来控制键盘及鼠标。而 atkbd 及 psm 分别为 AT 键盘及 PS/2 鼠标的驱动程序。
  1. device        vga                # VGA video card driver
复制代码
这是显示卡的驱动程序。
  1. # FreeBSD 4.x
  2. pseudo-device        splash
  3. # FreeBSD 5.x 以后的版本
  4. device        splash                # Splash screen and screen saver support
复制代码
启动时更新屏幕,屏幕保护程序会使用到它。FreeBSD 4.x 及 5.x 后所使用的选项不太一样喔。
  1. # syscons is the default console driver, resembling an SCO console
  2. # FreeBSD 4.x
  3. device        sc0 at isa? flags 0x100
  4. # FreeBSD 5.x 以后的版本
  5. device        sc
复制代码
这是预设的 console 驱动程序,如果有屏幕一定要保留这个选项。
  1. # Enable this for the pcvt (VT220 compatible) console driver
  2. #device                vt
  3. #options         XSERVER                # support for X server on a
  4.                         # vt console
  5. #options         FAT_CURSOR        # start with block cursor
复制代码
支持 vt 200 及 vt100 等兼容终端机。
  1. # Floating point support - do not disable.
  2. device        npx
复制代码
这是支持 FreeBSD 浮点运算,请勿移除。
  1. device        agp
复制代码
这是用来支持 AGP 显示卡的驱动程序。
  1. # Power management support (see NOTES for more options)
  2. # FreeBSD 4.x
  3. device        apm0        at nexus? disable flags 0x20
  4. # FreeBSD 5.x 以后的版本
  5. #device        apm
复制代码
支持 APM 电源管理,在 FreeBSD 4.x 下,如果您想要在打指令 shutdown -p 时能自动关机,请将 disable 字样移除。FreeBSD 5.x 后请将 apm 该行的井字号移除。接着必须在 /etc/rc.conf 中加入下列二行:
  1. apm_enable="YES"
  2. apmd_enable="YES"



  3. # Add suspend/resume support for the i8254.
  4. device        pmtimer
复制代码
这是用来支持 i82454 休眠待命模式。
  1. # PCCARD (PCMCIA) support
  2. # FreeBSD 4.x
  3. device        card
  4. device        pcic0        at isa? irq 0 port 0x3e0 iomem 0xd0000
  5. device        pcic1        at isa? irq 0 port 0x3e2 iomem 0xd4000 disable

  6. # FreeBSD 5.x 以后的版本
  7. # Pcmcia and cardbus bridge support
  8. device        cbb                # cardbus (yenta) bridge
  9. device        pccard                # PC Card (16-bit) bus
  10. device        cardbus                # CardBus (32-bit) bus
复制代码
这些是 PCMCIA 适配卡的驱动程序,如果您使用的是笔记型计算机,请保留这些项目。FreeBSD 5.x 后支持 32 bit 的 PCMCIA 接口,但 FreeBSD 4.x 不支援喔。
  1. # Serial (COM) ports
  2. # FreeBSD 4.x
  3. device        sio0        at isa? port IO_COM1 flags 0x10 irq 4
  4. device        sio1        at isa? port IO_COM2 irq 3
  5. device        sio2        at isa? disable port IO_COM3 irq 5
  6. device        sio3        at isa? disable port IO_COM4 irq 9
  7. # FreeBSD 5.x 以后的版本
  8. 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。
  1. # Parallel port
  2. device        ppc
  3. device        ppbus                # Parallel port bus (required)
  4. device        lpt                # Printer
  5. device        plip                # TCP/IP over parallel
  6. device        ppi                # Parallel port interface device
  7. #device        vpo                # Requires scbus and da
复制代码
这些是并列端口及其它并列端口装置 (如列表机) 的驱动程序。

8.2.9 网络卡设定
  1. device        de                # DEC/Intel DC21x4x (``Tulip'')
  2. device        em                # Intel PRO/1000 adapter Gigabit
  3. device        ixgb                # Intel PRO/10GbE Ethernet Card
  4. device        txp                # 3Com 3cR990 (``Typhoon'')
  5. device        vx                # 3Com 3c590, 3c595 (``Vortex'')
复制代码
这些是网络卡的驱动程序,您可以使用 dmesg 去查看自己的网络卡型号,并保留所需要的型号设定即可。
  1. # PCI Ethernet NICs that use the common MII bus controller code.
  2. # NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
  3. device        miibus                # MII bus support
复制代码
如果您使用的是下列这些 PCI 10/100 的网络卡,请保留 MII bus 这个选项。
  1. device        bfe                # Broadcom BCM440x 10/100 ethernet
  2. device        bge                # Broadcom BCM570xx Gigabit Ethernet
  3. device        dc                # DEC/Intel 21143 and various workalikes
  4. device        fxp                # Intel EtherExpress PRO/100B (82557, 82558)
  5. device        lge                # Level 1 LXT1001 gigabit ethernet
  6. device        nge                # NatSemi DP83820 gigabit ethernet
  7. device        pcn                # AMD Am79C97x PCI 10/100 (precedence over 'lnc')
  8. device        re                # RealTek 8139C+/8169/8169S/8110S
  9. device        rl                # RealTek 8129/8139
  10. device        sf                # Adaptec AIC-6915 (``Starfire'')
  11. device        sis                # Silicon Integrated Systems SiS 900/SiS 7016
  12. device        sk                # SysKonnect SK-984x and SK-982x gigabit ethernet
  13. device        ste                # Sundance ST201 (D-Link DFE-550TX)
  14. device        ti                # Alteon Networks Tigon I/II gigabit ethernet
  15. device        tl                # Texas Instruments ThunderLAN
  16. device        tx                # SMC EtherPower II (83c170 ``EPIC'')
  17. device        vge                # VIA VT612x gigabit ethernet
  18. device        vr                # VIA Rhine, Rhine II
  19. device        wb                # Winbond W89C840F
  20. device        xl                # 3Com 3c90x (``Boomerang'', ``Cyclone'')
复制代码
上列为 PCI 的网络卡,请使用 dmesg 查看您的网络卡型号,并保留所需的型号即可。请注意上列网络卡都必须要有 MII bus 的支持。
  1. # ISA Ethernet NICs.  pccard nics included.
  2. device        cs                # Crystal Semiconductor CS89x0 NIC
  3. # 'device ed' requires 'device miibus'
  4. device        ed                # NE[12]000, SMC Ultra, 3c503, DS8390 cards
  5. device        ex                # Intel EtherExpress Pro/10 and Pro/10+
  6. device        ep                # Etherlink III based cards
  7. device        fe                # Fujitsu MB8696x based cards
  8. device        ie                # EtherExpress 8/16, 3C507, StarLAN 10 etc.
  9. device        lnc                # NE2100, NE32-VL Lance Ethernet cards
  10. device        sn                # SMC's 9000 series of ethernet chips
  11. device        xe                # Xircom pccard ethernet
  12. # ISA devices that use the old ISA shims
  13. #device        le
复制代码
ISA接口的网络卡。如果很不幸的你的网络卡是 ISA 接口,建议你换成 PCI 的适配卡,否则你应该要先知道你使用的 irq 及 port。如果你的型号是 ed0 ,则请勿移除上述的 miibus。
  1. # Wireless NIC cards
  2. device        wlan                # 802.11 support
  3. device        an                # Aironet 4500/4800 802.11 wireless NICs.
  4. device        awi                # BayStack 660 and others
  5. device        ral                # Ralink Technology RT2500 wireless NICs.
  6. device        wi                # WaveLAN/Intersil/Symbol 802.11 wireless NICs.
  7. #device        wl                # Older non 802.11 Wavelan wireless NIC.
复制代码
这些是无线网络卡。

8.2.10 虚拟装置
  1. device random # Entropy device
  2. # FreeBSD 4.x
  3. pseudo-device        loop        # Network loopback
  4. # FreeBSD 5.x 以后的版本
  5. device        loop                # Network loopback
复制代码
这二个虚拟的装置分别用来做随机运算及 loopback 网络,请保留这二个选项。
  1. device        mem                # Memory and kernel memory devices
复制代码
这是系统的内存装置。
  1. device        io                # I/O device
复制代码
这是支持 user space 程序直接存取系统 I/O,X Windows 需要这个项目。
  1. device        radom                # Entropy device
复制代码
这是用来产生随机密码数字之类的装置。
  1. # FreeBSD 4.x
  2. pseudo-device        ether        # Ethernet support
  3. # FreeBSD 5.x 以后的版本
  4. device        ether                # Ethernet support
复制代码
这是用来支持以太网络,只要您有网络卡都必须保留这个项目。
  1. # FreeBSD 4.x
  2. pseudo-device        sl 1
  3. # FreeBSD 5.x 以后的版本
  4. device        sl                # Kernel SLIP
复制代码
sl 用以支持 SLIP,SLIP已经几乎被 PPP 所取代,ppp 可以更简单、快速的建立 modem-to-modem 联机。在 sl 后面的数字是要仿真多少条 SLIP。
  1. # FreeBSD 4.x
  2. pseudo-device        ppp 1        # Kernel PPP
  3. # FreeBSD 5.x 以后的版本
  4. device        ppp                # Kernel PPP
复制代码
支持 ppp 拨接连线。
  1. # FreeBSD 4.x
  2. pseudo-device        tun        # Packet tunnel.
  3. # FreeBSD 5.x 以后的版本
  4. device        tun                # Packet tunnel.
复制代码
tun 会被 ppp 所使用,如果您有拨接网络 (含 ADSL 拨号) 一定要保留这个选项。
  1. # FreeBSD 4.x
  2. pseudo-device        pty        # Pseudo-ttys (telnet etc)
  3. # FreeBSD 5.x 以后的版本
  4. device        pty                # Pseudo-ttys (telnet etc)
复制代码
最大的 ttys,如 telnet 同时上线最大人数,在 FreeBSD 4.x 预设是 16。你可以在 pty 的后面加上数字来提高人数,最大是 256。FreeBSD 5.x 后则毋需担心这个问题。
  1. # FreeBSD 4.x
  2. pseudo-device        md        # Memory "disks"
  3. # FreeBSD 5.x 以后的版本
  4. device        md                # Memory "disks"
复制代码
用来支持虚拟的 Memory disk,这是一种将某块内存拿来当成磁盘驱动器使用的虚拟装置。
  1. # FreeBSD 4.x
  2. pseudo-device        gif        # IPv6 and IPv4 tunneling
  3. # FreeBSD 5.x 以后的版本
  4. device        gif                # IPv6 and IPv4 tunneling
复制代码
支持 IPv6 和 IPv4 之间的沟通。
  1. # FreeBSD 4.x
  2. pseudo-device        faith 1        # IPv6-to-IPv4 relaying (translation)
  3. # FreeBSD 5.x 以后的版本
  4. device        faith                # IPv6-to-IPv4 relaying (translation)
复制代码
用以支持 IPv6 和 IPv4 之间的转换。
  1. # The `bpf' device enables the Berkeley Packet Filter.
  2. # Be aware of the administrative consequences of enabling this!
  3. # FreeBSD 4.x
  4. pseudo-device        bpf        # Berkeley packet filter
  5. # FreeBSD 5.x 以后的版本
复制代码
device        bpf                # Berkeley packet filter

这是 Berkeley Packet Filter,可以让我们的网络卡支持 promiscuous mode,一些网络监控程序会需要使用这个装置,例如 tcpdump、ethereal 等。

8.2.11 USB 装置
  1. device        uhci                # UHCI PCI->USB interface
  2. device        ohci                # OHCI PCI->USB interface
  3. device        ehci                # EHCI PCI->USB interface (USB 2.0)
  4. device        usb                # USB Bus (required)
  5. #device        udbp                # USB Double Bulk Pipe devices
  6. device        ugen                # Generic
  7. device        uhid                # "Human Interface Devices"
  8. device        ukbd                # Keyboard
  9. device        ulpt                # Printer
  10. device        umass                # Disks/Mass storage - Requires scbus and da
  11. device        ums                # Mouse
  12. device        ural                # Ralink Technology RT2500USB wireless NICs
  13. device        urio                # Diamond Rio 500 MP3 player
  14. device        uscanner        # Scanners
复制代码
以上为 USB 装置的驱动程序,请参考井字号之后的批注。如果您要使用 USB 2.0 的装置,请记得将 ehci 装置前面的井号移除。
  1. # USB Ethernet, requires mii
  2. device        aue                # ADMtek USB ethernet
  3. device        axe                # ASIX Electronics USB ethernet
  4. device        cdce                # Generic USB over Ethernet
  5. device        cue                # CATC USB Ethernet
  6. device        kue                # Kawasaki LSI USB Ethernet
  7. device        rue                # RealTek RTL8150 USB Ethernett
复制代码
这些是 USB 接口的网络卡,如果您要支持任何一种,都必须将 miisub 的选项打开。

小提示

看了这么多项目头都晕了。如果您不知道怎么修改,我的建议是:

   1. 移除不必要的网络卡驱动程序。
   2. 移除不必要的 SCSI 装置。但不要移除 scbus、ch、da 等项目。
   3. 移除不必要的 IDE 装置,如 IDE 软盘。
   4. 如果您不使用 USB,也可以将 USB 装置移除。


8.3 编译与安装

8.3.1 编译新的核心

修改完核心之后,记得要先存盘,接着可以开始编译了。编译核心有二种方式,大部份的时候,我们可以任意使用这二种方法其中之一,使用第二种方式所需要的时间稍微长一点,以下是一些参考的法则:
  • 如果您并未安装完整的 FreeBSD 原始码,只有安装 /usr/src/sys 这个目录,则只能使用方式一。
  • 如果您使用的是 FreeBSD 4.0 以前的版本,只能使用方式一。
  • 如果我们只是在核心设定档中加了几个选项,例如只是加了新的网络卡或是加上防火墙的设定,则只需使用方式一即可。

FreeBSD 支持一种名为 CVSup 更新所有原始码的方式,更新完原始码后,要执行 make world 来重新编译所有程序,这时候就要使用方式二。

方式一:

第一种是使用传统的编译方式,以下范例所使用的核心设定档名为 MYKERNEL,请改成您所使用的档名。首先我们先使用 config 这个指令会依照我们所修改的设定档成出编译核心所需要的档案。
  1. # cd /usr/src/sys/i386/conf
  2. # config MYKERNEL
复制代码
config 这个指令会产生一个编译所使用的目录,如果您在执行 config 后发现错误讯息,请检查您所修改的档案是否有问题,例如语法错误等。

小提示

如果您想要知道您修改过什么,可以使用下列指令来看二个档案的差异:
  1. # diff -ub GENERIC MYKERNEL
复制代码
这样一来,您就可以看看是改了什么东西造成错误的发生,不错吧!


接下来就要到编译用的目录下。FreeBSD 5.0 以前的目录和 5.x 后的目录不一样哦:
  1. FreeBSD 4.x:

  2. # cd ../../compile/MYKERNEL/

  3. FreeBSD 5.x 以后:

  4. # cd ../compile/MYKERNEL/
复制代码
接下来就可以开始进行编译了:
  1. # make depend
  2. # make
复制代码
上面的指令完成后,应该就完成了核心的编译。如果在过程中出现错误的讯息,注意一下错误是什么,并再次修改核心设定档。一般常见的错误可能是某一个设备的设定需要另一个设定,例如网络卡驱动程序要求 miibus,而却将它移除了。

完成了上述的步骤确定没问题时,就要安装新的核心了。使用下列指令加以安装:
  1. # make install
复制代码
完成安装后,我们就可以移除编译过程所产生的档案了:

如果是 FreeBSD 4.x:
  1. # cd / ; rm -rf /usr/src/sys/compile/MYKERNEL
复制代码
如果是 FreeBSD 5.x 以后:
  1. # cd / ; rm -rf /usr/src/sys/i386/compile/MYKERNEL
复制代码
方式二:

在 FreeBSD 4.2-STABLE 2001年2月以后的版本,我们可以使用新的方式来编译及安装新的核心:
  1. # cd /usr/src
  2. # make buildkernel KERNCONF=MYKERNEL
  3. # make installkernel KERNCONF=MYKERNEL
复制代码
安装完成后,将编译过程中使用的档案删除:
  1. # rm -rf /usr/obj/usr/src/sys/MYKERNEL
复制代码
最后我们就可以重新开机了,在重新开机之前,我们多下了几个 sync 这个指令。这个指令的用意是要求系统将所有暂存在内存内的数据都写入硬盘。
  1. # sync;sync;sync;reboot
复制代码
8.3.2 新的核心有问题

万一很不幸的,你发现编完核心后,无法开机进入 FreeBSD,这时候就要使用旧的核心来开机了。

如果是 FreeBSD 4.x,请在开机时看到倒数计时的时候,按 Enter 以外的键,会出现 boot: 这时候就先打 unload 来将已加载的数据移除,再打 /kernel.old 以使用旧的核心。
  1. boot: unload
  2. boot: /kernel.old
复制代码
万一连旧的核心也无法使用时,就使用安装时的核心。
  1. boot: /kernel.GENERIC
复制代码
如果您使用的是 FreeBSD 5.x 以后,请在看到开机选单时按 6 以进入 loader 模式,并输入下列指令以使用旧的 kernel 开机:

OK unload
OK boot /boot/kernel.old


在 FreeBSD 4.x 下,如果你想要删除坏的核心,由于 kernel 文件有特殊的档案属性,因此必须先使用下列指令修改属性,之后才可以删除。
  1. # chflags noschg /kernel
  2. # rm -rf /kernel
复制代码
值得注意的是FreeBSD 5.x 后的 kernel 放在 /boot/kernel 目录下,而旧的核心在 /boot/kernel.old。

小提示

如果您一直卡在 compile kernel 无法成功,不要气馁,其实使用 GENERIC kernel 也没什么不好。您可以先将时间花在系统其它的设定上,等有时间再回来研究,这样比较不会因为一点小问题拖延您学习的时间。
回复 支持 反对

使用道具 举报

1

主题

3

帖子

13

金币

大家网幼儿园

Rank: 1

积分
8
发表于 2010-12-7 08:56 | 显示全部楼层
非常不错.谢谢了.
回复 支持 反对

使用道具 举报

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

本版积分规则



诚聘英才|移动端|Archiver|版权声明|大家论坛 ( 京ICP备06071611号,京公网安备11010802018363号 )

GMT+8, 2020-10-26 15:19 , Processed in 0.122939 second(s), 7 queries , Redis On.

Powered by Discuz!

© Comsenz Inc.

快速回复 返回顶部 返回列表