在系统初始化的过程中, 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)
以了解两者之间的差异。
有两种类型的标签, 一种是普通标签, 另一种是文件系统标签。
标签可以是永久性的或暂时性的。永久性的标签可以通过
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
:
当运行 tunefs
时, 应首先卸下文件系统。
现在可以像平时一样挂接文件系统了:
#
mount /home
现在, 只要在系统引导时通过 /boot/loader.conf
配置加载了内核模块
geom_label.ko
, 或在联编内核时指定了
GEOM_LABEL
选项,
设备节点由于增删设备而顺序发生变化时, 就不会影响文件系统的挂接了。
通过使用 newfs
命令的
-L
参数, 可以在创建文件系统时为其添加默认的标签。
请参见联机手册 newfs(8) 以了解进一步的详情。
下列命令可以清除标签:
#
glabel destroy home
以下的例子展示了如何为一个启动磁盘打上标签。
为启动磁盘打上永久性标签, 系统应该能够正常启动,
即使磁盘被移动到了另外一个控制器或者转移到了一个不同的系统上。
此例中我们假设使用了一个 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
看起来差不多是这样的:
现在可以重启系统了。 如果一切顺利的话,
系统可以正常启动并且 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
中配置类似这样:
所有包含了 ufsid
的标签都可以用这种方式挂载,
从而消除了需要手工创建永久性标签的麻烦,
而又能够提供提供与设备名无关的挂载方式的便利。
本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读
文档,如不能解决再联系
<questions@FreeBSD.org>.
关于本文档的问题请发信联系
<doc@FreeBSD.org>.