Data-Recovery
通過額外的硬連結重命名的崩潰保證是什麼?
起源
來自https://btrfs.wiki.kernel.org/index.php/FAQ#What_are_the_crash_guarantees_of_overwrite-by-rename.3F
使用重命名覆蓋現有文件是原子的。這意味著文件的舊內容或新內容存在。像這樣的序列:
echo "oldcontent" > file # make sure oldcontent is on disk sync echo "newcontent" > file.tmp mv -f file.tmp file # *crash*
會給任何一個
文件包含“新內容”;file.tmp 不存在
文件包含“舊內容”;file.tmp 可能包含“newcontent”,長度為零或根本不存在。
這種方法保證保持
file
一致(它將具有“新內容”或“舊內容”),但新數據可能會或可能不會在崩潰後恢復。(mv file.tmp file
給出更有趣的結果)問題
我想實現一種在發生崩潰時恢復操作的方法,我不會失去“舊內容”或“新內容”。我怎樣才能做到這一點?
是否保證:
- 要麼
file
有“舊內容”,file.tmp
有“新內容”- 或
file
具有“新內容”file.tmp
且不存在:echo "oldcontent" > file echo "newcontent" > file.tmp # make sure files are on disk sync # a crash may happen at any time starting from this point. ln file.tmp file.tmp2 mv -f file.tmp2 file rm file.tmp
通過移動
sync
afterecho "newcontent" > file.tmp
,您可以確保兩個文件的內容都在磁碟上。這消除了“files.tmp
可能是零長度”的變體。剩下的不確定性,如果在 之後發生崩潰
sync
,只涉及目錄條目,即哪個文件指向哪裡。移動 後sync
,剩下的可能性就是您列出的那些:
file
存在且包含“舊內容”,file.tmp
存在且包含“新內容”;file
存在並包含“新內容”,並且file.tmp
不存在。無需通過連結
file.tmp
到其他地方來添加額外的故障保護。移動 .
sync
確實會產生其他後果:特別是,它會在sync
.