Linuxのddコマンドは、ファイルをコピーおよび変換するためのユーティリティであり、多くの実用的な用途があります。
この名前は、ddが「データ定義」を表す古いIBM JobControlLanguage関数から派生したものであることが示唆されています。 Linuxでは、略語は「Data Duplicator」、「Disk Dump」、またはソースに応じて他のさまざまな頭韻法を表します。
それは私を重要なポイントに導く痛烈なニックネーム「データ破壊者」を獲得したかもしれません。 ddコマンドを実行するときは注意してください。
このコマンドは、深刻なダメージを与える可能性があります。コストのかかる間違いを避けるために、必ず構文を再確認してください。ルートパーティションが破棄されて空のファイルに置き換えられるため、パーティション名を混乱させて苦しみを見守る人になりたくありません。
ddコマンドを理解する
ddコマンドの構文は次のとおりです。
dd if=<filename> of=<filename> [options]
このコマンドにはさまざまな用途があります。いくつかの一般的なアプローチを紹介します。
上記の構文では、「if」と「of」はそれぞれ入力ファイルと出力ファイルを表します。これがddのコア機能です。あるソースから別のソースにデータを複製します。 ddで物理メディアを使用する必要はありません。
キーボードからstdin(標準入力)を使用して入力を収集し、それをファイルにポイントすることができます。大文字と小文字をすばやく変換することも可能で、その他のさまざまな便利なテキスト編集ツールがマニュアルページに含まれています。
このプログラムの長い歴史をほのめかして、IBMについて先に触れました。このコマンドの元々の機能の1つは、実際には、IBMによって作成されたエンコーディングスキーマであるEBCDIDCをASCIIに変換することに集中していました。
これを使用してファイルをコピーすることもできますが、この単純なアプリケーションでは、ddよりもcpコマンドをお勧めします。 cpコマンドについて読むことができる記事があります。
dd
でコピーする場合 、デフォルトでは completeがコピーされることにも注意してください。 指定されたソースからの情報。
つまり、パーティションまたはディスクを複製しようとすると、空き領域もコピーされます。
したがって、たとえば、4 TBのハードドライブのクローンを作成する場合、ファイルの切り捨てやエラーを防ぐために、少なくとも4TBの宛先ドライブが必要になります。また、ディスクに1 TB相当のデータしかない場合でも、ddは残りの3TBのスペースをコピーします。これは悪い動きであり、多くの時間とリソースを浪費します。
ddに追加できるいくつかの制約と、この動作を変更するために実行できるその他の手段があります。実際には、ddと組み合わせて使用できるコントロールの数は圧倒的です。読者に最も役立つと思われるもののいくつかに対処しようとしますが、この記事の目的は、考えられるすべての機能を文書化するのではなく、ddの入門書を提供することです。
注意!練習には、仮想マシンを使用します
重要なファイルが破損したり破壊されたりしないように、目標を概念化して慎重に実行することをお勧めします。明らかに、私たちはあなたの情報の損失に対して責任を負いません。間違えたら。警告しなかったと言ってはいけません。
「実世界」のアセットを変更する前に、ダミーの仮想マシンで練習して慣れることをお勧めします。これは、ddコマンドを誤って使用すると、ファイルシステムを変更して損傷させる可能性があるためです。
このチュートリアルでは、Debianファミリー以外の何かを試して、VirtualBoxでFedora31のコピーをスピンアップすることにしました。
5つのddコマンドの実用例
警告といくつかのコンテキスト情報が邪魔にならないので、このシンプルで強力なコマンドのいくつかのアプリケーションに進む準備ができています。
例1:ディスクのクローン化
ddを使用すると、あるディスクを別のディスクにクローンするのが非常に簡単になります。私の例では、「sda」と「sdb」という名前の2つのディスクがあります。
「sda」は、データだけでなく、ドライブのコンテンツ全体を使用して「sdb」に自分自身をコピーしようとすることに注意してください。
セクターの未使用スペースに対応するために、出力ファイルに十分なスペースを割り当てる必要があります。ドライブを現在データで埋められている正確なサイズに再パーティション化することもできます。この方法をお勧めします。操作の実行にかかる時間が短縮され、より有用なドキュメントが作成されます。
ディスクのクローンを作成する準備ができたら、fdisk
を実行できます。 ディスク、それらのパーティション、およびそれらの容量を識別するため。
sudo fdisk -l
このコマンドを実行すると、使用可能なドライブとパーティション、およびそれぞれのサイズが一覧表示されます。これは、ターゲットデバイスを正しく識別するのに役立ちます。
繰り返しになりますが、このアプリケーションでは「sda」と「sdb」という名前を使用しており、同じサイズであると想定しています。
[[email protected] ~]$ sudo dd if=/dev/sda of=/dev/sdb
[[enter pw for sudo]]
dd: writing to 'dev/sdb': No space left on device
8108369+0 records in
8108369+0 records out
4151484416 bytes (4.2 GB, 3.9 GiB) copied, 12.3602 s 336 MB/s
出力により、書き込みが成功したことがわかります。「sdb」にスペースが残っていないというメッセージは無視できます。
要約には、コピーされたデータの量、所要時間、およびコピーの速さもリストされています。ブロックサイズについて説明するときに、これについてもう少し詳しく見ていきます。
例2:ディスクパーティションのバックアップ
デバイスのクローンを作成する手順とパーティションをバックアップする手順は似ています。ターゲットファイルをデバイスにする代わりに、「。img」(生のディスクイメージ)ファイルを作成できます。
システムのホームディレクトリ用に「sda2」に別のパーティションがあり、現在のディレクトリにある「home_backup.img」という名前のファイルにバックアップするとします。
dd if=/dev/sda2 of=home_backup.img
とても簡単です!したがって、今では、適切なバックアップルーチンがないという言い訳はできません。
確かに、それは簡単でしたが、学ぶべきことは常にたくさんあります。
ddコマンドでのブロックサイズの処理
次の例に入る前に、BS、つまりブロックサイズについて話しましょう。これがddコマンドで値を指定するために使用されているのを見たことがあれば、なぜそこにあるのか不思議に思うかもしれません。
あなたの好奇心があなたをインターネット検索に導いたなら、私はあなたがおそらくまだであることを確信しています。 なぜそこにあるのか疑問に思います。
わかりやすい言葉で説明できるように頑張ります。ブロックデバイスは通常、有限のストレージを備えた物理メディアです。
特定のデータブロックを探すことで、ディスクなどのメディアで情報を検索できます。したがって、たとえば、システムはCD-ROMを読み取り、ブロック500(任意の数)から始まる情報を検索できます。また、情報を「ブックエンド」するために使用することもでき、ブロック500からブロック1500までの情報を使用することもできます。
これらのブロックは、システムが効率的に分析できるようにセグメント化できます。これは、メディアのストレージスペース、またはメディアが関連付けられる可能性が高い標準のシステム仕様を反映している可能性があります。
独自に定義されたブロックサイズ(2048)を持つCD-ROMの例を続けます。各ブロックには、最大2048バイトが必要です。ブロックに含まれるデータが100バイトしかない場合でも、同じ2048バイトを使用します。
ddの実行を高速化するため、またはデータの破損を防ぐために、ブロックサイズを定義したい場合があります。 CD-ROMの例に戻ると、異なるサイズのブロックを作成すると、データの読み取り時に異常が発生する可能性があります。
未定義のままにすると、ddは512のブロックサイズを使用します。これは、一般的なハードドライブが読み取ることができる最小のブロックサイズです。
メディアが特定のブロックサイズに制限されていない場合は、パフォーマンス(書き込み時間)に合わせてメディアを調整しても安全です。いくつかの例を見てみましょう。
ブロックサイズが指定されていない場合のパフォーマンス
[[email protected] ~]$ sudo dd if=/dev/sda of=home_backup.img
[sudo] password for linuxhandbook:
dd: writing to 'home_backup.img': No space left on device
31974953+0 records in
31974952+0 records out
16371175424 bytes (16 GB, 15 GiB) copied, 113.848 s, 144 MB/s
ブロックサイズ1024のパフォーマンス
[[email protected] ~]$ sudo dd if=/dev/sda of=home_backup.img bs=1024
[sudo] password for linuxhandbook:
dd: error writing 'home_backup.img': No space left on device
15987477+0 records in
15987476+0 records out
16371175424 bytes (16 GB, 15 GiB) copied, 75.4371 s, 217 MB/s
プロセスがより高速で実行されたことがわかります。ブロックサイズが4096の別の実行は、327 MB/sの速度で高速でした。システムキャッシングも速度に影響を与える可能性がありますが、それは別の日のトピックです。
出入りするレコード数の違いに気づいたかもしれません。これは、出力ファイルが同じサイズのままであるにもかかわらず、各ブロックのサイズを変更しているため、個々のブロックの容量を変更しているためです。このため、bs値を調整すると、意図しない結果が生じる可能性があります。たとえば、チェックサムの実行時に不一致が発生する可能性があります。
例3:データを削除してディスクをゼロにする
以前のすべての警告を覚えていますか?このコマンドは、「sda」のすべてのブロックをゼロに置き換えます。
dd if=/dev/zero of=/dev/sda
これはどのように作動しますか?基本的に、他のすべてのinおよびoutddコマンドと同じです。 「/dev/ zero」とは何ですか?
これは、Unix / Linuxオペレーティングシステムに含まれている疑似デバイスであり、ファイルの最後に到達するまでファイルにゼロを書き込みます。
同様に、ランダムなデータビットを出力する「dev/random」を使用できます。生の画像ファイルを使用してコンテンツを置き換える場合は、ddを使用すると未使用の領域がすでにコピーされるため、これは不要な場合があります。
一部の厄介な人々は、さまざまなLinuxフォーラムでこのコマンドを実行する際に無防備なユーザーをだましていることに注意してください。このコマンドの機能がわかったので、この邪悪ないたずらの餌食になることはありません。
例4:CD/DVDから.ISOを作成する
コンピュータにまだCD-ROMドライブがある場合は、CD-ROMドライブから直接コピーできます。先ほど、CD-ROMの標準バイトサイズは2048であると述べました。変換の問題を回避するために、それに一致するようにバイトサイズを設定してから、他のいくつかのコマンドを追加します。
dd if=/dev/cdrom of=space_jam_dvd.iso bs=2048 conv=noerror,sync
いくつか説明させてください。 conv =noerrorを使用 、エラーは無視されます。プログラムは停止せずに最後のブロックまで続行されます。彼らのために止まることはありません。
「noerror」と組み合わせて使用すると、「sync」により、欠落しているデータブロックにnull情報が自動的に埋め込まれます。
これは、既存のデータが同じ場所にマッピングされ、おそらく可能な限り多くのコンテンツが保持されることを意味します。
ソースファイルと宛先ファイルにこれらの操作に同じ「bs」が設定されていることを確認することが重要です。そうしないと、意図した結果が得られません。
例5:起動可能なUSBを作成する
ddを使用して起動可能なUSBを作成できます。これは、予想どおりに簡単です。実際、これはddコマンドの最も一般的な使用法の1つです。
ここには、もう1つのステップがあります。 「dd」を実行する前に、mkfsコマンドを使用してファイルシステムをUSBにビルドします。
オプションがない場合は、デフォルトのext2システムを使用します。したがって、準備するUSBが「sdb」と呼ばれ、ファイルシステムをext4に変更する場合、次のコマンドを実行します。
sudo mkfs.ext4 /dev/sdb
Windowsシステムで使用する場合は、コマンドの最初の部分をmkfs.ntfsに置き換えることができます。
次の構文を使用することもできます:
mkfs -t [for type] $filesystem.
ブータブルメディアの準備ができたら、ddコマンドを続行できます。
dd if=someFile.iso of=/dev/sdb
.isoマウント可能イメージを使用して、USBデバイスに対応するドライブ名にコピーします。
結論
読んでくれてありがとう。 「dd」でこの入門書を楽しんでいただけたでしょうか。このコマンドを使用できる方法はたくさんあります。私はもっと便利な例をたくさん取り上げようとしました。見たいものや直接の質問がある場合は、私がお手伝いしたいと思います。コメント欄であなたの考えを教えてください。