Btrfs

從 btrfs 快照恢復單個文件而不進行完整複製

  • December 21, 2018

背景

我使用btrbk在我的 btrfs 文件系統上維護一系列每小時快照。子捲和快照的儲存方式如下(縮短名稱以便於理解):

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

現在我刪除了一個/home/user/vol我不應該刪除的文件。沒問題,我可以輕鬆地從最新的快照中恢復:

# 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

似乎我無法“重新連結”該文件。但我不想最終得到文件的兩個副本。理想情況下,我希望它看起來在最近的快照和將來拍攝的下一個快照之間沒有發生任何事情。

(是的,我也有實際的備份,但是從快照恢復更方便!)

問題

如何從 btrfs 快照恢復單個文件,同時保留所有使 btrfs 知道它是所有快照中相同數據的良好引用和魔法?

您只能cp --reflink在源和目標都位於同一掛載點時使用。為此,將同一個文件系統掛載到多個目錄不算在內。在某處掛載 btrfs 文件系統的“根”卷,然後cp --reflink在該目錄下的快照子捲和 @vol 之間進行操作。

引用自:https://unix.stackexchange.com/questions/476925