新しいデバイス (USB スティックまたは IDE/SATA HDD) が PC に接続されたときに、オペレーティング システム レベルで、つまりカーネル レベルからユーザー空間レベルまで何が起こるのかをもっとよく理解したいと思っています。さらに、"dd" コマンドがどのレベルで機能するかを知りたいです。
私が理解しているのは、外付けドライブが接続されると、カーネルがこのイベントを「傍受」し、udevd デーモンのおかげで常にリッスンしている udev システムに通知するということです。Udisks は、ブロック デバイスに関する情報を収集するためのインスタンスです。Udisks には、このために udev が必要です。Udisks は d-bus に接続されています (dbus は udisks だけが使用するものではなく、多くのプログラムが情報交換に dbus を使用します)。d-bus を介して、誰でも udisks に接続し、現在のデバイス リストを問い合わせることができます。
質問: dd コマンドを起動すると、ドライブをコピー/イメージ化するために d-bus に接続されるのでしょうか?
また、Linux レベルを示す Wikipedia から取得した画像も添付します。その画像で、接続されたデバイスから dd コマンドのインスタンスまでのパスを教えていただけますか?
前もって感謝します。
ヴィンチェンツォ。
答え1
それは実際には2つの質問です:
1) はdd
、 と同様に、通常のユーザー アプリケーションですcp
。 と同様にcp
、 は「読み取り」システム コールを発行し、結果を取得してから「書き込み」システム コールを発行してコピーします。 とは異なりcp
、 のブロック サイズを設定できます。dd
これが、dd
ブロック デバイスのコピーに従来から が使用されてきた理由です。しかし、今日では、cp /dev/sdb /dev/sdc
は とまったく同じことを実行しdd
、速度も同じくらいです。これは、 の最新バージョンcp
(おそらく古いバージョンとは異なります) も、常に完全なブロックの読み取りと書き込みを行うためです。
また、「ディスク レイアウト」などを取得するために特別な処理も行わcp
ず、オペレーティング システムが終了を通知するまで読み取るだけです。dd
2)
外付けドライブが接続されると、カーネルはこのイベントを「傍受」します。
カーネルは実際にはこのイベントを傍受しません。すべてのドライバー レベルのアクションはカーネル内ですでに実行されているためです。したがって、USB デバイスを接続すると、USB ホスト コントローラー ハードウェアがそれを認識し、割り込みを生成し、USB ホスト コントローラー ドライバーがそれに反応し、その後、USB スタックのさまざまな部分が新しいデバイスの列挙、そのタイプの識別、潜在的なドライバーの識別、それらのドライバーによって作成された新しいブロック デバイスの接続などを開始します。
udev
カーネルがこれらのイベントをユーザー空間に伝達するための単なるメカニズムであり、ユーザー空間は、たとえばシンボリックリンクを作成することによって、それらに反応することができます。
udevd デーモンのおかげで常にリッスンしている udev システムに通知します。
Udisks は、ブロック デバイスに関する情報を収集するためのインスタンスです。
udisks
デスクトップは D-Bus 上ですべてを実行するため、デスクトップがブロック デバイスに関する情報を取得するために使用するデスクトップ デーモンです。D udisks
-Bus デスクトップを実行していない場合は、実際には必要ありません (実際、私のマシンの一部では実行されません)。
d-bus 経由で、誰でも udisks に接続し、現在のデバイスのリストを問い合わせることができます。
他の手段、例えば/dev
や の情報を見ることでも、同様にこれを行うことができます/sys
。
udev - udisk - デスクトップチェーン全体は、デスクトップを実行するためにのみ必要です。情報を得た新しいブロック デバイスが表示されたり、既存のブロック デバイスの状態が変化したりしたときに、デスクトップに派手なウィンドウなどを表示できます。Linux を従来の方法で使用していて、USB スティックに挿入したときに派手なウィンドウが必要ない場合は、これは必要ありません。