有许多与 SCSI 相关的模块。中层和高层模块如下所列
scsi_mod.o
sd_mod.o
sr_mod.o
st.o [osst.o]
sg.o
请注意,前 3 个模块的正常驱动程序名称都附加了 "_mod"。底层驱动程序倾向于使用 HBA 制造商的名称(或缩写)(例如 advansys),并可选地加上主控制器芯片的芯片编号(例如 sym53c8xx,用于基于 NCR 53c8?? 系列芯片的 symbios 控制器)。
所有 SCSI 模块都依赖于中层。这意味着如果 SCSI 中层没有构建到内核中,并且如果scsi_mod.o尚未加载,则像 modprobe st 这样的命令将导致scsi_mod.o模块被加载。可能还存在其他依赖项,例如 modprobe sr_mod 也会导致 cdrom 模块被加载(如果尚未加载)。此外,如果 SCSI 中层是一个模块,则所有其他 SCSI 子系统驱动程序都必须是模块(这是由内核构建配置工具强制执行的)。
可以使用 modprobe <模块名称> 命令加载模块,该命令将尝试加载指定的 <模块名称> 所依赖的任何模块。此外,<模块名称> 不需要尾部的 ".o" 扩展名,如果未给出,则假定存在该扩展名。insmod <模块名称> 命令也会尝试加载 <模块名称>,但不会首先加载它所依赖的模块。关于模块如何导致其他模块被加载(并附加适当的参数)的规则通常放在文件/etc/modules.conf中。[请注意,在早期的 Linux 内核中,此文件通常称为/etc/conf.modules。] 有关此文件格式的更多信息,请尝试 man modules.conf。
任何模块都可以使用以下命令查询其允许的命令行参数:modinfo -p <模块名称>。
当高层驱动程序初始化时,如果没有任何主机处于活动状态,则中层将尝试加载名为“scsi_hostadapter”的模块。然后可以使用“别名”将“scsi_hostadapter”与底层(适配器)驱动程序的实际名称关联起来。例如,在/etc/modules.conf文件中,像“alias scsi_hostadapter aic7xxx”这样的一行将导致 aic7xxx 模块被加载(如果没有任何底层驱动程序已经处于活动状态)。[1]
模块参数“scsi_hostadapter”与 initrd 文件系统之间存在特殊关系。有关更多信息,请参阅 man initrd 和 man mkinitrd。[2]
[1] | 如果根文件系统位于要加载的底层(适配器)驱动程序控制的 SCSI 设备上,则此处存在排序问题,因为它包含/etc/modules.conf文件。此外,还存在引导加载程序如何从 SCSI 设备(通常来自(主)引导记录)获取初始内核映像的问题。后者通常由系统或适配器卡的 BIOS 处理。 | ||
[2] | 使用 mkinitrd 的示例:假设根分区位于连接到 Adaptec 控制器的 SCSI 磁盘上,该控制器需要 aic7xxx 驱动程序。在使用 aic7xxx 驱动程序指定为模块的情况下构建内核后,将映像加载到正常位置(可能在/boot目录中)。接下来,确保在/etc/modules.conf文件中包含像“alias scsi_hostadapter aic7xxx”这样的一行。然后从/boot目录执行像 mkinitrd /boot/initrd-2.4.5.img 2.4.5 这样的一行(这假设正在构建 lk 2.4.5)。这应该导致文件initrd-2.4.5.img被创建。然后,/etc/lilo.conf应该添加一个看起来像这样的部分
|