常见问题及疑问

1. 为什么当我运行 /sbin/ifconfig 时,会收到 Cannot locate module for net-pf-X 消息?
2. 启动 kerneld 后,当我激活 ppp 连接时,我的系统速度变得非常慢
3. kerneld 不加载我的 SCSI 驱动程序!
4. modprobe 抱怨 gcc2_compiled 未定义
5. 我的声卡驱动程序总是忘记音量等设置
6. DOSEMU 需要一些模块;我怎样才能让 kerneld 加载这些模块?
7. 为什么我会收到 Ouch, kerneld timed out, message failed 消息?
8. Mount 命令不等待 kerneld 加载文件系统模块
9. kerneld 无法加载 ncpfs 模块
10. kerneld 无法加载 smbfs 模块
11. 我将所有内容都构建为模块,现在我的系统无法启动或 kerneld 无法加载根文件系统模块!
12. kerneld 在启动时不会加载;它抱怨 libgdbm
13. 我收到 Cannot load module xxx 消息,但我刚刚重新配置了我的内核,没有 xxx 支持!
14. 我重新构建了我的内核和模块,但在启动时仍然收到关于未解析符号的消息
15. 我安装了 Linux 2.1/2.3,现在我无法加载任何模块!
16. 关于按需拨号联网呢?

1. 为什么当我运行 /sbin/ifconfig 时,会收到 Cannot locate module for net-pf-X消息?

大约在内核版本 1.3.80 左右,网络代码被更改为允许将协议族(例如 IPX、AX.25 和 AppleTalk)作为模块加载。这导致添加了一个新的 kerneld 请求net-pf-X,其中X是一个数字,用于标识协议(参见/usr/src/linux/include/linux/socket.h了解各种数字的含义)。不幸的是,ifconfig 意外地触发了这些消息,因此当系统启动并运行 ifconfig 来设置环回设备时,很多人会收到几条记录的消息。这些消息是无害的,您可以通过添加以下行来禁用它们

        alias net-pf-3 off      # Forget AX.25
        alias net-pf-4 off      # Forget IPX
        alias net-pf-5 off      # Forget AppleTalk

/etc/conf.modules。当然,如果您确实将 IPX 用作模块,则不应添加行来禁用 IPX。

2. 启动 kerneld 后,当我激活 ppp 连接时,我的系统速度变得非常慢

已经有一些关于此问题的报告。这似乎是 kerneld 和 tkPPP 脚本之间的不幸交互,该脚本在某些系统上用于设置和监视 PPP 连接。该脚本显然在运行 ifconfig 时运行循环。这会触发 kerneld 查找net-pf-X模块(见上文),保持系统负载较高,并可能将大量 Cannot locate module fornet-pf-X消息倾倒到系统日志中。除了不使用 tkPPP 或更改它以使用其他方式监视连接外,没有已知的解决方法。

3. kerneld 不加载我的 SCSI 驱动程序!

为您的 SCSI 主机适配器添加到您的/etc/conf.modules中。请参阅上面 scsi_hostadapter 条目的描述。

4. modprobe 抱怨 gcc2_compiled 未定义

这是模块实用程序中的一个错误,仅在使用 binutils 2.6.0.9 及更高版本时才会出现,并且也记录在 binutils 的发行说明中。因此,请阅读该说明,或获取模块实用程序的升级版本,以修复此错误。

5. 我的声卡驱动程序总是忘记音量等设置

模块的设置在加载时存储在模块本身内部。因此,当 kerneld 自动卸载模块时,您所做的任何设置都会被遗忘,并且下次加载模块时,它会恢复为默认设置。

您可以告诉 kerneld 在模块自动加载后运行程序来配置模块。请参阅 预安装/后安装 上的post-install条目。

6. DOSEMU 需要一些模块;我怎样才能让 kerneld 加载这些模块?

你不能。没有任何版本的 dosemu,无论是官方版本还是开发版本,都支持通过 kerneld 加载 dosemu 模块。但是,如果您运行的是 kernel 2.0.26 或更高版本,您不再需要特殊的 dosemu 模块;只需将 dosemu 升级到 0.66.1 或更高版本。

7. 为什么我会收到 Ouch, kerneld timed out, message failed 消息?

当内核向 kerneld 发送请求时,它希望在一秒钟内收到确认。如果 kerneld 没有发送此确认,则会记录此消息。请求将重新传输,最终应该可以通过。

这通常发生在负载非常高的系统上。由于 kerneld 是用户模式进程,因此它像系统上的任何其他进程一样被调度。在负载较高时,它可能无法及时运行以在内核超时之前发回确认。

