本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、ブロック単位でファイルをコピー、変換する「dd」コマンドです。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。ブロック単位でファイルをコピー、変換する「dd」コマンドです。
「dd」コマンドはファイルをブロック単位で読み出し、指定通り変換して出力します ※1。入力と出力にデバイスを指定できるため、HDDのパーティションをコピーする、USBメモリやCD-ROMのバックアップを取る、といった使い方が可能です。
処理するブロック数を指定でき、任意のサイズのファイルを作成するといった用途にも役立ちます。
※1 ddコマンドでは一度に処理するデータの単位を「ブロック」と呼ぶ。HDDなどの記録単位であるセクタやブロックの長さと、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 | 処理バイト数や処理速度を表示しない |
オプション | 意味 |
---|---|
conv=変換方法 | 変換方法(表2参照)に従って変換する。変換方法の指定は「,」で区切り、複数指定可能 |
cbs=バイト数 | 「conv=」で変換方法としてblockまたはunblockを指定した際のブロックのサイズ ※2 |
※2 バイト数やブロックサイズには2種類の単位を使用可能。1024の累乗で指定する場合はK、M、G、T、P、E、Z、Y(キロ、メガ、ギガ、テラ、ペタ、エクサ、ゼタ、ヨタを意味する)、1000の累乗で指定するときはKB、MB……を使用。
フラグ名 | 意味 |
---|---|
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のみ) |
変換方法 | 意味 |
---|---|
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=ファイル」で、「バイト数×個数」分のサイズのファイルを作成できます(画面2)。
「/dev/zero」は常にNULL文字(0x00)を出力し続けるという特殊なデバイスです。例えば「dd bs=100 count=1 if=/dev/zero of=file1」なら「file1」という名前の、全てNULL文字で埋まった100バイトのファイルを作成します(内容をodコマンド(連載第93回)で確認可能)。
bsやcountにはKやMなどの単位が使用可能で、1000の累乗にしたい場合はK、M…、1024の累乗にしたい場合はKB、MB……を指定します。
dd bs=100 count=1 if=/dev/zero of=file1
(100バイトのファイルを生成する)(画面2)
dd bs=1K count=100 if=/dev/zero of=file2
(102400バイトのファイルを生成する)(画面2)
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=サイズ」を指定したときは、テキストを指定したサイズで分け、改行区切りのデータにします。各ブロック末尾の空白は削除されます。
画面3の最初の実行例では、seqコマンド(連載第110回)で1〜40までの数字を改行区切りで出力後、ddコマンドで変換しています。ブロックサイズとして10バイトを指定しました(実行画面の幅は80桁です)。
画面3の次の実行例では、最初の実行例で変換した内容を入力として、trコマンド(第52回)で空白をハイフンに置き換え、再度ddコマンドを使って50桁ごとに改行しています。
$ 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ラーニング指導を担当。
Copyright © ITmedia, Inc. All Rights Reserved.