dd
100%

デバイス · レッスン 7

dd

`dd` がブロックストリームをコピーする仕組みと、入力、出力、サイズの誤りによる破壊を防ぐ方法を学びます。

dd は、指定されたブロックサイズと変換を適用しながら、入力ストリームから出力ストリームへデータをコピーします。ファイルシステム、パーティション境界、出力先に大切なデータがあるかどうかは理解しません。そのため、イメージや生デバイスの処理に役立つ一方、対象を誤れば直ちに破壊的な結果となります。

入力、出力、ブロックサイズ

コマンドの一般的な形は次のとおりです。

$ dd if=input.img of=output.img bs=4M status=progress
  • if= は入力を選びます。省略すると、dd は標準入力から読み取ります。
  • of= は出力を選びます。省略すると、dd は標準出力へ書き込みます。
  • bs= は通常のコピーで入力と出力のブロックサイズを設定します。
  • status=progress は GNU dd に転送の進捗を定期的に報告させます。

dd はブロックをコピーするのであり、本質的に1バイトずつコピーするわけではありません。大きな bs はシステムコールのオーバーヘッドを減らせる場合がありますが、最適な値はデバイス、アライメント、キャッシュ、ワークロードによって異なります。コピーされる論理データ自体は変わりません。

dd が書き込む宛先を選択するオペランドはどれですか?

コピー量を制限する

count= は処理する入力ブロック数を制限します。通常の入力ファイルでは次のように使います。

$ dd if=source.img of=prefix.img bs=1M count=2 status=progress

これは最大1 MiBの入力ブロックを2個要求するため、最大2 MiBをコピーします。パイプのようなストリームでは短い読み取りにより単純な掛け算どおりにならない場合があります。完全な入力ブロックが必要なら、GNU dd には iflag=fullblock があります。2進単位と接尾辞の構文は、ローカル実装に従って区別してください。

通常ファイルに対する bs=1M count=2 は、最大でどれだけのコピーを要求しますか?

イメージをブロックデバイスへ書き込む

生の復元は次のような形になります。

$ sudo dd if=backup.img of=/dev/sdX bs=4M status=progress conv=fsync

/dev/sdX は意図的に置かれたプレースホルダーであり、そのままコピーして実行するコマンドではありません。置き換える前に次を行います。

  1. すべての大切なデータについて、復元テスト済みのバックアップを保持する。
  2. lsblk、udevadm などでモデル、シリアル、サイズ、転送方式、永続リンクを確認し、対象を特定する。
  3. 対象のパーティションがマウント済み、swap として使用中、RAID や LVM の一部、または別サービスからオープン中でないことを確認する。
  4. 取り外し、再起動、トポロジー変更の後にはデバイスを再確認する。
  5. イメージが収まることと、デバイス全体へ書き込む意図が本当にあることを確認する。

出力デバイスは先頭から上書きされます。if と of を逆にする、システムディスクを選ぶ、パーティションのつもりでディスク全体を指定するといった誤りは、確認プロンプトなしにデータを破壊します。

生デバイスへ書き込む前に、モデル、シリアル、サイズ、使用状況を確認すべき最も強い理由はどれですか?

整合性のあるイメージを作成する

ファイルシステムが変化している最中に稼働中のブロックデバイスを読み取ると、内部的に整合しないイメージが作られる可能性があります。アンマウントしたファイルシステム、アプリケーション整合性のあるスナップショット、または文書化されたフリーズ/スナップショット手順を優先してください。データベースや仮想マシンでは、それぞれ固有の静止手順が必要な場合があります。

生デバイスイメージは、ファイルシステムのメタデータや未使用領域を含むブロックをコピーします。そのため、ファイル単位のバックアップよりはるかに大きくなる場合があり、複製を元のデバイスと同時にマウントする前に変更すべき識別子まで複製する可能性があります。

マウントされ、変化しているファイルシステムのイメージ作成が信頼できない場合があるのはなぜですか?

完了と検証

I/O エラーなしでコマンドが完了しても、意図した入力元と出力先を選んだことや、イメージが利用可能であることは証明できません。正確な識別情報とサイズを記録し、バッファー済み出力がストレージへ到達したことを確認し、適切に範囲を限定した読み戻しまたは暗号学的ハッシュを比較し、バックアップ計画に従って復旧をテストしてください。

SSD、フラッシュ変換層、シンプロビジョニングされたストレージ、スナップショット、再配置済みセクターに対して、dd の上書きを確実な安全消去として宣伝してはいけません。デバイスとプラットフォームが対応するサニタイズ機能を、明示的なデータ破棄ポリシーとともに使ってください。

dd の終了ステータスが0でも、それだけでは何を証明できませんか?

レッスン完了

dd を完了しました

dd を、操作意図を理解しない生のブロックコピーツールとして捉えられるようになりました。

  • if、of、bs、count を区別する。

  • 永続的な対象識別情報と、稼働中のすべての利用元を確認する。

  • 整合したストレージ状態からイメージを作成する。

  • コピー後にフラッシュ、検証、復旧テストを行う。

  • 生デバイスへの出力はすべて破壊的になり得ると考える。

学習進捗を保存

無料アカウントを作成してこのレッスンを保存し、どのデバイスからでも学習を続けられます。

無料アカウントを作成
デバイス に戻る