Làm thế nào để bỏ qua lỗi ghi trong khi zeroing một đĩa?


19

Giả sử bạn muốn loại bỏ một đĩa cứng bị lỗi. Bạn muốn ghi đè càng nhiều càng tốt với số không. Những gì bạn không muốn là: quá trình hủy bỏ trong lỗi ghi đầu tiên. Làm thế nào để làm điều đó?

AFAICS, đơn giản ddchỉ cung cấp một tùy chọn để bỏ qua lỗi đọc. Vì vậy, một cái gì đó như

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

Không đủ.

ddrescue có vẻ tốt hơn trong việc bỏ qua lỗi - nhưng dòng lệnh tối ưu với nó là gì?

Tôi đã thử với GNU ddresTHER:

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

1
dd conv=noerrorcó thể là một phần mở rộng GNU, tôi không chắc chắn. Trong mọi trường hợp, nó nên làm thủ thuật. Mặc dù vậy, câu trả lời của chính Tell-the-drive-to-erase rất đáng để xem xét để xóa toàn bộ ổ đĩa.
Peter Cordes

1
@PeterCordes, trang con người của các ddtài liệu GNU noerrorlà 'tiếp tục sau khi đọc lỗi' ...
maxschlepzig

1
dd conv=noerrorist tiêu chuẩn POSIX nhưng nó có thể rất chậm
thường

2
dd conv=noerrorphải dành cho việc đọc lỗi (theo trang chủ), không được viết lỗi. Không có gì xấu khi kết hợp nó với conv=notrunc, điều này đã tạo ra mánh khóe với việc bỏ qua các lỗi ghi cho tôi. unix.stackexchange.com/a/229379/4319
imz - Ivan Zakharyaschev

Một thao tác ghi đơn giản vào ổ cứng, chẳng hạn như sử dụng dd if=/dev/zero of=/dev/sdX, sẽ không thực hiện bất kỳ lần đọc đĩa nào. Tại sao bạn nghĩ lệnh dd "không đủ" ? "Lỗi" nào bạn đang gặp phải?
mùn cưa

Câu trả lời:


12

Tôi thích badblockstrong chế độ viết phá hủy cho điều này. Nó viết, nó tiếp tục làm như vậy khi nó gặp lỗi và cuối cùng nó cho bạn biết những lỗi đó ở đâu và thông tin này có thể giúp bạn quyết định nên làm gì tiếp theo (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)

Và danh sách chặn:

# head badblocks.txt
2097000
2097001
2097002
2097003
2097004

Và những gì còn lại trên đĩa sau đó:

# 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.|

Lưu ý rằng đó không phải là dữ liệu thực sự ngẫu nhiên - mẫu lặp đi lặp lại, vì vậy nếu bạn bỏ qua, 1MiBbạn sẽ thấy lại đầu ra tương tự.

Nó cũng sẽ cố gắng xác minh bằng cách đọc lại dữ liệu, vì vậy nếu bạn có một đĩa tuyên bố là ghi thành công nhưng trả về dữ liệu sai khi đọc lại, nó cũng sẽ tìm thấy những lỗi đó. (Đảm bảo không có quá trình nào khác ghi vào đĩa trong khi badblocks đang chạy để tránh các kết quả dương tính giả.)

Tất nhiên với một đĩa bị hỏng nặng, điều này có thể mất quá nhiều thời gian: không có mã nào có thể khiến nó bỏ qua các khu vực bị lỗi hoàn toàn. Cách duy nhất bạn có thể đạt được điều đó badblockslà sử dụng kích thước khối lớn hơn nhiều.

Tôi không chắc liệu ddrescueđiều này có tốt hơn không; nó phải làm điều đó theo hướng khác (phục hồi càng nhiều dữ liệu càng nhanh càng tốt). Bạn có thể thực hiện thủ công cho dd / ddresTHER / badblocks bằng cách chỉ định khối đầu tiên / cuối cùng ...


1
Nếu tôi sử dụng -t randomhoặc -t 0- không badblocks thì chỉ cần thực hiện một lần viết? Nhìn vào trang man - có vẻ như không -tcó 4 lượt đi (cho '0xaa, 0x55, 0xff, 0x00').
maxschlepzig

2
Nó thực hiện một lần cho mỗi -tbạn cung cấp trên dòng lệnh. Mặc định là 4 vượt qua như bạn nói.
frostschutz

13

Nếu đĩa không được kết nối bằng USB, thì hãy xem xét sử dụng hdparm(phiên bản> 9.31) để thực hiện Xóa an toàn ATA của đĩa. Lệnh này làm cho phần sụn của ổ đĩa xóa sạch nội dung của đĩa, kể cả các khối xấu.

Cảnh báo: Sử dụng ký tự ổ đĩa chính xác - Tôi đã hiển thị /dev/sdXlàm ví dụ - không chỉ sao chép / dán.

