기원

기원

기원

~에서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.

관련 정보