22.7.为磁盘设备添加卷标
在系统初始化期间,FreeBSD 内核会随着设备的发现而创建设备节点。这种设备探测方法会引发一些问题。例如,如果通过 USB 添加了新的磁盘设备,可能会导致闪存设备分配为 da0,而原来的 da0 重新分配为 da1。如果文件系统列在 /etc/fstab 中,这将导致挂载问题,甚至可能会阻止系统引导。
一种解决方案是按顺序链接 SCSI 设备,这样添加到 SCSI 卡上的新设备将被分配未使用的设备号。但对于可能替代主 SCSI 磁盘的 USB 设备呢?这种情况发生是因为 USB 设备通常在 SCSI 卡之前探测。解决办法是仅在系统引导后插入这些设备。另一种方法是仅使用 ATA 硬盘,并且永远不要在 /etc/fstab 中列出 SCSI 设备。
更好的解决方案是使用 glabel 为磁盘设备打标签,并在 /etc/fstab 中使用标签。由于 glabel 将标签存储在给定 provider 的最后一个扇区中,因此标签在重新引导后会保持不变。使用此标签作为设备,可确保无论从哪个设备节点访问,文件系统始终可挂载。
注意
glabel可创建临时标签和永久标签。只有永久标签在重新引导后保持一致。有关标签类型之间区别的更多信息,请参阅 glabel(8)。
22.7.1. 标签类型与示例
永久标签可以是通用标签或文件系统标签。永久文件系统标签可使用 tunefs(8) 或 newfs(8) 创建。这些类型的标签会在 /dev 的子目录中创建,并根据文件系统类型命名。例如,UFS2 文件系统标签将在 /dev/ufs 中创建。通用永久标签可使用 glabel label 创建。这些标签不特定于文件系统,会在 /dev/label 中创建。
临时标签会在下次重新引导时销毁。这些标签创建在 /dev/label 中,适合实验用途。可使用 glabel create 创建临时标签。
要为 UFS2 文件系统创建永久标签而不销毁任何数据,请执行以下命令:
# tunefs -L home /dev/da3此时 /dev/ufs 中应该存在标签,可将其添加到 /etc/fstab 中:
/dev/ufs/home /home ufs rw 2 2注意
运行
tunefs时,文件系统必须未挂载。
现在,可挂载该文件系统:
# mount /home从此以后,只要 geom_label.ko 内核模块在引导时加载(通过 /boot/loader.conf 或启用 GEOM_LABEL 内核选项),设备节点的变化不会对系统产生不良影响。
文件系统也可在创建时使用 newfs 命令的 -L 选项创建默认标签。有关更多信息,请参阅 newfs(8)。
以下命令可用于销毁标签:
以下示例展示了如何标记引导磁盘的分区。
示例 1. 标记引导磁盘上的分区
通过永久标记引导磁盘上的分区,即使磁盘被移动到其他控制器或转移到不同的系统,系统仍可正常引导。此示例假设使用的是单个 ATA 硬盘,并且该硬盘目前被系统识别为 ad0。还假设使用的是标准 FreeBSD 分区方案,其中包括 /、/var、/usr 和 /tmp,以及一个交换分区。
重新引导系统,在 loader(8) 提示符下,按 4 引导进入单用户模式。然后输入以下命令:
系统将继续以多用户模式引导。引导完成后,编辑 /etc/fstab,将常规设备名称替换为其各自的标签。最终的 /etc/fstab 文件将如下所示:
现在可重新引导系统。如果一切正常,系统将正常引导,mount 命令将显示:
glabel(8) 类支持基于文件系统唯一标识符(ufsid)的 UFS 文件系统标签。这些标签可在 /dev/ufsid 中找到,并在系统引导时自动创建。可使用 ufsid 标签通过 /etc/fstab 挂载分区。使用 glabel status 获取文件系统及其对应的 ufsid 标签列表:
在上述示例中,ad4s1d 代表 /var,而 ad4s1f 代表 /usr。使用显示的 ufsid 值,可使用以下条目在 /etc/fstab 中挂载这些分区:
所有带有 ufsid 标签的分区都可以这种方式挂载,从而消除了手动创建永久标签的需要,同时仍享受设备名称独立挂载的好处。
最后更新于