디스크를 제로화하는 동안 쓰기 오류를 무시하는 방법은 무엇입니까?


19

고장난 하드 디스크를 0으로 만들고 싶다고 가정하십시오. 가능한 한 0으로 덮어 쓰려고합니다. 원하지 않는 것은 프로세스가 첫 번째 쓰기 오류에서 중단된다는 것입니다. 그렇게하는 방법?

AFAICS, plain dd은 읽기 오류를 무시하는 옵션 만 제공합니다. 따라서, 같은

dd if=/dev/zero of=/dev/disk/by-id/lousy-vendor-123 bs=128k

충분하지 않다.

ddrescue 오류를 무시하는 것이 더 나은 것처럼 보이지만 최적의 명령 줄은 무엇입니까?

GNU ddrescue를 사용한 시도 :

ddrescue --verbose --force --no-split /dev/zero /dev/disk/by-id/lousy-vendor-123

1
dd conv=noerrorGNU 확장일지도 모르겠습니다. 어쨌든 그것은 트릭을 수행해야합니다. SATA는 드라이브에 대한 삭제 자체 답변을 통해 전체 드라이브를 지울 수 있습니다.
Peter Cordes

1
@PeterCordes, GNU dd문서 의 맨 페이지는 noerror'읽기 오류 후 계속'으로 표시됩니다.
maxschlepzig

1
dd conv=noerrorPOSIX 표준이지만 실제로 느릴 수 있습니다
schily

2
dd conv=noerror오류를 쓰지 말고 맨 페이지에 따라 오류를 읽기위한 것이어야합니다. 와의 결합에 나쁘지 않은데 conv=notrunc, 저에게 쓰기 오류를 무시하는 트릭을 만들었습니다. unix.stackexchange.com/a/229379/4319
imz-Ivan Zakharyaschev

를 사용하는 등 HDD에 대한 간단한 쓰기 작업은 dd if=/dev/zero of=/dev/sdX디스크 읽기를 수행하지 않습니다. dd 명령이 "충분하지 않다"고 생각하는 이유는 무엇 입니까? 어떤 "오류"가 발생합니까?
톱밥

답변:


12

나는 badblocks이것을 위해 파괴적인 쓰기 모드를 선호 합니다. 오류가 발생했을 때 계속해서 기록하며 마지막으로 오류가 발생한 위치를 알려주며이 정보는 다음에 수행 할 작업을 결정하는 데 도움이 될 것입니다 (Will It Blend?).

# badblocks -v -b 4096 -t random -o badblocks.txt -w /dev/destroyme
Checking for bad blocks in read-write mode
From block 0 to 2097151
Testing with random pattern: done
Reading and comparing: done
Pass completed, 52105 bad blocks found. (0/52105/0 errors)

그리고 차단 목록 :

# head badblocks.txt
2097000
2097001
2097002
2097003
2097004

그리고 디스크에 남은 것은 다음과 같습니다.

# hexdump -C /dev/destroyme
00000000  be e9 2e a5 87 1d 9e 61  e5 3c 98 7e b6 96 c6 ed  |.......a.<.~....|
00000010  2c fe db 06 bf 10 d0 c3  52 52 b8 a1 55 62 6c 13  |,.......RR..Ubl.|
00000020  4b 9a b8 d3 b7 57 34 9c  93 cc 1a 49 62 e0 36 8e  |K....W4....Ib.6.|

실제로 무작위 데이터는 아닙니다. 패턴은 반복적이므로 건너 뛰면 1MiB동일한 출력이 다시 나타납니다.

또한 데이터를 다시 읽어서 확인하려고 시도하므로 성공적으로 쓰고 있다고 주장하는 디스크가 있지만 다시 읽을 때 잘못된 데이터를 반환하면 해당 오류도 발견됩니다. 잘못된 긍정을 피하기 위해 불량 블록이 실행되는 동안 다른 프로세스가 디스크에 쓰지 않도록하십시오.

물론 디스크가 심하게 손상된 경우에는 시간이 너무 오래 걸릴 수 있습니다. 결함이있는 영역을 완전히 건너 뛸 수있는 코드가 없습니다. 이를 달성 할 수있는 유일한 방법 badblocks은 훨씬 더 큰 블록 크기를 사용하는 것입니다.

나는 ddrescue이것이 더 나아질 지 확신 하지 못한다. 그것은 다른 방향으로해야합니다 (가능한 한 빨리 많은 데이터를 복구하십시오). 첫 번째 / 마지막 블록을 지정하여 dd / ddrescue / badblocks에 대해 수동으로 수행 할 수 있습니다.


1
내가 사용하는 -t random경우 -t 0-불량 블록을 사용하는 경우 하나의 쓰기 통과를 수행합니까? 매뉴얼 페이지를 보면 -t-4 패스 를하지 않으면 ( '0xaa, 0x55, 0xff, 0x00').
maxschlepzig 2018 년

2
-t명령 행에서 제공하는 각각에 대해 하나의 패스를 수행합니다. 당신이 말하는 것처럼 기본값은 4 패스입니다.
frostschutz

13

