使用 cat、dd、pv 或其他程序來複製 CD/DVD 是否更好?
背景
我正在將一些數據 CD/DVD 複製到 ISO 文件中以便以後使用它們,而不需要在驅動器中使用它們。
我正在網上尋找程序,我發現了很多:
cat /dev/sr0 > image.iso
- 這樣做的使用
dd
(顯然是使用最廣泛的):http ://www.linuxjournal.com/content/archiving-cds-iso-commandlinedd if=/dev/cdrom bs=blocksize count=count of=/path/to/isoimage.iso
- 使用 just
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
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
你為什麼要使用一個而不是另一個?
簡單。例如,如果您已經知道
cat
orcp
,則無需學習其他命令。穩健性。這是一種簡單的變體。更改命令會改變它的作用有多大風險?讓我們看幾個例子:
- 任何有重定向的東西:你可能不小心把重定向弄錯了,或者忘記了。由於目標應該是一個不存在的文件,
set -o noclobber
因此應確保您不會覆蓋任何內容;但是,如果您不小心寫入,您可能會覆蓋設備>/dev/sda
(當然,對於只讀的 CD,沒有風險)。這有利於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-bound 程序;對性能的主要影響是緩衝區大小:該工具從源讀取塊,將塊寫入目標,然後重複。如果塊太小,電腦會花時間在任務之間切換。如果chunk太大,讀寫操作就不能並行。PC 上的最佳塊大小通常約為幾兆字節,但這顯然非常依賴於作業系統、硬體以及電腦正在執行的其他操作。我前段時間在 Linux 上對硬碟到硬碟的副本進行了基準測試,結果表明對於同一磁碟內的副本,
dd
具有大緩衝區大小的優勢,但對於跨磁碟副本,cat
則勝過任何dd
緩衝區大小。
dd
您發現經常被提及的原因有幾個。除了性能之外,它們並不是特別好的理由。
- 在非常舊的 Unix 系統中,一些文本處理工具無法處理二進制數據(它們在內部使用以空字元結尾的字元串,因此它們往往會遇到空字節問題;一些工具還假設字元僅使用 7 位,並且沒有正確處理 8 位字元集)。我不確定這是否曾經是一個問題
cat
(它是使用更多面向行的工具,例如head
,sed
等),但人們傾向於避免在二進制數據上使用它,因為它與文本處理相關。這在 Linux、OSX、*BSD 或任何與 POSIX 兼容的現代系統上都不是問題。- 有一種神話
dd
比其他工具(例如cat
直接訪問設備)要“低級”一些。這是完全錯誤的:dd
andcat
和tee
其他人都從他們的輸入中讀取字節並將字節寫入他們的輸出。真正的魔力在/dev/sr0
。dd
有一個不尋常的命令行語法,所以解釋它是如何工作的,通過解釋一些只寫cat /dev/sr0
.- 使用
dd
大緩衝區大小可以獲得更好的性能,但並非總是如此(請參閱Linux 上的一些基準測試)。一個主要的風險
dd
是它可以默默地跳過一些數據。我認為dd
只要通過skip
或count
不通過都是安全的,但我不確定是否在所有平台上都是如此。但它除了性能之外沒有任何優勢。因此,
pv
如果您想要其精美的進度報告,或者cat
您不想要,就使用它。