はじめに

こんにちは!今回はddコマンドについて解説します。

ddは、ファイルやディスク全体をブロック単位でコピー・変換するコマンドです。ディスクイメージのバックアップ、USB起動メディアの作成、ディスク丸ごとのクローンなど、低レベルのデータ操作をする時に使うんですね。

「火力の強い、融通が利くコピーツール」ってイメージです。パワフルですけど、使い方を間違えるとデータ破損のリスクがあるので注意が必要です。


ddコマンドとは

ddは、“convert and copy"の略で、ファイルやディスクのデータをブロック単位でコピー・変換する外部コマンドです。

通常のcpコマンドではファイルレベルでしか操作できませんが、ddは低レベルでのディスク操作ができます。ディスク全体のバックアップ、パーティション操作、USB起動メディア作成、ディスククローンなど、システム管理者がよく使う重要なコマンドなんです。

ddの特徴は、細かいオプションでデータ変換(大文字・小文字変換など)ができることと、ブロックサイズを指定してコピーできることです。ただし、パワフルだからこそ、誤った使い方はデータ破損につながるので、慎重に使う必要があります。


基本構文

1
dd [オプション]

ddのオプションは、if=(入力ファイル)とof=(出力ファイル)で指定します。

1
dd if=入力ファイル of=出力ファイル bs=ブロックサイズ count=コピーするブロック数

他のコマンドと違う独特の構文なので、最初は戸惑うかもしれませんね。


主なオプション

オプション 説明
if= 入力ファイル(input file)
of= 出力ファイル(output file)
bs= ブロックサイズ(block size)
count= コピーするブロック数
skip= 入力ファイルの最初からスキップするブロック数
seek= 出力ファイルの最初からシークするブロック数
conv= データ変換(notrunc, noerror など)
status= 進捗表示(progress, none など)
ibs= 入力ブロックサイズ
obs= 出力ブロックサイズ

使用例

例1: ファイルをコピー

1
dd if=source.img of=destination.img

実行結果:

1
2
3
1024+0 records in
1024+0 records out
524288 bytes (524 kB, 512 KiB) copied, 0.5 s, 1.0 MB/s

source.imgdestination.imgにコピー。出力にはコピーしたブロック数とデータ転送速度が表示されます。

例2: ブロックサイズを指定してコピー

1
dd if=source.img of=destination.img bs=4M

実行結果:

1
2
3
1+0 records in
1+0 records out
4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.08 s, 52 MB/s

bs=4Mで4MBずつブロックをコピー。ブロックサイズが大きいほど、転送速度が向上します。

例3: 最初の100ブロックだけコピー

1
dd if=/dev/sda of=backup.img bs=1M count=100

実行結果:

1
2
3
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 2.5 s, 42 MB/s

count=100で最初の100ブロック(100MB)だけコピー。大容量ディスクの一部だけバックアップしたい時に便利です。

例4: 入力ファイルの一部をスキップしてコピー

1
dd if=large.img of=partial.img bs=1M skip=500 count=100

実行結果:

1
2
3
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 2.3 s, 45 MB/s

skip=500で最初の500MBをスキップして、その後の100MBをコピー。特定の範囲だけ抽出したい時に使います。

例5: 進捗表示を有効にしてコピー

1
dd if=/dev/sda of=disk.img bs=4M status=progress

実行結果:

1
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 45 s, 47 MB/s

status=progressで転送中の進捗がリアルタイムで表示されます。大容量ファイルのコピーで便利。

例6: 標準入力から標準出力へパイプ

1
cat source.img | dd of=destination.img bs=4M

実行結果:

1
2
3
100+0 records in
100+0 records out
419430400 bytes (419 MB, 400 MiB) copied, 8.5 s, 49 MB/s

パイプでddに入力を渡すことができます。リモートのファイルをコピーする時に便利。

例7: USBドライブにディスクイメージを書き込み

1
sudo dd if=ubuntu.iso of=/dev/sdb bs=4M status=progress

実行結果:

1
2097152000 bytes (2.1 GB, 2.0 GiB) copied, 42 s, 50 MB/s

起動メディアのISOイメージをUSBドライブに書き込み。ここでデバイス名を間違えると大変なことに。注意が必要です。

例8: ディスク全体をイメージにバックアップ

1
sudo dd if=/dev/sda of=full_disk_backup.img bs=1M status=progress

実行結果:

