基于这说明我应该能够使用如下命令克隆 zfs 卷:
$ sudo zfs snapshot -r zfs/logs/test@tmp-1236
$ sudo zfs clone zfs/logs/test@tmp-1236 zfs/logs/test-3
问题是它不起作用。克隆似乎已创建但尚未安装,我找不到安装它的方法:
$ ls -l /data/zfs-1/logs/test-3
ls: cannot access '/data/zfs-1/logs/test-3': No such file or directory
$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
zfs 984K 674G 104K /data/zfs-1
zfs/cache 96K 674G 96K /data/zfs-1/cache
zfs/data 96K 674G 96K /data/zfs-1/data
zfs/logs 280K 674G 104K /data/zfs-1/logs
zfs/logs/test 176K 674G 104K /data/zfs-1/logs/test
zfs/logs/test-2 0B 674G 104K /data/zfs-1/logs/test-2
zfs/logs/test-3 0B 674G 104K /data/zfs-1/logs/test-3
$ zfs get all zfs/logs/test-3
NAME PROPERTY VALUE SOURCE
zfs/logs/test-3 type filesystem -
zfs/logs/test-3 creation Wed Apr 20 17:41 2022 -
zfs/logs/test-3 used 0B -
zfs/logs/test-3 available 674G -
zfs/logs/test-3 referenced 104K -
zfs/logs/test-3 compressratio 1.00x -
zfs/logs/test-3 mounted no -
zfs/logs/test-3 origin zfs/logs/test@tmp-1236 -
zfs/logs/test-3 quota none default
zfs/logs/test-3 reservation none default
zfs/logs/test-3 recordsize 128K default
zfs/logs/test-3 mountpoint /data/zfs-1/logs/test-3 inherited from zfs
zfs/logs/test-3 sharenfs off default
zfs/logs/test-3 checksum on default
zfs/logs/test-3 compression on inherited from zfs/logs
zfs/logs/test-3 atime off inherited from zfs/logs
zfs/logs/test-3 devices on default
zfs/logs/test-3 exec on default
zfs/logs/test-3 setuid on default
zfs/logs/test-3 readonly off default
zfs/logs/test-3 zoned off default
zfs/logs/test-3 snapdir hidden default
zfs/logs/test-3 aclinherit restricted default
zfs/logs/test-3 createtxg 452830 -
zfs/logs/test-3 canmount on default
zfs/logs/test-3 xattr on default
zfs/logs/test-3 copies 1 default
zfs/logs/test-3 version 5 -
zfs/logs/test-3 utf8only off -
zfs/logs/test-3 normalization none -
zfs/logs/test-3 casesensitivity sensitive -
zfs/logs/test-3 vscan off default
zfs/logs/test-3 nbmand off default
zfs/logs/test-3 sharesmb off default
zfs/logs/test-3 refquota none default
zfs/logs/test-3 refreservation none default
zfs/logs/test-3 guid 585396924087649129 -
zfs/logs/test-3 primarycache all default
zfs/logs/test-3 secondarycache all default
zfs/logs/test-3 usedbysnapshots 0B -
zfs/logs/test-3 usedbydataset 0B -
zfs/logs/test-3 usedbychildren 0B -
zfs/logs/test-3 usedbyrefreservation 0B -
zfs/logs/test-3 logbias latency default
zfs/logs/test-3 objsetid 516 -
zfs/logs/test-3 dedup off default
zfs/logs/test-3 mlslabel none default
zfs/logs/test-3 sync standard default
zfs/logs/test-3 dnodesize legacy default
zfs/logs/test-3 refcompressratio 1.02x -
zfs/logs/test-3 written 0 -
zfs/logs/test-3 logicalused 0 -
zfs/logs/test-3 logicalreferenced 47K -
zfs/logs/test-3 volmode default default
zfs/logs/test-3 filesystem_limit none default
zfs/logs/test-3 snapshot_limit none default
zfs/logs/test-3 filesystem_count none default
zfs/logs/test-3 snapshot_count none default
zfs/logs/test-3 snapdev hidden default
zfs/logs/test-3 acltype off default
zfs/logs/test-3 context none default
zfs/logs/test-3 fscontext none default
zfs/logs/test-3 defcontext none default
zfs/logs/test-3 rootcontext none default
zfs/logs/test-3 relatime off default
zfs/logs/test-3 redundant_metadata all default
zfs/logs/test-3 overlay on default
zfs/logs/test-3 encryption off default
zfs/logs/test-3 keylocation none default
zfs/logs/test-3 keyformat none default
zfs/logs/test-3 pbkdf2iters 0 default
zfs/logs/test-3 special_small_blocks 0 default
$ sudo zfs set mounted=yes zfs/logs/test-3
cannot set property for 'zfs/logs/test-3': 'mounted' is readonly
$ sudo zfs mount zfs/logs/test-3
cannot mount 'zfs/logs/test-3': Dataset is not complete, was created by receiving a redacted zfs send stream.
看起来新卷有mounted: no
阻止其安装的选项。
我尝试将其切换为是,但没有成功。
我不确定这是否zfs mount
是正确的命令,或者它是否用于安装 zpools,但我出于绝望尝试了它。
我错过了什么?
我的目标是根据需要创建特定 zfs 卷的克隆。
答案1
你认为这mounted:no
是罪魁祸首的假设是不正确的。该mounted
属性,正如其名称所示,是只读的,它告诉你数据集当前已安装。因此,您不能直接更改它。
无法挂载它是另一个问题的结果,这个问题zfs
已经告诉你了。终端会话的最后一行:
cannot mount 'zfs/logs/test-3': Dataset is not complete, was created by receiving a redacted zfs send stream.
这实际上是问题所在。我不知道你是如何创建你试图克隆的快照的,但显然该快照是从另一个(甚至是同一个)系统使用 接收的zfs receive
,其中发送一方删除了该快照。
要了解有关编辑的信息,请查看man zfs
,man zfs-send
或man zfs-redact
(取决于您的 zfs 版本),或查看HTML 手册页。我无法在这里解释太多,因为我不使用该功能。但是,根据我的经验,以“正常”方式(不编辑)发送和接收快照始终可靠,并且不会导致安装收到的快照或它们的克隆时出现任何问题。
我知道仅有链接的答案不是最好的行为,但是手册中解释编辑的段落实在太长了,无法在此引用,即使是部分引用。
答案2
此行为是由 ZFS 工具与内核模块不匹配引起的。ZFS2.x
应用程序与早于 的内核不兼容5.11
。
由于 Ubuntu 内核版本与 Release 绑定,最简单的解决方案是进行 Release 升级。将 Ubuntu 从 更新20.04 LTS
到后22.04 LTS
,ZFS 克隆开始正常工作,包括更新前创建的克隆。
根据在以下位置发现的问题提供解决方案https://github.com/openzfs/zfs/issues/11581