twbsd.org
 
  Select Language: Home  SmbFTPD Forum 

书籍数据

ch00 序.htm

ch01 FreeBSD 简介.htm

ch02 安装 FreeBSD.htm

ch03 UNIX 系统入门.htm

ch04 使用者管理.htm

ch05 网络设定.htm

ch06 档案系统管理.htm

ch07 系统安全.htm

ch08 编译核心.htm

ch09 系统调校.htm

ch10 软件安装.htm

ch11 X Window 的使用.htm

ch12 NAT 及防火墙.htm

ch13 网页服务器.htm

ch14 网页服务器进阶应用.htm

ch15 FTP 服务器.htm

ch16 邮件服务器.htm

ch17 邮件服务器进阶应用.htm

ch18 DHCP服务器.htm

ch19 数据库系统.htm

ch20 Samba 网络芳邻.htm

ch21 NFS.htm

ch22 DNS 服务器.htm

ch23 指令应用.htm

ch24 Shell Script.htm

cha1 附录A etc目录下的档案介绍.htm

cha2 附录B 制作 FreeBSD 安装光盘.htm

cha3 附录C 版权宣告.htm

 


View printable page

第六章 档案系统管理

第六章 档案系统管理

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

本章读完后,您将可以了解下列基本的档案系统管理知识:

  • 如何得知目前档案系统的使用情形。
  • 如何挂入与卸载档案系统。
  • 如何使用 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,代号 s1s2 指的就是主要扇区 slice 1 及 slice 2。而在 ad0s2 这个主要扇区中,我们又细分为三个分割区,分别是 ad0s2aad0s2bad0s2d

分割区代号 a、b、d 等在 FreeBSD 有一些规则:

  • a:代号 a 通常会分配给根目录使用。
  • b:代号 b 通常是给 swap 空间使用。
  • c:代号 c 通常是代表整个主要扇区,所以不会被拿来使用。
  • defgh:其它的代号都是可以被用在任何分割区上。以前代号 d 有一些特别用意,不过现在已经没有了。

所以当您看到一个分割区代号 ad0s1a 时,就可以知道它是第一个 IDE 硬盘 (ad0) 的第一个主要扇区 (ad0s1) 的第一个分割区 (ad0s1a)。

让我们回到硬盘分割区和目录之间的关系。在 FreeBSD 中,硬盘分割区会被挂在目录下使用,例如下列的 df 指令输出结果:

# df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ad0s1a    1.9G    389M    1.4G    21%    /
devfs          1.0K    1.0K      0B   100%    /dev
/dev/ad0s1d    989M     54K    910M     0%    /var
/dev/ad0s1e    4.8G    3.8G    657M    86%    /usr
/dev/ad1s1d    10.9G   149M   10.6G     1%    /usr/local

我们可以看到分割区 ad0s1a 是挂在根目录 (/) 下,而 ad0s1d 挂在 /var 中。上述 df 指令输出的范例中,//dev/var/usr 等都是磁盘分割区的挂入点 (mount points)。下图即为分割区示意图:

图 6-2

除了根目录外,每一个挂入点都可以被卸载。例如 ad1s1d 被挂在 /usr/local 中,我们可以动态卸载它。/usr/local 在挂入磁盘分割区前,它可能空的或是已经有一些档案或目录,但挂入后,我们看到该目录中的东西会全部变成存在于 ad1s1d 这个硬盘中的数据。通常这些系统用的挂入点在还没挂入磁盘前都是一些空目录,而挂入后才会出现该目录下的其它档案及数据。以 /var 为例,在挂入前它是空的目录,而挂入后,才会出现 dbmail 等目录。

请注意,挂入点和磁盘分割区之间并没有什么特殊关联。例如,如果您有二个挂入点 /volume1/volume2,而有二个分割区 ad0s1dad0s1e,您可以任意将 ad0s1d 挂在 /volume1/volume2。以上图中的挂入点为例,您也可以将 ad1s1d 挂在 /mnt 下,只是 ad1s1d 这个分割区原本是挂在 /usr/local 下,已有一些 /usr/local 下的目录结构及数据,所以还是挂在 /usr/local 下才不会有系统档案找不到的问题。

6.2 监看档案系统使用情形

几乎所有 FreeBSD 上的应用都必须使用硬盘。我们必须注意系统磁盘空间足够,并了解磁盘的使用效率。本小节中,我们将介绍一些 FreeBSD 常用的磁盘管理指令,让我们可以更快的了解目前的系统使用状态。

6.2.1 磁盘空间使用情形

在大部份的 UNIX 系统中都有二个指令可以了解硬盘的使用情形:dfdu

指令 df 可以显示目前所有档案系统的最大可用空间及使用情形,请看下列这个例子:

# df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ad0s1a    1.9G    389M    1.4G    21%    /
devfs          1.0K    1.0K      0B   100%    /dev
/dev/ad0s1d    989M     54K    910M     0%    /tmp
/dev/ad0s1f    4.8G    3.8G    657M    86%    /usr
/dev/ad0s1e    1.9G    149M    1.6G     8%    /var
/dev/ad0s1g     26G    890K     24G     0%    /volume2
/dev/da0s1d    325G    261G     38G    87%    /volume1

