dd가 데이터가 기록 될 때까지 기다리지 않는 이유는 무엇입니까? 플래시 드라이브에 이미지를

때로는 플래시 드라이브에 이미지를 쓸 때 이런 일이 발생합니다.

$ sudo dd if=install57.fs of=/dev/sdc
573440+0 records in
573440+0 records out
293601280 bytes (294 MB) copied, 0.549231 s, 535 MB/s

기본적으로 리눅스는 모든 것을 캐시하고 아무것도 쓰지 않으며 dd 종료합니다. 입력 한 후 sync, 데이터 쓰기를 시작합니다 (플래시 드라이브 LED가 깜박이기 시작합니다).

왜 이런 일이 생길까요?



답변

이것을 대신 사용하십시오 :

sudo dd if=install57.fs of=/dev/sdc conv=fsync

이렇게하면 fsync() 매회마다 write() 시스템 호출. 이 세력 dd 아무것도 캐시하지 않습니다. fsync 맨 페이지의이 부분을 참조하십시오 ( man 2 fsync ) :

fsync() transfers ("flushes") all modified in-core data of (i.e., modified buffer cache
pages for) the file referred to by the file descriptor fd to the disk device (or other
permanent storage device) where that file resides. The call blocks until the device reports
that the transfer has completed. It also flushes metadata information associated with the
file (see stat(2)).

이것은 커널의 기본 동작입니다. Linux 커널은 다음과 같이 쓰기 및 읽기 캐시를 관리합니다. write() syscall이 실행되면 데이터가 캐시에 빠르게 기록되고 쓰기 완료 상태가 프로세스로 전송됩니다. 버퍼가 필요할 때나 버스에 여유 시간이있을 때 데이터는 캐시에서 하드 디스크로 기록됩니다.


답변

이것은 Linux 및 대부분의 다른 운영 체제에서 읽기 및 쓰기 캐시를 모두 수행하기 때문에 발생합니다. 대부분의 경우 운영 체제의 응답 성이 향상됩니다.

캐시 된 데이터가 작성되었는지 확인하려면 다음을 사용하십시오. sync, 아시다시피. Linux는 튜닝 할 수있는 많은 설정을 제공합니다. 이 기사 일부 설정에 대한 개요를 제공합니다. 예를 들어 vm.dirty_background_bytes를 0으로 설정하여 커널이 플러 셔 스레드를 즉시 시작하도록 할 수 있습니다.


답변

sync (8) – Linux 매뉴얼 페이지 :

커널은 (상대적으로 느린) 디스크를 피하기 위해 메모리에 데이터를 보관합니다.
  읽기 및 쓰기. 이렇게하면 성능이 향상되지만 컴퓨터
  충돌로 인해 데이터가 손실되거나 파일 시스템이 손상 될 수 있습니다.
  sync는 메모리의 모든 내용이 디스크에 기록되도록합니다.

노트 : unmount (또는 추출) 자동 호출 sync 이것은 보통의 파일 시스템 사용법에서 이것을 숨 깁니다.


답변