ควรใช้ cat, dd, pv หรือโพรซีเดอร์อื่นเพื่อคัดลอกซีดี / ดีวีดีดีกว่าไหม


22

พื้นหลัง

ฉันกำลังคัดลอกซีดี / ดีวีดีข้อมูลบางส่วนไปยังไฟล์ ISO เพื่อใช้งานในภายหลังโดยไม่จำเป็นต้องใช้ไดรฟ์

ฉันกำลังมองหาวิธีการทางอินเทอร์เน็ตและฉันพบมาก:

  • ใช้ในcatการคัดลอกสื่อ: http://www.yolinux.com/TUTORIALS/LinuxTutorialCDBurn.html

    cat /dev/sr0 > image.iso
    
  • การใช้ในddการทำเช่นนั้น (เห็นได้ชัดว่าใช้กันอย่างแพร่หลายมากที่สุด): http://www.linuxjournal.com/content/archiving-cds-iso-commandline

    dd if=/dev/cdrom bs=blocksize count=count of=/path/to/isoimage.iso
    
  • ใช้pvเพื่อทำสิ่งนี้ให้สำเร็จ: ดูman pvข้อมูลเพิ่มเติมแม้ว่านี่คือส่วนที่ตัดตอนมา:

    Taking an image of a disk, skipping errors:
          pv -EE /dev/sda > disk-image.img
    
    Writing an image back to a disk:
          pv disk-image.img > /dev/sda
    
    Zeroing a disk:
          pv < /dev/zero > /dev/sda
    

ผมไม่ทราบว่าทั้งหมดของพวกเขาควรจะเทียบเท่าแม้ว่าผมทดสอบบางส่วนของพวกเขา (โดยใช้md5sumเครื่องมือ) และอย่างน้อยddและpvมีไม่เทียบเท่า นี่คือmd5sumทั้งไดรฟ์และไฟล์ที่สร้างขึ้นโดยใช้แต่ละขั้นตอน:

md5 ของขั้นตอน dd: 71b676875b0194495060b38f35237c3c

md5 ของขั้นตอน pv: f3524d81fdeeef962b01e1d86e6acc04

แก้ไข:เอาท์พุทนั้นมาจากซีดีอื่นกว่าเอาท์พุทที่กำหนด ในความเป็นจริงฉันรู้ว่ามีข้อเท็จจริงที่น่าสนใจที่ฉันให้ไว้เป็นคำตอบ

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

ดังนั้นมีวิธีที่ดีที่สุดในการคัดลอกซีดี / ดีวีดีหรือฉันแค่ใช้คำสั่งไม่ถูกต้องหรือไม่


ข้อมูลเพิ่มเติมเกี่ยวกับสถานการณ์

นี่คือข้อมูลเพิ่มเติมเกี่ยวกับกรณีทดสอบที่ฉันใช้เพื่อตรวจสอบขั้นตอนที่ฉันพบ:

isoinfo -d i /dev/sr0 ผลลัพธ์: https://gist.github.com/JBFWP286/7f50f069dc5d1593ba62#file-isicut-output-19-aug-2015

ddเพื่อคัดลอกสื่อพร้อมเช็กเอาท์เอาท์พุทและข้อมูลไฟล์เอาท์พุท: https://gist.github.com/JBFWP286/75decda0a67605590d32#file-dd-output-with-md5-and-sha256-19-aug-2015

pvเพื่อคัดลอกสื่อที่มี checksums เอาท์พุทและข้อมูลไฟล์เอาท์พุท: https://gist.github.com/JBFWP286/700a13fe0a2f06ce5e7a#file-pv-output-with-md5-and-sha256-19-aug-2015

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม!

linux  dd  cat  disk-image  pv 

ไฟล์มีขนาดเท่ากันหรือไม่? ส่งผลให้เกิดการcmp file1 file2? คุณใช้ddผิดcount=หรือเปล่า (หรือจำนวนจริง ๆ ที่ไม่จำเป็นถ้าคุณต้องการทั้งหมด) อ่านข้อผิดพลาดใน dmesg?
frostschutz

2
มันไปโดยไม่บอกว่าไฟล์ที่มีขนาดแตกต่างกัน (ที่มีความน่าจะเป็น 99.9999999999 +%) จะมีการตรวจสอบที่แตกต่างกัน ตราบใดที่คุณทำแบบทดสอบมันจะดีถ้าคุณโพสต์ผลลัพธ์ทั้งหมดเพื่อรวม (1) ddคำสั่งที่แน่นอนที่คุณใช้ (สิ่งที่บล็อกขนาดอะไรนับ?) (2) ขนาดและ checksums ของ เอาต์พุตทั้งหมดและ (3) ข้อมูลอิสระใด ๆ ที่คุณมีเกี่ยวกับจำนวนข้อมูลในดิสก์ออปติคัลต้นทาง ... ... ... ... ... ... PS ทำไมคุณใช้count=บนdd? คุณต้องการคัดลอกดิสก์อิมเมจทั้งหมดใช่ไหม  count=พูดว่า "คัดลอกหลายคนแล้วหยุด"
สกอตต์

