如何在不破坏/更改当前或外部文件系统的情况下挂载外部ZFS文件系统


11

我正在FreeBSD 10.2上使用ZFS作为根文件系统(zroot01)。我有一个要从另一个FreeBSD 10.2系统(zroot02)挂载ZFS文件系统的外部硬盘,我想暂时挂载它,只读,这样我可以从中取出一些文件,然后再断开连接。我既不希望外部ZFS系统破坏或替换我当前的文件系统,也不希望外部的数据被破坏/更改。

为了演示我要完成的任务,如果使用的是UFS,我将执行以下操作:

mount -t ufs -o ro /dev/ada0s2 /mnt/my-fun-mountpoint

... /dev/ada0s2外部驱动器上的分区在哪里,/mnt/my-fun-mountpoint并且在/mnt现有操作系统的目录中。

所有搜索和手册页阅读都没有提供一种非常清晰的方法。我确实找到了什么答案最终导致接管了我当前的文件系统并损坏了它,无法修复-显然不是我要找的结果。我之前尝试过此操作,因此很遗憾,我不记得尝试了哪个命令。

您能否提供有关此操作的明确指导?预先感谢您的帮助。

Answers:


13

嗯,这实际上取决于如何只读你想在游泳池是。不,这不是在开玩笑。

首先,使用一些术语:在ZFS中,您导入一个池,并可以选择在其中安装(任何)文件系统。您可以通过传递-N给池zpool import,然后再使用挂载任何所需的文件系统,而无需装入任何文件系统即可导入池zfs mount。(例如,如果您只希望访问多个文件系统中的单个文件系统,或者想要执行类似于池的脱机清理的操作,则这是一个非常有效的方案。)

ZFS并不是真正的只读访问的忠实拥护者。例如,如果ZFS检测到能够修复的错误,即使您将池作为只读导入,我相信它也会修复该错误并将修复的数据写入磁盘我的理解是,在ZFS拼写中,“只读”仅适用于池及其数据集的用户可见状态。另一方面,如果将磁盘的二进制副本复制到一个文件(或一组文件),使这些文件真正为只读文件,然后尝试从那里导入池,则ZFS将无法导入该文件。无论您多么努力,都可以尽情享受。如果使文件可写,它将可以正常工作。(我实际上是在几周前尝试过的,尽管使用了zvol,但ZFS强烈拒绝了导入池。当我将zvol设置为读/写而不是只读时,该池将正常导入。)其他文件系统(例如,在Linux上)ext4和可能其他文件系统在某种程度上可以很好地处理这种情况,但是ZFS却无法解决。

如果您很不幸,并且在导入池的系统中未安装ECC RAM,则ZFS尝试纠正遇到的任何错误实际上可能会使情况变得更糟,尽管对于这是否确实存在实际风险存在不同的看法。在实践中。我个人认为,我足够关心的任何数据都可以通过ZFS和快照以及存储级冗余和备份进行保护,并且不值得 ECC RAM提供的保护,但是许多PC没有ECC RAM。

因此,您可以以只读模式导入池,并带有特定的备用根目录以防止其踩在其他任何脚趾上,但是您需要了解,从法医的角度来看,它不一定是真正的只读池。(但是,这将确保您不会意外更改池中的任何内容。)要进行只读导入,假设已命名池tank且设备节点在中可用/dev,则您将使用如下命令:

# zpool import tank -d /dev -o readonly=on -R /mnt/someplace

这将查找/dev持有名称为ZFS池的任何东西tank,将其导入,将pool属性临时设置readonlyon(这意味着将拒绝所有用户启动的写入),并将其altroot属性临时设置为/mnt/someplace。(这些属性值是“临时的”,因为它们不会作为当前属性值持久化到磁盘上,因此,如果在没有它们的情况下导出并重新导入池,则这些值将恢复正常。它们可能可能会写入池历史记录,一旦导入池,您可以查看zpool history tank 导入池后,您将在/ mnt / someplace下看到文件,并对它们具有常规的只读访问权限,包括已对池中的数据集进行的所有快照。

以您的示例为例,我怀疑您会使用以下方式:

# zpool import zroot02 -d /dev -o readonly=on -R /mnt/my-fun-mountpoint

完成后,请记住干净地导出池:

# zpool export tank

也许

# zpool export zroot02

这将卸载池中的所有文件系统和其他数据集,刷新所有缓冲区(以首先需要刷新的程度),将池标记为在所有组成设备上导入,并执行任何其他必要的管家任务以确保可以安全地将池移至其他系统,然后再导入该系统。


1
如果您确实确定在第三段中声明的内容是正确的,那将是BSD ZFS实现的错误。ZFS池只读导入被设计为真正的只读,即它从不尝试写入或修复任何数据或元数据,包括池历史记录。参见arc.stillopensolaris.org/txt/PSARC_2010_306.txt
jlliagre '16

1
确定@jlliagre ,但这可能是在其他一些ZFS实现的上下文中。不过,我真的不明白为什么它们在基本方面会有所不同。我相信所有开源ZFS实现都共享大量代码,这些代码可以追溯到Sun。我可能会为此设置某种测试环境,然后用棍子戳它,然后看看会发生什么,但是要花一些时间才能真正地做到这一点。
CVn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.