1
1099511627776 bytes (1.1 TB, 1.0 TiB) copied, 3600 s, 305 MB/s

ディスク全体をイメージファイルにバックアップ。時間がかかりますが、完全なバックアップが作成されます。

例9: nullデバイスからランダムデータを生成

1
dd if=/dev/zero of=100mb.img bs=1M count=100

実行結果:

1
2
3
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.3 s, 349 MB/s

/dev/zero(ゼロデータを無限に供給)から100MBのファイルを生成。テスト用のダミーファイル作成に便利。

例10: エラーを無視してコピー

1
sudo dd if=/dev/sda of=recovery.img bs=4M conv=noerror status=progress

実行結果:

1
1099511627776 bytes (1.1 TB, 1.0 TiB) copied, 5400 s, 203 MB/s

conv=noerrorでエラーが発生しても処理を続けます。破損したディスクのリカバリーに使えます。


Tips・注意点

デバイス名を確認してから実行すること

1
2
3
4
5
6
7
# 必ずデバイス一覧を確認
lsblk
# または
fdisk -l

# 確認したデバイス名で実行
sudo dd if=ubuntu.iso of=/dev/sdb

/dev/sda/dev/sdbを間違えると、間違ったディスクにデータを上書きして、取り返しのつかないことになります。何度も確認しましょう。

bsの値が大きいほど高速(ただし上限あり)

1
2
3
4
# ブロックサイズを大きくすると高速
dd if=source.img of=dest.img bs=1M
dd if=source.img of=dest.img bs=4M
dd if=source.img of=dest.img bs=16M  # さらに高速

ただし、メモリが少ないシステムではメモリ不足になる可能性があります。通常は4M程度が目安です。

ディスク書き込み時はsyncを忘れずに

1
2
sudo dd if=ubuntu.iso of=/dev/sdb bs=4M
sync  # バッファをフラッシュ

dd完了後、すぐにUSBを取り外さず、syncでバッファをディスクに書き込んでから取り外します。

大容量ファイルコピーは進捗表示が必須

1
2
3
4
5
# 進捗が見えない(不安)
dd if=/dev/sda of=backup.img

# 進捗が見える(安心)
dd if=/dev/sda of=backup.img status=progress

status=progressで転送中の進捗が表示されます。特に時間がかかる操作では必須です。

rootになるかsudoが必須

1
2
# ディスクデバイスをコピーする場合、root権限が必要
sudo dd if=/dev/sdb of=backup.img

/dev/sd*デバイスへのアクセスはroot権限が必要です。


実践的な使い方

USB起動メディアの作成

1
2
3
# ISOイメージをUSBに書き込み
sudo dd if=ubuntu-22.04-desktop-amd64.iso of=/dev/sdb bs=4M status=progress
sync

インストールメディアの作成。ddが最も活躍する場面の一つです。

ディスク全体のバックアップ

1
2
# 定期的にディスク丸ごとバックアップ
sudo dd if=/dev/sda of=/backup/sda_backup_$(date +%Y%m%d).img bs=4M status=progress

日付付きでディスク全体をバックアップ。災害時の復旧に備えます。

破損したディスクのリカバリー

1
2
# 読み取りエラーを無視して可能な限りコピー
sudo dd if=/dev/sdb of=recovery.img bs=512 conv=noerror,sync status=progress

ディスク障害が発生した時に、読み取り可能なデータを可能な限り抽出します。

ディスク初期化

1
2
# ディスク全体をゼロで上書き
sudo dd if=/dev/zero of=/dev/sdb bs=1M status=progress

ディスク全体をクリア。売却前のデータ削除などに使えます。ただし、時間がかかります。


まとめ

ddコマンドのポイント:

  • ファイル・ディスクをブロック単位でコピー・変換する外部コマンド
  • if=: 入力ファイルを指定
  • of=: 出力ファイルを指定
  • bs=: ブロックサイズを指定(大きいほど高速)
  • count=: コピーするブロック数を指定
  • status=progress: 進捗表示を有効化
  • conv=noerror: エラー無視で継続
  • よく使う組み合わせ: sudo dd if=/dev/sda of=backup.img bs=4M status=progress

ddは超パワフルですが、デバイス名を間違えるとデータ消失につながります。必ずデバイス名をもう一度確認してから実行してくださいね。USB起動メディア作成、ディスクバックアップ、リカバリーなど、システム管理で頻繁に活躍するコマンドですよ!