dd (Unix)

dd
原作者ケン・トンプソンAT&Tベル研究所
開発者さまざまなオープンソースおよび商用開発者
初回リリース1974年6月 (1974-06
リポジトリcoreutils: git .savannah .gnu .org /cgit /coreutils .git /
書かれたプラン9:C
オペレーティング·システムUnixUnixライクPlan 9InfernoWindows
プラットフォームクロスプラットフォーム
タイプ指示
ライセンスcoreutils : GPLv3+プラン 9: MIT ライセンス

dd( Data(set) Definition ) は、ファイルデータの読み込み、書き込み、変換を行うシェルコマンドです。元々はUnix向けに開発されましたが、 Unix 系オペレーティングシステムWindowsPlan 9Infernoなど、多くの環境に実装されています。[ 1 ]

このコマンドは様々な用途に使用できます。比較的単純なコピー操作では、ドメイン固有の代替コマンドよりも遅くなる傾向がありますが、ファイルの任意の位置での上書きや切り捨て、ファイル内のシークには優れています。[ 2 ]

このコマンドはファイルの読み書きをサポートしており、ファイルのようなアクセスをサポートするドライバが利用可能な場合は、デバイスへのアクセスも可能です。このようなアクセスは、デバイス( storageなど)や特殊デバイスファイル( /dev/zero/dev/randomなど)へのファイルのようなアクセスを提供するUnixベースのシステムで一般的にサポートされています。そのため、このコマンドは、ドライブのブートセクタのバックアップやランダムデータの取得といったタスクに使用できます。

このコマンドは、バイト順のスワップやASCIIEBCDICのテキストエンコーディング間の変換など、コピー中のデータ変換もサポートしています。[ 3 ]

ddタイプミスを含むドライブの消去機能があるため、「ディスクデストロイヤー」というユーモラスな名前で呼ばれることもある。[ 4 ]

歴史

1974年、このコマンドはバージョン5 Unixddの一部として登場しました。デニス・リッチーによると、その名称はIBMジョブ制御言語(JCL)のDD文に由来しており、 [ 5 ] [ 6 ] DDはdata d efinition (データ定義)の略です。[ 7 ] [ 8 ]ダグラス・マキロイは、その構文の文化的背景について、「元々はDECコンピュータのASCIIリトルエンディアン、バイトストリームの世界とIBMEBCDIC 、ビッグエンディアン、ブロック化された世界の間でファイルを変換することを目的としていた」と述べています。[ 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

オプションcountskipおよび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-ROMDVD、または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=noerror

あるパーティションを別のパーティションに複製するには:

dd 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=16M
  • ディスクにランダムデータを書き込むには、 を使用します。dd 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での名前)、gddrescueDebianパッケージ名)、gnu_ddrescueopenSUSEパッケージ名)などの別名が使われることがあります。

ベンチマークドライブのパフォーマンス

ドライブのベンチマーク テストを実行し、1024 バイト ブロックのシーケンシャル (通常はシングル スレッド) システムの読み取りおよび書き込みパフォーマンスを分析するには、次の手順を実行します。

  • 書き込みパフォーマンス:dd if=/dev/zero bs=1024 count=1000000 of=1GB_file_to_write
  • 読み取りパフォーマンス:dd 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

dcflddはGNU ddのフォークであり、当時米国国防総省 コンピュータフォレンジック研究所に勤務していたニック・ハーバーによって開発された拡張版である。[ 25 ] [ 26 ] [ 27 ]と比較すると、dcflddは複数の出力ファイルを許可し、複数のチェックサムの同時計算をサポートし、ファイルマッチングの検証モードを提供し、操作の進行状況をパーセンテージで表示できる。2024年2月現在、最終リリースは2023年4月の1.9.1である。[ 28 ]dd

dc3dd

dc3ddは、米国国防総省サイバー犯罪センター(DC3)によるGNU ddの別のフォークです。dcflddの継続版と見なすことができ、GNUアップストリームの更新に合わせて更新されることを明記しています。2023年6月現在、最終リリースは2023年4月の7.3.1です。[ 29 ]

参照

