こんにちは、山田ハヤオです。
USBにイメージファイルを書き込むときにLinuxで使う「dd」コマンドについての記事です。
きっかけ
レスポンスPC兄貴とChromeOSの書き込みをしていたときにRufusのddモードの説明をしていて、ふと思いつきました。
ddコマンドとは
ddコマンドはUSBにデータを書き込むためのコマンドではありません、
送信元と送信先を指定してデータを転送するコマンドです。
変換機能もあるらしいんですが、使ったことがないので割愛…
そしてddコマンドは送信先にスペシャルファイルを指定できるので、USBへの書き込みに使われることが多いというだけです。
生のデータをそのまま転送するのでどんなデータでも転送できます。
そのため、たとえばUSBのデータをバックアップするとか、ディスク全体にランダムな文字列を書き込むとか、そう言ったこともddコマンドだけで完結します。
ddコマンドの基本構文
基本的には以下のような構文です。
# dd if=<入力元> of=<出力先>
ddコマンドはある意味最強のコマンドなので、Root権限が必須です。
また、ddコマンドの引数は通常のUNIX系のコマンドラインツールやWindowsのコマンドとも異なった形式です。
色々な使い方
ddコマンドで色々なことができます。オプションの意味も含めながら解説していきます。
dd if=/path/to/iso of=/path/to/usb
「if」は「input file」の略で「of」は「output file」の略です。
どちらも変数のように=の後に値を設定します。ifにイメージファイル、ofにUSBやHDDなどへのパスを指定するとUSBに内容を書き込むことができます。
接続されているデバイスの一覧は「fdisk -l」で確認できます。
# dd if=~/Desktop/archlinux.iso of=/dev/sdb
上のコマンドは~/Desktop/archlinux.isoを/dev/sdbに書き込みます。
おそらくこれが最も一般的な使い方です。
イメージファイルはiso以外にもimg形式や、ChromeOSでお馴染みのbinファイルも指定できます。
dd if=/dev/sda of=/dev/sdb
上の例と同じですが、ifとofでどちらも実際のデバイスを指定しています。
この場合は「/dev/sda」の内容をそのまま「/dev/sdb」にコピーしています。
パーティションごとコピーされるのでディスクのクローンに使えます。
dd if=/dev/sda of=/path/to/file
今度は入力がデバイス、出力がファイルです。
USBメモリやHDDの内容をイメージファイルとして書き出すことができます。
また、書き出したファイルはイメージファイルとしてifに指定し、他のデバイスに書き込むこともできます。
dd if=/dev/zero of=/path/to/file count=1024 bs=1
/dev/zeroはUnix系のOSで「0」を返す特殊なファイルです。
このコマンドは「0が書き込まれただけの空ファイルを指定したサイズで作成」します。
「count」はifで指定されたファイルを繰り返しコピーする際に使われるものです。
また、「bs」は1度に書き込む大きさを指定するオプションです。
つまり「count=1024 bs=1」で「1バイトのサイズで1024回コピーする」という意味になり、この場合が「/path/to/fileに0を1KB書き込む」という意味になります。
「count=512 bs=2」も同様に1KBを指しますし、「count=256 bs=4」も同様の意味になります。
つまり、input fileに/dev/zeroを指定する場合はcountとbsの積が書き込まれるサイズになるということです。
また、countやbsは単位をつけることもできます。
dd if=/dev/zero of=/path/to/file bs=1024k count=1000
上のコマンドの場合は「1024KB(1MB)を1000回=1GB」のファイルを作成します。
1つ注意点として、Linuxの/dev/zeroは65535バイトまでしか返せないので、bsにそれ以上の値は指定できません。また、あまりに膨大なファイルを作成しようとするとメモリを使い果たしたり、ディスク使用率が100%になってしまったりするので注意が必要です。
dd of=/path/to/file
ddコマンドはofだけを指定すると、標準入力から値を読み取ろうとします。
なので、パイプの最後にddコマンドでofを指定してあげると、渡された内容をファイルに書き込みます。
まぁ大体の場合はシェルの機能であるリダイレクトを使えばいいので使い道はありませんが。
dd if=/path/to/file
ifのみを指定すると、ifで指定した内容を標準出力に渡すことができます。
まぁこれも、「だからなんだ」って内容なんですけどね。
dd if=/path/to/file of=/dev/stderr
/dev/stderrは標準エラーを表す特殊なファイルです。
このコマンドを実行するとifで指定したファイルの内容を標準エラーに返します。
下のようにシェルの機能で「標準エラーを破棄する」ようにすると、何も表示されなくなることがわかります。
dd if=/path/to/file conv=ucase
convはテキストを加工するオプションです。
conv=ucodeで大文字に変換し、conv=lcaseで小文字に変換できます。
(まぁこれtrコマンドで同じことできるんですけどね!!)
特殊なファイルパス
もうそろそろ色々列挙するのが面倒になってきたので、おまけの説明をします。
パス | 意味 |
/dev/stdout | 標準出力 |
/dev/stdin | 標準入力 |
/dev/stderr | 標準エラー |
/dev/null | ヌル |
/dev/zero | ゼロ(ヌル文字) |
ddコマンドに限らず、上のファイルパスを使うことで特殊な場所にアクセスできます。
「Everything is a file」の設計思想のおかげですね。
終わりに
ddコマンドの使い方といいつつブロックファイルをちょっと触っただけになってしまった…
USBにisoを書き込むこと以外にも用途があるんだよって伝われば、OKです。
コメント