Trước tiên, hãy kiểm tra xem nó có hiểu các lệnh ATA không (hầu hết các ổ đĩa được sản xuất trong thập kỷ qua trở lên nên):

$ 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.

Hai dòng cuối cùng của trích xuất cho thấy rằng nó được hỗ trợ.

Do đó, thêm mật khẩu vào ổ đĩa (một yêu cầu rõ ràng):

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

và xóa:

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

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

Thông tin thêm về thủ tục này có sẵn ở đây .


Điều này có thể hoạt động qua USB nếu bạn may mắn và cầu USB <-> SATA của bạn có thể chuyển qua các lệnh SATA không chuẩn (và trình điều khiển Linux + hdparm biết cách thực hiện trên mô hình đó). Ngoài ra, để viết ví dụ, /dev/sdXlà tốt, bởi vì sau đó nếu ai đó bỏ lỡ sự xuất hiện của nó khi dán và tùy chỉnh, sẽ không có vấn đề gì.
Peter Cordes

@Peter Cordes - Trừ khi bạn có 24 đĩa ... Không, tôi thật ngốc! Cảm ơn, tôi đã đổi nó thành sdX, điều đó sẽ dạy tôi vội vàng trả lời!
garethTheRed

2
Trang được liên kết liệt kê rất nhiều cảnh báo liên quan đến phần cứng / phần sụn với phương pháp này ... thật đáng sợ
maxschlepzig

Nó thực sự hiển thị khá nhiều hãy cẩn thận! Tất cả những gì tôi có thể nói là nó hoạt động với tôi mà không gặp rắc rối nào.
garethTheRed

2

Tôi thấy bốn câu trả lời khả thi ở đây:

  1. Các hdparm phương pháp đăng bởi garethTheRed có lẽ là tốt nhất nếu bạn đang kết nối trực tiếp đến máy tính của bạn. Tuy nhiên, rõ ràng, nếu bạn thử kết nối qua USB, bạn có thể biến ổ đĩa của mình thành cục gạch. Nếu bạn đang làm điều này cho một ổ đĩa bạn sắp xử lý, thì đó có thể là một điều tốt. Tuy nhiên, bạn có thể muốn xóa an toàn trước khi loại bỏ.

  2. Kỹ thuật được báo cáo bởi imz - Ivan Zakharyaschev sẽ hoạt động, nhưng có thể rất chậm. Tôi sẽ đề nghị nếu bạn không muốn dữ liệu có thể phục hồi được, hãy sử dụng /dev/urandomthay vì /dev/zero; ví dụ,

    dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/urandom of=/dev/sdX
    
  3. Tôi sẽ tư vấn chống lại những điều sau đây. Đối với một cái gì đó nhanh hơn mà làm điều tương tự, sử dụng kỹ thuật được báo cáo bởi maxschlepzig (trong câu hỏi):

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

    Điều này sẽ nhanh hơn ddlệnh, nhưng không nhanh bằng hdparmlệnh. Xem bên dưới tại sao tôi không khuyên bạn ...

  4. Các badblocks lệnh cũng sẽ làm việc, nhưng bạn không thể ngẫu nhiên các dữ liệu theo cách đó, và một lần nữa nó sẽ rất chậm.

Cuối cùng, tôi sẽ cảm thấy hối hận nếu tôi không chỉ ra lý do số một mà mọi người muốn xóa hoàn toàn một đĩa là họ sắp xử lý nó. Trong trường hợp đó, nếu bạn chưa có, bạn có thể muốn thử và khôi phục đĩa trước. Nếu bạn đọc một khối và nó trả về lỗi I / O, thì lần tới khi bạn ghi vào cùng một khối, đĩa sẽ cố gắng phân bổ lại một khối khác từ danh sách dự trữ. Khi danh sách dự trữ đã đầy thì bạn sẽ nhận được lỗi I / O khi ghi. Đó là khi bạn thực sự nên loại bỏ ổ đĩa.

Vì vậy, bạn có thể làm một cái gì đó đơn giản như:

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

Và, sau đó, để viết lại các khối xấu, chỉ cần một cái gì đó như:

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

Nếu lệnh này hoạt động, nếu bạn dũng cảm, bạn có thể định dạng lại đĩa của mình và sử dụng lại.

Ngoài ra, bạn có thể chạy badblockslệnh trên đĩa hai lần. Lần thứ hai nó sẽ báo cáo không có khối xấu ...

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

Điều này sẽ mất nhiều thời gian hơn, nhưng đáng tin cậy hơn.

Cũng cần lưu ý rằng không có kỹ thuật nào thực sự xóa an toàn, ngoại trừ hdparmlệnh. Nhớ tất cả những khối xấu? Những người vẫn còn một số dữ liệu ban đầu của bạn còn nguyên vẹn. Một chuyên gia phục hồi dữ liệu có thể truy cập những thứ này để xem một lượng nhỏ những gì trước đây trên ổ cứng của bạn.

