摘要
热插拔系统控制计算机中大多数设备的初始化。热插拔系统不但用于可以在操作期间插入和拆卸的设备,而且用于在系统引导时检测到的所有设备。它工作时与 sysfs 文件系统和 udev 紧密相关,后者在 第 33 章 使用 udev 创建动态设备节点 中进行介绍。
在引导内核之前,只有绝对需要的设备(如总线系统、引导磁盘和键盘)才能得到初始化。内核触发所有检测到的设备的热插拔事件。udevd 守护程序会监听这些事情并运行 udev 以创建设备节点和配置设备。对于无法自动检测到的设备(如旧的 ISA 卡),将使用静态配置。
除以前个别特殊设备之外,大多数设备将在能够访问时立即进行初始化(在系统引导期间或设备热插拔时)。在初始化期间,系统将接口注册到内核。此注册将触发导致相应接口进行自动配置的更多的热插拔事件。
在 SUSE Linux 以前的版本中,使用一组静态配置数据作为初始化设备的基础。任何热插拔事件都由单独的底稿(称为代理)处理。随着本版本 SUSE Linux 的发行,热插拔子系统被集成进 udev,使用 udev 规则来提供以前热插拔代理的功能。
热插拔子系统的常规设置可在 /etc/sysconfig/hotplug 中找到。对所有变量都进行了注释。常规设备配置基于 /etc/udev/rules.d 中找到的匹配规则(请参见 第 33 章 使用 udev 创建动态设备节点)。特定设备的配置文件位于 /etc/sysconfig/hardware 中。以前版本的 SUSE Linux 中使用的热插拔事件回拨 /proc/sys/kernel/hotplug 通常为空,因为 udevd 通过 netlink 套接字接收热插拔讯息。
热插拔系统不仅配置设备,而且还配置接口。设备通常与总线连接并提供接口所需的功能。接口表示设备整体或某个子集的用户可见的抽象。设备通常需要内核模块形式的设备驱动程序才能正确运行。此外,可能需要一些更高级别的驱动程序来为用户提供接口。大多数情况下,接口由 udev 创建的设备节点表示。了解设备和接口之间的区别对了解整体概念非常重要。
在 sysfs 文件系统中输入的设备可在 /sys/devices 下找到。接口位于 /sys/class 或 /sys/block 下。sysfs 中的所有接口都应有一个到其设备的链接。但是,仍有一些驱动程序将不自动添加此链接。没有此链接,就不了解此接口所属的设备,也无法找到合适的配置。
设备通过设备说明进行寻址。以下可能是 sysfs 中的设备路径 (/sys/devices/pci0000:00/0000:00:1e.0/0000:02:00.0)、连接点的说明 (bus-pci-0000:02:00.0) 、个人 ID (id-32311AE03FB82538) 或某些类似的内容。在过去,接口通过其名称进行寻址。这些名称只是现有设备的简单编号,可能随设备的添加或拆卸而改变。
还可以通过关联设备的说明对接口进行寻址。通常,上下文会指出此说明是指向设备本身,还是指向其接口。设备、接口和说明的典型示例有:
连接到 PCI 总线(/sys/devices/pci0000:00/0000:00:1e.0/0000:02:00.0 或 bus-pci-0000:02:00.0)并具有网络接口(eth0、id-00:0d:60:7f:0b:22 或 bus-pci-0000:02:00.0)的设备。网络接口由网络服务使用,或被连接到虚拟网络设备(如隧道或 VLAN)上,而虚拟网络设备也有一个接口。
采用总线 (/sys/class/scsi_host/host1) 形式使多个物理接口可用的设备(/sys/devices/pci0000:20/0000:20:01.1/host1/1:0:0:0 或 bus-scsi-1:0:0:0)。
有几个接口 (/sys/block/sda*) 的设备(/sys/devices/pci0000:20/0000:20:01.1/host1/1:0:0:0 或 bus-scsi-1:0:0:0)。