如何列出已加载的 Linux 模块参数值?

如何列出已加载的 Linux 模块参数值?

有没有标准方法来列出已加载的 Linux 模块的参数值?我本质上是在寻找这个问题的另一个答案Linux内核模块参数问题,因为我感兴趣的模块没有/sys/modules/<module_name>/parameters接口。

答案1

您可以使用这个简单的单向命令来完成此操作,该命令使用 /proc/modules 和 /sys 虚拟文件系统:

cat /proc/modules | cut -f 1 -d " " | while read module; do \
 echo "Module: $module"; \
 if [ -d "/sys/module/$module/parameters" ]; then \
  ls /sys/module/$module/parameters/ | while read parameter; do \
   echo -n "Parameter: $parameter --> "; \
   cat /sys/module/$module/parameters/$parameter; \
  done; \
 fi; \
 echo; \
done

您将获得如下输出:

...
...
Module: vboxnetadp

Module: vboxnetflt

Module: vboxdrv
Parameter: force_async_tsc --> 0

Module: binfmt_misc

Module: uinput

Module: fuse
Parameter: max_user_bgreq --> 2047
Parameter: max_user_congthresh --> 2047

Module: md_mod
Parameter: new_array --> cat: /sys/module/md_mod/parameters/new_array: Permission denied
Parameter: start_dirty_degraded --> 0
Parameter: start_ro --> 0

Module: loop
Parameter: max_loop --> 0
Parameter: max_part --> 0

Module: kvm_intel
Parameter: emulate_invalid_guest_state --> N
Parameter: ept --> Y
Parameter: fasteoi --> Y
Parameter: flexpriority --> Y
Parameter: nested --> N
Parameter: ple_gap --> 0
Parameter: ple_window --> 4096
Parameter: unrestricted_guest --> Y
Parameter: vmm_exclusive --> Y
Parameter: vpid --> Y
Parameter: yield_on_hlt --> Y

Module: kvm
Parameter: allow_unsafe_assigned_interrupts --> N
Parameter: ignore_msrs --> N
Parameter: min_timer_period_us --> 500

Module: tpm_infineon

Module: joydev

Module: snd_hda_codec_hdmi
Parameter: static_hdmi_pcm --> N
...
...

希望这可以帮助。

答案2

你可以使用命令。大多数系统上的软件包systool -vm <Module name>都自带该命令。sysfsutils

输出结果如下,其中有一部分Parameters

linux ~ # systool -vm btusb
Module = "btusb"

  Attributes:
    coresize            = "40960"
    initsize            = "0"
    initstate           = "live"
    refcnt              = "0"
    srcversion          = "D69A7EC073BC0145C2DE5C3"
    taint               = ""
    uevent              = <store method only>
    version             = "0.8"

  Parameters:
    disable_scofix      = "N"
    force_scofix        = "N"
    reset               = "Y"

  Sections:
    .bss                = "0xffffffffa090d800"
    .data               = "0xffffffffa090d000"
    .exit.text          = "0xffffffffa09096ff"
    .gnu.linkonce.this_module= "0xffffffffa090d4c0"
    .init.text          = "0xffffffffa0910000"
    .note.gnu.build-id  = "0xffffffffa090a000"
    .rodata             = "0xffffffffa090b060"
    .rodata.str1.1      = "0xffffffffa090a024"
    .rodata.str1.8      = "0xffffffffa090a2b0"
    .smp_locks          = "0xffffffffa090af84"
    .strtab             = "0xffffffffa0912668"
    .symtab             = "0xffffffffa0911000"
    .text               = "0xffffffffa0905000"
    __mcount_loc        = "0xffffffffa090c3d8"
    __param             = "0xffffffffa090c360"
    __verbose           = "0xffffffffa090d0f8"

答案3

grep -H '' /sys/module/ath9k*/parameters/*

/sys/module/ath9k/parameters/blink:1
/sys/module/ath9k/parameters/bt_ant_diversity:0
/sys/module/ath9k/parameters/btcoex_enable:0
/sys/module/ath9k/parameters/nohwcrypt:1
/sys/module/ath9k/parameters/ps_enable:0

grep -H '' /sys/module/acpi_cpufreq/parameters/*
/sys/module/acpi_cpufreq/parameters/acpi_pstate_strict:0

答案4

作为评论,这听起来很难看,但我在我的系统上做了这个检查。

cat /proc/modules  | cut -d " " -f1 | while read mod; do
   test -d /sys/module/$mod/parameters || echo modinfo $mod | grep parm; 
done

检查 /sys 中没有参数的模块是否显示为在 modinfo 中有参数,但我找不到任何参数。?

我不是专家,但这里的区别在于,modinfo 通过查看 .modinfo elf 标头来读取模块文件本身的参数,而 sys 则从其运行时变体中读取这些参数。

可能有一些参数可以在运行时修改,但不会作为 modinfo 参数值出现,但由于模块格式应该是相当固定的,所以我想象不出在加载时可以将选项参数传递给模块没有有一个与其链接的 .modinfo 结构。

当您通过这种方式检查模块时,模块是否提示有可通过 modinfo 传递的参数,但 /sys 中却没有该参数?当然,在我的系统上,我无法使用上面提供的命令找到任何此类示例。

编辑:所有这些都是错误的,因为如果你真的检查我所做的事情,你会注意到这echo mod $mod | grep parm实际上永远不会产生答案。

如果您执行以下操作...

cat /proc/modules  | cut -d " " -f1 | while read mod; do
    test -d /sys/module/$mod/parameters || (modinfo $mod | grep parm && echo $mod)
done

您会发现各种各样的模块,它们不包含parameters目录,/sys/module/$mod但在运行时其实例中包含参数。

相反,你也可以这样做:

for mod in $(cat /proc/modules | cut -d" " -f1; do
  if [ -d /sys/module/$mod/parameters ]; then 
    for p in /sys/module/$mod/parameters/*; do 
      p=$(basename $p)
      modinfo $mod -F parm | grep -q $p || echo $mod $p
    done;
  fi;
done

查找确实具有参数值的模块的示例,/sys/module/$mod/parameters但是在 中设置了一个参数modinfo

相关内容