ここから本文です

Linux基本コマンドTips:【 dd 】コマンド――ブロック単位でファイルをコピー、変換する

12/1(金) 8:15配信

@IT

●ddコマンドとは?

 「dd」コマンドはファイルをブロック単位で読み出し、指定通り変換して出力します ※1。入力と出力にデバイスを指定できるため、HDDのパーティションをコピーする、USBメモリやCD-ROMのバックアップを取る、といった使い方が可能です。

指定したサイズのファイルを作成したところ

 処理するブロック数を指定でき、任意のサイズのファイルを作成するといった用途にも役立ちます。

※1 ddコマンドでは一度に処理するデータの単位を「ブロック」と呼ぶ。HDDなどの記録単位であるセクタやブロックの長さと、ddコマンドで指定するブロックの長さが異なっていても処理できる。

●ddコマンドの書式
――――――――――――――――
dd [オプション]
――――――――――――――――
※[ ]は省略可能な引数を示しています。


●ddの主なオプション(入出力)
――――――――――――――――――――――――――――
オプション|意味
if=ファイル|標準入力の代わりにファイルから読み出す。デバイスファイルも指定可能
of=ファイル|標準出力の代わりにファイルへ書き込む。デバイスファイルも指定可能
bs=バイト数|1回に読み書きするブロックサイズ(バイト数) ※2
ibs=バイト数|1回に読み出すブロックサイズ(デフォルトは512バイト) ※2
obs=バイト数|1回に書き込むブロックサイズ(デフォルトは512バイト) ※2
count=個数|ibsで指定したサイズのブロックを入力から個数分だけコピーする
iflag=フラグ|フラグ(表1参照)に従って読み出す。フラグは「,」で区切り、複数指定可能
oflag=フラグ|フラグ(表1参照)に従って書き込む。フラグは「,」で区切り、複数指定可能
skip=ブロック数|入力時にibsで指定したサイズのブロックをブロック数分、先頭からスキップする
seek=ブロック数|出力時にobsで指定したサイズのブロックをブロック数分、先頭からスキップする
status=noxfer|処理バイト数や処理速度を表示しない
―――――――――――――――――――――――――――――

●ddの主なオプション(変換)
―――――――――――――――――――――――――――――
オプション|意味
conv=変換方法|変換方法(表2参照)に従って変換する。変換方法の指定は「,」で区切り、複数指定可能
cbs=バイト数|「conv=」で変換方法としてblockまたはunblockを指定した際のブロックのサイズ ※2
―――――――――――――――――――――――――――――

※2 バイト数やブロックサイズには2種類の単位を使用可能。1024の累乗で指定する場合はK、M、G、T、P、E、Z、Y(キロ、メガ、ギガ、テラ、ペタ、エクサ、ゼタ、ヨタを意味する)、1000の累乗で指定するときはKB、MB……を使用。

●表1 iflag、oflagで使用できるフラグ
―――――――――――――――――――――――――――――
フラグ名|意味
directory|ディレクトリ以外を指定した場合に失敗させる
nofollow|シンボリックリンクをたどらない
noatime|アクセス時間を更新しない
nocache|キャッシュデータを破棄する
append|追加モードで出力する(oflag=で指定)
direct|データに対して直接I/Oを使用する
dsync|データに対して同期I/Oを使用する
sync|dsyncと同様だがメタデータに対しても使用する
nonblock|非ブロックI/Oを使用する
fullblock|入力のブロックがいっぱいになるまで蓄積してから処理する(iflagのみ)
count_bytes|「count=」をブロック数ではなくバイト数として扱う(iflagのみ)
skip_bytes|「skip=」をブロック数ではなくバイト数として扱う(iflagのみ)
seek_bytes|「seek=」をブロック数ではなくバイト数として扱う(oflagのみ)
―――――――――――――――――――――――――――――

