일부 파일 시스템에서는 파일을 생성할 때 파일 생성이 지속되도록 하려면 파일 자체뿐만 아니라 상위 디렉터리에서도 fsync()를 호출해야 합니다. 그렇지 않으면 마운트 해제 시 디렉토리 항목이 손실될 수 있습니다. 파일 inode가 고아가 됩니다.
ext4에서도 여전히 해당됩니까, 아니면 jornal이 이를 처리합니까?
많은 애플리케이션(예: strace로 확인된 vim)은 파일에서만 fsync를 호출하는 것 같습니다. 그게 안전한가요?
업데이트: 에서커밋 14ece1028b3ed53ffec1b1213ffc6acaf79ad77c커널에 대해 ext4는 특별히 변경되어 다음과 같습니다.저널링이 비활성화된 경우, 파일 자체를 fsync()할 때 상위 디렉터리 항목이 자동으로 fsync()됩니다. 하지만 활성화된 저널링은 어떻습니까? fsync() 디렉터리는 새 inode 생성과 동일한 트랜잭션의 일부이므로 암시적입니까?
답변1
부분적으로는 "의존적"이라고 말하고 싶습니다. 왜냐하면 ext4는 저널 옵션을 변경하여 전체 파일이나 메타 데이터만 기록할 수 있고 이러한 항목이 즉시 커밋되는지 여부는 부분적으로 하드웨어 구성에 따라 달라지기 때문입니다.
최소한 메타데이터 저널링을 사용하여 ext4가 마운트되고 하위 시스템이 쓰기를 캐싱하지 않는 경우 디렉터리를 fsync할 필요가 없다고 제안합니다.
POSIX와 심지어 ext4도 fsync를 사용하더라도 시스템 충돌 시 파일이 유지된다는 보장을 제공하지 않는다는 점에 유의해야 합니다.
완전한 답변은 아니지만 문제의 블로그 게시물은 저널링 및 데이터 손실 문제에 대해 자세히 설명합니다. 최근은 아니지만, 나는 그것이 오늘날 여전히 ext4의 상태를 나타내고 fsync를 언제 사용할지 또는 사용하지 않을지에 대한 그의 의견이 장점이 있다고 믿습니다.