模块缺少 /sys/module/*/parameters 目录,如何启用它们?

模块缺少 /sys/module/*/parameters 目录,如何启用它们?

我的许多模块缺少 /sys/module/*/parameters 目录,我无法检查模块加载的参数。

# printf "%s\n" /sys/module/*/parameters | wc -l
125
# lsmod | wc -l
151
# comm -13 <(printf "%s\n" /sys/module/*/parameters | xargs dirname | xargs basename -a | sort) <(lsmod | awk '{print $1}' | sort) | fmt
Module aesni_intel at24 blake2b_generic bpf_preload btbcm btintel
btmtk btrfs btrtl crc16 crc32_pclmul crc32c_generic crc32c_intel
crct10dif_pclmul cryptd crypto_simd crypto_user dummy ecdh_generic fat
gf128mul ghash_clmulni_intel i2c_smbus iTCO_vendor_support iTCO_wdt
intel_cstate intel_pmc_bxt intel_rapl_common intel_rapl_msr intel_uncore
ip6_tables ip6t_REJECT ip6table_filter ip6table_mangle ip6table_nat
ip6table_raw ip_tables ipt_REJECT iptable_filter iptable_mangle
iptable_nat iptable_raw irqbypass joydev ledtrig_audio libcrc32c lpc_ich
mac_hid mei mei_hdcp mei_me mei_pxp mei_wdt nf_conntrack_broadcast
nf_conntrack_netlink nf_conntrack_pptp nf_defrag_ipv4 nf_defrag_ipv6
nf_log_syslog nf_nat nf_nat_amanda nf_nat_ftp nf_nat_h323 nf_nat_irc
nf_nat_pptp nf_nat_sip nf_nat_snmp_basic nf_nat_tftp nf_reject_ipv4
nf_reject_ipv6 nfnetlink nfnetlink_log nvidia nvme_common parport
polyval_clmulni polyval_generic ppdev raid6_pq rapl sha512_ssse3
snd_hda_codec_conexant snd_hda_codec_generic snd_hda_core snd_hwdep ts_kmp
tun uas vboxnetadp vboxnetflt vfat vmd x_tables xhci_pci xhci_pci_renesas
xor xt_CT xt_LOG xt_NFLOG xt_addrtype xt_comment xt_conntrack xt_hashlimit
xt_mark xt_multiport xt_tcpudp

最值得注意的是我感兴趣的是:

# lsmod | grep nvidia
nvidia_drm             77824  20
nvidia_modeset       1515520  40 nvidia_drm
nvidia_uvm           2891776  0
video                  69632  1 nvidia_modeset
nvidia              61472768  2179 nvidia_uvm,nvidia_modeset
# ls /sys/module/nvidia/parameters
ls: cannot access '/sys/module/nvidia/parameters': No such file or directory

但 dummy 也没有参数,这就是一个 dummy:

# modprobe dummy numdummies=12
# lsmod | grep dummy
dummy                  16384  0
root@leonidas /root
# ls /sys/module/dummy/parameters
ls: cannot access '/sys/module/dummy/parameters': No such file or directory
# ip a | grep dummy | wc -l
12

我发现https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1774731关于还缺少虚拟/参数目录。

如何启用该目录以便我可以获得内核模块参数?

答案1

为了让模块的参数在 中可见/sys/module/*/parameters,模块需要module_param_cb()为每个参数提供一个回调函数。这些函数必须“知道在哪里查找”相应参数的当前设置,因此sysfs文件系统驱动程序可以使用它们来按需找出参数及其状态。

如果模块使用module_param(name, type, perm)或宏来声明其参数,则除非指定为 0,module_param_named(name, value, type, perm)否则会自动生成回调函数。perm

dummy模块声明其模块参数如下:

module_param(numdummies, int, 0);
MODULE_PARM_DESC(numdummies, "Number of dummy pseudo devices");

显式指定perm为 0,这使得该参数在 sysfs 中不可见。

nvidia模块声明了自己的NV_MODULE_PARAMETER(x)NV_MODULE_STRING_PARAMETER(x)(在common/inc/nv-linux.hNVidia 驱动程序包内),其使用module_param()参数perm设置为 0:

#define NV_MODULE_PARAMETER(x)          module_param(x, int, 0)
#define NV_MODULE_STRING_PARAMETER(x)   module_param(x, charp, 0)

驱动程序包中的其他模块(例如nvidia_modesetnvidia_drm和 )确实以更正常的方式nvidia_uvm使用module_param(),并且这些模块确实具有预期的参数/sys/module/*/parameters

显然,该nvidia模块在内部将其参数处理为所谓的“注册表项”(请参阅nvidia/nv-reg.h​​驱动程序包)。也许这是为 NVidia 驱动程序参数提供跨平台接口的某种尝试,至少在某种意义上 Windows 和 Linux 之间是相似的?

另请注意,该nvidia模块提供了自己的/proc/driver/nvidia/params伪文件,该文件在一个虚拟文件中提供所有参数。

所以,简而言之:我建议您看看/proc/driver/nvidia/params它是否适合您的需求。如果没有,并且您愿意构建 NVidia 驱动程序的自定义版本,您可以(自行承担风险)尝试更改NV_MODULE_PARAMETER()NV_MODULE_STRING_PARAMETER()宏的定义,使其具有perm非 0 的值,例如:

#define NV_MODULE_PARAMETER(x)          module_param(x, int, 0400)
#define NV_MODULE_STRING_PARAMETER(x)   module_param(x, charp, 0400)

使以这种方式声明的所有参数/sys/module/*/parameters只能由 root 用户使用该接口读取。

如果有效,您可以向 NVidia 发送增强请求。

相关内容