ฉันจะเพิ่มความเร็วดิสก์เต็ม dd ได้อย่างไร


62

ฉันกำลังทำddไดรฟ์เหมือนกันสองตัวด้วยคำสั่งนี้:

 dd if=/dev/sda of=/dev/sdb bs=4096

ฮาร์ดไดรฟ์ทั้งสองเป็นหมายเลขรุ่นเดียวกันและมีพื้นที่เก็บข้อมูล 1TB /dev/sda ใช้ขนาดบล็อก 4096. /dev/sdaเป็นไดรฟ์ในเครื่องและ/dev/sdbเป็นแคดดี้ระยะไกล ฉันอาจใช้โปรโตคอลต่อไปนี้:

  • USB2.0 HighSpeed ​​(แผนปัจจุบัน)
  • Gigabit Over-The-Network clone (ไม่อยากลองเลย)
  • USB3.0 (หากฉันพบแคดดี้ไดรฟ์อื่นของฉัน)
  • eSATA (ถ้าฉันค้นหา / ซื้อสายเคเบิล)
  • SATA (หากฉันค้นหา / ซื้อสายเคเบิลต้องรักไดรฟ์ซีดีแล็ปท็อป)

มีวิธีเรียกใช้การคัดลอกไดรฟ์นี้ซึ่งใช้เวลาน้อยกว่า 96 ชั่วโมงหรือไม่? ผมเปิดให้ใช้เครื่องมืออื่น ๆ ddกว่า

ฉันต้องโคลนพาร์ติชั่นต่อไปนี้ (รวมถึง UUIDs)

  • พาร์ติชัน FatI EFI 32 (*)
  • พาร์ติชัน Windows NTFS (*)
  • พาร์ติชัน HFS + OSX
  • EXT4 Ubuntu Partition (*)
  • สลับพาร์ติชัน (*)

* สนับสนุนโดย Clonezilla


ฉันได้ลอง Clonezilla (และเร็วขึ้นมาก) แต่ไม่รองรับการคัดลอก HFS + ที่ฉลาดซึ่งฉันต้องการ อาจเป็นเวอร์ชั่นใหม่ล่าสุดที่รองรับสิ่งนี้ใช่ไหม

เมื่อฉันสร้างโคลนครั้งแรกฉันทำพาร์ติชั่นทั้งหมดยกเว้น HFS + และมันไปอย่างรวดเร็ว (ไม่เกิน 3 ชั่วโมงรวม)


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

การซื้อสาย SATA และเชื่อมต่อไดรฟ์ภายนอกเข้ากับพอร์ต SATA บนแผงวงจรหลักเป็นไปได้ชั่วคราวหรือไม่
Mark Plotnick

บางทีใครบางคนสามารถอธิบายรายละเอียดต่อไปนี้: วิธีการโคลนตารางพาร์ทิชัน (ใช้ทั้ง clonezilla หรือ dd) โดยใช้ Clonezilla เพื่อโคลนพาร์ติชันทั้งหมดยกเว้น HFS + และใช้ dd สำหรับพาร์ติชันที่หนึ่ง? สิ่งนี้จะเป็นไปได้หรือไม่
อเล็กซานเด

@Alexander นั่นเป็นวิธีที่ฉันทำโคลนครั้งแรกของฉัน
Kaz Wolfe

1
@ LuisAlvarado ฉันเพิ่งเริ่มโคลนชาย!
Kaz Wolfe

คำตอบ:


68

ddจากประสบการณ์ของผมผมไม่คิดว่ามีอะไรบางอย่างได้เร็วขึ้นในบรรทัดคำสั่งเป็น การปรับbsพารามิเตอร์สามารถเพิ่มความเร็วตัวอย่างเช่นฉันมี HDD 2 ตัวที่ฉันรู้ว่ามีความเร็วในการอ่าน / เขียนสูงกว่า 100 MB / s ดังนั้นฉันจะทำดังนี้

dd if=/dev/sda of=/dev/sdb bs=100M

นอกจากนี้ยังมีpv(ต้องติดตั้งก่อน) ซึ่งจะตรวจสอบความเร็วที่เร็วที่สุดของไดรฟ์ทั้งสองแล้วจึงทำการโคลน สิ่งนี้จะต้องทำแน่นอนจากราก:

