dd를 사용하여 1TB 디스크를 1.2TB 디스크로 복제하면 "장치에 남은 공간이 없습니다"가 나타납니다.

dd를 사용하여 1TB 디스크를 1.2TB 디스크로 복제하면 "장치에 남은 공간이 없습니다"가 나타납니다.

dd다음 명령을 사용하여 원격 xfs 디스크를 다른 위치에 복제 하려고 합니다 .

ssh root@source_ip  "dd if=/dev/vda2 bs=16M conv=noerror,sync status=progress " | sudo dd of=/dev/nvme1n1 bs=16M conv=noerror,sync status=progress

그러나 다음과 같은 오류 메시지가 나타납니다.

828895133696 bytes (829 GB) copied, 39610.432258 s, 20.9 MB/s
1288490188800 bytes (1.3 TB) copied, 64529.849170 s, 20.0 MB/s
dd: error writing '/dev/nvme1n1': No space left on device

원본 디스크는 1TB이고 대상 디스크는 1.2TB입니다.

이 경우 디스크 간 복제를 수행할 수 없는 이유를 설명할 수 있는 사람이 있습니까? 감사해요!

원본 디스크에서 삭제된 파일을 복구하려고 하는데 DD가 이 상황에 적합한 유일한 도구인지 잘 모르겠습니다.

답변1

비교하다이 답변( bs=1K여기서 주석 사용):

dd원래 테이프 장치에서 실행되도록 설계된 오래되고 기발한 프로그램입니다. 1kB 블록을 읽으라고 지시하면 블록 읽기를 시도합니다. 읽기에서 1024바이트 미만을 반환하면 그게 전부입니다.

conv=sync독서량이 기대 이하로 떨어지면 dd중요해집니다 . 귀하의 경우 파이프는 언제든지 ssh전체 16M청크를 bs=16M로컬에 전달할 수 없습니다.dd 한 번에 읽어보세요, conv=sync"누락된" 데이터를 0(NUL 바이트)으로 채웁니다. 그러나 실제 데이터는 누락되지 않았습니다. dd로컬이 다음 블록을 읽으려고 시도하면 로컬이 누락되었다고 생각하는 내용이 전달됩니다.

실제로 네이티브는 dd스트림의 임의(-ish) 위치에 0을 주입합니다. 명확하지 않다면 다음을 강조합니다.이로 인해 데이터가 손상되고 결과 "복제본"이 사실상 쓸모 없게 됩니다..

conv=noerror,sync원격(읽기) 측에서의 사용도 잘못될 수 있습니다. 이 답변을 비교해보세요:dd conv=sync,noerror효과 는 무엇입니까 ?올바르게 사용하려면 어떻게 작동하는지 실제로 이해해야 합니다.

사용 중인 로케일에는 적합하지 않습니다 dd conv=noerror,sync. 제거 또는 추가 iflag=fullblock(지원되는 경우) 솔직히 말해서 conv=noerror,sync iflag=fullblock파이프에서 읽을 때 이러한 옵션을 사용하지 않는 것보다 어떤 이점이 있는지 잘 모르겠습니다 .dd

답변2

다른 사람들이 이미 지적했듯이 문제는 을 사용하고 있다는 것입니다 dd. 사용 규칙 #1은 dd를 사용하지 않는다는 것입니다 dd. 사용 규칙 #2는 dd당신이 하는 일입니다아니요사용 dd. 사용 규칙 #3 dd(전문가 전용)은 이 bs옵션을 사용하지 않습니다.

