dd가 데이터가 기록 될 때까지 기다리지 않는 이유는 무엇입니까?


20

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

$ 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가 깜박이기 시작합니다).

왜 이런 일이 생길까요?


3
확실해 /dev/sdc 시스템의 실제 장치이며 파일에 쓰지 않습니다. /dev/sdc? ~을해라. ls --color /dev - /dev/sdc 기기라면 노란색이어야합니다.
LawrenceC

답변:


21

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

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이 실행되면 데이터가 캐시에 빠르게 기록되고 쓰기 완료 상태가 프로세스로 전송됩니다. 버퍼가 필요할 때나 버스에 여유 시간이있을 때 데이터는 캐시에서 하드 디스크로 기록됩니다.


1
나는 당신의 대답과 광산이 거의 완전히 다른 접근법을 다루는 것을 좋아합니다. 좋아, +1.
ChrisInEdmonton

1
@ChrisInEdmonton 디토 +1
chaos

모든 대답은이 질문에서 좋다.
Francisco Tapia

@ chaos 그냥 명확히 : 이것은 커널의 기본 동작입니다. -그걸 의미 한 것이 였니 conv=fsync 다음과 같은 블록 장치에 쓸 때 기본값입니다. dd 아무것도 캐시하지 않습니까? 이것에 대한 좋은 대답을 찾고 : unix.stackexchange.com/questions/312687/...
Jonathan Komar

10

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

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


7

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.