宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「ISOイメージの作成やUSBメディアの書き込みで、どのコマンドを使えばいいのか分からない」
「ddコマンドは危険と聞いたけど、具体的に何に気をつければいいのか分からない」
Linuxサーバーの運用では、ディスクのバックアップやブートメディアの作成など、ブロックデバイスを直接操作する場面が出てきます。

この記事では、Linuxの dd コマンドの基本から実務で使う場面まで解説します。
ISOイメージの作成、USBブートメディアの書き込み、ディスクの完全消去、MBR・GPTバックアップなど、現場で必要になる操作を網羅しました。

dd は書き込み先を間違えるとデータを破壊します。実行前のデバイス確認を必ず行ってください。
【この記事でわかること】 ・dd はブロック単位でデータを読み書きするコマンドで、デバイスや生ディスクの操作に使う
・if=入力元 of=出力先 bs=ブロックサイズ が基本書式で、デバイスの丸ごとコピーやISOの書き込みに使える
・USBブートメディア作成は dd if=image.iso of=/dev/sdX bs=4M status=progress が定番
・ディスク全体の完全消去(ゼロ埋め)は dd if=/dev/zero of=/dev/sdX bs=1M
・ofを間違えるとデータが破壊される。実行前に lsblk / fdisk -l でデバイス名を必ず確認する

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

ddコマンドとは?cpとの違い

dd は、ブロック単位でデータを読み書きするコマンドです。ファイルのコピーだけでなく、デバイス(ディスクやパーティション)をそのままバイト列として読み書きできるのが特徴です。

通常のファイルコピーには cp コマンドを使いますが、dd は以下の点が異なります。

cp:ファイルシステム上のファイル単位でコピーする。パーミッションやタイムスタンプなどの属性もコピーできる
dd:デバイスやパーティションをブロック単位でそのままコピーする。ファイルシステムの種類に関係なく、ディスクの中身をバイト列として丸ごと複製できる

つまり、「ファイルをコピーしたい」なら cp、「ディスクやパーティションを丸ごとコピーしたい」「ISOイメージを書き込みたい」なら dd を使います。

ddコマンドの基本的な使い方

1. 基本の書式を理解する(if・of・bs・count)

dd の基本書式は以下の通りです。

# dd if=入力元 of=出力先 bs=ブロックサイズ count=ブロック数

各オプションの意味を押さえておきましょう。

if=(input file):読み込み元のファイルまたはデバイスを指定する。省略するとstdin(標準入力)から読み込む
of=(output file):書き込み先のファイルまたはデバイスを指定する。省略するとstdout(標準出力)に書き出す
bs=(block size):一度に読み書きするブロックサイズを指定する。指定しない場合は512バイト
count=:コピーするブロック数を指定する。省略すると入力元の末尾まで全て読み込む

例えば、1MBのテストファイルを作成するには以下のように実行します。

# /dev/zero から 1MB のファイルを作成する dd if=/dev/zero of=/tmp/testfile bs=1M count=1

/dev/zero はゼロ(0x00)を無限に出力する特殊デバイスです。bs=1M で1ブロック1MB、count=1 で1ブロック分を書き込むので、結果として1MBのファイルが作成されます。

2. パーティションをバックアップする

dd を使えば、パーティションの内容をイメージファイルとしてバックアップできます。

# /dev/sda1 パーティションをイメージファイルにバックアップする dd if=/dev/sda1 of=/backup/sda1.img bs=4M status=progress

bs=4M を指定すると、4MBずつ読み書きするため、デフォルトの512バイトよりはるかに高速にコピーできます。

リストア(復元)する場合は、ifof を逆にします。

# イメージファイルからパーティションを復元する dd if=/backup/sda1.img of=/dev/sda1 bs=4M status=progress

※ リストア先のパーティションはアンマウントした状態で実行してください。

3. ISOイメージを作成する

CDやDVDの内容をISOイメージファイルとして保存できます。

# CD/DVDドライブの内容をISOイメージとして保存する dd if=/dev/cdrom of=/tmp/disk.iso bs=2048 status=progress

