한 디스크를 다른 디스크에 복사해야합니다. 아래 명령으로 시도했는데 페데로에서 1TB의 디스크를 복사하는 데 거의 하루가 걸립니다.
dd if=/dev/sda of=/dev/sdb
아래 명령을 사용하여 Unix (HP-UX) 시스템에서 동일하게 시도했으며 몇 시간 내에 완료됩니다.
dd if=/dev/sda of=/dev/rdsk
디스크에서 디스크로 더 빨리 복사하는 데 사용할 수있는 대안은 무엇입니까?
답변
dd
많은 (이상한) 옵션이 있습니다 ( dd (1) 참조 ) .
버퍼 크기를 명시 적으로 명시해야합니다.
dd if=/dev/sda of=/dev/sdb bs=16M
IIRC, 기본 버퍼 크기는 512 바이트입니다. 위의 명령은 16MB로 설정합니다. 더 작은 것을 시도 할 수 bs=1M
있지만 (예 🙂 기본값보다 많은 것을 사용해야합니다 (특히 4Kbytes의 섹터가있는 최신 디스크 하드웨어, 즉 Advanced Format ). 나는 적어도 메가 바이트 인 2의 힘을 순진 히 추천합니다.
기본 512 바이트 버퍼 크기를 사용하면 하드웨어 가 커널이 각 512 바이트 블록마다 4K를 전송해야 한다고 생각합니다 (그러나 매우 틀릴 수 있습니다) .
에 관해서 rdsk
는 SD (4) 매뉴얼 페이지 말한다 :
현재는 블록 장치 만 제공됩니다. 원시 장치는 아직 구현되지 않았습니다.
dd의 버퍼 크기가 증가하면 읽기 및 쓰기 작업 성능이 향상됩니다. 이제 모든 디스크에는 하드웨어 읽기 / 쓰기 버퍼가 있습니다. 그러나 하드웨어 버퍼보다 dd의 버퍼 크기를 늘리면 두 번째 디스크가 자체 하드웨어 버퍼에서 모두 쓰여질 때 dd가 첫 번째 디스크에서 버퍼로 읽히기 때문에 성능이 저하됩니다. bs
장치마다 다른 값을 가질 때마다 dd 명령의 옵션을 설정해야 합니다.
답변
유닉스 랜드에서 몇 년 전은 dd
블록 장치를 복사하는 데 필요한 방법이었습니다. 비록 적어도 리눅스 기반 시스템에서는 cat
거의 항상보다 빠르지 만화물 컬트 지식으로 발전했습니다 dd
.
그러나 역사상으로도 상당한 블록 크기는 각 시스템 호출이 I / O 작업을 트리거 한 경우 (느린) 시스템 호출 수를 줄이는 데 도움이되었습니다. 기본 블록 크기는 512 바이트 (하나의 디스크 섹터)입니다. 여러 디스크 블록을 단일 읽기로 함께 수집하는 것도 가능합니다. 이 예는 32MB 블록 크기를 사용합니다.
dd bs=$((512*2048*32)) if=/dev/source of=/dev/target
그러나 현재 Linux 기반 시스템에서는 디스크를 간단한 방법으로 가장 효율적으로 복사 할 수 있습니다 cat
cat /dev/source >/dev/target
(질문에 대한 의견에서 언급 한 바와 같이 진행 상황과 처리량을 pv
대신 할 수 있습니다 cat
.)
답변
일반적으로 dd
일부 대안을 선호하여 피할 수 있습니다. ddrescue
대신 GNU를 사용해야하는 몇 가지 이유가 있습니다 . 우분투에서는 다음과 같이 설치할 수 있습니다.
sudo apt-get install gddrescue
ddrescue
사용하기에 평범 합니다. 패키지 이름과 달리 실행 파일 에는 초기 이름 이 없습니다g
.
그것을 사용하는 것은 간단합니다 :
ddrescue inputFile outputFile logFile
로그 파일 (선택한 이름)을 사용하면 이전 작업을 다시 수행하지 않고도 일시 중지 / 중지 및 재시작 할 수 있습니다. 이는 큰 복제 또는 디스크 복구를 수행 할 때 유용합니다. 기본적으로 진행률, 현재 복사 속도, 평균 복사 속도 및 불량 블록 수를 표시합니다.
그것은 블록 크기에 합리적인 기본값을 사용하므로 적어도 경험상 장치가 처리 할 수있는 속도만큼 복사 속도가 항상 빠릅니다 (모든 크기와 유형으로 수백 개의 드라이브를 복제했습니다).
종종 고장이 나기 시작하는 드라이브에는 가끔 속도 저하, 낮은 평균 속도, 갑자기 긴 일시 정지 (나쁜 섹터) 또는 완전한 재설정 (심각한 표면 오류)과 같은 속도 문제가 있습니다. ddrescue
드라이브 자체가 재설정 되더라도 위의 모든 사항을 식별하고 복제본 (로그 파일을 지정한 경우)을 다시 시작하는 데 도움이 될 수 있습니다.
답변
아주 좋은 질문입니다. 원시 인터페이스는 일부 유닉스 시스템 (tru64, hpux, solaris)에서 구현되지만 Linux에서는 구현되지 않습니다. 원시 인터페이스는 유닉스 I / O를 건너 뛰기 때문에 더 빨리 전송합니다. 블록 인터페이스 ( /dev/dsk
또는 /dev/disk
)는 유닉스 I / O 시스템을 사용하기 때문에 속도가 느립니다. 속도를 높이려면 dd
(gnu dd can) 사용 bs=30M
하거나 bs=20M
hw에 따라 다릅니다. 짧은 대답은 : 아니요 적어도 아는 한 구현되지 않았습니다. 커널 2.2 이전 버전부터 리눅스를 rdsk
사용하고 있으며 유닉스 에서는 결코 사용 되지 않았습니다 .