「ddコマンドは危険と聞いたけど、具体的に何に気をつければいいのか分からない」
Linuxサーバーの運用では、ディスクのバックアップやブートメディアの作成など、ブロックデバイスを直接操作する場面が出てきます。
この記事では、Linuxの
dd コマンドの基本から実務で使う場面まで解説します。ISOイメージの作成、USBブートメディアの書き込み、ディスクの完全消去、MBR・GPTバックアップなど、現場で必要になる操作を網羅しました。
※
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 でデバイス名を必ず確認する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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バイトよりはるかに高速にコピーできます。リストア(復元)する場合は、
if と of を逆にします。# イメージファイルからパーティションを復元する 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
bs=2048 を指定するのが適切です。4. USBブートメディアを作成する
ダウンロードしたISOイメージをUSBメモリに書き込んで、ブートメディアを作成する手順です。これはdd の最も一般的な使い方の一つです。まず、USBメモリのデバイス名を確認します。
# USBメモリのデバイス名を確認する lsblk
/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パーティションテーブルをバックアップする(先頭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
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 を使ってください。スパースファイルの作成
スパースファイル(実際にはディスクを消費しない仮想的なサイズのファイル)は、dd の seek オプションで作成できます。# 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
書き込み先を間違えた場合の対処
dd で of= に間違ったデバイスを指定してしまった場合、上書きされたデータは基本的に復元できません。被害を最小限にするためにできることは以下の通りです。
・即座に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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:aliasコマンドでエイリアスを設定する方法|永続化や実務で使える設定例も
- この記事の属するカテゴリ:Linuxコマンド・LinuxコマンドA-E・ファイル・ディレクトリ管理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます