Qual è il limite di dimensione / etc / hosts?


44

Come posso determinare o impostare il limite di dimensione di /etc/hosts? Quante linee può avere?


64
... Penso che nel momento in cui questo diventa una vera preoccupazione piuttosto che una curiosità accademica, hai superato di gran lunga il punto in cui sarebbe più saggio impostare un server DNS privato in termini di prestazioni e manutenibilità.
Shadur,

5
Sono sorpreso che tu lo stia chiedendo. Perché ti aspetti un limite di dimensioni significative e precise per i file di configurazione?
Basile Starynkevitch,

3
@BasileStarynkevitch Ho chiesto perché un file host di ~ 2 MB non funzionava sul mio router, ma il problema era che non ho cercato dnsmasq per rileggere il file hosts.
Geremia,

2
@Geremia il mio file hosts è 500M, oltre 15.000 voci, nessun problema. È sempre meglio determinare la causa principale del problema e risolverlo prima
bsd

3
Stai usando il tuo file host per bloccare gli indirizzi IP? Se è così dovresti usare iptables con ipset. L'uso di iptables da solo provocherà un notevole impatto sulle prestazioni, tuttavia con ipset un elenco di quasi 500.000 ips ha un impatto trascurabile.
cybernard,

Risposte:


57

Gli effetti problematici includono una lenta risoluzione del nome host (a meno che il sistema operativo non converta in qualche modo l'elenco lineare in una struttura più veloce per la ricerca?) E il potenziale per un'interazione sorprendente con il tabcompletamento della shell molto prima che venga raggiunta una dimensione di file significativa.

Per esempio! Se uno inserisce 500.000 voci host in/etc/hosts

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

per la scienza, il tabcompletamento del nome host predefinito in ZSH impiega circa 25 secondi sul mio sistema per restituire un prompt di completamento (garantito, questo è su un laptop dal 2008 con un disco da 5400 RPM, ma comunque).


21

Non penso che abbia un limite di dimensioni in termini di numero di righe.

Prima del DNS (che è stato messo in uso nel 1985), era questo file che serviva come unico mezzo per fare ricerche sui nomi host, quindi presumo che ciò significhi che il file dovrebbe essere in grado di avere migliaia o almeno centinaia di voci per essere in grado di supportare i nodi Internet pre-1985 più ben collegati.

Ecco un esempio del 1985 (il formato è leggermente cambiato): http://jim.rees.org/apollo-archive/hosts.txt Questo file ha 1680 righe di cui 1325 sono linee host. Le restanti 355 righe sono vuote, commenti, reti o gateway 1 .

L'unico vero limite che ho potuto trovare era che su alcuni sistemi, le singole linee sono limitate a meno di BUFSIZcaratteri (1024 sulla mia macchina OpenBSD).

Se hai più di un paio di manciate di voci /etc/hosts, dovresti prendere in considerazione la creazione di un server dei nomi locale, ma questa è la mia opinione personale.


1 Grazie a Jeff Schaller per averlo scoperto.


Prima del DNS, non credo fosse comune convertire la tabella completa dell'host Internet in /etc/hostsformato. La maggior parte dei sistemi Unix non erano nemmeno su Internet e, anche se lo era una macchina, non aveva bisogno di una tabella host completa, solo la manciata di macchine con cui aveva bisogno di parlare. Sarei sorpreso se ci fossero molte macchine con più di 100 voci.
Barmar,

13

Come posso determinare il limite di dimensione di / etc / hosts?

È un file normale, quindi il limite corrisponderebbe ai limiti del filesystem sottostante (che sarebbe esso stesso limitato dal numero di dischi dietro di esso), meno lo spazio utilizzato da qualsiasi altro file nello stesso /filesystem (probabilmente root ( )):

  • ext2 / 3: 2 TiB
  • ext4: 16 TiB (con la dimensione del blocco 4KiB predefinita)
  • xfs: 500 TiB

Come posso impostare il limite di dimensione di / etc / hosts?

Poiché è un file modificato manualmente, solo manualmente:

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

(per rimuovere le righe 100 e successive).


3
Vero in linea di principio, ma i limiti del file system (ad es. Terabyte) sono praticamente irrilevanti.
Basile Starynkevitch,

11

I limiti di dimensione si applicano solo quando si allocano buffer statici. gethostbyname(3), che analizza le voci in /etc/hosts, non alloca i buffer statici e non lo ha mai fatto. La versione originale 1983 dell'algoritmo BSD 4.3 mostra un modello di file aperto, mentre la riga di analisi, modello di file chiuso:

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

Le implementazioni moderne conservano questo patrimonio in tutti gli aspetti essenziali.

Comunque, internamente, la *hostentfamiglia di funzioni memorizza un puntatore di file sulla riga corrente nel file. sethostentapre il file e imposta la posizione del puntatore del file. gethostentottiene i dati e fa avanzare il puntatore. endhostentchiude il puntatore del file. La libreria GNU C offre un riferimento completo a queste funzioni.

Come si può immaginare dall'implementazione, le voci che si verificano prima nel file vengono risolte più rapidamente. Se il tuo file hosts è enorme, questo entra in gioco.

Quindi, non importa quanto sia grande il file, il sistema operativo lo consumerà. Alla fine, però, raggiungerai i limiti del filesystem (secondo la risposta di Jeff Schaller ). Hai anche limiti di dimensione massima della linea (secondo la risposta di Kusalananda ). Ma, alla fine, puoi renderlo grande quanto vuoi. Ma per favore, non farlo.


2
Usando glibc e linux, sfortunatamente non è così semplice. Se chiami gethostbyname e il sistema è configurato di conseguenza (impostazione predefinita su molti sistemi), invece di leggere / etc / host chiamerà nscd. Non ho idea se l'nscd memorizzerà nella cache solo i risultati nel file o proverà a memorizzarlo nella sua interezza. Nel secondo caso, avresti una limitazione di ram per la dimensione del file (supponendo che la configurazione di nscd consenta così tante voci)
PlasmaHH,

1
La versione 4.3BSD è qui . Supportava una versione con hash dbm di / etc / hosts. IIRC, dbm ha imposto alcuni limiti di dimensione che potrebbero far fallire i tentativi di creare un db con hash.
Mark Plotnick,

2

... Ho distrutto il mio cervello e per la mia vita non riesco a pensare a una singola situazione o circostanza in cui dovresti affrontare qualsiasi tipo di problema relativo al limite di dimensione /etc/hosts- incontreresti problemi pratici come il grave hit delle prestazioni della getaddrinfo()famiglia di chiamate di sistema che tutti devono consultare il file prima di decidere se inviare una query DNS, per non parlare dei problemi di mantenimento di un file di testo piatto di quelle dimensioni.

Sospetto che ciò che abbiamo qui sia un fallimento nel comunicare a un livello superiore. Quale problema stai cercando di risolvere con un /etc/hostsfile gigantesco ? Sono quasi certo che ci sia una soluzione migliore di questa.


8
Alcune persone usano un hostsfile per inserire nella lista nera annunci / malware / tracking / ecc. Ci sono elenchi curati su Internet, quello che uso è 41k linee e 1,1 MB di dimensioni.
Bert,

Probabilmente sarebbe meglio usare le prestazioni dnsmasqper questo - vedi ad esempio dnsgate (che non ho provato).
reinierpost,

Il mio ha 1,7 MB con 57k linee. Puoi ottenere il tuo enorme /etc/hostsfile da hostsfile.org
styrofoam vola il

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.