我想确定任意路径是否是 ZFS 挂载点的根,以便在 (Python) 脚本中进行评估(因此命令的返回代码优先于输出解析)。btrfs 等效项是btrfs subvolume show [path]
返回 0 还是 1,表示路径是否是 btrfs 子卷的根。
据我所知,我会使用zfs list
并解析它,但也许还有更优雅的方法。
我在 Ubuntu 16.10 和 Linux 4.8.0 上使用 ZFS 0.6.5.8。
答案1
似乎没有简单的方法来判断挂载点是父节点还是子节点。例如,您可以使用usedbychildren
应该0B
用于叶节点(最低子节点)的属性。
$ zfs list -o name,usedbychildren
NAME USEDCHILD
tank 40.4T
tank/backup 0B
如果您的层次结构更复杂,您可以使用以下方式限制最大深度-d
(尽管最小深度不可用)。可以使用以下方式关闭标题-H
:
$ zfs list -o name,usedbychildren -H -d 0
tank 40.4T
对于给定的挂载点,您可以使用脚本zfs get
:
$ zfs get -H -o value usedbychildren tank/backup
0B
看man zfs-props
更多细节。
答案2
仅限当前已安装的文件系统
如果你愿意限制自己当前已安装ZFS 文件系统,您可以解析/proc/mounts
并且不需要任何特定的 ZFS 知识(除非您特别想将自己限制在 ZFS 文件系统中)。
这在非 Linux 系统上可能有效,也可能无效。
/proc/mounts 基本上是 /etc/mtab,但由内核维护。它包含文件系统支持设备、挂载路径、文件系统类型和文件系统标志的列表。
例如,要列出所有已挂载的 ZFS 文件系统的挂载点,您可以执行以下操作
$ awk '$3 == "zfs" { print $2 }' < /proc/mounts
要检查给定目录是否对应于已挂载的 ZFS 文件系统的挂载点,
$ awk '$3 == "zfs" && $2 == "/some/particular/absolute/path" { print "yes" }' < /proc/mounts
要允许所有文件系统(不仅仅是 ZFS),只需删除检查$3 == "zfs"
。
已安装或者卸载 ZFS 文件系统
如果您需要在当前导入的池中包含未挂载的文件系统,那么您需要使用zfs get
来获取当前导入的池中所有 ZFS 挂载点的列表:
$ sudo zfs list -pH -o mountpoint | grep -q '^/some/particular/absolute/path$' && echo yes
将打印当前导入的池中yes
是否存在带有挂载点的文件系统,无论该文件系统当前是否已挂载。/some/particular/absolute/path
导出池上的文件系统
我不知道有任何方法可以在不了解相关池上的文件系统的情况下列出导出池上的文件系统。因此,我认为这种组合是不可能的。
结束语
始终考虑是否存在可以满足您需求的实用程序。例如,df
作为副作用,打印当前安装的文件系统及其支持设备的列表,并且可以预期不会参与任何内核魔法(仅使用供公共使用的接口)。strace df 2>&1 | less
在这种情况下,了解如何找到所需信息是一个不错的开始。
答案3
您可以使用zfs get
来显示选定的属性,例如mountpoint
。
# zfs get -pH -o value mountpoint rpool/swap
解释:
-p
生成以制表符作为分隔符的可解析输出-H
省略标题-o name,property,value,source
显示四列,或它们的任意变体
您将收到设置为挂载点的路径(在大多数情况下,这将是/加上数据集名称 (1),但可以不同(2)),-如果没有设置挂载点(3),或者遗产(4)然后您可以使用grep
来区分:
# zfs get -pH -o value mountpoint rpool
/rpool
# zfs get -pH -o value mountpoint rpool/export/home
/export/home
# zfs get -pH -o value mountpoint rpool/swap
-
# zfs get -pH -o value mountpoint rpool/ROOT
legacy