Я заменяю некоторые вышедшие из строя диски новыми, и вместо того, чтобы заменять их один за другим, я создал новый пул 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 promote
. Это сделало корень набора данных клоном, эффективно изменив эту структуру:
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
снимок.