@Scott ในหน้านี้linuxjournal.com/content/archiving-cds-iso-commandlineผู้เขียนกล่าวว่าควรใช้isoinfo -d -i /dev/cdromต้องทราบหมายเลขนับและใช้มัน - ddในความเป็นจริงเขาบอกว่าไม่ควรใช้เพียง "ไม่ว่าในกรณีใดถ้าคุณต้องการอิมเมจ ISO ที่ถูกต้องของซีดีนั้นคุณจะต้องได้รับขนาดบล็อกและจำนวนบล็อกที่ถูกต้องก่อนที่จะสร้างภาพ"

@frostschutz ในกรณีแรกขนาดไม่เหมือนกัน แต่น่าแปลกใจที่ฉันลองอีกครั้งและได้ผลลัพธ์ที่แตกต่าง ดูคำตอบที่ฉันให้ไว้สำหรับรายละเอียดเพิ่มเติม

คำตอบ:


27

คำสั่งทั้งหมดต่อไปนี้เทียบเท่ากัน พวกเขาอ่านไบต์ของแผ่นซีดีและเขียนไปยังไฟล์ที่เรียกว่า/dev/sr0image.iso

cat /dev/sr0 >image.iso
cat </dev/sr0 >image.iso
tee </dev/sr0 >image.iso
dd </dev/sr0 >image.iso
dd if=/dev/cdrom of=image.iso
pv </dev/sr0 >image.iso
cp /dev/sr0 image.iso
tail -c +1 /dev/sr0 >image.iso

ทำไมคุณถึงใช้อันอื่น?

  • ความง่าย ตัวอย่างเช่นถ้าคุณรู้แล้วcatหรือcpคุณไม่จำเป็นต้องเรียนรู้คำสั่งอื่น

  • ความแข็งแรง อันนี้ค่อนข้างเรียบง่าย มีความเสี่ยงเท่าไหร่ที่การเปลี่ยนคำสั่งจะเปลี่ยนสิ่งที่มันทำ? ลองดูตัวอย่างเล็ก ๆ น้อย ๆ :

    • สิ่งใดก็ตามที่มีการเปลี่ยนเส้นทาง: คุณอาจทำการเปลี่ยนเส้นทางโดยไม่ได้ตั้งใจหรือลืมมันไป เนื่องจากปลายทางควรเป็นไฟล์ที่ไม่มีอยู่set -o noclobberควรตรวจสอบให้แน่ใจว่าคุณไม่ได้เขียนทับอะไรเลย อย่างไรก็ตามคุณอาจเขียนทับอุปกรณ์หากคุณตั้งใจเขียน>/dev/sda(สำหรับซีดีซึ่งเป็นแบบอ่านอย่างเดียวไม่มีความเสี่ยงแน่นอน) สิ่งนี้พูดถึงcat /dev/sr0 >image.iso(ยากที่จะเข้าใจผิดในทางที่สร้างความเสียหาย) มากกว่าทางเลือกอื่นเช่นtee </dev/sr0 >image.iso(หากคุณกลับการเปลี่ยนเส้นทางหรือลืมอินพุตหนึ่งรายการteeจะเขียนถึง/dev/sr0)
    • cat: คุณอาจเชื่อมไฟล์สองไฟล์เข้าด้วยกันโดยไม่ตั้งใจ ทำให้ข้อมูลกู้ได้ง่าย
    • dd: iและoอยู่ใกล้กับแป้นพิมพ์และค่อนข้างผิดปกติ ไม่มีเทียบเท่าเป็นnoclobber, of=อะไรจะเขียนทับอย่างมีความสุข ไวยากรณ์การเปลี่ยนเส้นทางมีข้อผิดพลาดน้อยกว่า
    • cp: หากคุณสลับแหล่งที่มาและเป้าหมายโดยไม่ได้ตั้งใจอุปกรณ์จะถูกเขียนทับ (อีกครั้งโดยถือว่าอุปกรณ์ไม่ใช่แบบอ่านอย่างเดียว) หากcpมีการเรียกใช้โดยมีตัวเลือกบางอย่างเช่น-Rหรือ-aบางคนเพิ่มผ่านนามแฝงมันจะคัดลอกโหนดอุปกรณ์แทนเนื้อหาของอุปกรณ์
  • ฟังก์ชั่นเพิ่มเติม เครื่องมือหนึ่งที่นี่ซึ่งมีประโยชน์ใช้สอยเพิ่มเติมคือpvตัวเลือกการรายงานที่ทรงพลัง
    แต่ที่นี่คุณสามารถตรวจสอบว่าได้ทำการคัดลอกไปเท่าใดโดยดูที่ขนาดของไฟล์เอาต์พุต

  • ประสิทธิภาพ. นี่เป็นกระบวนการเชื่อมโยง I / O อิทธิพลหลักในการปฏิบัติงานคือขนาดของบัฟเฟอร์: เครื่องมืออ่าน chunk จากต้นทางเขียน chunk ไปยังปลายทางซ้ำ หากกลุ่มข้อมูลมีขนาดเล็กเกินไปคอมพิวเตอร์จะใช้เวลาสลับระหว่างงานต่างๆ ถ้าอันมีขนาดใหญ่เกินไปการดำเนินการอ่านและเขียนจะไม่สามารถขนานกันได้ ขนาดก้อนที่ดีที่สุดบนพีซีโดยทั่วไปจะอยู่ที่ประมาณไม่กี่เมกะไบต์ แต่ขึ้นอยู่กับระบบปฏิบัติการของฮาร์ดแวร์และสิ่งที่คอมพิวเตอร์ทำ ฉันทำเกณฑ์มาตรฐานสำหรับฮาร์ดดิสก์ไปยังการคัดลอกฮาร์ดดิสก์เมื่อนานมาแล้วบน Linux ซึ่งแสดงให้เห็นว่าสำหรับการคัดลอกภายในดิสก์เดียวกันdd ด้วยขนาดบัฟเฟอร์ขนาดใหญ่มีข้อได้เปรียบ แต่สำหรับการคัดลอกข้ามดิสก์catชนะมากกว่าddขนาดบัฟเฟอร์ใด ๆ

