Jaki jest limit rozmiaru / etc / hosts?


44

Jak mogę ustalić lub ustawić limit rozmiaru /etc/hosts? Ile może mieć linii?


64
... Myślę, że w momencie, gdy staje się to prawdziwym zmartwieniem, a nie akademicką ciekawostką, znacznie przekroczyłeś punkt, w którym rozsądniej byłoby założyć prywatny serwer DNS pod względem wydajności i łatwości konserwacji.
Shadur

5
Jestem zaskoczony, że pytasz. Dlaczego oczekujesz precyzyjnego i twardego ograniczenia rozmiaru plików konfiguracyjnych?
Basile Starynkevitch

3
@BasileStarynkevitch Zapytałem, ponieważ plik hostów o wielkości ~ 2 MB nie działał na moim routerze, ale problem polegał na tym, że nie od razu dnsmasq przestałem czytać plik hosts.
Geremia

2
@Geremia mój plik hosts to 500M, ponad 15 000 wpisów, żadnych problemów. Zawsze najlepiej jest określić pierwotną przyczynę problemu i rozwiązać go najpierw
bsd

3
Czy używasz pliku hosta do blokowania adresów IP? Jeśli tak, powinieneś używać iptables z ipset. Używanie samego iptables spowoduje znaczny spadek wydajności, jednak w przypadku ipset lista prawie 500 000 ips ma znikomy wpływ.
cybernard

Odpowiedzi:


57

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


21

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ż BUFSIZznakó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.


Przed DNS nie sądzę, że konwersja pełnej tabeli hostów internetowych do /etc/hostsformatu 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.
Barmar

13

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:

  • ext2 / 3: 2 TiB
  • ext4: 16 TiB (przy domyślnym rozmiarze bloku 4KiB)
  • xfs: 500 TiB

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


3
To prawda, ale ograniczenia systemu plików (np. Terabajty) są praktycznie w dużej mierze nieistotne.
Basile Starynkevitch

11

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 *hostentrodzina funkcji przechowuje wskaźnik pliku do bieżącej linii w pliku. sethostentotwiera plik i ustawia pozycję wskaźnika pliku. gethostentpobiera dane i przesuwa wskaźnik. endhostentzamyka 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.


2
Korzystanie z glibc i linux niestety nie jest takie proste. Jeśli wywołasz gethostbyname i system zostanie odpowiednio skonfigurowany (domyślnie w wielu systemach), wówczas zamiast czytać / etc / host wywoła nscd. Nie mam pojęcia, czy nscd buforuje tylko trafienia w pliku, czy próbuje buforować jako całość. W późniejszym przypadku miałbyś ograniczenie
pamięci

1
Wersja 4.3BSD jest tutaj . Obsługiwano zaszyfrowaną dbm wersję / etc / hosts. IIRC, dbm narzuciło pewne limity wielkości, które mogą spowodować, że próby utworzenia skasowanej bazy danych zakończą się niepowodzeniem.
Mark Plotnick

2

... 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/hostspliku? Jestem prawie pewien, że istnieje lepsze rozwiązanie niż to.


8
Niektóre osoby używają hostspliku 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.
Bert

Prawdopodobnie lepiej byłoby użyć dnsmasqdo tego wydajności - patrz np. Dnsgate (którego nie próbowałem).
reinierpost

Mój ma 1,7 MB z 57 tys. Linii. Możesz pobrać swój ogromny /etc/hostsplik z hostsfile.org
styrofoam fly

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.