`Dd if = / dev / zero of = / dev / sda` làm gì


19

Đã chỉnh sửa: không chạy cái này để kiểm tra trừ khi bạn muốn hủy dữ liệu.

Ai đó có thể giúp tôi hiểu những gì tôi nhận được?

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

    Q: Tại sao cụ thể là 4096 cho count?

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

    Q: Chính xác thì nó làm gì?


4
Bạn đã tìm thấy mã độc này ở đâu
Suici Doga

10
Đây không phải là mã độc.
Michael Hampton

12
@MichaelHampton: s / độc hại / phá hoại / Trong khi đăng mã phá hoại không phải là độc hại cho mỗi se, đăng nó mà không có cảnh báo rõ ràng rằng nó có thể phá hủy dữ liệu IS.
Ben Voigt

1
Tốt nhất nên nghĩ DD là 'Kẻ hủy diệt đĩa' khi ai đó trên internet bảo bạn chạy một lệnh như thế này.
Bobby Sacamano

3
thực ra DD có nghĩa là mô tả dữ liệu
Suici Doga

Câu trả lời:


43

dd if = / dev / zero of = / dev / sda bs = 4096 Count = 4096 Q: tại sao 4096 được sử dụng đặc biệt cho bộ đếm?

Điều này sẽ loại bỏ 16 MiB đầu tiên của ổ đĩa. 16 MiB có lẽ là quá đủ để nuke bất kỳ cấu trúc "bắt đầu đĩa" nào trong khi đủ nhỏ để nó sẽ không mất nhiều thời gian.

dd if = / dev / zero of = / dev / sda bs = 512 đếm = 4096 tìm kiếm = $ (expr blockdev --getsz / dev / sda - 4096)

Q: Chính xác thì điều này là gì?

blockdev --getszlấy kích thước của thiết bị khối trong "512 byte sector". Vì vậy, lệnh này có vẻ như được dự định loại bỏ 2 MiB cuối cùng của ổ đĩa.

Thật không may lệnh này bị lỗi cú pháp khôn ngoan. Tôi hy vọng lệnh ban đầu được dự định là

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

và backticks bị mất ở đâu đó dọc theo dòng người sao chép / dán nó giữa các môi trường khác nhau.

Các bảng phân vùng cũ, siêu dữ liệu LVM, siêu dữ liệu đột kích, vv có thể gây ra sự cố khi sử dụng lại ổ đĩa. Việc loại bỏ các phần ở đầu và cuối ổ đĩa thường sẽ tránh được các vấn đề này trong khi nhanh hơn nhiều so với việc loại bỏ toàn bộ ổ đĩa.


4
Cảm ơn bạn. Câu trả lời này dường như đáp ứng hầu hết cho những gì tôi đang tìm kiếm. Hai lệnh được sử dụng sau delpart. Chúng được sử dụng để xóa đĩa để sử dụng lại sạch sẽ.
JH

expr blockdev --getsz /dev/sda - 4096sẽ là một lỗi cú pháp của expr. Tôi nghĩ rằng lệnh dự định là ...seek="$(expr "$(blockdev --getsz /dev/sda)" - 4096)". Hoặc tốt hơn:...seek="$(($(blockdev --getsz /dev/sda) - 4096))"
Stéphane Chazelas

1
Tôi đoán là ban đầu đã có backticks trong lệnh và họ đã bị ăn ở một số điểm.
cắm vào

16

Điều này sẽ xóa đầu tiên 4096*4096=16MBvà cuối cùng 512*4096=2MBcủa ổ cứng của bạn, chứa các cấu trúc quan trọng hữu ích để phục hồi. Tôi giả sử mã này đã được đăng độc hại.

Tôi chưa bao giờ gặp phải một tình huống trong đó chỉ định rõ ràng một cái countkhác hơn 1là hữu ích. Tôi đã xóa khối đầu tiên nếu tôi muốn đảm bảo rằng tôi sẽ không để lại bất kỳ dấu vết nào của MBR phía sau ...


