สำเนา DD เต็มรูปแบบจาก hdd เป็น hdd


34

คำถามเดิม:

หากฉันมีฮาร์ดไดรฟ์ 2 ตัวที่เหมือนกันมีคุณสมบัติดังต่อไปนี้:

  • SATA 6.0 Gb / s
  • 5400 รอบต่อนาที
  • 3TB

การคัดลอก dd แบบสมบูรณ์ควรใช้เวลานานเท่าใดจึงจะสมบูรณ์

จนถึงตอนนี้มันทำงานมา 5 ชั่วโมงและยังคง ...

ฉันใช้ Linux Ubuntu 12.04 64 บิตและคำสั่งที่ฉันใช้คือ:

dd if=/dev/sdb of=/dev/sdc

อัปเดต: 1

ตอนนี้ฉันสามารถดูความคืบหน้าได้และมันใช้เวลา 6+ ชั่วโมงในการคัดลอก 430GB HDD คือ 3TB ...

ไม่มีวิธีที่เร็วกว่าในการทำเช่นนี้?


อัปเดต: 2

ดูเหมือนว่าจะดีกว่าเมื่อก่อน (ขอบคุณ Groxxda สำหรับคำแนะนำ):

sudo dd if=/dev/sdb bs=128K | pv -s 3000G | sudo dd of=/dev/sdc bs=128K

การทางพิเศษแห่งประเทศไทยประมาณ 9 ชั่วโมงสำหรับ 3TB ในขณะที่ก่อนที่จะถึง 430GB หลังจาก 6 ชั่วโมงดังนั้นฉันเดาว่ามันจะใช้เวลาประมาณ 36 ชั่วโมงโดยใช้คำสั่งก่อนหน้า


พยายามคว้าสถิติของกระบวนการ: การส่งสัญญาณ USR1 ไปยังกระบวนการ 'dd' ที่ทำงานอยู่ทำให้พิมพ์สถิติ I / O ไปที่ข้อผิดพลาดมาตรฐานจากนั้นทำการคัดลอกต่อ $ dd if = / dev / zero of = / dev / null & pid = $! $ kill -USR1 $ pid ตรวจสอบหน้า man ของคุณสำหรับสัญญาณจริงเนื่องจากมีความแตกต่างสำหรับการใช้งาน dd ที่แตกต่างกัน
groxxda

@Groxxda ฉันไม่รู้ว่าจะทำอย่างไร
oshirowanen

1
GNU dd ใช้SIGUSR1และ BSD dd ใช้SIGINFO
groxxda

นอกจากนี้คุณหมายถึงอะไรกับ "เชื่อมต่อกับสายเคเบิล sata เดียวกัน"? คุณใช้ตัวคูณพอร์ตบางประเภทหรือไม่ (หากคุณบรรลุอัตราการถ่ายโอน 150MB / s คุณควรใช้เวลา 5-6 ชม. แต่ฉันคิดว่าครึ่งหนึ่งของความเป็นจริงนั้นมีความเป็นจริงมากขึ้น)
groxxda

1
คุณอาจสามารถเร่งกระบวนการได้โดยการระบุขนาดบล็อกที่ใหญ่กว่า ( bs=อาร์กิวเมนต์เป็นdd) พิจารณาการเชื่อมต่อ HDD แต่ละตัวกับพอร์ต sata ของตัวเองด้วย
groxxda

คำตอบ:


58

ddมีประโยชน์ในสมัยก่อนเมื่อผู้คนใช้เทป (เมื่อขนาดบล็อกมีความสำคัญ) และเมื่อเครื่องมือที่ง่ายกว่าเช่นcatอาจไม่ปลอดภัยแบบไบนารี

ปัจจุบันdd if=/dev/sdb of=/dev/sdcเป็นเพียงความซับซ้อนผิดพลาดได้ง่าย, ช้าcat /dev/sdb >/dev/sdcวิธีการเขียน ในขณะที่ddยังคงมีประโยชน์สำหรับงานที่ค่อนข้างหายากมันมีประโยชน์น้อยกว่าจำนวนบทเรียนที่กล่าวถึงมันจะทำให้คุณเชื่อ มีความมหัศจรรย์ในไม่เป็นมายากลที่อยู่ในทุกdd/dev/sdb

คำสั่งใหม่ของคุณsudo dd if=/dev/sdb bs=128K | pv -s 3000G | sudo dd of=/dev/sdc bs=128Kช้าและซับซ้อนโดยไม่จำเป็นอีกต่อไป ข้อมูลจะอ่าน 128kB ต่อครั้ง (ซึ่งดีกว่าddค่าเริ่มต้นที่ 512B แต่ไม่ดีเท่าค่าที่ใหญ่กว่า) จากนั้นจะต้องผ่านสองท่อก่อนที่จะถูกเขียน

