Pesquisa de site

Como alterar os parâmetros de tempo de execução do kernel de maneira persistente e não persistente


Na Parte 13 desta série LFCS (Linux Foundation Certified Sysadmin), explicamos como usar o GRUB para modificar o comportamento do sistema, passando opções ao kernel para o processo de inicialização em andamento.

Da mesma forma, você pode usar a linha de comando em um sistema Linux em execução para alterar determinados parâmetros do kernel de tempo de execução como uma modificação única ou permanentemente editando um arquivo de configuração.

Assim, você tem permissão para ativar ou desativar os parâmetros do kernel dinamicamente, sem muita dificuldade, quando necessário, devido a uma mudança necessária na maneira como o sistema deve operar.

Apresentando o sistema de arquivos /proc

A especificação mais recente do Filesystem Hierarchy Standard indica que /proc representa o método padrão para lidar com informações de processo e sistema, bem como outras informações de kernel e memória. Particularmente, /proc/sys é onde você pode encontrar todas as informações sobre dispositivos, drivers e alguns recursos do kernel.

A estrutura interna real de /proc/sys depende muito do kernel que está sendo usado, mas é provável que você encontre os seguintes diretórios dentro dele. Por sua vez, cada um deles conterá outros subdiretórios onde serão mantidos os valores de cada categoria de parâmetro:

  1. dev: parâmetros para dispositivos específicos conectados à máquina.
  2. fs: configuração do sistema de arquivos (cotas e inodes, por exemplo).
  3. kernel: configuração específica do kernel.
  4. net: configuração de rede.
  5. vm: uso da memória virtual do kernel.

Para modificar os parâmetros de tempo de execução do kernel usaremos o comando sysctl. O número exato de parâmetros que podem ser modificados pode ser visualizado com:

sysctl -a | wc -l

Se você quiser ver a lista completa de parâmetros do Kernel, basta fazer:

sysctl -a 

Como a saída do comando acima consistirá em MUITAS linhas, podemos usar um pipeline seguido de less para inspecioná-lo com mais cuidado:

sysctl -a | less

Vamos dar uma olhada nas primeiras linhas. Observe que os primeiros caracteres de cada linha correspondem aos nomes dos diretórios dentro de /proc/sys:

Por exemplo, a linha destacada:

dev.cdrom.info = drive name:        	sr0

indica que sr0 é um alias para a unidade óptica. Em outras palavras, é assim que o kernel “” aquele drive e usa esse nome para se referir a ele.

Na seção a seguir explicaremos como alterar outros parâmetros de tempo de execução do kernel “mais importantes” no Linux.

Como alterar ou modificar os parâmetros de tempo de execução do kernel Linux

Com base no que explicamos até agora, é fácil ver que o nome de um parâmetro corresponde à estrutura de diretórios dentro de /proc/sys onde ele pode ser encontrado.

Por exemplo:

dev.cdrom.autoclose → /proc/sys/dev/cdrom/autoclose
net.ipv4.ip_forward → /proc/sys/net/ipv4/ip_forward

Verifique os parâmetros do kernel Linux

Dito isto, podemos visualizar o valor de um parâmetro específico do kernel Linux usando sysctl seguido do nome do parâmetro ou lendo o arquivo associado:

sysctl dev.cdrom.autoclose
cat /proc/sys/dev/cdrom/autoclose
sysctl net.ipv4.ip_forward
cat /proc/sys/net/ipv4/ip_forward

Definir ou modificar parâmetros do kernel Linux

Para definir o valor de um parâmetro do kernel também podemos usar sysctl, mas usando a opção -w e seguido do nome do parâmetro, o sinal de igual e o valor desejado.

Outro método consiste em utilizar echo para sobrescrever o arquivo associado ao parâmetro. Em outras palavras, os métodos a seguir são equivalentes a desabilitar a funcionalidade de encaminhamento de pacotes em nosso sistema (que, aliás, deve ser o valor padrão quando uma caixa não deve passar tráfego entre redes):

echo 0 > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=0

É importante observar que os parâmetros do kernel definidos usando sysctl serão aplicados apenas durante a sessão atual e desaparecerão quando o sistema for reinicializado.

Para definir esses valores permanentemente, edite /etc/sysctl.conf com os valores desejados. Por exemplo, para desabilitar o encaminhamento de pacotes em /etc/sysctl.conf certifique-se de que esta linha apareça no arquivo:

net.ipv4.ip_forward=0

Em seguida, execute o seguinte comando para aplicar as alterações à configuração em execução.

sysctl -p

Outros exemplos de parâmetros importantes de tempo de execução do kernel são:

fs.file-max especifica o número máximo de identificadores de arquivo que o kernel pode alocar para o sistema. Dependendo do uso pretendido do seu sistema (web/banco de dados/servidor de arquivos, para citar alguns exemplos), você pode querer alterar este valor para atender às necessidades do sistema.

Caso contrário, você receberá uma mensagem de erro “Muitos arquivos abertos”, na melhor das hipóteses, e poderá impedir que o sistema operacional inicialize, na pior das hipóteses.

Se devido a um erro inocente você se encontrar nesta última situação, inicialize no modo de usuário único (conforme explicado na Parte 13 – Configurar e solucionar problemas do carregador de inicialização Linux Grub) e edite /etc/sysctl.conf como instruído anteriormente. Para definir a mesma restrição por usuário, consulte a Parte 14 – Monitorar e definir o uso do limite de processos do Linux desta série.

kernel.sysrq é usado para ativar a tecla SysRq em seu teclado (também conhecida como tecla print screen) para permitir que certas combinações de teclas invoquem ações de emergência quando o sistema deixou de responder.

O valor padrão (16) indica que o sistema respeitará a combinação Alt+SysRq+key e executará as ações listadas em sysrq.c documentação encontrada em kernel.org (onde key é uma letra no intervalo b-z). Por exemplo, Alt+SysRq+b irá reinicializar o sistema à força (use isto como último recurso se o seu servidor não responder).

Aviso! Não tente pressionar esta combinação de teclas em uma máquina virtual porque isso pode forçar a reinicialização do sistema host!

Quando definido como 1, net.ipv4.icmp_echo_ignore_all ignorará as solicitações de ping e as descartará no nível do kernel. Isso é mostrado na imagem abaixo – observe como as solicitações de ping são perdidas após definir este parâmetro do kernel:

Uma maneira melhor e mais fácil de definir parâmetros de tempo de execução individuais é usar arquivos .conf dentro de /etc/sysctl.d, agrupando-os por categorias.

Por exemplo, em vez de definir net.ipv4.ip_forward=0 e net.ipv4.icmp_echo_ignore_all=1 em /etc/sysctl.conf, podemos criar um novo arquivo chamado net.conf dentro de /etc/sysctl.d:

echo "net.ipv4.ip_forward=0" > /etc/sysctl.d/net.conf
echo "net.ipv4.icmp_echo_ignore_all=1" >> /etc/sysctl.d/net.conf

Se você optar por usar esta abordagem, não se esqueça de remover essas mesmas linhas de /etc/sysctl.conf.

Resumo

Neste artigo explicamos como modificar os parâmetros de tempo de execução do kernel, tanto persistentes quanto não persistentes, usando sysctl, /etc/sysctl.conf e arquivos dentro de / etc/sysctl.d.

Na documentação do sysctl você pode encontrar mais informações sobre o significado de mais variáveis. Esses arquivos representam a fonte mais completa de documentação sobre os parâmetros que podem ser definidos via sysctl.

Você achou este artigo útil? Certamente esperamos que você tenha feito isso. Não hesite em nos informar se tiver alguma dúvida ou sugestão para melhorar.