Liên quan đến ddresTHER và lý do tại sao tôi khuyên chống lại nó, tôi có thuốc giải độc sau:

Vấn đề là ddrescure sẽ rất tốt trong việc bỏ qua lỗi. Tôi đã có một ổ đĩa cứng liên tục với dd giảm tốc độ ghi ở khoảng 102 GB và bắt đầu tạo ra lỗi ghi ở mốc 238 GB. Tôi đã rất ấn tượng khi ddresTHER tiếp tục lướt qua đĩa với tốc độ không đổi, thậm chí báo cáo không có lỗi. 17 giờ sau, khi nó ở mức 1300 GB khi tôi tình cờ thấy đèn ổ đĩa tự dừng nhấp nháy. Kiểm tra nhanh cho thấy toàn bộ vỏ USB đã bị tắt. Tôi kéo ổ đĩa ra khỏi cái nôi. Tôi nhận thấy ddresTHER chỉ vui vẻ báo cáo rằng nó vẫn đang sao chép mà không có lỗi, ngay cả với đĩa trong tay tôi. Tôi cắm đĩa vào một máy khác và thấy nó bây giờ là một cục gạch.

Tôi không đổ lỗi cho ddresTHER đã biến ổ đĩa thành cục gạch. Ổ đĩa đã thất bại và sẽ trở thành một viên gạch. Tôi chỉ thấy làm phiền ddresTHER thậm chí không đưa ra số lỗi về việc có bao nhiêu lỗi ghi mà nó đang bỏ qua. Trong cách sử dụng này, ddresTHER khiến bạn nghĩ rằng nó đã hoàn toàn thành công, bất kể mọi lỗi viết. Thực tế là nó không nên tiếp tục ở tốc độ tối đa trong phần với sự chậm lại. Lý do phần đó bị chậm, là nhiều khối đã được di chuyển bởi ổ đĩa, gây ra rất nhiều tìm kiếm khi truy cập vào phần đó. Vì vậy, đó có lẽ là điểm khi đầu ra của ddresTHER trở thành hư cấu.


1
'Để xóa an toàn, bạn cần ghi đè cùng một khối nhiều lần với dữ liệu ngẫu nhiên.' - bạn có thể chứng minh yêu cầu của mình bằng một tài liệu tham khảo (tức là bài viết được đánh giá ngang hàng cho thấy sự phục hồi của dữ liệu 0 trên các đĩa cứng hiện đại)? Ngoài ra, phần cứng ổ cứng là một hộp đen. Làm thế nào để bạn biết rằng lệnh xóa an toàn ATA không chỉ được triển khai dưới dạng write-zero-pattern-to-every-sector?
maxschlepzig

Chỉ là ngược lại. Có vẻ như vào năm 2006, có một số nghiên cứu cho thấy việc ghi nhiều trường cũ không còn cần thiết với các ổ đĩa hiện đại, vì các ổ đĩa hiện đại lưu trữ dữ liệu dày đặc đến nỗi một lần ghi cũng hiệu quả.
dùng6856

1
dd conv=notrunc

có lẽ đã lừa tôi

Cái được nhắc đến

dd conv=noerror

phải dành cho việc đọc lỗi (theo trang chủ). Không có gì xấu trong việc kết hợp cả hai.

Lệnh hoàn chỉnh của tôi cho zeroing một đĩa trông giống như:

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

Thêm một tùy chỉnh bs=cũng có thể được muốn cho một số trường hợp.


1

Một phương pháp nhanh chóng và trưởng thành là sử dụng sdd.

Nếu bạn chỉ muốn hủy tất cả nội dung, hãy gọi:

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

Luôn sử dụng giao diện trình điều khiển đĩa "thô".

Nếu bạn muốn sửa chữa một đĩa và giữ càng nhiều nội dung cũ càng tốt, hãy gọi:

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

Điều này sẽ thay thế tất cả các khối không thể đọc được bằng các số 0 ở mức 512 byte. Bạn có thể muốn sửa đổi số lần thử lại thông qua try=#, mặc định là 2.

Lưu ý rằng sddnhanh hơn ddtrong trường hợp có lỗi khi lần đầu tiên cố đọc với kích thước khối được cung cấp và trong trường hợp có lỗi, nó đọc với 512 byte. Nếu có lỗi đọc, sdd thực hiện tìm kiếm ngẫu nhiên và đọc giả để làm dịu phần sụn của ổ đĩa.

Các tính năng khôi phục lỗi nâng cao đã được phát triển vào những năm 1980 trong khi tôi đang làm việc cho OEM Sun-microsystems lớn thứ hai.

Sdd sourcecode được bao gồm trong các công cụ schily:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.