Filesystems

將文件系統與數據分開維護

  • March 23, 2018

這可能是一個邊緣情況,但這裡有……

我正在從 2TB 硬碟恢復數據。僅當我使用它時才可掛載mount -r,並且我正在使用rsync --files-from它來複製重要目錄。

每隔一段時間它就會失敗,需要重新啟動(電源循環)。我希望有一種方法可以記憶體整個目錄樹,並使用跨越多個掛載的記憶體:換句話說,當我需要重新掛載磁碟時,我會提供用於文件查找的記憶體,而不是做更多的尋找磁碟。

假設由於備份空間不足,磁槃無法完整映像(使用dd或)。ddrescue

我看到的(同時)唯一的方法是獨立於使用的文件系統,因為它作用於塊層。

人們想要的是一種 lvmcache:為設備設置它,然後讀取文件系統元數據 ( find /path/to/mountpoint -perm 700 -printf ""),以便將其複製到記憶體設備,然後凍結記憶體設備。

不幸的是,lvmcache 似乎沒有這樣的凍結功能。

但是你可以做類似的事情:你可以設置一個快照。您必須手動執行此操作,因為 LVM 僅在卷組內支持它。在 VG 中創建快照,dmsetup lsdmsetup table查看相關設備的詳細資訊。dmsetup不關心所涉及的設備是否屬於卷組(或根本是 LVM 設備)。

通常您會創建一個快照並繼續使用主設備。由於原始數據在原始設備上更改之前已寫入快照,因此可以通過恢復快照來恢復主設備以前的狀態。這不是你想要的。您希望最小化對源設備的訪問。因此,您不掛載(新)源設備,而是掛載快照設備。

然後修改所有包含元數據的扇區,以便將它們寫入快照設備。即使你寫了兩次(因為你改變了數據,然後又把它改回原來的狀態),這樣數據本身就完全沒有改變,扇區保留了快照設備的一部分。這意味著它總是從快照設備中讀取。如果發生崩潰,您只需恢復dmsetup配置,就不會再訪問源設備以獲取元數據。

不過,您可能需要一個具有較小集群大小的相當大的快照。但是您不必一次記憶體整個文件系統元數據。您可以設置快照,記憶體目錄樹的元數據,從那裡複製所有文件,刪除快照,創建新快照並記憶體下一個子樹的元數據。您可以看到(IIRC with dmsetup status)有多少快照空間正在使用中。

為了編寫 inode,您可以更改時間戳 ( touch /path/to/file),尤其是在您不需要原始值的情況下。或者您(可能在某處寫入原始值之後)執行 eg chmod o=rwx /path/to/file ; chmod o= /path/to/file。為了寫入屬於目錄條目的所有扇區,您可以重命名所有文件(使用一些未使用的名稱並返回):

unique_suffix=4itxIIq5kyGhMVPJ
mv "$file" "${file}${unique_suffix}"
mv "${file}${unique_suffix}" "$file"

我不確定頁面記憶體是否足夠聰明,可以檢測到沒有更改,因此您可以檢查快照是否真的被寫入。

應該對所有文件進行這些操作(可能僅針對子目錄)

find /path/to/mountpoint -type f -exec ... + # for chmod and mv
find /path/to/mountpoint -type d -exec ... + # for mv

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