Quelle est la taille limite de / etc / hosts?


44

Comment puis-je déterminer ou définir la taille limite de /etc/hosts? Combien de lignes peut-il avoir?


64
... Je pense qu'au moment où cela devient une préoccupation réelle plutôt qu'une curiosité universitaire, vous avez dépassé de loin le point où il serait plus sage de mettre en place un serveur DNS privé en termes de performances et de maintenabilité.
Shadur

5
Je suis surpris que vous demandez. Pourquoi vous attendez-vous à une limite de taille précise et dure sur les fichiers de configuration?
Basile Starynkevitch

3
@BasileStarynkevitch J'ai demandé parce qu'un fichier d'hôtes de ~ 2 Mo ne fonctionnait pas sur mon routeur, mais le problème était que je n'avais pas demandé à Dnsmasq de relire le fichier d'hôtes.
Geremia

2
@ Geremia my hosts file is 500M, plus de 15 000 entrées, aucun problème. Il est toujours préférable de déterminer la cause première de votre problème et de le résoudre en premier
bsd

3
Utilisez-vous votre fichier hôte pour bloquer les adresses IP? Si oui, vous devriez utiliser iptables avec ipset. Utiliser iptables seul causera un impact important sur les performances, mais avec ipset, une liste de près de 500 000 ips a un impact négligeable.
cybernard

Réponses:


57

Les effets problématiques incluent une résolution lente du nom d'hôte (à moins que le système d'exploitation ne convertisse d'une manière ou d'une autre la liste linéaire en une structure permettant une recherche plus rapide?) Et le potentiel d'interaction surprenante avec la tabcomplétion du shell bien avant que toute taille de fichier significative ne soit atteinte.

Par exemple! Si on place 500 000 entrées d’hôte dans/etc/hosts

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

pour la science, l' tabachèvement du nom d'hôte par défaut dans ZSH prend environ 25 secondes environ sur mon système pour renvoyer une invite d'achèvement (bien entendu, il s'agit d'un ordinateur portable de 2008 avec un disque à 5 400 tr / min, mais quand même).


21

Je ne pense pas qu'il y ait une limite de taille en termes de nombre de lignes.

Avant DNS (mis en service en 1985), c’était ce fichier qui était le seul moyen de rechercher des noms d’hôte. Je suppose donc que cela signifie que le fichier doit pouvoir contenir des milliers ou au moins des centaines d’entrées. être en mesure de prendre en charge les nœuds Internet antérieurs à 1985 les mieux connectés.

Voici un exemple de 1985 (le format a quelque peu changé): http://jim.rees.org/apollo-archive/hosts.txt Ce fichier contient 1680 lignes, dont 1325 sont des lignes hôtes. Les 355 lignes restantes sont vierges, commentaires, réseaux ou passerelles 1 .

La seule limite réelle que j'ai pu trouver est que sur certains systèmes, les lignes individuelles sont limitées à moins de BUFSIZcaractères (1024 sur ma machine OpenBSD).

Si vous avez plusieurs entrées /etc/hosts, vous devriez envisager de configurer un serveur de noms local à la place, mais c'est mon opinion personnelle.


1 Merci à Jeff Schaller pour avoir creusé le sujet


Avant DNS, je ne pensais pas qu'il était courant de convertir le tableau complet des hôtes Internet au /etc/hostsformat. La plupart des systèmes Unix n'étaient même pas sur Internet, et même si une machine en avait une, elle n'avait pas besoin d'une table d'hôtes complète, mais seulement de la poignée de machines avec lesquelles elle devait parler. Je serais surpris s'il y avait beaucoup de machines avec plus de 100 entrées.
Barmar

13

Comment puis-je déterminer la taille limite de / etc / hosts?

C'est un fichier standard, donc la limite correspondrait aux limites du système de fichiers sous-jacent (qui serait lui-même limité par le nombre de disques qu'il contient), moins l'espace utilisé par tout autre fichier du même /système de fichiers (probablement root ( )):

  • ext2 / 3: 2 TiB
  • ext4: 16 TiB (avec la taille de bloc par défaut de 4 Ko)
  • xfs: 500 TiB

