我有一个运行 ZFS 的 Ubuntu 16.04 机器。我使用 zfs-auto-snapshot 脚本来创建常规快照。我的 ZFS 设置中包含一个 ZVOL 块设备。我想访问(只读)此 ZVOL 的快照,但找不到资源。
当我执行 zfs list -t 快照时,我会看到该块设备的许多快照,例如
zfspool/folio_drbd@zfs-auto-snap_monthly-2017-12-01-1711 2.59G
- 178G - zfspool/folio_drbd@zfs-auto-snap_weekly-2017-12-08-1511 31.3G - 207G - zfspool/folio_drbd@zfs-auto-snap_weekly-2017-12-22-1511 1.97G
- 194G - zfspool/folio_drbd@zfs-auto-snap_weekly-2017-12-29-1511 908M - 197G -
这些没有出现在 /zfspool/.zfs/snapshot/zfs-auto-snap-* 中 - 我如何访问 ZVOL 快照?
答案1
zvol 的快照不会像文件系统快照那样自动显示在文件系统层次结构中(因为它们可以包含任何其他文件系统),但您可以mount
在所选目标处访问它们(同样,这取决于 zvol 的内容)。如果挂载失败,您可以尝试先克隆,然后挂载克隆,详情请参阅此邮件列表帖子:
你运行了吗
dmesg | tail
?我猜想 fs 需要日志回复,但由于快照是不可变的,因此会失败。安装克隆将解决此问题。首先尝试克隆它,例如
zfs clone tank/vmdk1@ckpnt2 tank/vmdk1-ckpnt2-clone
,然后mount /dev/zvol/tank/vmdk1-ckpnt2-clone /mnt/snap1
答案2
参加聚会有点晚了,但是......
我刚刚偶然发现了同样的问题。与 OP 稍有不同,我没想到我的 ZVOL 快照会位于 中/zfspool/.zfs
,而是位于/dev
树中的某个位置。
最初,我在那里找不到它们。读完之后man zfs
,问题就清楚了。默认情况下,它们是隐藏的,但我们可以通过snapdev
相应地设置属性轻松地使它们可见。在我的例子中,我有一个 ZVOL rpool/vm-temp
。要使其快照可见,我只需执行
zfs set snapdev=visible rpool/vm-temp
但是,我恢复了这个设置,因为我有数千个快照至少在两个地方可见:直接以编号表示法/dev
(例如/dev/zd9984p1
:),以及以符号名称表示/dev/zvol/rpool/
(例如/dev/zvol/rpool/vm-temp@Y-2020-06-29-13-44-12-part1
:),其中后者只是前者的符号链接。
可以想象,几千个快照设备会直接导致/dev
无法/dev
使用,因此我仅在出现问题时暂时使 ZVOL 快照设备可见,否则将其隐藏。
一个非常有趣的附加方面:
如果您有一个 ZVOL 充当虚拟机的磁盘(假设),那么其中可能有几个分区。如果有N
分区,您将在每个快照中获得N+1
额外的快照设备,因为 ZVOL 本身被视为磁盘设备,而分区被识别为分区。因此,就像具有多个分区的裸机磁盘一样,1 + number of partitions
每个 ZVOL 快照都会获得新的块设备。
您可以从上面的示例中看到这一点:我有,但还有一个带有而不是 的vm-temp@Y-2020-06-29-13-44-12-part1
设备(因为我在这个 ZVOL 中有两个分区),再加上一个完全没有尾随的设备,代表 ZVOL 本身。-part2
-part1
-part...
因此,这个问题的答案是:
/dev/zvol/zfspool
您可以使用或 中的设备访问快照,前提是您已通过将相关 ZVOL 的属性/dev
设置为 使它们可见。snapdev
visible
不幸的是,您实际上只能在快照设备可见的情况下才能使用这些快照设备,因此另一个答案中显示的方法(克隆快照,使用克隆)可能是更好的方法,具体取决于您拥有的快照数量以及您是否可以忍受它们使目录混乱/dev
。无论快照设备是否在树中可见,克隆快照/dev
都可以工作。
所以到目前为止,另一个答案是正确的。我只是想补充说明如何实际显示这些设备,使您能够直接使用它们,而无需克隆它们。