dd` はLinuxで最も重要なコマンドの1つで、主にハードディスクやパーティションのバックアップに使用されます。正しく利用すれば、dd はあるパーティションから別のパーティションにデータを書き込んだり、 ファイルを使ってさまざまな作業を行うための強力なツールになります。ここでは、dd コマンドをうまく使う方法を紹介します。

dd の話

このコマンドはもともと、1970 年代に AT&T ベル研究所で Ken Thompson というコンピュータ科学者によって開発されました。Unix ベースのシステム用に開発され、IBM の Job Control Language にある “DD” と呼ばれる文にちなんだ名前が付けられたのです。このコマンドの構文は、ジョブ・コントロール・ランゲージの文に酷似していることに注目できる。

このコマンドはもともと、ASCIIをEBCDICに、またはその逆に変換するユーティリティとして設計されたものであった。1974年にUnixのバージョンに初めて統合され、オペレーティングシステムの第5版がリリースされた。

dd は、不適切に使用された場合にハードディスクのデータを破壊する能力があるため、Unix コミュニティでは冗談として「ディスク破壊者」と呼ばれています。

基本的なオペランド

さて、このコマンドの背景と、間違って使ったときの破壊力について少しわかったところで、異なる Linux ディストリビューションのユーザーに提供するすべての利点を活用する方法を学ぶ時が来ました。

まず最初に、--help フラグを使用してマニュアルを表示します。

dd --help

このコマンドには、最もよく使われる2つのオペランドがあります。それらは ifof で、それぞれ “入力ファイル” と “出力ファイル” を意味する。if オペランドは入力ファイルの場所を表すのに使われ、of` オペランドは入力ファイルからデータを保存する場所を表すのに使われます。

dd if=<入力ファイル> of=<出力ファイル> のようになります。

最も一般的なソースとアウトプットの場所は、ハードディスク、パーティション、ディスクイメージなどです。

このコマンドを使う前に、fdiskユーティリティを使ってシステムのパーティションを 確認しておくと便利かもしれません。これはコマンドの -l フラグを使用することで簡単に行うことができます。

sudo fdisk -l

この場合、ifは「/dev/sda」ドライブ、ofは「/dev/sdb」ドライブを表し、「/dev/sda」からのデータはここに保存されることになります。

dd if=/dev/sda of=/dev/sdb

ディスクイメージの作成

このコマンドの最も良い使い方の一つは、".img “ファイル形式のディスクイメージの作成です。これは Linux ベースのシステムのデータをバックアップするのに非常に便利で、ハードディスク全体をバッ クアップする最も迅速で簡単な方法だと思われます。

この場合のロジックは主に同じで、if オペランドが “/dev/sda” ドライブ、of オペランドが “.img” ファイルを表し、そこにハードディスクからデータが保存されます。

dd if=/dev/sda of=/tmp/image.img

ディスクイメージをパーティションに保存する

コマンドを使ったディスクイメージの作成はかなり簡単ですが、その逆バージョンも同様です。

このシナリオでは、ディスクイメージファイルが入力ファイルとして機能し、新しいパーティ ションが出力ファイルとして機能します。ユーティリティはディスクイメージから “/dev/sdb” パーティションにデータを保存しています。

dd if=/tmp/image.img of=/dev/sdb

圧縮されたディスクイメージの作成

フルサイズのハードディスクのディスクイメージを作成する場合、最終的なディスクイメージのファイルサイズはかなり大きくなることが想像できます。このため、dd ユーティリティには、圧縮ディスクイメージを作成する機能があります。

圧縮されたディスクイメージは、パイプ | コマンドを使用して作成することができます。この場合、入力ファイルの内容を取り込み、 -c フラグを付けて gzip コマンドを実行し、内容を “.gz” ファイルにパッケージングするために使用されます。

dd if=/dev/sda | gzip -c > /tmp/image.gz

ブロックサイズの指定

ddコマンドの動作速度を調整することもできます。これは、ブロックサイズを表す bs オペランドを使用することで実現できます。ブロックサイズは、dd が 1 回で出力ファイルにコピーするバイト数を表します。ブロックサイズは1024バイトの倍数で表され、デフォルト値は512バイトに設定されています。ブロックサイズが大きいほど、出力ファイルへのデータ保存が高速になります。

この例では、ブロックサイズを2048に設定しています。

dd if=/dev/sda of=/tmp/image.img bs=2048

ブロックサイズはキロバイト単位で指定することもできます。

dd if=/dev/sda of=/tmp/image.img bs=2K

ハードディスクを消去する

dd はハードディスクを消去するためにも使うことができます。これは、"/dev/zero” や “/dev/urandom” からゼロやランダムな文字を読み込んで、ハードディスク/パ ーティションに保存し、そのデータを上書きすることで実現します。ハードディスクを売却するなどして処分した後、データを簡単に取り出せないようにしたい場合に非常に有効です。

ゼロを使ってハードディスクを上書きする。

dd if=/dev/zero of=/dev/sdb

また、ランダムな文字を使ってデバイスを上書きすることもできます。

dd if=/dev/urandom of=/dev/sdb

ブート可能な USB ドライブの作成

コマンドで".iso “ファイルを使った起動可能なUSBメモリを作成するのは簡単です。

dd if=os.iso of=.

dd を使って特定のパーティションをクローンする

もうひとつの dd の素晴らしい使い方は、Linux システム上のアクティブなパーテ ィションのクローンを作ることです。IMG ファイルとは異なり、クローンでは特定のパーティションの正確なコピーを作 成し、すぐに使用することができます。これは、マルチディスクのセットアップで、システムの冗長なパーティションを作成したい場合に便利です。

