Diferença entre modprobe e sysctl -w em termos de configuração dos parâmetros do sistema?

4

Sabemos que o comando sysctl pode alterar os parâmetros do kernel com:

# sysctl -w kernel.domainname="example.com"

ou editando diretamente o arquivo no diretório /proc/sys . E para alterações persistentes, os parâmetros devem ser gravados em /etc/sysctl.d/<moduleName>.conf files como:

# echo kernel.domainname="example.com" > /etc/sysctl.d/domainname.conf

No entanto, também podemos alterar os parâmetros do kernel usando o comando modprobe:

# modprobe kernel domainname="example.com"

Além disso, há o arquivo modprobe.conf nos diretórios /etc/modprobe.d , que estão presentes em vários locais: /etc/modprobe.d e /usr/lib/modprobe.d . Ele contém vários arquivos .conf e as opções podem ser fornecidas no arquivo conf apropriado para o módulo como:

options kernel domainname="example.com"

Então, qual é a diferença entre cada um desses métodos? Qual método deve ser usado sob quais circunstâncias específicas?

    
por Somenath Sinha 14.12.2017 / 09:17

1 resposta

4

Até onde eu sei, você pode usar modprobe para ajustar os parâmetros somente quando o recurso em questão foi compilado como um módulo - e você está carregando o módulo em primeiro lugar. Para definir os parâmetros do módulo persistentemente, você terá o diretório /etc/modprobe.d . (Geralmente você deve deixar /usr/lib/modprobe.d para as configurações padrão da distribuição - todos os arquivos podem ser sobrescritos pelas atualizações de pacotes).

Se o módulo em questão foi construído no kernel principal, então você deve usar a sintaxe <module_name>.<parameter_name>=<value> , normalmente como uma opção de inicialização. Se o parâmetro em questão estiver disponível como uma configuração sysctl , você poderá usar o comando sysctl -w para ajustá-lo também.

Todos os parâmetros de sysctl disponíveis são apresentados em /proc/sys : por exemplo, kernel.domainname está em /proc/sys/kernel/domainname . Nem todos os parâmetros do módulo estão disponíveis como sysctls, mas alguns podem ser.

Se um módulo carregável já tiver sido carregado e você desejar alterar seus parâmetros imediatamente sem descarregá-lo, será possível gravar o novo valor em /sys/module/<module_name>/parameters/<parameter_name> . Se o módulo não puder aceitar a reconfiguração dinâmica para esse parâmetro, o arquivo será somente leitura.

Pelo menos no meu sistema, kernel.domainname é um parâmetro sysctl para o kernel principal e tentar alterá-lo com modprobe não funcionará:

# sysctl kernel.domainname
kernel.domainname = (none)
# modprobe kernel domainname="example.com"
modprobe: FATAL: Module kernel not found in directory /lib/modules/<kernel_version>
# sysctl kernel.domainname
kernel.domainname = (none)

Em poucas palavras: Se você não tiver certeza, primeiro procure em /proc/sys ou a saída de sysctl -a : se o parâmetro que você está procurando não estiver lá, ele não é um parâmetro sysctl e provavelmente é um parâmetro do módulo (ou o módulo que forneceria o sysctl não está atualmente carregado, neste caso, é melhor definir o valor como um parâmetro do módulo de qualquer maneira - tentar definir um sysctl pertencente a um módulo que não está atualmente carregado produzirá apenas um erro).

Em seguida, descubra a qual módulo o parâmetro pertence. Se o módulo estiver embutido no kernel, você provavelmente terá que usar uma opção de boot; se for carregável com modprobe (ou seja, o respectivo arquivo <module>.ko existe em algum lugar na árvore de diretórios /lib/modules/<kernel version>/ ), você poderá usar modprobe e / ou /etc/modprobe.d/ .

    
por 14.12.2017 / 10:12