dd コマンド入門 - ディスク複製・ISO 書き込みと安全な使い方
この記事で解決できること
ddでディスクやパーティションを イメージファイルに複製 できる- ダウンロードした ISO を USB メモリに書き込んで 起動メディアを作れる
of=の指定ミスで データを全消失させない安全手順 が身につく
最重要の注意
dd は of=(出力先)に書き込むとき 確認なしで上書き する。Undo も「ゴミ箱」も無い。デバイス名(/dev/sda 等)を 1 文字間違えると、稼働中のシステムディスクを破壊しうる。実行前に必ず lsblk で対象を確認すること。
結論(実務の型)
lsblkで 対象デバイスを特定(容量・マウント状況で照合)sudo dd if=<入力> of=<出力> bs=4M status=progress conv=fsync- 完了後
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 書き込みでは パーティション(sdb1)ではなくディスク全体(sdb) を of= に指定する。パーティションに書くと起動メディアにならない。
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
書き戻しは 複製と逆方向。of= がバックアップ取得時の if= と同じデバイスか、lsblk で再確認してから実行する。
転送速度を上げる・進捗を見るには?
結論:
bsを大きく(4M〜64M)すると速くなる。進捗はstatus=progress、コマンドが対応しない古い環境では別端末からkill -USR1でも確認できる。
ブロックサイズの調整
$ sudo dd if=/dev/sdb of=backup.img bs=64M status=progress
bs が小さいとシステムコール回数が増えて遅くなる。大きすぎてもメモリを無駄に使うため、4M〜64M が実用域。
進捗を後から確認する(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 を徹底 |
やってはいけないこと
lsblkで確認せずにof=/dev/sdXを実行する- マウントしたまま
ddで書き込む dd完了直後にsync無しで USB を引き抜く
コピペ用:安全テンプレ
# 1. デバイス確認(必ず最初に) lsblk # 2. ISO を USB へ書き込む(umount 済み前提) sudo dd if=image.iso of=/dev/sdX bs=4M status=progress conv=fsync # 3. 完了後に同期 sync
/dev/sdX は lsblk で確認した実際のデバイス名に置き換える。