Berapa batas ukuran / etc / hosts?

44

Bagaimana saya bisa menentukan atau mengatur batas ukuran /etc/hosts? Berapa banyak garis yang dimilikinya?

Geremia
sumber
64
... Saya pikir pada titik di mana ini menjadi kekhawatiran yang sebenarnya daripada keingintahuan akademik Anda telah jauh melewati titik di mana akan lebih bijaksana untuk membuat server DNS pribadi dalam hal kinerja dan pemeliharaan.
Shadur
5
Saya terkejut Anda bertanya. Mengapa Anda mengharapkan batas ukuran yang bermakna dan sulit pada file konfigurasi?
Basile Starynkevitch
3
@ BasileStarynkevitch saya bertanya karena file host ~ 2 MB tidak berfungsi pada router saya, tetapi masalahnya adalah bahwa saya tidak sighup dnsmasq untuk membaca kembali file host.
Geremia
2
@Geremia file host saya adalah 500M, 15.000+ entri, tidak ada masalah. Itu selalu yang terbaik untuk menentukan akar penyebab masalah Anda dan menyelesaikannya terlebih dahulu
bsd
3
Apakah Anda menggunakan file host untuk memblokir alamat IP? Jika demikian, Anda harus menggunakan iptables dengan ipset. Menggunakan iptables saja akan menyebabkan hit kinerja besar, namun dengan ipset daftar hampir 500.000 ips memiliki dampak yang dapat diabaikan.
cybernard

Jawaban:

57

Efek bermasalah termasuk resolusi hostname lambat (kecuali OS entah bagaimana mengubah daftar linier menjadi struktur pencarian yang lebih cepat?) Dan potensi interaksi yang mengejutkan dengan tabpenyelesaian shell jauh sebelum ukuran file yang berarti tercapai.

Sebagai contoh! Jika satu tempat 500.000 entri host di/etc/hosts

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

untuk sains, tabpenyelesaian nama host default di ZSH membutuhkan sekitar ~ 25 detik pada sistem saya untuk mengembalikan prompt penyelesaian (memang, ini ada di laptop mulai 2008 dengan disk 5400 RPM, tapi tetap saja).

thrig
sumber
21

Saya tidak berpikir itu memiliki batas ukuran dalam hal jumlah garis.

Sebelum DNS (yang mulai digunakan pada tahun 1985), file inilah yang menjadi satu-satunya cara untuk melakukan pencarian nama host, jadi saya berasumsi bahwa ini berarti file tersebut harus dapat memiliki ribuan atau setidaknya ratusan entri untuk dapat mendukung node Internet pra-1985 yang paling terhubung dengan baik.

Berikut adalah contoh dari tahun 1985 (formatnya agak berubah): http://jim.rees.org/apollo-archive/hosts.txt File ini memiliki 1680 baris dari yang 1325 adalah baris host. 355 baris yang tersisa kosong, komentar, jaringan atau gateway 1 .

Satu-satunya batasan nyata yang dapat saya temukan adalah bahwa pada beberapa sistem, garis individual dibatasi hingga kurang dari BUFSIZkarakter (1024 pada mesin OpenBSD saya).

Jika Anda memiliki lebih dari beberapa entri /etc/hosts, Anda harus mempertimbangkan untuk menyiapkan server nama lokal, tetapi itulah pendapat pribadi saya.


1 Terima kasih kepada Jeff Schaller karena telah menggali ini.

Kusalananda
sumber
Sebelum DNS, saya pikir itu tidak biasa untuk mengubah tabel host Internet lengkap ke /etc/hostsformat. Sebagian besar sistem Unix bahkan tidak ada di Internet, dan bahkan jika sebuah mesin, itu tidak memerlukan tabel host lengkap, hanya segelintir mesin yang perlu diajak bicara. Saya akan terkejut jika ada banyak mesin dengan lebih dari 100 entri.
Barmar
13

Bagaimana saya bisa menentukan batas ukuran / etc / hosts?

Ini adalah file biasa, jadi batasnya akan sesuai dengan batas filesystem yang mendasari (yang dengan sendirinya dibatasi oleh jumlah disk di belakangnya), minus ruang yang digunakan oleh file lain dalam /filesystem yang sama (mungkin root ( )):

  • ext2 / 3: 2 TiB
  • ext4: 16 TiB (dengan ukuran blok 4KiB default)
  • xfs: 500 TiB

