FreeBSD 使用手册
上一页 | 第3章 　UNIX 基础 | 下一页

# 3.5 磁盘组织

FreeBSD 查找文件的最小单位是文件名。 而文件名区分大小写，这就意味着 `readme.txt` 和 `README.TXT` 是两个不相同的文件。 FreeBSD 不凭文件扩展名 (`.txt`) 去识别这个文件是 程序、 文档， 或是其他格式的数据。

各种文件存放在目录里。 一个目录可以为空， 也可以含有多个的文件。一个目录同样可以包含其他的目录， 允许您在一个目录里建立多个不同层次的目录。 这将帮助您轻松地组织您的数据。

文件或目录是由文件名或目录名，加上斜线符号 `/`， 再根据需要在目录名后面加上其他目录的名称。 如果您有一个名为 `foo` 的目录， 它包含另一个目录 `bar`， 后者包括一个叫 `readme.txt` 的文件， 则全名， 或者说到文件的 路径 就是 `foo/bar/readme.txt`。

在文件系统里目录和文件的作用是存储数据。 每一个文件系统都有且只有一个顶级目录 根目录， 这个根目录则可以容纳其他目录。

您也许在其他的一些操作系统碰到类似这里的情况， 当然也有不同的情况。 举些例子， MS-DOS® 是用 `\` 分隔文件名或目录名， 而 Mac OS® 则使用`:`。

FreeBSD在路径方面不使用驱动器名符号或驱动器名称， 在FreeBSD里您不能这样使用： `c:/foo/bar/readme.txt`。

为了代替(驱动器名符号)， 一个文件系统会指定 根 文件系统， 根文件系统的根目录是 `/`。 其他每一个文件系统 挂接在根文件系统下。 无论有多少磁盘在FreeBSD 系统里， 每个磁盘都会以目录的方式加上。

假设您有三个文件系统， 名为 `A`、 `B` 和 `C`。 每个文件系统有一个根目录， 而各自含有两个其他的目录， 名为 `A1`, `A2` ( `B1`, `B2` 和 `C1`, `C2`)。

看看 `A` 这个根文件系统。 假如您用 `ls` 命令来查看这个目录您会见到两个子目录: `A1` 和 `A2`。 这个目录树是这个样子:

一个文件系统必须挂到另一个文件系统的某一目录， 所以现在假设把 `B` 文件系统挂到 `A1`目录， 那 `B` 根目录因此代替 了 `A1`，而显示出 `B` 目录(的内容)：

无论`B1` 或 `B2` 目录在那里而延伸出来的路径必须为 `/A1/B1` 或 `/A1/B2`。 而在 `/A1` 里原有的文件会临时隐藏。 想这些文件再出现把 `B` 从 A 挂接释放。

所有在`B1` 或 `B2` 目录里的文件都可以通过 `/A1/B1` 或 `/A1/B2` 访问。而在 `/A1` 中原有的文件会被临时隐藏，直到 `B` 从 A 上被卸载 (unmout) 为止。

把 `B` 挂接在 `A2` 那图表的样子就是这样子:

这个路径分别是 `/A2/B1` 和 `/A2/B2` 。

文件系统能把顶部挂接在另一个文件系统上。 继续这个例子， 把 `C` 文件系统挂接在 `B` 文件系统里的 `B1` 目录， 排列如下:

或者把 `C` 文件系统挂接在 `A` 文件系统里的`A1`目录：

假如您熟悉 MS-DOS 并知道 `join` 命令， 尽管不相同，其实功能是相似的。

这方面不是普通知识而且涉及到您自己所关心的， 当您安装FreeBSD并在以后添加新磁盘时， 您必须知到该如何新建文件系统和挂接上。

(FreeBSD系统)它有一个主要的根文件系统， 不需要另外新建立， 但当需要手工处理时，这是一个有用的知识。

多个文件系统的益处

- 不同的文件系统可用不同的 挂接参数。 举些例子， 仔细想一下， 根文件系统能用只读的方式挂接上， 防止不经意删除或编辑到一个危险的文件。 把各用户能写入的文件系统分开， 像`/home`这样， 由另外的文件系统分别用 nosuid 参数挂接，这个参数防止 suid/guid 在执行这个文件系统中的文件时生效， 从而缓解了一些安全问题。

- FreeBSD 能根据一个文件系统使用的情况自动优化 这个文件系统上的文件布局。 所以对一个存储了大量小文件并会被频繁写入文件系统的优化与一个存储了少量大文件的优化是不同的。 而在一个大的单一文件系统上则无法体现这样的优化。

- FreeBSD 的文件系统能够在断电时尽可能避免损失。 然而， 在关键点时的电源失效仍然可能会破坏文件系统的结构。 将您的文件系统分成多个有助于分散风险， 并方便备份和恢复。

单一文件系统的益处

- 文件系统是固定大小的。 当安装FreeBSD时新建一个文件系统并设定一个大小， 您会在稍后发觉到必须去建一个大的分区。 如果配置不当， 则需要备份、 重新创建文件系统， 然后再恢复数据。

  > 重要: FreeBSD 提供了 growfs(8) 命令。 这使得能够实时地调整文件系统的大小， 因而不再受其限制。

文件系统是和分区一一对应的。 这里的分区和常用的术语分区 (例如， MS-DOS 分区) 的意思并不一样， 这是由于 FreeBSD 的 UNIX® 传统造成的。 每一个分区使用一个从 `a` 到 `h` 的字母来表示。 每个分区只能包含一个文件系统， 这意味着文件系统通常可以由它们在文件系统目录结构中的挂接点， 或对应的分区字母来表示。

FreeBSD 的 交换分区 也需要使用磁盘空间。 交换分区是给 FreeBSD 作 虚拟内存 使用的， 这样能令您的计算机有更多的内存可使用， 当FreeBSD在运行而内存不够的时候， 它会把其他一些可转移的数据转移到交换分区， 空出内存的位置以供使用。

某些 partitions 的用途是确定的。

分区 | 约定
--- | ---
`a` | 通常指定为根文件系统
`b` | 通常指定为交换分区
`c` | 通常它和所在的 slice 大小相同。 `c` 分区上工作时必定会影响到事整个 slice (举个例子，坏块扫描器)。 您通常不愿意在这个partition建立文件系统。
`d` | 分区 `d` 曾经有特殊的含义， 不过这种意义在现时的系统上已不再适用， 因此 `d` 可以和任何其它普通的分区一样使用了。

每一个包含了文件系统的分区被保存在 FreeBSD 称为 slice 的部分上。 Slice 是一个 FreeBSD 术语， 通常被叫做分区， 再次强调， 这是由于 FreeBSD 的 UNIX 背景。 Slices 有其编号， 从1到4。

Slice 编号在设备名后面， 并有一个 `s` 前缀， 从 1 开始。 因此 “da0s1” 是第一个 SCSI 驱动器的第一个 slice。 每个磁盘上只能有四个物理的 slices， 但您可以在物理 slice 中使用适当的类型来创建逻辑 slice。 这些扩展 slice 编号从 5 开始， 因此 “ad0s5” 是第一个 IDE 磁盘中的第一个 扩展 slice。 文件系统所使用的设备应该占满 slice。

Slices, “专用指定” 物理驱动器， 和其他驱动器都包含 partitions， 那几个的 partitions 都是用字母从 `a` 到 `h` 来标定的， 而这些字母都在驱动器名字之后，所以 “da0a” 是指首个da设备的 a partition， 而那个就是 “专项指定”。 “ad1s3e” 是指IDE磁盘上第三个slice的第五个partition。

最终，每个磁盘都被系统识别。 一个磁盘名字是用磁盘类型代码和编号来标识的， 它不像slices，磁盘的编号是由0开始的。 对应代码请看这里所列出的表 3-1。

当在 FreeBSD 中指定 partition 名字时， 必须同时包含这个分区的 slice 和磁盘的名字； 类似地， 在指定 slice 时， 也应该给出包含该 slice 的磁盘名字。 可这样列出： 磁盘名称，`s`，slice 编号，和partition标定字母。 例子请看 例 3-1。

例 3-2 这里显示了一个磁盘的布局，有更清楚的帮助。

在安装FreeBSD时，您首先要配置好磁盘slices， 然后在FreeBSD使用的slice上建立partitions。 并在每个partition上建立一个文件系统(或交换分区)， 和指定文件系统的挂接位置。

表 3-1. 磁盘设备的代码

代码 | 说明
--- | ---
`ad` | ATAPI (IDE) 磁盘
`da` | SCSI 直接存取磁盘
`acd` | ATAPI (IDE) 光驱
`cd` | SCSI 光驱
`fd` | 软驱

例 3-1. 样例磁盘, Slice, 和 Partition 它们的命名

命名 | 说明
--- | ---
`ad0s1a` | 在首个IDE磁盘(`ad0`)上的 第一个slice (`s1`)里的 第一个partition (`a`)。
`da1s2e` | 在第二个SCSI磁盘(`da1`)上的 第二个slice(`s2`)里的 第五个partition(`e`)。

例 3-2. 一个磁盘的布局

从在系统里的首个IDE磁盘图表可以显示出FreeBSD的见解。 假设磁盘大小为4 GB，它里面包含了两个2 GB 大小的slices (但在MS-DOS叫partitions)。 首个slice是一个MS-DOS磁盘叫`C:`， 而第二个slice是FreeBSD配置好的slice。 FreeBSD配置好的slice有三个partitions和另一个交换分区。

这三个partitions各自控制一个文件系统。 partition`a` 用于根文件系统， partition`e` 用于 `/var` 目录层， partition`f` 用于 `/usr` 目录层。

上一页 | 起始页 | 下一页
目录架构 | 上一级 | 文件系统的挂接和卸下

本文档和其它文档可从这里下载：ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题，请先阅读文档，如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.