dd는 왜 그렇게 오래 걸리나요?

dd는 왜 그렇게 오래 걸리나요?

한 디스크를 다른 디스크로 복사해야 합니다. 다음 명령을 사용해 보았는데 페데로에서 1TB 디스크를 복사하는 데 거의 하루가 걸렸습니다.

dd if=/dev/sda of=/dev/sdb 

아래 명령을 사용하여 Unix(HP-UX) 시스템에서 동일한 작업을 시도했는데 몇 시간 내에 완료되었습니다.

dd if=/dev/sda of=/dev/rdsk

디스크에서 디스크로 더 빠르게 복사하려면 어떤 대안을 사용할 수 있습니까?

답변1

dd(이상한) 옵션이 많이 있습니다.일(1).

버퍼 크기를 명시적으로 명시해야 하므로 시도해 보세요.

dd if=/dev/sda of=/dev/sdb bs=16M

IIRC의 경우 기본 버퍼 크기는 512바이트에 불과합니다. 위 명령은 이를 16MB로 설정합니다. 더 작은 것(예 bs=1M: )을 시도할 수 있지만 기본값보다 더 많은 것을 사용해야 합니다(특히 4KB 섹터가 있는 최신 디스크 하드웨어의 경우, 즉고급 형식). 나는 최소한 1메가바이트의 2승을 순진하게 추천하고 싶습니다.

기본 버퍼 크기인 512바이트를 사용하는 것 같습니다(그러나 매우 틀릴 수도 있습니다).하드웨어커널은 512바이트 블록당 4K를 전송해야 합니다.

에 대한 rdsk,표준편차(4)매뉴얼 페이지에는 다음과 같이 나와 있습니다.

현재는 블록 장치만 사용할 수 있습니다. 원시 장치는 아직 구현되지 않았습니다.

dd의 버퍼 크기를 늘리면 읽기 및 쓰기 작업 성능이 향상됩니다. 이제 모든 디스크에는 하드웨어 읽기/쓰기 버퍼가 있습니다. 그러나 dd의 버퍼 크기를 하드웨어 버퍼 이상으로 늘리면 dd가 첫 번째 디스크에서 읽는 반면 두 번째 디스크는 자체 하드웨어 버퍼에서 모든 것을 쓰기 때문에 성능이 저하됩니다. bs매번 다른 장치에 대해 다른 dd 명령 옵션을 설정 해야 합니다 .

답변2

몇 년 전, 유닉스 세계에서는 dd블록 장치를 복사하는 것이 일반적인 방식이었습니다. (적어도 Linux 기반 시스템에서는) cat거의 항상 dd.

그러나 역사적으로도 각 시스템 호출이 I/O 작업을 트리거한다는 점을 고려하면 적절한 블록 크기가 (느린) 시스템 호출 수를 줄이는 데 도움이 되었습니다. 기본 블록 크기는 512바이트(디스크 섹터 1개)입니다. 예전에는 단일 읽기를 위해 여러 디스크 블록을 함께 수집하는 것이 허용되었습니다. 이 예에서는 32MB 블록 크기를 사용합니다.

dd bs=$((512*2048*32)) if=/dev/source of=/dev/target

그런데 압축되지 않은 스트림이나 원격 네트워크 소스의 스트림을 읽는 경우 짧은 읽기가 필요한 블록 크기보다 작다는 것을 알 수 있습니다. dd청크를 채울 만큼 충분한 입력을 얻을 때까지 다시 읽도록 지시하여 처리 해야 합니다 . iflag=fullblock그렇지 않으면 때때로 손상된 출력 스트림이 발생할 수 있습니다. 여기서는 그렇지 않지만 완전성을 위해 포함시켰습니다.

원래 질문으로 돌아가서 현재 Linux 기반 시스템에서는 간단한 방법을 통해 디스크를 가장 효율적으로 복사할 수 있습니다.cat

cat /dev/source >/dev/target

(귀하의 질문에 대한 설명에 언급된 바와 같이 pv이는 대체될 수 cat있으며 진행률과 처리량을 표시할 수 있습니다.)

답변3

일반적으로 dd특정 대안은 피할 수 있습니다. 대신 GNU를 사용하는 데에는 몇 가지 좋은 이유가 있습니다 ddrescue. Ubuntu에서는 다음 명령을 사용하여 설치할 수 있습니다.

sudo apt-get install gddrescue

간단히 말해서, ddrescue사용하기 쉽습니다. 패키지 이름과 달리 실행 파일은확실히시작이 있습니다 g.

그것을 사용하는 것은 매우 간단합니다:

ddrescue inputFile outputFile logFile

로그 파일(선택한 이름)을 사용하면 이전 작업을 다시 실행할 필요 없이 일시 중지/중지 및 다시 시작할 수 있습니다. 이는 대규모 복제 또는 디스크 복원을 수행할 때 유용합니다. 기본적으로 진행률, 현재 복사 속도, 평균 복사 속도 및 발견된 불량 블록 수가 표시됩니다.

블록 크기에 대해 합리적인 기본값을 사용하므로 적어도 내 경험으로는 복사가 항상 장치가 처리할 수 있는 만큼 빠릅니다(저는 모든 크기와 유형의 수백 개의 드라이브를 복제했습니다).

일반적으로 고장이 나기 시작하는 드라이브에는 간헐적인 속도 저하, 낮은 평균 속도, 갑작스러운 긴 일시 중지(불량 섹터) 또는 전체 재설정(중요한 표면 오류)과 같은 속도 문제가 있습니다. ddrescue드라이브가 자체적으로 재설정되는 경우에도 이는 위의 모든 사항을 식별하고 복제를 다시 시작하는 데 도움이 될 수 있습니다(로그 파일을 지정한 경우).

답변4

아주 좋은 질문입니다. 원래 인터페이스는 일부 UNIX 시스템(tru64, hpux, Solaris)에서는 구현되지만 Linux에서는 구현되지 않습니다. 원시 인터페이스를 사용하면 UNIX I/O를 건너뛰기 때문에 전송 속도가 더 빨라집니다. 블록 인터페이스( /dev/dsk또는 /dev/disk)는 Unix I/O 시스템을 사용하기 때문에 속도가 느립니다. 속도를 높이려면 dd(gnu dd 가능) 하드웨어에 따라 bs=30M또는를 사용하십시오. bs=20M짧은 대답은 다음과 같습니다. 아니요, 적어도 제가 아는 한 아직 구현되지 않았습니다. 나는 커널 버전 2.2부터 Linux를 사용해 왔고 rdskUNIX에서 사용되는 것을 본 적이 없습니다.

관련 정보