のサイズ制限を決定または設定するにはどうすればよい/etc/hosts
ですか?いくつの行を持つことができますか?
のサイズ制限を決定または設定するにはどうすればよい/etc/hosts
ですか?いくつの行を持つことができますか?
回答:
問題のある影響には、ホスト名の解決が遅い(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のディスクを使用していますが、それでも可能です)。
行数の点でサイズ制限があるとは思わない。
DNS(1985年に使用が開始された)の前は、このファイルがホスト名のルックアップを行う唯一の手段として機能していたため、これはファイルが何千または少なくとも数百のエントリを持つことができることを意味すると推測最もよく接続された1985年以前のインターネットノードをサポートできる。
1985年の例を次に示します(形式は多少変更されています)。http : //jim.rees.org/apollo-archive/hosts.txt このファイルには1680行あり、そのうち1325行はホスト行です。残りの355行は空白、コメント、ネットワーク、またはゲートウェイ1です。
私が見つけることができる唯一の本当の制限は、一部のシステムでは、個々の行がBUFSIZ
文字(OpenBSDマシンでは1024)未満に制限されていることでした。
にいくつかのエントリが/etc/hosts
ある場合は、代わりにローカルネームサーバーのセットアップを検討する必要がありますが、それは私の個人的な意見です。
1 これを掘り下げてくれたJeff Schallerに感謝します。
/etc/hosts
フォーマットに変換することは一般的ではなかったと思います。ほとんどのUnixシステムはインターネット上にも存在せず、たとえマシンがあったとしても、完全なホストテーブルを必要とせず、通信するのに必要な少数のマシンだけが必要でした。100を超えるエントリを持つ多くのマシンがあった場合、私は驚くでしょう。
/ etc / hostsのサイズ制限を確認するにはどうすればよいですか?
これは通常のファイルであるため、制限は基礎となるファイルシステムの制限(それ自体の背後にあるディスクの数によって制限されます)から、同じ(おそらくルート(/
))ファイルシステム内の他のファイルによって使用されるスペースを差し引いたものに対応します:
/ etc / hostsのサイズ制限を設定するにはどうすればよいですか?
手動で編集されたファイルなので、手動でのみ:
sed -i '100,$d' /etc/hosts
(100行目以降を削除するため)。
サイズ制限は、静的バッファを割り当てるときにのみ適用されます。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の回答による)。ただし、最終的には、必要なだけ大きくすることができます。しかし、しないでください。
...私は頭を悩ませましたが、私の人生では、サイズ制限の問題に取り組む単一の状況や状況を考えることはできません/etc/hosts
-あなたは深刻なような実用的な問題に遭遇するでしょうgetaddrinfo()
DNSクエリを送信するかどうかを決定する前にファイルを参照する必要があるシステムコールファミリのパフォーマンスヒット。フラットテキストファイルをそのサイズに維持する問題は言うまでもありません。
ここにあるのは、より高いレベルでのコミュニケーションの失敗だと思います。巨大な/etc/hosts
ファイルでどのような問題を解決しようとしていますか?これよりも優れたソリューションがあることはほぼ確実です。
hosts
ファイルを使用して、ads / malware / tracking / etcをブラックリストに載せる人もいます。インターネットには厳選されたリストがありますが、私が使用しているリストは41k行で、サイズは1.1MBです。
dnsmasq
-例えばdnsgateを参照してください(私は試していません)。