嗯,这实际上取决于如何只读你想在游泳池是。不,这不是在开玩笑。
首先,使用一些术语:在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属性临时设置readonly
为on
(这意味着将拒绝所有用户启动的写入),并将其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
这将卸载池中的所有文件系统和其他数据集,刷新所有缓冲区(以首先需要刷新的程度),将池标记为未在所有组成设备上导入,并执行任何其他必要的管家任务以确保可以安全地将池移至其他系统,然后再导入该系统。