在启动时加载内核模块的选项

在启动时加载内核模块的选项

我有一台使用 Qualcomm Atheros 驱动程序的设备,我已经重新安装了该驱动程序。为了正确使用该设备,我需要加载带有选项的模块:

sudo modprobe -r ath10k_pci      # remove module
sudo modprobe -r ath10k_core     # remove module
sudo modprobe ath10k_core rawmode=1 cryptmode=1
sudo modprobe ath10k_pci

我可以使用以下命令验证模块是否已正确加载systool -v -m ath10k_core

Module = "ath10k_core"

  Attributes:
    coresize            = "503808"
    initsize            = "0"
    initstate           = "live"
    refcnt              = "1"
    srcversion          = "8846560394C80047DEEC13F"
    taint               = ""
    uevent              = <store method only>

  Parameters:
    coredump_mask       = "3"
    cryptmode           = "1"
    debug_mask          = "0"
    fw_diag_log         = "N"
    rawmode             = "Y"
    skip_otp            = "N"
    uart_print          = "N"

  Sections:

现在我想在启动时自动执行此操作。我用过这个帖子:systemd:在启动时自动执行 modprobe 命令

我创建了一个文件/etc/modules-load.d/ath10k_core.conf

options ath10k_core rawmode=1 cryptmode=1

但是当我启动时,结果systool -v -m ath10k_core是:

Module = "ath10k_core"

  Attributes:
    coresize            = "503808"
    initsize            = "0"
    initstate           = "live"
    refcnt              = "1"
    srcversion          = "8846560394C80047DEEC13F"
    taint               = ""
    uevent              = <store method only>

  Parameters:
    coredump_mask       = "3"
    cryptmode           = "0"
    debug_mask          = "0"
    fw_diag_log         = "N"
    rawmode             = "N"
    skip_otp            = "N"
    uart_print          = "N"

  Sections:

所以模块没有正确加载,我需要手动运行它。

该命令的结果journalctl -u systemd-modules-load.service是:

déc. 07 17:07:18 ubuntu-machine systemd-modules-load[263]: Failed to find module 'options ath10k_core rawmode=1 cryptmode=1'

我运行的是 Ubuntu 20.04。我的配置有什么问题吗?

答案1

您正在查看错误的配置文件。/etc/modules-load.d/将告诉系统在引导阶段加载内核模块,即使没有立即需要它们:

systemd-modules-load.service(8)从上述目录中读取文件,其中包含要在引导期间加载的静态列表中的内核模块。每个配置文件都以 /etc/modules-load.d/program.conf.请注意,通常更好的主意是依靠 PCI ID、USB ID、DMI ID 或内核模块本身中编码的类似触发器来自动加载模块,而不是像这样的静态配置。事实上,大多数现代内核模块已经准备好自动加载。

这通常被复制到初始化文件系统引导文件,所以这会很早就发生。由于语法错误,当前文件告诉加载一个名为的内核模块,options options ath10k_core rawmode=1 cryptmode=1该模块失败,因为没有这样的模块。

这部分不会告诉系统向模块添加选项。实际上很少需要。

要定义自定义模块选项,有/etc/modprobe.d/(以及其他系统预留的位置):

由于该modprobe命令可以添加或删除多个模块,并且由于模块具有依赖性,因此我们需要一种方法来指定这些模块要使用哪些选项。/etc/modprobe.d目录下以扩展名结尾的所有文件.conf都根据需要指定这些选项。它们还可以用于创建方便的别名:模块的备用名称,或者对于那些有特殊要求(例如插入多个模块)的人来说,它们可以完全覆盖正常的 modprobe 行为。

modprobe 也是由内核作为辅助程序运行,以加载刚刚检测到的硬件模块(如前所述,通过 PCI ID 等)。

因此内容应该移动,例如/etc/modprobe.d/ath10k_core.conf

options ath10k_core rawmode=1 cryptmode=1

我认为您根本不必尽早加载它(通过使用ath10k_core可能后跟ath10k_pciin 的简单行/etc/modules-load.d/ath10k_core.conf),但如果选择这样做,update-initramfs -u可能会建议运行一次,以便选项也被复制到初始化文件系统否则在下次内核升级之前它可能仍然会失败。

相关内容