如果即使在负载较轻时也发生这种情况,请尝试重新启动 kerneld。杀死 kerneld 进程,然后使用命令 /usr/sbin/kerneld 再次启动它。如果问题仍然存在,您应该向发送错误报告,但确保您的内核、kerneld 和模块实用程序的版本是最新的,然后再发布有关该问题的信息。检查linux/Documentation/Changes

8. Mount 命令不等待 kerneld 加载文件系统模块

已经有很多报告表明 mount(8) 命令不等待 kerneld 加载文件系统模块。lsmod 显示 kerneld 加载了模块,如果您立即重复 mount 命令,它将成功。这似乎是模块实用程序版本 1.3.69f 中的一个错误,会影响某些 Debian 用户。可以通过获取更高版本的模块实用程序来修复它。

9. kerneld 无法加载ncpfs模块

您需要使用 -DHAVE_KERNELD 编译 ncpfs 实用程序。请参阅 ncpfsMakefile.

10. kerneld 无法加载smbfs模块

您正在使用旧版本的 smbmount 实用程序。从 TSX-11 上的 SMBFS 存档 获取最新版本(0.10 或更高版本)

11. 我将所有内容都构建为模块,现在我的系统无法启动或 kerneld 无法加载根文件系统模块!

您不能模块化所有内容:内核必须内置足够的驱动程序,以便能够挂载您的根文件系统,并运行必要的程序来启动 kerneld[1]。您不能模块化

  • 根文件系统所在的硬盘驱动器的驱动程序

  • 根文件系统驱动程序本身

  • init、kerneld 和其他程序的二进制格式加载器

12. kerneld 在启动时不会加载;它抱怨 libgdbm

较新版本的 kerneld 需要 GNU dbm 库,libgdbm.so才能运行。大多数安装程序都将此文件放在/usr/lib中,但您可能在/usr文件系统挂载之前启动了 kerneld。这的一个症状是 kerneld 在启动期间(从您的 rc 脚本)不会启动,但是如果您在系统启动后手动启动它,则可以正常运行。解决方案是将 kerneld 启动移动到您的/usr挂载之后,或者将 gdbm 库移动到您的根文件系统,例如/lib.

13. 我收到 Cannot load modulexxx消息,但我刚刚重新配置了我的内核,没有xxx支持!

Slackware 安装(可能还有其他安装)构建了一个默认的/etc/rc.d/rc.modules,它对各种模块执行显式的 modprobe。究竟 modprobe 哪些模块取决于原始内核的配置。您可能已经重新配置了您的内核以排除一个或多个在 rc.modules 中 modprobe 的模块,因此会显示错误消息。通过注释掉您不再使用的任何模块来更新您的 rc.modules,或者完全删除rc.modules,并让 kerneld 在需要时加载模块。

14. 我重新构建了我的内核和模块,但在启动时仍然收到关于未解析符号的消息

您可能重新配置/重新构建了您的内核并排除了一些模块。您有一些不再使用的旧模块挂在/lib/modules目录中。最简单的解决方法是删除您的/lib/modules/x.y.z目录,并再次从内核源代码目录执行 make modules_install。请注意,此问题仅在重新配置内核而不更改版本时才会发生。如果您在移动到较新的内核版本时看到此错误,则说明您遇到了其他问题。

15. 我安装了 Linux 2.1/2.3,现在我无法加载任何模块!

奇数编号的 Linux 是开发内核。因此,应该预期事情会不时中断。发生重大变化的事情之一是模块的处理方式,以及内核和模块加载到内存中的位置。

简而言之,如果您想将模块与开发内核一起使用,则必须

如果您想将模块与 2.1 内核一起使用,我建议至少使用内核 2.1.29。

16. 关于按需拨号联网呢?

kerneld 最初对按需建立拨号网络连接提供了一些支持;尝试向未连接的网络发送数据包将导致 kerneld 运行/sbin/request_route脚本来设置 PPP 或 SLIP 连接。

事实证明这是一个坏主意。Linux 网络领域的 Alan Cox 在 linux-kernel 邮件列表中写道

request-route 的东西已经过时、损坏且不需要 [...] 它也已从 2.1.x 树中删除。

与其使用 request-route 脚本和 kerneld,我强烈建议使用 Eric Schenk 的 diald 软件包来管理您的按需拨号。

注释

[1]

实际上,这不是真的。较新的 1.3.x 和所有 2.x 内核都支持使用由 LILO 或 LOADLIN 加载的初始 ram-disk;可以从该磁盘在引导过程的早期加载模块。如何执行此操作在linux/Documentation/initrd.txt文件中进行了描述,该文件随内核源文件一起提供。