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


9

Подібне питання існує, але рішення (використання 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або відправлення всього набору даних на інший пристрій і назад), але чи не повинен бути простий елегантний спосіб?

Зауваживши лише, що я не переймаюся знімками на цьому етапі (ще немає жодного, кого слід подбати).

Відповіді:


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

Начебто правдоподібна відповідь (я не можу придумати жодного іншого способу перевести дані в новий набір даних, не переміщуючи їх), але, на жаль, ви не можете видалити цей оригінальний знімок. У клонів є кілька незручних побічних ефектів. Ви не можете видалити tank @ mydata, оскільки від цього залежить новий набір даних. Ви можете просувати новий набір даних, який перемістить tank @ mydata до tank / newname @ mydata, але тепер ви поміняли залежність і отримаєте смішні помилки "набір даних вже існує", якщо спробувати видалити новий набір даних (принаймні на FreeBSD, хоча я припускаю, що це, швидше за все, ZFS, а не ОС).
Метт США

@USDMatt: Ви абсолютно праві. Це прекрасно працює, якщо ви працюєте з підфільмами (tank / a -> tank / a @ snap -> tank / asnap-clone -> tank / renamed-asnap-clone), але не, якщо ви працюєте в корені zpool. Ви відчуваєте себе як помилка, замішайте її як ще одну причину ніколи не заповнювати кореневу файлову систему вашого пулу).
непетер

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 / *) випадково.


0

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

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

Або, можливо, перейменуйте танк, а потім змонтуйте його там, де вам потрібно ...

Або це, або створіть файлову систему в потрібному місці, а cp, mv або zfs надсилати / отримувати ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.