Was ist die Größenbeschränkung für / etc / hosts?

44

Wie kann ich das Größenlimit von bestimmen oder festlegen /etc/hosts? Wie viele Zeilen kann es haben?

Geremia
quelle
64
... Ich denke, an dem Punkt, an dem dies eher zu einer tatsächlichen Sorge als zu einer akademischen Neugier wird, haben Sie den Punkt weit hinter sich gelassen, an dem es in Bezug auf Leistung und Wartbarkeit sinnvoller wäre, einen privaten DNS-Server einzurichten.
Shadur
5
Ich bin überrascht, dass du fragst. Warum erwarten Sie eine genaue und aussagekräftige Größenbeschränkung für Konfigurationsdateien?
Basile Starynkevitch
3
@BasileStarynkevitch Ich habe gefragt, ob eine Host-Datei mit ~ 2 MB auf meinem Router nicht funktioniert, aber das Problem war, dass ich dnsmasq nicht angeschaut habe, um die Host-Datei erneut zu lesen.
Geremia
2
@Geremia meine Hosts-Datei ist 500M, mehr als 15.000 Einträge, keine Probleme. Es ist immer am besten, die Grundursache für Ihr Problem zu ermitteln und zuerst zu
beheben
3
Verwenden Sie Ihre Host-Datei, um IP-Adressen zu blockieren? In diesem Fall sollten Sie iptables mit ipset verwenden. Die alleinige Verwendung von iptables führt zu erheblichen Leistungseinbußen. Mit ipset hat eine Liste von fast 500.000 ips jedoch vernachlässigbare Auswirkungen.
Cybernard

Antworten:

57

Zu den problematischen Auswirkungen zählen die langsame Auflösung des Hostnamens (sofern das Betriebssystem die lineare Liste nicht irgendwie in eine schneller zu durchsuchende Struktur umwandelt?) Und die Möglichkeit einer überraschenden Interaktion mit der tabVervollständigung der Shell, lange bevor eine sinnvolle Dateigröße erreicht wird.

Zum Beispiel! Wenn man 500.000 Hosteinträge einfügt/etc/hosts

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

Für wissenschaftliche tabZwecke dauert die Fertigstellung des Standardhostnamens in ZSH auf meinem System ca. 25 Sekunden, um eine Fertigstellungsaufforderung zurückzugeben (dies gilt natürlich für einen Laptop aus dem Jahr 2008 mit einer Festplatte mit 5400 U / min, aber immer noch).

Thrig
quelle
21

Ich glaube nicht, dass es eine Größenbeschränkung in Bezug auf die Anzahl der Zeilen gibt.

Vor DNS (das 1985 in Betrieb genommen wurde) diente diese Datei als einziges Mittel für die Suche nach Hostnamen. Daher gehe ich davon aus, dass dies bedeutet, dass die Datei Tausende oder mindestens Hunderte von Einträgen enthalten sollte in der Lage sein, die am besten vernetzten Internetknoten vor 1985 zu unterstützen.

Hier ist ein Beispiel aus dem Jahr 1985 (das Format hat sich etwas geändert): http://jim.rees.org/apollo-archive/hosts.txt Diese Datei enthält 1680 Zeilen, von denen 1325 Host-Zeilen sind. Die verbleibenden 355 Zeilen sind leer, Kommentare, Netzwerke oder Gateways 1 .

Das einzige wirkliche Limit, das ich finden konnte, war, dass auf einigen Systemen die einzelnen Zeilen auf weniger als BUFSIZZeichen beschränkt sind (1024 auf meiner OpenBSD-Maschine).

Wenn Sie mehr als ein paar Handvoll Einträge haben /etc/hosts, sollten Sie stattdessen einen lokalen Nameserver einrichten, aber das ist meine persönliche Meinung.


1 Vielen Dank an Jeff Schaller für die Recherche.

Kusalananda
quelle
Vor DNS war es meiner Meinung nach nicht üblich, die vollständige Internet-Host-Tabelle in das /etc/hostsFormat zu konvertieren. Die meisten Unix-Systeme waren nicht einmal im Internet, und selbst wenn es sich um eine Maschine handelte, brauchte sie keine vollständige Host-Tabelle, sondern nur die Handvoll der Maschinen, mit denen sie kommunizieren musste. Ich wäre überrascht, wenn es viele Maschinen mit mehr als 100 Einträgen gäbe.
Barmar
13

Wie kann ich die Größenbeschränkung von / etc / hosts bestimmen?

