web-dev-qa-db-ja.com

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

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

44
Geremia

問題のある影響には、遅いホスト名解決(OSが線形リストを何らかの方法でより高速に検索できる構造に変換しない限り)およびシェルとの意外な相互作用の可能性が含まれます tab 意味のあるファイルサイズに達する前に完了します。

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

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

科学の場合、デフォルトのホスト名 tab ZSHでの完了は、私のシステムで完了プロンプトを返すまでに約25秒かかります(これは、5400 RPMディスクが搭載された2008年のラップトップでも可能です)。

57
thrig

行数の制限はないと思います。

DNS(1985年に使用されるようになった)の前は、このファイルがホスト名ルックアップを実行する唯一の手段として機能していたため、これは、ファイルに数千または少なくとも数百のエントリを含めることができることを意味していると思います最もよく接続された1985年以前のインターネットノードをサポートできる。

1985年の例を次に示します(形式が多少変更されています)。 http://jim.rees.org/apollo-archive/hosts.txt このファイルには1680行あり、そのうち1325行はホスト行です。残りの355行は空白、コメント、ネットワーク、またはゲートウェイです1

私が見つけた唯一の実際の制限は、一部のシステムでは、個々のBUFSIZ文字(1024で私のOpenBSDマシン)。

/etc/hostsに数エントリ以上のエントリがある場合は、代わりにローカルネームサーバーの設定を検討する必要がありますが、それは私の個人的な意見です。


1これを掘り下げてくれたJeff Schallerに感謝します。

21
Kusalananda

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

これは通常のファイルなので、制限は、基礎となるファイルシステムの制限(それ自体はその背後にあるディスクの数によって制限されます)から、同じファイル内の他のファイル(おそらくroot(/)) ファイルシステム:

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

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

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

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

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

13
Jeff Schaller

サイズ制限は、静的バッファーを割り当てるときにのみ適用されます。 gethostbyname(3)は、/etc/hostsのエントリを解析し、静的バッファを割り当てません-割り当てません。オリジナルの1983 BSD 4.3のリリース アルゴリズムは、ファイルを開いているのに、行を解析してファイルを閉じるパターンを示しています。

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の回答 ごと)。しかし、最終的には、好きなだけ大きくすることができます。しかし、しないでください。

11
bishop

...私は頭を悩ませており、私の一生の間、_/etc/hosts_であらゆる種類のサイズ制限の問題にアプローチする単一の状況または状況を考えることはできません-遭遇しますgetaddrinfo()ファミリーのシステムコールの深刻なパフォーマンスヒットなどの実際的な問題。すべてのファイルを調べてからDNSクエリを送信するかどうかを決定する必要があり、そのサイズのフラットテキストファイルを維持する問題は言うまでもありません。 。

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

2
Shadur