ใช้catคำสั่งที่ง่ายและเร็วกว่า (ในการวัดประสิทธิภาพบางครั้งฉันใช้ลินุกซ์เมื่อสองสามปีที่แล้วcatเร็วกว่าcpสำเนาระหว่างดิสก์ที่แตกต่างกันและcpเร็วกว่าddขนาดบล็อกใด ๆddด้วยขนาดบล็อกขนาดใหญ่จะเร็วขึ้นเล็กน้อยเมื่อคัดลอกลงดิสก์เดียวกัน)

cat /dev/sdb >/dev/sdc

หากคุณต้องการรันคำสั่งนี้sudoคุณจะต้องทำการเปลี่ยนเส้นทางที่เกิดขึ้นในขณะที่รูท:

sudo sh -c 'cat /dev/sdb >/dev/sdc'

หากคุณต้องการรายงานความคืบหน้าเนื่องจากคุณใช้ Linux คุณสามารถรับได้ง่ายโดยการสังเกต PID ของcatกระบวนการ (พูด 1234) และดูตำแหน่งของตัวบ่งชี้ไฟล์อินพุต (หรือเอาต์พุต)

# cat /proc/1234/fdinfo/0
pos:    64155648 
flags:  0100000

หากคุณต้องการให้รายงานความคืบหน้าและตัวแปรยูนิกซ์ของคุณไม่ให้เป็นวิธีที่ง่ายที่จะได้รับตำแหน่งไฟล์อธิบายคุณสามารถติดตั้งและใช้แทนpvcat


อะไรคือสิ่งที่แปลกกับบล็อกขนาดใหญ่ที่คอขวดเป็นดิสก์เพื่อสิ่งที่ทำให้catเร็วกว่าdd? เป็นไปได้catหรือไม่ที่ใช้แคช
Emmanuel

1
@Gilles ขอบคุณสำหรับคำตอบ ฉันมีไดรฟ์ 3TB อีกห้าตัวเพื่อโคลนและจะลองใช้ตัวเลือก cat ต่อไป เท่าที่ฉันสามารถบอกได้ว่าคำสั่ง dd ใหม่นั้นจะใช้เวลาอีก 3 ชั่วโมงกว่าจะเสร็จสมบูรณ์รวมทั้งหมดประมาณ 11 ชั่วโมง หากแนวทาง cat เร็วกว่า 11 ชั่วโมงสำหรับ HDD 3TB ตัวที่สองฉันจะใช้วิธีนั้นกับไดรฟ์ที่เหลือ
oshirowanen

2
@Gilles เพื่อรับรายงานความคืบหน้าฉันจะใช้sudo sh -c 'pv /dev/sdb >/dev/sdc'แทนได้sudo sh -c 'cat /dev/sdb >/dev/sdc'หรือไม่
oshirowanen

1
@oshirowanen ใช่ใช้ที่คุณต้องการใช้pv cat
Gilles 'หยุดความชั่วร้าย'

1
@unhammer ไม่! cat /dev/sdc1 >/dev/sdb1 && cat /dev/sdd1 >/dev/sde1คุณจะคัดลอกอุปกรณ์แต่ละหนึ่งโดยหนึ่งเช่น การต่อสองส่วนเข้าด้วยกันไม่สมเหตุสมผล หากคุณต้องการเปลี่ยนโครงสร้างของไดรฟ์ btrfs เพื่อเปลี่ยนจากมีสองไดรฟ์ย่อยหนึ่งคุณต้องใช้เครื่องมือ btrfs เพื่อเปลี่ยนโครงสร้างหรือตามที่คุณได้สร้างระบบไฟล์ใหม่ที่มีโครงสร้างที่ต้องการและคัดลอกไฟล์ .
Gilles 'หยุดชั่วร้าย'

7

ddใช้ขนาดบล็อกที่เล็กมากโดยค่าเริ่มต้น (512 ไบต์) ผลลัพธ์นั้นมีค่าใช้จ่ายจำนวนมาก (หนึ่งread()และwrite()syscall สำหรับทุก 512 ไบต์)

มันจะเร็วขึ้นมากเมื่อคุณใช้บล็อคขนาดใหญ่ ความเร็วที่เหมาะสมที่สุดเริ่มต้นที่bs=64kหรือประมาณนั้น คนส่วนใหญ่ใช้ภาพนิ่งที่มีขนาดใหญ่กว่าbs=1Mดังนั้นมันจึงกลายเป็นมนุษย์อ่านได้ (เมื่อddบอกว่ามันถูกคัดลอก1234 blocksคุณรู้ว่ามัน1234 MiBไม่ได้ทำคณิตศาสตร์ใด ๆ ) การใช้บล็อคที่มีขนาดใหญ่กว่านั้นไม่น่าจะส่งผลให้มีการปรับปรุงความเร็ว

ดังนั้นคำสั่งควรเป็น:

dd bs=1M if=/dev/sdb of=/dev/sdc

หากคุณมีการddทำงานช้าคุณสามารถขัดจังหวะและดำเนินการต่อด้วยddอินสแตนซ์ที่เร็วขึ้น สำหรับเรื่องนี้เป็นเรื่องสำคัญที่จะต้องรู้ว่าสำเนานั้นดำเนินไปไกลแค่ไหนแล้ว ddมักจะพิมพ์ความคืบหน้าเมื่อคุณยกเลิกหรือคุณสามารถส่งUSR1สัญญาณในขณะที่มันกำลังทำงานเพื่อให้มันพิมพ์ความคืบหน้า

