dd가 출력 파일과 동일한 입력 파일을 받으면 어떻게 되나요?

dd가 출력 파일과 동일한 입력 파일을 받으면 어떻게 되나요?

sudo dd if=/dev/sda of=/dev/sda대신에 내가 실수로 도망쳤다고 가정해보자sudo dd if=/dev/sda of=/dev/sdb

시스템이 손상되었는지 확인하기 위해 500GB 작업이 완료될 때까지 기다리고 싶지 않습니다.

완료될 때까지 침착하게 기다리거나 중단하고 오랜 시간이 지난 후 다시 설치를 시작할 수 있도록 결과가 어떻게 될지 아는 사람이 있습니까?

편집: 결과 출력은 다음과 같습니다.

$ time sudo dd if=/dev/sda of=/dev/sda bs=64K conv=sync,noerror status=progress
512001769472 bytes (512 GB, 477 GiB) copied, 9084 s, 56.4 MB/s
dd: error writing '/dev/sda': No space left on device
7814181+1 records in
7814181+0 records out
512110190592 bytes (512 GB, 477 GiB) copied, 9088.72 s, 56.3 MB/s

real    151m28.774s
user    0m28.459s
sys 5m33.146s

답변1

별도로, dd if=/dev/sdx of=/dev/sdx이미 존재하는 동일한 데이터가 기록됩니다. 해를 끼치 지 않았습니다 (*).

그러나 파일 시스템 등에서 장치를 적극적으로 사용하는 경우 경쟁 조건이 발생할 수 있습니다.

dd는 데이터(A)를 읽고, 파일 시스템은 데이터(B)를 쓰고, dd는 데이터(A)를 쓰므로(B) 손실/손상이 발생합니다.

따라서 여전히 데이터 손실이나 시스템 충돌이 발생할 수 있습니다.

SSD 스토리지의 경우 발생할 수 있는 다른 부작용으로는 쓰기 주기가 낭비되고 희소 파일/씬 볼륨/스냅샷이 더 많은 스토리지 공간을 차지하게 되는 것입니다.


또한 블록 장치 대신 일반 파일로 동일한 작업을 수행하면 결과는 빈 파일이 되고 모든 데이터가 손실됩니다.

$ dd if=foobar of=foobar
0+0 records in
0+0 records out
0 bytes copied, 0.000179684 s, 0.0 kB/s

conv=notrunc이는 출력 파일을 0바이트로 자르지 않으면 dd0바이트 파일에서 읽을 수 있는 것은 모두 0바이트이기 때문입니다 .


seek(*) , skip, noerror, ... 와 같이 오프셋을 변경할 수 있는 다른 옵션을 사용 하거나 파티셔닝을 통해 이러한 오프셋을 도입하는 장치 sync와 같이 다르지만 동일한 장치를 사용하게 되는 경우를 제외하고. if=/dev/sdx of=/dev/sdx1이 경우 dd동일한 데이터 패턴을 반복적으로 작성하게 됩니다(이전에 오프셋에 기록된 내용을 읽어서). 그것은 모든 것을 부식시킵니다.

장치가 읽기 오류로 제대로 보고하지 않고 잘못된 데이터를 잘못 반환하는 좀 더 모호한 경우도 있습니다. 이 경우 손상된 데이터를 장치에 다시 쓰게 됩니다.

답변2

데이터를 읽고, 버퍼링하고, 쓰는 순서대로 아무 일도 일어나지 않습니다.

관련 정보