pv < /dev/sda > /dev/sdb

ด้วย PV ฉันได้รับ 156 MB / s

สิ่งที่ดีเกี่ยวกับpvนอกเหนือจากความเร็วคือมันแสดงให้เห็นถึงความคืบหน้าความเร็วปัจจุบันเวลาตั้งแต่เริ่มและ ETA ในส่วนที่เกี่ยวกับ HFS ​​+ ฉันไม่ทราบว่าฉันแค่พยายามช่วยในส่วน "ความเร็ว" ด้วยpvหรือbsพารามิเตอร์ที่ปรับให้เหมาะสมที่สุดคุณสามารถทำไดรฟ์ 4 TB ในเวลาน้อยกว่า 7 ชั่วโมง (6 ชั่วโมง 50 นาทีที่ความเร็วปัจจุบัน 150 MB / s)

ป้อนคำอธิบายรูปภาพที่นี่

ฉันทำการทดสอบสองสามอย่างกับประเภทการเชื่อมต่อที่คุณใช้และอื่น ๆ ที่ฉันมีให้ ฉันใช้ Asus Z87 Pro และ Intel DZ68DP นี่คือผลของฉัน แต่แรกที่เราจำเป็นต้องรู้ว่าความเร็วทฤษฎีอัตราการถ่ายโอนจำนวนมาก (ความเร็วดิบ) เป็นเพียงที่ทฤษฎี ทำการทดสอบจริงเปิดเผยว่าพวกเขาอยู่ระหว่าง 40% ถึง 80% ของความเร็วที่ดิบ การทดสอบนี้สามารถเปลี่ยนแปลงได้ขึ้นอยู่กับอุปกรณ์ที่ใช้ประเภทการเชื่อมต่อมาเธอร์บอร์ดประเภทของสายเคเบิลเชื่อมต่อประเภทระบบไฟล์และอื่น ๆ โดยที่ในใจนี่คือสิ่งที่ฉันได้รับ (ฉันทดสอบความเร็วในการเขียนไปยังอุปกรณ์เท่านั้นโดยทั่วไปแล้วการอ่านจะสูงกว่า):

Connected Device  -  Connection Type  -  Speed (Write Speed)
  USB 2.0                 USB 2.0              25 MB/s
  USB 3.0                 USB 2.0              35 MB/s
  USB 3.0                 USB 3.0              73 MB/s
  eSata                   eSata                80 MB/s
  Sata 2G HDD             Sata 2G              120 MB/s
  Sata 3G HDD             Sata 2G              140 MB/s
  Sata 3G HDD             Sata 3G              190 MB/s
  Sata 2G SDD             Sata 2G              170 MB/s
  Sata 3G SDD             Sata 2G              210 MB/s
  Sata 3G SDD             Sata 3G              550 MB/s 

3
ส่งสัญญาณ USR1 เพื่อรับความคืบหน้าของ dd ข้อเสียของ dd คือมันทำสำเนาพื้นที่ว่าง
jfs

1
จากประสบการณ์ของผมปรับbsพารามิเตอร์สามารถทำให้เร็วที่สุดเท่าที่dd catคุณอาจใช้catในตอนแรกเช่นกัน
Gilles

3
pvด้วยตัวเองทำงานได้ดีมาก
Kaz Wolfe

11
คุณสามารถใช้ dd เพื่อทำงาน แต่แทรก pv ลงใน chain เพื่อติดตามอัตราการถ่ายโอนเช่นนี้:dd if=/dev/sda1 | pv | dd of=/dev/sdb1
thomasrutter

4
ผมเคยใช้อยู่เสมอpvในระหว่างdds ไม่เคยรู้มาก่อนว่ามันจะสามารถใช้แบบสแตนด์อโลนได้!
korylprince

12

ในการคัดลอกขายส่งพาร์ทิชันใช้catddแทน ฉันใช้การวัดประสิทธิภาพมานานแล้วการคัดลอกไฟล์ขนาดใหญ่แทนที่จะเป็นพาร์ติชันระหว่างดิสก์สองแผ่น (ในดิสก์เดียวกันการกำหนดเวลาสัมพัทธ์จะแตกต่างกัน):

