Ict-创新/LPI/101.1
考生应该能够通过在基于 x86 的系统中进行正确的 BIOS 设置来配置基本系统硬件。
关键知识领域
- 启用和禁用集成外设。
- 配置有或没有外部外设(如键盘)的系统。
- 区分不同类型的海量存储设备。
- 为不同的设备设置正确的硬件 ID,尤其是引导设备。
- 了解冷插拔和热插拔设备之间的区别。
- 确定设备的硬件资源。
- 列出各种硬件信息的工具和实用程序(例如 lsusb、lspci 等)。
- 用于操作 USB 设备的工具和实用程序。
- 对 sysfs、udev、hald、dbus 的概念性理解。
计算机系统由中央 CPU、主存储器或内存、辅助存储器或永久存储器(如硬盘)以及各种输入/输出设备组成。为了运行,CPU 需要能够从内存加载指令和数据到 CPU 中,可能需要先从辅助存储器中获取数据,执行指令,然后将结果存储回内存中。它通过称为总线的datapath与各种输入/输出或外设通信。计算机系统可能拥有不止一条总线,用于与不同的组件通信。
这种现代计算机的简化模型被称为冯·诺依曼架构,以 20 世纪 40 年代开发了现代计算机基本架构的匈牙利裔数学家约翰·冯·诺依曼命名。
以这个基本的概念模型为基础,我们可以开始了解 CPU 如何确定和配置构成计算机系统的众多外设和设备,以及操作系统如何管理和协调活动以共享系统资源并访问其连接的外设和设备。
这些资源和外设包括海量存储设备(辅助存储器)和输入/输出设备,如显示器、键盘和网卡。一些外设集成在 PC 主板中,如并行端口和串行端口,甚至在更新的 PC 中集成 VGA 卡或网卡,而另一些则是外部设备,如 USB 存储器或蓝牙适配器。所有这些设备都需要一种方式来与 CPU 通信,以便向其提供信息,请求 CPU 提供服务或接收来自 CPU 的指令。
配置计算机系统时,您需要了解如何查找这些外设的当前设置,它们的设置可能具有哪些值,以及如何在 BIOS 或操作系统中更改它们(如果有必要)。配置 PC 外设以使其与操作系统协同工作是在两个地方完成的。第一个配置位置是系统固件或 BIOS(基本输入/输出系统);第二个是操作系统。
BIOS(基本输入/输出系统)的目的是执行开机自检(POST),识别和初始化系统设备和外设,并通过从引导设备加载引导加载程序来启动加载操作系统的过程。BIOS 还为操作系统提供了一个抽象层,用于访问系统设备。此层的目的是将操作系统与当今众多可用的设备隔离开来,但它被大多数现代操作系统(包括 Linux)忽略,这些操作系统使用自己的设备驱动程序来访问设备。
大多数 BIOS 制造商提供基于控制台的用户界面,允许您配置设备的低级系统设置。BIOS 配置界面及其访问方式因制造商而异,但通常通过在系统启动期间按下某个键或组合键(如 Delete 或 Insert)来访问。
在 BIOS 配置控制台下,您可以
- 启用或禁用设备,
- 分配资源,如 IRQ 和 IO 地址,
- 选择设备的引导顺序,以及
- 更改影响设备(如磁盘驱动器和网卡)工作模式的设置
除了主 BIOS 之外,许多外设还拥有自己的 BIOS 固件和配置控制台。一些网卡和大多数 SCSI 主机适配器卡附带自己的 BIOS,可用于设置其配置。与主系统 BIOS 一样,这些固件也会执行其设备的一些低级检查和初始化。
有时可能需要禁用阻止操作系统正常安装或工作的设备。这种情况很少见,通常可以通过在启动时向 Linux 内核传递正确的参数或更改 BIOS 中的参数设置来解决。通常,最容易出现问题的设置与硬盘访问模式、电源管理和中断控制器设置有关。通常,这些问题的原因是固件本身的错误。
大多数 BIOS 控制台允许您禁用集成外设,如 COM 端口、视频卡或网卡。即使这些设备没有造成任何安装或启动问题,您可能也希望禁用它们(如果它们未被使用),以便释放原本不可用于其他目的的资源。
有时需要禁用对外设(如键盘或鼠标)的系统检查,尽管这些外设对于台式机的正常运行必不可少,但它们在服务器中往往不存在。没有键盘、鼠标或显示器的机器被称为“无头”系统。某些 BIOS 在这些设备不存在时会拒绝启动,除非禁用了这些系统检查。(您可能想知道,如果无头机器没有键盘、鼠标或显示器,该如何访问它们。答案是通过网络使用 SSH 等工具,本书后面会介绍。)当然,要访问 BIOS 本身,就必须要有键盘和显示器等外设!
要了解外设如何与 CPU 通信,您需要了解中断请求 (IRQ)、输入/输出 (IO) 地址和直接内存访问 (DMA) 地址。CPU 负责处理系统中发生的 所有 指令 和 事件。要与设备通信,它需要知道设备何时有事件需要处理,以及它需要能够向设备传递信息和从设备读取信息。
IRQ 是外设通过总线向 CPU 发出信号,告诉 CPU 挂起其当前活动并处理其事件(如按键或磁盘读取)的机制。IO 地址是映射到设备的内存区域,CPU 可以向这些区域写入设备注意信息,以及从设备读取信息。这是一种对外设如何与 CPU 通信的简化解释,但足以满足我们理解 IRQ 和 IO 地址的目的。
当设备上发生事件(如鼠标移动或数据从 USB 连接的驱动器到达)时,设备通过在总线上生成中断来向 CPU 发出信号,表明它有数据需要处理。在即插即用技术出现之前,即插即用技术需要硬件(PCI 总线)和软件组件才能工作,英特尔 PC 仅限于 16 种可能的 IRQ 设置,其中许多 IRQ 线是预先为设备设置的,因此,只有少数 IRQ 线是可自由分配的。下表列出了以红色显示的不可使用的 IRQ,以橙色显示的可以重新分配的 IRQ(前提是系统中不存在某些硬件),以及可以自由分配的 IRQ(以白色显示)。
0 | 系统计时器 | 4 | COM1 | 8 | 实时时钟 | 12 | PS2 鼠标 |
1 | 键盘 | 5 | LPT2 / 声卡 | 9 | 可用 | 13 | 浮点处理器 |
2 | 处理 IRQ 8 - 15 | 6 | 软盘控制器 | 10 | 可用 | 14 | 主 IDE |
3 | COM2 | 7 | 并行端口 | 11 | 可用 | 15 | 辅助 IDE |
IRQ 0 系统计时器(不可更改);
IRQ 1 键盘控制器(不可更改);
IRQ 2 级联信号来自配置为使用 IRQ 2 的 IRQ 8-15 设备将使用 IRQ 9
IRQ 3 串口控制器,用于 COM2(如果存在,与 COM4 共享);
IRQ 4 串口控制器,用于 COM1(如果存在,与 COM3 共享);
IRQ 5 LPT 端口 2 或 声卡;
IRQ 6 软盘控制器;
IRQ 7 LPT 端口 1 或 声卡(8 位 Sound Blaster 及兼容设备)。
IRQ 8 实时时钟;
IRQ 9 开放中断 / 可用 或 SCSI 主机适配器;
IRQ 10 开放中断 / 可用 或 SCSI 或 NIC;
IRQ 11 开放中断 / 可用 或 SCSI 或 NIC;
IRQ 12 PS/2 连接器上的鼠标;
IRQ 13 数学协处理器 / 集成浮点运算单元 或 进程间中断(使用
IRQ 14 主 ATA 通道(磁盘驱动器或 CDROM);
IRQ 15 次要 ATA 通道
随着外围设备的数量和类型不断增加,有限的 IRQ 线路数量成了问题。即使存在空闲的 IRQ,一些设备也硬编码为使用特定 IRQ,而该 IRQ 可能已被使用。一些设备允许通过跳线设置进行手动配置,并且可以在 BIOS 中重新分配 IRQ 以及 I/O 地址。
为了克服这一限制,引入了“即插即用”技术,允许设备共享中断线路,从而扩展了可以容纳的设备数量。“即插即用”消除了对设备手动配置的需求。凭借英特尔的先进可编程中断控制器 (APIC) 架构,现在通常有 24 条可用中断线路,可以容纳多达 255 个设备。
要查看 Linux 系统中 IRQ 到设备的分配,您可以检查 /proc/interrupts 文件的内容。
从现在起,您需要访问 Linux PC。虽然涉及一些理论,但我们将越来越多地与 Linux 进行交互。我建议您尝试您遇到的命令,在进行过程中测试您的理解。
图 101.1.1:/proc/interrupts 的示例结果
/proc 文件系统是什么?
/proc 文件系统是一个虚拟或伪文件系统。内核设置 /proc 文件系统以导出有关正在运行的内核、用户进程和已配置的硬件设备的信息。它是一个虚拟文件系统,因为它只存在于内存中,并不代表任何真实的物理文件。将所有内容视为文件是 UNIX 设计理念的基石,许多这样的伪文件系统都存在。其他是 /sys 和 /dev 目录。
输入/输出地址
[edit | edit source]当 CPU 和外围设备需要相互通信和/或传递数据时,它们使用 I/O 地址。本质上,它们通过读取和写入设备的保留 I/O 地址来进行通信。有两种互补的方法来执行 CPU 和设备之间的 I/O。有内存映射 I/O (MMIO) 和端口 I/O (PIO) 定址。
在内存映射 I/O 中,地址是为 CPU 和特定设备之间通信保留的内存区域。重要的是,这些内存区域不能被任何其他进程使用。在端口映射 I/O 定址中,CPU 有一组单独的指令用于执行 I/O,该指令具有单独的地址空间的设备。
Linux 中的 I/O 端口分配可以通过检查 /proc/ioports 文件的内容来揭示。
图 101.1.2:/proc/ioports 的示例
要分配 I/O 内存,您可以查看 /proc/iomem,下面给出了此文件内容的示例。
图 101.1.3:/proc/iomem 的示例
在“即插即用”技术出现之前,您需要在 BIOS 和操作系统中配置 I/O 设备地址,但是随着“即插即用”的引入,现在由操作系统和总线自动完成分配。
DMA 地址
[edit | edit source]DMA 代表直接内存访问,是一种优化,允许设备直接读取和写入内存,而无需经过 CPU。传统上,当 CPU 请求从设备读取数据到内存时,CPU 需要参与数据传输过程。在这种模型下,称为程序化 I/O (PIO),大量 CPU 时间用于简单地在设备和内存之间复制数据。使用 DMA,设备可以直接写入内存,绕过 CPU。这大大提高了系统性能。要检查 Linux 系统中 DMA 地址的分配,您可以检查 /proc/dma 的内容。
图 1.4:/proc/dma 输出示例
对于大多数设备,操作系统会自动配置 DMA。一个可能不会自动配置 DMA 的重要设备是系统并行 ATA (PATA) 磁盘。对于 PATA 设备(参见下面的部分),如果您的设备是 /dev/hda(当今流行的 SATA 驱动器不以传统意义上的 DMA 方式使用 DMA),则可以通过运行以下命令启用 DMA 访问:
hdparm -d1 /dev/sda
要查看硬盘的当前设置,您可以运行以下命令:
hdparm -d /dev/sda
配置 IRQ、I/O 端口/地址和 DMA
[edit | edit source]对于设备 IRQ、I/O 地址、DMA 通道和内存区域的配置,在当今的即插即用 PCI 总线中,会自动完成。资源通过系统 BIOS、通过 Linux 内核以及可能通过设备驱动程序分配,在大多数情况下会自动解决资源冲突。
Linux 提供各种实用程序来查询设备,以了解它们使用的资源。许多这些实用程序利用内核在 /proc 文件系统中导出的信息。
用于查询 PCI 设备的两个命令是 lspci 和 setpci 命令。lspci 实用程序可以根据您使用的参数提供有关使用 PCI 总线的设备的详细资料。
“lspci -vv”提供了有关 PCI 设备的详细输出。下面的输出显示了“lspci”命令在没有参数的情况下运行的典型输出。
图 1.5:lspci 输出示例
所有 PCI 设备都由唯一的 ID 标识。此 ID 由唯一的供应商 ID、设备 ID 以及可能存在的子系统供应商 ID 和子系统设备 ID 组成。运行“lspci”时,会查询系统 ID 数据库以获取 PCI ID,并将其转换为人类可读的格式,显示供应商名称和设备。PIC ID 数据库位于 Ubuntu 上的 /usr/share/misc/pci.ids 和 RedHat 上。当在数据库中找不到 PCI ID 时,它将显示为两个数字,以冒号分隔。在这种情况下,很可能该外围设备的正确设备驱动程序也未加载。在 Internet 上搜索 PCI ID 可能可以揭示制造商、设备 ID 和芯片组信息,这些信息可以帮助您确定设备的正确驱动程序。或者,还没有为 Linux 编写该设备的驱动程序。setpci 是一种用于配置和查询 PCI 设备的实用程序。它是一个高级实用程序,超出了本手册的范围,但您应该知道它的存在。
如何在 PnP BIOS/OS 中重新分配 IRQ 分配
即使 IRQ 冲突现在已经成为过去的事情,因为中断可以共享,但对于一些中断频率很高的设备来说,共享同一个 IRQ 仍然是一个坏主意。这对于硬盘或声卡尤其如此。
在这种情况下,建议尝试将 PCI 卡移到不同的插槽中,以尝试为它们分配不同的 IRQ。
Linux 设备管理概述
[edit | edit source]在继续讨论在运行 Linux 时通常会遇到的各种类型的海量存储设备之前,了解 Linux 如何管理设备将非常有益。本手册中介绍的许多概念将在后面进行扩展,但高层次概述将为您提供一个路线图,说明所有这些概念是如何组合在一起的。
设备驱动程序是一个内核空间程序,允许用户空间应用程序与底层硬件进行交互。内核空间指的是具有对硬件的完全访问权限的特权代码,它在 ring 0 中运行,ring 0 是一种硬件强制实施的特权执行模式。用户空间应用程序在特权较低的模式下运行,即 ring 3,不能直接访问硬件。用户空间应用程序只能通过向内核发出系统调用来与硬件交互,以代表它们执行操作。
Linux 内核将有关设备驱动程序中设备的信息导出到挂载在 /sys 下的伪文件系统。此文件系统告诉用户空间哪些设备可用。它在系统启动时填充,但当热插拔设备插入或移除时, /sys 文件系统会更新,内核会触发事件以告知用户空间发生了更改。
UNIX 设计原则之一是尽可能使用文件的隐喻,为交互与各种 UNIX 组件提供一个标准的概念模型,其中它是真实的文件、打印机、磁盘或键盘,使用标准输入/输出系统调用。设备驱动程序的文件接口导出到/dev目录下。
这些用户空间应用程序之一是内核设备管理器,udev,它在 /dev目录下创建一个设备节点,以允许用户空间应用程序访问设备。设备节点或文件的名称由设备驱动程序的命名约定或 /etc/udev/rules.d中的用户定义规则确定。它是通过 /dev下的条目,用户空间应用程序可以与设备驱动程序进行交互。
该udev守护进程还负责将更改通知其他用户空间应用程序。此处最重要的应用程序是 HAL(硬件抽象层)守护进程和 D-Bus(桌面总线)。这些应用程序主要用于桌面环境在事件发生时执行任务,例如插入 USB 驱动器时打开文件浏览器,或者插入相机时打开图像应用程序。
虽然 udev 在 /dev 文件系统下创建相关的条目,但如果在事件发生时需要发生任何有用的事情,则需要 HAL 和 D-Bus。(注意:HAL 现在已弃用,因为它正在合并到 udev 中)。HAL 是一个单一的守护进程,负责发现、枚举和调解对主机计算机上大多数硬件的访问,为桌面应用程序提供硬件抽象层。应用程序向 D-Bus 守护进程注册以接收事件通知,并发布其他应用程序可能感兴趣的事件通知。例如,D-Bus 用于在插入音频 CD 时启动媒体播放器,并通知其他应用程序当前播放的歌曲等。
从实际角度来看,对您影响最大的服务将是udev因为它在 / 下创建了设备节点dev目录。对于 LPI,能够识别哪些设备可用非常重要。
辅助存储或大容量存储设备,如今天所知,有不同的类型,这些类型由它们的物理接口决定。接口是设备物理连接到计算机的方式。随着时间的推移,已经开发出许多用于连接大容量存储设备的接口,但今天遇到的四种主要类型的磁盘是
- PATA – 并行高级技术附件,也称为 IDE
- SATA – 串行高级技术附件,最新的标准取代了 PATA,特别是在台式机和笔记本电脑上。
- SCSI – 小型计算机系统接口磁盘用于服务器和其他高端机器。SCSI 提供高速访问,以及连接大量设备的能力
- SAS – 串行 SCSI,一种针对服务器的新 SCSI 标准
除了接口之外,大容量存储的类型也由设备本身决定。例如,您可以有 SATA 光驱(CDROM/DVDROM)以及硬盘和 SCSCI 磁盘和 SCSI 磁带驱动器。
PATA
PATA 是一种过时的标准,但您可能仍然会在较旧的机器上遇到它。并行指的是数据从设备传输到 CPU 和内存的方式。PATA 标准有几种变体,例如 IDE 和 EIDE,但自从 SATA 引入以来,它们被统称为 PATA 设备。
主板配有两个 PATA 连接器,PATA 电缆最多支持每条电缆两个设备,以主/从模式配置。哪个设备为主或从取决于设备在电缆上的位置以及硬盘本身的跳线设置。由于 ATA 驱动器已经存在很长时间了,因此它们在 Linux 中得到了很好的支持,大多数 BIOS 通常没有问题自动识别和配置这些设备。
Linux 在 /dev 文件系统下识别 ATA 设备,命名约定为 /dev/hd[a-z]。设备名称的最后一个字母由磁盘是在主连接还是从连接上的主设备还是从设备决定。
设备节点命名中也可能出现间隙。例如,磁盘通常被识别为 /dev/hda,为主驱动器,位于主连接器上,而 CDROM 驱动器被识别为/dev/hdc作为从连接器上的主设备。对于台式机来说,这是一种非常常见的设置,因为最好将您两个最常用的大容量存储设备放在单独的电缆上以提高性能,而不是让它们共享一条电缆,因为可能会出现访问争用。
PATA 磁盘上的分区由字母后面的数字标识。例如,/ 上的第一个主分区dev/hda驱动器被识别为 /dev/hda1和第 2 个主分区 /dev/hda2等等。有关磁盘分区编号的更多信息,请参阅第 102.1 节。
在这一点上了解设备节点命名约定,重要的是能够识别硬盘设备的类型及其设备名称。
SATA
串行 ATA (SATA) 驱动器已在很大程度上取代了台式机和笔记本电脑上的 PATA 驱动器。SATA 是一种串行标准,但比旧的 PATA 接口提供更高的吞吐量。SATA 驱动器没有以主/从模式配置,每个驱动器都有自己专用的控制器或通道。SATA 驱动器的电缆比 PATA 设备的电缆薄得多,节省了空间和成本。SATA 控制器使用高级主机控制器接口 (AHCI),允许 SATA 磁盘的热插拔和热交换。
与 PATA 设备一样,大多数 BIOS 会自动检测 SATA 驱动器,Linux 内核通常没有问题识别和加载 SATA 驱动器的正确驱动程序。SATA 在 Linux 下的一个特殊之处是,SATA 磁盘利用了 SCSI 磁盘子系统,因此这些设备的命名约定遵循 SCSI 设备的命名约定。
SATA 驱动器命名约定使用 scsi 子系统命名约定,设备被标记为 /dev/sd[a-z]。设备节点名称的最后一个字符由 Linux 内核发现这些设备的顺序决定。SATA 驱动器上的分区从 1 开始编号。
SCSI 设备
SCSI 与 PATA 和 SATA 一样,定义了物理接口以及用于在计算机和外围设备之间传输数据的协议和命令。SCSI 最常用于硬盘和磁带驱动器,但它可以连接各种其他设备,例如扫描仪和 CD 驱动器。通常,SCSI 设备连接到具有自己 BIOS 的主机适配器。SCSI 存储设备比 SATA 或 PATA 设备更快、更健壮,但也更昂贵,因此它们主要用于服务器或高端工作站。
SCSI 接口有两种类型:8 位接口,其总线支持 8 个设备,包括控制器,因此只有 7 个设备的空间,以及 16 位接口(WIDE),支持 16 个设备,包括控制器,因此只有 15 个块设备。
SCSI 设备使用一组称为 SCSI ID 的 3 个数字来唯一标识。
a. SCSI 通道
b. 设备 ID 号码
c. 逻辑单元号 LUN
SCSI 通道
每个 SCSI 适配器都支持一个数据通道,用于连接 SCSI 设备(磁盘、CDROM 等)。
这些通道从 0 开始编号。
设备 ID 号码
每个设备都被分配了一个唯一的 ID 号码,可以使用磁盘上的跳线设置。对于 8 位控制器,ID 范围为 0 到 7,对于 16 位控制器,ID 范围为 0 到 15。
逻辑单元
逻辑单元号 (LUN) 用于区分 SCSI 目标号内的设备。例如,这用于指示磁盘驱动器内的特定分区或多驱动器磁带机器人内的特定磁带驱动器。如今它不太常见,因为主机适配器现在成本更低,并且可以容纳每个总线上更多的目标。
硬件检测
所有检测到的设备都在 / 中列出proc/scsi/scsi文件。下面的示例来自 SCSI-2.4-HOWTO
已连接的设备 |
主机:scsi0 通道:00 ID:02 LUN:00 |
供应商:先锋 型号:DVD-ROM DVD-303 版本:1.10 |
类型:CD-ROM ANSI SCSI 版本:02 |
主机:scsi1 通道:00 ID:00 LUN:00 |
供应商:IBM 型号:DNES-309170W 版本:SA30 |
类型:直接访问 ANSI SCSI 版本:03 |
由于 SATA 驱动器与真正的 SCSI 驱动器使用相同的 scsi 子系统,因此 SCSI 设备的命名约定与上面为 SATA 驱动器设置的命名约定相同。不仅 scsi 驱动器利用了 scsi 子系统,USB 驱动器也利用了 scsi 子系统,因此您会发现 USB 驱动器遵循相同的命名约定
该scsi_info工具使用 /proc/scsi/scsi 中的信息打印指定设备的 SCSI_ID 和型号。从上面的文件中,scsi_info 将产生以下输出
# scsi_info /dev/sda
MODEL="IBM DNES-309170W" FW_REV="SA30" |
系统将默认从 SCSI ID 为 0 的设备启动。这可以在 SCSI BIOS 中更改,可以在启动时配置。如果 PC 混合使用 SCSI 和 SATA/PATA 磁盘,则必须先在系统的 BIOS 中选择启动顺序。
SAS
串行连接 SCSI 是最新的接口,是对 SCSI 协议和接口的升级,就像 SATA 是对 PATA 的升级一样。总的来说,SCSI 设备比 SATA/PATA 驱动器更快、更可靠。这两种技术的性能差距继续缩小,但这两种技术通常针对两个不同的市场,即 SATA 针对消费市场,SCSI 针对企业市场。企业对可靠性和速度的要求高于消费市场,不同驱动器的价格也反映了这一点。
识别 BOOT 设备的正确设备 ID
列出不同类型的大容量存储设备及其命名约定的目的是让您能够轻松识别磁盘的设备 ID。这对于能够识别哪个驱动器是启动设备以及哪个磁盘分区包含根目录和启动目录非常重要。
但是,Linux 命名约定存在问题,而且不仅仅是磁盘驱动器。问题是当进行硬件配置更改时,设备名称可能会在系统重新启动之间发生变化。由于硬件命名约定包含一个取决于内核发现设备顺序的组件,因此添加、移动或删除设备可能会导致设备名称发生更改。几年前,这并不是什么大问题,因为更换硬盘并不常见;但随着 USB 的出现,并且它使用 SCSI 子系统进行设备命名,这个问题变得更加严重。为了唯一地识别设备,无论何时发现或放置,都需要找到一种唯一地识别设备的方法。对于磁盘,这是通过将通用唯一 ID 写入磁盘元数据并使用 UUID 在配置文件中而不是设备节点来完成的。(不仅硬盘需要唯一识别。其他设备也需要唯一识别,但可能使用不同的方法。例如,网卡使用它们的 MAC 地址。)blkid 实用程序(替换 vol_id)可用于查询设备上的设置或搜索具有特定 UUID 的设备。
blkid /dev/sda1
例如,产生以下输出:/dev/sda1: UUID="c7d63e4b-2d9f-450a-8052-7b8929ec8a6b" TYPE="ext4",表明设备 sda 上的第一个分区具有 ext4 文件系统和 UUID 为 c7d63e4b-2d9f-450a-8052-7b8929ec8a6b
blkid -U 75426429-cc4b-4bfc-beb9-305e1f7f8bc9
搜索具有指定 ID 的设备并返回 /dev/sdb1。或者,您也可以查看 /dev/disk/by-uuid 下以查看哪些 ID 映射到 Linux 内核看到的哪些设备。
热插拔和冷插拔设备指的是设备在计算机运行时(热插拔)可以插入或移除,还是机器必须先关闭电源才能插入或移除设备(冷插拔)。
典型的热插拔设备包括 USB 数据存储器、鼠标或键盘以及一些 SATA 驱动器,而冷插拔设备包括显卡、网卡和 CPU,尽管在高端服务器机器中,即使这些组件也可以热插拔。热插拔设备的优势在于能够在无需将机器脱机的情况下更换故障组件或添加额外的组件,这是许多需要保持最大正常运行时间的生产服务器的要求。
您需要了解的很多内容已经在“Linux 设备管理概述”中解释过了。当热插拔设备插入或移除时,内核会更新 sys 虚拟文件系统,而 udev 会收到事件通知。udev 将在 /dev 下创建设备节点,并向 HAL 发送通知,HAL 又会向 D-Bus 通知这些更改。
USB 支持
如今最流行的热插拔接口类型之一是通用串行总线 (USB),它是一种旨在将设备连接到 PC 的通信架构。这些设备分为五个类别:
- 显示设备
- 通信设备
- 音频设备
- 大容量存储设备
- 人机接口设备 (HID)
这些设备插入 USB 端口,该端口由 USB 控制器驱动。自版本 2.2.7 起,Linux 内核中就包含了对 USB 控制器 的支持(Linux USB 子系统 HOWTO)。
主机控制器
有三种类型的 USB 主机控制器:
OHCI (康柏) | usb-ohci.o |
UHCI (英特尔) | usb-uhci.o |
EHCI (USB v 2.0) | ehci-hdc.o |
将 USB 设备插入 PC 后,我们可以使用 lsusb 命令列出这些设备:
# lsusb
总线 001 设备 002: ID 04a9:1055 佳能株式会社 |
图 1.6:lsusb 输出示例
在讨论 Linux 如何管理设备时,我们提到内核利用设备驱动程序向 /sys 文件系统导出信息。在 Linux 中,大多数设备驱动程序作为内核源代码的一部分提供,可以编译为模块,这些模块可以动态加载和卸载到内核中,或者直接编译到内核中。模块化系统使第三方能够编写设备驱动程序并将其作为模块提供,这些模块可以在不重新编译内核的情况下加载和卸载。
大多数驱动程序都编译为模块,因为这可以使内核保持较小规模,并且可以提供比将所有驱动程序都编译为内核的一部分更实用的驱动程序数量。您需要了解的用于在 Linux 下管理设备驱动程序的命令是:
- lsmod - 列出当前安装的模块。
- modinfo - 查询模块的依赖关系、作者和参数信息。
- insmod - 通过提供驱动程序路径来安装模块。
- modprobe - 通过模块名称安装模块,并处理依赖关系解析。
- rmmod - 移除。
要查看系统加载了哪些内核模块,您可以运行 lsmod 命令。输出的第一列是模块名称,第二列是模块的大小,第三列显示哪些其他模块依赖于此模块。
图 1.7:lsmod 输出示例
如果您需要有关模块的其他信息,例如其依赖关系和配置参数,您可以使用 modinfo 命令。以下是 “modinfo psmouse” 命令(鼠标驱动程序)输出的一个示例。
图 101.1.8:modinfo 输出示例
要加载设备的驱动程序,可以使用 insmod 或 modprobe 命令。insmod 命令以内核模块路径为参数,并尝试将模块加载到内存中。下面的命令将尝试将 xpad 驱动程序加载到内存中。
insmod 命令很不方便,因为它不会加载任何驱动程序依赖关系,您需要指定驱动程序模块的完整路径。modprobe 命令会自动加载任何未驻留的依赖关系,并允许您使用模块名称而不是模块的文件名。
要移除模块,可以使用 rmmod 命令或 modprobe -r。只要没有模块依赖于此模块,这就会移除模块。
使用过的术语、文件和实用程序
- /sys
- /proc
- /dev
- modprobe
- lsmod
- lspci
- lsusb