我们加了参数 -h 表示使用「Human-readable」的输出,也就是在档案系统大小使用 GB、MB 等易读的格式。

上面的指令输出的第一个字段及最后一个字段分别是档案系统及其挂入点。我们可以看到 /dev/ad0s1a 这个分割区被挂在根目录下。我们在上一小节提到过 ad 所代表的是 IDE 的硬盘,而 s1 表示第一个主要扇区。我另外有一个 SCSI 硬盘,它的代号是 da,它的容量很大,主要用来存放数据。devfs 是一个特别的档案系统,该档案系统并非真的磁盘,而是 FreeBSD 用来管理系统硬件装置的虚拟档案系统。

接下来的四个字段 Size、Used、Avail、及 Capacity 分别是该分割区的容量、已使用的大小、剩下的大小、及使用的百分比。当硬盘容量已满时,您可能会看到已使用的百分比超过 100%,因为 FreeBSD 会留一些空间给 root,让 root 在档案系统满时,还是可以写东西到该档案系统中,以进行管理。

另外,我们还可以使用参数 -i 来查看目前档案系统 inode 的使用情形。有的时候虽然档案系统还有空间,但若没有足够的 inode 来存放档案的信息,一样会不能增加新的档案。

# df -ih
Filesystem     Size    Used   Avail Capacity iused    ifree %iused  Mounted on
/dev/ad0s1a    1.9G    389M    1.4G    21%   20495   262127    7%   /
devfs          1.0K    1.0K      0B   100%       0        0  100%   /dev
/dev/ad0s1d    989M     62K    910M     0%      24   141286    0%   /tmp
/dev/ad0s1f    4.8G    3.8G    657M    86%  311439   348015   47%   /usr
/dev/ad0s1e    1.9G    149M    1.6G     8%    1758   280864    1%   /var
/dev/ad0s1g     26G    890K     24G     0%      12  3532786    0%   /volume2
/dev/da0s1d    325G    261G     38G    87%  707277 43311409    2%   /volume1

我们可以看到根目录的已经用掉的 inode 数量为 20495,还有 262127 的可用 inode。

小提示

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

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

指令 du 能以指定的目录下的子目录为单位,显示每个目录内所有档案所占用的磁盘空间大小。例如:

# du -h /etc
104K	/etc/defaults
6.0K	/etc/X11
8.0K	/etc/bluetooth
4.0K	/etc/gnats
 52K	/etc/isdn
388K	/etc/mail
 68K	/etc/mtree
2.0K	/etc/ntp
 38K	/etc/pam.d
 44K	/etc/periodic/daily
6.0K	/etc/periodic/monthly
 42K	/etc/periodic/security
 16K	/etc/periodic/weekly
110K	/etc/periodic
6.0K	/etc/ppp
318K	/etc/rc.d
2.0K	/etc/skel
130K	/etc/ssh
 10K	/etc/ssl
1.7M	/etc

我们目样使用 -h 参数来显示 human-readable 的格式。在应用时,我们可以使用 du 这个指令来查看哪个目录占用最多的空间。不过,du 的输出结果通常很长,我们可以加上 -s 参数来省略指定目录下的子目录,而只显示该目录的总合即可:

# du -sh /etc
1.7M    /etc

在查看目录的使用情形时,我们可以将输出结果导到 sort 指令进行排序,以了解哪个档案用了最多的空间:

# du /etc | sort -nr | more
1746	/etc
388	/etc/mail
318	/etc/rc.d
130	/etc/ssh
110	/etc/periodic
104	/etc/defaults
68	/etc/mtree
52	/etc/isdn
44	/etc/periodic/daily
42	/etc/periodic/security
38	/etc/pam.d
16	/etc/periodic/weekly
10	/etc/ssl
8	/etc/bluetooth
6	/etc/ppp
6	/etc/periodic/monthly
6	/etc/X11
4	/etc/gnats
2	/etc/skel
2	/etc/ntp

sort 的参数 -nr 表示要以数字排序法进行反向排序,因为我们要对目录大小做排序,所以不可以使用 human-readable 的大小输出,不然目录大小中会有 K、M 等字样,会造成排序不正确。

6.2.2 磁盘使用效率

除了查看硬盘的空间使用情形外,我们还可以查看目前硬盘是否忙碌中,以了解硬盘的使用效率。我们可以使用 systat 这个指令:

# systat -vm 1
   3 users    Load  0.12  0.12  0.09                   6 26 00:38

Mem:KB    REAL            VIRTUAL                     VN PAGER  SWAP PAGER
       Tot   Share      Tot    Share    Free         in  out     in  out
Act  130120    5436   385556    11716   30540 count  146
All  233584   17544  2762124    45604         pages  846
                                                                Interrupts
Proc:r  p  d  s  w    Csw  Trp  Sys  Int  Sof  Flt      8 cow     474 total
            75      1514  379 2525  690   66  375   70564 wire    100 0: clk
                                                   132932 act         1: atkb
14.0%Sys   1.6%Intr  2.3%User  0.0%Nice 82.2%Idl    18024 inact       3: sio1
|    |    |    |    |    |    |    |    |    |      13024 cache       4: sio0
=======+>                                           17516 free        7: ppc0
                                                          daefr   128 8: rtc