dd bs=64M    51.3
dd bs=1M     41.8
dd bs=4k     48.5
dd bs=512    48.9
cat          41.7
cp           45.3

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

cp -aในการคัดลอกพาร์ทิชันก็อาจจะเร็วกว่าการคัดลอกไฟล์ที่มี ขึ้นอยู่กับจำนวนไฟล์ที่มีและจำนวนของระบบไฟล์ที่มีพื้นที่ว่าง การคัดลอกไฟล์มีค่าใช้จ่ายที่ประมาณสัดส่วนของจำนวนไฟล์ แต่ในทางกลับกันการคัดลอกพื้นที่ว่างทำให้เสียเวลา

อัตราข้อมูลสูงสุดสำหรับ USB2 น้อยกว่า 50 MB / s เล็กน้อยซึ่งใช้งานได้ 6-7 ชั่วโมงในการถ่ายโอน 1TB นี่ถือว่าเป็นฮาร์ดดิสก์ที่เร็วพอที่จะทำให้บัส USB อิ่มตัว ฉันคิดว่าไดรฟ์ความเร็วสูงกว่า 7200 รอบต่อนาทีสามารถทำได้ แต่ 5900 รอบต่อนาทีอาจไม่เร็วขนาดนั้น (อาจเป็นแบบเขียนเชิงเส้น)

หากมีการใช้งานดิสก์แบบขนานสิ่งนี้อาจทำให้สำเนาช้าลงมากเนื่องจากหัวดิสก์จะต้องเคลื่อนที่ไปมา


ฉันพยายามที่จะคัดลอกดิสก์ทั้งหมดแม้ว่า
Kaz Wolfe

ฉันคาดหวังว่าความแตกต่างจะเป็นไปในลำดับเดียวกัน แต่ใช้มาตรฐานในระบบของคุณเพื่อรับข้อมูลที่เชื่อถือได้มากขึ้น
Gilles

สามารถcatใช้เพื่อdd if=ubuntu.iso of=/dev/usb? ddความเร็วในการทำเช่นนี้กับ USB2 หรือ USB3 ช้าอย่างน่าผิดหวัง
Oxwivi

1
@Oxwivi ใช่cat ubuntu.iso >/dev/usbมันเทียบเท่ากันหมด ไม่มีเวทย์มนตร์ddมันเป็นเพียงเครื่องมือในการคัดลอกอินพุตไปยังเอาต์พุต
Gilles

คำสั่ง cat ที่ระบุด้านบนไม่ทำงานบน mac ฉันพยายามsudo cat linuxmint-17.3-cinnamon-64bit.iso >/dev/disk1ให้กลับ "-bash: / dev / disk1: การอนุญาตถูกปฏิเสธ"
ไม่ได้

12

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

Usb 2.0 คือ 12 เมกะบิตต่อวินาที (Mbps), Usb 2.0 ความเร็วสูง 480 Mbps นี่คือความเร็วที่แน่นอน ด้วย 8 บิตในไบต์และค่าใช้จ่ายในการกำหนดกรอบความเร็วที่ใช้งานได้ใน MB / s มักจะเป็นทศนิยมมากกว่า ตัวอย่างเช่นวัตถุดิบดิบ 480 กลายเป็นใช้งานได้ 48MB โปรดทราบว่านี่เป็นคณิตศาสตร์ที่ดีที่สุดในโลกแห่งความเป็นจริงมันจะลดลงเล็กน้อย สำหรับการเชื่อมต่อความเร็วสูง usb 2.0 คุณควรคาดหวังว่าจะมีความเร็วในการเขียนสูงสุดประมาณ 30-35 MBs หากอุปกรณ์จัดเก็บข้อมูลจริงสามารถเทียบเคียงหรือเกินความเร็วในการเชื่อมต่อได้


