기원
~에서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*
줄게
파일에 "newcontent"가 포함되어 있습니다. file.tmp가 존재하지 않습니다
. "oldcontent"가 포함된 파일에 "newcontent"가 포함되어 있거나 길이가 0이거나 전혀 존재하지 않을 수 있습니다.
이 접근 방식은 file
일관성("새 콘텐츠" 또는 "이전 콘텐츠" 포함)을 보장하지만 충돌 후 새 데이터가 복구될 수도 있고 복구되지 않을 수도 있습니다. ( mv file.tmp file
심지어 주어진더 흥미로운 결과)
질문
"이전 콘텐츠"나 "새 콘텐츠"가 손실되지 않도록 충돌 시 작업을 재개하는 방법을 구현하고 싶습니다. 어떻게 해야 하나요?
이는 다음을 보장합니다:
file
"오래된 콘텐츠"가 있거나 "file.tmp
새 콘텐츠"가 있습니다.- 또는
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
답변1
두 파일의 내용이 디스크에 있는지 확인한 sync
후 이동합니다 . echo "newcontent" > file.tmp
이는 " files.tmp
길이가 0일 수 있는" 변형을 제거합니다.
나중에 충돌이 발생할 경우 나머지 불확실성은 sync
디렉토리 항목에만 관련됩니다.즉어떤 파일이 어디를 가리키는지. 이동 후 sync
남은 가능성은 귀하가 나열한 것입니다.
file
"이전 콘텐츠"가 존재하고 "이전 콘텐츠"가 포함되며,file.tmp
"새 콘텐츠"가 존재하고 포함됩니다.file
존재하고 "newcontent"를 포함하지만file.tmp
존재하지 않습니다.
다른 곳에 연결하여 file.tmp
추가 안전 장치를 추가할 필요가 없습니다.
이동하면 sync
다른 결과가 발생합니다. 특히 데이터 손실에 더 많은 시간이 소요됩니다.앞으로이것 sync
.