Namei         Name-cache    Dir-cache                  38 prcfr    40 9: fxp0
   Calls     hits    %     hits    %                  228 react    31 10: fxp
    1020      672   66                                    pdwak       11: hpt
                                      43 zfod             pdpgs       12: psm
Disks   ad0   da0 pass0                43 ofod            intrn       13: npx
KB/t  28.20  0.00  0.00                   %slo-z    35664 buf     175 14: ata
tps     164     0     0                70 tfree       334 dirty       15: ata
MB/s   4.52  0.00  0.00                             17810 desiredvnodes
% busy   43     0     0                             16852 numvnodes
                                                    13772 freevnodes

systat 有许多信息,我们使用参数 -vm1 来显示最详细的信息,并设定每 1 秒更新一次信息。在上面一堆复制的信息中,请将重点于在中间「====+>」及左下角的 Disks,中间部份的「====+>」表示目前 CPU 的使用情形,我们可以看到有 82.2% 的 Idle (闲置)。而硬盘的使用情形中,我的第一个硬盘 ad0 正在忙碌中,有 43% 的忙碌。而另一个 SCSI 硬盘 da0 则是完全闲置,也就是没有人正在使用它。

如果您想要知硬盘本身的存取速度,可以使用 diskinfo 这个指令。diskinfo 加了 -t 参数会对硬盘做一些测试并回报结果:

# diskinfo -v -t ad0
ad0
       512             # sectorsize
       40020664320     # mediasize in bytes (37G)
       78165360        # mediasize in sectors
       77545           # Cylinders according to firmware.
       16              # Heads according to firmware.
       63              # Sectors according to firmware.

Seek times:
       Full stroke:      250 iter in   5.199255 sec =   20.797 msec
       Half stroke:      250 iter in   4.011383 sec =   16.046 msec
       Quarter stroke:   500 iter in   6.797812 sec =   13.596 msec
       Short forward:    400 iter in   2.774055 sec =    6.935 msec
       Short backward:   400 iter in   3.257613 sec =    8.144 msec
       Seq outer:       2048 iter in   0.352483 sec =    0.172 msec
       Seq inner:       2048 iter in   0.369383 sec =    0.180 msec
Transfer rates:
       outside:       102400 kbytes in   4.511970 sec =    22695 kbytes/sec
       middle:        102400 kbytes in   4.770641 sec =    21465 kbytes/sec
       inside:        102400 kbytes in   4.174557 sec =    24530 kbytes/sec

diskinfo 指令的 -r 参数会先印出一些分割区的基本信息,包含 sector size、分割区大小、磁柱数量等。接下来的测试会花一点时间,测试结果包含了「Seek times」及「Transfer rates」。「Seek times」指的是硬盘的搜寻速度,而「Transfer rates」是数据找到后从硬盘传到系统的速度。

6.3 挂入档案系统

6.3.1 挂入与卸载 FreeBSD 档案系统

我们知道在存取磁盘前,必须先将该磁盘「挂入」(mount) 一个目录中,而挂入档案系统的指令为 mount。它的用法如下:

# mount device mount-point

例如,我们要将 ad0s1e 挂入 /home2 中:

# mount /dev/ad0s1e /home2

在执行 mount 指令前,我们必须确定挂入点存在,如果不在必须先建立目录。

如果执行 mount 时不加任何参数则可以显示目前已挂入的档案系统:

# mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1d on /tmp (ufs, local, soft-updates)
/dev/ad0s1f on /usr (ufs, local, soft-updates)
/dev/ad0s1e on /var (ufs, local, soft-updates)
/dev/ad0s1g on /volume2 (ufs, local, soft-updates)
/dev/da0s1d on /volume1 (ufs, local, soft-updates)

如果您要卸载一个档案系统,可以使用 umount 指令。例如,我们要卸载 /usr/local:

# umount /usr/local

如果在卸载档案系统时出现下列讯息,表示该档案系统忙碌中,有可能有其它人正在存取它。

# umount /var
umount: unmount of /var failed: Device busy

6.3.2 挂入与卸载其它档案系统

mount 指令除了可以让我们挂入 FreeBSD 的预设的档案系统 UFS 外,我们还可以用它来挂入其它 FreeBSD 支持的档案系统格式。例如,FreeBSD 安装光盘是一般标准的数据光盘,它的档案系统格式是 CD9660,我们将该 CD 挂入系统目录中。首先,请先将光盘放入光驱中,接着请使用下列指令来挂入光盘片:

# mount -t cd9660 /dev/acd0 /cdrom

在使用 mount 指令时,我们加上参数 -t cd9660 以指定档案系统格式为 cd9660。我们可以看到在挂入之前,/cdrom 这个目录是空的,而挂入后就出现了许多资料。光驱挂入后,您会发现光驱的退片键将失去作用,我们必须先卸载它才可以取出光盘片。

如果您要卸载它,可以使用 umount 指令。如果您在卸载时发生错误,请注意您的所在目录是不是在 /cdrom 下,如果是,必须先离开才可以顺利 umount:

# cd /
# umount /cdrom