dev/sda4” から “/dev/sdd1” にパーティションのクローンを作るには。

dd if=/dev/sda4 of=/dev/sdb1 conv=noerror,sync

conv パラメータを使用すると、dd の動作を変更するための追加のオプションを含めることができます。これは、ファイル名を大文字に変換するような簡単なものから、ブロックのプロパティを変更するような複雑なものまであります。今回は、noerrorsync`を使用しています。

  • noerror" オプションは、dd がデバイスのエラーを報告しても、デバイスファイルを通してコ ピーを続けるように指示します。noerror" オプションは、デバイスのエラーが報告されても、デバイスファイルを通してコ ピーを続けるよう dd に伝えます。これは、パーティションがあるデバイスが既に故障して いる場合に便利です。
  • sync」オプションは、dd に、コピーバッファに入力されるデータブロックをすべてパッドするように指示します。この意味は、dd がコピーできるすべてのデータが、コピー元とコピー先でまったく同じであることを確認することです。これは、クローンするパーティションデータの整合性を確保するためです。

dd を使って CD の中身をダンプする

dd をディスクの内容のダンプツールとして使うことも可能です。IMG ファイルと同様に、ディスクドライブを入力として、.ISO 拡張を出力と して使用することでこれを行うことができます。次のような例を考えてみましょう。

dd if=/dev/cdrom of=/tmp/dump.iso conv=noerror,sync

このコマンドは dd に CD-ROM デバイスをロードし、その内容を ISO ファイルにコピーするように指示します。

これが完了すると、fileコマンドを使用して、ダンプされたファイルが ISO 9660 イメージであるかどうかを確認することができます。

ファイル /tmp/dump.iso

ISO ダンプを CD に書き込む

次に、dd を使って先ほど作成した ISO ファイルの複製を作成することができます。これを行うには、空のディスクをドライブに挿入し、dd の出力ファイルとして “/dev/cdrom” を使用する必要があります。これで、次のコマンドを実行して ISO ファイルをディスクに正しく書き込むことが できます。

dd if=/tmp/image.iso of=/dev/cdrom obs=32k seek=0

このコマンドは、エラーバイパスや整合性チェックを使用しようとはしません。そのかわり、CD-ROMへの書き込みに特化した2つのオプションを設定します。

  • obs" オプションは dd がディスクに書き込むブロックの大きさを設定します。この場合、光ディスクの転送には32キロバイトを基準としています。
  • 一方、seekオプションは、転送の開始点を特定のデータブロックに設定するようddに指示します。CD-ROMに正しく転送するためには、これを0に設定し、ddが直ちにディスクの最初のセクタに書き込むようにすることが重要です。

Frequently Asked Questions (よくある質問)

dd の操作の進行状況を見ることはできますか?

はい!dd操作の進行状況を見るのはとても簡単です。これを行うには、dd コマンドの最後に status パラメータを含めるだけでよいのです。

dd if=/dev/sda4 of=/dev/sdd1 conv=noerror,sync status=progress` とします。

progress" オプションは dd に現在コピーしているブロックを標準出力に出力するよう指示し、これにより事実上コマンドの進行状況を見ることができるようになります。progress “オプションの他に、statusパラメータには2つの値があります。

  • Noxfer: noxfer**:「progress」と同様の値であるが、コマンドの最後に全体の転送情報を表示しない。これは、大きなUNIXパイプの一部としてddコマンドを使用する場合に便利です。
  • None: none “値は、ddが実行中にエラー以外の情報を表示しないようにします。これは、現在アクティブなパーティションのバックアップIMGファイルを作成するような、 スケジュールされたddタスクを実行している場合に便利です。

転送を高速化するために、常に高いブロックサイズを設定してもいいのでしょうか?

いいえ。高いブロックサイズを設定すると確かにddの転送速度が速くなりますが、これを行うと、書き込み先のデバイスが適切に初期化されない可能性があります。例えば、CD-ROMやDVD-ROMのような光学メディアに対して高いブロックサイズを設定すると、ディスクプレーヤーで再生したときにディスクが読めなくなることがあります。

ディスクやフラッシュドライブなどのメディアからダンプする場合のみ、高いブロックサイズを使用することをお勧めします。さらに、最大ブロックサイズを2048キロバイトにのみ設定するのもよい方法です。このようにすることで、ディスクの内容をCDやDVDに戻すことができるようになります。

ブータブルUSBドライブを作ろうとしたのですが、起動しません。ddが機能していないのでしょうか?

いいえ!起動しない最も可能性の高い理由は、ddがUSBドライブにコピーしたファイルが起動可能なファイルでないことです。例えば、CDインストーラをUSBドライブに書き込むと、ブート可能にするための適切なフラグが設定されません。

ブート可能であることを確認する一つの方法は、fileプログラムを通してそのプロパティをチェックすることです。例えば

ファイル /Downloads/ubuntu-21.10.iso` とします。

そこから、標準出力に出力されるプロパティを確認する必要があります。ブート可能なファイルは、ディスクイメージかISOハイブリッドファイルであるべきです。

画像クレジット:Unsplash

Akira
Akiraは情熱的なゲーマーであり、製品レビュアーです。ゲームをしていないときは、最新のゲーミングアクセサリーを試したり、製品のレビューをしていることが多い。彼の分かりやすいスタイルは、ゲーマーが自分のニーズに最も適した製品を簡単に判断できるようにするものです。また、技術的な問題にも精通しており、その解決方法も知っている。