A última correspondência do sysctl.conf?

4

Onde posso encontrar a documentação oficial de que sysctl.conf é a última correspondência?

Existem duas entradas no arquivo /etc/sysctl.conf :

vm.swappiness=10
vm.swappiness=11

Qual deles vencerá? O último? O que acontece se houver arquivos no diretório /etc/sysctl.d ?

    
por KollarA 26.10.2018 / 12:51

2 respostas

7

Eu não acho que haja tal documentação oficial. sysctl entradas são tratadas por procps e systemd; mas nem a documentação dos projetos aborda como as entradas são processadas no mesmo arquivo de configuração.

A versão curta é que a última entrada em sysctl.conf vence, mesmo quando outros arquivos estão presentes (em /etc/sysctl.d ou em outro lugar), independentemente de qual sistema é usado para carregar as configurações.

procps

Para entender como procps processa entradas, precisamos analisar o código-fonte para sysctl . Isso mostra que as entradas posteriores são processadas sem o conhecimento das entradas anteriores, portanto, o último ganha (observe a função Preload ). Quando vários arquivos de configuração são fornecidos na linha de comando, eles são processados em ordem, conforme descrito em o homem página :

Using this option will mean arguments to sysctl are files, which are read in the order they are specified.

As coisas ficam um pouco mais complexas com a opção --system , mas pelo menos isso está documentado:

Load settings from all system configuration files. Files are read from directories in the following list in given order from top to bottom. Once a file of a given filename is loaded, any file of the same name in subsequent directories is ignored.

  • /run/sysctl.d/*.conf
  • /etc/sysctl.d/*.conf
  • /usr/local/lib/sysctl.d/*.conf
  • /usr/lib/sysctl.d/*.conf
  • /lib/sysctl.d/*.conf
  • /etc/sysctl.conf

A documentação não está completa. Como mencionado acima, as entradas em um determinado arquivo são aplicadas em ordem e sobrescrevem qualquer valor dado à mesma configuração anteriormente. Além disso, observar a função PreloadSystem mostra que os arquivos são processados na ordem dos nomes e que /etc/sysctl.conf é processado incondicionalmente ( ie um arquivo com nome idêntico em um diretório anterior não o substitui) ).

systemd

O systemd possui seu próprio manipulador sysctl , que está documentado em sysctl.d manpage ; que tem uma seção sobre precedência:

Configuration files are read from directories in /etc/, /run/, and /usr/lib/, in order of precedence. Each configuration file in these configuration directories shall be named in the style of filename.conf. Files in /etc/ override files with the same name in /run/ and /usr/lib/. Files in /run/ override files with the same name in /usr/lib/.

[…] All configuration files are sorted by their filename in lexicographic order, regardless of which of the directories they reside in. If multiple files specify the same option, the entry in the file with the lexicographically latest name will take precedence. It is recommended to prefix all filenames with a two-digit number and a dash, to simplify the ordering of the files.

Novamente, as entradas posteriores em um único arquivo de configuração substituem as entradas anteriores.

    
por 26.10.2018 / 13:12
4

Fazer esta afirmação de uma forma mais prática:

Primeiras coisas primeiro: Os valores não serão aplicados se você prefixar a palavra sysctl nas suas sysctl.conf entradas (" manpages are lol " como você disse, mas você não parece ter lê-los seriamente). E é uma tarefa fácil testar isso: coloque o seguinte conteúdo no final de seu /etc/sysctl.conf

vm.swappiness = 60
vm.swappiness = 61

Estou usando swappines aqui, pois sei que é um sysctl de baixo impacto que causa pequenos valores de diferença dependendo da carga do sistema (e o valor padrão é 60 na maioria das distros). Aplique apenas este arquivo digitando sysctl -p /etc/sysctl.conf (manpage) . Verifique novamente o valor com sysctl -a

root@host:~# sysctl -a | grep "vm.swappiness"
vm.swappiness = 61

Voilá.

Agora que você sabe que os arquivos são lidos em uma abordagem de cima para baixo, é só uma questão de ler sysctl.d manpage para descobrir qual é a precedência dos arquivos sysctl espalhados pelo seu sistema. Como já foi explicado pela resposta do @Stephen Kitt, não vou repetir esta informação aqui.

Além disso, a precedência dos diretórios sysctl.d dependerá da distribuição da distro que você está usando ou não ...

    
por 26.10.2018 / 13:42

Tags