/ Etc / hosts boyutu sınırı nedir?


44

Boyut sınırını nasıl belirleyebilir veya ayarlayabilirim /etc/hosts? Kaç satır olabilir?


64
... Bu gerçek bir endişe yerine, var akademik merakı haline noktada düşünmek kadar performans ve bakımı açısından özel bir DNS sunucusu kurmak akıllıca olacaktır noktayı geçti.
Shadur

5
İstediğine şaşırdım. Yapılandırma dosyalarında neden kesin ve zor anlamlı bir boyut sınırı bekliyorsunuz?
Basile Starynkevitch,

3
@BasileStarynkevitch 2 MB ana bilgisayar dosyası yönlendiricimde çalışmadığı için sordum, ancak sorun ana bilgisayar dosyasını yeniden okumak için dnsmasq'ı çekmememdi.
Geremia,

2
@Geremia benim ana bilgisayar dosyam 500M, 15.000+ giriş, sorun yok. Sorununuzun kök nedenini belirlemek ve önce çözmek her zaman en iyisidir
bsd

3
IP adreslerini engellemek için ana bilgisayar dosyanızı kullanıyor musunuz? Eğer öyleyse, ipset ile iptables kullanıyor olmalısınız. Yalnızca iptables kullanımı büyük bir performans etkilemesine neden olur, ancak ipset ile yaklaşık 500.000 ips listesi ihmal edilebilir düzeydedir.
cybernard

Yanıtlar:


57

Sorunlu etkiler arasında, yavaş ana bilgisayar adı çözümü (işletim sistemi bir şekilde doğrusal listeyi daha hızlı bir arama yapısına dönüştürmezse?) Ve tabanlamlı bir dosya boyutuna ulaşılmadan önce kabuk tamamlama ile şaşırtıcı etkileşim potansiyeli vardır .

Örneğin! Biri 500.000 ana bilgisayar girişine/etc/hosts

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

Bilim için, tabZSH'deki varsayılan ana bilgisayar adı tamamlamanın sistemime bir tamamlama istemini döndürmesi yaklaşık 25 saniye sürüyor (bu, 2008'den beri 5400 RPM diskli bir dizüstü bilgisayarda, ancak hala geçerli).


21

Satır sayısı açısından bir boyut sınırı olduğunu sanmıyorum.

