我的许多模块缺少 /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.h
NVidia 驱动程序包内),其使用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_modeset
、nvidia_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 发送增强请求。