디스크가 0이 되었을 때 쓰기 오류를 무시하는 방법은 무엇입니까?

디스크가 0이 되었을 때 쓰기 오류를 무시하는 방법은 무엇입니까?

고장난 하드 드라이브를 0으로 만들고 싶다고 가정해 보겠습니다. 가능한 한 많은 콘텐츠를 0으로 덮고 싶습니다. 원하지 않는 것은 첫 번째 쓰기 오류에서 프로세스가 중단된다는 것입니다. 어떻게 하나요?

AFAICS, 일반 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

나는 badblocks파괴적인 쓰기 모드를 사용하는 것을 선호합니다. 오류가 발생하면 계속해서 오류를 발생시키고 결국 해당 오류가 어디에 있는지 알려주고 다음에 수행할 작업을 결정하는 데 도움이 될 수 있는 정보를 제공한다고 기록합니다(혼합됩니까?).

# 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를 수동으로 수행할 수 있습니다.

답변2

디스크가아니요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

이 프로세스에 대한 자세한 내용을 확인할 수 있습니다.여기.

답변3

여기에는 네 가지 가능한 답변이 있습니다.

  1. hdparm방법아나운서가레스 레드컴퓨터에 직접 연결하는 경우 가장 좋습니다. 그러나 분명히 USB를 통해 연결하려고 하면 드라이브가 손상될 수 있습니다. 폐기하려는 드라이브에 대해 이 작업을 수행하는 경우 이는 좋은 일이 될 수 있습니다. 그러나 삭제하기 전에 해당 내용을 반드시 지워야 할 수도 있습니다.

  2. 기술보고자imz - 이반 자하랴체프작동하겠지만 아마도 매우 느릴 것입니다. 데이터를 복구할 수 없도록 하려면 /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가 무시하는 쓰기 오류 수에 대한 오류 수조차 제공하지 않는다는 사실이 혼란스럽습니다. 이 사용법에서 ddrescue는 모든 쓰기 실패에 관계없이 완전히 성공했다고 생각하게 만듭니다. 실제로 감속 구간에서는 최고 속도로 계속 주행할 수 없어야 합니다. 이 섹션이 느린 이유는 드라이브가 많은 블록을 재배치했기 때문에 이 섹션에 액세스할 때 많은 검색이 발생하기 때문입니다. 따라서 이것이 ddrescue의 출력이 가상이 되는 지점일 수 있습니다.

답변4

dd conv=notrunc

나에게 유용할 수도 있습니다.

거기에 언급된

dd conv=noerror

읽기 오류여야 합니다(맨 페이지에 따르면). 둘을 합쳐도 아무런 문제가 없습니다.

디스크를 0으로 만드는 전체 명령은 다음과 같습니다.

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

bs=어떤 경우에는 사용자 정의를 추가해야 할 수도 있습니다.

관련 정보