スナップショットを含むbtrfsサブボリュームを(正しく/効果的に)移動する方法は?

スナップショットを含むbtrfsサブボリュームを(正しく/効果的に)移動する方法は?

私は、ルートを設定し、バックアップにスナッパを使用するようにシステムを設定するためのファイルシステムとしてbtrfsを使用しています。

サブボリューム/@arch-root/@.snapshots/には複数のサブディレクトリが含まれ、各サブディレクトリには複数のサブボリュームが含まれており、これらのサブディレクトリはすべて私のスナップショットです。システムルート(/@arch-root/、独自のサブボリューム)。今、@.snapshots実際の状況に行きたいです。ファイルシステム/ロールバックプロセス全体を円滑にするには、rootを使用してください。どうやって動くことができますか?

(明らかに私が移動しています。~へ同じファイルシステム/パーティション。 )

特にmv、サブボリューム(内部サブボリュームを含む)を移動することが可能であるように見えますが、この場合の効果は不明です(特にディスク消費/ CoW /ファイルブロック間の内部リンクに関連)。ファイルが小さい場合は単にこれを使用しますが、私のシナリオではスナップショットが多く、サイズも大きくなります。

詳細が役立つ場合に備えて、全体的な状況の説明は次のとおりです(ない場合に備えて)。


完全なケースの説明

最初は、次のように理想的ではないファイルシステムレイアウトを使用しました(ここで始まるすべての項目は@サブボリュームを意味します)。

/
  @arch-root/
    @.snapshots/
      1234/
        @snapshot/
    var/
      @log/

ここでは、/私のArchlinux(起動中にインストールされている)のシステムルートであるファイルシステムのルートを表し、@arch-rootsnapperによって作成されたシステムルートのスナップショットを保存します。/@.snapshots

Snapperによって管理されるため、@.snapshots内部サブディレクトリが含まれており、各ディレクトリにはディスクリプタファイルと@arch-root私のシステムルートディレクトリのスナップショット()が含まれています。

今振り返ってみると、これが理想的ではなかったことに気づきました。以前のバージョンにロールバックする必要がある場合は、簡単にできません。同様のディレクトリはvar/logスナップショットに正しくマウントされません。 dockerが管理する他のいくつかのディレクトリにも同様の問題があります。

したがって、最良の方法は、すべての重要なディレクトリを下に移動し、/起動fstab中に正しい場所にマウントされるように設定することです。新しいファイルシステムのレイアウトは次のとおりです。

/
  @arch-root/
  @.snapshots/
    1234/
      @snapshot/
  @var-log/

そして、fstabファイルシステムは次のようにマウントされます(実際のファイルシステムではa == bマウントされることを意味します)。ba

/    == /@arch-root/
  .snapshots/    == /@.snapshots/
  var/
    log/    == /@var-log/

ただし、これを行うには、移動する正しい方法を見つける必要があります。これには内部サブボリューム(スナップショットを含む)が含まれているため、移動によってデータの重複コピーを作成しないでください。質問につながります。

関連情報