类似的问题存在,但解决scheme(使用mv )是可怕的,因为在这种情况下,它作为“复制,然后删除”,而不是纯粹的“移动”。
所以,我创build了一个池:
zpool create tank /dev/loop0
并从那里直接从另一个存储rsynce我的数据,所以我的数据现在在/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
(顺便说一下,为什么它会抱怨数据集不在同一个池中,如果事实上我只有一个池?)
我知道有解决scheme涉及复制所有的数据( mv ,或发送整个数据集到另一个设备,并返回),但不应该有一个简单的优雅的方式?
只是指出,我不在乎这个阶段的快照(有没有关心)。
(请参阅注释中的注释,这是可行的,但是您永远无法删除初始快照,因此这不是一个好的解决scheme)
使用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 / *)的内容。 一旦你确认你的文件不在根目录fs(/ tank /)中,并且只在新的文件系统中,你也可以删除这个初始快照。
zfs delete tank@mydata
鉴于@USDMattlogging的问题,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
如果在坦克zpool中没有其他文件系统的情况下不更改挂载点,请注意运行rm -rf时的注意事项。 您不希望意外删除新文件系统(/ tank / newname)或任何其他子文件系统(/ tank / *)的内容。
我不认为有一个简单的优雅的方式…虽然你可以改变你的安装点…
mkdir /tank zfs set mountpoint=/tank/mydata <possibly renamed tank set>
或者,也许重命名坦克,然后将其安装在你需要它的地方…
要么,要么创build一个文件系统在正确的地方和cp,mv或zfs发送/接收…