`dd if = / dev / zero of = / dev / sda`는 무엇을합니까


19

편집 : 데이터를 삭제하지 않으려면 테스트하기 위해 이것을 실행하지 마십시오.

누군가 내가 얻은 것을 이해하도록 도울 수 있습니까?

  1. dd if=/dev/zero of=/dev/sda bs=4096 count=4096

    Q : 왜 구체적으로 4096 count입니까?

  2. dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr blockdev --getsz /dev/sda - 4096)

    Q : 정확히 무엇을합니까?


4
이 악성 코드는 어디에서 발견
되었습니까

10
이것은 악성 코드가 아닙니다.
Michael Hampton

12
@MichaelHampton : s / malicious / destructive / 파괴적인 코드를 게시하는 것은 그 자체로는 악성이 아니지만 데이터 IS를 파괴 할 수 있다는 경고없이 게시하는 것입니다.
벤 Voigt

1
인터넷상의 누군가가 이와 같은 명령을 실행하도록 지시 할 때 DD를 '디스크 파괴자'로 생각하는 것이 가장 좋습니다.
Bobby Sacamano

3
실제로 DD는 데이터 설명을 의미합니다
Suici Doga

답변:


43

dd if = / dev / zero of = / dev / sda bs = 4096 count = 4096 Q : 왜 4096이 카운터에 사용됩니까?

드라이브의 처음 16MiB가 0이됩니다. 16 MiB는 "디스크 시작"구조를 압축하는 데 충분하지만 시간이 오래 걸리지 않을 정도로 작습니다.

dd if = / dev / zero of = / dev / sda bs = 512 count = 4096 seek = $ (expr blockdev --getsz / dev / sda-4096)

Q : 정확히 무엇입니까?

blockdev --getsz"512 바이트 섹터"에서 블록 장치의 크기를 가져옵니다. 따라서이 명령은 드라이브의 마지막 2MiB를 0으로 만드는 것으로 보입니다.

불행히도이 명령은 구문이 잘못되었습니다. 나는 명령이 원래 의도 된 것으로 기대합니다

dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr `blockdev --getsz /dev/sda` - 4096)

백틱은 사람들이 다른 환경 사이에서 그것을 복사 / 붙여 넣기하는 과정에서 어딘가에서 사라졌습니다.

오래된 파티션 테이블, LVM 메타 데이터, RAID 메타 데이터 등은 드라이브를 재사용 할 때 문제를 일으킬 수 있습니다. 드라이브의 시작과 끝에서 섹션을 제로화하면 일반적으로 이러한 문제를 피하면서 전체 드라이브를 제로화하는 것보다 훨씬 빠릅니다.


4
감사합니다. 이 답변은 내가 찾던 것에 가장 부합하는 것 같습니다. 두 명령은 출발 후에 사용됩니다. 깨끗한 디스크로 재사용하기 위해 디스크를 닦는 데 사용됩니다.
JH

expr blockdev --getsz /dev/sda - 4096의 구문 오류입니다 expr. 의도 한 명령은이었다고 생각합니다 ...seek="$(expr "$(blockdev --getsz /dev/sda)" - 4096)". 또는 더 나은 :...seek="$(($(blockdev --getsz /dev/sda) - 4096))"
Stéphane Chazelas

1
제 생각에는 명령에 원래 백틱이 있었고 어느 ​​시점에서 먹었을 것입니다.
plugwash

16

이렇게하면 복구에 유용한 중요한 구조가 들어있는 하드 드라이브 의 첫 번째 4096*4096=16MB와 마지막 이 지워 512*4096=2MB집니다. 이 코드가 악의적으로 게시되었다고 가정합니다.

count다른 것을 명시 적으로 지정하는 1것이 유용한 상황은 결코 없었습니다 . 나는 나는 내가 MBR의 뒤에 어떤 흔적을 남기지되지 않았습니다 확인하기를 원한다면 첫 번째 블록을 삭제 ...


8
이것은 필연적으로 악의적이지 않습니다. 현재 레이블이 손상된 경우 새 레이블 작성을 거부하는 잘못된 형식 지정 프로그램이 있었으므로 처음과 같은 몇 바이트를 수동으로 제거해야했습니다.
Shelvacu

1
@shelvacu 드라이브가 이런 식으로 조작하면 놀랐습니다 sda. 더 많은 가능성 sdbsdc. 그러나 나는 물론 틀릴지도 모른다 ...
yo '

7
이것은 악성이 아닙니다. 디스크 시작시 GPT를 지우고 디스크 끝에서 백업 GPT를 지 웁니다.
Michael Hampton

2
@shelvacu : 그것은 파괴적입니다. 파괴적인 명령이 수행 된 작업에 대한 설명없이 게시 된 경우 악성 명령입니다. 그들이 설명을 동반했다면, 왜 OP가 그것에 대해 묻고 있습니까?
벤 Voigt

2
그렇다면 완벽하게 염두에두고 누가 목적을 모른 채 어디서나 찾은 코드를 복사 / 붙여 넣을 수 있습니까? 지하철에서 발견 할 수있는 이상한 장치를 흔들지 않기 때문에 악성이 아닙니다.
Magno C

4

이러한 명령은 sda 장치를 0으로 덮어 씁니다. 첫 번째 명령은 첫 번째 16MB (블록 크기 4096 및 4096 블록 수)를 수행하고 두 번째 명령은 마지막 2MB (512 블록 크기 4096 블록)를 0으로 덮어 씁니다. (기술적으로 지워지지 않으며 아래의 첫 번째 요점과 관련이 있습니다.)

(완전성을 위해 여기를 포함하여 다른 답변에서 이미 언급 한 부분이었습니다)

