イメージファイルをディスクまたはUSBスティックに書き込む場合、通常、手順では次のようにdd
を使用します。
dd if=myimage.img of=/dev/sdb
これは、たとえば次のようにどのように異なりますか。
cat myimage.img > /dev/sdb
dd
にはcount=...
のようにもっと多くのオプションがあることに気付きましたが、演習の目的がファイル全体をデバイスに書き込むことである場合、dd
を使用する利点は何ですか?
この質問は、「長方形を描くことができるツールと、ひし形を描くことができるツールがあります。正方形を描くのに適切なツールはどれですか?」のようなものです。
正方形は長方形の特殊なケースと菱形の特殊なケースであるため、2つのツールのいずれかを使用できます。
dd
とcat
についても同じです。前者は、変換、スキップとシーク、バッファサイズの調整を行うことができます。ただし、単純なケースでは、一方のファイル(またはブロックデバイス)を読み取り、もう一方のファイルに生データを書き込むだけです。後者は、オプションのテキスト変更を使用して複数のファイルを1つのストリームに連結できますが、単純なケースでは、コンテンツが(シェルサポートを使用して)出力ファイルまたはデバイスにストリーミングされる入力ファイルは1つだけです。
どちらのツールも便利で、他のツールを優先して破棄することはできません。それらのスコープは、あなたが尋ねるこの単純なケースでちょうど重複しています。
dd
をより良い選択にする問題が少なくとも2つあると思います。
ファイルまたはデバイスに書き込むには、cat
の出力をリダイレクトする必要があります。シェルはリダイレクトを実行します。つまり、ターゲットファイルを開きます。 /dev/sdb
にリダイレクトしている間、rootとしてログインしていない限り、おそらく「permissiondenied」を押すでしょう。 rootとしてシェルを実行することは危険であり、避ける必要があります。
あなたは試すことができます
Sudo cat myimage.img > /dev/sdb
Sudo
はシェルによって実行される出力リダイレクトに影響を与えないため、失敗します。
一方これは完全に問題ありません:
Sudo dd if=myimage.img of=/dev/sdb
ちなみに、ちょっとしたヒント:アクセスが制限されたファイルに出力をリダイレクトする必要がある状況に陥った場合は、次のトリックを使用できます。
some_command | Sudo tee restricted_file > /dev/null
それは私たちに仕事をするためのさらに別の方法につながります。コマンドtee
は、その入力を複数のファイルと標準出力に渡します。単純なケースでは、ファイルが1つあり、標準出力は破棄されます。
Sudo tee /dev/sdb < myimage.img > /dev/null
この場合、Sudo
の影響を受けない入力リダイレクトもあります。
台所のテーブルを作る大工を想像してみてください。ほとんどのテーブルの上面は長方形です。ひし形のものははるかに一般的ではありません。四角いトップのテーブルがあります。正方形はひし形であり、長方形でもあります。大工は珍しいひし形のテーブルに適用される方法を使用しますか?または一般的な長方形のテーブルに?どちらの方法も正方形のテーブルで機能するはずですが、それでも彼は1営業日ごとに長方形を作成するため、アプローチを変更しても意味がありません。
cat
とdd
に戻ります。私の意見(および私の実践)では、すべてをブロックデバイスに書き込むために、複数の画像を連結する必要はほとんどありません。それは間違いなくcat
の仕事になるでしょう。このツールはさらに多くのことを実行できますが、それは望ましくありません。オプションはテキストファイルを対象としているため、画像ファイルで使用するとバイナリデータが無効になります。
さて、dd
によって提供されるオプションは、デバイスからの読み取りまたはデバイスへの書き込みを行うときに役立つことがよくあります。
conv=noerr
–ソースに障害がある可能性がある場合。bs=…
–大きなバッファはHDDを使い果たしません。count=…
–MBRなどのフラグメントを読み取るため。conv=sparse
–状況によっては画像サイズを縮小します。もっとあります。このコマンド:
kill -s USR1 $(pidof dd)
dd
がI/O統計を標準エラーに出力します。 cat
でこれを行うことはできないと思います。
これらが理由です私はdd
が生の画像を操作するための自然なツールだと思います。違いがないという理由だけでツールをcat
に変更しても意味がありません特別な場合に。作者が私のように考えているので、通常、手順ではdd
を使用していると思います。意識的に適切なツールを選択する能力には、特に同じように適切と思われるツールが他にもある場合は、ある程度の優雅さがあります。
最後に、私はpv myimage.img | Sudo tee /dev/sdb > /dev/null
を使用したことを認めます。 正しいツールを放棄しましたが、pv
でプログレスバーが表示されました。連結する必要がない限り(またはテキストツールでバイナリデータを分割する必要がない限り)、cat
は何も提供しません。