ddコマンド

ブロックレベルの操作でファイルを変換・コピーします。

概要

ddコマンドは、指定されたブロックサイズを使用してファイル間でデータをコピーし、コピー中に変換を実行します。ディスクイメージの作成、パーティションのバックアップ、ディスクの消去、I/Oパフォーマンスのベンチマークなどのタスクによく使用されます。ほとんどのUnixコマンドとは異なり、ddは従来のフラグではなく、オプション=値のペアを使用する独自の構文を持っています。

オプション

if=FILE

読み込む入力ファイルを指定します。指定しない場合は標準入力が使用されます。

$ dd if=/dev/sda

of=FILE

書き込む出力ファイルを指定します。指定しない場合は標準出力が使用されます。

$ dd if=/dev/sda of=/dev/sdb

bs=BYTES

入力と出力の両方のブロックサイズをBYTESに設定します。これはパフォーマンスに大きく影響します。

$ dd if=/dev/zero of=testfile bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) transferred in 0.083 seconds, 1.3 GB/s

count=N

N個の入力ブロックのみをコピーします。コピーするデータ量を制限します。

$ dd if=/dev/urandom of=random.dat bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) transferred in 0.035 seconds, 299 MB/s

status=LEVEL

dd実行中に表示される情報を制御します:

$ dd if=/dev/zero of=testfile bs=1G count=1 status=progress
536870912 bytes (537 MB, 512 MiB) copied, 0.5 s, 1.1 GB/s
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) transferred in 0.969 seconds, 1.1 GB/s

conv=CONVS

データに変換を実行します。複数の変換をカンマで区切って指定できます:

$ dd if=/dev/sda of=disk.img conv=sync,noerror

使用例

ブート可能なUSBドライブの作成

$ sudo dd if=ubuntu.iso of=/dev/sdb bs=4M status=progress
1485881344 bytes (1.5 GB, 1.4 GiB) copied, 120 s, 12.4 MB/s
354+1 records in
354+1 records out
1485881344 bytes (1.5 GB, 1.4 GiB) transferred in 120.023 seconds, 12.4 MB/s

ディスクイメージの作成

$ sudo dd if=/dev/sda of=disk_backup.img bs=8M status=progress
20971520000 bytes (21 GB, 20 GiB) copied, 300 s, 70 MB/s
2500+0 records in
2500+0 records out
20971520000 bytes (21 GB, 20 GiB) transferred in 300.123 seconds, 69.9 MB/s

ディスクをゼロで消去

$ sudo dd if=/dev/zero of=/dev/sdb bs=8M status=progress
8589934592 bytes (8.6 GB, 8.0 GiB) copied, 120 s, 71.6 MB/s
1024+0 records in
1024+0 records out
8589934592 bytes (8.6 GB, 8.0 GiB) transferred in 120.001 seconds, 71.6 MB/s

ヒント

適切なブロックサイズを使用する

bsパラメータはパフォーマンスに大きく影響します。ほとんどの操作では、1Mから8Mの値が良いパフォーマンスを提供します。デフォルトの512バイトのように小さすぎると非常に遅くなり、大きすぎるとメモリを無駄に消費する可能性があります。

常にstatus=progressを使用する

status=progressを追加すると、長時間実行される操作のリアルタイムフィードバックが提供されます。これは大量のデータをコピーする際に不可欠です。

進捗状況の更新にSIGUSR1シグナルを送信する

status=progressを使用し忘れた場合、USR1シグナルを送信して進捗状況の更新を取得できます:

$ kill -USR1 $(pgrep dd)

デバイス名には細心の注意を払う

ddを実行する前にデバイス名(/dev/sdaなど)を二重確認してください。間違った出力デバイスを使用するとデータが破壊される可能性があります。lsblkコマンドは正しいデバイスを識別するのに役立ちます。

よくある質問

Q1. なぜddは「ディスクデストロイヤー」と呼ばれるのですか?

A. このニックネームは、確認なしにディスクを完全に上書きする能力に由来します。デバイス名の単純なタイプミスが壊滅的なデータ損失につながる可能性があります。

Q2. ddをより速く実行するにはどうすればよいですか?

A. より大きなブロックサイズ(bs=4Mまたはbs=8M)を使用し、I/Oのボトルネックに当たっていないことを確認し、特定の操作ではバッファキャッシュをバイパスするためにoflag=directの使用を検討してください。

Q3. ddの進捗状況を監視するにはどうすればよいですか?

A. status=progressオプションを使用するか、kill -USR1 $(pgrep dd)でddプロセスにUSR1シグナルを送信します。

Q4. なぜddは他のUnixコマンドとは異なる構文を使用するのですか?

A. ddの構文(オプション=値)はIBMのJCL(ジョブ制御言語)に由来し、Unixに実装された際に歴史的な理由で保存されました。

参考文献

https://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html

改訂履歴