dd(データ(セット)定義)は、ファイルデータの読み書きと変換を行うシェルコマンドです。元々はUnix向けに開発されましたが、 Unixライクなオペレーティングシステム、Windows、Plan 9、Infernoなど、他の多くの環境にも実装されています。[ 1 ]
このコマンドは多くの目的に使用できます。比較的単純なコピー操作では、ドメイン固有の代替手段よりも遅くなる傾向がありますが、任意の場所でファイルを上書きまたは切り詰めたり、ファイル内をシークしたりする場合には優れています。[ 2 ]
このコマンドはファイルの読み書きをサポートしており、ファイルライクなアクセスをサポートするドライバが利用可能な場合は、デバイスにもアクセスできます。このようなアクセスは通常、デバイス(ストレージなど)や特殊なデバイスファイル( /dev/zeroや/dev/randomなど)へのファイルライクなアクセスを提供するUnix系システムでサポートされています。したがって、このコマンドは、ドライブのブートセクタのバックアップやランダムデータの取得などのタスクに使用できます。
このコマンドは、バイト順序の入れ替えやASCIIとEBCDICのテキストエンコーディング間の変換など、コピー中のデータ変換もサポートしています。[ 3 ]
1974 年、このコマンドはバージョン 5 Unixddの一部として登場しました。Dennis Ritchieによると、この名前はIBMのジョブ制御言語(JCL)にあるDD ステートメントへの言及であり、 DDはd ata d efinitionの略です。[ 5 ] [ 6 ] [ 7 ] [ 8 ]その構文の文化的背景を説明する中で、 Douglas McIlroyは、このコマンドは「元々はDECコンピュータのASCII、リトルエンディアン、バイトストリームの世界とIBMのEBCDIC、ビッグエンディアン、ブロックの世界の間でファイルを変換するために意図されていた」と述べています。[ 9 ] Eric S. Raymond は、このコマンドの構文が他の Unix コマンドよりも JCL ステートメントに似ているため、「インターフェース設計は明らかにいたずらだった」と考えています。[ 6 ]dd
1987年に、このコマンドはX/Open移植性ガイド第2版(1987年)ddで規定されました。これはIEEE Std 1003.1-2008(POSIX)に継承されており、これはSingle UNIX Specificationの一部です。[ 10 ]
1990年、David MacKenzieはGNU fileutils(現在はcoreutilsの一部)を発表し、その中にddコマンドが含まれていました。[ 11 ]これはPaul Rubin、David MacKenzie、およびStuart Kempによって書かれました。[ 12 ] 1991年以来、Jim Meyeringがそのメンテナーです。[ 13 ]
1995年に、JCLステートメントスタイルよりも伝統的なコマンドラインオプションスタイルのコマンドを備えたPlan 9第2版がリリースされました。 [ 14 ]dd
少なくとも1999年以来、UnxUtilsはWindowsプラットフォーム向けのネイティブ実装を提供してきた。[ 15 ] [ 16 ]
コマンドラインインターフェースは、オプションが、ハイフン接頭辞でオプションを示す一般的な構文(例:、、、)ではなく、のようにフォーマットされるという点で、ほとんどの最新のシェルコマンドとは大きく異なります。option=value-x-y value--abc--def value
デフォルトでは、標準入力ddから読み込み、標準出力に書き込みますが、入力と出力は上書きできます。オプションで入力ファイルを指定し、オプションで出力ファイルを指定します。ifof
標準化されていない側面は、dd基盤となるシステムまたは実装に依存します。これには以下が含まれます。
完了すると、統計情報を標準エラーddに書き込みます。フォーマットは POSIX で標準化されています。[ 10 ] : STDERR GNU dd のマニュアルページにはこのフォーマットの説明はありませんが、BSD マニュアルには記載されています。「Records in」と「Records out」の各行には、転送された完全なブロックの数と部分的なブロックの数が表示されます。たとえば、完全なブロックが読み取られる前に物理メディアが終了した場合や、物理エラーによって完全なブロックの読み取りが妨げられた場合などです。
実行中にSIGINFOddシグナルを受信した場合(通常はユーザーが+キーを押すことによってトリガーされる)、中間統計情報を標準エラーに書き込み、処理を続行します。CtrlT
このコマンドはデータをブロック単位で処理します。デフォルトのサイズは 512 (POSIX で規定されたサイズであり、ディスク ハードウェアでよく使われる従来のサイズ) ですが、コマンドライン オプションで指定できます。オプション は、bs入力 (読み取り) 操作と出力 (書き込み) 操作の両方のサイズを指定します。または、オプション は、入力操作と出力操作ibsのサイズを指定します。オプションは変換操作に影響します。obscbs
オプションcount、skipおよびseekブロック数を指定します。最大読み取りブロック数、入力の先頭からのオフセット位置での読み取り開始位置、出力の先頭からのオフセット位置での書き込み開始位置をそれぞれ指定します。[ 10 ]:オペランド
ブロックサイズオプションの値は、乗数を示すオプションのサフィックスが付いたバイトの整数(10進数)として指定されます。POSIXでは、b512にはサフィックス(ブロック)、1024にはk(キビバイト)が必要ですが、 [ 10 ] :オペランド、他のサフィックスについては実装が異なります。(Free)BSDmでは、メビバイトには、ギビバイトgには、 2のべき乗の単位にはなどを使用します。[ 17 ] GNUでは、これらの単位には、などを使用し、SI単位には、、、を使用します。[ 12 ]例えば、GNU ddでは、はサイズを示します。MGkBMBGBbs=16M16 MiB (16,777,216バイト )をbs=3kB指定3000 バイト。
POSIX準拠のため、一部の実装では、xブロックサイズとカウントオプション値の両方に対して、文字を乗算演算子として解釈します。たとえば、bs=2x80x18bは 2 × 80 × 18 × 512 = と解釈されます。1,474,560バイト 、1440 KiB フロッピー ディスク。[ 10 ] :オペランドこの機能をサポートしていない実装では、POSIX シェル算術構文を使用できます。bs=$((2*80*18))b
ブロックサイズはパフォーマンスに影響します。小さな読み書きを多数行うよりも、大きな読み書きを少数行う方が一般的に処理速度が遅くなります。一方、大きなブロックはより多くのRAMを必要とし、エラー回復処理を複雑にする可能性があります。
テープドライブやネットワークなどの可変ブロックサイズデバイスで使用する場合、ネットワークプロトコルによっては、ブロックサイズによってテープレコードサイズやネットワークパケットサイズが決まる場合があります。
以下の例は多くの実装に適用できますが、特にGNU dd向けに記述されています。一般的に、実装間の違いはブロックサイズの値のみであり、サイズ乗数サフィックスの代わりにシェル算術式を使用することで移植性を確保できます。たとえば、の代わりにまたはをbs=64M使用します。bs=$((64*1024*1024))bs=$((64<<20))
このコマンドは、ファイル、デバイス、パーティション、ボリューム間でデータを複製でき、オプションconvで指定されたとおりに転送中にデータを変換できます。場合によっては、catを使用した方がデータ転送が速くなります。[ 2 ]
CD-ROM、DVD、またはBlu-rayディスクからISOディスクイメージを作成するには: [ 18 ]
blocks=$(isosize-d2048/dev/sr0)dd if=/dev/sr0 of=isoimage.iso bs=2048 count=$blocks status=progress
イメージファイルからドライブを復元するには:
dd if=system.img of=/dev/sdc bs=64M conv=noerrorパーティション sdb2 のイメージを作成するには、64 MiB ブロックサイズ:
dd if=/dev/sdb2 of=partition.image bs=64M conv=noerrordd if=/dev/sda2 of=/dev/sdb2 bs=64M conv=noerrorドライブad0をad1にクローンする(エラーは無視します):
dd if=/dev/ad0 of=/dev/ad1 bs=64M conv=noerrorこのコマンドはデータをその場で変更できます。たとえば、これは最初のデータを上書きします。 ヌルバイトを含むファイルの512バイト:
dd if=/dev/zero of=path/to/file bs=512 count=1 conv=notruncこのオプションconv=notruncを指定すると、出力ファイルを切り詰めずに済みます。つまり、出力ファイルが既に存在する場合、指定されたバイトを置き換え、残りの部分はそのまま残します。このオプションを指定しない場合、コマンドは512バイトの出力ファイルを作成します。
上記の例は、マスターブートレコードを含むデバイスの任意の領域をファイルにバックアップおよび復元するためにも使用できます。フロッピーディスクの最初の2つのセクターを複製するには、次の手順を実行します。
dd if=/dev/fd0 of=MBRboot.img bs=512 count=2セキュリティ上の理由から、廃棄するデバイスのディスクを完全に消去する必要がある場合があります。これは、Unixの特殊ファイルから「データ転送」を行うことで実現できます。
dd if=/dev/zero of=/dev/sda bs=16Mdd if=/dev/urandom of=/dev/sda bs=16M上記のデータ変更例と比較すると、出力ファイルがブロックデバイスの場合、 notrunc変換オプションは効果がないから不要である。[ 19 ]
このオプションbs=16Mにより、dd は読み書きが可能になります。 一度に16 MiBずつ。最新のシステムでは、さらに大きなブロックサイズの方が高速な場合があります。ランダムデータでドライブを埋めるには、ドライブをゼロにするよりも時間がかかる場合があることに注意してください。これは、ランダムデータは CPU によって生成される必要があるのに対し、ゼロの生成は非常に高速であるためです。最新のハードディスク ドライブでは、ドライブをゼロにすると、ドライブに含まれるほとんどのデータが永久に復元不可能になります。 [ 20 ]ただし、フラッシュ メモリなどの他の種類のドライブでは、データ残留 により多くのデータが復元できる場合があります。
最新のハードディスクドライブには、ドライブのアクセス可能な部分とアクセス不可能な部分を完全に安全に消去するセキュア消去コマンドが搭載されています。一部のソリッドステートドライブ(フラッシュドライブ)でも動作する場合があります。2017年現在、USBフラッシュドライブやSecure Digitalフラッシュメモリでは動作しません。 利用可能な場合、このコマンドはddコマンドよりも高速で、より安全です。Linuxマシン では、 hdparmコマンドのオプションからアクセスできます。--security-erase-enhanced
このshredプログラムは、複数回の上書きに加え、個々のファイルをより安全に削除する機能も提供しています。
データ復旧では、一部にアクセスできない可能性のあるドライブからデータを読み取る必要があります。このコマンドは、柔軟なスキップ(シーク)機能やその他の低レベル設定を備えているため、この作業に最適です。しかし、標準のddコマンドは、ユーザーがエラーメッセージを読み、読み取り可能な領域を手動で計算する必要があるため、使い勝手が悪いです。また、ブロックサイズが1つしかないため、復旧の粒度も制限されます。つまり、より多くのデータを復旧するには小さなブロックサイズを使用するか、速度を優先するには大きなブロックサイズを使用するかのどちらかを選択する必要があります。
AC プログラムdd_rescue[ 21 ]は 1999 年 10 月に作成されました。 の変換機能を廃止しdd、ジレンマに対処するために 2 つのブロック サイズをサポートしています。大きなサイズを使用した読み取りが失敗した場合、可能な限り多くのデータを収集するために、より小さなサイズにフォールバックします。逆方向にも実行できます。 2003 年に、dd_rescueの使用プロセスを自動化し、どの領域が自動的に読み取られたかを追跡するdd_rhelpスクリプトが作成されました。 [ 22 ]
2004 年、GNU は とは無関係の別のユーティリティ を と名付けましたdd。これは、より洗練された動的ブロックサイズアルゴリズムを備え、内部で読み込まれた内容を追跡します。dd_rescueとdd_rhelpのddrescue両方の作者は、これを自分たちの実装よりも優れていると考えています。[ 23 ]新しい GNU プログラムを古いスクリプトと区別するために、GNU のddrescueには、addrescue (freecode.com および freshmeat.net での名前)、gddrescue ( Debianパッケージ名)、gnu_ddrescue ( openSUSEパッケージ名) などの代替名が使用されることがあります。
ドライブベンチマークテストを実行し、1024バイトブロックのシーケンシャル(通常はシングルスレッド)システム読み書き性能を分析するには:
dd if=/dev/zero bs=1024 count=1000000 of=1GB_file_to_writedd if=1GB_file_to_read of=/dev/null bs=1024ランダムドライバを使用して100バイトのランダムなファイルを作成するには:
dd if=/dev/urandom of=myrandom bs=100 count=1ファイルを大文字に変換するには:
dd if=filename of=filename1 conv=ucase,notrunc要求に応じて、コマンドは進行状況を報告します。シグナルUSR1( BSDシステムではINFO)を受信すると、転送されたブロック数を標準エラー出力に書き込みます。
以下のbashスクリプトは、次のリクエストを定期的に実行します。 転送完了まであと10秒です。テキスト中のPIDは、 ddコマンドのプロセス識別子を表します。
while kill -USR1 PID ; do sleep 10 ; doneGNU ddの新しいバージョンでは、定期的なステータス フィードバックを有効にするオプションがサポートされていますstatus=progress。[ 24 ]
dcfldd はGNU ddのフォークであり、当時米国国防総省 コンピュータフォレンジック研究所に勤務していた Nick Harbour によって開発された拡張バージョンです。[ 25 ] [ 26 ] [ 27 ]と比べると、dcfldd は複数の出力ファイルを許可し、複数のチェックサム計算を同時にサポートし、ファイルマッチングの検証モードを提供し、操作の進行状況をパーセントで表示できます。2026 年 2 月現在、最後のリリースは 2025 年 6 月の 1.9.3 です。[ 28 ]dd
dc3ddは、米国国防総省サイバー犯罪センター(DC3)によるGNU ddのフォークです。dcflddの後継と見なすことができ、GNUアップストリームが更新されるたびに更新することを目的としています。2023年6月現在 最後のリリースは2023年4月の7.3.1でした。[ 29 ]
dd は常に JCL dd カードにちなんで名付けられました。
重要な注意
: しばらくの間、dd_rhelp は (私の知る限り) この種の作業を行う唯一のツールでしたが、数年前からそうではなくなりました。Antonio Diaz が私のツールの理想的な代替となる GNU 'ddrescue' を作成しました。