CD/DVDのセクタサイズは2048バイトなので、bs=2048 を指定するのが適切です。

4. USBブートメディアを作成する

ダウンロードしたISOイメージをUSBメモリに書き込んで、ブートメディアを作成する手順です。これは dd の最も一般的な使い方の一つです。

まず、USBメモリのデバイス名を確認します。

# USBメモリのデバイス名を確認する lsblk

出力例を見て、USBメモリが /dev/sdb であることを確認したら、以下のように書き込みます。

# ISOイメージをUSBメモリに書き込む # ※ of= のデバイス名を間違えると、データが消えます。必ず lsblk で確認すること dd if=AlmaLinux-9-latest-x86_64-dvd.iso of=/dev/sdb bs=4M status=progress conv=fsync

conv=fsync を付けると、書き込み完了前にディスクキャッシュをフラッシュ(物理的に書き込み)します。USBメモリを安全に取り外すために必ず付けてください。

of=/dev/sdb のようにデバイス全体を指定します。/dev/sdb1(パーティション)ではありません。

5. 進捗状況を確認する(status=progress)

dd はデフォルトでは処理中に何も表示しません。大きなディスクのコピーでは、完了までどれくらいかかるか分からず不安になります。

status=progress を付けると、転送量と転送速度がリアルタイムで表示されます。

# 進捗状況を表示しながらコピーする dd if=/dev/sda of=/backup/sda.img bs=4M status=progress

出力例:

4294967296 bytes (4.3 GB, 4.0 GiB) copied, 12.5 s, 344 MB/s

status=progress はGNU coreutilsの dd 8.24以降で使えます。RHEL 7/CentOS 7以降であれば問題なく使えます。

もし古い環境で進捗を確認したい場合は、別のターミナルから kill コマンドでUSR1シグナルを送ると、その時点の転送状況が表示されます。

# 別のターミナルから dd の進捗を確認する # まず dd のプロセスIDを調べる pgrep -x dd # USR1シグナルを送って進捗を表示させる kill -USR1 プロセスID

応用・実務Tips

MBR・GPTのバックアップとリストア

MBR(Master Boot Record)はディスクの先頭512バイトに格納されています。ブートローダやパーティションテーブルが含まれる重要な領域です。

# MBRをバックアップする(先頭512バイト) dd if=/dev/sda of=/backup/sda_mbr.img bs=512 count=1 # MBRを復元する dd if=/backup/sda_mbr.img of=/dev/sda bs=512 count=1

GPT(GUID Partition Table)の場合は、先頭512バイトだけではパーティション情報が含まれません。GPTヘッダとパーティションエントリを含めてバックアップするには、先頭34セクタ(17,408バイト)をコピーします。

# GPTパーティションテーブルをバックアップする(先頭34セクタ) dd if=/dev/sda of=/backup/sda_gpt.img bs=512 count=34 # GPTパーティションテーブルを復元する dd if=/backup/sda_gpt.img of=/dev/sda bs=512 count=34

※ GPTのバックアップ・復元には sgdisk コマンドを使う方法もあります。sgdisk --backup の方がGPTのセカンダリヘッダも含めて管理できるため、本番環境では sgdisk の利用も検討してください。

ディスクの完全消去(/dev/zero・/dev/urandom)

サーバーの廃棄やディスクの再利用時に、データを完全に消去する必要がある場合は dd で上書きします。

/dev/zero で上書きすると、ディスク全体がゼロで埋まります。

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

より安全に消去したい場合は、/dev/urandom(ランダムデータ)で上書きします。

# ディスク全体をランダムデータで上書きする dd if=/dev/urandom of=/dev/sdb bs=4M status=progress

/dev/zero/dev/urandom の違いは以下の通りです。

/dev/zero:高速だが、全てゼロなので上書き済みであることが推測される可能性がある
/dev/urandom:低速だが、ランダムなデータで上書きするため復元がより困難になる

