dd コマンドは dataset definition の略で、ディスクに限らずデータを Low レベルで読み書きすることができます。
データの中身を無視して操作できるため、たとえばOSが読み取れないファイルシステムでフォーマットされているストレージでもバイナリーレベルで読み書きが可能です。
dd の主な用途は、データ破壊、データ消去ですが、完全なバックアップ、完全なリストアが可能です。
たとえば、メーカー製 PC の OS を入れ替え、気が変わって元に戻す状況があったとして、本来であればリストアディスクを準備したりドライバーを再度入手したりといった作業が必要ですが、dd コマンドでイメージを事前に取得していれば、バックアップ時点まで完全に戻すことが可能です。なお、市販のバックアップソフトでも同様のことはできますが、無償、互換性の懸念(古いバージョンでバックアップして、新しいバージョンで本当にリストアできるのか、どんなOS・ディストリビューションでもリストアできるのか)、バックアップ後のデータの取り扱いの簡単さなどの点から dd にも優位性があります。
逆に dd が市販バックアップソフトよりも劣る点としては、無保証、遅い、増分・差分バックアップが取れない、フールプルーフが存在しない、などが挙げられます。
なお、LPIC-1 の試験に登場するので初級者向けのようです。
作成 2015.05.14
更新 2021.07.30
更新 2021.07.30
dd コマンドによるディスクバックアップ・リストアメモ
dd の特徴
Linux で起動
バックアップしたいディスク以外から起動する必要があります。良くあるのは Ubuntu のインストールディスクなどを使ってお試し版で起動する方法が手軽でしょう。
USB ブートしたい場合は UNetbootin を使うと簡単に起動用USBメモリが作成可能です。
Ubuntu でGUI起動した場合は、terminal で検索したらコマンド入力用のウインドウが表示できます。
USB ブートしたい場合は UNetbootin を使うと簡単に起動用USBメモリが作成可能です。
Ubuntu でGUI起動した場合は、terminal で検索したらコマンド入力用のウインドウが表示できます。
バックアップ元、バックアップデータ保存先の確認
以降の操作は root 権限で実行します。
sda1, sda2 といった表記がある場合は、ディスク sda にパーティションが区切られていることがわかります。
今回はディスク丸ごとバックアップするためパーティション番号は無視してかまいません。
なお、ときどきパソコンが新しすぎ/古すぎてディスクを認識できない場合があります。
Apple Mac, NEC Lavie, Panasonic Let's Note は概ね問題無いようです。
# fdisk -l/dev/sda や /dev/sdb などがそうです。ディスク容量からどのディスクがどれに相当するか推測してください。
sda1, sda2 といった表記がある場合は、ディスク sda にパーティションが区切られていることがわかります。
今回はディスク丸ごとバックアップするためパーティション番号は無視してかまいません。
なお、ときどきパソコンが新しすぎ/古すぎてディスクを認識できない場合があります。
Apple Mac, NEC Lavie, Panasonic Let's Note は概ね問題無いようです。
バックアップデータ保存先のマウント
NTFSフォーマットされたローカルディスクをマウントする場合
すでにマウントされている場合は、df コマンドで探すのが良いかと。
すでにマウントされている場合は、df コマンドで探すのが良いかと。
# mkdir /tmp/backup # mount -t ntfs-3g /dev/sdb1 /tmp/backupNASにバックアップする場合(Windowsファイル共有の場合)
# mkdir /tmp/backup # mount -t cifs //nas_ipaddr/share /tmp/backup -o username=user1,vers=1.0SMB1.0に対応しておらず、SMB3.0で暗号化通信をサポートする場合
# mount -t cifs //nas_ipaddr/share /tmp/backup -o username=TEST\\user1,vers=3.0,seal
バックアップ
拡張子等は自由。ディスクが破損していた場合は、エラーで停止されます。
bs はバッファサイズ
bs はバッファサイズ
# dd if=/dev/sda bs=64k | gzip -c > /tmp/backup/sda.ddimg.gz
リストア
# gunzip -c /tmp/backup/sda.ddimg.gz | dd of=/dev/sda bs=64k
ディスクコピー
sda の内容を sdb へ丸ごとコピー
書き込む単位を 4096 バイトのように小さい値に指定することで、読み取りエラーの範囲を最小限にします。
# dd if=/dev/sda of=/dev/sdb bs=64ksda に問題があることがわかっている場合は、noerrorをつけて続行。sync は読み取りエラーになった部分を 0 で埋める。
書き込む単位を 4096 バイトのように小さい値に指定することで、読み取りエラーの範囲を最小限にします。
# dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror
データ消去・破壊
# dd if=/dev/zero of=/dev/sda bs=64k conv=noerror # dd if=/dev/urandom of=/dev/sda bs=64k conv=noerror/dev/urandom を使用する方法は非常に時間がかかるため、ある程度のサイズのファイルを作成してそれを使って書き込むほうが高速です。
# dd if=/dev/urandom of=/tmp/rand1GB bs=1024k count=1024 # dd if=/tmp/rand1GB of=/dev/sda bs=1024k conv=noerror # dd if=/tmp/rand1GB of=/dev/sda bs=1024k conv=noerror seek=1024 # dd if=/tmp/rand1GB of=/dev/sda bs=1024k conv=noerror seek=2048 # dd if=/tmp/rand1GB of=/dev/sda bs=1024k conv=noerror seek=3072 ...
Windowsからうまく操作できなくなったディスクを元に戻す
ストレージの先頭をある程度破壊すると、未初期化ディスクとして扱われるようになります。
# dd if=/dev/zero of=/dev/sda count=512
実行中の状況を確認
dd のプロセス番号を確認
# ps -e | grep ddSIGUSR1 シグナルを送ると、dd コマンドを実行した画面に進捗が表示されます。
# kill -USR1 (ddコマンドのプロセス番号)