Kernel-Modules

在啟動時使用選項載入核心模組

  • December 8, 2021

我有一台使用已重新安裝的 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。我的配置有什麼問題?

您正在查看錯誤的配置文件。/etc/modules-load.d/將告訴系統在引導階段載入核心模組,即使沒有立即需要它們:

systemd-modules-load.service(8)從上述目錄中讀取包含核心模組的文件,以在靜態列表中載入。每個配置文件都以 /etc/modules-load.d/program.conf. **請注意,依靠 PCI ID、USB ID、DMI ID 或核心模組本身編碼的類似觸發器自動載入模組通常是一個更好的主意,而不是像這樣的靜態配置。**事實上,大多數現代核心模組已經為自動載入做好了準備。

這通常被複製到initramfs引導文件中,因此會提前發生。由於語法錯誤,目前該文件告訴載入一個核心模組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可能會建議執行一次,因此這些選項也會復製到initramfs中,否則它可能仍然會失敗直到下一次核心升級。

引用自:https://unix.stackexchange.com/questions/680689