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


9

存在类似的问题但是解决方案(使用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或将整个数据集发送到另一台设备并返回),但是不应该有一种简单的优雅方法吗?

只是要注意,我在此阶段不关心快照(尚无要关心的快照)。

Answers:


4

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

使用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

似乎是一个合理的答案(我想不出其他任何方法即可将数据移动到新数据集中而不移动它),但不幸的是您无法删除此原始快照。克隆有一些尴尬的副作用。您不能删除tank @ mydata,因为新数据集取决于它。您可以升级新的数据集,这会将tank @ mydata移动到tank / newname @ mydata,但是现在您已经交换了相关性,并且如果尝试删除新的数据集,您会得到有趣的“数据集已存在”错误(至少在FreeBSD上,尽管我认为这可能是ZFS特定而非操作系统)。
美元马特

@USDMatt:你完全正确。如果您正在处理子文件系统(tank / a-> tank / a @ snap-> tank / asnap-clone-> tank / renamed-asnap-clone),这将非常有效,但是如果您正在使用zpool。感觉就像是个错误,将其归为永远无法填充池根文件系统的另一个原因)。
notpeter 2012年

4

鉴于@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 / *)的内容。


0

我不认为有一种简单而优雅的方法...尽管您可以更改安装点...

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

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

要么在正确的位置创建一个文件系统,然后cp,mv或zfs发送/接收...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.