我很想更好地了解在操作系统级别,当新设备(usb 记忆棒或 ide/sata hdd)插入 PC 时会发生什么,即从内核级别到用户空间级别。此外,我想知道“dd”命令在哪个级别起作用。
我的理解是,一旦连接了外部驱动器,内核“拦截”这个事件并通知 udev 系统,由于 udevd 守护进程,该系统一直在监听。Udisks 是收集块设备信息的实例。Udisks 为此需要 udev。Udisks 连接到 d-bus(dbus 不仅仅是 udisks 使用的东西;许多程序使用 dbus 来交换信息)。通过 d-bus,任何人都可以连接到 udisk 并询问当前的设备列表是什么。
问题:当我启动 dd 命令时,它是否连接到 d-bus 以复制/映像驱动器?
我还附上了一张从维基百科拍摄的图片,显示了 linux 级别。请你告诉我,在那张照片上,从附加设备开始到 dd 命令实例的路径?
提前致谢。
文森佐。
这真的是两个问题:
1)
dd
是一个普通的用户应用程序,就像cp
. 就像 一样cp
,它通过发出“读取”系统调用、获取结果,然后发出“写入”系统调用来进行复制。与 不同cp
,您可以为 设置块大小dd
,这就是dd
传统上一直用于复制块设备的原因。但是今天,cp /dev/sdb /dev/sdc
它将做与 完全相同的事情dd
,并且同样快,因为现代版本cp
(可能不像古代版本)也总是会读取和写入完整的块。也
cp
没有dd
什么特别的东西来获得“磁盘布局”或类似的东西,它们只是读取,直到操作系统发出信号它们结束。2)
内核并没有真正拦截这个事件,因为所有驱动程序级别的操作都已经在内核中发生了。因此,当您连接 USB 设备时,USB 主机控制器硬件会注意到,产生一个中断,USB 主机控制器驱动程序对此做出反应,然后 USB 堆栈的各个部分开始枚举新设备,识别它的类型,识别潜在的驱动程序,附加由这些驱动程序创建的新块设备等。
udev
只是内核将这些事件传递给用户空间的一种机制,因此用户空间可以对它们做出反应,例如通过创建符号链接。udisks
是一个桌面恶魔,桌面用来获取有关块设备的信息,因为桌面喜欢在 D-Bus 上做所有事情。udisks
如果您没有运行 D-Bus 桌面(事实上,它不在我的某些机器上运行),您实际上并不需要。您可以通过其他方式同样出色地做到这一点,例如查看
/dev
或 中的信息/sys
。整个 udev - udisk - Desktop 链只需要在新的块设备出现或现有的块设备更改状态时通知桌面,因此桌面可以弹出花哨的窗口或其他任何东西。如果您以传统方式使用 Linux,并且在将其放入 USB 记忆棒时不需要花哨的窗口,则不需要这个。