디스크가 USB로 연결되어 있지 않으면hdparm (버전> 9.31)을 사용 하여 디스크 의 ATA 보안 지우기 를 수행하십시오. 이 명령은 드라이브의 펌웨어가 불량 블록을 포함하여 디스크의 내용을 지 웁니다.

경고 : 올바른 드라이브 문자를 사용하십시오 ( /dev/sdX예를 들어 보여주었습니다) . 복사 / 붙여 넣기 만하지 마십시오.

먼저 ATA 명령을 이해하는지 확인하십시오 (대부분의 드라이브는 지난 10 년 이상 제조해야합니다).

$ sudo hdparm -I /dev/sdX
.
# lots of other info here...
.
Security: 
    Master password revision code = 65534
        supported
    not enabled
    not locked
    not frozen
    not expired: security count
        supported: enhanced erase
    202min for SECURITY ERASE UNIT. 202min for ENHANCED SECURITY ERASE UNIT.

추출의 마지막 두 줄은 지원되는 것으로 표시합니다.

따라서 드라이브에 암호를 추가하십시오 (필수 사항).

$sudo hdparm --user-master u --security-set-pass p /dev/sdX
security_password="p"

지우다 :

$sudo hdparm --user-master u --security-erase p /dev/sdX
security_password="p"

/dev/sdX:
Issuing SECURITY_ERASE command, password="p", user=user

이 절차에 대한 자세한 내용은 여기를 참조하십시오 .


운이 좋으면 USB를 통해 작동 할 수 있으며 USB <-> SATA 브리지는 비표준 SATA 명령을 통과 할 수 있습니다 (Linux 드라이버 + hdparm은 해당 모델에서 수행하는 방법을 알고 있습니다). 또한 예제를 작성하는 데 /dev/sdX좋습니다. 붙여 넣기 및 사용자 정의 할 때 누군가가 누락 된 경우 문제가 없기 때문입니다.
Peter Cordes

@Peter Cordes-디스크가 24 개가 아니라면 ... 아뇨, 바보! 고마워, 나는 그것을 sdX로 바꿨다.
garethTheRed

2
이 방법 링크 된 페이지에는 많은 하드웨어 / 펌웨어 관련주의 사항 ... 종류 무서운
maxschlepzig

그것은 실제로 몇 가지주의 사항을 보여줍니다! 내가 말할 수있는 것은 그것이 아무런 문제없이 나를 위해 일했다는 것입니다.
garethTheRed

2

여기에 네 가지 실용적인 답변이 있습니다.

  1. hdparm방법 에 의해 게시 garethTheRed은 당신이 당신의 컴퓨터에 직접 연결되어있는 경우 아마도 가장 좋습니다. 그러나 USB를 통해 연결을 시도하면 드라이브를 차단할 수 있습니다. 폐기하려는 드라이브에 대해이 작업을 수행하는 경우 좋은 일이 될 수 있습니다. 그러나 폐기하기 전에 지우기를 확보하려고 할 수 있습니다.

  2. imz-Ivan Zakharyaschev 가보고 한 기술 은 효과가 있지만 매우 느릴 수 있습니다. 데이터를 복구 할 수 없도록하려면 /dev/urandom대신 사용하십시오 /dev/zero. 예를 들어

    dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/urandom of=/dev/sdX
    
  3. 나는 다음에 대해 충고한다. 똑같은 일을하는 더 빠른 것을 위해 maxschlepzig (문제)에 의해보고 된 기술을 사용하십시오.

    ddrescue --verbose --force --nosplit /dev/urandom /dev/sdX
    

    이것은 dd명령 보다 빠르지 만 명령만큼 빠르지는 않습니다 hdparm. 내가 이것을 권장하지 않는 이유는 아래를 참조하십시오 ...

  4. badblocks명령은 작동하지만 데이터를 무작위로 무작위 화 할 수 없으며 다시 느리게 진행됩니다.

마지막으로, 사람들이 디스크를 완전히 지우고 자하는 가장 큰 이유는 디스크를 폐기하려고하는 이유를 지적하지 않으면 취소됩니다. 이 경우 아직 디스크를 작성하지 않은 경우 디스크를 먼저 복구하려고 할 수 있습니다. 블록을 읽고 I / O 오류를 반환하면 다음에 같은 블록에 쓸 때 디스크는 예약 목록에서 다른 블록을 재 할당하려고 시도합니다. 예약 목록이 가득 차면 쓰기시 I / O 오류가 발생합니다. 그때 드라이브를 폐기해야합니다.

따라서 다음과 같은 간단한 작업을 수행 할 수 있습니다.

dd if=/dev/sdX of=/dev/null conv=noerror

그런 다음 불량 블록을 다시 작성하려면 다음과 같이하십시오.

dd if=/dev/zero of=/dev/sdX bs=128k

이 명령이 작동하면 용감한 경우 디스크를 다시 포맷하고 다시 사용할 수 있습니다.

또는 badblocks디스크 에서 명령을 두 번 실행할 수 있습니다 . 두 번째로 불량 블록을보고해서는 안됩니다 ...

badblocks -v -s -w -t random /dev/sdX
badblocks -v -s -w -t random /dev/sdX

