동일한 파티션(EXT2)에 두 개의 폴더가 있습니다. mv folder1/file folder2
정전 등의 중단이 발생하면 파일 시스템이 일관성을 잃게 됩니까?
작업이 mv
원자적이지 않습니까?
고쳐 쓰다: 지금까지 나는 IRC에 대해 다음과 같은 견해를 얻었습니다.
- 원자적이므로 불일치가 발생할 수 없습니다.
- 먼저 디렉터리 항목이 새 디렉터리에 복사된 다음 이전 디렉터리의 항목이 삭제되므로 파일이 두 번 참조되지만 참조 횟수가 1인 불일치가 발생할 수 있습니다.
- 먼저 포인터를 지운 다음 복사하므로 파일의 참조가 0이라는 불일치가 있습니다.
누군가 이것을 명확히 할 수 있습니까?
답변1
이름 바꾸기 작업은 모든 파일 시스템에서 매우 빠르므로 중단될 가능성이 없지만 클래식 파일 시스템에서는 확실히 중단됩니다.할 수 있는손상됨 - 대상 링크를 먼저 생성한 경우 파일에 두 개의 링크가 남을 수 있습니다. 이는 합법적이지만 파일은생각하다하나만 있는데 나중에 삭제하면 문제가 발생할 수 있습니다. 반면, 소스 링크를 먼저 제거하면 파일이 손실될 수 있습니다. fsck를 실행하면 일반적으로 두 상황 중 하나를 감지하고 수정하지만 파일이 누락된 경우 원하는 위치에 배치되지 않고 임의의 이름을 가진 "lost+found" 디렉토리에 배치됩니다. 링크가 두 개인 경우 count는 단순히 업데이트되므로 파일 시스템이 지원하는 경우 파일이 두 위치 모두에 존재하게 됩니다.
정전에 강한 파일 시스템이 필요한 경우,저널링 파일 시스템을 사용해야 합니다., NTFS, EXT3 또는 XFS와 같은. 대부분의 최신 시스템은 기본적으로 저널링 파일 시스템을 사용하지만 외장 드라이브와 함께 FAT를 사용하는 경우 저널링 파일 시스템이 아니라는 점을 알아야 합니다.
저널링 파일 시스템은 "이중 입력" 시스템을 사용합니다. 즉, 저널 파일이 이동될 예정이라는 사실을 기록한 다음 이동을 수행합니다. 시작 시 파일 시스템을 확인할 때 중단되면 이동이 아직 완료되지 않았음을 알리고 다시 실행합니다.
저널링 파일 시스템에는 메타데이터 저널링과 전체 저널링이라는 두 가지 유형이 있습니다. 메타데이터 로깅은 로깅 시스템의 파일 내용에 대한 변경 사항을 추적하지 않지만(따라서 파일에 쓰면 내용이 손실될 수 있음) 디렉터리 내용, 파일 속성 등과 같은 중요한 파일 시스템 정보를 계속 추적함을 의미합니다. .
사람들이 원자성 이름 바꾸기 작업에 대해 이야기할 때, 이는 시스템의 다른 프로세스가 변환 중에 이를 관찰할 수 없고 mv
예를 들어 인터럽트 명령 자체를 사용하여 절반을 완료할 수 없다는 것을 의미합니다 ^C. 각 디렉터리(저장 공간이 디스크의 완전히 다른 위치에 있을 수 있음)에 쓰는 물리적 프로세스는 하드웨어 수준에서 실제로 원자적인 작업이 될 수 없습니다.
완전성을 기하기 위해 대상 디렉토리에 새 링크를 생성하고 이전 디렉토리에서 삭제하는 것 외에도 이름 바꾸기와 관련된 부수적인 I/O 작업이 있다는 점에 유의하겠습니다. 즉, 두 디렉토리의 mtime을 업데이트하는 것입니다. 대상 디렉터리의 할당 크기를 확장하고, ..
파일이 디렉터리인 경우 상위 디렉터리의 링크와 링크 수를 변경합니다. 또한 파일 자체의 atime이 영향을 받는지 확실하지 않습니다.
답변2
먼저 몇 가지 오해를 바로잡겠습니다.
원자적이므로 불일치가 발생할 수 없습니다.
동일한 파일 시스템 내에서 파일 이동(예:rename
) 시스템 호출은 소프트웨어 환경에 대해 원자적입니다. 원자성은 파일을 찾는 모든 프로세스가 이전 위치나 새 위치에서 파일을 볼 수 있음을 의미합니다. 어떤 프로세스도 파일의 링크 수가 다르거나 파일이 대상 디렉터리에 존재한 후 소스 디렉터리에 존재한다는 것을 관찰할 수 없습니다. , 또는 파일이 원본 디렉터리에 존재하지 않은 후 대상 디렉터리에 존재하지 않습니다.
그러나 버그, 디스크 오류 또는 정전으로 인해 시스템이 충돌하는 경우 파일 시스템이 일관된 상태로 유지된다는 보장은 없으며 이동이 중단되지 않는다는 보장도 없습니다. Linux는 일반적으로 하드웨어 이벤트에 대한 원자성 보장을 제공하지 않습니다.
먼저 디렉터리 항목이 새 디렉터리에 복사된 다음 이전 디렉터리의 항목이 삭제되므로 파일이 두 번 참조되지만 참조 횟수가 1인 불일치가 발생할 수 있습니다.
이는 구체적인 구현 기술을 나타냅니다. 아직 더 많은 것을 얻었습니다.
일어나는 대로리눅스의 ext2(커널 3.16 기준) 이 특별한 기술을 사용하십시오. 그러나 이는 디스크 내용이 [이전 위치] → [두 위치] → [새 위치] 순서로 진행된다는 의미는 아닙니다. 왜냐하면 이 두 작업(새 항목 추가, 이전 항목 삭제)이 하드웨어 수준에서 원자적이지 않기 때문입니다. 둘 중 하나: 이들 중 하나가 중단되어 파일 시스템이 일관되지 않은 상태가 될 수 있습니다. (fsck가 이 문제를 해결하길 바랍니다.) 또한 블록 계층은 쓰기 순서를 변경하여 충돌이 발생하기 전에 전반부는 디스크에 커밋되고 후반부는 실행되지 않도록 할 수 있습니다.
시스템이 충돌하지 않는 한(위 참조) 참조 횟수는 1과 다른 것으로 관찰되지 않습니다. 그러나 이 보장은 시스템 충돌로 확장되지 않습니다.
먼저 포인터를 지운 다음 복사하므로 파일의 참조가 0이라는 불일치가 있습니다.
다시 말하지만 이는 특정 구현 기술을 나타냅니다. 시스템이 충돌하지 않은 경우 매달린 파일을 관찰할 수 없지만 이는 적어도 일부 구성에서 시스템 충돌로 인해 발생할 수 있는 결과입니다.
~에 따르면Alexander Larsson의 블로그 게시물, ext2는 시스템 충돌 시 일관성을 보장하지 않지만 ext3은 data=ordered
이 모드에서 일관성을 제공합니다. (이 블로그 게시물은 rename
그 자체에 관한 것이 아니라 파일에 쓰는 것과 해당 파일을 호출하는 것의 조합에 관한 것 입니다 rename
.)
ext2, ext3 및 ext4 파일 시스템의 주요 작성자인 Theodore Ts'o는 다음과 같이 썼습니다.동일한 문제에 대한 블로그 게시물. 이 블로그 게시물에서는 다음과 같이 설명합니다.원자성(소프트웨어 환경에만 해당) 및내구성(이것은 충돌의 원자성과 작업이 수행되었음을 알 수 있다는 약속에 관한 것입니다.) 불행히도 충돌에만 관련된 원자성에 대한 정보를 찾을 수 없습니다. 그러나 ext4에 제공되는 내구성 보장은 rename
원자적이어야 합니다.ext4용 커널 문서auto_da_alloc
옵션(최신 커널의 기본값)을 사용하여 ext4를 선언하면 ext4가 write
뒤에 오는 내구성 보장을 제공합니다 . 즉 , 하드웨어 충돌과 관련하여 원자적이라는 rename
의미 입니다.rename
Btrfs의 경우,rename
기존 파일 덮어 쓰기충돌에 관한 한 원자성이 보장되지만a는 rename
파일을 덮어쓰지 않습니다이로 인해 파일 중 하나가 존재하지 않거나 두 파일이 모두 존재하지 않을 수 있습니다.
요약하자면, 귀하의 질문에 대한 대답은 ext2의 충돌과 관련하여 파일을 이동하는 것이 원자적이지 않을 뿐만 아니라 파일을 일관된 상태로 두는 것도 보장되지 않는다는 것입니다( fsck
수정할 수 없는 오류는 드물지만). 이것이 더 나은 파일 시스템이 발명된 이유입니다. Ext3, ext4 및 btrfs는 제한된 보장을 제공합니다.
답변3
이 문제요청을 받았습니다슈퍼유저에서는 접근 방식이 약간 다릅니다. 명령에 대한 Wikipedia 페이지 mv
도 있습니다.설명하다매우 좋은:
동일한 파일 시스템 내에서 파일을 이동하는 것은 일반적으로 파일을 복사한 다음 원본 파일을 삭제하는 것과 다르게 구현됩니다. 이름 바꾸기 시스템 호출을 지원하지 않는 플랫폼에서는 새 링크가 새 디렉토리에 추가되고 원래 링크는 제거됩니다. 파일 데이터에 액세스되지 않았습니다.
리눅스는시스템 호출 이름 바꾸기따라서 파일 이름을 바꾸는 것은 원자성 작업, 즉 중단할 수 없는 작업입니다. 따라서 아니요, 귀하가 설명하는 상황에서는 파일 시스템이 불일치하지 않습니다.