it-swarm.com.de

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

Wie kann ich die Größenbeschränkung von /etc/hosts Bestimmen oder festlegen? Wie viele Zeilen kann es haben?

44
Geremia

Zu den problematischen Effekten gehören eine langsame Auflösung von Hostnamen (es sei denn, das Betriebssystem konvertiert die lineare Liste irgendwie in eine Struktur, die schneller zu suchen ist?) Und das Potenzial für eine überraschende Interaktion mit Shell tab Fertigstellung lange bevor eine sinnvolle Dateigröße erreicht ist.

Zum Beispiel! Wenn man 500.000 Host-Einträge in /etc/hosts

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

für die Wissenschaft der Standard-Hostname tab Die Fertigstellung in ZSH dauert auf meinem System ca. 25 Sekunden, um eine Eingabeaufforderung zurückzugeben (zugegeben, dies ist auf einem Laptop aus dem Jahr 2008 mit einer Festplatte mit 5400 U/min, aber immer noch).

57
thrig

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) war diese Datei das einzige Mittel, um nach Hostnamen zu suchen. Ich gehe daher davon aus, 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 Gateways1.

Die einzige wirkliche Grenze, die ich finden konnte, war, dass auf einigen Systemen die einzelnen Zeilen auf weniger als BUFSIZ Zeichen (ab 1024) beschränkt sind meine OpenBSD-Maschine).

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


1Vielen Dank an Jeff Schaller für das Ausgraben.

21
Kusalananda

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, den andere Dateien in derselben Datei verwenden (wahrscheinlich root (/)) Dateisystem:

  • 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).

13
Jeff Schaller

Größenbeschränkungen gelten nur beim Zuweisen statischer Puffer. gethostbyname(3), die die Einträge in /etc/hosts, ordnet keine statischen Puffer zu - und hat es nie getan. Der ursprüngliche Algorithmus von 1983 Veröffentlichung von BSD 4. zeigt ein Muster zum Öffnen einer Datei, während die Zeile analysiert und die Datei geschlossen wird:

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.

Wie auch immer, intern ist die *hostent Funktionsfamilie speichert einen Dateizeiger auf die aktuelle Zeile in der Datei. sethostent öffnet die Datei und legt die Position des Dateizeigers fest. gethostent ruft Daten ab und rückt den Zeiger vor. endhostent schließt den Dateizeiger. Die GNU C-Bibliothek bietet eine ausführliche Referenz zu diesen Funktionen.

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

Egal wie groß die Datei ist, das Betriebssystem verbraucht sie. Schließlich stoßen Sie jedoch an die Grenzen des Dateisystems (per Jeff Schallers Antwort ). Sie haben auch maximale Zeilengrößenbeschränkungen (per Kusalanandas Antwort ). Aber am Ende können Sie es so groß machen, wie Sie wollen. Aber bitte nicht.

11
bishop

... Ich habe mir den Kopf zerbrochen und für mein ganzes Leben kann ich mir keine einzige Situation oder einen Umstand vorstellen, in dem Sie sich in /etc/hosts An ein Problem mit Größenbeschränkungen wenden würden - Sie würden rennen in praktische Probleme wie die schwerwiegende Beeinträchtigung der getaddrinfo() - Familie von Systemaufrufen, die alle die Datei konsultieren müssen, bevor sie entscheiden, ob eine DNS-Abfrage gesendet werden soll, ganz zu schweigen von den Problemen beim Verwalten einer flachen Textdatei Größe.

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

2
Shadur