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

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

온라인 튜토리얼에서는 CDROM을 ISO 이미지에 복사하기 위해 다음 명령을 사용하는 것이 권장되는 경우가 많습니다.

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

블록 크기를 지정해야 하는 이유는 무엇입니까? 알고 보니 사실 2048년은CDROM 이미지의 표준 논리 블록 크기그러나 그것은 지정되지 도 유효 dd하지도 않은 것 같습니다 .bs=count=

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

답변1

dd는 언제 데이터 복사에 적합합니까? (또는 read() 및 write()가 부분적인 경우)사용할 때 중요한 주의 사항에 유의하세요 count. dd부분 청크가 복사될 수 있으므로 주어진 경우 count일부 청크가 불완전하더라도 주어진 청크 수 이후에 중지됩니다. 따라서 bs * count복사된 바이트 수는 지정하지 않는 한 바이트 수보다 작아질 수 있습니다 iflag=fullblock.

기본 블록 크기는 다음과 같습니다.DD512바이트입니다. count귀하의 질문에서 알 수 있듯이 제한된 크기의 장치를 복사할 때는 필요하지 않으며 실제로는 장치의 일부만 복사하기 위한 것입니다.

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

성능 측면에서 이상적으로는 블록 크기가 최소한 기본 물리적 블록 크기(CD-ROM을 읽을 때 2048바이트)와 같거나 그 배수가 되는 것이 좋습니다. 실제로 이제 기본 캐싱 시스템이 콘텐츠를 버퍼링할 수 있도록 더 큰 블록 크기를 지정할 수도 있습니다. 그러나 블록 크기를 늘리면 dd더 많은 메모리를 사용해야 하며 패킷 조각화로 인해 네트워크를 통해 복사하는 경우 비생산적일 수 있습니다.

데이터 복구에 관한 한, 더 작은 블록 크기를 사용하면 고장난 하드 드라이브에서 더 많은 데이터를 검색할 수 있습니다. 이는 dd-rescue이와 같은 프로그램이 자동으로 수행하는 작업입니다. 처음에는 큰 청크를 읽지만 청크에 오류가 발생하면 더 작은 블록 크기로 다시 읽으십시오. dd그렇게 하지 않고 전체 블록이 실패할 뿐입니다.

답변2

약간의 화물 숭배가 돌아다니고 있습니다 dd. 처음에는 두 가지 버그로 cp인해 문제가 발생했습니다. 보고된 블록 크기가 512(Linux에서는 블록 크기 1024를 사용함)가 아닐 때 파일이 희박한 것으로 잘못 감지되었으며 대상의 빈 블록 대상에서 복사할 때 지워지지 않았습니다. 장치를 차단할 스파스 파일입니다.

이에 대한 참고 자료는 다음에서 찾을 수 있습니다.초기 Linux 메일링 리스트 아카이브.

그래서 사람들은 dd가 디스크 이미지를 처리하는 올바른 방법이라는 데 익숙해졌고 cp는 중도에서 제외되었습니다. dd는 기본 블록 크기인 512를 사용하기 때문에 속도가 느립니다(최신 시스템의 cp보다 느림). 그러나 어떤 블록 크기를 사용해야 하는지는 확실하지 않습니다. 아마도 귀하의 경우 누군가 2048이 CD-ROM의 "자연스러운" 블록 크기라는 것을 읽고(즉, CD-ROM은 2,352바이트 섹터로 나누어져 있으며 여기에는 2,048바이트의 데이터와 오류 수정 정보가 포함되어 있음) 다음과 같이 결정했을 것입니다. dd와 함께 사용할 "올바른" 크기입니다. 실제로 (보통) 더 큰 블록 크기를 사용하면 더 빠른 결과를 얻을 수 있습니다. 실제로 GNU cp는 이러한 이유로 기본 블록 크기인 64k를 사용합니다.

간단히 말해서: cp /dev/dvd foobar.iso잘 작동할 겁니다. 기본 블록 크기는 dd512입니다. 대부분의 최신 환경에서 이를 사용하지 않을 경우의 유일한 영향은 아마도 복제 프로세스가 느려지는 것뿐입니다.

답변3

블록 크기를 변경하는 것은 버퍼링 양이나 읽기/쓰기 양을 한 번에 변경하는 좋은 방법입니다.

실제 블록 장치인지 무한/가상 블록 장치인지와는 아무런 관련이 없습니다. dd쓰기 전에 메모리에 얼마나 저장하고 싶은지 에 관한 것입니다 . (한 번에 읽어올 데이터의 양) 및 (한 번에 쓸 데이터의 양)을 bs=설정합니다 . 값이 높을수록 충분한 데이터가 대상에 기록되기 시작하기 전에 더 많은 반복이 필요합니다.ibs=obs=obs=ibs=dd

count=또한 당신이 하고 싶은 일 외에는 다른 어떤 것에도 의존하지 않습니다. 작업이 완료된 것으로 간주되기 ibs=전에 걸리는 "청크"(측정 기준) 수를 제어합니다 .dd

답변4

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

  • 1000000000000000개의 파일이 있으며 각 파일의 크기는 1~10kb에 불과합니다.
  • 10GB의 단일 파일 보유

첫 번째 경우에는 더 작은 블록 크기를 사용하면 복사 속도가 빨라지는 것으로 나타났습니다. 후자의 경우, 블록 크기가 클수록 섹터 크기가 늘어나고 더 적은 sector change수의 명령이 남게 되어 일반적으로 I/O 작업 속도가 빨라지기 때문에 더 나은 선택입니다.

관련 정보