Làm thế nào để sử dụng dd để điền vào ổ đĩa với 1


7

Việc lấp đầy một ổ đĩa với / dev / urandom dường như rất chậm, vì vậy tôi đã tạo một tệp chứa FF:

dd if=/dev/zero ibs=1k count=1000 | tr "\000" "\377" >ff.bin

Tôi muốn lấp đầy ổ đĩa bằng các bản sao của tệp này nhưng lệnh sau chỉ ghi một lần:

dd if=ff.bin of=/dev/sdb count=10000

Làm cách nào để tôi lấp đầy ổ đĩa bằng các bản sao của tệp hoặc có cách nào nhanh hơn để lấp đầy ổ đĩa bằng 1?


5
Tại sao không sử dụng số không? 1 bit không xóa đĩa tốt hơn 0 bit.
Gilles 'SO- ngừng trở thành ác quỷ'

3
@Gilles Tôi đoán số 0 đủ đặc biệt để trình điều khiển đĩa có thể gian lận và không thực sự ghi bất cứ điều gì vào đĩa, chỉ đánh dấu các khối là trống. Tôi nghĩ rằng một số đĩa cứng ảo làm như vậy. Tuy nhiên, điều đó phụ thuộc vào lý do anh ấy lấp đầy ổ đĩa. Nếu đó là bảo mật, cả 0 và 1 đều không đủ an toàn và việc điền ngẫu nhiên sẽ không tốt nếu đĩa cứng là SSD
pqnet

2
@pqnet Zero không đặc biệt cho lưu trữ vật lý. Với một đĩa cứng ảo, nó có thể, nhưng làm đầy bất cứ thứ gì là không an toàn. Đối với SSD, có các vấn đề cụ thể với các khối được phân bổ lại, nhưng viết bằng các giá trị khác không giúp ích cho điều đó.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles tốt, lý do mà anh ấy muốn ghi vào đĩa của anh ấy không được giải thích vì vậy tôi nghĩ sẽ rất tuyệt nếu câu hỏi được làm rõ
pqnet

Người đáng kính ddcó một tùy chọn seek=N skip N obs-sized blocks at start of output, vì vậy bạn có thể viết một vòng lặp để tìm đúng vị trí k*Mtrên thiết bị khối đầu ra trước khi lặp lại ghi của tệp cỡ M.
David Tonhofer

Câu trả lời:


11

Đơn giản chỉ cần làm:

tr '\0' '\377' < /dev/zero > /dev/sdb

Nó sẽ hủy bỏ với một lỗi khi ổ đĩa đầy.

Sử dụng ddkhông có ý nghĩa ở đây. Bạn sử dụng ddđể đảm bảo đọc và viết được làm bằng một kích thước cụ thể. Không có lý do để làm điều đó ở đây. trsẽ đọc / ghi 4 hoặc 8 kiB, đủ tốt.


1
bạn thậm chí có thể nhận được một sự gia tăng với tr ... | tee - - - > /dev/disknhưng khả năng trmột mình không đáp ứng và vượt quá nút thắt ghi là khá mong manh.
mikeerv

1
@mikeerv, tôi nghĩ cách duy nhất để tăng hiệu suất từ ​​đó là giảm số lượng cuộc gọi hệ thống được thực hiện. teeSẽ không giúp cho điều đó. stdbuf -o1M tr...có thể giúp.
Stéphane Chazelas

Đã đồng ý. Đôi khi tôi sử dụng /dev/zeronhư một cái xô với tr- như cho dòng mới hoặc bất cứ thứ gì - và nó luôn tiêu thụ toàn bộ cpu. Tôi nghĩ rằng lực kéo từ kernel bơm ra tất cả các byte đó là khá nặng. Tôi đã nghĩ rằng có lẽ các tập tin chỉ có thể bị lừa. Có lẽ nó bị câm.
mikeerv

4
@mikeerv, thực sự, sử dụng tee - - -không làm tăng thông lượng đáng kể trong thử nghiệm của tôi. Đó là từ 800MiB / giây cho tr(950MiB / giây với stdbuf) đến 2,3GiB / giây với tee, như bạn nói trong mọi trường hợp vượt quá tốc độ mà mọi ổ đĩa hiện tại có thể duy trì.
Stéphane Chazelas

Có thể đúng, nhưng trận lụt 2,3g đó vẫn sẽ tiếp tục nhỏ giọt ngay khi đường ống của bạn bước ra ngoài tầm kiểm soát công việc. stdbuflà thông minh - tôi không bao giờ sử dụng nó và có lẽ nên. Và đây là lần thứ hai sau bao nhiêu ngày ai đó khiến tôi chú ý. Tôi nghĩ một điều khác là CentOS - Tôi đã đọc ở đâu đó về bộ đệm kernel 64kb.
mikeerv

4

Để /dev/urandomthay thế nhanh hơn , có shred -v -n 1(nếu giả ngẫu nhiên là OK) hoặc sử dụng cryptsetupvới khóa ngẫu nhiên và bỏ qua số đó (đối với các số 0 được mã hóa). Ngay cả khi không tăng tốc AES, nó vẫn dễ dàng đánh bại /dev/urandomtốc độ.

Không chắc trlà nhanh như thế nào , nếu không bạn có thể chỉ dd if= | tr | dd of=.

Sử dụng một tệp làm nguồn mẫu có thể được thực hiện như thế này:

(while [ 1 ]; do cat file; done) | dd of=...

Mặc dù tệp phải lớn một cách hợp lý để có hiệu quả từ xa.

