以下のコマンドはすべて同等です。 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 コピーを実行できます。