dd: ghi vào nhiều đĩa?


16

Tôi có 2 định dạng chính xác, cùng kích thước và cùng một thẻ SD. Tôi muốn ddhình ảnh đến /dev/disk2/dev/disk3cùng một lúc.
Mã giả

sudo dd bs=1m if=/Users/masi/2016-05-10-raspbian-jessie.img of={/dev/disk2,/dev/disk3}

Làm thế nào bạn có thể ddtừ một đầu vào đến nhiều SD đầu ra?


Mục tiêu ở đây là gì? Hiệu suất? Nếu có, hãy nhớ dữ liệu bạn đọc sẽ được lưu trữ. Vì vậy, dd thứ 2 sẽ cho bạn dữ liệu từ bcache của bạn thay vì đọc (tất nhiên bạn cần một số RAM miễn phí).
KWubbufetowicz

2
Thử nghiệm đơn giản của tôi với GNU coreutils dd ... of=one of=twokhông tạo ra hai đầu ra. Có thể cần hai ddlệnh. Tôi không thấy từ ngữ trong posix cho dd để cho phép nhiều người of.
Jeff Schaller

@KWubbufetowicz Tôi có RAM 8GB. Có thể nhận được 32GB. Tốc độ là mục tiêu của tôi vì tôi có 5 SD.
Léo Léopold Hertz

Câu trả lời:


20
  1. Mượn từ câu trả lời của don_crissti bằng cách sử dụng tee, nhưng không có ddhoặc bash isms:

    sudo tee /dev/disk2 /dev/disk3 > /dev/disk4 < masi.img
    
  2. Sử dụng peetừ gói moreutils của Debian :

    sudo dd if=masi.img | \
      pee "dd of=/dev/disk2"  "dd of=/dev/disk3"  "dd of=/dev/disk4"
    

    Với bash, kshhoặc zsh, có thể được viết tắt là:

    sudo dd if=masi.img | pee "dd of=/dev/disk"{2..4}
    

    Hoặc thậm chí, (nếu không cần ddcác chức năng hữu ích):

    sudo pee "dd of=/dev/disk"{2..4} < masi.img
    

    peelà hữu ích; nếu được yêu cầu, người ta có thể bao gồm, (trong mỗi đối số được trích dẫn), các ddtùy chọn riêng biệt bổ sung và thậm chí các đường ống và bộ lọc khác, được điều chỉnh riêng cho từng thiết bị đầu ra.

Với một trong hai phương thức, số lượng đĩa đầu ra có thể được kéo dài vô tận.


1
Sử dụng dd cho việc này là không cần thiết. Nhiều người tin rằng điều đó là cần thiết bởi vì cách sử dụng, cụ thể là sao chép vào hoặc từ hình ảnh đĩa, là "hóa thạch" trong các hướng dẫn được viết lại vào những năm 90 và được sao chép bởi những người không biết tại sao. Nó đã được sử dụng trước đó để làm việc xung quanh một trục trặc trong cp.
Random832

@ Random832 Nó là cần thiết bởi vì nó ổn định hơn cp. Hãy thử nhiều định dạng và kích cỡ phân bổ khác nhau. Tôi chưa tìm thấy đủ ổn định cpcho công việc. Xin vui lòng, sửa cho tôi như một câu trả lời ở đây nếu bạn có thể tranh luận như thế nào cplà đủ ổn định.
Léo Léopold Hertz

@Masi Rất hiếm khi cần chọn rõ ràng một định dạng (bạn thậm chí có nghĩa là gì bởi "định dạng") và kích thước phân bổ (ý bạn là kích thước khối?) Cho mục đích chung là ghi ảnh đĩa vào đĩa hoặc đọc đĩa vào một hình ảnh đĩa. Lý do dd được sử dụng phổ biến cho mục đích này là do lỗi cp (đặc biệt là GNU cp trên Linux) vào đầu những năm 90 khiến nó bỏ qua các khối sao chép có tất cả các byte.
Random832

7
Lỗi trong cpnhững năm 90? ddlớn hơn thế 20 tuổi. Lý do chính để sử dụng ddlà nhiều thiết bị, đặc biệt là ổ đĩa băng, cần phải được đọc / viết bằng kích thước khối cố định, đó là lý do tại sao ddbs, ibsobscác thông số, và nó là chương trình duy nhất có thể đảm bảo kích thước khối chính xác.
Guntram Blohm hỗ trợ Monica

1
@Gilles, ở đây tee thực sự thích đi tiểu hơn (nhưng dcfldd là tốt nhất). Tuy nhiên, đi tiểu là hữu ích; người ta có thể, nếu được yêu cầu, bao gồm, (trong mỗi đối số được trích dẫn), các tùy chọn 'dd' bổ sung và thậm chí các đường ống và bộ lọc khác, được tùy chỉnh riêng cho từng thiết bị đầu ra.
agc

20

Bạn có thể dùng thử Đây là phiên bản nâng cao và có thể xuất ra nhiều tệp hoặc đĩa cùng một lúc:dcfldd
gnu dd

dcfldd if=masi.img of=/dev/disk2 of=/dev/disk3 of=/dev/disk4

Bạn có thể giải thích lệnh đầu tiên của bạn. Tại sao đường ống chỉ trước khi cuối cùng dd? Làm thế nào để vị trí của đường ống thay đổi với bốn dd?
Léo Léopold Hertz

3
dcflddlà nhanh nhất, có lẽ đó nên là lựa chọn đầu tiên.
agc

3

Ngoài ra, điều này là có thể với teeprocess substitution:

dd if=/dev/sda | tee >(dd of=/dev/sdb) >(dd of=/dev/sdc) | dd of=/dev/sdd


Bạn có thể giải thích quá trình thay thế? Câu trả lời của bạn khác với câu trả lời của agc như thế nào?
Léo Léopold Hertz

yeah chắc chắn: process substitutionđược sử dụng khi bạn cần chuyển stdout của một lệnh thành nhiều lệnh. Sử dụng một đường ống đơn giản sẽ cho phép bạn dẫn đến một lệnh. Câu trả lời của tôi là đạt được kết quả tương tự như agc, nhưng theo một cách khác :) Ngoài ra tôi chưa bao giờ sử dụng peetrước đây, vì tôi có teelệnh trên hệ thống của mình.
chevallier
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.