시간이 오래 걸리지 만 더 안정적입니다.

또한 hdparm명령을 제외하고는 실제로 안전한 지우기를 수행하는 기술이 없다는 점도 주목할 가치가 있습니다 . 모든 나쁜 블록을 기억하십니까? 여전히 원본 데이터 중 일부는 그대로 유지됩니다. 데이터 복구 전문가가 이들에 액세스하여 이전에 하드 드라이브에 있던 소량을 볼 수 있습니다.

ddrescue와 내가 그것에 대해 조언하는 이유와 관련하여 다음과 같은 해독제가 있습니다.

문제는 ddrescure가 오류를 무시하는 데 너무 좋을 것입니다. 나는 dd를 사용하여 102GB 마크에서 쓰기 속도가 지속적으로 떨어지고 238GB 마크에서 쓰기 오류가 발생하기 시작한 하드 드라이브를 가지고있었습니다. 나는 ddrescue가 일정한 속도로 디스크를 계속 넘어 가고 심지어 오류도보고하지 않았다는 것에 깊은 인상을 받았습니다. 17 시간 후, 1300GB가되었을 때 드라이브 표시 등 자체가 깜박임을 멈추는 것을 알게되었습니다. 빠른 검사 결과 전체 USB 인클로저가 오프라인 상태가되었습니다. 드라이브를 크래들에서 꺼 냈습니다. 나는 ddrescue가 디스크를 손에 넣더라도 오류없이 여전히 복사되고 있다고보고했습니다. 디스크를 다른 컴퓨터에 꽂았는데 이제 벽돌이었습니다.

나는 드라이브를 벽돌로 만든 데드 레스크를 탓하지 않습니다. 운전은 실패했고 벽돌이 될 것입니다. 나는 단지 방해하는 ddrescue가 무시하고있는 쓰기 오류 수에 대한 오류 수를 제공하지 않는다는 것을 알았습니다. 이 사용법에서 ddrescue는 모든 쓰기 실패에 관계없이 완전히 성공했다고 생각합니다. 사실 속도가 느려지는 구간에서 최고 속도로 계속할 수 없었을 것입니다. 섹션이 느리게 된 이유는 많은 블록이 드라이브에 의해 재배치되어 해당 섹션에 액세스 할 때 많은 탐색을 야기했기 때문입니다. 그것이 아마도 드레 드레스의 결과물이 허구가 된 시점 일 것입니다.


1
‘안전하게 지우려면 임의의 데이터로 같은 블록을 여러 번 덮어 써야합니다. '' -참조를 통해 귀하의 주장을 입증 할 수 있습니까 (즉, 최신 하드 디스크에서 제로 데이터의 복구를 보여주는 동료 검토 기사)? 또한 하드 디스크 펌웨어는 블랙 박스입니다. ATA secure delete 명령이 제로 패턴에서 각 섹터로 구현되는 것이 아니라는 것을 어떻게 알 수 있습니까?
maxschlepzig

그 반대입니다. 현대 드라이브는 데이터가 너무 조밀하여 단일 쓰기가 효과적이기 때문에 오래된 드라이브에 더 이상 최신 드라이브에 여러 번 쓰기가 필요하지 않은 것으로 나타났습니다.
user6856

1
dd conv=notrunc

아마 나를 위해 트릭을했을 것입니다.

언급

dd conv=noerror

맨 페이지에 따라 오류를 읽기위한 것이어야합니다. 둘을 결합하는 데 나쁜 것은 없습니다.

디스크를 제로화하는 나의 완전한 명령은 다음과 같습니다.

dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/zero of=/dev/sda

경우에 따라 사용자 정의를 추가 bs=할 수도 있습니다.


1

빠르고 성숙한 방법은 사용하는 것 sdd입니다.

모든 컨텐츠를 파괴하려면 다음으로 전화하십시오.

sdd -inull bs=1m of=/dev/rdsk/cXdXtXp0 -noerror

항상 "원시"디스크 드라이버 인터페이스를 사용하십시오.

디스크를 수리하고 가능한 한 오래된 내용을 유지하려면 다음을 호출하십시오.

sdd if=/dev/rdsk/cXdXtXp0 of=/dev/rdsk/cXdXtXp0 bs=1m -noerror

이렇게하면 읽을 수없는 모든 블록이 512 바이트 수준에서 0으로 바뀝니다. 를 통해 재시도 횟수를 수정할 수 있습니다 try=#. 기본값은 2입니다.

참고 sdd빨리보다 dd먼저 제공된 블록 크기 및 오류의 경우에는 읽기를 시도으로 오류가 발생하는 경우에, 그것은 512 바이트로 읽습니다. 읽기 오류가있는 경우 sdd는 무작위로 검색하고 더미 읽기를 수행하여 드라이브의 펌웨어를 안정시킵니다.

향상된 오류 복구 기능은 1980 년대에 개발되었으며 두 번째로 큰 Sun-Microsystems OEM을 위해 일하고있었습니다.

Sdd 소스 코드는 schily 도구에 포함되어 있습니다 :

http://sourceforge.net/projects/schilytools/files/

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