Da es sich um eine reguläre Datei handelt, entspricht das Limit dem Limit des zugrunde liegenden Dateisystems (das selbst durch die Anzahl der dahinter liegenden Festplatten begrenzt wird), abzüglich des Speicherplatzes, der von anderen Dateien im selben /Dateisystem (wahrscheinlich root ( )) belegt wird:

  • ext2 / 3: 2 TiB
  • ext4: 16 TiB (mit der Standardblockgröße von 4 KB)
  • xfs: 500 TiB

Wie kann ich die Größenbeschränkung für / etc / hosts festlegen?

Da es sich um eine manuell bearbeitete Datei handelt, nur manuell:

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

(um die Zeilen 100 und darüber hinaus zu entfernen).

Jeff Schaller
quelle
3
Im Prinzip wahr, aber die Dateisystemgrenzen (zB Terabyte) sind praktisch weitgehend irrelevant.
Basile Starynkevitch
11

Größenbeschränkungen gelten nur für die Zuweisung statischer Puffer. gethostbyname(3), die die Einträge in analysiert /etc/hosts, reserviert keine statischen Puffer - und hat es nie getan. Die ursprüngliche Version des BSD 4.3- Algorithmus von 1983 zeigt ein Open-File- und ein Close-File-Parsing-Muster:

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

Moderne Implementierungen bewahren dieses Erbe in allen wesentlichen Punkten.

Intern *hostentspeichert die Funktionsfamilie jedenfalls einen Dateizeiger auf die aktuelle Zeile in der Datei. sethostentöffnet die Datei und setzt die Position des Dateizeigers. gethostentRuft Daten ab und rückt den Zeiger vor. endhostentschließt den Dateizeiger. Die GNU C Library bietet eine gründliche Referenz zu diesen Funktionen.

Wie Sie aus der Implementierung erraten können, werden früher in der Datei auftretende Einträge schneller aufgelöst. Wenn Ihre Hosts-Datei sehr groß ist, kommt dies ins Spiel.

Egal wie groß die Datei ist, das Betriebssystem wird sie verbrauchen. Mit der Zeit stoßen Sie jedoch an die Grenzen des Dateisystems (laut Jeff Schallers Antwort ). Sie haben auch maximale Zeilengrößenbeschränkungen (gemäß der Antwort von Kusalananda ). Aber am Ende können Sie es so groß machen, wie Sie wollen. Aber bitte nicht.

Bischof
quelle
2
Mit glibc und linux ist das leider nicht so einfach. Wenn Sie gethostbyname aufrufen und das System entsprechend eingerichtet ist (Standardeinstellung bei vielen Systemen), ruft es anstelle von / etc / host die nscd auf. Ich habe keine Ahnung, ob die Nscd nur Treffer in der Datei zwischenspeichern oder versuchen wird, es als Ganzes zu zwischenspeichern. Im späteren Fall hätten Sie eine RAM-Beschränkung für die Dateigröße (vorausgesetzt, die nscd-Konfiguration erlaubt so viele Einträge)
PlasmaHH
1
Die 4.3BSD Version ist da . Es wurde eine von dbm gehashte Version von / etc / hosts unterstützt. IIRC, dbm hat einige Größenbeschränkungen auferlegt, die dazu führen können, dass Versuche, eine Hash-Datenbank zu erstellen, fehlschlagen.
Mark Plotnick
2

... Ich habe mir den Kopf zerbrochen und kann mir für mein ganzes Leben keine Situation oder keinen Umstand vorstellen, in der Sie sich einer Größenbeschränkung nähern würden /etc/hosts- Sie würden auf praktische Probleme wie die schweren stoßen Performance-Einbußen bei der getaddrinfo()Familie von Systemaufrufen, bei denen alle die Datei konsultieren müssen, bevor sie entscheiden, ob eine DNS-Abfrage gesendet werden soll.

Ich vermute, dass wir es hier nicht geschafft haben, auf einer höheren Ebene zu kommunizieren. Welches Problem versuchen Sie mit einer riesigen /etc/hostsDatei zu lösen ? Ich bin mir fast sicher, dass es eine bessere Lösung gibt.

Shadur
quelle
8
Einige Benutzer verwenden eine hostsDatei, um Anzeigen / Malware / Tracking / etc. Auf die schwarze Liste zu setzen. Es gibt kuratierte Listen im Internet, die ich benutze, sind 41.000 Zeilen und 1,1 MB groß.
Bert
Es wäre wahrscheinlich besser, wenn die Leistung dafür genutzt würde dnsmasq- siehe z. B. dnsgate (was ich nicht ausprobiert habe).
reinierpost 30.08.17
Meins hat 1,7 MB mit 57k Leitungen. Sie können Ihre große /etc/hostsDatei von hostsfile.org
fly