一般的なサーバー廃棄であれば /dev/zero で十分です。機密性の高いデータを扱っていた場合は /dev/urandom を使ってください。

スパースファイルの作成

スパースファイル(実際にはディスクを消費しない仮想的なサイズのファイル)は、ddseek オプションで作成できます。

# 10GBのスパースファイルを作成する(実際のディスク使用量はほぼゼロ) dd if=/dev/zero of=/tmp/sparse.img bs=1 count=0 seek=10G

seek=10G で出力先を10GBの位置まで移動し、count=0 で実際には何も書き込みません。結果として、見かけ上10GBだがディスクを消費しないファイルが作成されます。

仮想マシンのディスクイメージ作成や、アプリケーションのテストでよく使う手法です。

トラブルシュート・エラー対処

「Permission denied」が出た時の対処法

dd でデバイスに書き込もうとして以下のエラーが出た場合は、権限が不足しています。

dd: failed to open '/dev/sdb': Permission denied

デバイスファイル(/dev/sda/dev/sdb など)への読み書きにはroot権限が必要です。sudo を付けて実行してください。

# sudo を付けて実行する sudo dd if=AlmaLinux-9-latest-x86_64-dvd.iso of=/dev/sdb bs=4M status=progress conv=fsync

書き込み先を間違えた場合の対処

ddof= に間違ったデバイスを指定してしまった場合、上書きされたデータは基本的に復元できません。

被害を最小限にするためにできることは以下の通りです。

即座にCtrl+Cで中断する:書き込みが進行中であれば、すぐに中断することで被害範囲を小さくできる
MBRだけの上書きなら:事前にMBRバックアップがあれば復元できる可能性がある
パーティションテーブルの破壊なら:testdisk コマンドでパーティションテーブルの復旧を試みることができる

ただし、これらは応急処置です。重要なデータがあるディスクに対して dd を実行する前には、必ずバックアップを取ってください。

【重要】ddコマンドの危険性

dd は確認プロンプトなしでデバイスに直接書き込むコマンドです。rm -rf と並んで、Linuxで最も危険なコマンドの一つです。

以下の3点を実行前に必ず確認してください。

of= のデバイス名を2回確認する:lsblk でデバイス名を確認し、コマンドに入力した後にもう一度見直す
マウント状態を確認する:書き込み先がマウントされたまま dd を実行すると、ファイルシステムが破損する。umount してから実行する
本番環境ではスクリプト化する:手打ちのタイプミスを防ぐため、デバイス名を変数に入れたスクリプトで実行する

# 実行前にデバイス名を確認する手順の例 lsblk # 出力を見て、書き込み先が正しいことを確認してから実行する # TARGET=/dev/sdb # dd if=image.iso of=$TARGET bs=4M status=progress conv=fsync

本記事のまとめ

dd コマンドの使い方を一覧でまとめます。
やりたいこと コマンド
テストファイルを作成する dd if=/dev/zero of=/tmp/testfile bs=1M count=1
パーティションをバックアップする dd if=/dev/sda1 of=/backup/sda1.img bs=4M status=progress
ISOイメージを作成する dd if=/dev/cdrom of=/tmp/disk.iso bs=2048 status=progress
USBブートメディアを作成する dd if=image.iso of=/dev/sdb bs=4M status=progress conv=fsync
MBRをバックアップする dd if=/dev/sda of=/backup/sda_mbr.img bs=512 count=1
GPTをバックアップする dd if=/dev/sda of=/backup/sda_gpt.img bs=512 count=34
ディスクをゼロで消去する dd if=/dev/zero of=/dev/sdb bs=4M status=progress
ディスクをランダムデータで消去する dd if=/dev/urandom of=/dev/sdb bs=4M status=progress
スパースファイルを作成する dd if=/dev/zero of=/tmp/sparse.img bs=1 count=0 seek=10G
進捗を表示する dd if=/dev/sda of=/backup/sda.img bs=4M status=progress

ddコマンドでディスクコピーをミスなく実行できていますか?

コマンドの使い方を一つひとつ覚えていくのは時間がかかります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。