Data-Recovery

通過額外的硬連結重命名的崩潰保證是什麼?

  • January 5, 2021

起源

來自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

通過移動syncafter echo "newcontent" > file.tmp,您可以確保兩個文件的內容都在磁碟上。這消除了“files.tmp可能是零長度”的變體。

剩下的不確定性,如果在 之後發生崩潰sync,只涉及目錄條目,哪個文件指向哪裡。移動 後sync,剩下的可能性就是您列出的那些:

  • file存在且包含“舊內容”,file.tmp存在且包含“新內容”;
  • file存在並包含“新內容”,並且file.tmp不存在。

無需通過連結file.tmp到其他地方來添加額外的故障保護。

移動 .sync確實會產生其他後果:特別是,它會sync.

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