วว: เขียนไปยังหลาย ๆ ดิสก์ได้ไหม


16

ฉันมีรูปแบบที่เหมือนกัน 2 ขนาดเท่ากันและการ์ด SD ยี่ห้อเดียวกัน ฉันต้องการddรูปภาพไป/dev/disk2และไป/dev/disk3ในเวลาเดียวกัน
pseudocode

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

คุณสามารถเปลี่ยนddจากอินพุตหนึ่งไปเป็น SDs หลายเอาต์พุตได้อย่างไร


เป้าหมายคืออะไร ประสิทธิภาพ? ถ้าใช่จำข้อมูลที่คุณอ่านจะถูกเก็บไว้ ดังนั้นวันที่ 2 คุณจะข้อมูลจาก bcache ของคุณแทนการอ่าน (แน่นอนว่าคุณต้องการ RAM ฟรี)
KWubbufetowicz

2
การทดสอบแบบง่ายๆของฉันกับ GNU coreutils dd ... of=one of=twoไม่ได้สร้างผลลัพธ์ที่สอง อาจต้องใช้สองddคำสั่ง ฉันไม่เห็นถ้อยคำในPOSIX สำหรับ DDเพื่อให้หลายof's
Jeff Schaller

@KWubbufetowicz ฉันมี 8GB RAM เป็นไปได้ที่จะได้รับ 32GB ความเร็วเป็นเป้าหมายของฉันเพราะฉันมี 5 SDs
LéoLéopold Hertz

คำตอบ:


20
  1. การยืมจากคำตอบของdon_crisstiใช้teeแต่ไม่มี ddหรือทุบตี isms:

    sudo tee /dev/disk2 /dev/disk3 > /dev/disk4 < masi.img
    
  2. การใช้peeจากแพ็คเกจเพิ่มเติมของ Debian :

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

    ด้วยbash, kshหรือzsh, ซึ่งสามารถย่อให้เป็น:

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

    หรือแม้กระทั่ง (หากไม่จำเป็นต้องddใช้ฟังก์ชันที่มีประโยชน์):

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

    peeมีประโยชน์ หากจำเป็นต้องมีหนึ่งอาจรวมถึง (ภายในแต่ละอาร์กิวเมนต์ที่ยกมา) ddตัวเลือกที่แตกต่างกันเพิ่มเติมและแม้กระทั่งไปป์และตัวกรองอื่น ๆ ที่ปรับให้เหมาะสมกับอุปกรณ์ส่งออกแต่ละรายการ

ด้วยวิธีใดวิธีหนึ่งจำนวนของดิสก์เอาต์พุตสามารถขยายได้เรื่อย ๆ


1
ไม่จำเป็นต้องใช้ dd ผู้คนจำนวนมากเชื่อว่าจำเป็นเพราะการใช้งานเฉพาะการคัดลอกไปยังหรือจากอิมเมจดิสก์คือ "ฟอสซิล" ในแบบฝึกหัดที่เขียนย้อนกลับไปในยุค 90 และคัดลอกโดยคนที่ไม่รู้ว่าทำไม มันถูกนำมาใช้ในการแก้ไขข้อผิดพลาดใน cp
Random832

@ Random832 cpมันเป็นสิ่งจำเป็นเพราะมันเป็นมีเสถียรภาพมากขึ้นกว่า ลองหลายรูปแบบและขนาดการจัดสรรที่แตกต่างกัน ฉันพบว่าไม่เพียงพอcpสำหรับงาน โปรดแก้ไขฉันด้วยคำตอบที่นี่หากคุณสามารถโต้แย้งได้ว่าcpมีเสถียรภาพมากแค่ไหน
LéoLéopold Hertz 준영

@Masi แทบจะไม่จำเป็นที่จะต้องเลือกรูปแบบ (คุณหมายถึงอะไรโดย "ฟอร์แมต") และขนาดการจัดสรร (คุณหมายถึงขนาดบล็อก?) เพื่อจุดประสงค์ทั่วไปในการเขียนดิสก์อิมเมจลงดิสก์หรืออ่านดิสก์ลงใน ภาพดิสก์ เหตุผลที่ใช้กันทั่วไปสำหรับวัตถุประสงค์นี้เกิดจากข้อผิดพลาดใน cp (GNU cp บน Linux โดยเฉพาะ) ในช่วงต้น 90s ที่ทำให้ข้ามการคัดลอกบล็อกที่เป็นศูนย์ทั้งหมดไบต์
Random832

7
ข้อผิดพลาดในcp90s? ddมีอายุมากกว่า 20 ปี เหตุผลหลักสำหรับการใช้ddเป็นอุปกรณ์จำนวนมากโดยเฉพาะเทปไดรฟ์ที่จำเป็นในการอ่าน / เขียนในบล็อกขนาดคงที่ซึ่งเป็นเหตุผลที่ddมีbs, ibsและobsพารามิเตอร์และมันก็เป็นโปรแกรมเดียวที่สามารถให้แน่ใจว่าขนาดของบล็อกที่ถูกต้อง
Guntram Blohm สนับสนุน Monica

1
@Gilles, ที่นี่teeเป็นที่นิยมมากกว่าที่จะฉี่ (แต่dcflddดีที่สุด) ยังฉี่มีประโยชน์; หนึ่งอาจรวมถึง (ภายในแต่ละอาร์กิวเมนต์ที่อ้างถึง) อาจมีตัวเลือก 'dd' เพิ่มเติมและแม้กระทั่งไปป์และตัวกรองอื่น ๆ ที่ปรับให้เข้ากับอุปกรณ์ส่งออกแต่ละรายการ
agc

21

คุณสามารถลอง เป็นรุ่นที่ปรับปรุงแล้วและสามารถส่งออกไปยังหลาย ๆ ไฟล์หรือดิสก์ในเวลาเดียวกัน:dcfldd
gnu dd

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

คุณช่วยอธิบายคำสั่งแรกได้ไหม ทำไมท่อก่อนหน้าสุดท้ายเท่านั้นdd? ตำแหน่งของท่อเปลี่ยนไปด้วยสี่ddอย่างไร
LéoLéopold Hertz

3
dcflddเป็นวิธีที่เร็วที่สุดอาจเป็นตัวเลือกแรก
agc

ฉันพบว่าสิ่งนี้เร็วกว่าวิธีการไพพ์อื่น ๆ อย่างมีนัยสำคัญ
ThankYee

3

นอกจากนี้ยังเป็นไปได้ด้วยteeและprocess substitution:

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


คุณสามารถอธิบายกระบวนการทดแทนได้หรือไม่ คำตอบของคุณแตกต่างจากคำตอบของ agc อย่างไร
LéoLéopold Hertz 준영

ใช่แน่นอน: process substitutionใช้เมื่อคุณต้องการไพพ์ stdout ของคำสั่งเดียวไปยังหลายคำสั่ง การใช้ไพพ์ธรรมดาจะทำให้คุณไพพ์ได้เพียงคำสั่งเดียว คำตอบของฉันคือการบรรลุผลลัพธ์เช่นเดียวกับ agc ของ แต่ในทางที่แตกต่างกัน :) นอกจากนี้ฉันไม่เคยใช้มาpeeก่อนเพราะฉันมีteeคำสั่งในระบบของฉัน
Chevallier
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.