มีเหตุผลบางประการที่คุณพบว่ามีการddกล่าวถึงบ่อยครั้ง นอกเหนือจากประสิทธิภาพแล้วพวกเขาไม่ได้มีเหตุผลที่ดีเป็นพิเศษ

  • ในระบบ Unix ที่เก่าแก่มากเครื่องมือประมวลผลข้อความบางตัวไม่สามารถรับมือกับข้อมูลไบนารีได้ (พวกเขาใช้สตริงที่ถูกยกเลิกด้วยค่า nullภายในดังนั้นพวกเขาจึงมักจะมีปัญหากับไบต์ที่ว่างเปล่าเครื่องมือบางตัวยังสันนิษฐานว่าอักขระใช้เพียง 7 บิตเท่านั้น ประมวลผลชุดอักขระ 8 บิตอย่างถูกต้อง) ฉันไม่แน่ใจว่านี้เคยเป็นปัญหากับcat(มันก็มีเครื่องมือบรรทัดที่มุ่งเน้นมากขึ้นเช่นhead, sedฯลฯ ) แต่คนมีแนวโน้มที่จะหลีกเลี่ยงได้ในข้อมูลไบนารีเพราะมันเกี่ยวข้องกับการประมวลผลข้อความ นี่ไม่ใช่ปัญหาเกี่ยวกับระบบที่ทันสมัยเช่น Linux, OSX, * BSD หรือสิ่งที่สอดคล้องกับ POSIX
  • มีเรื่องเล่าขานที่ddค่อนข้าง“ ระดับต่ำกว่า” กว่าเครื่องมืออื่น ๆ เช่นcatและเข้าถึงอุปกรณ์โดยตรง นี่เป็นเท็จอย่างสมบูรณ์ddและcatและteeอื่น ๆ ทั้งหมดอ่านไบต์จากอินพุตและเขียนไบต์ไปยังเอาต์พุต /dev/sr0ความมหัศจรรย์ที่แท้จริงอยู่ใน
  • ddcat /dev/sr0มีไวยากรณ์บรรทัดคำสั่งที่ผิดปกติเพื่ออธิบายวิธีการทำงานให้มากขึ้นโอกาสที่จะเงางามโดยอธิบายบางสิ่งบางอย่างที่เพิ่งเขียน
  • การใช้dd กับบัฟเฟอร์ที่มีขนาดใหญ่อาจมีประสิทธิภาพที่ดีกว่า แต่ก็ไม่ได้เป็นเช่นนั้นเสมอไป (ดูเกณฑ์มาตรฐานบางอย่างบน Linux )

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

