파일 시스템은 어떻게 디스크에 블록을 원자적으로 기록합니까?

파일 시스템은 어떻게 디스크에 블록을 원자적으로 기록합니까?

블록은 파일 시스템에서 제공하는 추상화이며 블록 크기는 디스크 섹터 크기의 정수배입니다. 파일 시스템이 블록 크기로 4K를 사용하고 디스크 섹터 크기가 512B라고 가정합니다. 파일 시스템이 디스크 드라이버에 쓰기 요청을 보낼 때,전체 4K 블록을 디스크에 원자적으로 쓰는 방법(부분 쓰기 방지) 나는 최신 커널이 이 문제를 어떻게 해결하는지 알고 싶지만 답을 찾기 위해 Linux 코드 기반을 파헤치고 싶지는 않습니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변1

디스크는 허용해야합니다부서원자적으로 작성합니다. 섹터 크기는 512바이트인 반면, 오늘날의 더 큰 디스크는 일반적으로 4096바이트입니다.

부분적으로 작성된 "청크"로 인한 문제를 피하려면 모든 것을 특정 순서로 작성하는 것이 중요합니다.

유일한 이유는 다음과 같습니다.부분적으로 작성됨파일 시스템의 일부에 전원이 공급되지 않습니다.

방법은 다음과 같습니다

  • 먼저 모든 파일 내용을 작성하고 이것이 작동하는지 확인하십시오.

  • 그런 다음 메타데이터를 작성하고 메타데이터의 모든 데이터 구조가 단일 디스크 섹터에 들어가고 섹터 경계를 넘지 않는지 확인하십시오. 예를 들어 디렉터리의 내용인 가변 길이 파일 이름의 경우 이는 중요합니다.

답변2

이는 기본 스토리지 기술에 따라 다릅니다.

일부 저장소에서는 특정 블록 크기(일반적으로 2의 거듭제곱, 최소 256, 일반적으로 1kB-4kB 범위)의 원자 저장을 허용합니다. 이 경우 파일 시스템 계층은 블록 교체로 인해 유효한 시스템 상태가 되는 경우 해당 블록을 교체할 수 있습니다. 파일 내용을 쓸 때는 괜찮지만(Unix는 이에 대한 원자성을 보장하지 않습니다) 파일 시스템 메타데이터를 쓸 때는 그렇지 않습니다.

디스크 계층의 협력이 필요하지 않은 또 다른 접근 방식(한 블록을 쓰면 다른 블록의 내용이 손상되지 않는다는 점을 아는 것 제외)은 기존 블록을 절대 지우지 않고 항상 현재 사용되지 않는 저장소 블록에 쓰는 것입니다. 쓰기가 성공하면 블록에 대한 참조가 다른 블록에 추가되어 이전 버전의 블록에 대한 참조를 대체할 수 있습니다. 한 블록을 업데이트하려면 다른 블록을 업데이트해야 하고, 다시 다른 블록을 업데이트해야 하는 등의 작업이 수행되므로 속도가 느려집니다. 시스템이 여러 복사본을 유지하는 블록에서 반복이 중지됩니다. 복사본 중 하나에 쓰는 동안 충돌이 발생하면 다른 복사본이 사용됩니다. 복제본이 3개 이상인 경우 다수 비교를 기반으로 올바른 복제본을 선택할 수 있고, 복제본이 2개인 경우 체크섬을 기반으로 올바른 복제본을 선택할 수 있습니다.

그리고 거기에는로그 구조파일 시스템, 블록은 블록 목록 끝에 지속적으로 추가됩니다. 파일 시스템의 기본 메타데이터는 마지막 유효한 블록에서 발견된 모든 것입니다. 마지막 블록은 블록 타임스탬프와 체크섬을 확인하여 결정됩니다.

(참고: 이 답변은 일반적인 파일 시스템 구현 질문에 대한 것입니다. 다양한 Unix 변형의 다양한 저장 매체에 있는 다양한 파일 시스템이 실제로 무엇을 하는지 확인하지 않았습니다.)

답변3

일반적으로 모든 최신 운영 체제에는 파일에 데이터를 쓰기 위한 시스템 호출이 있습니다(Linux에는 write시스템 호출이 있습니다).

모든 시스템 호출은 원자적이어야 하기 때문입니다. 따라서 전체 블록 크기 쓰기(1개의 시스템 호출만 사용)는 원자적입니다.

관련 정보