我很想更好地了解当新设备(USB 棒或 IDE/SATA HDD)插入 PC 时,在操作系统级别会发生什么,即从内核级别到用户空间级别。此外,我想知道“dd”命令在哪个级别起作用。
我所理解的是,一旦连接了外部驱动器,内核就会“拦截”此事件并通知 udev 系统,该系统始终在 udevd 守护进程的作用下进行侦听。 Udisks是收集块设备信息的实例。为此,Udisk 需要 udev。 Udisks 连接到 d-bus(dbus 不仅仅是 udisk 使用;许多程序使用 dbus 来交换信息)。通过 d-bus,任何人都可以连接到 udisks 并询问当前的设备列表是什么。
问题:当我启动 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 上执行所有操作。如果您没有运行 D-Bus 桌面,则实际上不需要它udisks
(事实上,它在我的某些机器上不运行)。
通过 d-bus,任何人都可以连接到 udisk 并询问当前的设备列表是什么。
您可以通过其他方式同样很好地做到这一点,例如查看/dev
或 中的信息/sys
。
整个 udev - udisk - Desktop 链只需要桌面即可知情的当新的块设备出现,或者现有的块设备改变状态时,桌面可以弹出精美的窗口,或者其他什么。如果您以传统方式使用Linux,并且在将其插入USB记忆棒时不需要一个花哨的窗口,那么您就不需要这个。