我们说过,挂入点和磁盘分割区之间并没有必然的关系,您也可以将光盘挂入 /mnt 中,不一定要挂入 /cdrom,将 CDROM 挂入 /cdrom 只是习惯用法而已。

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

档案系统格式 说明
ufs FreeBSD 预设的档案系统。
ext2fs Linux EXT2 档案格式。
msdosfs FAT/FAT32,DOS 兼容的档案系统。
ntfs Windows 的 NTFS。
cd9660 CD-ROM 的档案系统。
udf DVD 数据光盘格式。
nfs 和 Sun Microsystems 相容的 "Network File System"。
smbfs CIFS/SMB 档案格式,也就是 Windows 的网络芳邻,请参考 Samba 网络芳邻一章。
mfs 本地的 memory-based UNIX 档案系统。
swap 用来作 swapping 的档案系统。
procfs 用来存取执行程序(process)的档案系统。
kernfs 用来存取核心参数(kernel parameter)的档案系统。

您可以在 mount 指令的参数 -t 之后加入上述档案格式做为参数以挂入正确的档案系统。或者,您也可以依档案系统的不同使用 mount_xxxx 指令。例如,要挂入 msdos 档案系统时,可以使用 mount_msdosfs;要挂入 cd9660 时,可以使用指令 mount_cd9660。您可以在 /sbin 目录下看到这些 mount 的指令:

# ls /sbin/mount*
/sbin/mount*             /sbin/mount_mfs*        /sbin/mount_procfs*
/sbin/mount_cd9660*      /sbin/mount_msdosfs*    /sbin/mount_std*
/sbin/mount_devfs*       /sbin/mount_nfs*        /sbin/mount_udf*
/sbin/mount_ext2fs*      /sbin/mount_nfs4*       /sbin/mount_umapfs*
/sbin/mount_fdescfs*     /sbin/mount_ntfs*       /sbin/mount_unionfs*
/sbin/mount_linprocfs*   /sbin/mount_nullfs*

实际上,当您执行 mount 加参数 -t 时,mount 就是会依据 -t 所给的档案系统去执行相对映的 mount_xxx。

必须注意的是,在 Windows/DOS 操作系统中,有所谓的延伸扇区 (Extended Partitions)。延伸扇区有点像是 FreeBSD 的 slice,在延伸扇区下,会在细分成多个逻辑扇区 (Logical Partitions),当 FreeBSD 遇到这种扇区时,会将各个逻辑扇区编号从第五个 slice 开始 (跳过最多 4 个 slice 的限制)。所以,DOS 中第一个逻辑扇区在 FreeBSD 中的编号就是 ad0s5,第二个逻辑扇区就是 ad0s6,依此类推。

另外,有些档案系统在 FreeBSD 中只有只读的能力。例如 NTFS,我们只能够读取该扇区的数据,而无法进行任何写入的动作。

6.3.3 开机时自动挂入

如果您在安装 FreeBSD 时是以光盘安装,您也许会发现只要以下列二个指令其中一个就可以挂入光驱:

# mount /cdrom
# mount /dev/acd0

我们之所以可以这么做是因为在 /etc/fstab 中已经记录了 /cdrom 应该要挂入另一个装置。让我们来看一下这个档:

# Device	Mountpoint	FStype	Options		Dump	Pass#
/dev/ad0s1b	none		swap	sw		0	0
/dev/ad0s1a	/		ufs	rw		1	1
/dev/ad0s1d	/tmp		ufs	rw		2	2
/dev/ad0s1f	/usr		ufs	rw		2	2
/dev/ad0s1e	/var		ufs	rw		2	2
/dev/acd0	/cdrom		cd9660	ro,noauto	0	0

我们可以看到最后一行挂入点 (Mount point) /cdrom 所对映的装置是 /dev/acd0,而档案系统格式的字段中 (FStype) 所指定的格式是 cd9660,所以我们可以不必打完整的指令就可以挂入光盘。

