Apakah lebih baik menggunakan cat, dd, pv atau prosedur lain untuk menyalin CD / DVD?

22

Latar Belakang

Saya menyalin beberapa data CD / DVD ke file ISO untuk menggunakannya nanti tanpa perlu di drive.

Saya mencari di Internet untuk prosedur dan saya menemukan banyak:

  • Penggunaan catuntuk menyalin media: http://www.yolinux.com/TUTORIALS/LinuxTutorialCDBurn.html

    cat /dev/sr0 > image.iso
    
  • Penggunaan dduntuk melakukannya (tampaknya yang paling banyak digunakan): http://www.linuxjournal.com/content/archiving-cds-iso-commandline

    dd if=/dev/cdrom bs=blocksize count=count of=/path/to/isoimage.iso
    
  • Gunakan hanya pvuntuk mencapai ini: Lihat man pvuntuk informasi lebih lanjut, meskipun di sini adalah kutipannya:

    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
    

Saya tidak tahu apakah mereka semua harus setara, meskipun saya diuji beberapa dari mereka (menggunakan md5sumalat) dan, setidaknya, dddan pvyang tidak setara. Berikut adalah md5sumkedua drive dan file yang dihasilkan menggunakan setiap prosedur:

md5 dari prosedur dd: 71b676875b0194495060b38f35237c3c

md5 dari prosedur pv: f3524d81fdeeef962b01e1d86e6acc04

EDIT: Output itu dari CD lain dari output yang diberikan. Bahkan, saya menyadari ada beberapa fakta menarik yang saya berikan sebagai jawaban.

Bahkan, ukuran masing-masing file berbeda dibandingkan satu sama lain.

Jadi, apakah ada prosedur terbaik untuk menyalin CD / DVD atau saya hanya menggunakan perintah yang salah?


Informasi lebih lanjut tentang situasi ini

Berikut adalah informasi lebih lanjut tentang test case yang saya gunakan untuk memeriksa prosedur yang saya temukan sejauh ini:

isoinfo -d i /dev/sr0 Keluaran: https://gist.github.com/JBFWP286/7f50f069dc5d1593ba62#file-isoinfo-output-19-aug-2015

dduntuk menyalin media, dengan checksum keluaran dan informasi file Keluaran: https://gist.github.com/JBFWP286/75decda0a67605590d32#file-dd-output-with-md5-and-sha256-19-aug-2015

pvuntuk menyalin media, dengan checksum keluaran dan informasi file Keluaran: https://gist.github.com/JBFWP286/700a13fe0a2f06ce5e7a#file-pv-output-with-md5-and-sha256-19-aug-2015

Bantuan apa pun akan dihargai!


sumber
apakah ukuran file identik? hasil dari cmp file1 file2? apakah Anda menggunakan dddengan yang salah count=(atau benar-benar ada hitungan sama sekali yang tidak perlu jika Anda menginginkan semuanya?). Baca kesalahan dalam dmesg?
frostschutz
2
Tak perlu dikatakan bahwa file dengan ukuran yang berbeda (dengan probabilitas 99,9999999999 +%) akan memiliki checksum yang berbeda. Selama Anda telah melakukan tes, alangkah baiknya jika Anda akan memposting semua hasil, untuk memasukkan (1) ddperintah persis yang Anda gunakan (apa ukuran blok? Apa yang dihitung?), (2) ukuran dan checksum dari semua output, dan (3) informasi independen apa pun yang Anda miliki mengenai jumlah data pada disk optik sumber. ... ... ... ... ... ... PS Mengapa Anda menggunakan count=pada dd? Anda ingin menyalin seluruh gambar disk, bukan?  count=mengatakan "salin sebanyak ini lalu berhenti".
Scott
@Scott Pada halaman ini linuxjournal.com/content/archiving-cds-iso-commandline penulis mengatakan seseorang harus menggunakan isoinfo -d -i /dev/cdromuntuk mengetahui nomor hitungan dan menggunakannya - pada kenyataannya, ia mengatakan seseorang tidak boleh menggunakan hanya dd. "Bagaimanapun juga, jika Anda menginginkan image ISO yang tepat dari CD itu, Anda perlu memperbaiki ukuran blocksize dan blockcount sebelum Anda membuat gambar Anda."
@ frostschutz Dalam kasus pertama ukurannya tidak sama, tetapi yang mengejutkan, saya mencoba lagi dan mendapatkan hasil yang berbeda. Lihat jawaban yang saya berikan untuk perincian lebih lanjut.

