web-dev-qa-db-ja.com

画像ファイルを書き込むためのddとcatの違いは何ですか?

イメージファイルをディスクまたはUSBスティックに書き込む場合、通常、手順では次のようにddを使用します。

dd if=myimage.img of=/dev/sdb

これは、たとえば次のようにどのように異なりますか。

cat myimage.img > /dev/sdb

ddにはcount=...のようにもっと多くのオプションがあることに気付きましたが、演習の目的がファイル全体をデバイスに書き込むことである場合、ddを使用する利点は何ですか?

6
Johannes Ernst

この質問は、「長方形を描くことができるツールと、ひし形を描くことができるツールがあります。正方形を描くのに適切なツールはどれですか?」のようなものです。

正方形は長方形の特殊なケースと菱形の特殊なケースであるため、2つのツールのいずれかを使用できます。

ddcatについても同じです。前者は、変換、スキップとシーク、バッファサイズの調整を行うことができます。ただし、単純なケースでは、一方のファイル(またはブロックデバイス)を読み取り、もう一方のファイルに生データを書き込むだけです。後者は、オプションのテキスト変更を使用して複数のファイルを1つのストリームに連結できますが、単純なケースでは、コンテンツが(シェルサポートを使用して)出力ファイルまたはデバイスにストリーミングされる入力ファイルは1つだけです。

どちらのツールも便利で、他のツールを優先して破棄することはできません。それらのスコープは、あなたが尋ねるこの単純なケースでちょうど重複しています。


ddをより良い選択にする問題が少なくとも2つあると思います。

1.デバイスのアクセス許可をブロックする

ファイルまたはデバイスに書き込むには、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の影響を受けない入力リダイレクトもあります。

2.単純なケースを超えて

台所のテーブルを作る大工を想像してみてください。ほとんどのテーブルの上面は長方形です。ひし形のものははるかに一般的ではありません。四角いトップのテーブルがあります。正方形はひし形であり、長方形でもあります。大工は珍しいひし形のテーブルに適用される方法を使用しますか?または一般的な長方形のテーブルに?どちらの方法も正方形のテーブルで機能するはずですが、それでも彼は1営業日ごとに長方形を作成するため、アプローチを変更しても意味がありません。

catddに戻ります。私の意見(および私の実践)では、すべてをブロックデバイスに書き込むために、複数の画像を連結する必要はほとんどありません。それは間違いなく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は何も提供しません。

4