新しいデバイス(USBスティックまたはIDE / SATA HDD)がPCに接続されているときに、OSレベル(カーネルレベルからユーザースペースレベルなど)で何が起こるのかをよりよく理解したいと思います。また、「dd」コマンドがどのレベルで動作するかを知りたいです。
私が理解しているのは、外部ドライブが接続されると、カーネルがこのイベントを「傍受して」udevdデーモンがある状態で常に聞いているudevシステムに通知することです。 Udisksは、ブロックデバイス情報を収集するインスタンスです。これを行うには、Udiskにはudevが必要です。 Udisksはd-busに接続されています(dbusは単純なudisk以降で使用されます。多くのプログラムがdbusを使用して情報を交換します)。 d-busを使って誰でもudiskに接続し、現在のデバイスリストが何であるかを尋ねることができます。
Q:ddコマンドを起動すると、d-busに接続してドライブをコピー/イメージ化できますか?
また、Linuxレベルを示すウィキペディアの写真も添付しました。接続されたデバイスからその写真のddコマンドインスタンスへのパスを教えてください。
よろしくお願いします。
ビンセンジョ。
答え1
これは実際には2つの質問です。
1)は、「読み取り」システムコールを発行し、結果を取得してから「書き込み」システムコールを発行してコピーを実行するdd
一般ユーザーアプリケーションです。違いは、ブロックサイズを設定できることです。これがブロックデバイスが伝統的にコピーに使用される理由です。しかし、今日も同じことをするでしょう。現代のバージョン(おそらく古代のバージョンとは異なり)も常に完全なブロックを読み書きするので、それほど高速です。cp
cp
cp
dd
dd
cp /dev/sdb /dev/sdc
dd
cp
cp
「ディスクレイアウト」やそのようなものを得るための特別な方法はありませんdd
。 OSが完了したことを示す信号を送信するまで、読み取るだけです。
2)
外部ドライブが接続されると、カーネルはこのイベントを「傍受」します。
すべてのドライバレベルの操作がすでにカーネルで発生しているため、カーネルは実際にこのイベントを傍受しません。したがって、USBデバイスを接続すると、USBホストコントローラハードウェアがそれを認識し、割り込みを生成し、USBホストコントローラドライバがそれに応答し、USBスタックのさまざまな部分が新しいデバイスを列挙し始めます。そのデバイスの種類を識別し、潜在的なドライバを識別します。 、これらのドライバなどで作成された新しいブロックデバイスを接続します。
udev
カーネルがこれらのイベントをユーザー空間に転送するためのメカニズムにすぎないため、ユーザースペースは、例えばシンボリックリンクを生成してそれに反応することができます。
そして、udevdデーモンのおかげで、システムが常に聞いていることをudevに伝えます。
Udisksは、ブロックデバイス情報を収集するインスタンスです。
udisks
デスクトップはD-Busですべてのことをするのが好きなので、ブロックデバイス情報を取得するためにデスクトップが使用するデスクトップデーモンです。 D-Bus Desktopを実行していない場合は、実際には必要ありませんudisks
(実際には一部のコンピュータでは実行されません)。
d-busを使って誰でもudiskに接続し、現在のデバイスリストが何であるかを尋ねることができます。
/dev
またはで情報を表示するなど、他の方法でも同じことができます/sys
。
udev - udisk - デスクトップチェーン全体にはデスクトップのみが必要です。知っている新しいブロックデバイスが表示されたり、既存のブロックデバイスの状態が変わったりすると、デスクトップにクールなウィンドウなどが表示されることがあります。 Linuxを従来の方法で使用してUSBスティックに接続するときに素晴らしいウィンドウが必要ない場合は、これは必要ありません。