유한 크기의 장치를 복사 할 때 블록 크기를 지정하는 이유는 무엇입니까?


14

온라인 자습서에서는 종종 다음 명령을 사용하여 CDROM을 ISO 이미지로 복사하는 것이 좋습니다.

$ dd if=/dev/dvd of=foobar.iso bs=2048

바이트 크기를 지정해야하는 이유는 무엇입니까? 사실 2048은 CDROM 이미지표준 바이트 크기 이지만, dd지정하지 bs=않거나 count=작동 하지 않는 것 같습니다 .

유한 한 크기의 장치에서 지정 하지bs= 않거나 count=복사 할 때 어떤 상황에서 문제가 발생합니까?

답변:


12

dd는 언제 데이터 복사에 적합합니까? (또는, read () 및 write () partial)count다음을 dd사용할 때 중요한주의 사항을 지적합니다 : 부분 블록을 복사 할 수 있으므로 주어진 count블록 수 이후에 일부 블록이 불완전하더라도 중지됩니다. 따라서 bs * count를 지정하지 않으면 복사 된 바이트 수보다 적은 바이트로 끝날 수 있습니다 iflag=fullblock.

dd 의 기본 블록 크기 는 512 바이트입니다. count한계입니다. 귀하의 질문에 따르면 유한 크기의 장치를 복사 할 때 필요하지 않으며 실제로 장치의 일부만 복사하기위한 것입니다.

여기서 고려해야 할 두 가지 측면이 성능과 데이터 복구라고 생각합니다.

성능과 관련하여 블록 크기는 기본 물리적 블록 크기와 같거나 그보다 여러 배가되어야합니다 (따라서 CD-ROM을 읽을 때 2048 바이트). 실제로 오늘날에는 더 큰 블록 크기를 지정하여 기본 캐싱 시스템이 사용자를 대신하여 버퍼링 할 수있는 기회를 제공 할 수 있습니다. 그러나 블록 크기를 늘리면 dd훨씬 더 많은 메모리를 사용해야하며 패킷 조각화로 인해 네트워크를 통해 복사하는 경우 비생산적 일 수 있습니다.

데이터 복구와 관련하여 더 작은 블록 크기를 사용하면 고장난 하드 디스크에서 더 많은 데이터를 검색 할 수 있습니다. 이것들은 dd-rescue자동적으로 같은 프로그램입니다 : 그들은 처음에 큰 블록을 읽지 만, 블록이 실패하면 더 작은 블록 크기로 다시 읽습니다. dd이 작업을 수행하지 않으면 전체 블록이 실패합니다.


2
특히 성능; 예를 들어 dd bs=4m iflag=fullblockvs를 사용하여 파티션 이미지를 SD 카드에 dd bs=1111기록하고 전자가 제공하는 데이터 속도가 상당히 높음을 알 수 있습니다. 전자는 SD 카드의 자연스러운 블록 크기와 일치하지만 후자는 SD 컨트롤러가 부분적인 물리적 블록을 쓰기 위해 많은 읽기, 복사 및 재 플래시를 수행해야하기 때문입니다. fullblock그것이 없으면, bs최대 및 부분 판독 만이 지속적인 후속 오정렬로 이어질 수 있기 때문에 그 중요성을 과소 평가해서는 안된다 .
Jason C

6

주위에 약간의화물 컬트가 있습니다 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입니다. 대부분의 현대적인 환경에서 단독으로 남겨 둘 수있는 유일한 효과는 복사 프로세스를 느리게하는 것입니다.


어쨌든 GNU cp는 기본적으로 64k가 아닌 128k 블록 크기를 사용합니다. eklitzke.org/efficient-file-copying-on-linux
apurkrt

5

블록 크기를 변경하면 한 번에 버퍼링되거나 읽거나 쓰는 양을 변경할 수 있습니다.

실제 블록 장치인지 무한 / 가상 장치인지는 실제로 관련이 없습니다. 메모리에 저장하기 전에 메모리에 저장하려는 양에 관한 dd것입니다. (한 번에 읽는 데이터 bs=ibs=)과 obs=(한 번에 쓰는 데이터 양)을 설정합니다. 하여 더 높은 obs=의 더 반복 ibs=하면 충분한 데이터가 전에 필요합니다 dd대상에 쓰기 시작하기를.

count=또한 당신이하고 싶은 것 이외의 것에 의존하지 않습니다. 작업이 완료된 것으로 간주하는 ibs=데 필요한 "블록"수를 제어합니다 dd.


참고 dd부분 블록 복사의 Stephens 요점은 항상 그런 것은 아닙니다 bs * count.
Drav Sloan

일부 유닉스 시스템에서 당신이 참고 해야한다 네이티브 블록 크기의 배수를 읽을; 블록 장치 cdrom 드라이브에서 읽을 때 또는 그 배수가 dd없으면 bs=2048오류가 발생합니다.
wurtel

2

blocksize 옵션을 on으로 사용하면 dd출력 I / O 서브 시스템에 다시 쓰기를 시도하기 전에 입력 I / O 서브 시스템에서 메모리로 복사 할 데이터의 양 을 효과적으로 지정합니다. 출력은 동일합니다 (전체 디스크를 복사 할 때와 동일). 청크는 지정한 다른 크기로 읽히고 있습니다 (대부분의 dd구현은 기본 블록 크기가 512 바이트입니다).

많은 양의 스페어 메모리가 있고 블록 크기를 늘리면 더 큰 데이터 청크를 연속적으로 읽고 버퍼링하고 출력 대상으로 플러시 할 수 있습니다. 블록 크기가 작을수록 각 개별 lseek, memset 등의 측면에서 더 많은 오버 헤드가 필요합니다.

메모리가 부족한 경우 및 설정 위치 if=및 사용 of=중인 하드웨어 에 따라 마일리지가 달라질 수 있습니다 .


1

기지국 = 블록 크기를 읽거나 쓸 수를 나타낸다. 필드를 그대로 두거나 지정하지 않으면 복사와 동일한 작업을 수행하는 것처럼 보이지만 필드를 사용하는 데 숨겨진 사실이 있습니다. 예를 들어

  • 각각 1 ~ 10kb의 1000000000000000 개의 파일이 있습니다.
  • 10GB의 단일 파일 보유

첫 번째 경우 더 작은 블록 크기를 사용하면 복사 속도가 증가하는 것으로 나타났습니다. 후자의 경우 블록 크기가 높을수록 섹터 크기가 커져 sector change명령 수가 적어 지므로 일반적으로 I / O 작업이 빨라집니다.

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