답변:
dd는 언제 데이터 복사에 적합합니까? (또는, read () 및 write () partial) 은 count
다음을 dd
사용할 때 중요한주의 사항을 지적합니다 : 부분 블록을 복사 할 수 있으므로 주어진 count
블록 수 이후에 일부 블록이 불완전하더라도 중지됩니다. 따라서 bs * count
를 지정하지 않으면 복사 된 바이트 수보다 적은 바이트로 끝날 수 있습니다 iflag=fullblock
.
dd 의 기본 블록 크기 는 512 바이트입니다. count
한계입니다. 귀하의 질문에 따르면 유한 크기의 장치를 복사 할 때 필요하지 않으며 실제로 장치의 일부만 복사하기위한 것입니다.
여기서 고려해야 할 두 가지 측면이 성능과 데이터 복구라고 생각합니다.
성능과 관련하여 블록 크기는 기본 물리적 블록 크기와 같거나 그보다 여러 배가되어야합니다 (따라서 CD-ROM을 읽을 때 2048 바이트). 실제로 오늘날에는 더 큰 블록 크기를 지정하여 기본 캐싱 시스템이 사용자를 대신하여 버퍼링 할 수있는 기회를 제공 할 수 있습니다. 그러나 블록 크기를 늘리면 dd
훨씬 더 많은 메모리를 사용해야하며 패킷 조각화로 인해 네트워크를 통해 복사하는 경우 비생산적 일 수 있습니다.
데이터 복구와 관련하여 더 작은 블록 크기를 사용하면 고장난 하드 디스크에서 더 많은 데이터를 검색 할 수 있습니다. 이것들은 dd-rescue
자동적으로 같은 프로그램입니다 : 그들은 처음에 큰 블록을 읽지 만, 블록이 실패하면 더 작은 블록 크기로 다시 읽습니다. dd
이 작업을 수행하지 않으면 전체 블록이 실패합니다.
주위에 약간의화물 컬트가 있습니다 dd
. 원래 cp
문제를 일으킨 두 가지 버그가있었습니다 . 512 이외의 블록 크기 (리눅스는 1024의 블록 사용)로보고 될 때 파일을 희소하게 탐지하고, 스파 스 파일을 블록 장치로 보냅니다.
초기 리눅스 메일 링리스트 아카이브 에서 이것에 대한 언급을 찾을 수있다 .
그래서 사람들은 디스크 이미지를 처리하는 올바른 방법으로 dd에 익숙해졌으며 cp는 길가에 떨어졌습니다. dd는 기본 블록 크기 인 512를 사용하므로 속도가 느립니다 (현대 시스템에서는 cp보다 느림). 그러나 어떤 블록 크기를 사용해야하는지 확실하지 않습니다. 아마도 귀하의 경우 누군가 2048가 CD-ROM의 "자연"블록 크기라는 것을 읽었으며 (즉, CD-ROM은 오류 수정 정보와 함께 2,048 바이트의 데이터를 포함하는 2,352 바이트 섹터로 나뉘어져 있습니다) dd와 함께 사용할 "올바른"크기입니다. 실제로 (보통) 큰 블록 크기를 사용하면 더 빠른 결과를 얻을 수 있습니다. 실제로 GNU cp는 이러한 이유로 기본 블록 크기 인 64k를 사용합니다.
tl; dr : cp /dev/dvd foobar.iso
제대로 작동합니다. 기본 블록 크기 dd
는 512입니다. 대부분의 현대적인 환경에서 단독으로 남겨 둘 수있는 유일한 효과는 복사 프로세스를 느리게하는 것입니다.
블록 크기를 변경하면 한 번에 버퍼링되거나 읽거나 쓰는 양을 변경할 수 있습니다.
실제 블록 장치인지 무한 / 가상 장치인지는 실제로 관련이 없습니다. 메모리에 저장하기 전에 메모리에 저장하려는 양에 관한 dd
것입니다. (한 번에 읽는 데이터 bs=
양 ibs=
)과 obs=
(한 번에 쓰는 데이터 양)을 설정합니다. 하여 더 높은 obs=
의 더 반복 ibs=
하면 충분한 데이터가 전에 필요합니다 dd
대상에 쓰기 시작하기를.
count=
또한 당신이하고 싶은 것 이외의 것에 의존하지 않습니다. 작업이 완료된 것으로 간주하는 ibs=
데 필요한 "블록"수를 제어합니다 dd
.
dd
부분 블록 복사의 Stephens 요점은 항상 그런 것은 아닙니다 bs * count
.
dd
없으면 bs=2048
오류가 발생합니다.
blocksize 옵션을 on으로 사용하면 dd
출력 I / O 서브 시스템에 다시 쓰기를 시도하기 전에 입력 I / O 서브 시스템에서 메모리로 복사 할 데이터의 양 을 효과적으로 지정합니다. 출력은 동일합니다 (전체 디스크를 복사 할 때와 동일). 청크는 지정한 다른 크기로 읽히고 있습니다 (대부분의 dd
구현은 기본 블록 크기가 512 바이트입니다).
많은 양의 스페어 메모리가 있고 블록 크기를 늘리면 더 큰 데이터 청크를 연속적으로 읽고 버퍼링하고 출력 대상으로 플러시 할 수 있습니다. 블록 크기가 작을수록 각 개별 lseek, memset 등의 측면에서 더 많은 오버 헤드가 필요합니다.
메모리가 부족한 경우 및 설정 위치 if=
및 사용 of=
중인 하드웨어 에 따라 마일리지가 달라질 수 있습니다 .
기지국 = 블록 크기를 읽거나 쓸 수를 나타낸다. 필드를 그대로 두거나 지정하지 않으면 복사와 동일한 작업을 수행하는 것처럼 보이지만 필드를 사용하는 데 숨겨진 사실이 있습니다. 예를 들어
첫 번째 경우 더 작은 블록 크기를 사용하면 복사 속도가 증가하는 것으로 나타났습니다. 후자의 경우 블록 크기가 높을수록 섹터 크기가 커져 sector change
명령 수가 적어 지므로 일반적으로 I / O 작업이 빨라집니다.
dd bs=4m iflag=fullblock
vs를 사용하여 파티션 이미지를 SD 카드에dd bs=1111
기록하고 전자가 제공하는 데이터 속도가 상당히 높음을 알 수 있습니다. 전자는 SD 카드의 자연스러운 블록 크기와 일치하지만 후자는 SD 컨트롤러가 부분적인 물리적 블록을 쓰기 위해 많은 읽기, 복사 및 재 플래시를 수행해야하기 때문입니다.fullblock
그것이 없으면,bs
최대 및 부분 판독 만이 지속적인 후속 오정렬로 이어질 수 있기 때문에 그 중요성을 과소 평가해서는 안된다 .