언급해야 할 또 다른 사항은 블록 크기에 영향이 있지만 일반적으로 대량 작업에서만 나타납니다. 명령을 실행하는 가장 효율적인 (가장 빠른) 방법은 명령의 블록 크기가 장치의 액세스 크기와 일치하면 시간이 낭비됩니다.

관심이 있으시면 백만 개의 1 블록 청크가있는 파일과 백만 개의 블록 청크가있는 파일을 만들어서 차이를 볼 수 있습니다.

[user@host tmp]$ time dd if=/dev/zero of=/tmp/test1 bs=1 count=1000000
1000000+0 records in
1000000+0 records out
1000000 bytes (1.0 MB) copied, 2.44439 s, 409 kB/s

real    0m2.447s
user    0m0.177s
sys     0m2.269s
[user@host tmp]$ time dd if=/dev/zero of=/tmp/test2 bs=1000000 count=1
1+0 records in
1+0 records out
1000000 bytes (1.0 MB) copied, 0.00155357 s, 644 MB/s

real    0m0.003s
user    0m0.001s
sys     0m0.002s
[user@host tmp]$ ls -al test*
-rw-rw---- 1 user grp 1000000 Apr  8 15:51 test1
-rw-rw---- 1 user grp 1000000 Apr  8 15:51 test2

보다시피, 블록 크기는 효율성에 큰 영향을 미칩니다. 그것은 아마도 OP에 대한 사이드 바이지만 여전히 관련이 있다고 생각합니다.

TL; DR : 인터넷에서 찾거나 신뢰할 수없는 누군가가 제공 한 임의의 코드를 실행하지 마십시오. 하루를 망칠거야.


7
Don't execute arbitrary code you find on the net라인 +1
Sergiy Kolodyazhnyy

7
"이 과정은 매우 지루하고 비싸며 매우 구체적인 장비가 필요합니다." 이 잘못된 정보의 확산을 중지하십시오. 이것이 이론적으로 가능했던 마지막 시점은 수십 년 전에 지금은 여러 세대에 걸쳐 사용되지 않는 기술이었습니다. hostjury.com/blog/view/195/…
Andrew Medico

나는 그 부분을 제거했다.-처음 들었을 때부터 시간이 걸렸다 고 생각한다. 그러나 나는 "이론적으로"는 작동 어 였다고 말하지만 나는 벗어난다.
Tim S.

2

다른 사람들은 자신이하는 일을 설명 했으므로 생략하겠습니다.

dd분리 bs되고 count논쟁 의 요점은 한 번에bs 얼마나 많이 쓰여지는지 를 제어 한다는 것입니다 . 정말로 큰 값을 지정 하려면 프로그램에서 실제로 큰 버퍼가 필요하고 커널이 장치에 쓸 전체 블록을 작성해야하기 때문에 장치의 블록 크기보다 작은 값을 지정하면 속도가 느려집니다 (이와 같은 경우에는 완전한 블록이있을 때까지 쓰기를 버퍼링 할 수 있으며, 그렇지 않은 경우 디스크에 이미있는 내용을 읽어야 할 수도 있습니다. 두 명령이에 대해 서로 다른 값을 사용하므로 두 사이트에서 찾은 것으로 생각됩니다. 하드 디스크의 블록 크기는 512 바이트로,bsbsbs=512후자의 명령 중 몇 년 전 (6-8-8)은 블록 크기가 4096 바이트 인 디스크를 만들기 시작하여 bs=4096최신 디스크에 더 적합합니다.


1
에 대한 달콤한 자리 bs는 그것보다 훨씬 높습니다 . 단일 SATA 명령으로 여러 섹터를 읽거나 쓸 수 있으므로 커널은 I / O를 보내기 전에 병합합니다. 어디서나 bs=64kbs=1024k(L3 캐시 크기는 종종 4-8MiB입니다) 합리적이다. bs=128k현대 Intel CPU에서 L2 캐시 크기의 절반 인을 자주 사용 합니다. ( dd이 방어 적이기 작업에는 다음이 포함에 read(2)그것의은 / dev / 영), 그리고 경우에도 소스 (에서 write(2). IIRC은 sdd. CPU의 약간의 시간을 절약 할 수 쓰기 0으로 옵션을했다 정말에만 해당 대상은 뭔가 경우 디스크 이외).
Peter Cordes

I / O 요청 병합이 발생하는 것을 보려면 출력 iostat -x 4또는 무언가를보고 rrqm / s (초당 병합 된 읽기 요청) 및 wrqm / s 열을 확인하십시오.
Peter Cordes

1

경고 : dd if=/dev/zero of=/dev/ 법 의학적 데이터 복사 전에 드라이브 나 장치를 청소하는 데 사용됩니다. 교차 오염을 완화하기 위해 법 의학적 조사를받는 시스템에서 정보를 복사하기 전에 드라이브 또는 장치를 항상 소독해야합니다. 따라서 이는 나쁜 명령이 아니므로 최종 사용자는 명령이 사용되는 내용을 이해해야합니다. 그렇지 않으면 데이터가 손상됩니다. 이것이 원하는 경우 제로 쓰기 작업을 확인하십시오 dd if=/dev/sda | hexdump -C | head.

출처 : Darren Hayes 박사의 컴퓨터 법의학 조사 실무 가이드


1

dd if=/dev/zero of=/dev/sdX oflag=sync실제로 디스크 이미지와 함께 gparted, fdisk 또는 dd와 함께 사용하기 전에 삽입 된 USB 드라이브 또는 MicroSD 카드의 품질을 테스트 하는 데 사용합니다. 품질이 열악한 MicroSD 미디어의 경우 이는 신중한 아이디어라고 생각합니다.

물론 실수로 디스크를 지우더라도 용서할 수 없으므로 of = sdX에주의하십시오. X = 원하는 대상의 드라이브 문자인지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.