在系统开机时,FreeBSD 会参考 fstab 来决定要将哪些档案系统挂进来。在 fstab 各个字段所代表的意义如下:

  • Device:装置名称,就是要挂入的来源,最常用的是 /dev/ 的档案,我们说过FreeBSD 将装置视为档案,所以这里填的是 /dev/*。装置也可以是NFS或是其它的虚拟装置,如 proc,linpro 等。
  • Mountpoint:挂入点,就是你要将来源挂到什么地方,其中 swap 没有挂入点,所以是 none。
  • FStype:档案系统就是要挂入的类型,必须在 kernel 中有定义。一般 FreeBSD 的档案是 ufs,硬盘要挂入的设定就是 ufs。如果是 cdrom 就是 cd9660。请参考上方的档案系统格式说明。
  • Options:参数依各装置而有所不同,如果开机时不挂入的话(如 cdrom),就必须加入参数 noauto。defaults 设定为 rw、dev、exec、auto、nouser、async。可用的参数如下,加上no 则为相反,如 nouser、noauto:
     
    rw 可读可写。
    ro 只可读不可写。
    async 所有数据以异步方式完成。
    atime 每次存取动作都更新档案时间。
    auto 能被 mount -a 自动挂入系统。
    dev 解译档案系统特性与储存装置规格。
    exec 允许档案系统中的二进制元文件被执行。
    user 允许一般user 挂入。
    sync 所有数据以同步方式完成。
    sw swap。
    noauto 开机时不挂入。
    userquota 使用者磁盘配额限制 (须 kernel 支持 quota)。
    groupquota 群组磁盘配额限制 (须 kernel 支持 quota)。
  • dump:表示使用指令 dump 时要备份的档案系统,0表示不要、1表示要。
  • pass:这个字段是给指令 fsck 用的,是检查的顺序。/ 的数字应该是1而其它的档案系统为2。不需检查的就是0(如 cdrom,swap 等)。

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

6.4 磁盘分割与格式化

如果您目前系统只有一个硬盘,并想加上第二个硬盘时,如果是 Windows 或 DOS,我们都会先做硬盘的切割 (partition),再做格式化 (format)。在 FreeBSD 中,要使用一个新硬盘的动作也类似,必须先切割扇区,再进行格式化。

切割扇区的意思就是指定要让系统使用多大的硬盘空间,之后我们在将这个空间格式化成 FreeBSD 的档案系统格式。FreeBSD 大家应该听过 FAT 档案系统,它是以前 DOS 时代所使用的档案系统,后来又发展了 FAT32,以支持大于 2GB 的磁盘分割区。而 Windows NT/2000/XP 预设使用的档案系统为 NTFS。FreeBSD 4.x 预设使用的档案系统格式为 UFS (Unix File System),在 5.x 之后,加入了新的档案系统格式 UFS2。UFS2 和 UFS 最大的差别是 UFS2 支持 1TB 以上的硬盘分割区,除此之外, UFS2 还有一些新的功能,但都是在 UFS 上进行小修改,所以就速度上而言应该差不多。如果您有兴趣可以参考这一份 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 身份执行。接下来,您就可以依照下列步骤来新增硬盘:

  1. 进入 sysinstall

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

  2. 使用 Fdisk

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

  3. 使用 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 回到命令列。

  4. 设定 /etc/fstab

    为了让系统在开机时可以自动将此分割区挂入,我们必须再设定 /etc/fstab。请在 /etc/fstab 中增加下列数据:

    # Device          Mountpoint   FStype  Options     Dump    Pass#
    /dev/ad1s1d       /volume1     ufs     rw          2       2

6.4.2 使用命令列

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

我们一样假设要新增的硬盘为 ad1,并且将整个硬盘切成一个扇区给 FreeBSD 使用。第一步要做的就是先使用 dd 这个指令来清除硬盘上旧的设定:

# dd if=/dev/zero of=/dev/ad1 bs=1k count=1

上述指令的意思是从 /dev/zero 这个装置读出数据写到 /dev/ad1 中,每次写入的 block size (bs) 为 1KB,做一次写入的动作即可 (count)。我们知道 FreeBSD 各动硬件装置当做档案来看待,/dev/zero 这个档案其实是一个虚拟的档案,我们从这个档案读出来的数据都是 0。上述指令的动作的目的就是要将硬盘 ad1 的开头 1024KB 清成 0,而硬盘开头的部份存放的就是一些分割区设定的数据 (Partition Table)。

接下来呢我们就必须使用 fdisk 这个指令来切割 slice 了:

# fdisk -BI ad1
******* Working on device /dev/ad1 *******
fdisk: invalid fdisk partition table found

上述 fdisk 指令表示我们要将 ad1 切割成一个 slice (参数 -I),并清除放开机信息的第 0 个 sector。您可以忽略「invalid fdisk partition table found」的警告,因为我们一开始并没有任何分割区。接下来我们就可以使用下列 bsdlabel 指令来建立预设的 partition label,再使用 bsdlabel 加参数 e 以修改建立的 lable:

# bsdlabel -B -w ad1s1 auto
# bsdlabel -e ad1s1

接着会使用您预设的文书编辑软件跳出一个窗口,请将 a: 改成 d: 后存档离开,因为我们新增加的分割区不是要给根目录使用,所以不用代号 a,而是使用第一个不具特别意义的代号 d。

# /dev/ad1s1:
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
 d: 78156146       16    unused        0     0
 c: 78156162        0    unused        0     0 # "raw" part, don't edit
 

将 a: 改成 d: 后,存档离开即可。接下来我们就可以格式化这一个分割区了。FreeBSD 中用来格式化 UFS 档案系统的指令为 newfs

# newfs /dev/ad1s1d

以上即为新增一颗硬盘所要做的事。请注意,bsdlabel 这个指令是 FreeBSD 5.1 以后才有的,在 5.1 以前,请使用 disklabel

接下来您就可以将新的硬盘挂入了,假设您要挂入的目录是 /volume1,则请使用下列指令:

# mkdir /volume1
# mount /dev/ad1s1d /volume1

最后,如果您希望一开机就将此分割区挂入,请修改 /etc/fstab,并加入此分割区的设定。

6.5 使用 USB 磁盘驱动器

现在有很多 USB 装置:USB 大姆哥、USB 硬盘外接盒、USB 光驱等。大多数的操作系统都是将 USB 设备看模拟成 SCSI 装置,FreeBSD 也是一样。USB 硬盘、大姆哥等都会被当做 SCSI 硬盘,代号会是 da0、da1;而 USB 光驱则是 cd0。

6.5.1 事前的准备

在开始使用 USB 磁盘驱动器之前,我们必须先确定系统有支持 USB 装置。在核心 (Kernel) 中,关于 USB 硬盘及光驱的支持必须要有下列项目:

device	scbus	# SCSI bus (required for SCSI)
device	da	# Direct Access (disks)
device	cd	# 支援 CD-ROM/DVD
device	pass	# Passthrough device (direct SCSI access)
device	uhci	# UHCI PCI->USB interface (支援 USB 1.x)
device	ohci	# OHCI PCI->USB interface (支援 USB 1.x)
device	ehci	# EHCI PCI->USB interface (支援 USB 2.0)
device	usb	# USB Bus (required)
device	umass	# Disks/Mass storage - Requires scbus and da

如果您不使用 USB 光驱,可以将「device cd」移除。如果您使用的是 GENERIC 核心 (FreeBSD 预设的核心),那么您的核心已经支持 USB 硬盘了 。如果您使用的是 FreeBSD 6.0 以前的版本,您必须再修改修改核心,以支持 USB 2.0。请在核心设定档中加入下列这一行以使用 USB 2.0:

device	ehci	# EHCI PCI->USB interface (USB 2.0)

不过您必须注意 FreeBSD 4.10 以后才开始支持 USB 2.0 喔。如果没有加入 USB 2.0 的支持,所有装置将会以 USB 1.1 速度运作。关于如何编译核心请参考「编译核心」一章的说明。

另外,我们必须启动 usbd 以支持某些 USB 装置,例如 USB hub 等。FreeBSD 安装完成后,预设可能有启动 usbd,如果没有,请修改 /etc/rc.conf 加入下列设定:

usbd_enable="YES"

重新编译核心,并修改 /etc/rc.conf 后,您必须重新开机才可以继续下列动作喔。

重开机后,您就可以将 USB 装置插入。插入后,您会在 console 看到下列讯息:

umass0: USB Flash Disk, rev 2.00/2.00, addr 2
da0 at umass-sim0 bus 0 target 0 lun 0
da0: <OTi Flash Disk 2.00> Removable Direct Access SCSI-2 device
da0: 1.000MB/s transfers
da0: 125MB (256000 512 byte sectors: 64H 32S/T 125C)

我们可以看到这个装置的名称为 da0,我们以下的操作都会以 da0 做为范例。如果您没有看到上述讯息,表示没有抓到 USB 装置,请检查核心设定后再试一次。

由于 USB 磁盘驱动器会被仿真成 SCSI 装置,所以您也可以使用 SCSI 工具 camcontrol 来查看目前所有 USB 装置:

# camcontrol devlist
<OTi Flash Disk 2.00> at scbus1 target 0 lun 0 (da0,pass0)

6.5.2 挂入已格式化的磁盘驱动器

如果您要挂入已从 Windows/DOS 中格式化好的 USB 磁盘驱动器,它的档案格式有可能是 FAT/FAT32 或是 NTFS。 如果您不知道它的档案格式,可以使用指令 fdisk 查看:

# fdisk da0
******* Working on device /dev/da0 *******
parameters extracted from in-core disklabel are:
cylinders=125 heads=64 sectors/track=32 (2048 blks/cyl)

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

Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
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
The data for partition 2 is:
<UNUSED>
The data for partition 3 is:
<UNUSED>
The data for partition 4 is:
<UNUSED>

请注意粗体字的部份,我们可以看到在 da0 中有一个分割区,其档案系统格式为 FAT32。所以要挂入档案系统时,分割区代号为 da0s1 (请参考本章最开头分割区代号的说明)。以下我们的操作都是使用 da0s1

挂入 FAT/FAT32 档案格式

如果您要挂入的档案系统为 FAT/FAT32,在 FreeBSD 5.x 以后,请使用指令 mount_msdosfs,若是 FreeBSD 4.x 请使用 mount_msdos

# mount_msdosfs -L zh_TW.Big5 /dev/da0s1 /mnt

我们在 mount_msdosfs 指令中使用参数 -L,并指定 locale 为 zh_TW.Big5 以支持中文档名。如果没有加此参数,中文档名将会是乱码。

如果您在挂入时出现下列错误讯息,表示您需要安装 libiconv 模块:

# mount_msdosfs -L zh_TW.Big5 /dev/da0s1 /mnt
mount_msdosfs: Unable to load iconv library: Shared object "libiconv.so"
not found, required by "mo"
: No such file or directory
mount_msdosfs: msdosfs_iconv: No such file or directory

我们可以使用 port 来安装 libiconv 模块:

# cd /usr/ports/converters/libiconv
# make install

接着您就可以重新执行挂入的指令了。

挂入 NTFS 档案格式

如果您要挂入的档案系统格式为 NTFS,则必须使用指令 mount_ntfs

# mount_ntfs -C Big5 /dev/da0s1 /mnt

同样的,我们使用参数 -C 以支持 NTFS 的中文档名。不过,NTFS 在 FreeBSD 中只能只读而无法写入,所以您无法在 NTFS 分割区中进入任何写入的动作。

6.5.3 格式化 USB 磁盘驱动器

如果您要在 FreeBSD 中格式化 USB 磁盘驱动器,首先要考量的是这个磁盘是否要再拿到其它操作系统中使用。FreeBSD 可以格式化磁盘成为 FAT/FAT32 及 UFS。但是 Windows 操作系统只支持 FAT/FAT32。所以如果您要将磁盘拿到 Windows 中使用,请格式化成 FAT32。

FAT 档案系统格式的效率很差,尤其是大容量的档案系统时,存取的速度很慢。所以如果这个 USB 磁盘只要给 FreeBSD 使用,建议您格式化成 UFS 格式。如果您要将 USB 磁盘格式化成 FreeBSD 的 UFS 格式,请参考本章关于磁盘分割的说明,只要在格式化时选 da0 即可。我们这里只针对如何格式化成 FAT/FAT32 做说明。

分割扇区

在格式化之前,我们必须先进行磁盘分割。理论上,不同的磁盘分割区有不同的代号,例如,FreeBSD 磁盘分割区的代号为 165,而 FAT32 分割区的代号为 11。165 这个数字有没有很熟的感觉,我们在安装 FreeBSD 切割 slice 时就曾经使用过它。

您可以使用 sysinstall 来切割扇区,也可以使用命令列的指令。如果您要使用 sysinstall,请在进入 sysinstall 后,选择 [Configure] -> [Fdisk],将整个硬盘分割成一个扇区。请注意在 输入分割区类型代号时,请将 165 改成 11 表示使用 FAT32。

如果您要使用命令列模式来切割扇区,和分割 FreeBSD 硬盘一样,我们使用 fdisk 这个指令。但因为 fdisk 在分割磁盘区时预设会使用 FreeBSD 的分割区代号,所以我们必须使用互动模式来进行磁盘分割 :

# dd if=/dev/zero of=/dev/da0 bs=1k count=1
# fdisk -B da0
******* Working on device /dev/da0 *******
parameters extracted from in-core disklabel are:
cylinders=125 heads=64 sectors/track=32 (2048 blks/cyl)

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

Do you want to change our idea of what BIOS thinks ? [n] <== 按 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

# newfs_msdos /dev/da0s1

newfs_msdos 指令会自动依您的磁盘大小选择使用 FAT 或是 FAT32。现在您可以试着挂入看看可不可以使用:

# mount_msdosfs -L zh_TW.Big5 /dev/da0s1 /mnt

 

6.6 档案系统修复

Unix 系统中大多有一个用来检查及修复档案系统的程序 - fsck。在不正常关机的情形下 (例如停电),FreeBSD 在开机时会自动执行 fsck。fsck 是 File System Consitency checK 的缩写,主要的用途在于检查档案系统的一致性 (consistency)。在系统开机时,要挂入档案系统前,FreeBSD 会先检查档案系统是否被标示为「clean」,如果不是,则会进行档案系统检查。在挂入档案系统时,系统会将档案系统标示为「not clean」。而在正常关机时,系统会先卸载档案系统,并于卸载时将档案系统标示为「clean」。这也就是为什么不正常关机后,在开机时会进行档案系统检查的原因。因为在不正常关机时,没有人去将档案系统设为「clean」。

为什么档案系统会有不一致呢?这要从档案系统的格式说起。一个档案可以分为档案属性 (meta-data) 和档案数据 (file content) 二个部分,档案的属性可能包含了档案长度、档案拥有者、连结数目等。而档案数据就是档案的实际内容。目录的结构也类似,只是目录的档案数据部份存放的是档案的档名、档案在档案系统中的位置等。这些数据在写入或删除时,可能都会被快取在内存中,再慢慢写入硬盘里。而硬盘的速度相对于内存而言很慢,在写入数据时,可能有写入一半就因为电源中断而写入不完全。例如,在新增档案时,有可能档案数据的部份已经写入硬盘中,但却还来不及更新档案属性及目录数据。这种情形就称为档案系统不一致。

基本上,fsck 会检查一致性,比较一些项目,例如 inode 的地址是否指向对的数据、空白区块的数目是否正确、目录结构是否完整等。但是实际上,fsck 修复档案的能力有限,它只能确保结构完整,但对于数据内容并没有修复的能力。而且,在开机过程中进行 fsck 需要花很久的时间。因此,尽量避免不正常关机才是比较好的方法。

然而,减少档案系统不一致的方法有很多种,在 Linux 中常见的方法是使用 journaling 或称为 logging 的方式。就是档案系统有任何更新时,系统都会先将档案属性的部份记录在一个日志里,因为比较重要的属性数据都很小,在写入日志时失败的机率比较低。等到系统更新完硬盘数据后才清除日志中的数据。如果更新到一半就关机,下次开机时,会使用倒推法回复原来的样子,或是将没写完的东西继续写下去。这种档案系统就叫做 Journaling File System,Linux 的 Ext3、Reiserfs 都是属于这种档案系统。不过 Journaling 的缺点就是要写二次属性数据,所以在速度上会慢一点。

FreeBSD 目前没有 Journaling File System,不过,在 FreeBSD 5.x 以后的 GENERIC Kernel 中,内建有 Soft Update 的技术。Soft Update 就是将要写入硬盘的属性数据利用特殊方法按顺序先写在内存中,在更新大量属性数据时,可以保证数据的一致性,并让不正常关机后的档案系统修复动作减到最少。而且,Soft Update 还结合了「Background fsck」的功能,让系统在开机时不必花很长的时间进行 fsck,而是将这个动作放在背景执行。Background fsck 结合了「档案系统快照」(我们会在下一小节说明),它会将开机时的档案系统状态快速的记录下来,再慢慢进行检修。

使用 Soft Update 可以增加资料写入的效率,避免数据不一致的情形,所以在 5.x 以后,除了根目录外,所有分割区预设都启用 Soft Update。不过 Soft Update 有几个缺点,因为它记录许多将属性数据在内存中,所以实际更新硬盘数据的时间可能会延迟个几秒钟,在不正常关机时,实际数据不见的比率也比较高。另外,在删除档案后,档案空间被真正释放的时间也会有点延迟。

总之,当不正常关机或档案系统上次没有被正常卸载时,在开机时就会自动进行 fsck。如果您要手动执行 fsck,必须先将分割区卸载后才可以执行。而执行的方式就是在 fsck 指令后面加上所要检查的分割区代号。例如:

# fsck -y /dev/ad0s1d
** /dev/ad1s1d
** Last Mounted on
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cyl groups
2 files, 2 used, 506337 free (25 frags, 63289 blocks, 0.0% fragmentation)

我们在上述指令中加入了 -y 参数,表示遇到问题时自动修复,不要再询问。但是因为 fsck 要在档案系统卸载后才能执行,所以如果是系统分割区,您必须要先进入单人模式 (Single user mode)。进入单人模式的方法在 FreeBSD 5.x 以后只要在开机选单中选取「Boot FreeBSD in single user mode」即可,在 4.x 中,只要在开机时看到「boot:」时,输入「boot -s」即可。这样一来,除了根目录外,其它的分割区在开机时都不会被自动挂入。

6.7 档案系统快照

档案系统快照 (File System Snapshots) 顾名思义就是在档案系统上照张相片,也就是将档案系统当时的情形记录下来,就好像照相一样。日后您可以一张一张照片翻出来看。例如,您目前档案系统中有十个档案,我们先使用档案系统快照拍一张照片。之后我们可以删除档案,在目前档案系统中已经没有东西了。但如果您将照片挂入,您还是可以看到这些档案。简单的来说,档案系统快照的功能就是记录当时档案系统的状态。

档案系统快照只能用在独立的「档案系统」。例如我们的 /home/var 分别是独立的分割区 /dev/ad0s1d /dev/ad0s1e,则我们可以对 /home /var 做档案系统快照。

让我们实际操作一次如何进行快照。建立档案系统快照的方法有二个,一是使用 mount 指令,另一个是使用 mksnap_ffs。例如我们在将 /home 这一个分割区做一个档案系统快照,并将快照存成 /home/snapshot20050730,可以使用下列指令:

# mount -u -o snapshot /home/snapshot20050730 /home

或是:

# mksnap_ffs /home /home/snapshot20050730

您会发现在 /home 中多了一个文件名为 snapshot20050730。这个档案就是现在这个时间点的档案系统状态。必须要注意的是,如果您要对 /home 做快照,在快照时只能将结果放在 /home 目录下。例如,你可以放在 /home/snapshot/20050730,或是 /home/alex/backup/0730。但是不能放在 /var/snap.0730。也就是对某一个档案系统进行快照的结果只能放在该档案系统中。但是快照完成后,您就可以将它复制到其它地方。

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

我们现在来看看要怎么把「照片」翻开来看。要看快照的内容可以使用下列指令:

# mdconfig -a -t vnode -f /home/snapshot20050730 -u 3
# mount -r /dev/md3 /mnt

上面的指令是将快照档案挂入第 3 个 md 装置,再使用 mount 指令将它像档案系统一样挂入。因为这是快照,照片是不能修改的,所以我们只能以只读格式挂入。您现在可以看一下 /mnt 中的档案,是不是和您 /home 中的档案一样,但却没有新建的档案存在。而且您可以试着开启档案,连档案内容都一样。很神奇吧,杰克!

md 是 FreeBSD 中一种特别的装置,它可以让我们将档案仿真成档案系统,您可以随意指定没有在使用中的 md 装置,如 md1md2md3 等。我们使用 mdconfig 这个指令将设定档案使用某一个编号的装置,在挂入时必须也使用相对的编号 (例如上面的 md3)。而在使用完快照后,我们必须将它卸载,并释放 md 装置:

# umount /mnt
# mdconfig -d -u 3

以上就是档案系统快照,是不是很好用。

同一个档案系统中最多可以有 20 个档案统快照,如果您有旧的快照不用了,可以直接使用 rm 指令删除它。如果您要查找某一目录下所有的快照,可以使用下列指令:

# find /home -flags snapshot

如果您查看一下我们做出来的快照,您会发现它的档案大小和档案系统大小一模一样。但是如果您将它放在原本的档案系统中,它是不占空间的。如果您将 /home 的快照复制到其它的分割区中,它才会真正的占空间。

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

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

 

Top Ths file was last modified: 2005 December 27 07:32:58.

Copyright © 2002-2024 Alex Wang from www.twbsd.org. All rights reserved.