参考文献

  1. ^ Austin Group. 「POSIX標準:dd呼び出し」。2010年3月10日時点のオリジナルよりアーカイブ2016年9月29日閲覧。
  2. ^ a b Gilles (2011). 「cloning - dd vs cat – is dd still relevant these days?」 Unix & Linux Stack Exchange . 2023年10月24日時点のオリジナルよりアーカイブ。 2020年4月24日閲覧
  3. ^ Chessman, Sam. 「ddコマンドの使い方とタイミング」 . CodeCoffee. 2008年2月14日時点のオリジナルよりアーカイブ。 2008年2月19日閲覧
  4. ^ 「ディスクを破壊せずにLinuxでddを使用する方法」 Opensource.com 2018年7月5日. 2020年10月11日時点のオリジナルよりアーカイブ。 2020年10月11日閲覧
  5. ^ Ritchie, Dennis (2004年2月17日). 「Re: UNIX ddコマンドの起源」 .ニュースグループalt.folklore.computers . Usenet: c0s1he$1atuh9$1@ID-156882.news.uni-berlin.de . 2011年1月22日時点のオリジナルよりアーカイブ。 2016年1月10日閲覧。ddは常にJCL ddカードにちなんで名付けられていた。 
  6. ^ a b Raymond, Eric S. "dd" . 2018年12月13日時点のオリジナルよりアーカイブ。 2008年2月19日閲覧
  7. ^ Struble, George (1969). 『アセンブラ言語プログラミング:IBM System/360』Reading, Mass., Addison-Wesley Pub. Co. p.  123 .
  8. ^ Shein, Barry (1990年4月22日). 「Re: Unix "dd" コマンドの語源」 .ニュースグループalt.folklore.computers . Usenet: 1990Apr22.191928.11180@world.std.com . 2023年10月24日時点のオリジナルよりアーカイブ。 2016年7月14日閲覧 
  9. ^ McIlroy, MD (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (技術レポート). CSTR. ベル研究所. 139.
  10. ^ a b c d edd  – シェルおよびユーティリティリファレンス、The Single UNIX 仕様、バージョン5、The Open Group
  11. ^ 「GNU ファイルユーティリティ リリース 1.0」 . groups.google.com . 2023年4月28日時点のオリジナルよりアーカイブ。 2023年4月28日閲覧
  12. ^ a bdd(1)  –  Linuxユーザーマニュアル– Manned.org のユーザーコマンド
  13. ^ “GNU's Who” . 2023年4月28日時点のオリジナルよりアーカイブ2023年4月28日閲覧。
  14. ^dd(1)  –  Plan 9プログラマーズ・マニュアル 第1巻
  15. ^ 「一部のGNUユーティリティのネイティブWin32ポート」 2000年8月15日. 2000年8月15日時点のオリジナルよりアーカイブ2023年4月28日閲覧。
  16. ^ 「GNUユーティリティのネイティブWin32ポート」unxutils.sourceforge.net . 2006年2月9日時点のオリジナルよりアーカイブ2022年2月23日閲覧
  17. ^dd(1)  –  FreeBSD一般コマンドマニュアル
  18. ^ 「CD、DVD、またはBDからISOイメージを作成する」ArchWiki2022年4月18日時点のオリジナルよりアーカイブ2022年4月18日閲覧
  19. ^ 「linux - ddでディスクのクローンを作成する際にconv=notruncを使用する理由とは?」 Stack Overflow。2013年12月11日。2014年3月24日時点のオリジナルよりアーカイブ。 2014年3月24日閲覧
  20. ^ Wright, Craig S.; Kleiman, Dave; S., Shyaam Sundhar R. (2008). 「ハードドライブのデータの上書き:ワイピングをめぐる大論争」. Sekar, R.; Pujari, Arun K. (編).情報システムセキュリティ、第4回国際会議、ICISS 2008、インド、ハイデラバード、2008年12月16日~20日. Proceedings . Lecture Notes in Computer Science. Vol. 5352. Springer. pp.  243– 257. doi : 10.1007/978-3-540-89862-7_21 . ISBN 978-3-540-89861-0
  21. ^ "dd_rescue" . garloff.de . 2001年5月16日時点のオリジナルよりアーカイブ2006年11月10日閲覧。
  22. ^ LAB Valentin (2011年9月19日). 「dd_rhelp 作者のリポジトリ」 . 2008年5月16日時点のオリジナルからアーカイブ2008年5月13日閲覧。重要事項:一時期、dd_rhelp はこの種の作業を実行できる唯一のツール(私の知る限り)でしたが、数年前からそうではなくなりました。Antonio Diaz が私のツールの理想的な代替ツール、GNU 'ddrescue' を開発しました。
  23. ^ “Ddrescue - GNUプロジェクト - フリーソフトウェア財団 (FSF)” . gnu.org . 2021年7月2日時点のオリジナルよりアーカイブ。 2016年7月22日閲覧
  24. ^ 「GNU Coreutils: dd 呼び出し」 . GNUオペレーティングシステムとフリーソフトウェア運動. 2019年8月22日時点のオリジナルよりアーカイブ。 2019年8月26日閲覧
  25. ^ 「DCFLDD at Source Forge」 Source Forge。2013年8月2日時点のオリジナルよりアーカイブ。 2013年8月17日閲覧
  26. ^ジェレミー・フェアクロス、クリス・ハーレー (2007).侵入テスターのためのオープンソースツールキット. Syngress. pp.  470– 472. ISBN 9780080556079
  27. ^ジャック・ワイルズ、アンソニー・レイエス (2011). 『サイバー犯罪とデジタルフォレンジックの最高傑作』 Syngress. pp.  408– 411. ISBN 9780080556086
  28. ^ 「dcfldd: フォレンジックとセキュリティのためのddの拡張バージョン」 GitHub。2020年10月31日時点のオリジナルよりアーカイブ2020年11月19日閲覧。
  29. ^ “dc3dd” . SourceForge . 2023年4月25日. 2020年2月25日時点のオリジナルよりアーカイブ2020年4月24日閲覧。