Jawaban:

27

Semua perintah berikut ini setara. Mereka membaca byte CD /dev/sr0dan menulisnya ke file bernama image.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

Mengapa Anda menggunakan salah satunya?

  • Kesederhanaan. Misalnya, jika Anda sudah tahu catatau cp, Anda tidak perlu mempelajari perintah lain lagi.

  • Kekokohan. Yang ini sedikit varian kesederhanaan. Berapa banyak risiko yang ada sehingga mengubah perintah akan mengubah apa yang dilakukannya? Mari kita lihat beberapa contoh:

    • Apa pun dengan pengalihan: Anda mungkin secara tidak sengaja menempatkan pengalihan secara salah, atau melupakannya. Karena tujuan seharusnya adalah file yang tidak ada, set -o noclobberharus memastikan bahwa Anda tidak menimpa apa pun; namun Anda mungkin menimpa perangkat jika Anda tidak sengaja menulis >/dev/sda(untuk CD, yang hanya baca, tidak ada risiko, tentu saja). Ini mendukung cat /dev/sr0 >image.iso(sulit untuk salah dengan cara yang merusak) atas alternatif seperti tee </dev/sr0 >image.iso(jika Anda membalikkan pengalihan atau melupakan input, teeakan menulis ke /dev/sr0).
    • cat: Anda mungkin secara tidak sengaja menggabungkan dua file. Itu membuat data mudah diselamatkan.
    • dd: idan odekat pada keyboard, dan agak tidak biasa. Tidak ada padanannya noclobber, of=dengan senang hati akan menimpa apa pun. Sintaks redirection kurang rentan kesalahan.
    • cp: jika Anda secara tidak sengaja menukar sumber dan target, perangkat akan ditimpa (sekali lagi, dengan asumsi perangkat non-read-only). Jika cpdipanggil dengan beberapa opsi seperti -Ratau -ayang beberapa orang tambahkan melalui alias, itu akan menyalin node perangkat daripada konten perangkat.
  • Fungsionalitas tambahan. Satu-satunya alat di sini yang memiliki fungsionalitas tambahan yang bermanfaat adalah pv, dengan opsi pelaporan yang kuat.
    Tetapi di sini Anda dapat memeriksa berapa banyak yang telah disalin dengan melihat ukuran file output.

  • Performa. Ini adalah proses yang terikat I / O; pengaruh utama dalam kinerja adalah ukuran buffer: alat membaca sepotong dari sumber, menulis potongan ke tujuan, berulang. Jika bongkahan terlalu kecil, komputer menghabiskan waktunya untuk beralih di antara tugas. Jika chunk terlalu besar, operasi baca dan tulis tidak dapat diparalelkan. Ukuran potongan optimal pada PC biasanya sekitar beberapa megabyte tetapi ini jelas sangat tergantung pada OS, pada perangkat keras, dan pada apa lagi yang dilakukan komputer. Saya membuat tolok ukur untuk hard disk ke salinan hard disk beberapa waktu yang lalu, di Linux, yang menunjukkan bahwa untuk salinan dalam disk yang sama, dd dengan ukuran buffer yang besar memiliki keunggulan, tetapi untuk salinan cross-disk, catmemenangkan semua ddukuran buffer.

Ada beberapa alasan mengapa Anda ddsering disebutkan. Terlepas dari kinerja, mereka bukan alasan yang sangat bagus.

  • Dalam sistem Unix yang sangat lama, beberapa alat pengolah teks tidak dapat mengatasi data biner (mereka menggunakan string null-terminated secara internal, sehingga mereka cenderung memiliki masalah dengan null byte; beberapa alat juga mengasumsikan bahwa karakter hanya menggunakan 7 bit dan tidak proses set karakter 8-bit dengan benar). Saya tidak yakin apakah ini pernah ada masalah dengan cat(itu dengan line-berorientasi alat yang lebih seperti head, sed, dll), tetapi orang-orang cenderung menghindari pada data biner karena hubungannya dengan pengolahan teks. Ini bukan masalah pada sistem modern seperti Linux, OSX, * BSD, atau apa pun yang sesuai dengan POSIX.
  • Ada semacam mitos yang ddagak "lebih rendah" daripada alat lain seperti catdan mengakses perangkat secara langsung. Ini sepenuhnya salah: dddan catdan teeyang lainnya membaca byte dari input mereka dan menulis byte ke output mereka. Sihir yang sebenarnya ada di /dev/sr0.
  • ddmemiliki sintaks baris perintah yang tidak biasa, jadi menjelaskan cara kerjanya memberi lebih banyak peluang untuk bersinar dengan menjelaskan sesuatu yang hanya ditulis cat /dev/sr0.
  • Menggunakan dd dengan ukuran buffer yang besar dapat memiliki kinerja yang lebih baik, tetapi tidak selalu demikian (lihat beberapa tolok ukur di Linux ).

