/ etc / hosts 크기 제한은 무엇입니까?


44

크기 제한을 /etc/hosts어떻게 결정하거나 설정할 수 있습니까? 몇 줄을 가질 수 있습니까?


64
... 이것이 학문적 호기심보다는 실제적인 걱정이되는 시점에서 성능 및 유지 관리 성 측면에서 개인 DNS 서버를 설정하는 것이 현명한 시점 을 훨씬 넘어 섰다고 생각 합니다.
Shadur

5
나는 당신이 묻는 것에 놀랐습니다. 구성 파일에서 정확하고 어려운 크기 제한이 필요한 이유는 무엇입니까?
Basile Starynkevitch

3
@BasileStarynkevitch ~ 2MB 호스트 파일이 라우터에서 작동하지 않아서 요청했지만, 문제는 dnsmasq를 호스트 파일을 다시 읽을 필요가 없다는 것입니다.
Geremia

2
@ Geremia 내 호스트 파일은 500M, 15,000+ 항목이며 아무런 문제가 없습니다. 문제의 근본 원인을 파악하고 먼저 해결하는 것이 가장 좋습니다.
bsd

3
호스트 파일을 사용하여 IP 주소를 차단하고 있습니까? 그렇다면 ipset과 함께 iptables를 사용해야합니다. iptables 만 사용하면 성능이 크게 저하되지만 ipset을 사용하면 거의 500,000 개의 ip 목록이 무시할만한 영향을 미칩니다.
cybernard

답변:


57

문제의 영향은 느린 호스트 이름 확인 (OS가 어떻게 든 선형 목록을보다 빠른 검색 구조로 변환하지 않는 한)과 tab의미있는 파일 크기에 도달하기 전에 쉘 완료 와의 놀라운 상호 작용 가능성을 포함 합니다.

예를 들어! 호스트에 500,000 개의 호스트 항목을 배치하는 경우/etc/hosts

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

과학의 경우 tabZSH 의 기본 호스트 이름 완성은 시스템에서 완료 프롬프트를 반환하는 데 약 25 초가 걸립니다 (허가 됨, 2008 년부터 5400 RPM 디스크의 랩톱에 있지만 여전히).


21

줄 수 측면에서 크기 제한이 있다고 생각하지 않습니다.

DNS (1985 년에 사용됨) 이전에는이 ​​파일이 호스트 이름 조회를 수행하는 유일한 수단으로 사용되었으므로 파일에 수천 개 또는 수백 개 이상의 항목이있을 수 있다고 가정합니다. 가장 잘 연결된 1985 년 이전의 인터넷 노드를 지원할 수 있습니다.

다음은 1985 년의 예입니다 (형식이 다소 변경됨). http://jim.rees.org/apollo-archive/hosts.txt 이 파일에는 1680 행 중 1325 행이 호스트 행입니다. 나머지 355 라인은 공백, 주석, 네트워크 또는 게이트웨이 1 입니다.

내가 찾을 수있는 유일한 한계는 일부 시스템에서 개별 BUFSIZ문자 (제대로 OpenBSD 컴퓨터에서 1024) 로 제한된다는 것 입니다.

에 몇 개 이상의 항목이있는 /etc/hosts경우 대신 로컬 이름 서버를 설정하는 것이 좋습니다.하지만 이것이 제 개인적인 의견입니다.


1 이것을 파고 들었던 Jeff Schaller에게 감사합니다.


DNS 이전에는 전체 인터넷 호스트 테이블을 /etc/hosts형식으로 변환하는 것이 일반적이라고 생각하지 않습니다 . 대부분의 유닉스 시스템은 인터넷에 연결되어 있지 않았으며 컴퓨터가 있어도 완전한 호스트 테이블이 필요하지 않았습니다. 100 개가 넘는 항목이있는 머신이 많은 경우 놀랍습니다.
Barmar

13

/ etc / hosts의 크기 제한을 어떻게 확인할 수 있습니까?

이 파일은 일반 파일이므로 기본 파일 시스템의 제한 (뒤에있는 디스크 수로 제한됨)에서 동일한 (아마 루트 ( /)) 파일 시스템의 다른 파일이 사용하는 공간을 뺀 값에 해당합니다 .

  • ext2 / 3 : 2TiB
  • ext4 : 16TiB (기본 4KiB 블록 크기 사용)
  • xfs : 500TiB

