Ant*_*ton 14 zfs filesystems rename
存在类似的问题,但解决方案(使用mv)很糟糕,因为在这种情况下,它作为“复制,然后删除”而不是纯粹的“移动”起作用。
所以,我创建了一个池:
zpool create tank /dev/loop0
Run Code Online (Sandbox Code Playgroud)
并直接从那里的另一个存储同步我的数据,以便我的数据现在位于/tank.
zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 591G 2.10T 591G /tank
Run Code Online (Sandbox Code Playgroud)
现在我意识到我需要将数据放在子文件系统中,而不是/tank直接放在文件系统中。
那么如何移动或重命名现有的根文件系统,使其成为池中的子文件系统?
简单的重命名不起作用:
zfs rename tank tank/mydata
cannot rename to 'tank/mydata': datasets must be within same pool
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,如果事实上我只有一个池,为什么它会抱怨数据集不在同一个池中?)
我知道有一些解决方案涉及复制所有数据(mv,或将整个数据集发送到另一台设备并返回),但不应该有一种简单而优雅的方式吗?
只是注意到在这个阶段我不关心快照(还没有关心)。
鉴于@USDMatt 记录的问题,ZFS 发送/接收可能是最好的方法。
zfs snapshot tank@snap
zfs send tank@snap | zfs receive tank/anotherfs
zfs set mountpoint=/beep/boop tank/anotherfs
rm -rf /tank/*
zfs destroy tank@snap
Run Code Online (Sandbox Code Playgroud)
如果您的 tank zpool 中有其他文件系统,则在运行 rm -rf 时请注意,如果您不更改挂载点。您不想意外地递归删除新文件系统 (/tank/newname) 或任何其他子文件系统 (/tank/*) 的内容。
(请参阅注释中的注释,这有效,但您永远无法删除初始快照,因此这不是一个好的解决方案)
使用 ZFS,这非常简单:只需快照、克隆和 rm。不需要额外的空间或复制时间。
zfs snapshot tank@mydata
zfs clone tank@mydata tank/newname
zfs set mountpoint=/beep/boop tank/newname
rm -rf /tank/*
Run Code Online (Sandbox Code Playgroud)
如果您的 zpool 中有其他文件系统,则在运行 rm -rf 时请注意,如果您不更改挂载点。您不想意外地递归删除新文件系统 (/tank/newname) 或任何其他子文件系统 (tank/*) 的内容。一旦您确认您的文件不在根 fs (/tank/) 中,而只在您的新文件系统中,您还可以删除该初始快照。
zfs delete tank@mydata
Run Code Online (Sandbox Code Playgroud)
我不认为有一个简单优雅的方法......尽管你可以改变你的安装点......
mkdir /tank
zfs set mountpoint=/tank/mydata <possibly renamed tank set>
Run Code Online (Sandbox Code Playgroud)
或者也许重命名坦克,然后将其安装在您需要的地方......
或者,或者在正确的位置创建一个文件系统并 cp、mv 或 zfs 发送/接收...