Как мне перечислить значения параметров загруженного модуля Linux?

77

Существует ли стандартный способ перечисления значений параметров загруженного модуля Linux? По сути, я ищу другой ответ на этот вопрос о параметрах модуля ядра Linux , потому что интересующий меня модуль не имеет /sys/modules/<module_name>/parametersинтерфейса.

cdleary
источник
4
Все ответы до сих пор заслуживают отрицательного голосования, потому что они не читали ОП внимательно («интересующий меня модуль не имеет интерфейса ... / параметров»)! :-(
Дирк

Ответы:

54

Вы можете сделать это с помощью этой простой односторонней команды, которая использует виртуальные файловые системы / 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
...
...

Надеюсь это поможет.

Раска
источник
Спасибо! Это очень полезно для диагностики всех видов проблем с проблемным оборудованием!
Oz123 10.12.12
Удивительно, и если вы передаете $ module в качестве, например, параметра функции вместо получения его из / proc / modules, вы легко получаете все параметры данного модуля.
igordcard
@RaSca - У вас есть какой-нибудь из этих ответов?
Дэн Гартвейт
Сначала это не сработало для меня, как я alias ls='ls -lah'. Хотя удаление псевдонима или запуск решения в виде скрипта работало отлично.
Дэвид Фаррелл
Объединяя это с grep в lsmod: lsmod | grep -i bluetooth> lsmodpattern.txt; cat lsmodpattern.txt | sed 's / | / /' | awk '{print $ 4}'> patternmodules.txt; cat patternmodules.txt | tr, '\ n' | во время чтения модуля; do echo "Module: $ module"; if [-d "/ sys / module / $ module / parameters"]; тогда ls / sys / module / $ module / parameters / | пока читаешь параметр; do echo -n "Параметр: $ параметр ="; cat / sys / module / $ module / parameters / $ parameter; сделанный; Fi; сделано
Ferroao
38

Вы можете использовать команду 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"
cdauth
источник
4
Команда systoolявляется частью пакета sysfsutils. И это ответ, я думаю, (но мог бы иметь пример выходных данных)
Volker Siegel
Используя это для запроса нескольких модулей в моей системе, кажется, что этот Parameters:раздел присутствует в выходных данных только для модулей, которые предоставляют /sys/modules/<module_name>/parametersинтерфейс. Так что, к сожалению, это не удовлетворяет предпосылке вопроса.
Бекон
14
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
Дэн Гартвейт
источник
7

Вы можете использовать команду " modinfo (8) ", чтобы получить доступные параметры времени загрузки для модуля. Например:

# modinfo e100 | grep parm
parm:           debug:Debug level (0=none,...,16=all) (int)
parm:           eeprom_bad_csum_allow:Allow bad eeprom checksums (int)
parm:           use_io:Force use of i/o access mode (int)

Что касается получения параметров загруженных модулей, попробуйте объединить команду modinfo с простым "lsmod | awk '{print $ 1}'"

Как в:

lsmod | awk '{print $1 }'combi > myfile.txt
tail -n +2 myfile.txt > myfile.txt.tmp && mv myfile.txt.tmp myfile.txt
while read -r LINE; do echo "$LINE">>results.txt;modinfo "$LINE" | grep ^desc>>results.txt;modinfo "$LINE" | grep parm>> results.txt; done < myfile.txt
katriel
источник
14
-1 Это только показывает что-то вроде страницы руководства, но не говорит о том, что значения.
Александр Левчук
1

Выглядел бы ужасно как комментарий, но я сделал эту проверку в моей системе ..

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 для него нет? Конечно, в моей системе я не смог найти никаких примеров этого с помощью команды, представленной выше.

Мэтью Ифе
источник
1

Для iwlwifi и других модулей я использовал это:

 grep [[:alnum:]] /sys/module/iwl*/parameters/*

и я получаю этот вывод:

 /sys/module/iwlmvm/parameters/init_dbg:N
 /sys/module/iwlmvm/parameters/power_scheme:2
 /sys/module/iwlmvm/parameters/tfd_q_hang_detect:Y
 /sys/module/iwlwifi/parameters/11n_disable:0
 /sys/module/iwlwifi/parameters/amsdu_size:0
 /sys/module/iwlwifi/parameters/antenna_coupling:0
 /sys/module/iwlwifi/parameters/bt_coex_active:Y
 /sys/module/iwlwifi/parameters/d0i3_disable:Y
 /sys/module/iwlwifi/parameters/d0i3_timeout:1000
 /sys/module/iwlwifi/parameters/disable_11ac:N
 /sys/module/iwlwifi/parameters/fw_monitor:N
 /sys/module/iwlwifi/parameters/fw_restart:Y
 /sys/module/iwlwifi/parameters/lar_disable:N
 /sys/module/iwlwifi/parameters/led_mode:0
 /sys/module/iwlwifi/parameters/nvm_file:(null)
 /sys/module/iwlwifi/parameters/power_level:0
 /sys/module/iwlwifi/parameters/power_save:N
 /sys/module/iwlwifi/parameters/swcrypto:0
 /sys/module/iwlwifi/parameters/uapsd_disable:3

Я думаю, вы могли бы попробовать что-то вроде:

 grep [[:alnum:]] /sys/module/<module_name>/parameters/*

Дайте мне знать, если это работает для вас.

Гомеро эсмеральдо
источник
grep .вероятно, будет работать так же хорошо с меньшим набором текста. :)
dannysauer
Да, в этом случае,grep . /sys/module/<module_name>/parameters/*
Гомер Эсмеральдо
Что-то, что я только что заметил - если вы используете подстановочный знак и есть только один параметр, он просто показывает содержимое файла - без имени файла. Однако, если вы используете grep -Rи оставляете подстановочный знак вне каталога параметров, он всегда показывает имя файла. Бонусные баллы: также добавьте --colorв grep и получите имя файла + значение, дифференцированное по цветам. ;) Напримерgrep -R --color '.' /sys/module/block/parameters/
dannysauer
(не берите в голову, что человек, задающий вопрос, специально спросил о модулях, которые не предоставляют API / параметров: D)
dannysauer
0

Отрабатывая работу Катриэля, вы можете получить (по-видимому, некрасивый) однострочник, объединив их в цикле bash:

for i in `lsmod | awk '{print $1}'`; do echo "$i: "; modinfo $i | grep parm; done
писец
источник
2
использование awk для простого возврата первого аргумента через printнесколько грубо - используйте while readвместо этого синтаксис: lsmod | while read a b; do echo $a:; modinfo $a | grep parm | sed -e 's/parm://'; done- это не меняет того факта, что modinfo не возвращает значения параметров, хотя ...
the-wabbit
7
и я думаю, что оригинальный вопрос был об используемых параметрах, а не о доступных .
asdmin