Jak mogę ustalić lub ustawić limit rozmiaru /etc/hosts
? Ile może mieć linii?
Jak mogę ustalić lub ustawić limit rozmiaru /etc/hosts
? Ile może mieć linii?
Odpowiedzi:
Problematyczne skutki obejmują powolne rozpoznawanie nazwy hosta (chyba że system operacyjny w jakiś sposób przekształci listę liniową w strukturę szybszego wyszukiwania?) tabOraz możliwość zaskakującej interakcji z uzupełnianiem powłoki na długo przed osiągnięciem jakiegokolwiek znaczącego rozmiaru pliku.
Na przykład! Jeśli umieścisz 500 000 wpisów hosta w/etc/hosts
# perl -E 'for (1..500000) { say "127.0.0.10 $_.science" }' >> /etc/hosts
dla nauki, domyślne tabuzupełnienie nazwy hosta w ZSH zajmuje około ~ 25 sekund w moim systemie, aby zwrócić monit o zakończenie (oczywiście, jest to na laptopie z 2008 roku z dyskiem 5400 RPM, ale nadal).
Nie sądzę, że ma limit rozmiaru pod względem liczby linii.
Przed DNS (który został wprowadzony do użytku w 1985 r.) Był to jedyny sposób wykonywania wyszukiwania nazw hostów, więc zakładam, że oznacza to, że plik powinien mieć tysiące lub co najmniej setki wpisów do być w stanie obsługiwać najlepiej połączone węzły internetowe sprzed 1985 roku.
Oto przykład z 1985 roku (format nieco się zmienił): http://jim.rees.org/apollo-archive/hosts.txt Ten plik ma 1680 linii, z czego 1325 to linie hosta. Pozostałe 355 wierszy jest puste, komentarze, sieci lub bramy 1 .
Jedynym prawdziwym ograniczeniem, jakie mogłem znaleźć, było to, że w niektórych systemach poszczególne wiersze są ograniczone do mniej niż BUFSIZ
znaków (1024 na moim komputerze OpenBSD).
Jeśli masz więcej niż kilka wpisów /etc/hosts
, powinieneś rozważyć utworzenie lokalnego serwera nazw, ale takie jest moje osobiste zdanie.
1 Podziękowania dla Jeffa Schallera za wykopanie tego.
/etc/hosts
formatu była powszechna . Większość systemów uniksowych nie była nawet w Internecie, a nawet jeśli była to maszyna, nie potrzebowała kompletnej tabeli hostów, tylko garść maszyn, z którymi musiała rozmawiać. Byłbym zaskoczony, gdyby było wiele maszyn z ponad 100 wpisami.
Jak mogę określić limit rozmiaru / etc / hosts?
Jest to zwykły plik, więc limit odpowiadałby limitom bazowego systemu plików (który sam byłby ograniczony przez liczbę dysków za nim), pomniejszone o miejsce zajmowane przez inne pliki w tym samym (prawdopodobnie root ( /
)) systemie plików:
Jak mogę ustawić limit rozmiaru / etc / hosts?
Ponieważ jest to plik edytowany ręcznie, tylko ręcznie:
sed -i '100,$d' /etc/hosts
(aby usunąć linie 100 i dalsze).
Limity rozmiaru obowiązują tylko przy przydzielaniu buforów statycznych. gethostbyname(3)
, który analizuje wpisy /etc/hosts
, nie przydziela buforów statycznych - i nigdy tego nie miał. Oryginalna wersja algorytmu BSD 4.3 z 1983 r. Pokazuje wzór otwartego pliku, podczas analizowania wiersza, zamknięty plik:
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();
Nowoczesne wdrożenia zachowują to dziedzictwo we wszystkich istotnych aspektach.
W każdym razie wewnętrznie *hostent
rodzina funkcji przechowuje wskaźnik pliku do bieżącej linii w pliku. sethostent
otwiera plik i ustawia pozycję wskaźnika pliku. gethostent
pobiera dane i przesuwa wskaźnik. endhostent
zamyka wskaźnik pliku. Biblioteka GNU C oferuje dokładne omówienie tych funkcji.
Jak można się domyślić na podstawie implementacji, wpisy występujące wcześniej w pliku są rozpoznawane szybciej. Jeśli plik hostów jest ogromny, wchodzi w grę.
Niezależnie od tego, jak duży jest ten plik, system operacyjny go wykorzysta. W końcu jednak osiągniesz limity systemu plików (zgodnie z odpowiedzią Jeffa Schallera ). Masz również limity maksymalnego rozmiaru linii (na odpowiedź Kusalanandy ). Ale ostatecznie możesz zrobić tak duże, jak chcesz. Ale proszę nie.
... Zmiażdżyłem swój mózg i przez całe życie nie mogę wymyślić ani jednej sytuacji ani okoliczności, w których można by podejść do jakiegokolwiek problemu z ograniczeniem wielkości /etc/hosts
- wpadłbyś na problemy praktyczne, takie jak poważne wydajność uderzyła w getaddrinfo()
rodzinę wywołań systemowych, które muszą zapoznać się z plikiem przed podjęciem decyzji o wysłaniu zapytania DNS, nie mówiąc już o problemach z utrzymaniem płaskiego pliku tekstowego o takim rozmiarze.
Podejrzewam, że mamy tu do czynienia z brakiem komunikacji na wyższym poziomie. Jaki problem próbujesz rozwiązać za pomocą gigantycznego /etc/hosts
pliku? Jestem prawie pewien, że istnieje lepsze rozwiązanie niż to.
hosts
pliku do umieszczania na czarnej liście reklam / złośliwego oprogramowania / śledzenia / itp. W Internecie są wyselekcjonowane listy, z których korzystam to 41 tys. Linii i rozmiar 1,1 MB.
dnsmasq
do tego wydajności - patrz np. Dnsgate (którego nie próbowałem).
/etc/hosts
plik z hostsfile.org