| dd | |
|---|---|
| 原作者 | ケン・トンプソン(AT&Tベル研究所) |
| 開発者 | さまざまなオープンソースおよび商用開発者 |
| 初回リリース | 1974年6月 (1974-06) |
| リポジトリ | coreutils: git |
| 書かれた | プラン9:C |
| オペレーティング·システム | Unix、Unixライク、Plan 9、Inferno、Windows |
| プラットフォーム | クロスプラットフォーム |
| タイプ | 指示 |
| ライセンス | coreutils : GPLv3+プラン 9: MIT ライセンス |
dd( Data(set) Definition ) は、ファイルデータの読み込み、書き込み、変換を行うシェルコマンドです。元々はUnix向けに開発されましたが、 Unix 系オペレーティングシステム、Windows、Plan 9、Infernoなど、多くの環境に実装されています。[ 1 ]
このコマンドは様々な用途に使用できます。比較的単純なコピー操作では、ドメイン固有の代替コマンドよりも遅くなる傾向がありますが、ファイルの任意の位置での上書きや切り捨て、ファイル内のシークには優れています。[ 2 ]
このコマンドはファイルの読み書きをサポートしており、ファイルのようなアクセスをサポートするドライバが利用可能な場合は、デバイスへのアクセスも可能です。このようなアクセスは、デバイス( storageなど)や特殊デバイスファイル( /dev/zeroや/dev/randomなど)へのファイルのようなアクセスを提供するUnixベースのシステムで一般的にサポートされています。そのため、このコマンドは、ドライブのブートセクタのバックアップやランダムデータの取得といったタスクに使用できます。
このコマンドは、バイト順のスワップやASCIIとEBCDICのテキストエンコーディング間の変換など、コピー中のデータ変換もサポートしています。[ 3 ]
ddタイプミスを含むドライブの消去機能があるため、「ディスクデストロイヤー」というユーモラスな名前で呼ばれることもある。[ 4 ]
1974年、このコマンドはバージョン5 Unixddの一部として登場しました。デニス・リッチーによると、その名称はIBMのジョブ制御言語(JCL)のDD文に由来しており、 [ 5 ] [ 6 ] DDはdata d efinition (データ定義)の略です。[ 7 ] [ 8 ]ダグラス・マキロイは、その構文の文化的背景について、「元々はDECコンピュータのASCII、リトルエンディアン、バイトストリームの世界とIBMのEBCDIC 、ビッグエンディアン、ブロック化された世界の間でファイルを変換することを目的としていた」と述べています。[ 9 ]エリック・S・レイモンドは、このコマンドの構文が他のUnixコマンドよりもJCL文に似ていることから、「インターフェース設計は明らかにいたずらだった」と考えています。[ 6 ]dd
1987年に、このコマンドはX/Open Portability Guide 1987年第2版ddで規定されました。これは、 Single UNIX Specificationの一部であるIEEE Std 1003.1-2008 ( POSIX )に継承されています。[ 10 ]
1990年、David MacKenzieはコマンドを含むGNU fileutils(現在はcoreutilsの一部)を発表しましたdd。[ 11 ]これはPaul Rubin、David MacKenzie、Stuart Kempによって書かれました。[ 12 ] 1991年以来、Jim Meyeringがメンテナーを務めています。[ 13 ]
1995年に、Plan 9第2版ddがJCLステートメントスタイルよりも伝統的なコマンドラインオプションスタイルのコマンドとともにリリースされました。 [ 14 ]
少なくとも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 ]:オペランドです が、実装によって他の接尾辞は異なります。(フリー)BSDでは、メビバイトmには、ギビバイトにはなどを使用し、 2のべき乗の大きい単位には以下を使用します。[ 17 ] GNUでは、これらの単位には 、 などを使用し、SI単位には、 、 を使用します。[ 12 ]たとえば、GNU ddでは、はサイズを示します。gMGkBMBGBbs=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=エラーなしエラーを無視してドライブ ad0 を ad1 にクローンするには:
dd if=/dev/ad0 of=/dev/ad1 bs=64M conv=エラーなしこのコマンドはデータをその場で変更することができます。例えば、最初のヌルバイトを含む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=16Mddに読み書きをさせる一度に16MiB までしか書き込みできません。最新のシステムでは、ブロックサイズをさらに大きくすると高速化される可能性があります。ドライブにランダムデータを埋め込むには、ドライブをゼロクリアするよりも時間がかかる場合があることに注意してください。これは、ランダムデータはCPUによって生成されるのに対し、ゼロクリアは非常に高速であるためです。最新のハードディスクドライブでは、ドライブをゼロクリアすると、ドライブに含まれるほとんどのデータが永久に回復不能になります。 [ 20 ] ただし、フラッシュメモリなどの他の種類のドライブでは、データ残留によって多くのデータが回復可能な場合があります。
最近のハードディスクドライブには、ドライブのアクセス可能領域とアクセス不可能領域の両方を永久かつ安全に消去するSecure Eraseコマンドが搭載されています。このコマンドは、一部のソリッドステートドライブ(フラッシュドライブ)でも機能する場合があります。2017年現在、USBフラッシュドライブとSecure Digitalフラッシュメモリでは機能しません。Secure Eraseコマンドが利用可能な場合、ddコマンドを使用するよりも高速で、より安全です。Linuxマシンでは、hdparmコマンドのオプションを介して使用できます--security-erase-enhanced。
シュレッドプログラムは、複数の上書きと、個々のファイルのより安全な削除を提供します。
データ復旧には、アクセスできない可能性のある部分を含むドライブからの読み取りが含まれます。このコマンドは、柔軟なスキップ(seek)やその他の低レベル設定により、この作業に最適です。しかし、標準のddは、ユーザーがエラーメッセージを読み、読み取り可能な領域を手動で計算する必要があるため、使いにくいです。また、ブロックサイズが1つしかないため、復旧の粒度が制限されます。つまり、より多くのデータを復旧したい場合は小さいブロックサイズを使用するか、速度を優先したい場合は大きいブロックサイズを使用するか、というトレードオフが必要になります。
dd_rescue [ 21 ]と呼ばれるCプログラムは 1999年10月に開発されました。このプログラムは の変換機能を廃止しdd、ジレンマに対処するために2つのブロックサイズをサポートしています。大きなサイズでの読み取りが失敗した場合、より小さなサイズにフォールバックして可能な限り多くのデータを取得します。また、逆方向に実行することも可能です。2003年には、dd_rescueの使用プロセスを自動化し、どの領域が読み取られたかを自動的に追跡するdd_rhelpスクリプトが開発されました。 [ 22 ]
2004年、GNUはddrescueddという、とは無関係の別のユーティリティを作成しました。ddrescueはより洗練された動的ブロックサイズアルゴリズムを持ち、内部的に読み込まれた内容を追跡します。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=ファイル名 of=ファイル名1 conv=ucase,notrunc要求に応じて、コマンドは進行状況を報告します。シグナルUSR1( BSDシステムではINFO)を受信すると、転送されたブロック数を標準エラー出力に書き込みます。
次のbashスクリプトは、転送が完了するまで10 秒かかります。テキストPIDはddプロセス識別子を表します。
while kill -USR1 PID ; do sleep 10 ;完了GNU ddの新しいバージョンでは、定期的なステータスフィードバックを有効にするオプションをサポートしていますstatus=progress。[ 24 ]
dcflddはGNU ddのフォークであり、当時米国国防総省 コンピュータフォレンジック研究所に勤務していたニック・ハーバーによって開発された拡張版である。[ 25 ] [ 26 ] [ 27 ]と比較すると、dcflddは複数の出力ファイルを許可し、複数のチェックサムの同時計算をサポートし、ファイルマッチングの検証モードを提供し、操作の進行状況をパーセンテージで表示できる。2024年2月現在、最終リリースは2023年4月の1.9.1である。[ 28 ]dd
dc3ddは、米国国防総省サイバー犯罪センター(DC3)によるGNU ddの別のフォークです。dcflddの継続版と見なすことができ、GNUアップストリームの更新に合わせて更新されることを明記しています。2023年6月現在、最終リリースは2023年4月の7.3.1です。[ 29 ]
は常にJCL ddカードにちなんで名付けられていた。
重要事項:一時期、dd_rhelp はこの種の作業を実行できる唯一のツール(私の知る限り)でしたが、数年前からそうではなくなりました。Antonio Diaz が私のツールの理想的な代替ツール、GNU 'ddrescue' を開発しました。