●表2 convで指定できる主な変換方法 ※3
―――――――――――――――――――――――――――――
変換方法|意味
block|改行区切りの入力データを「cbs=」で指定したサイズの固定長データに変換する。指定したサイズより入力データが長い場合は末尾をカットする。短い場合は改行コードを取り除き、「cbs=」で指定したサイズになるまでスペースで埋める
unblock|入力データを「cbs=」で指定した長さ固定長のものと見なし、末尾の空白を削除する
lcase|大文字を小文字に変換する
ucase|小文字を大文字に変換する
sync|各入力ブロックを「ibs=」で指定したサイズになるまでNULL文字で埋める(blockまたはunblockと一緒に指定した場合、NULL文字ではなくスペースで埋める)
sparse|NULL文字で埋まった入力ブロックを出力先に書き込まずにスキップする
nocreat|出力ファイルを作成しない
notrunc|出力ファイルを切り詰めない
excl|出力ファイルが既に存在する場合はエラーとする
noerror|読み出しエラー後も処理を続ける
fdatasync|終了前に出力ファイルデータを物理的に書き込む
―――――――――――――――――――――――――――――

※3 この他、ASCIIコード以前に作られた文字コードの1つであるEBCDIC(Extended Binary Coded Decimal Interchange Code)とASCIIの変換などが可能


●ファイルをコピーする

 「dd if=ファイル1 of=ファイル2」でファイル1をファイル2にコピーできます。この場合、ddコマンドの動作は「ファイル1を読み込んで、そのままファイル2に出力する」となります。なお、if=を指定しなかった場合は標準入力、of=を指定しなかった場合は標準出力を使用します。

 「dd if=/dev/sdb1 of=/dev/sdb2」のようにデバイスを指定することで、デバイスの内容をそのままコピーできます。ただし、このような使い方をする場合、入力元として指定した「/dev/sdb1」と出力先として指定した「/dev/sdb2」のメディアのサイズが同じでなければなりません。

 ddコマンドの定番は、インストールメディアなどをISOイメージとして保存する、という使い方です。画面1では、「/dev/cdrom」にマウントしたメディアの内容を、そのままinstall.isoに保存しています。

●コマンド実行例
――――――――――――――――――――――
dd if=/dev/cdrom of=install.iso
――――――――――――――――――――――
(「/dev/cdrom」をそのままinstall.isoに保存する)

●指定したサイズのファイルを作成する(1)

 「dd bs=バイト数 count=個数 if=/dev/zero of=ファイル」で、「バイト数×個数」分のサイズのファイルを作成できます。

 「/dev/zero」は常にNULL文字(0x00)を出力し続けるという特殊なデバイスです。例えば「dd bs=100 count=1 if=/dev/zero of=file1」なら「file1」という名前の、全てNULL文字で埋まった100バイトのファイルを作成します(内容をodコマンドで確認可能)。

 bsやcountにはKやMなどの単位が使用可能で、1000の累乗にしたい場合はK、M…、1024の累乗にしたい場合はKB、MB……を指定します。


●コマンド実行例
――――――――――――――――――――――
dd bs=100 count=1 if=/dev/zero of=file1
――――――――――――――――――――――
(100バイトのファイルを生成する)

――――――――――――――――――――――
dd bs=1K count=100 if=/dev/zero of=file2
――――――――――――――――――――――
(102400バイトのファイルを生成する)

――――――――――――――――――――――
dd bs=1KB count=100 if=/dev/zero of=file3
――――――――――――――――――――――
(100000バイトのファイルを生成する)


●指定したサイズのファイルを作成する(2)

 ddコマンドのオプションとして「conv=block cbs=サイズ」を指定すると、改行区切りのテキストデータを「cbs=」で指定したサイズの固定長データに変換できます。

 各行の長さが指定したサイズに満たない場合はスペースで埋めます。逆に指定したサイズより長かった場合は切り捨てます。例えば「a、改行、abc、改行」というデータをサイズ2の固定長に変換した場合は「a ab」という2バイト×2ブロックのデータに変わります。

 逆に、オプションとして「conv=unblock cbs=サイズ」を指定したときは、テキストを指定したサイズで分け、改行区切りのデータにします。各ブロック末尾の空白は削除されます。


●コマンド実行例
――――――――――――――――――――――
$ seq 40 | dd cbs=10 conv=block
――――――――――――――――――――――
(10バイトの固定長ブロックに1~40の数字を埋め込み、数字がない部分には空白を出力する)

――――――――――――――――――――――
$ seq 40 | dd cbs=10 conv=block | tr " " "-" | dd cbs=50 conv=unblock
――――――――――――――――――――――
(1つ前の実行例を読み込み、空白をハイフンに置換し、50バイトの固定長ブロックに変換する)


●筆者紹介
○西村 めぐみ(にしむら めぐみ)
 PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。

最終更新:12/1(金) 8:15
@IT