8
Điều này không hoàn toàn độc hại, tôi đã có một số chương trình định dạng xấu từ chối viết nhãn mới nếu nhãn hiện tại bị hỏng và do đó phải tự loại bỏ vài byte đầu tiên như thế này.
Shelvacu

1
@shelvacu Tôi sẽ ngạc nhiên nếu ổ đĩa bị thao túng theo cách này sda. Nhiều khả năng sdbhay sdc. Nhưng tất nhiên tôi có thể sai ...
yo '

7
Đây không phải là độc hại. Nó xóa GPT ở đầu đĩa và GPT dự phòng ở cuối đĩa.
Michael Hampton

2
@shelvacu: Nó phá hoại. Nếu các lệnh phá hoại được đăng mà không có lời giải thích về những gì nó làm, thì đó là độc hại. Nếu họ được kèm theo một lời giải thích, tại sao OP lại hỏi về nó ở đây?
Ben Voigt

2
Vì vậy, ai, trong tâm trí hoàn hảo của nó, sẽ sao chép / dán mã được tìm thấy ở bất cứ đâu mà không biết mục đích của nó? Không độc hại vì tôi sẽ không lắc bất kỳ thiết bị lạ nào tôi có thể tìm thấy ở tàu điện ngầm.
Magno C

4

Các lệnh đó sẽ ghi đè lên thiết bị sda của bạn bằng số 0 - lệnh đầu tiên sẽ thực hiện 16 MB đầu tiên (kích thước khối 4096 và đếm 4096 khối) và lệnh thứ 2 sẽ ghi đè lên 2 MB cuối cùng (kích thước khối 512 với 4096 khối) bằng số không. (nó không xóa về mặt kỹ thuật và điều đó liên quan đến điểm đầu tiên của tôi bên dưới.)

(đó là phần đã được đề cập trong các câu trả lời khác, bao gồm cả ở đây để hoàn thiện)

Một điều đáng nói nữa là kích thước khối không có hiệu ứng, nhưng những thứ đó thường chỉ được nhìn thấy trên các hoạt động âm lượng lớn. Cách hiệu quả nhất (nhanh nhất) để thực thi lệnh là nếu kích thước khối của lệnh khớp với kích thước truy cập của thiết bị, nếu không sẽ lãng phí thời gian.

Nếu bạn quan tâm, bạn có thể thử tạo một tệp có một triệu khối 1 khối và một tệp có 1 triệu khối và xem sự khác biệt:

