いくつかの障害のあるディスクを新しいものと交換しています。それらを1つずつ交換するのではなく、新しいディスク上に新しい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
そして、2つのプールは同一になりました。
ただし、この場合、最初に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
スナップショットを削除する必要がありました。