我很想更了解當新裝置(USB 棒或 IDE/SATA HDD)插入 PC 時,在作業系統層級會發生什麼,即從核心層級到使用者空間層級。此外,我想知道“dd”命令在哪個級別起作用。
我所理解的是,一旦連接了外部驅動器,核心就會「攔截」此事件並通知 udev 系統,該系統始終在 udevd 守護程序的作用下進行偵聽。 Udisks是收集區塊設備資訊的實例。為此,Udisk 需要 udev。 Udisk 連接到 d-bus(dbus 不僅僅是 udisk 使用;許多程式使用 dbus 來交換資訊)。透過 d-bus,任何人都可以連接到 udisk 並詢問當前的設備清單是什麼。
問題:當我啟動 dd 命令時,它可能會連接到 d-bus 來複製/映像驅動器?
我還附上了一張來自維基百科的圖片,顯示了 Linux 等級。您能告訴我在那張圖片上從連接的設備到 dd 命令實例的路徑嗎?
提前致謝。
文森佐.
答案1
這確實是兩個問題:
1)dd
是一個普通的用戶應用程序,就像cp
.就像 一樣cp
,它透過發出「read」系統呼叫、取得結果,然後發出「write」系統呼叫來複製。與 不同的是cp
,您可以設定 的區塊大小dd
,這就是為什麼dd
傳統上一直用於複製區塊裝置。但今天,cp /dev/sdb /dev/sdc
將做與 完全相同的事情dd
,並且同樣快,因為現代版本cp
(可能不像古代版本)也總是會讀取和寫入完整的區塊。
也沒有cp
什麼dd
特殊的東西來獲得“磁碟佈局”或類似的東西,它們只是讀取,直到作業系統發出信號表示它們已結束。
2)
一旦連接了外部驅動器,核心就會「攔截」此事件
內核並不真正攔截此事件,因為所有驅動程式層級的操作都已在核心中發生。因此,當您連接USB 設備時,USB 主機控制器硬體會注意到這一點,並產生一個中斷,並且USB 主機控制器驅動程式對此做出反應,然後USB 堆疊的各個部分開始列舉新設備,識別其類型,識別潛在的驅動程序,附加由這些驅動程式創建的新區塊設備等。
udev
只是核心將這些事件傳遞給用戶空間的一種機制,因此用戶空間可以對它們做出反應,例如透過建立符號連結。
並通知 udev 系統始終在監聽,這要歸功於 udevd 守護程式。
Udisks是收集區塊設備資訊的實例。
udisks
是桌面惡魔,桌面用來獲取有關塊設備的信息,因為桌面喜歡在D-Bus上做所有事情。udisks
如果您沒有運行 D-Bus 桌面(事實上,它不在我的某些機器上運行),那麼您實際上並不需要。
透過 d-bus,任何人都可以連接到 udisk 並詢問當前的設備清單是什麼。
您可以透過其他方式同樣很好地做到這一點,例如查看/dev
或 中的資訊/sys
。
整個 udev - udisk - Desktop 鏈只需要桌面即可知情的當新的區塊設備出現,或現有的區塊設備改變狀態時,桌面可以彈出精美的窗口,或其他什麼。如果您以傳統方式使用Linux,並且在將其插入USB記憶棒時不需要一個花哨的窗口,那麼您就不需要這個。