6
หน่วย nitpicking: ความเร็วสูง USB2.0 คือ 480 Mbit / s = 60 MByte / s, ความเร็วดิบ ความเร็วที่ใช้ไม่ได้เป็นทศนิยมมากกว่า แต่ค่อนข้าง 80% ของความเร็วดิบ ความเร็วที่แท้จริงของกฎ "หัวแม่มือเป็น MByte / s คือ 1/10 ของความเร็วดิบใน Mbit / s" ใช้ได้แม้ว่า
jpa

5

ฉันยอมรับว่าความเร็วดิบของddคำสั่งที่ปรับเป็นอย่างดี('pv') หรือ 'cat' นั้นยากที่จะเอาชนะ แต่ถ้ามีปัญหาใด ๆ กับการคัดลอก (เซกเตอร์เสีย, ไฟฟ้าขัดข้อง, ข้อผิดพลาดของผู้ใช้ ฯลฯ ) คุณต้องเริ่มต้น เกิน.

ฉันต้องการแนะนำddrescue - เครื่องมือ FOSS ที่มีความเร็วทั้งหมดของ dd แต่มันจะแก้ไขข้อผิดพลาดของดิสก์และดำเนินการต่อในภายหลังหากเกิดข้อผิดพลาด


2

ฉันย้าย Windows 7 จาก HDD ไปยัง SSD และพบสิ่งนี้และคำตอบอื่น ๆ ... สิ่งที่ฉันได้เรียนรู้ซึ่งอาจช่วยผู้อื่น ในกรณีของฉันไดรฟ์ต้นฉบับใหญ่กว่าฉันจะทำงานที่ระดับอุปกรณ์ / dev / sda -> / dev / sdb

Win7 และ 3 พาร์ติชั่น ... ฉันใช้ Xbuntu 14.04 live cd บน usb เปิด DVD ของคอมพิวเตอร์ที่ชนะและวาง SSD ไว้ในตำแหน่ง ติดตั้ง partclone แล้วลองทำสิ่งนี้:

partclone.ntfs -b -N -s /dev/sda3 -o /dev/sdb3

Partclone puked บน ntfs ต้องการ chkdisk ที่ทำงานใน Windows ดังนั้นการแก้ไขอย่างรวดเร็วก็มีความสุขที่ partclone:

ntfsfix -b /dev/sda3
ntfsfix -d /dev/sda3

คำสั่งทั้งหมดรันเป็นรูท ncurses UI ของ Partclone (ตัวเลือก -N) กล่าวว่าการถ่ายโอนคือ 7GB / นาทีและสิ้นสุดที่ 5GB / นาทีซึ่งเท่ากับ 83MB / วินาที ส่วนที่ดีคือ partclone ไม่ได้คัดลอกพื้นที่ที่ไม่ได้ใช้ดังนั้นสิ่งนี้ทำให้การโคลนเร็วอย่างน่าทึ่ง

gotchyas ที่มีศักยภาพเพิ่มเติม:

  • หากใช้ไดรฟ์ที่คุณกำลังถ่ายโอนไปก่อนหน้านี้อาจมี GPT เหลืออยู่ การติดตั้งจากโรงงานของ Windows 7 มักเป็นตารางพาร์ติชัน msdos / mbr คุณจะต้องลบ GPT แฟรกเมนต์ออกจากไดรฟ์ปลายทาง นี้Unix และ Linux QAช่วยฉันด้วยนี้ คุณต้องใช้gdiskบนอุปกรณ์ใช้ x แล้ว z และใช่เพื่อ zap GPT data และตรวจสอบให้แน่ใจว่าคุณใช้ MBR

  • และอย่าลืมว่าคุณไม่ได้ทำอุปกรณ์ระดับ dd คุณจะต้องคัดลอก MBR โดย
    dd if=/dev/sdb of=/dev/sda bs=446 count=1
    ที่ sdb เป็นแหล่งที่มาหรือไดรฟ์เก่าและ sda เป็นปลายทางหรือไดรฟ์ใหม่ ( แหล่งที่มา )


1

ฉันเพิ่งสร้างอิมเมจพาร์ติชั่น 100GB (HDD) และเขียนลงดิสก์ SSD ใหม่

นี่คือเคล็ดลับที่สามารถเร่งกระบวนการได้อย่างมาก :)

