kerneld 如何知道要加载哪个模块?

尽管 kerneld 自身内置了关于最常见模块类型的知识,但在某些情况下,kerneld 将不知道如何处理来自内核的请求。CD-ROM 驱动程序或网络驱动程序就是这种情况,因为可能有多个可能的模块可以加载。

kerneld 守护进程从内核收到的请求属于以下项目之一

kerneld 通过扫描配置文件来确定应加载哪个模块/etc/conf.modules[1]。此文件中有两种类型的条目:模块文件所在路径,以及为给定服务分配要加载的模块的别名。如果您还没有此文件,则可以通过运行以下命令创建它

  /sbin/modprobe -c | grep -v '^path' /etc/conf.modules

如果您想将另一个路径指令添加到默认路径,则必须同时包含所有默认路径,因为/etc/conf.modules中的路径指令将替换 modprobe 默认知道的所有路径!

通常,您不需要自行添加任何路径,因为内置集合应能处理所有正常设置(以及更多...),我保证!

另一方面,如果您只想添加别名或选项指令,则您在/etc/conf.modules中的新条目将添加到 modprobe 已知的条目中。如果您应该重新定义别名或选项,则您在/etc/conf.modules中的新条目将覆盖内置条目。

块设备

如果您运行 /sbin/modprobe -c,您将获得 kerneld 知道的模块列表,以及它们对应的请求。例如,最终加载软盘驱动程序的请求是针对主设备号为 2 的块设备的

  osiris:~ $ /sbin/modprobe -c | grep floppy
  alias block-major-2 floppy

为什么是block-major-2?因为软盘设备/dev/fd*使用主设备 2 并且是块设备

  osiris:~ $ ls -l /dev/fd0 /dev/fd1
  brw-rw-rw-   1 root     root       2,   0 Mar  3  1995 /dev/fd0
  brw-r--r--   1 root     root       2,   1 Mar  3  1995 /dev/fd1

字符设备

字符设备的处理方式类似。例如,ftape 软盘磁带驱动程序位于主设备 27 上

  osiris:~ $ ls -lL /dev/ftape 
  crw-rw----   1 root     disk      27,   0 Jul 18  1994 /dev/ftape

但是,kerneld 默认情况下不知道 ftape 驱动程序 - 它未在 /sbin/modprobe -c 的输出中列出。因此,要设置 kerneld 以加载 ftape 驱动程序,我必须向 kerneld 配置文件添加一行,/etc/conf.modules:

  alias char-major-27 ftape

网络设备

您也可以使用设备名称而不是char-major-xxxblock-major-yyy设置。这对于网络驱动程序尤其有用。例如,充当eth0的 ne2000 网卡驱动程序将通过以下方式加载

  alias eth0 ne

如果您需要将一些选项传递给驱动程序,例如告诉模块网卡正在使用的 IRQ,则必须添加一个 "options"

  options ne irq=5

这将导致 kerneld 使用以下命令加载 NE2000 驱动程序

  /sbin/modprobe ne irq=5

当然,可用的实际选项特定于您正在加载的模块。

二进制格式

二进制格式的处理方式类似。每当您尝试运行内核不知道如何加载的程序时,kerneld 都会收到binfmt-xxx的请求,其中xxx是从可执行文件的头几个字节确定的数字。因此,用于支持加载 ZMAGIC (a.out) 可执行文件的 binfmt_aout 模块的 kerneld 配置是

  alias binfmt-267 binfmt_aout

由于 ZMAGIC 文件的幻数是 267,如果您检查/etc/magic,您将看到数字 0413;请记住/etc/magic使用八进制数,而 kerneld 使用十进制数,八进制 413 = 十进制 267。实际上,a.out 可执行文件有三种略有不同的变体(NMAGIC、QMAGIC 和 ZMAGIC),因此为了完全支持 binfmt_aout 模块,我们需要

  alias binfmt-264 binfmt_aout  # pure executable (NMAGIC)
  alias binfmt-267 binfmt_aout  # demand-paged executable (ZMAGIC)
  alias binfmt-204 binfmt_aout  # demand-paged executable (QMAGIC)

kerneld 会自动识别 a.out、Java 和 iBCS 二进制格式,无需任何配置。

线路规程(slip、cslip 和 ppp)

线路规程通过tty-ldisc-x请求,其中x通常为 1(对于 SLIP)或 3(对于 PPP)。kerneld 自动识别这两种类型。

说到 ppp,如果您希望 kerneld 为 ppp 加载 bsd_comp 数据压缩模块,则必须将以下两行添加到您的/etc/conf.modules:

  alias tty-ldisc-3 bsd_comp
  alias ppp0 bsd_comp

网络协议族(IPX、AppleTalk、AX.25)

一些网络协议也可以作为模块加载。内核向 kerneld 请求协议族(例如 IPX),请求为net-pf-X,其中X是一个数字,指示所需的族。例如,net-pf-3是 AX.25,net-pf-4是 IPX,而net-pf-5是 AppleTalk;这些数字由 linux 源文件中的 AF_AX25、AF_IPX 等定义确定include/linux/socket.h。因此,要自动加载 IPX 模块,您需要在/etc/conf.modules:

  alias net-pf-4 ipx

中添加如下条目。有关如何避免与未定义的协议族相关的烦人的启动时消息的信息,请参阅常见问题

文件系统

kerneld 对文件系统的请求只是文件系统类型的名称。一个常见的用途是为 CD-ROM 文件系统(即 iso9660 类型的文件系统)加载 isofs 模块

  alias iso9660 isofs

注释

[1]

某些发行版将此文件称为modules.conf