如何永久加载内核模块?


13

我有一个Compaq Presario CQ-61 320SQ,我使用的是Ubuntu 10.04,因为在更新到10.10之后,我的鼠标和触摸板将无法工作,网络将无法工作,声音将无法工作...(我设法修复了大多数问题经过将近一个月的搜索,但不是全部,我的2个台式机在10.10上都没有问题),所以我决定切换回10.04,我遇到了问题:

由于内核模块r8169,我的宽带速度非常低,我下载了好的模块,r8101并且每次计算机启动都有一个rc.local条目来解决此问题。

问题:是否
可以从特定位置永久加载模块。我听说过,/etc/modules但是我需要模块名称,但是必须从特定路径(默认路径在哪里)加载它?

谢谢。

所以我研究了脚本:

它创建了文件r8101.ko/lib/modules/`uname -r`/kernel/drivers/net所以我认为只要没有人会删除该文件,并且我不更新内核,也许添加r8108/etc/modules工作就可以了,然后添加r8169到黑名单中...我将尝试一下。

EDIT2:
所以我说r8101/etc/modulesblacklist r8169/etc/modprobe.d/blacklist.conf。它仍然使用旧模块:

radu@adu:~$ lsmod | grep r8
r8101                  67626  0 
r8169                  34108  0 
mii                     4381  1 r8169

编辑:使用此模块随附的脚本加载模块:

#!/bin/sh

# invoke insmod with all arguments we got
# and use a pathname, as insmod doesn't look in . by default

TARGET_PATH=/lib/modules/`uname -r`/kernel/drivers/net
echo
echo "Check old driver and unload it." 
check=`lsmod | grep r8169`
if [ "$check" != "" ]; then
        echo "rmmod r8169"
        /sbin/rmmod r8169
fi

check=`lsmod | grep r8101`
if [ "$check" != "" ]; then
        echo "rmmod r8101"
        /sbin/rmmod r8101
fi

echo "Build the module and install"
echo "-------------------------------" >> log.txt
date 1>>log.txt
make all 1>>log.txt || exit 1
module=`ls src/*.ko`
module=${module#src/}
module=${module%.ko}

if [ "$module" == "" ]; then
    echo "No driver exists!!!"
    exit 1
elif [ "$module" != "r8169" ]; then
    if test -e $TARGET_PATH/r8169.ko ; then
        echo "Backup r8169.ko"
        if test -e $TARGET_PATH/r8169.bak ; then
            i=0
            while test -e $TARGET_PATH/r8169.bak$i
            do
                i=$(($i+1))
            done
            echo "rename r8169.ko to r8169.bak$i"
            mv $TARGET_PATH/r8169.ko $TARGET_PATH/r8169.bak$i
        else
            echo "rename r8169.ko to r8169.bak"
            mv $TARGET_PATH/r8169.ko $TARGET_PATH/r8169.bak
        fi
    fi
fi

echo "Depending module. Please wait."
depmod -a
echo "load module $module"
modprobe $module

echo "Completed."
exit 0

如果可以将其添加到/ etc / modules中,则应回答自己的问题。
哈维尔·里维拉

正如所料,更新的问题没有工作
拉杜·马里斯

7
如果编辑/ etc / modules,则需要运行(以sudo身份)update-initramfs -u,然后重新启动。
papukaija 2011年

1
@papukaija:老兄,你真是个天才,tks :)
Radu Maris

Answers:


12

因此,要收集所有数据以获得答案,这里是:

  1. 新模块的第一编译后,我不得不模块文件r8101.ko/lib/modules/$(uname -r)/kernel/drivers/net

  2. 我说r8101/etc/modulesblacklist r8169/etc/modprobe.d/blacklist.conf,但我仍然启动到旧模块。

  3. 然后我运行sudo update-initramfs -u,然后在重新启动后按预期加载了新模块(感谢@papukaija注释)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.