(1985'te kullanıma sunulan) DNS’ten önce, bu dosya ana bilgisayar ad araması yapmanın tek yoluydu, bu yüzden dosyanın binlerce veya en az yüzlerce giriş yapabilmesi gerektiğini düşünüyorum. En iyi bağlanmış 1985 öncesi İnternet düğümlerini destekleyebilme.

İşte 1985'ten bir örnek (biçim biraz değişti): http://jim.rees.org/apollo-archive/hosts.txt Bu dosyanın 1325 tanesinde ana hat var. Kalan 355 satır boş, yorum, ağ veya ağ geçidi 1'dir .

Bulabildiğim tek gerçek sınır, bazı sistemlerde, tek tek satırlarınBUFSIZ karakterlerden daha küçük olmasıydı (OpenBSD makinemde 1024).

Birkaç girişden fazla girişiniz /etc/hostsvarsa, bunun yerine yerel bir ad sunucusu ayarlamayı düşünmelisiniz, ama bu benim kişisel görüşüm.


1 Bunu kazdığınız için teşekkürler Jeff Schaller.


DNS'den önce, tüm Internet ana bilgisayar tablosunu /etc/hostsformata dönüştürmenin yaygın olduğunu düşünmüyorum . Çoğu Unix sistemi internette bile değildi ve bir makine bile olsa, konuşması gereken makinelerin sadece bir kısmı tam bir ana masaya ihtiyaç duymuyordu. 100'den fazla girişi olan birçok makine olsaydı şaşırırdım.
Barmar

13

/ Etc / hosts dosyasının boyut sınırını nasıl belirleyebilirim?

Bu normal bir dosyadır, bu nedenle sınır, altta yatan dosya sisteminin sınırlarına (bunun arkasındaki disklerin sayısıyla sınırlandırılmış olur) karşılık gelir, aynı (muhtemelen root ( /)) dosya sistemindeki diğer dosyalar tarafından kullanılan alanı ekler:

  • ext2 / 3: 2 TiB
  • ext4: 16 TiB (varsayılan 4KiB blok boyutunda)
  • xfs: 500 TiB

/ Etc / hosts dosyasının boyut sınırını nasıl ayarlarım?

El ile düzenlenmiş bir dosya olduğundan, yalnızca el ile:

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

(100 ve daha sonraki satırları kaldırmak için).


3
Prensip olarak doğrudur, ancak dosya sistemi sınırları (örneğin terabayt) pratik olarak büyük oranda alakasızdır.
Basile Starynkevitch,

11

Boyut sınırları yalnızca statik arabellekleri ayırırken uygulanır. gethostbyname(3)Girişleri ayrıştırır, /etc/hostsstatik tamponları ayırmaz - ve asla. Orijinal BSD 4.3 algoritması 1983 sürümü , bir açık dosya gösterirken, ayrıştırma satırı, kapalı dosya deseni gösterir:

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

Modern uygulamalar bu mirası tüm temellerde tutar.

Neyse, dahili olarak, *hostentfonksiyonlar ailesi bir dosya göstericisini dosyadaki mevcut satıra saklar. sethostentdosyayı açar ve dosya işaretçi konumunu ayarlar. gethostentveri alır ve işaretçiyi ilerletir. endhostentdosya işaretçisini kapatır. GNU C Kütüphanesi bu fonksiyonlar hakkında kapsamlı bir referans sunar .

Uygulamadan tahmin edebileceğiniz gibi, dosyada daha önce gerçekleşen girişler daha hızlı çözülür. Anasistem dosyanız çok büyükse, bu devreye girer.

Yani, dosya ne kadar büyük olursa olsun, işletim sistemi onu tüketecektir. Sonunda, ancak, dosya sistemi sınırlarına ( Jeff Schaller'in cevabına göre ) çarpacaksınız . Ayrıca maksimum hat büyüklüğü limitleriniz de vardır ( Kusalananda'nın cevabına göre ). Ancak, sonunda, istediğiniz kadar büyük yapabilirsiniz. Ama lütfen yapma.


2
Glibc ve linux kullanarak, bu ne yazık ki o kadar kolay değil. Gethostbyname'i çağırırsanız ve sistem buna göre kurulursa (birçok sistemde varsayılan), / etc / host okumak yerine nscd'yi çağırır. Eğer nscd sadece dosyadaki isabetleri önbelleğe alırsa veya bir bütün olarak önbelleğe almaya çalışırsa, hiçbir fikrim yok. Daha sonraki durumda, dosya boyutu için bir sınırlama
sınırına sahip olursunuz

1
4.3BSD versiyonu burada . / Etc / hosts dosyasının bir dbm karma sürümünü destekledi. IIRC, dbm, bozuk bir db oluşturma girişimlerinin başarısız olmasına neden olabilecek bazı boyut sınırları getirdi.
Mark Plotnick

2

... beynimi kırdım ve hayatım boyunca tek bir durum ya da herhangi bir boyut sınırı sorununa yaklaşacağınız bir durum düşünemiyorum /etc/hosts- şiddetli gibi pratik sorunlara maruz kalacaksınız getaddrinfo()Sistem ailesine olan etkileyici performans , bir DNS sorgusu gönderip göndermemeye karar vermeden önce dosyaya danışması gerektiğini, bu boyutta düz bir metin dosyasını koruyan sorunların hiçbirini söylememesi gerektiğini söyler.

Burada sahip olduğumuz şeyin daha yüksek düzeyde iletişim kuramama ihtimalinden şüpheleniyorum. Devasa bir /etc/hostsdosyayla hangi sorunu çözmeye çalışıyorsunuz ? Bundan daha iyi bir çözüm olduğuna neredeyse eminim.


8
Bazı insanlar hostsreklamları / kötü amaçlı yazılımları / izlemeleri / vb. Kara listeye almak için bir dosya kullanır. İnternette küratörlüğünde listeler var, kullandıklarım 41 bin satır ve 1,1 MB boyutunda.
Bert,

Bunun için performansın kullanılması muhtemelen daha iyi olurdu dnsmasq- bakınız örneğin dnsgate (denemedim).
reinierpost

Mine 57k hat ile 1.7MB var. Büyük /etc/hostsdosyalarınızı hostsfile.org
strafor fly

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.