Risiko utama ddadalah ia dapat melewatkan beberapa data secara diam-diam . Saya pikir ddaman selama skipatau counttidak dilewati tetapi saya tidak yakin apakah ini yang terjadi pada semua platform. Tetapi tidak memiliki keuntungan kecuali untuk kinerja.

Jadi gunakan saja pvjika Anda ingin laporan kemajuannya yang mewah, atau catjika tidak.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih banyak atas waktu Anda menulis tanggapan ini! =) Sekarang saya mengerti perbedaan di antara mereka. Hanya sebuah pertanyaan: Apakah pv < /dev/sr0 > image.isosama dengan pv /dev/sr0 > image.iso(yang terakhir ditemukan di halaman manual pv)?
1
@ JBFWP286 Mereka menyalin hal yang sama, tetapi pv /dev/sr0 …dapat memasukkan nama file dalam laporan kemajuan sedangkan pv </dev/sr0tidak bisa.
Gilles 'SANGAT berhenti menjadi jahat'
Catatan lain: cpmungkin alias cp -R, yang (setidaknya pada GNU cp, sebagai root) menyebabkan cpuntuk menyalin node perangkat daripada kontennya.
marcelm
2
@ JBFWP286 Node perangkat adalah file yang digunakan untuk mengakses perangkat keras atau fitur khusus lainnya yang disediakan oleh driver kernel. Hampir semua file dalam /devadalah node perangkat. Misalnya cp -R /dev/sr0 image.isoakan membuat image.isofile melalui mana drive CD diakses, sama seperti /dev/sr0, bukan file biasa yang berisi salinan konten CD yang Anda dapatkan cp /dev/sr0 image.iso.
Gilles 'SANGAT berhenti menjadi jahat'
1
@Hashim Saya tidak menyimpulkan bahwa ini memiliki kinerja yang lebih baik. Saya menyebutkan bahwa kadang-kadang memiliki kinerja yang lebih baik . Saya telah mengaitkan dengan tolok ukur yang saya buat - dalam ddbeat case terbaik cattetapi hanya dengan selisih sedikit.
Gilles 'SANGAT berhenti menjadi jahat'
4

Ada fakta menarik dalam kasus ini, khususnya yang ini:

  • Saya baru saja memeriksa output yang saya dapatkan dan berikan (saya menggunakan disk lain kali ini, tepatnya, disk setup Xubuntu 15.04 x64), dan dengan kedua prosedur ( dddan pv) checksum identik .
  • Saya mempunyai ide untuk, setelah melakukan ddprosedur, membuka drive dan menutupnya dengan disk yang sama, dan kemudian menyelesaikan tes dengan pvprosedur tersebut. Melakukan hal itu, saya mendapatkan salinan identik dengan kedua prosedur.
  • Saya pikir saya mendapat checksum yang berbeda untuk pertama kalinya, karena untuk beberapa alasan, data yang dikumpulkan dari drive CD / DVD tampaknya "direkam" untuk tujuan lain untuk beberapa waktu (seperti cache) - dengan demikian, operasi lain seperti checksum adalah dibuat jauh lebih cepat daripada transfer. Berikan komentar jika Anda tahu alasan pasti untuk ini.
  • Fakta lain adalah bahwa ddw / o count=Xparameter berhenti benar pada akhir disk dan memberikan yang sama disc-gambar seperti pv(checksum adalah identik), jadi lebih baik bagi saya untuk menggunakan ddw / o parameter atau hanya pv.

Jadi, untuk saat ini, tampaknya pvdan dddapat menyalin CD / DVD dengan hasil yang sama.

Rui F Ribeiro
sumber