以下のコマンドはすべて同等です。 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
を知っている場合 またはcp
、さらに別のコマンドを学ぶ必要はありません。 -
堅牢性。これはシンプルさのちょっとした変形です。コマンドを変更すると、コマンドの動作が変わるというリスクはどれくらいありますか?いくつかの例を見てみましょう:
- リダイレクトを伴うもの:誤ってリダイレクトを間違った方向に配置したり、忘れたりする可能性があります。宛先は存在しないファイルのはずなので
set -o noclobber
何も上書きしないようにする必要があります。ただし、誤って>/dev/sda
と記述した場合、デバイスを上書きする可能性があります (読み取り専用の CD の場合、もちろんリスクはありません)。これはcat /dev/sr0 >image.iso
を支持していますtee </dev/sr0 >image.iso
などの代替よりも (有害な方法で間違いを犯すのは難しい) (リダイレクトを逆にするか、入力を忘れた場合、tee
/dev/sr0
に書き込みます ). cat
:誤って 2 つのファイルを連結する可能性があります。これにより、データを簡単に回収できます。dd
:i
とo
キーボードに近く、やや珍しいです。noclobber
に相当するものはありません 、of=
何でも喜んで上書きします。リダイレクト構文は、エラーが発生しにくいです。cp
:ソースとターゲットを誤って交換すると、デバイスが上書きされます (ここでも、非読み取り専用デバイスを想定しています)。cp
の場合-R
などのいくつかのオプションで呼び出されます または-a
エイリアスを介して追加する人もいますが、デバイス コンテンツではなくデバイス ノードをコピーします。
- リダイレクトを伴うもの:誤ってリダイレクトを間違った方向に配置したり、忘れたりする可能性があります。宛先は存在しないファイルのはずなので
-
追加機能。ここで便利な追加機能を持つツールは
pv
です 、強力なレポート オプションを備えています。
ただし、出力ファイルのサイズを確認することで、どれだけコピーされたかを確認できます。 -
パフォーマンス。これは I/O バウンド プロセスです。パフォーマンスへの主な影響はバッファ サイズです。ツールはソースからチャンクを読み取り、そのチャンクを宛先に書き込み、繰り返します。チャンクが小さすぎると、コンピューターはタスクの切り替えに時間を費やします。チャンクが大きすぎると、読み取り操作と書き込み操作を並列化できません。 PC での最適なチャンク サイズは通常、数メガバイト程度ですが、これは OS、ハードウェア、およびコンピューターのその他の動作に大きく依存していることは明らかです。少し前に、Linux でハードディスクからハードディスクへのコピーのベンチマークを作成しました。これは、同じディスク内のコピーの場合、
dd
であることを示しました。 バッファ サイズが大きい には利点がありますが、クロスディスク コピーの場合はcat
です。dd
に勝ちました バッファ サイズ。
dd
が見つかる理由はいくつかあります とよく言われます。パフォーマンスを別にすれば、特に正当な理由にはなりません。
- 非常に古い Unix システムでは、一部のテキスト処理ツールはバイナリ データを処理できませんでした (ヌル終了文字列を内部で使用していたため、ヌル バイトで問題が発生する傾向がありました。一部のツールは、文字が 7 ビットのみを使用し、 8 ビット文字セットを適切に処理しませんでした)。これが
cat
の問題だったかどうかはわかりません (head
などのより行指向のツールを使用していました) 、sed
など) ですが、テキスト処理との関連性から、バイナリ データでは避ける傾向がありました。これは、Linux、OSX、*BSD、または POSIX 準拠の最新システムでは問題になりません。 dd
という神話がありますcat
などの他のツールよりもやや「低レベル」です。 デバイスに直接アクセスします。これは完全に誤りです:dd
とcat
とtee
その他はすべて、入力からバイトを読み取り、そのバイトを出力に書き込みます。本当の魔法は/dev/sr0
にあります .dd
は珍しいコマンド ライン構文を持っているため、それがどのように機能するかを説明すると、cat /dev/sr0
を記述するだけで何かを説明することで、より多くの機会が得られます。 .dd
の使用 バッファ サイズが大きい パフォーマンスが向上する可能性がありますが、常にそうとは限りません (Linux のベンチマークを参照してください)。
dd
の大きなリスク 一部のデータを静かにスキップできる . dd
だと思います skip
である限り安全です または count
渡されませんが、これがすべてのプラットフォームに当てはまるかどうかはわかりません。しかし、パフォーマンス以外に利点はありません。
pv
を使用するだけです 派手な進捗レポートが必要な場合、または cat
cat
のような一般的なツールを使用する代わりに または dd
、次のような読み取りエラーに対してより信頼性の高いツールを優先する必要があります
- レスキュー
- readcd (CD/DVD ドライブのエラー修正/再試行メカニズムが組み込まれています)
さらに、それらのデフォルト設定は、例よりも適しています。 dd
この場合、特に次のような興味深い事実があります:
- 取得して提供した出力 (今回は別のディスク、正確には Xubuntu 15.04 x64 セットアップ ディスクを使用) を両方の手順 (
dd
) で確認しました。 とpv
) チェックサムが同一 . dd
を実行した後、 手順に従って、ドライブを開き、同じディスクで閉じてから、pv
でテストを終了します。 手順。それだけで、両方の手順で同じコピーを取得できました。- 私は思う 何らかの理由で、CD/DVD ドライブから収集されたデータがしばらくの間 (キャッシュのように) 他の目的に「記録」されているように見えるため、初めて異なるチェックサムを取得しました。転送よりもはるかに高速です。この正確な原因を知っている場合はコメントしてください。
- もう 1 つの事実は、
dd
です。count=X
なし パラメータはディスクの終わりで正しく停止し、pv
と同じディスク イメージを提供します。 (チェックサムは同じです)、それでdd
を使用する方が良いです パラメータなしまたはpv
のみ .
したがって、今のところ、pv
のようです。 および dd
同じ結果で CD/DVD コピーを実行できます。