分类: BSD
2007-12-28 21:09:10
第六章 档案系统管理
管理档案系统是系统管理者最重要的工作之一,我们必须确定使用者可以存取他们需要的数据,而且储存装置必须随时都保持正常运作。
本章读完后,您将可以了解下列基本的档案系统管理知识:
6.1 FreeBSD 的档案系统架构
我们知道在 UNIX 系统中,档案系统结构是一个树状结构,一个目录下还有很多的目录及档案,而这些目录下又会有更多的目录及档案,就像是一颗树一样,从根开始往上扩展。
对于硬盘的使用,在 UNIX 系统中,硬盘分割区会被挂在一个目录下,在存取磁盘前,「挂入」(mount) 是必要的过程。也就是说,系统会将一个硬盘的分割区挂在一个目录下,就好像 Windows 会将硬盘分割区放在 C:、D: 同样意思。所以,在 UNIX 系统中,磁盘分割区会和现有的系统目录合并。
在说明 FreeBSD 如何硬盘挂在目录下使用之前,我们先来看一下 FreeBSD 对于储存装置的命名规则。FreeBSD 会给每个硬盘、光驱的储存装置一个代号,并在 /dev 目录下产生一个相对映的装置文件。例如,我们的 IDE 硬盘代号就是 ad。以下为常见的储存装置代号:
装置的代号由 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 有一些规则:
所以当您看到一个分割区代号 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 为例,在挂入前它是空的目录,而挂入后,才会出现 db、mail 等目录。
请注意,挂入点和磁盘分割区之间并没有什么特殊关联。例如,如果您有二个挂入点 /volume1 及 /volume2,而有二个分割区 ad0s1d 及 ad0s1e,您可以任意将 ad0s1d 挂在 /volume1 或 /volume2。以上图中的挂入点为例,您也可以将 ad1s1d 挂在 /mnt 下,只是 ad1s1d 这个分割区原本是挂在 /usr/local 下,已有一些 /usr/local 下的目录结构及数据,所以还是挂在 /usr/local 下才不会有系统档案找不到的问题。
6.2 监看档案系统使用情形
几乎所有 FreeBSD 上的应用都必须使用硬盘。我们必须注意系统磁盘空间足够,并了解磁盘的使用效率。本小节中,我们将介绍一些 FreeBSD 常用的磁盘管理指令,让我们可以更快的了解目前的系统使用状态。
6.2.1 磁盘空间使用情形
在大部份的 UNIX 系统中都有二个指令可以了解硬盘的使用情形:df 及 du。
指令 df 可以显示目前所有档案系统的最大可用空间及使用情形,请看下列这个例子:
# df -h Filesystem Size Used Avail Capacity Mounted on /dev/ad0s1a 1.9G 389M 1.4G 21% / devfs 1.0K 1.0K 0B 100% /dev /dev/ad0s1d 989M 54K 910M 0% /tmp /dev/ad0s1f 4.8G 3.8G 657M 86% /usr /dev/ad0s1e 1.9G 149M 1.6G 8% /var /dev/ad0s1g 26G 890K 24G 0% /volume2 /dev/da0s1d 325G 261G 38G 87% /volume1
我们加了参数 -h 表示使用「Human-readable」的输出,也就是在档案系统大小使用 GB、MB 等易读的格式。
上面的指令输出的第一个字段及最后一个字段分别是档案系统及其挂入点。我们可以看到 /dev/ad0s1a 这个分割区被挂在根目录下。我们在上一小节提到过 ad 所代表的是 IDE 的硬盘,而 s1 表示第一个主要扇区。我另外有一个 SCSI 硬盘,它的代号是 da,它的容量很大,主要用来存放数据。devfs 是一个特别的档案系统,该档案系统并非真的磁盘,而是 FreeBSD 用来管理系统硬件装置的虚拟档案系统。
接下来的四个字段 Size、Used、Avail、及 Capacity 分别是该分割区的容量、已使用的大小、剩下的大小、及使用的百分比。当硬盘容量已满时,您可能会看到已使用的百分比超过 100%,因为 FreeBSD 会留一些空间给 root,让 root 在档案系统满时,还是可以写东西到该档案系统中,以进行管理。
另外,我们还可以使用参数 -i 来查看目前档案系统 inode 的使用情形。有的时候虽然档案系统还有空间,但若没有足够的 inode 来存放档案的信息,一样会不能增加新的档案。
# df -ih Filesystem Size Used Avail Capacity iused ifree %iused Mounted on /dev/ad0s1a 1.9G 389M 1.4G 21% 20495 262127 7% / devfs 1.0K 1.0K 0B 100% 0 0 100% /dev /dev/ad0s1d 989M 62K 910M 0% 24 141286 0% /tmp /dev/ad0s1f 4.8G 3.8G 657M 86% 311439 348015 47% /usr /dev/ad0s1e 1.9G 149M 1.6G 8% 1758 280864 1% /var /dev/ad0s1g 26G 890K 24G 0% 12 3532786 0% /volume2 /dev/da0s1d 325G 261G 38G 87% 707277 43311409 2% /volume1
我们可以看到根目录的已经用掉的 inode 数量为 20495,还有 262127 的可用 inode。
|
指令 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 各个字段所代表的意义如下:
rw | 可读可写。 |
ro | 只可读不可写。 |
async | 所有数据以异步方式完成。 |
atime | 每次存取动作都更新档案时间。 |
auto | 能被 mount -a 自动挂入系统。 |
dev | 解译档案系统特性与储存装置规格。 |
exec | 允许档案系统中的二进制元文件被执行。 |
user | 允许一般user 挂入。 |
sync | 所有数据以同步方式完成。 |
sw | swap。 |
noauto | 开机时不挂入。 |
userquota | 使用者磁盘配额限制 (须 kernel 支持 quota)。 |
groupquota | 群组磁盘配额限制 (须 kernel 支持 quota)。 |
如果您新增一个分割区,并且希望在开机时自动加载,可以编辑 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 上进行小修改,所以就速度上而言应该差不多。如果您有兴趣可以参考这一份 ()。
总而言之,新增一个硬盘的步骤为:
我们假设您要加入的是一颗 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 中增加下列数据:
# 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: |
我们可以看到这个装置的名称为 da0,我们以下的操作都会以 da0 做为范例。如果您没有看到上述讯息,表示没有抓到 USB 装置,请检查核心设定后再试一次。
由于 USB 磁盘驱动器会被仿真成 SCSI 装置,所以您也可以使用 SCSI 工具 camcontrol 来查看目前所有 USB 装置:
# camcontrol devlistat 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:The data for partition 3 is: The data for partition 4 is:
请注意粗体字的部份,我们可以看到在 da0 中有一个分割区,其档案系统格式为 FAT32。所以要挂入档案系统时,分割区代号为 da0s1 (请参考本章最开头分割区代号的说明)。以下我们的操作都是使用 da0s1。
挂入 FAT/FAT32 档案格式
如果您要挂入的档案系统为 FAT/FAT32,在 FreeBSD 5.x 以后,请使用指令 mount_msdosfs,若是 FreeBSD 4.x 请使用 mount_msdos:
# mount_msdosfs -L zh_TW.Big5 /dev/da0s1 /mnt
我们在 mount_msdosfs 指令中使用参数 -L,并指定 locale 为 zh_TW.Big5 以支持中文档名。如果没有加此参数,中文档名将会是乱码。
如果您在挂入时出现下列错误讯息,表示您需要安装 libiconv 模块:
# mount_msdosfs -L zh_TW.Big5 /dev/da0s1 /mnt mount_msdosfs: Unable to load iconv library: Shared object "libiconv.so" not found, required by "mo" : No such file or directory mount_msdosfs: msdosfs_iconv: No such file or directory
我们可以使用 port 来安装 libiconv 模块:
# cd /usr/ports/converters/libiconv # make install
接着您就可以重新执行挂入的指令了。
挂入 NTFS 档案格式
如果您要挂入的档案系统格式为 NTFS,则必须使用指令 mount_ntfs:
# mount_ntfs -C Big5 /dev/da0s1 /mnt
同样的,我们使用参数 -C 以支持 NTFS 的中文档名。不过,NTFS 在 FreeBSD 中只能只读而无法写入,所以您无法在 NTFS 分割区中进入任何写入的动作。
6.5.3 格式化 USB 磁盘驱动器
如果您要在 FreeBSD 中格式化 USB 磁盘驱动器,首先要考量的是这个磁盘是否要再拿到其它操作系统中使用。FreeBSD 可以格式化磁盘成为 FAT/FAT32 及 UFS。但是 Windows 操作系统只支持 FAT/FAT32。所以如果您要将磁盘拿到 Windows 中使用,请格式化成 FAT32。
FAT 档案系统格式的效率很差,尤其是大容量的档案系统时,存取的速度很慢。所以如果这个 USB 磁盘只要给 FreeBSD 使用,建议您格式化成 UFS 格式。如果您要将 USB 磁盘格式化成 FreeBSD 的 UFS 格式,请参考本章关于磁盘分割的说明,只要在格式化时选 da0 即可。我们这里只针对如何格式化成 FAT/FAT32 做说明。
分割扇区
在格式化之前,我们必须先进行磁盘分割。理论上,不同的磁盘分割区有不同的代号,例如,FreeBSD 磁盘分割区的代号为 165,而 FAT32 分割区的代号为 11。165 这个数字有没有很熟的感觉,我们在安装 FreeBSD 切割 slice 时就曾经使用过它。
您可以使用 sysinstall 来切割扇区,也可以使用命令列的指令。如果您要使用 sysinstall,请在进入 sysinstall 后,选择 [Configure] -> [Fdisk],将整个硬盘分割成一个扇区。请注意在输入分割区类型代号时,请将 165 改成 11 表示使用 FAT32。
如果您要使用命令列模式来切割扇区,和分割 FreeBSD 硬盘一样,我们使用 fdisk 这个指令。但因为 fdisk 在分割磁盘区时预设会使用 FreeBSD 的分割区代号,所以我们必须使用互动模式来进行磁盘分割:
# dd if=/dev/zero of=/dev/da0 bs=1k count=1 # fdisk -B da0 ******* Working on device /dev/da0 ******* parameters extracted from in-core disklabel are: cylinders=125 heads=64 sectors/track=32 (2048 blks/cyl) parameters to be used for BIOS calculations are: cylinders=125 heads=64 sectors/track=32 (2048 blks/cyl) Do you want to change our idea of what BIOS thinks ? [n] <== 按 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:Do you want to change it? [n] <== 按 Enter 即可,我们不修改 Partition 2 The data for partition 3 is: Do you want to change it? [n] <== 按 Enter 即可,我们不修改 Partition 3 The data for partition 4 is: 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: 3: 4: 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 装置,如 md1、md2、md3 等。我们使用 mdconfig 这个指令将设定档案使用某一个编号的装置,在挂入时必须也使用相对的编号 (例如上面的 md3)。而在使用完快照后,我们必须将它卸载,并释放 md 装置:
# umount /mnt # mdconfig -d -u 3
以上就是档案系统快照,是不是很好用。
同一个档案系统中最多可以有 20 个档案统快照,如果您有旧的快照不用了,可以直接使用 rm 指令删除它。如果您要查找某一目录下所有的快照,可以使用下列指令:
# find /home -flags snapshot
如果您查看一下我们做出来的快照,您会发现它的档案大小和档案系统大小一模一样。但是如果您将它放在原本的档案系统中,它是不占空间的。如果您将 /home 的快照复制到其它的分割区中,它才会真正的占空间。
这么神奇的档案系统快照有什么功用呢?实际上的应用可多了。您有没有发现档案系统快照的速度非常快,这一点可以让我们在备份时更快。传统上,如果您要备份系统,您必须先停止网络服务,以免使用者数据备份到一半却有人修改而造成错误,接着您才可以备份数据。而这样一来,服务中断的时间会非常长,直到整个档案备份完为止。
而利用档案系统快照,您先停止网络服务,将档案系统进行快照,快照完后立即启用网络服务。接下来,再将快照挂入后依正常程序备份即可。或者,您也可以直接备份快照的档案即可。如此一来,服务中断的时间就可以大幅减少了,是不是很赞!