Nếu điều count=quan trọng với bạn, hãy thêm iflag=fullblockvào ddlệnh. Có thể đọc một phần sẽ dẫn đến các khối một phần được tính là các khối đầy đủ. Điều này đặc biệt khi sử dụng các khối lớn hơn (như bs=1M), mà bạn nên làm nếu muốn tốc độ.


shred là nhanh, và nó báo cáo tiến độ! Cảm ơn!
linuxfix

2

Đây là cách viết rất nhanh và hiệu quả để viết chuỗi 64 kB 0xFF, sử dụng awk, tiêu thụ <8% CPU và chỉ bị giới hạn bởi tốc độ của ổ đĩa bạn đang ghi.

Tôi đã thử sử dụng trnhư được đề xuất ở đây và thấy nó rất chậm và tiêu tốn rất nhiều CPU dịch từng Byte. Phương pháp của tôi hoạt động trong các khối 64 kB và nhanh hơn ít nhất 3,5 lần so với dựa trên một ký tự tr(26 MB / s so với 7 MB / s trên PATA hw cũ - hoàn thành trong 52 phút trong im lặng so với hơn 3 giờ với vòng quay quạt làm mát lớn ...). Tôi thích khi mọi người gạt bỏ kiến ​​thức khoa học máy tính cơ bản mà không kiểm tra ý kiến ​​của họ trước.

Tôi khuyên bạn nên xây dựng tập lệnh sau bằng cách sử dụng printftừ trình bao thay vì cố gắng ghi tập lệnh này vivì hầu hết các đĩa CD-ROM khởi động sẽ không cung cấp cho bạn đủ không gian tmp để nhật ký bộ đệm sao chép và dán 65.536 lần ...

1) Soạn kịch bản

$ printf "echo | awk '{\n\twhile (1) {\n\t\tprintf(\"%%s\", \"" >/tmp/writeones.sh
$ for i in `seq 1 65536`; do printf '\377' >>/tmp/writeones.sh; done
$ printf "\");\n}\n}'\n" >>/tmp/writeones.sh

tập lệnh đầu ra có vẻ như: (Bỏ qua một số ký tự 0xff trong chuỗi)

echo | awk '{                                                                                                                           
    while (1) {
        printf("%s", "ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ...");
    }
}'

2) Kiểm tra tập lệnh:

$ sh /tmp/writeones.sh | od -Ax -tx1
000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
*
Ctrl+C

3) Chạy tập lệnh và đường ống vào ổ đĩa của bạn bằng dd (kiểm tra kỹ xem bạn có đúng ổ đĩa không !!!):

# sh /tmp/writeones.sh | dd of=/dev/ada0 bs=65536 &

Tại sao tôi chọn 64 kB? 1. Giới hạn danh sách đối số của AWK và 2. đối với phần cứng của tôi, điều này đạt được tốc độ tốt nhất cho tôi. Tôi cũng đã thử viết cái này chỉ trong shell bằng printf và thấy nó chậm hơn 40% và tiêu tốn 80% CPU vì tất cả các dĩa.


Nhưng không có dĩa?
David Tonhofer

0

Để kiểm tra tốc độ SSD, tôi đã viết một chương trình Perl nhỏ để viết "số không", "số" hoặc chữ số cho một thiết bị khối được đưa ra trên dòng lệnh. Nó không gọi ddgolem, chỉ viết và đồng bộ trực tiếp. Có thể giúp đỡ ở đây:

https://github.com/dtonhofer/wild_block_device_filler

Chỉ cần chạy nó là

wildly_fill_block_device.pl --dev=sdX1 --fillpat 1 --chunksize=1024P --sync

Và nó sẽ ghi 0xFF vào / dev / sdX1 (không có bộ đệm, sử dụng syswrite ()) của Perl trong các khối của (trong trường hợp này) "1024 khối vật lý" trong khi đồng bộ hóa dữ liệu vào đĩa sau mỗi lần ghi bằng fdatasync (). Trên ổ SSD của tôi, nó chạy ở tốc độ ~ 70 MiB / s.

Nó sẽ hỏi bạn liệu bạn có BỀN hay không trước khi tiến hành nuke phân vùng hoặc đĩa.


0

Bạn có thể làm điều đó khá hiệu quả trong Bash mà không cần các tệp bên ngoài, ngoại trừ thiết bị để ghi hoặc các lệnh bên ngoài, ngoại trừ dd.

  1. Sử dụng printfđể tạo một byte với tất cả một bit và đặt nó vào biến Bash.
  2. Ghép biến Bash thành chính nó nhiều lần.
  3. Sử dụng thay thế quy trình Bash để giả mạo một tệp đầu vào dài vô hạn lặp đi lặp lại echobiến Bash không có dòng mới.
  4. Sử dụng như là tập tin đầu vào dd.

Nếu bạn có GNU dd, hãy lấy một thanh tiến trình tốt đẹp với:

sudo -i
bash
ones="$( printf '\xff' )"; for _ in {1..16}; do ones="$ones$ones"; done; dd status=progress bs=65536 if=<( while true; do echo -n "$ones"; done ) of=/dev/whatever

Hủy bỏ status=progressnếu nó không làm việc cho bạn. Đây 65536là 2 16 , bởi vì byte ban đầu với tất cả một bit được nhân đôi 16lần.


-1

Cách lau bằng 1:

while true; do echo 1 ; done | dd of=/dev/sdX status=progress

Cách kiểm tra lau:

dd if=/dev/sdX count=1 bs=512
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.