Linux

使用 cat、dd、pv 或其他程序來複製 CD/DVD 是否更好?

  • January 24, 2021

背景

我正在將一些數據 CD/DVD 複製到 ISO 文件中以便以後使用它們,而不需要在驅動器中使用它們。

我正在網上尋找程序,我發現了很多:

cat /dev/sr0 > image.iso
dd if=/dev/cdrom bs=blocksize count=count of=/path/to/isoimage.iso
  • 使用 justpv來完成此操作:查看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

dd程序的md5:71b676875b0194495060b38f35237c3c

pv程序的md5:f3524d81fdeeef962b01e1d86e6acc04

**編輯:**該輸出來自另一張 CD,而不是給定的輸出。事實上,我意識到我提供了一些有趣的事實作為答案。

事實上,每個文件的大小是不同的。

那麼,是否有複製 CD/DVD 的最佳程序,或者我只是錯誤地使用了這些命令?


有關情況的更多資訊

以下是有關我用來檢查迄今為止找到的程序的測試案例的更多資訊:

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

dd複製媒體,輸出校驗和和文件資訊輸出:https ://gist.github.com/JBFWP286/75decda0a67605590d32#file-dd-output-with-md5-and-sha256-19-aug-2015

pv複製媒體,輸出校驗和和文件資訊輸出:https ://gist.github.com/JBFWP286/700a13fe0a2f06ce5e7a#file-pv-output-with-md5-and-sha256-19-aug-2015

任何幫助將不勝感激!

以下所有命令都是等效的。他們讀取 CD 的字節/dev/sr0並將它們寫入一個名為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

你為什麼要使用一個而不是另一個?

  • 簡單。例如,如果您已經知道cator cp,則無需學習其他命令。

  • 穩健性。這是一種簡單的變體。更改命令會改變它的作用有多大風險?讓我們看幾個例子:

    • 任何有重定向的東西:你可能不小心把重定向弄錯了,或者忘記了。由於目標應該是一個不存在的文件,set -o noclobber因此應確保您不會覆蓋任何內容;但是,如果您不小心寫入,您可能會覆蓋設備>/dev/sda(當然,對於只讀的 CD,沒有風險)。這有利於cat /dev/sr0 >image.iso(很難以破壞性的方式出錯)而不是替代方案,例如tee </dev/sr0 >image.iso(如果您反轉重定向或忘記輸入,tee將寫入/dev/sr0)。
    • cat: 你可能會不小心連接兩個文件。這使得數據很容易被挽救。
    • dd:io在鍵盤上關閉,有點不尋常。沒有等效的noclobber,of=會很高興地覆蓋任何東西。重定向語法不易出錯。
    • cp:如果您不小心交換了源和目標,設備將被覆蓋(再次,假設是非只讀設備)。如果cp使用某些選項(例如-R-a某些人通過別名添加的選項)呼叫,它將複製設備節點而不是設備內容。
  • 附加功能。這裡有一個有用的附加功能的工具,pv它具有強大的報告選項。

但是在這裡您可以通過查看輸出文件的大小來檢查複製了多少。

  • 表現。這是一個 I/O-bound 程序;對性能的主要影響是緩衝區大小:該工具從源讀取塊,將塊寫入目標,然後重複。如果塊太小,電腦會花時間在任務之間切換。如果chunk太大,讀寫操作就不能並行。PC 上的最佳塊大小通常約為幾兆字節,但這顯然非常依賴於作業系統、硬體以及電腦正在執行的其他操作。我前段時間在 Linux 上對硬碟到硬碟的副本進行了基準測試,結果表明對於同一磁碟內的副本,dd 具有大緩衝區大小的優勢,但對於跨磁碟副本,cat則勝過任何dd緩衝區大小。

dd您發現經常被提及的原因有幾個。除了性能之外,它們並不是特別好的理由。

  • 在非常舊的 Unix 系統中,一些文本處理工具無法處理二進制數據(它們在內部使用以空字元結尾的字元串,因此它們往往會遇到空字節問題;一些工具還假設字元僅使用 7 位,並且沒有正確處理 8 位字元集)。我不確定這是否曾經是一個問題cat(它是使用更多面向行的工具,例如head,sed等),但人們傾向於避免在二進制數據上使用它,因為它與文本處理相關。這在 Linux、OSX、*BSD 或任何與 POSIX 兼容的現代系統上都不是問題。
  • 有一種神話dd比其他工具(例如cat直接訪問設備)要“低級”一些。這是完全錯誤的:ddandcattee其他人都從他們的輸入中讀取字節並將字節寫入他們的輸出。真正的魔力在/dev/sr0
  • dd有一個不尋常的命令行語法,所以解釋它是如何工作的,通過解釋一些只寫cat /dev/sr0.
  • 使用dd 大緩衝區大小可以獲得更好的性能,但並非總是如此(請參閱Linux 上的一些基準測試)。

一個主要的風險dd它可以默默地跳過一些數據。我認為dd只要通過skipcount不通過都是安全的,但我不確定是否在所有平台上都是如此。但它除了性能之外沒有任何優勢。

因此,pv如果您想要其精美的進度報告,或者cat您不想要,就使用它。

引用自:https://unix.stackexchange.com/questions/224277