2013-12-20 2 views
1

sync 매뉴얼 페이지를 기반으로 sync를 호출 한 후 디스크가 캐시를 플러시한다고 보장 할 수는 없습니다. 표준 사양 (예 : POSIX. 1-2001), sync()는 쓰기를 예약하지만 실제 쓰기가 완료되기 전에 되돌아 갈 수 있습니다. 그러나 버전 1.3.20 Linux가 실제로 대기합니다 (여전히 데이터 무결성을 보장하지 않습니다. 최신 디스크는 큰 캐시를 가짐). "sync/fsync/syncfs 이후의 데이터 무결성을 휴대 기기에 알리는 방법

그리고 fsync 매뉴얼에는 이에 대한 언급이 없습니다.

동기화를 호출 한 후 특히 디스크 (예 : 휴대용 장치)에 대한 모든 쓰기가 완료되었는지 확인하는 방법이 있습니까? sync/fsync를 호출 한 후 데이터 및 메타 데이터 정보가 디스크에 완전히 기록되지 않은 경우가 발생했습니다. windows/Linux에서 "안전하게 장치 제거"가 어떻게 모든 데이터가 장치 자체에 의해 완전히 작성되었는지 알고 있습니다.

답변

1

적어도 원칙적으로 이는 Linux 버그입니다. 동기화 기능의 사양은 데이터가 영구 저장 장치에 완전히 기록된다는 것입니다. 하드웨어 캐시에 남겨 두는 것은 적합하지 않습니다.

나는 정확한 해결 방법이 무엇인지 모르겠지만, 당신은 아마 -F 옵션 소스가 무엇을하고 있는지 볼 (또는 읽을 수있는 (내가 그 올바른 생각)하지만, 함께 실행 hwparm 유틸리티 strace이다 strace 수 있습니다 훨씬 쉬워).

+0

이 일을 "안전 장치를 제거"어떻게? 디스크 하드웨어 캐시가 완료되었음을 알 수 있습니다 (따라서 장치 전원을 차단하는 것이 안전합니다). – dragon135

2

windows/Linux에서 "안전하게 장치 제거"가 어떻게 모든 데이터가 장치 자체에 의해 완전하게 기록되었는지 알고 있습니다. IXish 시스템의

다음 umount command 또는 umount() system call를 사용하여

마운트 해제 USB 디바이스의 파티션.

blockdev --flushbufs 

을하는


장치의 버퍼를 플러시 수 있지만 다시 장치에 액세스하고 리필 버퍼에서 누구를 유지하지 않습니다.

/proc/sys/vm/drop_caches 

다른 버퍼를 플러시 할 수있다 :

축어

[

https://www.kernel.org/doc/Documentation/sysctl/vm.txt에서


또한 /proc 파일 시스템이 커널 인터페이스가있다. ..]

무료 dentries와 아이 노드 (210)

:

echo 2 > /proc/sys/vm/drop_caches 

[...]

+0

drop_caches는 장치/디스크 자체 버퍼와 관련이 없으며 커널의 더티 페이지에만 관련됩니다.fsync를 호출 한 후에, 커널의 버퍼가 장치로 전송 될 것이고, 그 후에 더티 페이지가 해제되지 않는다면 상관 없습니다. 그리고 blockdev --flushbufs에 대한 매뉴얼이 지워지지 않는다. 디바이스에 캐시를 플러시하도록 요청할 것인가? 그리고 블록 장치를 연 다음 fsync를 호출하면 장치가 캐시/버퍼를 플레이트에 쓰게됩니다. – dragon135

관련 문제