먼저 신화를 버리자.
원 자성이므로 불일치가 발생할 수 없습니다
동일한 파일 시스템 (예 :) rename
시스템 호출 내에서 파일을 이동하는 것은 소프트웨어 환경과 관련하여 원 자성입니다. 원자 성은 파일을 찾는 모든 프로세스가 이전 위치 또는 새 위치에서 파일을 볼 수 있음을 의미합니다. 프로세스가 파일의 링크 수가 다른지 또는 대상 디렉토리에있는 파일이 소스 디렉토리에 있거나 소스에없는 파일이 대상 디렉토리에없는 것을 관찰 할 수 없습니다. 예배 규칙서.
그러나 버그, 디스크 오류 또는 전원 손실로 인해 시스템이 충돌하는 경우 파일 시스템이 일관된 상태로 유지된다고 보장 할 수는 없습니다. Linux는 일반적으로 하드웨어 이벤트와 관련하여 원 자성을 보장하지 않습니다.
먼저 새 디렉토리에 dir 항목을 복사 한 다음 이전 디렉토리에 대한 항목을 지우므로 파일이 두 번 참조되는 불일치가 발생할 수 있지만 참조 횟수는 1입니다.
이것은 특정 구현 기술을 나타냅니다. 다른 것도 있습니다.
그것은 그래서 어떻게 리눅스의 ext2을 (커널 3.16 현재)이 특정 기술을 사용합니다. 그러나 이는 두 개의 작업 (새 항목 추가, 이전 항목 제거)이 하드웨어 수준에서도 원자 적이 지 않기 때문에 디스크 내용이 [이전 위치] → [두 위치] → [새 위치] 순서를 거치는 것을 의미하지는 않습니다. : 파일 시스템 중 하나가 중단되어 파일 시스템이 일치하지 않는 상태가 될 수 있습니다. (fsck가이를 복구 할 수 있기를 바랍니다.) 또한 블록 계층은 쓰기 순서를 바꿀 수 있으므로 충돌의 직전 절반이 디스크에 커밋되고 나머지 절반은 수행되지 않을 수 있습니다.
시스템이 충돌하지 않는 한 (위 참조) 시스템 카운트로 확장되지 않는 한 참조 카운트는 1과 다른 것으로 절대 관찰되지 않습니다.
먼저 포인터를 지우고 포인터를 복사하여 파일이 참조 0을 갖지 않도록합니다.
다시 한 번, 이는 특정 구현 기술을 나타냅니다. 시스템이 충돌하지 않으면 매달린 파일을 관찰 할 수 없지만 적어도 일부 구성에서는 시스템 충돌의 결과 일 수 있습니다.
Alexander Larsson의 블로그 게시물에 따르면 ext2는 시스템 충돌에 대한 일관성을 보장하지 않지만 ext3는 data=ordered
모드 에서 작동합니다. (이 블로그 게시물은 rename
그 자체가 아니라 파일에 쓰고 파일을 호출하는 조합에 rename
관한 것입니다.)
ext2, ext3 및 ext4 파일 시스템의 주요 저자 인 Theodore Ts'o 는 같은 문제에 대한 블로그 게시물을 작성했습니다 . 이 블로그 게시물은 원 자성 (소프트웨어 환경에 대해서만)과 내구성 (충돌에 대한 원 자성 및 약속 보장, 즉 작업이 수행되었음을 알고 있음)에 대해 설명합니다. 불행히도 충돌 자체와 관련하여 원자성에 대한 정보를 찾을 수 없습니다. 그러나 ext4에 제공되는 내구성 보증 rename
은 원 자성을 요구합니다 . 된 ext4에 대한 커널 문서 상태는와 ext4가 있음을 auto_da_alloc
뿐만 아니라, ext4에 (현대 커널에 기본값) 옵션은 대한 내구성 보증 제공 write
a로 다음을rename
rename
하드웨어 충돌과 관련하여 원자적임 을 의미합니다 .
BTRFS를 들어, 기존 파일을 덮어 씁니다은 충돌에 대한 원자 보장되지만 파일을 덮어 쓰지 않습니다 그 어느 파일이나 기존의 두 파일이 발생할 수 있습니다.rename
rename
요약하면, 귀하의 질문에 대한 답변은 ext2의 충돌과 관련하여 원자가 아닌 파일을 이동시킬뿐만 아니라 파일을 일관된 상태로 유지한다고 보장 할 fsck
수 없다는 것입니다. 더 좋은 파일 시스템이 발명 된 이유는 거의 없습니다. Ext3, ext4 및 btrfs는 제한된 보증을 제공합니다.
rename
가 원 자성을 보장한다고 생각 하지만 btrfs는 위키에 따르지 않습니다 (내 대답 참조). 저널없이 원 자성을 보장하는 것도 가능하다 (리눅스의 예제는 모르지만 일부는있을 수있다). ext2에 대한 신뢰할 수있는 정보가 있습니까?