首頁>Linux>source
来源

来自https://btrfs.wiki. kernel.org/index.php/FAQ#what_are_the_crash_guarantees_of_overwrite-by-rename.3F

Overwriting an existing file using a rename is atomic. That means that either the old content of the file is there or the new content. A sequence like this:

 
echo "oldcontent" > file
# make sure oldcontent is on disk
sync
echo "newcontent" > file.tmp
mv -f file.tmp file
# *crash*

愿意给

檔案包含" newcontent"; file.tmp不存在
檔案包含" oldcontent"; file.tmp可能包含" newcontent",长度為零或根本不存在。

這種方法保證保持 file 一致(它將具有" newcontent"或" oldcontent"),但是崩潰後可能無法恢複新資料. ( mv file.tmp file 甚至提供了更有趣的結果

問题

我想找到一種在發生崩潰的情况下恢複操作的方法,在该情况下我不会丢失" oldcontent"或" newcontent".我该怎麼办?

是否可以保證拥有:

  • either file 有" oldcontent"和 file.tmp 拥有" newcontent"
  • file 具有" newcontent"和 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
最新回復
  • 5月前
    1 #

    通過移動 syncecho "newcontent" > file.tmp之後 ,請確保两个檔案的內容都在磁盤上.這將删除" files.tmp 可能是零长度"變體。

    剩餘的不確定性(如果在 sync之後發生崩潰) ,仅涉及目錄條目,该檔案指向何處.移動 sync之後 ,剩下的就是您列出的那些可能性:

      file 存在並包含" oldcontent"和 file.tmp 存在並包含" newcontent";

      file 存在並包含" newcontent"和 file.tmp 不存在。

      鏈接 file.tmp無需添加其他故障保险 其他地方。

      移動 sync 確實還有其他後果:尤其是,在 sync之前留出了更多時間进行資料丢失

相似問題

  • find:遞迴地删除所有檔案+檔案夹,但solaris中的特定檔案除外
  • apache httpd:如何通過SSL傳遞在反向代理中添加X-Forwarded-for標頭