ดังนั้นเพียงแค่ใช้pvถ้าคุณต้องการรายงานความก้าวหน้าแฟนซีหรือcatถ้าคุณไม่ต้องการ


ขอบคุณมากสำหรับเวลาที่คุณเขียนคำตอบนี้! =) ตอนนี้ฉันเข้าใจความแตกต่างระหว่างพวกเขา แค่คำถาม: pv < /dev/sr0 > image.isoเหมือนกับpv /dev/sr0 > image.iso(หลังพบในหน้าคู่มือของ pv) หรือไม่

1
@ JBFWP286 พวกเขาคัดลอกสิ่งเดียวกัน แต่pv /dev/sr0 …สามารถรวมชื่อไฟล์ในรายงานความคืบหน้าในขณะที่pv </dev/sr0ไม่สามารถ
Gilles 'หยุดชั่วร้าย'

หมายเหตุอื่น: cpอาจใช้นามแฝงcp -Rซึ่ง (อย่างน้อยใน GNU cp เป็นรูท) ทำให้เกิดcpการคัดลอกโหนดอุปกรณ์แทนเนื้อหา
marcelm

2
@ JBFWP286 โหนดอุปกรณ์คือไฟล์ที่คุณเข้าถึงฮาร์ดแวร์หรือคุณสมบัติพิเศษอื่น ๆ ที่จัดทำโดยไดรเวอร์เคอร์เนล ไฟล์เกือบทั้งหมด/devเป็นโหนดอุปกรณ์ ยกตัวอย่างเช่นcp -R /dev/sr0 image.isoจะทำให้image.isoไฟล์ผ่านที่ไดรฟ์ซีดีที่มีการเข้าถึงเช่นเดียวแทนที่จะเป็นไฟล์ที่มีสำเนาปกติของเนื้อหาของแผ่นซีดีที่คุณได้รับด้วย/dev/sr0 cp /dev/sr0 image.iso
Gilles 'หยุดความชั่วร้าย' ใน

1
@Hashim ฉันไม่ได้สรุปว่ามันมีประสิทธิภาพที่ดีขึ้น ฉันพูดถึงว่ามันมีประสิทธิภาพที่ดีขึ้นในบางครั้ง ฉันได้เชื่อมโยงกับเกณฑ์มาตรฐานที่ฉันทำ - ในกรณีที่ดีที่สุดที่ddชนะcatแต่เพียงเล็กน้อยเท่านั้น
Gilles 'หยุดความชั่วร้าย' ใน

4

มีข้อเท็จจริงที่น่าสนใจในกรณีนี้โดยเฉพาะข้อเท็จจริงเหล่านี้:

  • ผมได้ตรวจสอบเพียงแค่การส่งออกที่ผมได้รับและให้การ (ผมใช้แผ่นดิสก์อีกเวลานี้ว่าที่ Xubuntu 15.04 x 64 แผ่นดิสก์การติดตั้ง) และด้วยวิธีการทั้งสอง ( ddและpv) checksums ที่มีเหมือนกัน
  • ผมมีความคิดที่จะหลังจากทำddขั้นตอนการเปิดไดรฟ์และใกล้กับแผ่นดิสก์เดียวกันและแล้วเสร็จการทดสอบที่มีpvขั้นตอน ทำอย่างนั้นฉันได้รับสำเนาเหมือนกันทั้งสองขั้นตอน
  • ฉันคิดว่าฉันมีการตรวจสอบที่แตกต่างกันในครั้งแรกเพราะด้วยเหตุผลบางอย่างข้อมูลที่รวบรวมจากไดรฟ์ CD / DVD ดูเหมือนจะ "บันทึก" ไปยังวัตถุประสงค์อื่นในบางครั้ง (เช่นแคช) - ดังนั้นการดำเนินการอื่น ๆ เช่น checksums ทำให้เร็วกว่าการถ่ายโอนมาก โปรดแสดงความคิดเห็นหากคุณทราบสาเหตุที่แท้จริงของสิ่งนี้
  • ความเป็นจริงก็คือว่าddw / o การcount=Xพารามิเตอร์หยุดได้อย่างถูกต้องในตอนท้ายของแผ่นดิสก์และให้เดียวกันแผ่นภาพเช่นเดียวกับpv(checksums เหมือนกัน) ดังนั้นจึงดีกว่าสำหรับผมที่จะใช้ddw / o pvพารามิเตอร์หรือเพียงแค่

ดังนั้นสำหรับตอนนี้ดูเหมือนว่าpvและddสามารถทำสำเนาซีดี / ดีวีดีด้วยผลลัพธ์เดียวกัน

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