Я заменяю некоторые вышедшие из строя диски новыми, и вместо того, чтобы заменять их один за другим, я создал новый пул ZFS на новых дисках и скопировал старый пул на новый. Я сделал это на уровне пула, чтобы все тома внутри были скопированы.
# zfs snapshot -r oldpool@moving
# zfs send -R oldpool@moving | zfs recv -F -v newpool
Это сработало, и теперь у меня есть снимок @moving
для нового пула:
# zfs list -t snapshots
oldpool@moving
oldpool/vol1@moving
oldpool/vol2@moving
newpool@moving
newpool/vol1@moving
newpool/vol2@moving
Теперь я уже вижу все файлы в точке монтирования newpool
, и даже изменять их, даже если они взяты из моментального снимка (все, что я прочитал, упомянутые моментальные снимки доступны только для чтения и должны быть клонированы, чтобы стать доступным для записи, поэтому я не уверен zfs recv
уже создал клоны снимка или что-то в этом роде).
Так что мне интересно, как отбросить снимок newpool @ moving
и сделать это состояние новым пулом ( т.е. базовое состояние без каких-либо снимков).
Я попытался клонировать снимок, но это просто оказалось для перемещения снимка по другому пути:
# zfs clone newpool@moving newpool/clone
# zfs promote newpool/clone
# zfs destroy newpool@moving
could not find any snapshots to destroy; check snapshot names.
# zfs list -t snapshots
oldpool@moving
oldpool/vol1@moving
oldpool/vol2@moving
newpool/clone@moving # was newpool@moving
newpool/vol1@moving
newpool/vol2@moving
Кажется, переименованы том и снимок верхнего уровня (но не любой из дочерних томов внутри него), и сохранил его как снимок вместо того, чтобы превращать его в «базовый том без снимка».
Прежде чем я что-нибудь сделаю Хуже того, что мне не хватает? Как я могу удалить снимок на newpool
, объединив все в базовые тома, чтобы он отражал состояние oldpool
, каким оно было до того, как я сделал снимок для репликации его на newpool
?
Думаю, я справился с этим. Исходная ситуация (до того, как я испортил zfs clone
) заключалась в том, что файловая система была скопирована, и был создан соответствующий снимок для помощи в будущих инкрементных обновлениях (с zfs send -i
). Это выглядело так, как если бы файлы были скопированы, а затем создан моментальный снимок, что означает, что любые последующие изменения попали в базовую файловую систему, и я мог бы откатить эти изменения обратно в моментальный снимок, если бы я хотел (точно так же, как исходный пул, я создал исходный снимок в).
Поскольку мне это не нужно, все, что мне нужно было сделать, это просто удалить снимки:
# zfs destroy -v -r newpool@moving
# zfs destroy -v -r oldpool@moving
И два пула теперь были идентичны.
Однако в этом случае сначала мне пришлось исправить беспорядок, который я создал с помощью zfs promotion
. Это сделало корень набора данных клоном, эффективно изменив эту структуру:
newpool
|
+-- vol1
|
+-- vol2
В эту структуру:
newpool
|
+-- clone
|
+-- vol1
|
+-- vol2
Решением было отменить это продвижение клона, что мне удалось сделать вот так:
# zfs snap -r newpool@s1 # Not sure if this is actually needed or not
# zfs promote newpool
Как только это было сделано все было близко к заднему, как это было сразу после параметра zfs recv
, мне просто пришлось удалить клон как обычно ( zfs destroy newpool / clone
) и лишний @ s1
снимок.