Назад | Перейти на главную страницу

Как заменить корень пула ZFS на снимок после репликации

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