Come posso determinare o impostare il limite di dimensione di /etc/hosts
? Quante linee può avere?
Come posso determinare o impostare il limite di dimensione di /etc/hosts
? Quante linee può avere?
Risposte:
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).
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 BUFSIZ
caratteri (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.
/etc/hosts
formato. 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.
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 ( )):
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).
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 *hostent
famiglia di funzioni memorizza un puntatore di file sulla riga corrente nel file. sethostent
apre il file e imposta la posizione del puntatore del file. gethostent
ottiene i dati e fa avanzare il puntatore. endhostent
chiude 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.
... 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/hosts
file gigantesco ? Sono quasi certo che ci sia una soluzione migliore di questa.
hosts
file 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.
dnsmasq
per questo - vedi ad esempio dnsgate (che non ho provato).
/etc/hosts
file da hostsfile.org