¿Cómo enumero los valores de parámetros del módulo Linux cargado?

77

¿Existe una forma estándar de enumerar los valores de los parámetros de un módulo Linux cargado? Básicamente, estoy buscando otra respuesta a esta pregunta sobre los parámetros del módulo del kernel de Linux , porque el módulo que me interesa no tiene una /sys/modules/<module_name>/parametersinterfaz.

cdleary
fuente
44
¡Todas las respuestas hasta ahora merecen un voto negativo, porque no leyeron el OP cuidadosamente ("el módulo que me interesa no tiene una interfaz ... / parámetros")! :-(
Dirk

Respuestas:

54

Puede hacerlo utilizando este sencillo comando unidireccional, que utiliza los sistemas de archivos virtuales / proc / modules y / 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

Obtendrá una salida 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 esto ayude.

RaSca
fuente
¡Gracias! ¡Eso es muy útil para diagnosticar todo tipo de problemas con hardware problemático!
Oz123
Increíble, y si pasa $ module como, por ejemplo, parámetro de función en lugar de obtenerlo de / proc / modules, obtendrá fácilmente todos los parámetros de un módulo dado.
igordcard
@RaSca: ¿Alguna de estas respuestas funcionó para usted?
Dan Garthwaite
Al principio esto no funcionó para mí como lo había hecho alias ls='ls -lah'. Sin embargo, eliminar el alias o ejecutar la solución como un script funcionó muy bien.
David Farrell
Combinando esto con un grep en lsmod: lsmod | grep -i bluetooth> lsmodpattern.txt; cat lsmodpattern.txt | sed 's / | / /' | awk '{print $ 4}'> patternmodules.txt; cat patternmodules.txt | tr, '\ n' | mientras lee el módulo; do echo "Módulo: $ módulo"; if [-d "/ sys / module / $ module / parameters"]; luego ls / sys / module / $ module / parameters / | mientras lee el parámetro; do echo -n "Parámetro: $ parameter ="; gato / sys / módulo / $ módulo / parámetros / $ parámetro; hecho; fi; hecho
Ferroao
38

Puedes usar el comando systool -vm <Module name>. Viene con el sysfsutilspaquete en la mayoría de los sistemas.

Así es como se verá la salida, hay una sección 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
fuente
44
El comando systooles parte del paquete sysfsutils. Y esta es la respuesta, creo, (pero podría tener un resultado de ejemplo)
Volker Siegel
Usando esto para consultar un puñado de módulos en mi sistema, parece que la Parameters:sección solo está presente en la salida para módulos que exponen una /sys/modules/<module_name>/parametersinterfaz. Entonces, desafortunadamente, esto no satisface la premisa de la pregunta.
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
fuente
7

Puede usar el comando " modinfo (8) " para obtener los parámetros de tiempo de carga disponibles para un módulo. Por ejemplo:

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

En cuanto a obtener los parámetros de los módulos cargados, intente combinar el comando modinfo con un simple "lsmod | awk '{print $ 1}'"

Como en:

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
fuente
14
-1 Esto solo muestra algo así como una página de manual pero no dice cuáles son los valores.
Aleksandr Levchuk
1

Saldría feo como comentario, pero hice esta comprobación en mi 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 si los módulos sin parámetros en / sys se muestran con parámetros en modinfo pero no pude encontrar ninguno.

No soy un experto, pero la diferencia aquí es que modinfo lee el archivo del módulo en sí para los parámetros al buscar en los encabezados de .modinfo elf, mientras que sys los lee desde su variante de tiempo de ejecución.

Es posible que tenga parámetros que puede modificar en tiempo de ejecución que no aparecen como un valor de parámetro modinfo, pero dado que el formato del módulo debería ser bastante fijo, no imagino que sea posible que pase un parámetro de opción a un módulo al cargar sin que haya una estructura .modinfo para ella vinculada en.

Tengo curiosidad, ¿su módulo sugiere que hay parámetros transitables con modinfo cuando lo verifica de esa manera pero no hay ninguno en / sys para ello? Ciertamente, en mi sistema no pude encontrar ningún ejemplo de esto usando el comando proporcionado anteriormente.

Matthew Ife
fuente
1

Para iwlwifi y otros módulos utilicé esto:

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

y obtengo esta salida:

 /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

Entonces supongo que podrías probar algo como:

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

Hazme saber si esto funciona para ti.

Homero Esmeraldo
fuente
grep .probablemente también funcionaría igual de bien con menos tipeo. :)
dannysauer
Sí, en este caso,grep . /sys/module/<module_name>/parameters/*
Homero Esmeraldo
Algo que acabo de notar: si usa un comodín y solo hay un parámetro, solo muestra el contenido del archivo, sin nombre de archivo. Sin embargo, si usa grep -Ry deja el comodín fuera del directorio de parámetros, siempre muestra el nombre del archivo. Puntos de bonificación: también agregue --coloral grep y obtenga el nombre de archivo + valor diferenciado por colores. ;) Por ejemplogrep -R --color '.' /sys/module/block/parameters/
dannysauer
(no importa que la persona que hace la pregunta pregunte específicamente sobre los módulos que no exponen la / parámetros API: D)
dannysauer
0

Trabajando fuera del trabajo de Katriel, puedes obtener una línea única (ciertamente fea) combinando los dos en un bucle bash:

for i in `lsmod | awk '{print $1}'`; do echo "$i: "; modinfo $i | grep parm; done
Amanuense
fuente
2
usar awk solo para devolver el primer argumento vía printes algo asqueroso: use la while readsintaxis en su lugar: lsmod | while read a b; do echo $a:; modinfo $a | grep parm | sed -e 's/parm://'; done- no cambia el hecho de que modinfo no devuelve los valores de los parámetros, aunque ...
the-wabbit
77
y creo que la pregunta original era sobre los parámetros utilizados , no los disponibles .
asdmin