Linux 是否提供帶有 Btrfs 的文件系統日誌?
NTFS 提供了一種叫做日誌的東西。我認為這是任何應用程序執行的文件重命名/移動/刪除等操作的記錄。Linux + BTRFS 上可以得到類似的日誌或登錄嗎?一個 BTRFS 分區,僅供一個 Linux 安裝使用。
我想你誤解了期刊的目的。它不是應用程序執行的操作的日誌,也不記錄哪個應用程序導致了更改。它不適用於使用者或管理員。它旨在作為文件系統的內部工具。
出於性能考慮,磁碟寫入並不總是按照它們發出的順序進行。如果系統在有時間寫入所有內容之前因電源故障或系統崩潰而中斷,則文件系統可能處於不一致狀態。例如,如果一個文件正在從一個目錄移動到另一個目錄,則可能包含舊目錄內容的磁碟塊已被寫入,但包含新目錄內容的磁碟塊尚未寫入。如果系統在此時停止,則不再從任一目錄引用該文件並且實際上失去了。
有幾種技術可以避免這個問題(這在文件系統設計中通常被稱為彈性)。許多文件系統,包括 NTFS,為此目的使用日誌。日誌按照執行順序記錄操作,並且每個操作都是原子添加的,因此讀取日誌始終會產生一致的狀態。有文件系統,稱為日誌結構文件系統,其中日誌是記錄有關文件系統內容的所有資訊的地方。對於其他人,包括 NTFS,所有資訊最終都寫入日誌之外:日誌僅包含可能尚未寫入其“正常”位置的最新資訊。讀取文件不訪問日誌,它直接在正常位置訪問數據。日誌僅在引導時讀取(更準確地說:在掛載文件系統時)以完成尚未執行的任何操作。
通常,對於非日誌結構的日誌文件系統,日誌將僅包含最近的操作。日誌通常空間有限,只要將相應的操作寫入磁碟,就可以覆蓋舊條目,這通常不會超過幾秒鐘。如果與期刊規模相比沒有太多活動,您仍然可以看到舊的日記條目,但這不是您可以指望的。
一些 Linux 文件系統(例如 ext4)使用日誌。但 Btrfs 不是其中之一。Btrfs 通過copy-on-write實現彈性。它永遠不會覆蓋正在使用的磁碟塊。為了進行更新,它使用新數據創建一個新塊,然後為包含需要更新的塊位置的任何位置創建一個新塊,然後為包含該位置的位置創建新塊,等等。當它到達根¹時,它確保所有子塊都被寫入,然後更新根。這樣,根始終引用始終有效的塊。
如果你想跟踪文件操作,文件系統日誌不是這樣做的方法,無論是在 Linux 還是在 Windows 上。Linux 上的主要工具是LoggedFS和審計子系統。請參閱是否可以找出創建給定文件的程序或腳本?並列出程序訪問的文件。
¹那是塊樹的根,而不是目錄樹的根。在這個細節級別上,區別並不明顯。