[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

Như bạn có thể thấy, blocksize có tác động lớn đến hiệu quả. Đó có lẽ là một thanh bên của OP, nhưng tôi cảm thấy rằng nó vẫn còn liên quan.

TL; DR: Không thực thi mã tùy ý bạn tìm thấy trên mạng hoặc người mà bạn không tin tưởng cung cấp cho bạn. Nó sẽ phá hỏng ngày của bạn.


7
+1 cho Don't execute arbitrary code you find on the netdòng
Sergiy Kolodyazhnyy

7
"Lưu ý rằng quá trình này cực kỳ tẻ nhạt và / hoặc tốn kém và đòi hỏi thiết bị cực kỳ cụ thể." Ngừng lan truyền thông tin sai lệch này. Lần cuối cùng, điều này thậm chí có thể về mặt lý thuyết là cách đây hàng thập kỷ về công nghệ vốn đã lỗi thời. Không ai từng chứng minh loại phục hồi này trên các ổ đĩa hiện đại, ngay cả khi đối phó với các thách thức công cộng bằng tiền thưởng, ví dụ: hostjury.com/blog/view/195/ trộm
Andrew Medico

Tôi đã xóa phần đó - đoán rằng đã lâu rồi tôi mới nghe về điều đó. Tuy nhiên, tôi sẽ nói rằng "về mặt lý thuyết" là từ hoạt động, nhưng tôi lạc đề.
Tim S.

2

Những người khác đã giải thích những gì họ làm, vì vậy tôi sẽ bỏ qua điều đó.

Điểm quan trọng trong ddviệc có sự tách biệt bscountlập luận là bskiểm soát số lượng được viết tại một thời điểm . Việc chỉ định các giá trị thực sự lớn bssẽ yêu cầu bộ đệm thực sự lớn trong chương trình và việc chỉ định các giá trị nhỏ hơn kích thước khối của thiết bị sẽ chậm vì hạt nhân phải xây dựng toàn bộ khối để ghi vào thiết bị (trong trường hợp như thế này có thể có thể đệm ghi cho đến khi có một khối hoàn chỉnh, trong các trường hợp khác, nó có thể phải đọc những gì đã có trên đĩa). Khi hai lệnh sử dụng các giá trị khác nhau bs, điều đó khiến tôi nghĩ rằng bạn có thể đã tìm thấy chúng trên hai trang web khác nhau. Đĩa cứng được sử dụng để có kích thước khối 512 byte, tương ứng vớibs=512của lệnh sau, nhưng một số (6-8 tôi nghĩ) nhiều năm trước họ đã bắt đầu tạo đĩa với kích thước khối 4096 byte, tạo ra bs=4096sự lựa chọn tốt hơn cho các đĩa hiện đại.


1
Điểm ngọt ngào bslà cao hơn nhiều . Một lệnh SATA duy nhất có thể đọc hoặc ghi nhiều cung, do đó, hạt nhân hợp nhất I / O trước khi gửi chúng ra. Bất cứ nơi nào từ bs=64kđến bs=1024klà hợp lý (kích thước bộ đệm L3 thường là 4-8MiB). Tôi thường sử dụng bs=128k, một nửa kích thước bộ đệm L2 trên các CPU Intel hiện đại. ( ddbao gồm hai thao tác memcpy: read(2)từ nguồn (ngay cả khi nó / dev / zero) và write(2)IIRC, sddcó một tùy chọn để ghi số không, sẽ tiết kiệm một chút thời gian của CPU. Thực sự chỉ liên quan nếu đích đến là một cái gì đó khác với một đĩa).
Peter Cordes

Để xem việc hợp nhất yêu cầu I / O xảy ra, hãy xem đầu ra của iostat -x 4một cái gì đó và lưu ý các cột rrqm / s (yêu cầu đọc được hợp nhất mỗi giây) và cột wrqm / s.
Peter Cordes

1

CẢNH BÁO: dd if=/dev/zero of=/dev/ được sử dụng để làm sạch ổ đĩa hoặc thiết bị trước khi sao chép dữ liệu pháp y. Ổ đĩa hoặc thiết bị phải luôn được vệ sinh trước khi sao chép thông tin từ hệ thống được điều tra pháp y để giảm thiểu ô nhiễm chéo. Do đó, nó không phải là một lệnh xấu, người dùng cuối phải hiểu nó được sử dụng để làm gì hoặc họ sẽ phá hủy dữ liệu của họ. Nếu đây là những gì bạn mong muốn thì để xác minh thao tác ghi không làm gì dd if=/dev/sda | hexdump -C | head.

Nguồn: Hướng dẫn thực hành về điều tra pháp y máy tính của Tiến sĩ Darren Hayes


1

Tôi sử dụng dd if=/dev/zero of=/dev/sdX oflag=syncđể kiểm tra chất lượng của ổ USB được cắm hoặc thẻ MicroSD TRƯỚC KHI tôi thực sự sử dụng nó với gparted, fdisk hoặc dd với hình ảnh đĩa. Tôi nghĩ rằng đây là một ý tưởng thận trọng, đặc biệt là với phương tiện truyền thông MicroSD có lịch sử chất lượng kém.

Tất nhiên, hãy cẩn thận với = sdX vì không có sự tha thứ với việc xóa đĩa vô tình. Xác minh rằng X = ký tự ổ đĩa của mục tiêu dự định.

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.