仅限当前已安装的文件系统

仅限当前已安装的文件系统

我想确定任意路径是否是 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

相关内容