ทำไม dd ใช้เวลานานเกินไป


18

ฉันต้องการคัดลอกดิสก์หนึ่งแผ่นไปยังอีกแผ่นหนึ่ง ฉันลองใช้คำสั่งด้านล่างและใช้เวลาเกือบหนึ่งวันในการคัดลอกดิสก์ 1 TB ใน federo

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

ฉันได้ลองแบบเดียวกันในระบบ Unix (HP-UX) ด้วยคำสั่งด้านล่างและมันจะเสร็จสมบูรณ์ภายในไม่กี่ชั่วโมง

dd if=/dev/sda of=/dev/rdsk

อะไรคือทางเลือกที่ฉันสามารถใช้เพื่อคัดลอกจากดิสก์ไปยังดิสก์ได้เร็วขึ้น?


2
cp /dev/sda /dev/sdbหรือ ( pv /dev/sda > /dev/sdb เพื่อรับแถบความคืบหน้า) จะเร็วกว่ามาก ทำไมคุณถึงใช้ddที่นี่? ddเพียง แต่จะเป็นประโยชน์กับสิ่งที่ต้องการconv=sync,noerrorไปยังดิสก์จับมีข้อผิดพลาด แต่ถึงอย่างนั้นก็จะทำให้รู้สึกมากขึ้นที่จะใช้สิ่งที่ต้องการddrescueแทน (ดูpv's -Eตัวเลือก)
Stéphane Chazelas

1
@ StéphaneChazelas catอาจเร็วกว่าแต่ความแตกต่างนั้นไม่น่าทึ่ง (อาจจะใหญ่กว่าสำหรับอุปกรณ์ต่ออุปกรณ์มากกว่าไฟล์ต่อไฟล์เหมือนในการทดลองของฉัน)
Gilles 'หยุดชั่วร้าย'

8
"ฉันลองแบบเดียวกันบนระบบ Unix" - แล้วคุณลองใช้ระบบประเภทไหนก่อนถ้าไม่ใช่ Unix นอกจากนี้ฮาร์ดแวร์อะไร ฯลฯ วันศุกร์ที่
marcelm

ยินดีต้อนรับสู่ddหลุมพราง # 1
Dmitry Grigoryev

ใช้ตัวแรกใน HP-UX (Integrity blade) และเครื่อง Solaris ที่ใช้ก่อนหน้าเช่นกัน
KKD

คำตอบ:


28

ddมีหลายคน (แปลก) ตัวเลือกดูDD (1)

คุณควรระบุขนาดบัฟเฟอร์อย่างชัดเจนดังนั้นให้ลอง

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

IIRC ขนาดบัฟเฟอร์เริ่มต้นคือ 512 ไบต์เท่านั้น คำสั่งดังกล่าวตั้งไว้ที่ 16 เมกะไบต์ คุณสามารถลองสิ่งที่เล็กกว่า (เช่นbs=1M) แต่คุณควรใช้มากกว่าค่าเริ่มต้น (โดยเฉพาะกับฮาร์ดแวร์ดิสก์ล่าสุดที่มีเซ็กเมนต์ของ 4Kbytes เช่นรูปแบบขั้นสูง ) ฉันแนะนำพลังอย่างไร้เดียงสาของสองซึ่งอย่างน้อยเมกะไบต์

ด้วยขนาดบัฟเฟอร์เริ่มต้น 512 ไบต์ฉันเดา (แต่ฉันอาจผิดมาก) ว่าฮาร์ดแวร์ต้องการให้เคอร์เนลถ่ายโอน 4K สำหรับบล็อก 512 แต่ละบล็อก

เกี่ยวกับrdskหน้าsd (4) man บอกว่า:

ในขณะนี้มีเพียงอุปกรณ์บล็อกเท่านั้น ยังไม่มีการนำอุปกรณ์ Raw มาใช้

การเพิ่มขนาดบัฟเฟอร์ของ dd จะทำให้คุณมีประสิทธิภาพมากขึ้นสำหรับการดำเนินการอ่านและเขียน ตอนนี้ดิสก์ทั้งหมดมีฮาร์ดแวร์การอ่าน / เขียนบัฟเฟอร์ แต่ถ้าคุณจะเพิ่มขนาดบัฟเฟอร์ของ dd มากกว่าบัฟเฟอร์ฮาร์ดแวร์ประสิทธิภาพจะลดลงเพราะ dd จะอ่านจากดิสก์แรกไปยังบัฟเฟอร์เมื่อดิสก์ที่สองจะเขียนทั้งหมดจากบัฟเฟอร์ฮาร์ดแวร์ของตัวเอง คุณต้องตั้งค่าbsตัวเลือกของคำสั่ง dd ทุกครั้งที่มีค่าต่างกันสำหรับอุปกรณ์ที่แตกต่างกัน


rdsk มีอยู่ในระบบ Linux หรือไม่? ฉันใช้ในระบบ Unix แล้ว
KKD

1
แคชของหน้าเว็บอาจจะจัดการใน 4Kb บล็อกสิ่งที่คุณทำ แต่คุณสามารถควบคุมจำนวน syscalls dd ที่ใช้ในการอ่าน 4Kb นั้น ฉันแน่ใจว่ามีขนาดการอ่านข้างต้นที่ค่าใช้จ่ายในการเขียนแผงลอยมีราคาแพงกว่า syscalls ที่บันทึกไว้ แต่ไม่มีความคิดที่เป็นจุดหวาน
ไร้ประโยชน์

ขนาดบล็อกไม่กี่ MB ดีกว่า 512B เริ่มต้น แต่เมื่อฉันเปรียบเทียบสิ่งนี้ฉันพบว่าcatทำได้เช่นกัน (สำหรับการถ่ายโอนระบบไฟล์ไปยังไฟล์ระบบโดยตรงบล็อกบล็อกอาจมีลักษณะการทำงานที่แตกต่างกัน) อย่างไรก็ตามความแตกต่างนั้นไม่น่าทึ่งในทุกกรณี
Gilles 'หยุดความชั่วร้าย'

1
ที่น่าสนใจใน MacOS (ก SUS ได้รับการรับรองครับ) มันเร็วขึ้นเพื่อใช้/dev/rdiskXddเป็นเป้าหมายเมื่อทำการ
Adib

1
ในกรณีที่คุณสงสัยว่าเกิดอะไรขึ้น (เช่นฉัน) เพิ่มstatus=progressที่จะพิมพ์ความคืบหน้าการดำเนินงานทั้งหมด
Aleksander Lech

17

หลายปีก่อนใน Unix-land ddเป็นวิธีที่จำเป็นในการคัดลอกอุปกรณ์บล็อก ที่ได้รับการยกมาเป็นความรู้เกี่ยวกับการขนส่งสินค้าแม้ว่า (บนระบบที่ใช้ Linux อย่างน้อย) catเกือบจะเร็วกว่าddเสมอ

อย่างไรก็ตามแม้จะย้อนกลับไปในประวัติศาสตร์ขนาดบล็อกที่เหมาะสมช่วยลดจำนวนการเรียกใช้ระบบ (ช้า) เนื่องจากการเรียกระบบแต่ละครั้งจะเรียกใช้การดำเนินการ I / O ขนาดบล็อกเริ่มต้นคือ 512 ไบต์ (หนึ่งดิสก์เซ็กเตอร์) การรวบรวมดิสก์บล็อกจำนวนมากเข้าด้วยกันในการอ่านครั้งเดียวคือ - และ - ก็ยอมรับได้เช่นกัน ตัวอย่างนี้ใช้ขนาดบล็อก 32MB:

dd bs=$((512*2048*32)) if=/dev/source of=/dev/target

บนระบบที่ใช้ Linux ปัจจุบันดิสก์สามารถคัดลอกได้อย่างมีประสิทธิภาพมากที่สุดด้วยวิธีที่ง่าย cat

cat /dev/source >/dev/target

(ดังที่กล่าวไว้ในความคิดเห็นเกี่ยวกับคำถามของคุณpvสามารถทดแทนได้catและจะแสดงถึงความคืบหน้าและปริมาณงาน)


3
โดยเฉพาะเหตุผลที่ต้องใช้ DD นั้นเป็นข้อผิดพลาดใน GNU cp และข้อผิดพลาดในเคอร์เนล linux ในช่วงต้น 90s เหตุผลในการใช้ dd ในระบบยูนิกซ์ที่ผ่านมานั้นแตกต่างกันมากและต้องการคัดลอกอุปกรณ์บล็อกทั้งหมดเป็นสิ่งผิดปกติที่ต้องทำ
Random832

1
@ Random832 ต้องการที่จะคัดลอกดิสก์ทั้งหมดจะผิดปกติ แต่ฉันจำได้ว่าต้องคัดลอกพาร์ทิชันรอบ (ขนาดใหญ่ - 150 หรือ 200MB แม้)
roaima

3
(ข้อผิดพลาดเฉพาะ: เคอร์เนลรายงานขนาดการใช้งานดิสก์ไม่ถูกต้อง [นำหน้า cp เพื่อสรุปว่าไฟล์ต้นฉบับทุกไฟล์เป็นไฟล์กระจัดกระจาย] และ cp ไม่ได้เป็นศูนย์บล็อกเมื่อคัดลอกจากไฟล์ sparse ไปยังอุปกรณ์ปลายทางดังนั้นศูนย์ใด ๆ บล็อกในแหล่งที่มาของคุณจะมีสิ่งขยะเกิดขึ้นบนดิสก์อยู่แล้ว)
สุ่ม 832

ฉันรักคำตอบแบบนี้ ขอบคุณสำหรับข้อมูล. นี่คือการอัปเดตของคุณ
catbadger

7

โดยทั่วไปddสามารถหลีกเลี่ยงได้ในทางเลือกบางอย่าง มีเหตุผลที่ดีหลายประการในการใช้ GNU ddrescueแทน ใน Ubuntu คุณสามารถติดตั้งได้ด้วย:

sudo apt-get install gddrescue

และเพียงธรรมดาที่ddrescueจะใช้ โปรดทราบว่าแตกต่างจากชื่อแพคเกจปฏิบัติการไม่ได้gมีการเริ่มต้น

การใช้มันง่ายเหมือน:

ddrescue inputFile outputFile logFile

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

มันใช้ค่าเริ่มต้นที่สมเหตุสมผลสำหรับขนาดบล็อกดังนั้นความเร็วในการคัดลอกจะเร็วเท่าที่อุปกรณ์สามารถจัดการได้จากประสบการณ์ของฉันอย่างน้อยที่สุด (ฉันได้โคลนไดรฟ์หลายร้อยตัวด้วยขนาดและประเภททั้งหมด)

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


6

คำถามที่ดีมาก อินเทอร์เฟซแบบดิบถูกนำไปใช้กับระบบ unix บางระบบ (tru64, hpux, solaris) แต่ไม่ได้ใช้กับ linux อินเตอร์เฟสดิบทำให้การถ่ายโอนเร็วขึ้นเพราะ unix I / O ถูกข้ามไป บล็อกอินเตอร์เฟส ( /dev/dskหรือ/dev/disk) ช้าลงเนื่องจากใช้ระบบ Unix I / O เพื่อเร่งความเร็วdd(gnu dd สามารถ) ใช้bs=30Mหรือbs=20Mขึ้นอยู่กับ hw ของคุณ คำตอบสั้น ๆ คือ: ไม่มีมันไม่ถูกนำไปใช้อย่างน้อยที่สุดเท่าที่ฉันรู้ ฉันใช้ linux ตั้งแต่รุ่นเก่าของเคอร์เนลรุ่น 2.2 และไม่เคยเห็นrdskใช้กับยูนิกซ์


6
ทำไมคุณถึงแนะนำขนาดบล็อกที่ไม่ใช่พลังของสอง?
Basile Starynkevitch

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