Como listar os valores dos parâmetros do módulo Linux carregados?

77

Existe uma maneira padrão de listar os valores dos parâmetros de um módulo Linux carregado? Estou essencialmente procurando outra resposta para essa pergunta de parâmetros do módulo do kernel Linux , porque o módulo em que estou interessado não tem uma /sys/modules/<module_name>/parametersinterface.

cdleary
fonte
4
Todas as respostas até agora merecem uma votação negativa, porque não leram o OP com atenção ("o módulo no qual estou interessado não possui uma interface ... / parâmetros")! :-(
Dirk

Respostas:

54

Você pode fazer isso usando este comando unidirecional simples, que usa os sistemas de arquivos virtuais / proc / modules e / 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

Você obterá uma saída como esta:

...
...
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
...
...

Espero que isto ajude.

RaSca
fonte
Obrigado! Isso é muito útil para diagnosticar todos os tipos de problemas com hardware problemático!
Oz123
Incrível, e se você passar $ module como, por exemplo, parâmetro de função, em vez de obtê-lo em / proc / modules, você obtém facilmente todos os parâmetros de um determinado módulo.
Igordcard
@RaSca - Alguma dessas respostas funcionou para você?
Dan Garthwaite 02/02
No começo, isso não funcionou para mim como eu alias ls='ls -lah'. Remover o alias ou executar a solução como um script funcionou muito bem.
David Farrell
Combinando isso com um grep no lsmod: lsmod | grep -i bluetooth> lsmodpattern.txt; cat lsmodpattern.txt | sed / s / | / / '| awk '{print $ 4}'> patternmodules.txt; cat patternmodules.txt | tr, '\ n' | enquanto lê o módulo; faça eco "Módulo: $ module"; if [-d "/ sys / module / $ module / parameters"]; então ls / sys / module / $ module / parameters / | enquanto parâmetro de leitura; do echo -n "Parâmetro: $ parameter ="; cat / sys / module / $ module / parameters / $ parameter; feito; fi; feito
Ferroao 30/08
38

Você pode usar o comando systool -vm <Module name>. Ele vem com o sysfsutilspacote na maioria dos sistemas.

É assim que a saída será, há uma seção 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
fonte
4
O comando systoolfaz parte do pacote sysfsutils. E esta é a resposta que eu acho, (mas poderia ter uma saída exemplo)
Volker Siegel
Usando isso para consultar um punhado de módulos no meu sistema, parece que a Parameters:seção está presente apenas na saída dos módulos que expõem uma /sys/modules/<module_name>/parametersinterface. Infelizmente, isso não satisfaz a premissa da pergunta.
BACON
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
Dan Garthwaite
fonte
7

Você pode usar o comando " modinfo (8) " para obter os parâmetros de tempo de carregamento disponíveis para um módulo. Por exemplo:

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

Quanto a obter os parâmetros dos módulos carregados, tente combinar o comando modinfo com um simples "lsmod | awk '{print $ 1}'"

Como em:

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
fonte
14
-1 Isso mostra apenas algo como uma página de manual, mas não diz quais são os valores.
Aleksandr Levchuk
1

Ficaria feio como um comentário, mas eu fiz essa verificação no meu sistema ..

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

Para verificar se os módulos sem parâmetros em / sys aparecem como tendo parâmetros no modinfo, mas não consegui encontrar nenhum.

Não sou especialista, mas a diferença aqui é que o modinfo lê o próprio arquivo de módulo para os parâmetros, procurando nos cabeçalhos .modinfo elf, enquanto o sys os lê na sua variante de tempo de execução.

Pode ser possível ter parâmetros que você pode modificar em tempo de execução que não apareça como um valor de parâmetro modinfo, mas como o formato do módulo deve ser bastante fixo, não imagino que seja possível passar um parâmetro opcional para um módulo ao carregar sem que exista. uma estrutura .modinfo para ela vinculada.

Estou curioso, seu módulo sugere que existem parâmetros passáveis ​​com modinfo quando você o verifica dessa maneira, mas não há nenhum / sys para ele? Certamente, no meu sistema, não consegui encontrar nenhum exemplo disso usando o comando fornecido acima.

Matthew Ife
fonte
1

Para iwlwifi e outros módulos, usei isso:

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

e eu recebo esta saída:

 /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

Então eu acho que você poderia tentar algo como:

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

Deixe-me saber se isso funciona para você.

Homero Esmeraldo
fonte
grep .provavelmente também funcionaria tão bem com menos digitação. :)
dannysauer 27/02
Sim, neste caso,grep . /sys/module/<module_name>/parameters/*
Homero Esmeraldo
Algo que eu acabei de notar - se você usar um curinga e houver apenas um parâmetro, ele apenas mostrará o conteúdo do arquivo - sem nome. No entanto, se você usar grep -Re deixar o curinga fora do diretório de parâmetros, ele sempre mostrará o nome do arquivo. Pontos de bônus: adicione também --colorao grep e obtenha o nome do arquivo + valor diferenciado por cores. ;) Por exemplogrep -R --color '.' /sys/module/block/parameters/
dannysauer 27/02
(lembre-se de que a pessoa que faz a pergunta especificamente sobre módulos que não expõem a API / parameters: D)
dannysauer
0

Trabalhando com o trabalho de katriel, você pode obter uma linha única (reconhecidamente feia) combinando as duas em um loop bash:

for i in `lsmod | awk '{print $1}'`; do echo "$i: "; modinfo $i | grep parm; done
Scrivener
fonte
2
usando awk para apenas retornando o primeiro argumento via printé um pouco bruta - use a while readsintaxe em vez disso: lsmod | while read a b; do echo $a:; modinfo $a | grep parm | sed -e 's/parm://'; done- isso não muda o fato de que modinfo não retornar os valores dos parâmetros, embora ...
the-wabbit
7
e acho que a pergunta original era sobre os parâmetros usados , não os disponíveis .
asdmin 17/02/12