web-dev-qa-db-ja.com

フルコピーを行わずにbtrfsスナップショットから単一ファイルを復元する

バックグラウンド

btrbk を使用して、btrfsファイルシステムで一連の1時間ごとのスナップショットを維持しています。サブボリュームとスナップショットは次のように保存されます(わかりやすくするために名前が短縮されています)。

/@vol               (subvolume)
/btrbk/@vol.00      (snapshots of /@vol, one per hour)
/btrbk/@vol.01      ...
/home/user/vol      (mountpoint for /@vol)

ここで、削除すべきではなかった/home/user/vol内の1つのファイルを削除しました。問題ありません。最新のスナップショットから簡単に復元できます。

# cd /home/user/vol
# cp -a --reflink=always /btrbk/@vol.01/all_ipv4_numbers.txt ./
cp: failed to clone './all_ipv4_numbers.txt' from '/btrbk/@vol.01/all_ipv4_numbers.txt': Invalid cross-device link

ファイルを「再リンク」できないようです。しかし、私はファイルの2つのコピーで終わらせたくありません。理想的には、最新のスナップショットと将来取得される次のスナップショットの間に何も起こらなかったように見せたいです。

(はい、実際のバックアップもありますが、スナップショットからの復元は、利用可能な場合はいつでも便利です!)

質問

Btrfsスナップショットから単一ファイルを復元する方法を教えてください。その一方で、btrfsにすべてのスナップショット?

3
pipe

使用できるのはcp --reflinkソースとターゲットの両方が同じマウントポイントにある場合。この目的のために、同じファイルシステムを複数のディレクトリにマウントすることはカウントされません。 btrfsファイルシステムの「ルート」ボリュームをどこかにマウントしてから、cp --reflinkそのディレクトリの下にあるスナップショットサブボリュームと@volの間。