kill -USR1 $(pidof dd)

ตัวอย่างเช่นหากมีการคัดลอกมากกว่า1234MiBคุณสามารถกลับมาทำงานที่ตำแหน่ง1234MiBโดยใช้:

dd bs=1M seek=1234 skip=1234 if=/dev/sdb of=/dev/sdc

หากคัดลอกน้อยกว่า1234MiBสำเนาของคุณจะไม่สมบูรณ์ หากคัดลอกมากกว่า1234MiBจะมีการคัดลอกชิ้นส่วนที่คัดลอกไปแล้วซึ่งโดยปกติแล้วจะไม่ทำอันตรายใด ๆ ดังนั้นหากมีข้อสงสัยคุณควรเลือกค่าที่น้อยกว่าสิ่งที่คุณเชื่อว่าถูกคัดลอกไปแล้ว


5

รับสถิติเกี่ยวกับกระบวนการ dd อย่างต่อเนื่อง

คุณสามารถใช้killคำสั่งกับสัญญาณที่เหมาะสมเพื่อสร้างddสถิติเอาต์พุตเป็นข้อผิดพลาดมาตรฐาน
จาก GNU dd man page:

Sending a USR1 signal to a running 'dd' process makes it print I/O statistics to standard error and then resume copying.
      $ dd if=/dev/zero of=/dev/null& pid=$!
      $ kill -USR1 $pid
      18335302+0 records in 18335302+0 records out 9387674624 bytes (9.4 GB)  copied,  34.6279 seconds, 271 MB/s

ตรวจสอบให้แน่ใจว่าคุณตรวจสอบ man page ของคุณสำหรับสัญญาณที่ถูกต้องก่อนเนื่องจากอาจแตกต่างกันในการใช้งาน dd ที่แตกต่างกัน: (BSD dd ใช้ SIGINFO)

เร่งกระบวนการ

  1. เชื่อมต่อ HDD แต่ละตัวเข้ากับพอร์ต SATA ของตัวเองเพื่อให้สามารถอ่านข้อมูลจากอุปกรณ์หนึ่งและเขียนไปยังอีกเครื่องในเวลาเดียวกัน
  2. ใช้บล็อคที่เหมาะสมโดยใช้bs=อาร์กิวเมนต์ ดูที่หัวข้อนี้ใน superuserและลองใช้ค่าด้วยตัวคุณเอง
  3. ใช้ddการร้องขอแยกต่างหากสำหรับการอ่านและการเขียนและใช้ไปป์เพื่อเชื่อมต่อพวกเขา ( dd if=/dev/sda bs=1M | dd of=/dev/sdb bs=1M)
    หากคุณทำสิ่งนี้และระบุขนาดบล็อกตรวจสอบให้แน่ใจว่าคุณใช้ขนาดบล็อกเดียวกันกับแต่ละคำร้องขอ
  4. คุณอาจลองการเพิ่มประสิทธิภาพอื่น ๆ เช่นการdirectโต้แย้ง
  5. ตรวจสอบให้แน่ใจว่าไม่ได้ติดตั้งฮาร์ดดิสก์ไว้หรืออาจส่งผลให้สำเนาเสียหาย

0

คุณเคยลอง 'gparted' บ้างไหม? คุณสามารถคัดลอก - วางพาร์ติชั่นจากไดรฟ์หนึ่งไปอีกไดรฟ์หนึ่งและปรับขนาดตามที่ต้องการ คุณจะได้รับอัตราการถ่ายโอนและเวลาที่เหลือ มันใช้ 'e2image' ใต้พาร์ทิชันลินุกซ์


0

มีซอฟต์แวร์เชิงพาณิชย์ที่เรียกว่าเป็นHDClone มันได้รับใบอนุญาตทั้งฟรีแวร์และการค้า ทั้งสองเวอร์ชันสามารถสร้าง pendrive ที่สามารถบู๊ตได้หรือดีวีดีรวมถึงการคัดลอกดิสก์ เชื่อมต่อต้นทางและปลายทาง HD และทำตามคำแนะนำบนพื้นฐานของ GUI

หนึ่งฟรีจะถ่ายโอนในอัตราประมาณ 80MB / วินาทีในขณะที่รุ่นที่จ่ายสามารถไปได้เร็วขึ้นมาก สำหรับระบบไฟล์ NTFS และ FAT เวอร์ชันที่ต้องชำระสามารถกำหนดค่าให้โคลนเฉพาะบิตที่ครอบครองของ HD ซึ่งเพิ่มความเร็วของแต่ละโคลนอย่างมาก


(1) คุณเกี่ยวข้องกับผลิตภัณฑ์นี้หรือไม่? (2) เราจะหาได้ที่ไหน
สกอตต์

1
หรือคุณสามารถใช้ "cat / dev / sdx> / dev / sdy" ได้ฟรี ...
HörmannHH
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.