zfs 重命名/移动根文件系统到子文件系统

zfs 重命名/移动根文件系统到子文件系统

类似问题存在但是解决方案(使用mv)很糟糕,因为在这种情况下它的作用是“复制,然后删除”而不是纯粹的“移动”。

因此,我创建了一个池:

zpool create tank /dev/loop0

并直接从另一个存储中同步我的数据,以便我的数据现在在/tank

zfs list
NAME      USED  AVAIL  REFER  MOUNTPOINT
tank      591G  2.10T   591G  /tank

现在我意识到我需要将数据放在子文件系统中,而不是/tank直接放在文件系统中。

那么我该如何移动或重命名现有的根文件系统,以便它成为池中的子文件系统?

简单的重命名不起作用:

zfs rename tank tank/mydata
cannot rename to 'tank/mydata': datasets must be within same pool

(顺便问一下,为什么它会抱怨数据集不在同一个池中,而事实上我只有一个池?)

我知道有一些解决方案涉及复制所有数据(mv或将整个数据集发送到另一台设备并返回),但难道不应该有一种简单优雅的方法吗?

只是要注意,现阶段我不关心快照(目前还没有值得关心的)。

答案1

考虑到@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

如果您不更改挂载点或 tank zpool 中还有其他文件系统,则在运行 rm -rf 时要小心。您不会想意外地递归删除新文件系统 (/tank/newname) 或任何其他子文件系统 (/tank/*) 的内容。

答案2

(请参阅评论中的说明,这有效,但您永远无法删除初始快照,因此这不是一个好的解决方案)

使用 ZFS 非常简单:只需快照、克隆然后 rm。无需额外的空间或复制时间。

zfs snapshot tank@mydata
zfs clone tank@mydata tank/newname
zfs set mountpoint=/beep/boop tank/newname
rm -rf /tank/*

如果您没有更改挂载点,或者您的 zpool 中还有其他文件系统,则在运行 rm -rf 时要小心。您不想意外地递归删除新文件系统 (/tank/newname) 或任何其他子文件系统 (tank/*) 的内容。一旦您确认您的文件不在根文件系统 (/tank/) 中,而只在新文件系统中,您也可以删除该初始快照。

zfs delete tank@mydata

答案3

我不认为有一个简单优雅的方法......虽然你可以改变你的挂载点......

mkdir /tank
zfs set mountpoint=/tank/mydata <possibly renamed tank set>

或者也许重命名坦克然后将其安装在您需要的位置......

或者,在正确的位置创建一个文件系统并通过 cp、mv 或 zfs 发送/接收......

答案4

正在将整个磁盘复制到新的数据集,然后发现它是一个根文件夹:/

zfs clone tank tank/mynewdataset && rm -rf /mnt/tank/ && zfs promote tank/mynewdataset

这使得我的根数据出现在“子”数据集中,并修复了其他解决方案的 2 个问题:大小正确,复制未执行。

相关内容