本节介绍如何在 ZFS 中管理挂载点和共享的文件系统。
缺省情况下,ZFS 文件系统在创建时自动挂载。可以确定文件系统的特定挂载点行为,如本节所述。
另外,也可以在创建时使用 zpool create 的 -m 选项设置池数据集的缺省挂载点。有关创建池的更多信息,请参见创建 ZFS 存储池。
所有 ZFS 文件系统都由 ZFS 通过使用服务管理工具 (Service Management Facility, SMF) 的 svc://system/filesystem/local 服务在引导时挂载。文件系统挂载在 /path 下,其中 path 是文件系统的名称。
可以使用 zfs set 命令将 mountpoint 属性设置为特定路径,以覆盖缺省挂载点。如果需要,ZFS 会自动创建指定挂载点,并在调用 zfs mount -a 命令时自动挂载相关文件系统,而无需编辑 /etc/vfstab 文件。
mountpoint 属性是继承的。例如,如果 pool/home 的 mountpoint 属性设置为 /export/stuff,则 pool/home/user 将继承 /export/stuff/user 的 mountpoint 属性值。
要阻止文件系统被挂载,须将 mountpoint 属性设置为 none。此外,canmount 属性可以用来控制是否能挂载文件系统。有关 canmount 属性的更多信息,请参见canmount 属性。
也可以使用 zfs set 将 mountpoint 属性设置为 legacy,从而通过传统挂载接口显式管理文件系统。这样做可以防止 ZFS 自动挂载和管理文件系统。不过必须改用包括 mount 和 umount 命令在内的传统工具以及 /etc/vfstab 文件。有关传统挂载的更多信息,请参见传统挂载点。
将 mountpoint 属性从 legacy 或 none 更改为特定路径时,ZFS 会自动挂载文件系统。
如果 ZFS 正在管理文件系统,但该文件系统当前已取消挂载,并且 mountpoint 属性已更改,则文件系统将保持取消挂载状态。
mountpoint 属性不为 legacy 的所有数据集都由 ZFS 来管理。在以下示例中,创建了一个数据集,其挂载点由 ZFS 自动管理:
# zfs create pool/filesystem # zfs get mountpoint pool/filesystem NAME PROPERTY VALUE SOURCE pool/filesystem mountpoint /pool/filesystem default # zfs get mounted pool/filesystem NAME PROPERTY VALUE SOURCE pool/filesystem mounted yes - |
另外,也可按以下示例所示,显式设置 mountpoint 属性:
# zfs set mountpoint=/mnt pool/filesystem # zfs get mountpoint pool/filesystem NAME PROPERTY VALUE SOURCE pool/filesystem mountpoint /mnt local # zfs get mounted pool/filesystem NAME PROPERTY VALUE SOURCE pool/filesystem mounted yes - |
mountpoint 属性更改时,文件系统将自动从旧挂载点取消挂载,并重新挂载到新挂载点。挂载点目录根据需要进行创建。如果 ZFS 由于文件系统正处于活动状态而无法将其取消挂载,则会报告错误,并需要强制进行手动取消挂载。
通过将 mountpoint 属性设置为 legacy,可以使用传统工具来管理 ZFS 文件系统。传统文件系统必须通过 mount 和 umount 命令以及 /etc/vfstab 文件来管理。ZFS 在引导时不会自动挂载传统文件系统,并且 ZFS mount 和 umount 命令不会对此类型的数据集执行操作。以下示例说明如何在传统模式下设置和管理 ZFS 数据集:
# zfs set mountpoint=legacy tank/home/eschrock # mount -F zfs tank/home/eschrock /mnt |
要在引导时自动挂载传统文件系统,必须向 /etc/vfstab 文件中添加一项。/etc/vfstab 文件中的项可能看起来如下例所示:
#device device mount FS fsck mount mount #to mount to fsck point type pass at boot options # tank/home/eschrock - /mnt zfs - yes - |
device to fsck 和 fsck pass 项设置为 -,因为 fsck 命令不适用于 ZFS 文件系统。有关 ZFS 数据完整性的更多信息,请参见 事务性语义。
创建文件系统或系统引导时,ZFS 会自动挂载文件系统。仅当需要更改挂载选项,或者显式挂载或取消挂载文件系统时,才有必要使用 zfs mount 命令。
不带任何参数的 zfs mount 命令可以显示 ZFS 管理的当前已挂载的所有文件系统。传统管理的挂载点不会显示。例如:
# zfs mount tank /tank tank/home /tank/home tank/home/bonwick /tank/home/bonwick tank/ws /tank/ws |
可以使用 -a 选项挂载 ZFS 管理的所有文件系统。传统管理的文件系统不会挂载。例如:
# zfs mount -a |
缺省情况下,ZFS 不允许在非空目录的顶层进行挂载。要强制在非空目录的顶层挂载,必须使用 -O 选项。例如:
# zfs mount tank/home/lalt cannot mount '/export/home/lalt': directory is not empty use legacy mountpoint to allow this behavior, or use the -O flag # zfs mount -O tank/home/lalt |
传统挂载点必须通过传统工具进行管理。尝试使用 ZFS 工具将产生错误。例如:
# zfs mount pool/home/billm cannot mount 'pool/home/billm': legacy mountpoint use mount(1M) to mount this filesystem # mount -F zfs tank/home/billm |
文件系统挂载时,将基于与数据集关联的属性值使用一组挂载选项。属性与挂载选项之间的相互关系如下:
表 6–4 ZFS 挂载相关的属性和挂载选项
属性 |
挂载选项 |
---|---|
atime |
atime/noatime |
devices |
devices/nodevices |
exec |
exec/noexec |
nbmand |
nbmand/nonbmand |
readonly |
ro/rw |
setuid |
setuid/nosetuid |
xattr |
xattr/noaxttr |
挂载选项 nosuid 是 nodevices,nosetuid 的别名。
如果使用带有 -o 选项的 zfs mount 命令显式设置了前一部分所述的任何挂载选项,则会临时覆盖关联的属性值。zfs get 命令将这些属性值报告为 temporary,并在文件系统取消挂载时恢复为其初始值。如果挂载数据集时更改某个属性值,更改将立即生效,并覆盖所有临时设置。
在以下示例中,对 tank/home/perrin 文件系统临时设置了只读挂载选项。假设要取消挂载文件系统。
# zfs mount -o ro tank/home/perrin |
要临时更改当前已挂载的文件系统的属性值,必须使用特殊的 remount 选项。在以下示例中,对于当前挂载的文件系统,atime 属性暂时更改为 off:
# zfs mount -o remount,noatime tank/home/perrin # zfs get atime tank/home/perrin NAME PROPERTY VALUE SOURCE tank/home/perrin atime off temporary |
有关 zfs mount 命令的更多信息,请参见 zfs(1M)。
通过使用 zfs unmount 子命令可以取消挂载 ZFS 文件系统。unmount 命令可以采用挂载点或文件系统名称作为参数。
在以下示例中,按文件系统名称取消挂载一个文件系统:
# zfs unmount tank/home/tabriz |
在以下示例中,按挂载点取消挂载一个文件系统:
# zfs unmount /export/home/tabriz |
如果文件系统处于繁忙状态,则 unmount 命令将失败。要强行取消挂载文件系统,可以使用 -f 选项。如果文件系统内容正处于使用状态,强行取消挂载该文件系统时请务必小心。否则,会产生不可预测的应用程序行为。
# zfs unmount tank/home/eschrock cannot unmount '/export/home/eschrock': Device busy # zfs unmount -f tank/home/eschrock |
要提供向后兼容性,可以使用传统的 umount 命令来取消挂载 ZFS 文件系统。例如:
# umount /export/home/bob |
有关 zfs umount 命令的更多信息,请参见 zfs(1M)。
只要设置 sharenfs 属性,ZFS 便能自动共享文件系统。使用此属性时,不必在共享新文件系统时修改 /etc/dfs/dfstab 文件。sharenfs 属性是要传递给 share 命令的选项的逗号分隔列表。值 on 是缺省的共享选项的别名,它向所有用户提供 read/write 权限。值 off 指明文件系统不是由 ZFS 进行管理,但可通过传统方法(如 /etc/dfs/dfstab 文件)来共享。在引导过程中将会共享 sharenfs 属性不为 off 的所有文件系统。
缺省情况下,所有文件系统都未进行共享。要共享新文件系统,请使用类似如下的 zfs set 语法:
# zfs set sharenfs=on tank/home/eschrock |
sharenfs属性是继承的,如果文件系统继承的属性不为 off,则这些文件系统在创建时会自动进行共享。例如:
# zfs set sharenfs=on tank/home # zfs create tank/home/bricker # zfs create tank/home/tabriz # zfs set sharenfs=ro tank/home/tabriz |
tank/home/bricker 和 tank/home/tabriz 最初以可写方式共享,因为它们从 tank/home 继承了 sharenfs 属性。将该属性设置为 ro(只读)后,无论为 tank/home 设置的 sharenfs 属性为何值,都会以只读方式共享 tank/home/tabriz。
尽管大多数文件系统都可在引导、创建和销毁过程中自动共享或取消共享,但文件系统有时候需要显式取消共享。为此,请使用 zfs unshare 命令。例如:
# zfs unshare tank/home/tabriz |
此命令会取消共享 tank/home/tabriz 文件系统。要取消共享系统中的所有 ZFS 文件系统,需要使用 -a 选项。
# zfs unshare -a |
通常而言,ZFS 在引导和创建时共享文件系统的自动行为足以满足一般操作的需要。如果由于某些原因取消共享了某个文件系统,则可使用 zfs share 命令再次将其共享。例如:
# zfs share tank/home/tabriz |
另外,还可以通过使用 -a 选项共享系统中的所有 ZFS 文件系统。
# zfs share -a |
如果 sharenfs 属性设置为 off,则 ZFS 在任何时候都不会尝试共享或取消共享文件系统。借助此值,可以通过传统方法(如 /etc/dfs/dfstab 文件)来管理文件系统共享。
与传统的 mount 命令不同,传统的 share 和 unshare 命令在 ZFS 文件系统中仍然可以运行。因此,可以使用与 sharenfs 属性的选项不同的选项来手动共享文件系统。不鼓励使用这种管理模型。请选择完全通过 ZFS 或完全通过 /etc/dfs/dfstab 文件来管理 NFS 共享内容。ZFS 管理模型与传统模型相比,设计更为简单,所需进行的工作越少。