완전한 데이터 로그가 있으면 데이터가 디렉토리에 즉시 나타나는 이유는 무엇입니까?

완전한 데이터 로그가 있으면 데이터가 디렉토리에 즉시 나타나는 이유는 무엇입니까?

ext3 파일 시스템의 전체 데이터 로그에 대해 질문이 있습니다. 매뉴얼 페이지에서는 다음을 설명합니다.

data=journal
All data is committed into the journal prior to being written into
the main filesystem.

나에게 이것은 파일이 먼저 로그에 저장된 다음 파일 시스템에 복사된다는 것을 의미합니다.

뭔가를 다운로드하면 먼저 로그에 저장한 다음 완료되면 FS로 전송해야 한다고 생각합니다. 그러나 시작 후에는 다운로드한 파일이 디렉터리(FS)에 나타납니다. 이게 무슨 문제야?

편집하다:"모든 데이터" = 파일의 전체 크기라고 생각하는 것이 잘못된 것일까요? 그렇다면 모든 데이터가 단지 하나의 블록이거나 무엇인가일 수 있고 애초에 로그에 기록되는 내용을 볼 수 없다면 말이 됩니까? !

답변1

첫째, "모든 데이터"가 전체 파일이 정확하다는 의미는 아니라고 의심합니다. 실제로 이 파일 시스템 계층은 전체 파일이 아닌 고정 크기의 파일 블록에서 작동합니다. 이 수준에서는 제한된 양의 데이터를 유지하는 것이 중요하므로 전체 파일(임의로 클 수 있음)을 처리하는 것은 불가능합니다.

둘째, 귀하의 질문에 오해가 있습니다. 디렉토리 내용을 보면 저널링 동작을 관찰할 수 없으며 ls훨씬 낮은 수준에서 작동합니다. 일반 도구를 사용하면 항상 파일이 표시됩니다. (파일을 생성해도 생성되지 않는 것으로 나타나면 재앙이 될 것입니다.) 뒤에서 일어나는 일은 파일이 다른 방식으로 저장될 수 있다는 것입니다. 먼저 처음 몇 블록이 로그에 저장됩니다. 그런 다음 최대한 효율적으로 데이터를 최종 위치로 이동합니다. 그것은 여전히 ​​같은 디렉토리에 있는 같은 파일이고 단지 다르게 저장되었을 뿐입니다.

로그 동작을 관찰하는 유일한 방법은 커널이 디스크에 무엇을 쓰고 있는지 확인하거나 충돌 후 디스크 내용을 분석하는 것입니다. 정상적인 작업에서 로그는 구현 세부 사항입니다. 실행 중인 것을 볼 수 있다면(성능 측면 외에도) 심각하게 손상될 것입니다.

파일 시스템 로그에 대한 자세한 내용을 보려면 다음으로 시작하는 것이 좋습니다.위키피디아 기사. ext3 용어로 말하면, data=journal시스템이 충돌하는 경우 모든 파일이 충돌 전 특정 시점의 상태로 유지됩니다(버퍼링으로 인해 항상 최신 상태는 아님). 이것이 자동으로 발생하지 않는 이유는 커널이 효율성을 높이기 위해 디스크 쓰기 순서를 변경하기 때문입니다(이는 큰 영향을 미칠 수 있음). 이것은 ... 불리운다"물리학 저널"Wikipedia 기사에서. 다른 두 패턴 ( data=ordereddata=writeback)은 다음과 같은 형식입니다."논리일기": 속도는 더 빠르지만 파일이 손상될 수 있습니다. 이 로그는 가비지를 포함하는 소수의 파일로 손상 위험을 제한합니다. ext3은 항상 전체 메타데이터 로그를 사용합니다. 메타데이터 로그가 없으면 메타데이터가 손실되어 심각한 파일 시스템이 손상될 수 있습니다. 또한 로그가 없는 경우 충돌 후 복구에는 전체 파일 시스템 무결성 검사가 필요한 반면, 로그를 사용한 복구는 일부 로그 항목을 재생하는 것을 의미합니다.

저널링을 사용하더라도 일반적인 UNIX 파일 시스템은 전역 파일 시스템 일관성을 보장하지 않으며 기껏해야 파일별 일관성만 보장합니다. 즉, file 에 쓴 foo다음 file 에 쓰고 bar시스템이 충돌한다고 가정합니다. bar새로운 콘텐츠가 있어도 foo여전히 오래된 콘텐츠가 있을 수 있습니다 . 완전한 일관성을 위해서는거래상의파일 시스템.

답변2

뭔가를 다운로드하면 먼저 로그에 저장한 다음 완료되면 FS로 전송해야 한다고 생각합니다.

파일을 닫은 후에만 파일이 나타난다는 의미입니다. 이는 Ext4의 선택적 동작과 유사합니다.설치 옵션부르다 auto_da_alloc.

auto_da_alloc|noauto_da_alloc

noauto_da_alloc이 다음 패턴을 통해 기존 파일을 대체할 때 많은 손상된 애플리케이션이 fsync()를 사용하지 않습니다.

fd = open("foo.new")/write(fd,..)/close(fd)/ rename("foo.new", "foo")

또는 더 나쁘다

fd = 열기("foo", O_TRUNC)/쓰기(fd,..)/닫기(fd).

auto_da_alloc이 활성화된 경우 ext4는 rename을 통한 교체 및 잘림을 통한 교체 모드를 감지하고 이름 바꾸기() 작업 후 기본 data=ordered 모드에서 다음 로그 커밋에 지연된 할당 블록이 강제로 할당되도록 합니다. 새 파일이 디스크에 강제로 저장됩니다. 이는 ext3과 거의 동일한 수준의 보장을 제공하며 지연 할당된 블록이 디스크에 강제로 기록되기 전에 시스템이 충돌할 경우 발생할 수 있는 "길이가 없는" 문제를 방지합니다.

관련 정보