| 原作者 | ケン・トンプソン ( AT&T ベル研究所) |
|---|---|
| 開発者 | さまざまなオープンソースおよび商用開発者 |
| 初回リリース | 1974年6月 |
| リポジトリ | コアユーティリティ: git.savannah.gnu.org/cgit/coreutils.git/ |
| 書かれた | プラン9: C |
| オペレーティング·システム | Unix、Unix ライク、Plan 9、Inferno、Windows |
| プラットフォーム | クロスプラットフォーム |
| タイプ | 指示 |
| ライセンス | coreutils : GPLv3+ プラン 9: MIT ライセンス |
dd はUnix、Plan 9、Inferno、Unix 系オペレーティングシステムおよびそれ以降のオペレーティングシステム用のコマンドラインユーティリティであり、その主な目的はファイルの変換とコピーです。[1] Unix では、ハードウェアのデバイスドライバ (ハードディスクドライブなど) と特別なデバイスファイル( /dev/zeroや/dev/randomなど) が通常のファイルと同様にファイルシステムに表示されます。ddは、それぞれのドライバに機能が実装されていれば、これらのファイルを読み書きすることもできます。 そのため、dd は、ハードドライブのブートセクターのバックアップや、一定量のランダムデータの取得などのタスクに使用できます。 ddプログラムは、コピー時にデータの変換 (バイトオーダーのスワップ、 ASCIIとEBCDIC のテキストエンコーディング間の変換など) を実行することもできます。[2]
歴史
1974年、ddコマンドはバージョン5 Unixの一部として登場した。デニス・リッチーによると、このコマンドの名前はIBMのジョブ制御言語(JCL)のDD文に由来しており、 [3] [4] DD文では「データ定義」の略語である。[5] [6]ダグラス・マキロイによると、ddは「元々はDECコンピュータのASCII、リトルエンディアン、バイトストリームの世界とIBMのEBCDIC、ビッグエンディアン、ブロック化された世界との間でファイルを変換することを目的としていた」ため、その構文の文化的背景を説明できる。[7]エリック・S・レイモンドは、このコマンドの構文が他のUnixコマンドよりもJCL文に似ていることから、「インターフェースのデザインは明らかにいたずらだった」と考えている。[4]
1987年、ddコマンドはX/Open Portability Guide 1987年第2版で規定されました。これは、 Single UNIX仕様の一部であるIEEE Std 1003.1-2008 ( POSIX )に継承されています。[8]
1990年にDavid MacKenzieはコマンドを含むGNU fileutils(現在はcoreutilsddの一部)を発表しました。[9]これはPaul Rubin、David MacKenzie、Stuart Kempによって書かれました。[10] 1991年以来、Jim Meyeringがメンテナーを務めています。[11]
1995年にPlan 9第2版がリリースされ、ddコマンドインターフェースが再設計され、JCLステートメントスタイルではなく従来のコマンドラインオプションスタイルが採用されました。[12]
少なくとも1999年以来、[13] UnxUtilsの下でMicrosoft Windows用のネイティブ Win32 ポートが存在していました。[14]
ddタイプミスを含むドライブの消去機能があるため、ユーモラスに「ディスクデストロイヤー」と呼ばれることもあります。[15]
使用法
ddのコマンドライン構文は、他の多くの Unix プログラムとは異なります。コマンドラインオプションには、より標準的な形式ではなく、構文を使用します。デフォルトでは、dd はstdinから読み取り、 stdoutに書き込みますが、これらはif (入力ファイル) およびof (出力ファイル) オプションを使用して変更できます。[8]option=value-option value--option=value
ddの特定の機能は、直接メモリ アクセスのオプションを実装するddの機能など、コンピュータ システムの機能に依存します。実行中のddプロセスにSIGINFOシグナル (Linux では USR1 シグナル) を送信すると、I/O 統計が標準エラーに一度出力され、コピーが続行されます。ddはキーボードから標準入力を読み取ることができます。ファイルの終わり(EOF) に達すると、dd は終了します。シグナルと EOF はソフトウェアによって決定されます。たとえば、Windowsに移植された Unix ツールはEOF に関して異なります。Cygwinは+ (通常の Unix EOF)を使用し、 MKS Toolkit は+ (通常の Windows EOF) を使用します。CtrlDCtrlZ
dd 呼び出しの非標準化部分は実装によって異なります。
出力メッセージ
完了すると、dd はデータ転送の統計情報をstderrストリームに出力します。このフォーマットは POSIX で標準化されています。 [8] : STDERR GNU dd のマニュアルページではこのフォーマットについて説明されていませんが、BSD マニュアルでは説明されています。
「レコード入力」行と「レコード出力」行にはそれぞれ、転送された完全なブロックの数と、完全なブロックが読み取られる前に物理メディアが終了したり、物理エラーによって完全なブロックの読み取りが妨げられたりしたために転送された部分的なブロックの数が表示されます。
ブロックサイズ
ブロックは、一度に読み書きまたは変換されるバイト数を測定する単位です。コマンドラインオプションでは、入力/読み取り ( ibs ) と出力/書き込み ( obs ) で異なるブロックサイズを指定できますが、ブロックサイズ ( bs ) オプションはibsとobs の両方を上書きします。入力ブロックサイズと出力ブロックサイズのデフォルト値はどちらも 512 バイトです (ディスクの従来のブロックサイズであり、POSIX で規定されている「ブロック」のサイズ)。コピーのカウントオプションはブロック単位で測定され、読み取りのスキップカウントと書き込みのシークカウントも同様です。変換操作は「変換ブロックサイズ」( cbs )によっても影響を受けます。 [8] : オペランド
ブロックサイズオプションに指定された値は、10進数(基数10)の整数バイト数として解釈されます。ブロックサイズがバイトより大きい単位の整数であることを示すサフィックスを含めることもできます。POSIXは、512に対してサフィックスb(ブロック)と1024に対してサフィックスk(キビバイト)のみを規定しています。 [8] :オペランド 実装は、サポートする追加のサフィックスによって異なります。(フリー)BSDは、テビバイト、エクスビバイト、ペビバイト、ゼビバイト、ヨビバイトに小文字のm(メビバイト)、g(ギビバイト)などを使用します。[16] GNUは同じ単位にMとG を使用し、 kB、MB、GBをそれらのSI単位(キロバイト)として使用します。[10]例えば、GNU ddの場合、bs=16Mは16メビバイト(16777216バイト)のブロックサイズを示し、bs=3kBは3000バイトを指定します。
さらに、一部の実装では、x文字をブロックサイズとカウントパラメータの両方の乗算演算子として認識します。たとえば、bs=2x80x18bは2 × 80 × 18 × 512 =と解釈されます。1 474 560 バイト、1440 KiBフロッピーディスクの正確なサイズ。これはPOSIXで必須です。[8] : オペランド この機能をサポートしていない実装では、POSIXシェル算術構文を使用できます。
bs=$((2*80*18))b
ブロック サイズは、 ddコマンドのコピーのパフォーマンスに影響します。小さな読み取りや書き込みを多数実行すると、大きな読み取りや書き込みを少数実行するよりも遅くなることがよくあります。大きなブロックを使用すると、より多くの RAM が必要になり、エラー回復が複雑になることがあります。ddをテープ ドライブやネットワークなどの可変ブロック サイズ デバイスで使用する場合、使用されるネットワーク プロトコルに応じて、ブロック サイズによってテープ レコード サイズまたはパケットサイズが決まる場合があります。
用途
ddコマンドはさまざまな目的に使用できます。単純なコピー コマンドの場合、ドメイン固有の代替コマンドよりも遅くなる傾向がありますが、「任意の時点でファイルを上書きまたは切り捨てたり、ファイル内を検索したり」という独自の機能に優れています。これは、Unix ファイル API へのかなり低レベルのインターフェイスです。[17]
以下の例では、主にブロック サイズ引数で GNU dd の使用を前提としています。移植可能にするには、eg をbs=64Mシェルの算術式または(ビット シフトと同等に記述) に置き換えます。
bs=$((64*1024*1024))bs=$((64 << 20))
データ転送
dd はファイル、デバイス、パーティション、ボリューム間でデータを複製できます。データはこれらのいずれに対しても入力または出力できますが、パーティションへの出力に関しては重要な違いがあります。また、転送中に、メディアに合わせてconvオプションを使用してデータを変更することもできます。(ただし、この目的ではdd はcatよりも遅くなります。) [17]
noerrorオプションはエラーがあっても処理を続行することを意味し、syncオプションは出力ブロックにパディングが行われることを意味します。
インプレース変更
dd はデータをその場で変更できます。たとえば、次のコードはファイルの最初の 512 バイトを null バイトで上書きします。
dd if= /dev/zero of=path/to/file bs=512 count=1 conv=notrunc
notrunc変換オプションは、出力ファイルを切り捨てないことを意味します。つまり、出力ファイルがすでに存在する場合は、指定されたバイトを置き換え、出力ファイルの残りの部分はそのままにします。このオプションがない場合、dd は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
上記のデータ変更例と比較すると、ddの出力ファイルがブロックデバイスの場合は効果がないため、notrunc変換オプションは必要ありません。 [19]
bs =16Mオプションは、dd が一度に 16メビバイトを読み書きするようにします 。最新のシステムでは、ブロック サイズをさらに大きくすると高速化される可能性があります。ドライブをランダム データで埋めるには、ドライブをゼロにするよりも時間がかかることに注意してください。これは、ランダム データは CPU によって作成される必要があるのに対し、ゼロの作成は非常に高速であるためです。最新のハード ディスク ドライブでは、ドライブをゼロにすると、ドライブに含まれるほとんどのデータが永久に回復不能になります。[20]ただし、フラッシュ メモリなどの他の種類のドライブでは、データ残留 によって多くのデータがまだ回復できる可能性があります。
最近のハードディスクドライブには、ドライブのアクセス可能部分とアクセス不可能な部分をすべて永久に安全に消去するように設計されたSecure Eraseコマンドが含まれています。このコマンドは、一部のソリッドステートドライブ(フラッシュドライブ) でも機能します。2017 年現在、 USB フラッシュドライブやSecure Digitalフラッシュメモリでは機能しません。[引用が必要] 使用可能な場合、dd を使用するよりも高速で、より安全です。[引用が必要] Linuxマシン では、 hdparmコマンドの--security-erase-enhancedオプションを介してアクセスできます。
シュレッドプログラムは、複数の上書きと、個々のファイルのより安全な削除を提供します。
データ復旧
データ復旧には、アクセスできない可能性のある部分があるドライブからの読み取りが含まれます。は、dd柔軟なスキップ ( seek) やその他の低レベル設定により、このジョブに適しています。ddただし、通常の は、ユーザーがエラー メッセージを読み、読み取り可能な領域を手動で計算する必要があるため、使いにくいです。また、単一のブロック サイズでは、トレードオフを行う必要があるため、復旧の粒度が制限されます。つまり、小さいブロック サイズを使用してより多くのデータを復旧するか、大きいブロック サイズを使用して速度を上げるかのどちらかになります。
dd_rescue[21]と呼ばれるCプログラムは 1999年10月に書かれました。これはの変換機能を廃止しdd、ジレンマに対処するために2つのブロックサイズをサポートしています。大きなサイズを使用した読み取りが失敗した場合、できるだけ多くのデータを収集するために小さなサイズにフォールバックします。また、逆方向に実行することもできます。2003年には、を使用するプロセスを自動化し、どの領域が読み取られたかを自動的に追跡するdd_rhelpスクリプトが書かれました。 [22]dd_rescue
2004 年に、GNU は とは無関係なddrescueddという別のユーティリティを作成しました。これはより洗練された動的ブロック サイズ アルゴリズムを持ち、内部で読み込まれた内容を追跡します。 と の作者はどちらも、自分たちの実装よりも ddrescue のほうが優れていると考えています。[23]新しい GNU プログラムを古いスクリプトから区別するために、GNU の には(freecode.com および freshmeat.net での名前)、( Debianパッケージ名)、( openSUSEパッケージ名) などの別名が使用されることがあります。
dd_rescuedd_rhelpddrescueaddrescuegddrescuegnu_ddrescue
と呼ばれる別のオープンソース プログラムは、高度なアルゴリズムを使用しますが、独自のプログラミング言語インタープリターsavehd7のインストールも必要です。
ドライブパフォーマンスのベンチマーク
ドライブのベンチマーク テストを実行し、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
進捗状況インジケーター
dd は主にフィルターとして設計されたプログラムであるため、通常は進行状況を表示しません。これは、実行中の GNU ddプロセス ( BSD システムではINFO ) にUSR1シグナルを送信することで解決できます。その結果、dd は現在転送されたブロックの数を出力します。
次のワンライナーでは、 dd-pid がddのプロセス ID に置き換えられ、転送が完了するまで 10 秒ごとに進行状況が継続的に出力されます。
while kill -USR1dd-pid; do sleep 10 ; done
GNU ddの新しいバージョンでは、転送統計を定期的にstderrに出力することを可能にするstatus=progressオプションをサポートしています。[24]
フォーク
dcfldd
dcflddはGNU ddのフォークであり、当時米国国防総省 コンピュータフォレンジック研究所に勤務していたニック・ハーバーによって開発された拡張バージョンである。 [25] [26] [27] ddと比較すると、 dcflddは複数の出力ファイルを許可し、複数のチェックサムの同時計算をサポートし、ファイルマッチングの検証モードを提供し、操作の進行状況をパーセンテージで表示できる。2024年2月現在、最終リリースは2023年4月の1.9.1である。 [28]
dc3dd
dc3ddは、米国国防総省サイバー犯罪センター(DC3)によるGNU ddの別のフォークです。dcflddの継続として見ることができ、GNUアップストリームが更新されるたびに更新することを目標としています。2023年6月現在、最後のリリースは2023年4月の7.3.1です。 [29][アップデート]
参照
- バックアップ
- ディスクのクローン作成
- ディスクコピー
- ディスクイメージ
- .img (ファイル名拡張子)
- Unixコマンドのリスト
- ddrescue破損したファイルからデータをコピーするGNUバージョン
参考文献
- ^ Austin Group. 「POSIX 標準: dd 呼び出し」。2010 年 3 月 10 日時点のオリジナルよりアーカイブ。2016 年 9 月 29 日閲覧。
- ^ Chessman, Sam. 「dd コマンドをいつどのように使用するか?」 CodeCoffee. 2008 年 2 月 14 日時点のオリジナルよりアーカイブ。 2008 年 2 月19 日閲覧。
- ^ 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 カードにちなんで名付けられました。
- ^ ab Raymond, Eric S. "dd". 2018年12月13日時点のオリジナルよりアーカイブ。2008年2月19日閲覧。
- ^ Struble, George (1969). アセンブラ言語プログラミング: IBM System/360. Reading, Mass., Addison-Wesley Pub. Co. p. 123.
- ^ Shein, Barry (1990 年 4 月 22 日). 「Re: Unix "dd" コマンドの語源」.ニュースグループ: alt.folklore.computers. Usenet: 1990Apr22.191928.11180@world.std.com. 2023 年 10 月 24 日時点のオリジナルよりアーカイブ。 2016 年 7 月 14 日閲覧。
- ^ McIlroy, MD (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (技術レポート). CSTR. Bell Labs. 139.
- ^ abcdef – シェルおよびユーティリティ リファレンス、The Single UNIX 仕様、バージョン 4、The Open Groupより
- ^ 「GNU ファイルユーティリティリリース 1.0」。groups.google.com。 2023 年 4 月 28 日時点のオリジナルよりアーカイブ。2023 年 4 月 28 日閲覧。
- ^ ab – Linuxユーザーマニュアル– ユーザーコマンド
- ^ “GNU's Who”. 2023年4月28日時点のオリジナルよりアーカイブ。2023年4月28日閲覧。
- ^ – Plan 9プログラマーズマニュアル、第 1 巻
- ^ 「GNU ユーティリティのネイティブ Win32 ポート」 2000 年 8 月 15 日。2000-08-15 時点のオリジナルよりアーカイブ。
- ^ 「一部の GNU ユーティリティのネイティブ Win32 ポート」unxutils.sourceforge.net。2006 年 2 月 9 日時点のオリジナルよりアーカイブ。2022 年 2 月 23 日閲覧。
- ^ 「ディスクを破壊せずに Linux で dd を使用する方法」。Opensource.com。2018年 7 月 5 日。2020 年 10 月 11 日時点のオリジナルよりアーカイブ。2020年 10 月 11 日閲覧。
- ^ – FreeBSD一般コマンドマニュアル
- ^ ab Gilles (2011). 「cloning - dd vs cat – is dd stilllevant these days?」Unix & Linux Stack Exchange . 2023-10-24 時点のオリジナルよりアーカイブ。2020-04-24に取得。
- ^ 「CD、DVD、またはBDからISOイメージを作成する」。ArchWiki 。 2022年4月18日時点のオリジナルよりアーカイブ。 2022年4月18日閲覧。
- ^ 「linux - dd を使用してディスクを複製するときに conv=notrunc を使用する理由」。Stack Overflow。2013 年 12 月 11 日。2014 年 3 月 24 日にオリジナルからアーカイブ。2014年 3 月 24 日に取得。
- ^ Wright, Craig S.; Kleiman, Dave; S., Shyaam Sundhar R. (2008). 「ハード ドライブのデータの上書き: ワイピングに関する大論争」。Sekar, R.、Pujari, Arun K. (編)。情報システム セキュリティ、第 4 回国際会議、 ICISS 2008、インド、ハイデラバード、2008 年 12 月 16 ~ 20 日。議事録。コンピュータ サイエンスに関する講義ノート。第 5352 巻。Springer。pp. 243 ~ 257。doi :10.1007/978-3-540-89862-7_21。
- ^ "dd_rescue". garloff.de . 2001-05-16 にオリジナルからアーカイブ。2006-11-10に閲覧。
- ^ LAB Valentin (2011 年 9 月 19 日)。「dd_rhelp 作者のリポジトリ」。2008 年 5 月 16 日のオリジナルからアーカイブ。2008年5 月 13 日閲覧。
重要な注意: しばらくの間、dd_rhelp はこの種の作業を行う唯一のツールでした (AFAIK)。しかし、数年前から、それはもはや真実ではありません。Antonio Diaz が私のツールの理想的な代替品を作成しました: GNU 'ddrescue'。
- ^ 「Ddrescue - GNU プロジェクト - フリーソフトウェア財団 (FSF)」。gnu.org。2021年 7 月 2 日時点のオリジナルよりアーカイブ。2016 年 7 月 22 日閲覧。
- ^ 「GNU Coreutils: dd 呼び出し」。GNUオペレーティング システムとフリー ソフトウェア運動。2019 年 8 月 22 日時点のオリジナルよりアーカイブ。2019年 8 月 26 日閲覧。
- ^ 「DCFLDD at Source Forge」。Source Forge。2013年8月2日時点のオリジナルよりアーカイブ。2013年8月17日閲覧。
- ^ Jeremy Faircloth、Chris Hurley (2007)。侵入テスト担当者のオープンソースツールキット。Syngress。pp. 470–472。ISBN 9780080556079。
- ^ ジャック・ワイルズ、アンソニー・レイエス (2011)。『サイバー犯罪とデジタルフォレンジックのベストブック』。Syngress。pp. 408–411。ISBN 9780080556086。
- ^ 「dcfldd: フォレンジックとセキュリティのためのddの拡張バージョン」。GitHub。2020年10月31日時点のオリジナルよりアーカイブ。2020年11月19日閲覧。
- ^ “dc3dd”. SourceForge . 2023年4月25日. 2020年2月25日時点のオリジナルよりアーカイブ。 2020年4月24日閲覧。
外部リンク
- : ファイルを変換してコピーする – シェルおよびユーティリティ リファレンス、The Single UNIX 仕様、バージョン 4、The Open Group
- – Plan 9プログラマーズマニュアル、第 1 巻
- – インフェルノ一般コマンドマニュアル
- dd: GNU Core Utilitiesのマニュアル ページ。
- – DarwinとmacOS の一般コマンドマニュアル
- Windows 用の dd。
- savehd7 – 破損の可能性があるハードディスクのパーティションを保存する
- Softpanorama dd ページ。
- Linux Questions Wiki の DD。
- ddpt – ブロックデバイスであるファイルに特化したバリアント
- sg_dd – SCSI コマンド セットを使用するデバイス向けの Linux 専用バリアント
≥