거기에는 마법이 없습니다 dd. 마법이 거기에 있습니다 /dev/*.

dd당신의 데이터를 기꺼이 파괴할 것입니다그리고블록 크기 설정은 성능을 향상시킬 수도 있고 그렇지 않을 수도 있습니다.. dd안전하게 사용하는 방법을 알고 있는 경우 에만 사용하세요.그리고특정 사용 사례에서 벤치마킹을 수행하여 시스템이 해당 작업을 수행하도록 하는 것보다 더 빠른 블록 크기를 결정했습니다.

ssh root@source_ip  "cat /dev/vda2" | sudo tee /dev/nvme1n1 >/dev/null

답변3

파일 삭제 취소를 포함하여 법의학과 관련된 모든 경우에 dd이 도구는 (적어도 읽기에는) 적합한 도구입니다.

다른 사람들이 지적했듯이 문제는 ssh 파이프 끝에서 차단된 부분을 읽을 수 없다는 것입니다. 따라서 두 번째 dd에 iflag=fullblock이 필요하거나 두 번째 dd를 완전히 건너뛰어야 합니다.

flag=noerror틀릴 수도 있습니다. 실패했는지 궁금합니다.

flag=sync종종 실수입니다. dd에게 운영 체제의 버퍼를 덮어쓰도록 지시합니다. 그럴 필요는 없습니다. 기껏해야 sync달리기 후에. 그리고 읽기에 있어서 이것은 의미가 없습니다.

두 개의 서로 다른 status=progress항목은 오류입니다. 둘 다 서로 덮어썼다고 보고합니다. 당신은 정말로 그것이 어떻게 이루어졌는지 알고 싶을 뿐입니다. 상태 생략 =...

bs=16M좋아 보이지만 이상적으로는 bs가 하드웨어 블록 크기와 일치해야 합니다. 클래식 디스크의 경우 이 크기는 512바이트입니다. 더 현대적인 것들은 4k를 사용합니다. 4k, 16k 또는 64k를 권장합니다.

압축은 가득 차지 않은 디스크에도 좋습니다. 해결책은 ssh -C아마도 가장 간단할 것입니다.

따라서 다음과 같이 작성할 수 있습니다.

ssh -C root@source_ip  "dd if=/dev/vda2 bs=64k" | sudo dd iflag=fullblock of=/dev/nvme1n1 bs=64k

또는

sudo sh -c 'ssh -C root@source_ip  "dd if=/dev/vda2 bs=64k" >/dev/nvme1n1'

(Ssh 문제가 있을 수 있습니다.)
또는

sudo chown `id -u` /dev/nvme1n1
ssh -C root@source_ip  "dd if=/dev/vda2 bs=64k" >/dev/nvme1n1
sudo chown root /dev/nvme1n1

또는 tee.

시험

이중 dd 형식을 사용하려면 전체 전송을 수행하기 전에 올바른 옵션이 있는지 테스트하는 것이 좋습니다. 약간의 디스크 공간을 차지하도록 count=100첫 번째 항목에 추가하십시오 . dd몇 초 내에 두 개의 상태 줄이 표시되며 동일한 이체 금액이 표시되어야 합니다. 작동하는 경우 count=100삭제를 반복하여 전체 디스크를 완료하세요.

답변4

이 명령은 dd1960년대 IBM 메인프레임 명령 DDR(디스크 덤프 및 복원)을 모델로 하며 주로 블록 지향 I/O를 블록 지향 디스크 변환 및 재차단으로 변환하는 데 사용되었습니다. 그러나 여기서는 그렇게 하려는 것이 아닙니다.

사용 사례에서 중요한 문제는 중간에 특정 블록 크기를 읽을 수 없는 신뢰할 수 없는 네트워크 파이프가 있다는 것입니다.

실제 프로그램을 사용하는 경우 dd(출력이 표준 호환이 아니기 때문에 무엇을 사용하고 있는지 확실하지 않음) 다음과 같은 출력을 얻어야 합니다.

"%u+%u records in\n", <number of whole input blocks>,
    <number of partial input blocks>

"%u+%u records out\n", <number of whole output blocks>,
    <number of partial output blocks>

dd더하기 기호 앞에는 0보다 큰 숫자만, 더하기 기호 뒤에는 0보다 큰 숫자만 얻을 수 있도록 하는 방식으로 이를 사용해야 합니다 .

출력 파이프에서 읽을 때 특정 양의 데이터를 가져올 수 있는 권한이 없으므로 ssh항상 얻을 수 있는 것보다 적은 양을 읽으려고 노력해야 합니다. 다음 명령을 사용하여 소스 디스크에서 계속 읽을 수 있습니다.

dd if=/dev/xxx bs=16x1024k

문제 없습니다. 하지만 파이프에서 데이터를 읽고 대상 디스크에 쓰려면 이 명령을 사용해야 합니다.

dd ibs=1b obs=16x1024k of=/dev/yyy

다른 옵션을 사용하지 마십시오(특히 비표준 옵션을 사용하지 마십시오). dd대상 디스크에 쓰기 명령이 쓰기로 끝나는 경우 :

nnnn+0 records in
mmmm+0 records out

성공했고 dd입력에서 512바이트 미만을 읽지 않았으므로 출력이 적절하게 다시 차단될 수 있습니다.

입력 블록의 일부 블록(더하기 기호 오른쪽에 > 0)이 표시되면 복사 프로세스를 반복해야 합니다.

출력 청크 크기가 크기 때문에 물론 대상 dist에 부분 청크를 쓰게 될 수도 있습니다. 따라서 dd대상 디스크에 기록되는 요약 메시지는 다음과 같을 수도 있습니다.

nnnn+0 records in
mmmm+1 records out

관련 정보