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

Просто отмечаю, что на данном этапе мне нет дела до снимков (о них еще нет дела).

Антон
источник

Ответы:

4

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

С 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 / *) случайно. Как только вы подтвердите, что ваши файлы не находятся в корневом каталоге файловой системы (/ tank /) и только в вашей новой файловой системе, вы также можете удалить этот первоначальный снимок.

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

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

notpeter
источник
0

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

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

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

Либо так, либо создайте файловую систему в нужном месте и cp, mv или zfs отправьте / получите ...

ewwhite
источник