dd コマンド入門 - ディスク複製・ISO 書き込みと安全な使い方

dd コマンド入門 - ディスク複製・ISO 書き込みと安全な使い方

この記事で解決できること

  • dd でディスクやパーティションを イメージファイルに複製 できる
  • ダウンロードした ISO を USB メモリに書き込んで 起動メディアを作れる
  • of= の指定ミスで データを全消失させない安全手順 が身につく

結論(実務の型)

  1. lsblk対象デバイスを特定(容量・マウント状況で照合)
  2. sudo dd if=<入力> of=<出力> bs=4M status=progress conv=fsync
  3. 完了後 sync書き込みバッファを確実に flush

前提(対象環境)

  • OS:Ubuntu / 一般的な Linux ディストリビューション
  • dd は GNU coreutils 同梱。追加インストール不要
  • デバイス操作には sudo(root 権限)が必要

dd コマンドの基本構文は?

結論: dd if=入力 of=出力 bs=ブロックサイズ が基本形。引数は key=value 形式で、ハイフン付きオプションではない点が他コマンドと異なる。

dd は入力(if)から読み、出力(of)へ書き込むだけのシンプルなツール。引数はすべて key=value 形式で記述する。

$ dd if=input.img of=/dev/sdb bs=4M status=progress

主要オペランドの意味:

  • if=(input file):入力元。省略時は標準入力
  • of=(output file):出力先。省略時は標準出力
  • bs=(block size):一度に読み書きするバイト数(例 4M = 4 MiB)
  • count=:コピーするブロック数(先頭だけ複製したいとき)
  • status=progress:転送量・速度をリアルタイム表示
  • conv=fsync:完了時に物理メディアへの書き込みを保証

bs は性能に直結する。デフォルトの 512 バイトは遅い。USB やディスク相手なら bs=4M 程度が無難。

ディスクやドライブをどう確認するのか?(最重要)

結論: lsblk で容量とマウントポイントを照合し、書き込み先デバイス名を確定する。/dev/sda(ディスク全体)と /dev/sda1(パーティション)の違いを必ず意識する。

dd 事故の大半は デバイス名の取り違え。書き込み前に必ず確認する。

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0 238.5G  0 disk
├─sda1   8:1    0   512M  0 part /boot/efi
└─sda2   8:2    0   238G  0 part /
sdb      8:16   1  28.7G  0 disk
└─sdb1   8:17   1  28.7G  0 part /media/user/USB

読み取り方:

  • sda:238.5G で / にマウント → システムディスク。絶対に書き込まない
  • sdb:28.7G・RM(リムーバブル)が 1 → 差し込んだ USB メモリ
  • 末尾に数字が無い sdbディスク全体sdb1その中のパーティション

USB を挿す前後で lsblk を 2 回実行し、新しく増えたデバイスを対象にすると取り違えにくい。SIZE 列の容量照合も併用する。

ISO イメージを USB に書き込むには?

結論: 書き込み先 USB を umount してから sudo dd if=xxx.iso of=/dev/sdX bs=4M status=progress を実行する。of= はパーティション番号を付けないディスク全体を指定する。

Ubuntu などの起動 USB を作る定番手順。

1. マウントを解除する

書き込み中にマウントされていると失敗・破損の原因になる。

$ sudo umount /dev/sdb1

2. dd で書き込む

$ sudo dd if=ubuntu-24.04.iso of=/dev/sdb bs=4M status=progress conv=fsync
1466 MiB / 1466 MiB の転送が完了
1538000000 bytes (1.5 GB, 1.4 GiB) copied, 142 s, 10.8 MB/s

3. 同期して安全に抜く

dd 完了後もカーネルのバッファに残りがある場合がある。sync で確実に flush する。

$ sync

conv=fsync と末尾の sync は役割が近いが、両方付けておくと「コマンドは終わったのに実際は書き込み途中」という事故を防げる。

ディスク全体をイメージファイルに複製するには?

結論: if= にデバイス、of= にイメージファイルを指定すると丸ごとバックアップできる。空き領域も含むため、未使用領域は gzip で圧縮すると小さくなる。

ディスクやパーティションを 1 ファイルにバックアップする。

$ sudo dd if=/dev/sdb of=usb-backup.img bs=4M status=progress

圧縮しながら保存(空き領域が多いとき有効):

$ sudo dd if=/dev/sdb bs=4M status=progress | gzip > usb-backup.img.gz

イメージファイルは 元デバイスと同じ容量 を消費する(28 GB の USB → 28 GB のファイル)。保存先の空き容量を df -h で先に確認すること。

イメージからディスクへ書き戻すには?

結論: if=of= を入れ替えるだけ。圧縮イメージは gunzip でパイプ展開しながら書き戻す。書き戻し先の取り違えに改めて注意する。

# 非圧縮イメージ
$ sudo dd if=usb-backup.img of=/dev/sdb bs=4M status=progress conv=fsync

# 圧縮イメージ
$ gunzip -c usb-backup.img.gz | sudo dd of=/dev/sdb bs=4M status=progress conv=fsync

転送速度を上げる・進捗を見るには?

結論: bs を大きく(4M64M)すると速くなる。進捗は status=progress、コマンドが対応しない古い環境では別端末から kill -USR1 でも確認できる。

ブロックサイズの調整

$ sudo dd if=/dev/sdb of=backup.img bs=64M status=progress

bs が小さいとシステムコール回数が増えて遅くなる。大きすぎてもメモリを無駄に使うため、4M64M が実用域。

進捗を後から確認する(status=progress が無い場合)

別のターミナルから実行中の dd にシグナルを送ると、現在の転送量を表示する。

$ sudo kill -USR1 $(pgrep -x dd)

GNU coreutils 8.24 以降は status=progress が使える。まずこちらを使い、kill -USR1 は古い環境向けの代替手段と覚えておく。

dd の事故パターンと対策は?

結論: 事故の原因は「of= の取り違え」「if/of の逆指定」「マウント中の書き込み」の 3 つにほぼ集約される。実行前チェックで防げる。

事故 原因 対策
システムディスクを破壊 of= のデバイス名取り違え 実行前に lsblk で容量・マウント照合
バックアップが空になる if=of= を逆指定 「読む側 = if、書く側 = of」を声に出す
書き込んだのに起動しない パーティション(sdb1)に書いた ISO はディスク全体(sdb)へ
完了後に内容が壊れている バッファ未 flush で USB を抜いた conv=fsync + sync を徹底

コピペ用:安全テンプレ

# 1. デバイス確認(必ず最初に)
lsblk

# 2. ISO を USB へ書き込む(umount 済み前提)
sudo dd if=image.iso of=/dev/sdX bs=4M status=progress conv=fsync

# 3. 完了後に同期
sync

/dev/sdXlsblk で確認した実際のデバイス名に置き換える。

次に読む