/ etc / hostsのサイズ制限とは何ですか?


44

のサイズ制限を決定または設定するにはどうすればよい/etc/hostsですか?いくつの行を持つことができますか?


64
...これが学問的な好奇心ではなく実際の心配になる時点で、パフォーマンスと保守性の観点からプライベートDNSサーバーを設定する方が賢明だという点をはるかに超えていると思います。
シャドゥール

5
私はあなたが尋ねていることに驚いています。構成ファイルに正確でハードな意味のあるサイズ制限が必要なのはなぜですか?
バジルスタリンケビッチ

3
@BasileStarynkevitchルーターで〜2 MBのhostsファイルが機能していなかったので尋ねましたが、問題は、hostsファイルを再読み込みするためにdnsmasqを吐き出さないことでした。
ジェレミア

2
@Geremiaのホストファイルは500M、15,000 +エントリ、問題ありません。問題の根本原因を特定し、最初に解決することが常に最善です
-bsd

3
ホストファイルを使用してIPアドレスをブロックしていますか?その場合、ipsetでiptablesを使用する必要があります。iptablesのみを使用すると、パフォーマンスが大幅に低下しますが、ipsetを使用すると、500,000近いipsのリストの影響は無視できます。
サイバーナード

回答:


57

問題のある影響には、ホスト名の解決が遅い(OSが線形リストを検索の速い構造に変換しない限り)と、tab意味のあるファイルサイズに達するかなり前にシェル補完との驚くべき相互作用の可能性があります。

例えば!500,000個のホストエントリを/etc/hosts

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

科学の場合tab、ZSHのデフォルトのホスト名補完は、システム上で完了プロンプトを返すまでに約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フォーマットに変換することは一般的ではなかったと思います。ほとんどのUnixシステムはインターネット上にも存在せず、たとえマシンがあったとしても、完全なホストテーブルを必要とせず、通信するのに必要な少数のマシンだけが必要でした。100を超えるエントリを持つ多くのマシンがあった場合、私は驚くでしょう。
バーマー

13

/ etc / hostsのサイズ制限を確認するにはどうすればよいですか?

これは通常のファイルであるため、制限は基礎となるファイルシステムの制限(それ自体の背後にあるディスクの数によって制限されます)から、同じ(おそらくルート(/))ファイルシステム内の他のファイルによって使用されるスペースを差し引いたものに対応します:

  • ext2 / 3:2 TiB
  • ext4:16 TiB(デフォルトの4KiBブロックサイズ)
  • xfs:500 TiB

/ etc / hostsのサイズ制限を設定するにはどうすればよいですか?

手動で編集されたファイルなので、手動でのみ:

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

(100行目以降を削除するため)。


3
原則として真ですが、ファイルシステムの制限(テラバイトなど)は実際にはほとんど無関係です。
バジルスタリンケビッチ

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ライブラリはこれらの機能に関する詳細なリファレンスを提供します。

実装から推測できるように、ファイル内の早い段階で発生したエントリはより速く解決されます。hostsファイルが巨大な場合、これが役立ちます。

そのため、ファイルがどれほど大きくても、OSはそれを消費します。しかし、最終的には、ファイルシステムの制限に達するでしょう(Jeff Schallerの回答による)。また、最大行サイズの制限もあります(Kusalanandaの回答による)。ただし、最終的には、必要なだけ大きくすることができます。しかし、しないでください。


2
glibcとLinuxを使用すると、残念ながらそれほど簡単ではありません。gethostbynameを呼び出し、それに応じてシステムがセットアップされている場合(多くのシステムではデフォルト)、/ etc / hostを読み取る代わりにnscdを呼び出します。nscdがファイル内のヒットのみをキャッシュするのか、それとも全体としてキャッシュしようとするのかはわかりません。
後者の

1
4.3BSDバージョンはこちらです。/ etc / hostsのdbmハッシュバージョンをサポートしていました。IIRC、dbmは、ハッシュされたdbを作成しようとすると失敗する可能性があるサイズ制限を課しました。
マークPlotnick

2

...私は頭を悩ませましたが、私の人生では、サイズ制限の問題に取り組む単一の状況や状況を考えることはできません/etc/hosts-あなたは深刻なような実用的な問題に遭遇するでしょうgetaddrinfo()DNSクエリを送信するかどうかを決定する前にファイルを参照する必要があるシステムコールファミリのパフォーマンスヒット。フラットテキストファイルをそのサイズに維持する問題は言うまでもありません。

ここにあるのは、より高いレベルでのコミュニケーションの失敗だと思います。巨大な/etc/hostsファイルでどのような問題を解決しようとしていますか?これよりも優れたソリューションがあることはほぼ確実です。


8
hostsファイルを使用して、ads / malware / tracking / etcをブラックリストに載せる人もいます。インターネットには厳選されたリストがありますが、私が使用しているリストは41k行で、サイズは1.1MBです。
バート

それにはおそらくパフォーマンスの方が良いでしょうdnsmasq-例えばdnsgateを参照してください(私は試していません)。
reinierpost

私のものは、57k行で1.7MBです。hostsfile.org/etc/hostsから巨大なファイルを取得できます
発泡スチロールフライ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.