Вопрос: zfs переименовать / переместить корневую файловую систему в дочерний


Аналогичный вопрос существует но решение (используя mv) ужасно, потому что в этом случае он работает как «копировать, а затем удалять», а не «двигаться».

Итак, я создал пул:

zpool create tank /dev/loop0

и rsynced мои данные из другого хранилища прямо там, так что мои данные сейчас находятся в /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, или отправка всего набора данных на другое устройство и обратно), но не должен ли быть простой элегантный способ?

Просто отметив, что на этом этапе я не забочусь о моментальных снимках (их еще не все равно).


6
2017-10-21 05:45


Источник




Ответы:


Учитывая проблему, описанную @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

Остерегайтесь при запуске rm -rf, если вы не измените точку монтирования, если у вас есть другие файловые системы в вашем цистерне zpool. Вы не хотите рекурсивно удалять содержимое новой файловой системы (/ tank / newname) или любых других дочерних файловых систем (/ tank / *) случайно.


3
2017-12-07 15:37





(см. примечания в комментариях, это работает, но вы никогда не сможете удалить исходный снимок, поэтому это нехорошее решение)

С ZFS это удивительно просто: просто снимок, клон, а затем rm. Не требуется дополнительное пространство или время копирования.

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

Остерегайтесь при запуске rm -rf, если вы не измените точку монтирования, если в вашем zpool есть другие файловые системы. Вы не хотите рекурсивно удалять содержимое новой файловой системы (/ tank / newname) или любых других дочерних файловых систем (tank / *) случайно. После того, как вы подтвердили, что ваши файлы не находятся в корневом каталоге fs (/ tank /) и только в вашей новой файловой системе, вы также можете удалить этот первоначальный снимок.

zfs delete tank@mydata

2
2017-12-07 14:36



Похоже на правдоподобный ответ (я не могу думать о другом способе получения данных в новый набор данных, не перемещая его), но, к сожалению, вы не можете удалить этот оригинальный снимок. У клонов несколько неудобных побочных эффектов. Вы не можете удалить tank @ mydata, поскольку новый набор данных зависит от него. Вы можете продвигать новый набор данных, который будет перемещать tank @ mydata в tank / newname @ mydata, но теперь вы поменяли зависимость, и вы получаете смешные ошибки «набор данных уже существует», если вы попытаетесь удалить новый набор данных (по крайней мере на FreeBSD, хотя я предполагаю, что это скорее ZFS, чем ОС). - USD Matt
@USDMatt: Вы совершенно правы. Это прекрасно работает, если вы работаете с субфайлами (tank / a -> tank / a @ snap -> tank / asnap-clone -> tank / renamed-asnap-clone), но не, если вы работаете в корне zpool. Похоже на ошибку, сделайте ее еще одной причиной, чтобы никогда не заполнять корневую файловую систему вашего пула). - notpeter


Я не думаю, что есть простой элегантный способ ... хотя вы можете просто изменить свою точку монтирования ...

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

Или, возможно, переименуйте резервуар, а затем установите его там, где вам это нужно ...

Либо это, либо создайте файловую систему в нужном месте и cp, mv или zfs send / receive ...


0
2017-10-21 12:00