Altere os parâmetros do kernel em tempo de execução

7

Ao tentar consertar um bug obscuro de hardware, sugeriu-se que adicionar alguns parâmetros ao kernel poderia resolver o problema.

Claro que posso fazer isso, mas queria saber se posso fazer essas alterações em um kernel em execução. Em particular, sei que procfs e sysfs fornecem uma maneira de fazer alterações no kernel em execução, mas não tenho certeza sobre como mapear nomes de parâmetro do kernel para caminhos de arquivo. (Eu também presumo que nem todas as configurações podem ser alteradas no tempo de execução, e esses parâmetros específicos podem não ser configuráveis quando o sistema é inicializado.)

Os parâmetros específicos em que estou interessado são

i8042.nomux=1 i8042.reset

Estou particularmente inseguro quanto à possibilidade de emitir o comando reset em um sistema em execução.

Se esses parâmetros forem ajustáveis em tempo de execução, onde os encontraria?

    
por MathematicalOrchid 03.04.2014 / 12:05

2 respostas

12

Existem três tipos de coisas que podem ser chamadas de parâmetros do kernel.

Os principais parâmetros do kernel são opções passadas na linha de comando do kernel. Eles só podem ser passados no momento da inicialização. Eles estão documentados em kernel-parameters.txt (esse arquivo também lista os parâmetros do módulo; os parâmetros do núcleo do kernel são os aqueles sem . ). Alguns desses parâmetros só importam no momento da inicialização (por exemplo, root ). Para aqueles que são usados durante toda a vida útil do sistema, pode haver ou não um mecanismo para alterá-los em tempo de execução, não há regra geral.

Os parâmetros do módulo são como parâmetros do kernel, mas especificam um componente específico do kernel, geralmente um driver específico. Apesar do nome, esses parâmetros se aplicam se o driver correspondente é compilado diretamente no kernel ou como um módulo. Quando o componente está incluído na imagem principal do kernel, você precisa passar COMPONENT_NAME.PARAMETER_NAME=VALUE na linha de comando do kernel. Quando o componente é carregado como um módulo, você precisa passar PARAMETER_NAME=VALUE para insmod .

Alguns parâmetros do módulo são visíveis através do sysfs . O diretório /sys/module/MODULE_NAME/parameters contém um arquivo por parâmetro; ler esse arquivo lhe dá o valor atual do parâmetro. Escrevendo para esse arquivo define o parâmetro, se ele puder ser modificado; a maioria dos parâmetros não pode ser modificada (e, portanto, o arquivo é somente leitura). O diretório /sys/module/kernel/parameters lista alguns dos principais parâmetros do kernel.

Os parâmetros do módulo são documentados ao acaso; alguns deles estão listados em kernel-parameters.txt e o arquivo contém referências para alguns módulos. Se você não encontrar a documentação, pesquise a fonte . Os parâmetros do módulo são declarados pela macro module_param ou um de seus companheiros module_param_named , module_param_cb , etc. O último parâmetro dessas macros determina a permissão do arquivo (por exemplo, 0600 ou S_IRUSR | S_IWUSR seria rw------- , ou seja, legível e gravável pelo usuário e inacessível por qualquer outra pessoa). Quando a permissão é 0, a entrada no sysfs não aparece de todo.

i8042.nomux e i8042.reset são parâmetros do driver i8042 . Olhando para o código-fonte, ambos têm a permissão 0, portanto, esses dois parâmetros não são modificáveis ou até mesmo consultáveis em tempo de execução. Você pode definir os parâmetros somente quando o driver é iniciado. Se o driver for compilado como um módulo, o descarregamento e o carregamento do módulo permitirá que você forneça parâmetros diferentes ao recarregá-lo. Se o driver está diretamente no kernel ou se a configuração do seu sistema torna efetivamente impossível descarregar o módulo, você precisa reinicializar.

Por fim, outro tipo de parâmetro no kernel é sysctl . Essas configurações podem ser visualizadas e alteradas com o sysctl command ou via /proc/sys . Eu acho que a separação entre os parâmetros sysctl e kernel é principalmente histórica; configurações relacionadas a hardware são tradicionalmente parâmetros do kernel, enquanto as configurações de software são tradicionalmente sysctl, mas a distinção pode ser confusa às vezes.

    
por 04.04.2014 / 03:02
2

Acho que a lista de parâmetros que podem ser alterados em tempo de execução pode ser encontrada usando o comando "sudo sysctl -a". Eu não vi i8042.nomux no meu sistema. Não tenho certeza porque. Pode ser que você pode verificar no seu, se você ver o parâmetro, então você pode modificá-lo em tempo de execução.

    
por 03.04.2014 / 12:28