BTRFSでファイルサイズが残っているディスク容量よりも大きい場合、以前のバージョンのファイルに戻す方法は何ですか?

BTRFSでファイルサイズが残っているディスク容量よりも大きい場合、以前のバージョンのファイルに戻す方法は何ですか?

この状況を想像してみましょう。私のbtrfsディスクには20GBのファイルがありますが、残りのスペースは10GBしかありません。スナップショットを作成してファイルを変更します。このファイルをスナップショットに保存されている元のファイルに復元するにはどうすればよいですか?
これは不可能だと思います。はい、スナップショットをマウントしてから、スナップショットのファイルをデフォルトのファイルシステムにコピーすることができます。しかし、残りのスペースよりも大きいので収容できません。それでは、変更されたファイルを削除してスペースを解放できますか?いいえ、ファイルを削除しても空き容量が増えないため、btrfsです。スペースを解放するには、スナップショットを削除する必要があり、元のファイルが失われます。だから唯一の方法は次のとおりです。

  • スナップショットマウント
  • cpファイルを外部ファイルシステム(外部ストレージ)に
  • 変更されたファイルの削除
  • スナップショットの削除
  • 外部ストレージから元のファイルを再コピー

他の解決策のアイデアはありますか?

ベストアンサー1

可能で簡単です。以下を使用すればcp十分です--reflink=always

cp --reflink=always /path/to/desired/file /target/directory/

--reflink=always大きい。また-a

疑わしい場合は、別の名前でコピーするのが合理的です。つまり、変更されたファイルを上書きしないでください。これにより、成功し、cp結果を確認して正しいディレクトリに正しいファイルがあることを確認し、変更されたファイル(ターゲットmvディレクトリにある)を上書きできます。

まったく新しいLinuxカーネル(5.18以上)このコマンドは、必要なファイルとターゲットディレクトリのみが同じBtrfsファイルシステムにある場合にのみ機能します(明らかにあなたの場合です)。

カーネルが十分に新しくない場合、Invalid cross-device linkエラーメッセージが表示されることがあります。マウントポイントを拡張しようとすると、cp --reflink=alwaysこのエラーが発生します。必要なファイルを必要なディレクトリに再接続することはまだ可能です。これは単一のマウントポイントでのみ実行できます。したがって、これを取得したら、Invalid cross-device link次のように進みます。

  1. 完全なBtrfsファイルシステム(subvol=//some/mountpoint

    要点は、必要なファイルと宛先ディレクトリが存在したいことです/some/mountpoint。ファイルシステムのサブボリュームレイアウト(ツリー)に応じて、特定のサブボリューム(必ずしもファイルシステム全体である必要はありません)をマウントすることでこれを実行できます。完全なファイルシステムをマウントすると、必要な結果を確実に得ることができます。

    おそらく、この要件を満たすマウントポイントが実行されているオペレーティングシステムにすでに存在し、それを使用できる可能性があります。この答えを比較してください:btrfs: サブボリュームの参照

  2. cp --reflink=always上記のように、必要なファイルをターゲットディレクトリにコピーするために使用されます。重要なのは、/some/mountpointターゲットディレクトリがあるサブボリュームが(やはり)他の場所にマウントされていても、それを維持することです。取付点を交差させないでください。単一のマウントポイントにファイルシステム全体をマウントすることは、単一のマウントポイントcpで正確に機能できるようにするためのものです。

  3. umount /some/mountpoint(既存のマウントを使用しない限り)

おすすめ記事