【Linux】ddコマンドでディスクの複製・イメージ作成・データ変換を行う

目次

概要

ddコマンドは、ファイルやデバイスに対して、指定されたブロック単位での低レベルコピーと変換を行うツールです。

通常のcpコマンドとは異なり、ハードディスクやUSBメモリなどのデバイスファイル(/dev/sdaなど)を直接読み書きできるため、ディスク全体の完全バックアップ、OSインストール用USBの作成、ダミーデータの生成など、システム管理の深い部分で利用されます。

その強力さゆえに、書き込み先を間違えると一瞬でシステムを破壊してしまうリスクがあり、「Disk Destroyer(ディスク破壊屋)」という不名誉な別名でも知られています。慎重な操作が求められるコマンドです。

仕様(引数・オプション)

構文

dd [オペランド=値] ...

一般的なUnixコマンドと異なり、オプション=値 の形式で指定します。

主なオペランド

オペランド説明
if=ファイル入力元(Input File)を指定します。ファイルまたはデバイス(例: /dev/zero, /dev/sda)を指定します。
of=ファイル出力先(Output File)を指定します。ファイルまたはデバイスを指定します。
bs=バイト数一度に読み書きするブロックサイズを指定します(Block Size)。例: 1M, 4Mibsobsを一括指定します。
ibs=バイト数入力時のブロックサイズを指定します。
obs=バイト数出力時のブロックサイズを指定します。
count=回数コピーするブロック数(bs × count = 総容量)を指定します。指定しない場合はファイルの最後までコピーします。
conv=変換データの変換オプションを指定します(カンマ区切りで複数指定可)。
status=level実行中のステータス表示レベルを指定します(例: progress で進捗表示)。

convオプションの主な値

説明
noerror読み取りエラーが発生しても停止せず、処理を継続します(データ救出時に必須)。
sync入力ブロックがibsより小さい場合、不足分をゼロ(NUL)で埋めてサイズを合わせます。
notrunc出力ファイルを切り詰めず、データが存在する部分だけを上書きします。
ucase英小文字を大文字に変換します。
lcase英大文字を小文字に変換します。

基本の使い方

空のファイル(ダミーデータ)を作成する

テスト用に特定のサイズのファイルを作成する際の定石です。/dev/zero(無限にゼロを吐き出すデバイス)を入力元にします。

# 1MBのブロックを100個書き込み、100MBのファイルを作成
dd if=/dev/zero of=testfile_100m.img bs=1M count=100

実行結果イメージ:

100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.052341 s, 2.0 GB/s

実践コマンド

1. ISOイメージをUSBメモリに書き込む(ブータブルUSB作成)

Linuxのインストールメディアを作成する際によく使われます。

※注意: of=に指定するデバイスパスは環境によって異なります(/dev/sdbなど)。間違えるとHDDのデータが消えます。

# ISOファイルをUSBメモリ(/dev/sdX)に書き込む
sudo dd if=./downloads/ubuntu-24.04-desktop-amd64.iso of=/dev/sdX bs=4M status=progress oflag=sync

status=progress を付けると、プログレスバーが表示されます。

2. ディスクイメージを作成してファイルシステム構築・マウント

1GBのファイルを作成し、それをあたかもHDDのようにフォーマットしてマウントする手順です。仮想化環境(XenやKVM)のディスク作成などで利用されます。

# 1. 1GBの空のイメージファイルを作成
dd if=/dev/zero of=virtual_disk.img bs=1M count=1024

# 2. ext4形式でフォーマット(ファイルシステム作成)
mkfs.ext4 virtual_disk.img

# 3. マウントポイント作成とループバックマウント
sudo mkdir -p /mnt/vdisk
sudo mount -o loop virtual_disk.img /mnt/vdisk

# 確認
df -h /mnt/vdisk

実行結果イメージ(dfコマンド):

Filesystem      Size  Used Avail Use% Mounted on
/dev/loop0      976M  2.6M  907M   1% /mnt/vdisk

3. テキストファイルの大文字・小文字を変換する

パイプ処理で渡されたテキストデータの変換フィルタとしても利用可能です。

# 小文字のみのファイルを作成
echo "hello linux world" > lower.txt

# ucase(Upper Case)で大文字に変換して出力
dd if=lower.txt of=upper.txt conv=ucase

# 結果確認
cat upper.txt

実行結果イメージ:

HELLO LINUX WORLD
0+1 records in
0+1 records out
18 bytes copied, 0.000123 s, 146 kB/s

カスタムポイント

  • ブロックサイズ (bs=) の調整:
    • デフォルトは512バイトと小さいため、ディスクコピー時は bs=4Mbs=64K など大きめの値を指定すると速度が向上します。
  • 進捗表示 (status=progress):
    • 巨大なファイルを扱う際は、いつ終わるか分からない不安を解消するために必ず付けましょう(GNU Coreutils 8.24以降)。

注意点

  1. デバイス指定ミスは致命的:
    • of=/dev/sda などシステムディスクを指定して実行すると、OSごと全てのデータが復旧不可能になります。lsblk コマンドなどでデバイス名を何度も確認してください。
  2. 書き込み完了のタイミング:
    • dd コマンドが終了しても、OSのキャッシュ上にデータが残っており、ディスクへの書き込みが完了していない場合があります。USBメモリを抜く前には必ず sync コマンドを実行するか、適切にアンマウントしてください。
  3. パーティションとディスク全体:
    • USBメモリ全体に書き込む場合は /dev/sdX(数字なし)を指定します。/dev/sdX1(パーティション)を指定するとブートできない場合があります。

応用

実行中のddコマンドに進捗状況を出力させる(シグナル送信)

古いバージョンのddでは status=progress が使えません。その場合、別のターミナルから USR1 シグナルを送ることで、実行中のddに進捗情報を標準エラー出力へ吐き出させることができます。

手順:

  1. ターミナルA: 時間のかかる処理を実行Bashdd if=/dev/zero of=huge_file.img bs=1M count=10000
  2. ターミナルB: 実行中のddのプロセスIDを探してシグナル送信Bash# プロセスIDを特定して kill -USR1 を送信 pkill -USR1 -x dd

実行結果イメージ(ターミナルA側に表示される):

3560+0 records in
3560+0 records out
3732930560 bytes (3.7 GB) copied, 15.2341 s, 245 MB/s

まとめ

ddコマンドは、Linuxにおけるデータの「物理的な移動・加工」を担う強力なツールです。

  • 向く場面: ブータブルUSB作成、ディスクの完全バックアップ、テスト用ダミーファイル生成。
  • 変更ポイント: bsを大きくして高速化、status=progressで可視化。
  • 注意点: of=(出力先)の指定ミスはデータ消失に直結する。

GUIツールが使えないサーバー環境や、壊れかけたHDDからデータを強制的に吸い出す場面(conv=noerror)では、このコマンドだけが頼りになります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次