Bagaimana saya bisa mengatur batas ukuran / etc / hosts?

Karena ini adalah file yang diedit secara manual, hanya secara manual:

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

(untuk menghapus garis 100 dan seterusnya).

Jeff Schaller
sumber
3
Benar pada prinsipnya, tetapi batas sistem file (misalnya terabyte) secara praktis sebagian besar tidak relevan.
Basile Starynkevitch
11

Batas ukuran hanya berlaku ketika mengalokasikan buffer statis. gethostbyname(3), yang mem-parsing entri /etc/hosts, tidak mengalokasikan buffer statis - dan tidak pernah. Rilis asli algoritma BSD 4.3 tahun 1983 menunjukkan file terbuka, sementara parse line, pola file dekat:

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

Implementasi modern mempertahankan warisan ini dalam semua hal yang penting.

Bagaimanapun, secara internal, *hostentkeluarga fungsi menyimpan pointer file ke baris saat ini dalam file. sethostentmembuka file dan mengatur posisi penunjuk file. gethostentmendapat data dan memajukan pointer. endhostentmenutup penunjuk file. Perpustakaan C GNU menawarkan referensi menyeluruh tentang fungsi-fungsi ini.

Seperti yang Anda tebak dari implementasi, entri yang terjadi sebelumnya di file menyelesaikan lebih cepat. Jika file host Anda sangat besar, ini mulai berlaku.

Jadi, tidak peduli seberapa besar file tersebut, OS akan mengkonsumsinya. Namun, pada akhirnya, Anda akan mencapai batas filesystem (sesuai jawaban Jeff Schaller ). Anda juga memiliki batas ukuran garis maksimum (per jawaban Kusalananda ). Tapi, pada akhirnya, Anda bisa menjadikannya sebesar yang Anda inginkan. Tapi tolong, jangan.

uskup
sumber
2
Menggunakan glibc dan linux, sayangnya ini tidak mudah. Jika Anda memanggil gethostbyname dan sistem diatur sesuai (default pada banyak sistem) maka itu bukan membaca / etc / host memanggil nscd. Saya tidak tahu apakah nscd akan melakukan cache hanya hits di file atau mencoba untuk cache secara keseluruhan. Dalam kasus selanjutnya, Anda akan memiliki batasan ram untuk ukuran file (dengan asumsi bahwa konfigurasi nscd memungkinkan banyak entri)
PlasmaHH
1
Versi 4.3BSD ada di sini . Ini mendukung versi / etc / hosts hash dbm. IIRC, dbm memberlakukan beberapa batasan ukuran yang dapat menyebabkan upaya untuk membuat hash db gagal.
Mark Plotnick
2

... Saya telah memutar otak dan untuk kehidupan saya, saya tidak dapat memikirkan satu situasi atau keadaan di mana Anda akan mendekati segala jenis masalah batas ukuran /etc/hosts- Anda akan mengalami masalah praktis seperti yang parah hit kinerja ke getaddrinfo()keluarga panggilan sistem yang semua harus berkonsultasi file sebelum memutuskan apakah akan mengirim permintaan DNS, untuk mengatakan tidak ada masalah mempertahankan file teks datar ukuran itu.

Saya menduga bahwa apa yang kita miliki di sini adalah kegagalan untuk berkomunikasi di tingkat yang lebih tinggi. Masalah apa yang Anda coba selesaikan dengan /etc/hostsfile raksasa ? Saya hampir yakin ada solusi yang lebih baik dari ini.

Shadur
sumber
8
Beberapa orang menggunakan hostsfile untuk daftar hitam iklan / malware / pelacakan / dll. Ada daftar yang dikuratori di internet, yang saya gunakan adalah 41k baris dan ukuran 1.1MB.
Bert
Mungkin akan lebih baik untuk menggunakan kinerja dnsmasquntuk itu - lihat misalnya dnsgate (yang saya belum coba).
reinierpost
Milik saya memiliki 1,7MB dengan garis 57k. Anda bisa mendapatkan /etc/hostsfile besar Anda dari hostsfile.org
styrofoam fly
@reinierpost itu sebenarnya cukup wawasan!
Jeff Schaller