모듈에 /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

그러나 더미에는 매개변수가 없습니다. 이것은 단지 더미일 뿐입니다.

# 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");

명시적으로 0으로 지정되어 permsysfs에서 매개변수가 보이지 않게 됩니다.

메인 모듈은 사용법 매개변수 가 0으로 설정된 nvidia자체 NV_MODULE_PARAMETER(x)매크로 NV_MODULE_STRING_PARAMETER(x)( common/inc/nv-linux.hNVidia 드라이버 패키지 내) 를 선언합니다.module_param()perm

#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드라이버 패키지 참조). 아마도 이것은 적어도 Windows와 Linux 간에 유사하다는 점에서 NVidia 드라이버 매개변수에 대한 크로스 플랫폼 인터페이스를 제공하려는 시도일까요?

또한 이 모듈은 하나의 더미 파일에 모든 매개변수를 제공하는 nvidia자체 더미 파일을 제공합니다 ./proc/driver/nvidia/params

간단히 말해서, /proc/driver/nvidia/params그것이 귀하의 필요에 맞는지 확인하는 것이 좋습니다. 그렇지 않고 NVidia 드라이버의 사용자 정의 버전을 만들 의향이 있는 경우, NV_MODULE_PARAMETER()및 매크로의 정의 를 0이 아닌 값을 NV_MODULE_STRING_PARAMETER()갖도록 변경해 볼 수 있습니다. 예를 들면 다음과 같습니다.perm

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

/sys/module/*/parameters이 방식으로 선언된 모든 매개변수를 이 인터페이스를 사용하는 루트 사용자만 읽을 수 있도록 만듭니다 .

유효한 경우 NVidia에 개선 요청을 보낼 수 있습니다.

관련 정보