ddコマンドは、ファイルのコピーを行うコマンドです。
単純なファイルのコピーのほかに、SDカード等のデバイスにイメージファイルをコピーすることにも利用することができます。
目次
ddコマンドとは
ddコマンドは、ファイルをコピーします。
デフォルトでは標準入力を標準出力にコピーします。
その際、入力と出力のブロックサイズを変更することができます。
ブロックサイズは、ファイルシステムによって最適化すると、処理時間を高速化できます。
また、ファイルをコピーする際に、テキストファイルの内容をすべて大文字にする等の変換もできます。
ddコマンドは、ファイルのコピーやデバイスのコピー、バックアップなどに利用できます。
しかし、ほとんどのオペレーティングシステムによって、ディレクトリへのI/O操作は許されていないため、ディレクトリのコピーは行うことができません。
通常、ファイルのコピーやディレクトリのコピーなどにcpコマンドを用いて、デバイスのイメージファイルの作成やディスクのバックアップなどにddコマンドを用います。
ddコマンドの構文
ddコマンドの構文
1 |
dd [operand]... |
operandについて
オペランド | 意味 |
if= | 入力ファイル |
of= | 出力ファイル |
ibs= | 入力のブロックサイズ(デフォルト:512bytes) |
obs= | 出力のブロックサイズ(デフォルト:512bytes) |
bs= | 入出力のブロックサイズ(ibsやobsより優先) |
cbs= | 変換のブロックサイズ |
skip= | ibsのブロックの個数をスキップ |
seek= | obsのブロックの個数をスキップ |
count= | ibsのブロックの個数をコピー |
status= | メッセージの表示について(下の別表を参考) |
conv= | 変換処理について(下の別表を参考) |
iflag= | 入力ファイルのアクセスについて(下の別表を参考) |
oflag= | 出力ファイルのアクセスについて |
statusについて
status | 意味 |
none | stderrに情報を表示しない |
noxfer | 最終行に転送レートを表示しない |
progress | 進捗を表示 |
convについて
conv | 意味 |
ascii | EBCDICをASCIIに変換 |
ebcdic | ASCIIをEBCDICに変換 |
ibm | ASCIIをEBCDICのIBMバージョンに変換 |
block | 入力の各行をcbsだけ出力 改行はスペースになり、必要ならばcbsになるようにスペースで埋める |
unblock | cbsごとに出力。末尾スペースは削除 |
lcase | 大文字を小文字に変換 |
ucase | 小文字を大文字に変換 |
sync | ibsごとに出力。必要ならば、末尾はゼロバイトで埋める |
excl | 出力ファイルが既に存在するならば、失敗 |
nocreat | 出力ファイルを作成しない |
notrunc | 出力ファイルを切り捨てない |
noerror | エラーが出ても処理を続ける |
fdatasync | ファイルのデータ部分に対してディスクへの書き出しを保証 |
fsync | ファイルに対してディスクへの書き出しを保証 |
flagについて
flag | 意味 |
count_bytes | iflagで使用可能。countをバイトカウントにする。 |
skip_bytes | iflagで使用可能。skipをバイトカウントにする |
seek_bytes | iflagで使用可能。seekをバイトカウントにする。 |
また、他のflagについてはmanのほかにopen関数も参考になります。
fsyncやfdatasyncについてはfsync関数が参考になります。
ddコマンドの利用例
ファイルをコピー
(オペランドなし)
ddコマンドは、デフォルトでは標準入力を標準出力にコピーします。
最後に標準エラー出力に転送情報を出力します。
コマンド例
1 |
dd < file.txt |
file.txt
1 |
This is file.txt |
実行結果
1 2 3 4 |
This is file.txt 0+1 レコード入力 0+1 レコード出力 17 bytes copied, 2.7197e-05 s, 625 kB/s |
実行結果(標準出力部分)
1 |
This is file.txt |
実行結果(標準エラー出力部分)
1 2 3 |
0+1 レコード入力 0+1 レコード出力 17 bytes copied, 2.5058e-05 s, 678 kB/s |
ファイルの入力
(if=file)
if=のオペランドは、標準入力の代わりにif=で指定したファイルをddコマンドの入力とすることができます。
コマンド例
1 |
dd if=file.txt |
file.txt
1 |
This is file.txt |
実行結果(標準出力)
1 |
This is file.txt |
実行結果(標準エラー出力)
1 2 3 |
0+1 レコード入力 0+1 レコード出力 17 bytes copied, 0.000858077 s, 19.8 kB/s |
ファイルの出力
(of=file)
of=のオペランドは、標準出力の代わりにof=で指定したファイルをddコマンドの出力とすることができます。
コマンド例
1 |
dd of=output.txt < file.txt |
file.txt
1 |
This is file.txt |
実行結果(output.txt)
1 |
This is file.txt |
実行結果(標準エラー出力)
1 2 3 |
0+1 レコード入力 0+1 レコード出力 17 bytes copied, 3.2012e-05 s, 531 kB/s |
ブロックサイズについて
(bs=num)
bs=のオペランドは、入力と出力のブロックサイズを指定できます。
デフォルトは512bytesになります。このブロックサイズはddコマンドのバッファになります。
ブロックサイズを変更することでddコマンドの処理時間を高速化することができるかもしれません。
ファイルシステムのブロックサイズと同じブロックサイズを指定すると処理時間は最適になります。また、ブロックサイズをそれ以上大きくしても処理時間がほとんど変わらなくなります。
ほとんどのファイルシステムのブロックサイズには、4096bytesが利用されています。
コマンド例 (root権限が必要)
1 |
# tune2fs -l /dev/sda1 | grep -i 'block size' |
また、root権限がない場合は以下のコマンドが利用できます。
コマンド例
1 |
stat -f . |
大きいサイズの空ファイルの作成
ddコマンドは大きいサイズの空ファイルの作成を行うことができます。
空ファイルを作る際、どのくらいのサイズを作成するかどうかを決める必要があります。
そのサイズは、count=のオペランドを使用します。
その際、iflag=count_bytesを用いるとより都合がいいです。
なぜなら、単純にcount=のオペランドを使う場合、bs × countでサイズを計算しなければなりません。
しかし、count_bytesを用いるとcount=のオペランドで指定した数値をバイト数として使用することができます。
コマンド例では、1G(2^30)バイトの空ファイルを作成します。
コマンド例
1 |
dd if=/dev/zero of=data.dat bs=4096 count=1G iflag=count_bytes |
実行結果(標準エラー出力)
1 2 3 |
262144+0 レコード入力 262144+0 レコード出力 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4.16768 s, 258 MB/s |
進捗の表示
(status=progress)
status=progressをオペランドとして利用すると、1秒毎に転送レートを更新します。
コマンド例では、1G(2^30)バイトの空ファイルを作成します。ただし、進捗を確認するため、処理時間を長くするようにブロックサイズを小さくしてます。
コマンド例
1 |
dd if=/dev/zero of=data.dat bs=32 count=1G iflag=count_bytes status=progress |
実行結果(実行中の表示例)
1 |
23439840 bytes (23 MB, 22 MiB) copied, 3.00561 s, 7.8 MB/s |
参考
外部リンクGnu Coreutils
外部リンクGnu Coreutils日本語版