Qual é o limite de tamanho de / etc / hosts?

40

Como posso determinar ou definir o limite de tamanho de /etc/hosts ? Quantas linhas pode ter?

    
por Geremia 28.08.2017 / 18:03

5 respostas

58

Os efeitos problemáticos incluem resolução lenta do nome do host (a menos que o sistema operacional converta de alguma forma a lista linear em uma estrutura de pesquisa mais rápida?) e o potencial de interação surpreendente com a conclusão do shell bem antes de qualquer arquivo significativo tamanho é alcançado.

Por exemplo! Se você colocar 500.000 entradas de host em /etc/hosts

# perl -E 'for (1..500000) { say "127.0.0.10 $_.science" }' >> /etc/hosts

para a ciência, a conclusão da guia padrão do nome do host leva aproximadamente ~ 25 segundos no meu sistema para retornar um prompt de conclusão (concedido, isso é em um laptop de 2008 com um disco de 5400 RPM, mas ainda).

    
por 28.08.2017 / 18:44
21

Eu não acho que tenha um limite de tamanho em termos de número de linhas.

Antes do DNS (que foi colocado em uso em 1985), foi esse arquivo que serviu como o único meio para fazer pesquisas de nomes de host, então presumo que isso signifique que o arquivo deve ter milhares ou pelo menos centenas de entradas para poder suportar os nós da Internet pré-1985 mais bem conectados.

Aqui está um exemplo de 1985 (o formato mudou um pouco): link Este arquivo tem 1680 linhas dos quais 1325 são linhas hospedeiras. As 355 linhas restantes estão em branco, comentários, redes ou gateways 1 .

O único limite real que pude encontrar foi que, em alguns sistemas, as linhas individuais são limitadas a menos de BUFSIZ caracteres (1024 na minha máquina OpenBSD).

Se você tiver mais do que alguns punhados de entradas em /etc/hosts , você deve considerar a configuração de um servidor de nomes local, mas essa é a minha opinião pessoal.

1 Obrigado a Jeff Schaller por descobrir isso.

    
por 28.08.2017 / 18:11
13

How can I determine the size limit of /etc/hosts?

É um arquivo regular, portanto o limite corresponderia aos limites do sistema de arquivos subjacente (que seria limitado pelo número de discos por trás dele), menos o espaço usado por qualquer outro arquivo no mesmo (provavelmente root (%)/)) sistema de arquivos:

  • ext2 / 3: 2 TiB
  • ext4: 16 TiB (com o tamanho padrão do bloco 4KiB)
  • xfs: 500 TiB

How can I set the size limit of /etc/hosts?

Como é um arquivo editado manualmente, somente manualmente:

sed -i '100,$d' /etc/hosts

(para remover linhas 100 e além).

    
por 28.08.2017 / 18:20
11

Os limites de tamanho aplicam-se apenas ao alocar buffers estáticos. gethostbyname(3) , que analisa as entradas em /etc/hosts , não aloca buffers estáticos - e nunca tem. O lançamento original do BSD 4.3 de 1983 O algoritmo mostra um arquivo aberto, enquanto a linha de análise é um padrão de arquivo fechado:

sethostent(0);
while (p = gethostent()) {
    if (strcmp(p->h_name, name) == 0)
        break;
    for (cp = p->h_aliases; *cp != 0; cp++)
        if (strcmp(*cp, name) == 0)
            goto found;
}
found:
endhostent();

As implementações modernas mantêm essa herança em todos os aspectos essenciais.

De qualquer forma, internamente, a família de funções *hostent armazena um ponteiro de arquivo para a linha atual no arquivo. sethostent abre o arquivo e define a posição do ponteiro do arquivo. gethostent obtém dados e avança o ponteiro. endhostent fecha o ponteiro do arquivo. A Biblioteca GNU C oferece uma referência completa sobre essas funções.

Como você pode imaginar na implementação, as entradas ocorridas anteriormente no arquivo são resolvidas mais rapidamente. Se o seu arquivo hosts é enorme, isso entra em jogo.

Portanto, não importa o tamanho do arquivo, o sistema operacional o consumirá. Eventualmente, no entanto, você atingirá os limites do sistema de arquivos (por resposta de Jeff Schaller ). Você também tem limites máximos de tamanho de linha (por resposta de Kusalananda ). Mas, no final, você pode fazer o tamanho que quiser. Mas por favor, não faça isso.

    
por 29.08.2017 / 04:18
2

... Eu acumulei meu cérebro e, pela minha vida, não consigo pensar em uma única situação ou circunstância em que você abordasse qualquer problema de limite de tamanho em /etc/hosts - você executaria em problemas práticos, como o severo impacto de desempenho na família de chamadas do sistema getaddrinfo() , que todos precisam consultar o arquivo antes de decidir enviar uma consulta DNS, sem mencionar os problemas de manter um arquivo de texto simples desse tamanho. p>

Eu suspeito que o que temos aqui é uma falha em se comunicar em um nível mais alto. Que problema você está tentando resolver com um arquivo /etc/hosts gigantesco? Estou quase certo de que há uma solução melhor do que isso.

    
por 29.08.2017 / 15:16

Tags