/ etc / hosts의 크기 제한을 어떻게 설정합니까?

수동으로 편집 한 파일이므로 수동으로 만 :

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

(라인 100 이상 제거).


3
원칙적으로는 맞지만 파일 시스템 제한 (예 : 테라 바이트)은 거의 관련이 없습니다.
Basile Starynkevitch

11

크기 제한은 정적 버퍼를 할당 할 때만 적용됩니다. gethostbyname(3)의 항목을 구문 분석하는 /etc/hosts, 정적 버퍼를 할당하지 않습니다. BSD 4.3 알고리즘 의 원래 1983 릴리스 는 열린 파일을 보여 주지만 라인, 가까운 파일 패턴을 구문 분석합니다.

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

현대의 구현은 모든 필수 요소에서이 유산을 유지합니다.

어쨌든 내부적 *hostent으로 함수 계열은 파일의 현재 줄에 대한 파일 포인터를 저장합니다. sethostent파일을 열고 파일 포인터 위치를 설정합니다. gethostent데이터를 가져와 포인터를 전진시킵니다. endhostent파일 포인터를 닫습니다. GNU C 라이브러리는 이러한 기능에 대한 철저한 참조 를 제공 합니다.

구현에서 추측 할 수 있듯이 파일에서 더 일찍 발생하는 항목이 더 빨리 해결됩니다. 호스트 파일이 크면 재생됩니다.

따라서 파일의 크기에 상관없이 OS는 파일을 사용합니다. 그러나 결국 파일 시스템 제한에 도달하게됩니다 ( Jeff Schaller의 답변에 따라 ). 또한 최대 라인 크기 제한이 있습니다 ( Kusalananda의 답변에 따라 ). 그러나 결국 원하는만큼 크게 만들 수 있습니다. 그러나 제발,하지 마십시오.


2
glibc와 Linux를 사용하면 불행히도 그렇게 간단하지 않습니다. gethostbyname을 호출하고 시스템이 그에 따라 설정되면 (많은 시스템에서 기본값) / etc / host를 읽는 대신 nscd를 호출합니다. nscd가 파일의 적중 만 캐시하거나 전체적으로 캐시하려고 시도하는지 전혀 알 수 없습니다. 후자의 경우 파일 크기에 대한 램 제한이 있습니다 (nscd 구성이 많은 항목을 허용한다고 가정)
PlasmaHH

1
4.3BSD 버전은 여기에 있습니다 . / etc / hosts의 dbm 해시 버전을 지원했습니다. IIRC, dbm은 해시 된 db 생성 시도가 실패 할 수있는 일부 크기 제한을 부과했습니다.
마크 Plotnick

2

... 나는 내 머리를 랙에 장착했고 내 인생 나는 당신이 크기 제한 문제의 모든 종류를 접근하는 것 하나의 상황이나 환경 생각할 수 없다 /etc/hosts- 당신이 심각한 같은 실질적인 문제로 실행하는 것 getaddrinfo()DNS 쿼리를 보낼지 여부를 결정하기 전에 모두 파일을 참조해야하는 시스템 호출 제품군에 성능 저하가 발생하여 플랫 텍스트 파일 크기를 유지하는 데 아무런 문제가 없습니다.

우리가 여기있는 것은 더 높은 수준의 의사 소통에 실패한 것 같습니다. 거대한 /etc/hosts파일로 어떤 문제를 해결하려고 합니까? 나는 이것보다 더 나은 해결책이 있다고 확신합니다.


8
어떤 사람들은 hosts파일을 사용하여 광고 / 악성 프로그램 / 추적 등을 차단합니다. 인터넷에는 엄선 된 목록이 있으며, 내가 사용하는 목록은 41k 줄과 1.1MB 크기입니다.
Bert

아마도 성능을 dnsmasq위해 그것을 사용 하는 것이 더 좋을 것입니다 -예를 들어 시도하지 않은 dnsgate를 참조하십시오 .
reinierpost

광산에는 1.7k의 57k 라인이 있습니다. hostsfile.org/etc/hosts 에서 거대한 파일을 얻을 수 있습니다
스티로폼은

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.