แยกไฟล์ออกเป็นส่วนเล็ก ๆ (ยิ่งไฟล์ใหญ่เท่าไหร่ก็ยิ่งทำงานช้าลง)

sudo dd if=/dev/sda3 conv=sync,noerror bs=2M | split -a 3 -d -b 1G - /maindisk.img

ในระหว่างกระบวนการคุณสามารถตรวจสอบความเร็วโดยใช้ (ในสถานีแยก)

pgrep -l '^dd$' #to find PROCESSID
kill -USR1 PROCESSID #to check the speed

จากนั้นเมื่อคุณมีไดเรกทอรีที่เต็มไปด้วยไฟล์ผลลัพธ์ (maindisk.img000, maindisk.img001 และอื่น ๆ ใช้ ... )

sudo cat maindisk.img* | sudo dd of=/dev/sda1

เพื่อ 'เบิร์น' ภาพลงในส่วนใหม่ของ SSD (การแบ่งส่วนจะต้องมีขนาดเท่ากับของเก่า)

สำหรับฉันมันทำงาน loooot เร็วกว่าวิธีปกติ (โดยไม่ต้องแยก) ความเร็วเฉลี่ยในการสร้างภาพอยู่ที่ ~ 13MB / s เมื่อฉันใช้ 'ปกติ' มันเริ่มต้นด้วย ~ 15MB / s แล้วลดลงถึง 1MB / s


1
เหตุใดการเขียนไฟล์ขนาดใหญ่หนึ่งไฟล์จึงช้าลงแทนที่จะเป็นไฟล์ขนาดเล็กหลาย ๆ ไฟล์ ชนิดระบบไฟล์เป้าหมายและแฟล็กการเมาต์คืออะไร
David Foerster

ยังconv=syncเป็นอันตรายต่อประสิทธิภาพการทำงานและค่อนข้างไร้ประโยชน์ในกรณีการใช้งานนี้
David Foerster

0

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

รันสองครั้ง:

รอบแรกคัดลอกทุกบล็อกโดยไม่มีข้อผิดพลาดในการอ่านและบันทึกข้อผิดพลาดไปยัง rescue.log

sudo ddrescue -f -n /dev/sdX /dev/sdY rescue.log

รอบที่สองคัดลอกเฉพาะบล็อกที่ไม่ดีและลองอ่าน 3 ครั้งจากแหล่งข้อมูลก่อนที่จะยอมแพ้

sudo ddrescue -d -f -r3 /dev/sdX /dev/sdY rescue.log

ตอนนี้คุณสามารถติดตั้งไดรฟ์ใหม่และตรวจสอบความเสียหายของระบบไฟล์

ข้อมูลเพิ่มเติม:
https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html


0

Id แนะนำให้อินพุต / อ่าน - ไฟล์ / ดิสก์บน SATA เพื่อเพิ่มความเร็วในการอ่าน USB 2.0 ความเร็วสูงก็ดีเหมือนกันเพราะฉันได้รับความเร็วเฉลี่ย33816 kb / sด้วยddrescueเมื่อเทียบกับเมื่อตั้งค่าเป็น USB 2.0 to SATA ที่2014 kb / s


0

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

ในการวัดความเร็วที่ขนาดบล็อกต่าง ๆ ให้ใช้bashสคริปต์ต่อไปนี้:

  • ตั้งค่า$devเป็นอุปกรณ์
  • แก้ไขcbtotalอย่างน้อย 5 เท่าของความเร็วการอ่านที่คุณคาดหวัง
    (set -o errexit; skip=0; cbtotal=$((120*1024**2)); bs=256;
    for power in `seq 10`; do
      bs=$((bs*2)); skip=$((skip/2)); count=$((cbtotal/bs));
      if [ "$count" -lt 1 ]; then break; fi;
      echo $bs;
      dd if=$dev of=/dev/null skip=$skip bs=$bs count=$count
      skip=$((skip+count))
    done)

ผลลัพธ์อาจมีความเอนเอียงไปสู่ขนาดที่ใหญ่ขึ้นเนื่องจากดิสก์อ่านไปข้างหน้านั่นคือสาเหตุที่การตั้งค่าให้cbtotalมีขนาดใหญ่พอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.