20.7. 为磁盘设备添加卷标

在系统初始化的过程中, FreeBSD 内核会为检测到的设备创建设备节点。 这种检测方式存在一些问题, 例如, 在通过 USB 添加设备时应如何处理? 很可能有闪存盘设备最初被识别为 da0 而在这之后, 则由 da0 变成了 da1。 而这则会在挂接 /etc/fstab 中的文件系统时造成问题, 这些问题, 还可能在系统引导时导致无法正常启动。

解决这个问题的一个方法是以连接拓扑方式链式地进行 SCSI 设备命名, 这样, 当在 SCSI 卡上增加新设备时, 这些设备将使用一个未用的编号。 但如果 USB 设备取代了主 SCSI 磁盘的位置呢? 由于 USB 通常会在 SCSI 卡之前检测到, 因此很可能出现这种现象。 当然, 可以通过在系统引导之后再插入这些设备来绕过这个问题。 另一种绕过这个问题的方法, 则是只使用 ATA 驱动器, 并避免在 /etc/fstab 中列出 SCSI 设备。

还有一种更好的解决方法。 通过使用 glabel 工具, 管理员或用户可以为磁盘设备打上标签, 并在 /etc/fstab 中使用这些标签。 由于 glabel 会将标签保存在对应 provider 的最后一个扇区, 在系统重启之后, 它仍会持续存在。 因此, 通过将具体的设备替换为使用标签表示, 无论设备节点变成什么, 文件系统都能够顺利地完成挂接。

注意:

这并不是说标签一定是永久性的。 glabel 工具既可以创建永久性标签, 也可以创建临时性标签。 在重启时, 只有永久性标签会保持。 请参见联机手册 glabel(8) 以了解两者之间的差异。

20.7.1. 标签类型和使用示范

有两种类型的标签, 一种是普通标签, 另一种是文件系统标签。 标签可以是永久性的或暂时性的。永久性的标签可以通过 tunefs(8)newfs(8) 命令创键。根据文件系统的类型, 它们将在 /dev 下的一个子目录中被创建。例如, UFS2 文件系统的标签会创建到 /dev/ufs 目录中。永久性的标签还可以使用 glabel label 创建。它们不再是文件系统特定的,而是会在 /dev/label 目录中被创建。

暂时性的标签在系统下次重启时会消失, 这些标签会创建到 /dev/label 目录中, 很适合测试之用。可以使用 glabel create 创建暂时性的标签。请参阅 glabel(8) 手册页以获取更多详细信息。

要为一个 UFS2 文件系统创建永久性标签, 而不破坏其上的数据,可以使用下面的命令:

# tunefs -L home /dev/da3

警告:

如果文件系统满了, 这可能会导致数据损坏; 不过, 如果文件系统快满了, 此时应首先删除一些无用的文件, 而不是增加标签。

现在, 您应可以在 /dev/ufs 目录中看到标签, 并将其加入 /etc/fstab

/dev/ufs/home		/home            ufs     rw              2      2

注意:

当运行 tunefs 时, 应首先卸下文件系统。

现在可以像平时一样挂接文件系统了:

# mount /home

现在, 只要在系统引导时通过 /boot/loader.conf 配置加载了内核模块 geom_label.ko, 或在联编内核时指定了 GEOM_LABEL 选项, 设备节点由于增删设备而顺序发生变化时, 就不会影响文件系统的挂接了。

通过使用 newfs 命令的 -L 参数, 可以在创建文件系统时为其添加默认的标签。 请参见联机手册 newfs(8) 以了解进一步的详情。

下列命令可以清除标签:

# glabel destroy home

以下的例子展示了如何为一个启动磁盘打上标签。

例 20.1. 为启动磁盘打上标签

为启动磁盘打上永久性标签, 系统应该能够正常启动, 即使磁盘被移动到了另外一个控制器或者转移到了一个不同的系统上。 此例中我们假设使用了一个 ATA 磁盘, 当前这个设备被系统识别为 ad0。 还假设使用了标准的 FreeBSD 分区划分方案, /, /var, /usr/tmp 文件系统, 还有一个 swap 分区。

重启系统,在 loader(8) 提示符下键入 4 启动到单用户模式。 然后输入以下的命令:

# glabel label rootfs /dev/ad0s1a
GEOM_LABEL: Label for provider /dev/ad0s1a is label/rootfs
# glabel label var /dev/ad0s1d
GEOM_LABEL: Label for provider /dev/ad0s1d is label/var
# glabel label usr /dev/ad0s1f
GEOM_LABEL: Label for provider /dev/ad0s1f is label/usr
# glabel label tmp /dev/ad0s1e
GEOM_LABEL: Label for provider /dev/ad0s1e is label/tmp
# glabel label swap /dev/ad0s1b
GEOM_LABEL: Label for provider /dev/ad0s1b is label/swap
# exit

系统加继续启动进入多用户模式。 在启动完毕后, 编辑 /etc/fstab 用各自的标签替换下常规的设备名。 最终 /etc/fstab 看起来差不多是这样的:

# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/label/swap         none            swap    sw              0       0
/dev/label/rootfs       /               ufs     rw              1       1
/dev/label/tmp          /tmp            ufs     rw              2       2
/dev/label/usr          /usr            ufs     rw              2       2
/dev/label/var          /var            ufs     rw              2       2

现在可以重启系统了。 如果一切顺利的话, 系统可以正常启动并且 mount 命令显示:

# mount
/dev/label/rootfs on / (ufs, local)
devfs on /dev (devfs, local)
/dev/label/tmp on /tmp (ufs, local, soft-updates)
/dev/label/usr on /usr (ufs, local, soft-updates)
/dev/label/var on /var (ufs, local, soft-updates)

从 FreeBSD 7.2 开始, glabel(8) class 新增了一种用于 UFS 文件系统唯一标识符, ufsid 的标签支持。 这些标签可以在 /dev/ufsid 目录中找到, 它们会在系统引导时自动创建。 在 /etc/fstab 机制中, 也可以使用 ufsid 标签。 您可以使用 glabel status 命令来获得与文件系统对应的 ufsid 标签列表:

% glabel status
                  Name  Status  Components
ufsid/486b6fc38d330916     N/A  ad4s1d
ufsid/486b6fc16926168e     N/A  ad4s1f

在上面的例子中 ad4s1d 代表了 /var 文件系统, 而 ad4s1f 则代表了 /usr 文件系统。 您可以使用这些 ufsid 值来挂载它们, 在 /etc/fstab 中配置类似这样:

/dev/ufsid/486b6fc38d330916        /var        ufs        rw        2      2
/dev/ufsid/486b6fc16926168e        /usr        ufs        rw        2      2

所有包含了 ufsid 的标签都可以用这种方式挂载, 从而消除了需要手工创建永久性标签的麻烦, 而又能够提供提供与设备名无关的挂载方式的便利。

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

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.