Comment puis-je définir la taille limite de / etc / hosts?

Comme c'est un fichier édité manuellement, seulement manuellement:

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

(pour supprimer les lignes 100 et au-delà).


3
C'est vrai en principe, mais les limites du système de fichiers (par exemple, des téraoctets) ne sont pratiquement pas pertinentes.
Basile Starynkevitch

11

Les limites de taille s'appliquent uniquement lors de l'allocation de tampons statiques. gethostbyname(3), qui analyse les entrées dans /etc/hosts, n’alloue pas de tampons statiques - et ne l’a jamais fait. La version initiale de 1983 de l' algorithme BSD 4.3 montre un modèle de fichier ouvert, tandis que la ligne d'analyse, modèle de fichier fermé:

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();

Les applications modernes conservent cet héritage dans l’essentiel.

Quoi qu'il en soit, en interne, la *hostentfamille de fonctions stocke un pointeur de fichier sur la ligne en cours dans le fichier. sethostentouvre le fichier et définit la position du pointeur de fichier. gethostentobtient des données et avance le pointeur. endhostentferme le pointeur de fichier. La bibliothèque GNU C offre une référence complète sur ces fonctions.

Comme vous pouvez le deviner lors de l'implémentation, les entrées apparaissant plus tôt dans le fichier sont résolues plus rapidement. Si votre fichier hosts est énorme, cela entre en jeu.

Ainsi, quelle que soit la taille du fichier, le système d'exploitation le consommera. Finalement, vous atteindrez les limites du système de fichiers (selon la réponse de Jeff Schaller ). Vous avez également des limites maximales de taille de ligne (selon la réponse de Kusalananda ). Mais au final, vous pouvez le faire aussi gros que vous le souhaitez. Mais s'il vous plaît, ne le faites pas.


2
L'utilisation de la glibc et de linux n'est malheureusement pas si simple. Si vous appelez gethostbyname et que le système est configuré en conséquence (par défaut sur de nombreux systèmes), au lieu de lire / etc / host, il appellera nscd. Je ne sais pas si le nscd mettra en cache uniquement les hits dans le fichier ou tentera de le mettre en cache dans son ensemble. Dans le dernier cas, vous auriez une limite de ram pour la taille du fichier (en supposant que la configuration nscd autorise autant d'entrées)
PlasmaHH

1
La version 4.3BSD est ici . Il supportait une version de / etc / hosts avec hachage. IIRC, dbm a imposé des limites de taille pouvant entraîner l’échec des tentatives de création d’une base de données hachée.
Mark Plotnick

2

... Je me suis creusé la tête et je ne peux imaginer une seule situation ou circonstance où vous aborderiez n'importe quel problème de limite de taille /etc/hosts- vous rencontriez des problèmes pratiques comme le grave Les performances affectent la getaddrinfo()famille des appels système qui doivent tous consulter le fichier avant de décider d'envoyer une requête DNS, sans parler des problèmes liés au maintien d'un fichier texte de cette taille.

Je soupçonne que ce que nous avons ici est un échec pour communiquer à un niveau supérieur. Quel problème essayez-vous de résoudre avec un /etc/hostsfichier gigantesque ? Je suis presque sûr qu'il existe une meilleure solution que celle-ci.


8
Certaines personnes utilisent un hostsfichier pour mettre en liste noire les annonces, les programmes malveillants, le suivi, etc. Il existe des listes sélectionnées sur Internet, celle que j’utilise est de 41 000 lignes et de 1,1 Mo de taille.
Bert

Il serait probablement préférable d'utiliser les performances dnsmasqpour cela - voir par exemple dnsgate (que je n'ai pas encore essayé).
reinierpost

Le mien a 1,7MB avec 57k lignes. Vous pouvez obtenir votre énorme /etc/hostsfichier sur hostsfile.org
fly

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.