¿Cuál es el límite de tamaño de / etc / hosts?

44

¿Cómo puedo determinar o establecer el límite de tamaño de /etc/hosts? ¿Cuántas líneas puede tener?

Geremia
fuente
64
... Creo que en el punto donde esto se convierte en una preocupación real en lugar de una curiosidad académica que haya ahora pasado el punto en el que sería más prudente para configurar un servidor DNS privada en términos de rendimiento y facilidad de mantenimiento.
Shadur
55
Me sorprende que estés preguntando. ¿Por qué esperas un límite de tamaño significativo y preciso en los archivos de configuración?
Basile Starynkevitch
3
@BasileStarynkevitch Le pregunté porque un archivo de hosts de ~ 2 MB no funcionaba en mi enrutador, pero el problema era que no suspiré dnsmasq para volver a leer el archivo de hosts.
Geremia
2
@Geremia mi archivo de hosts es de 500M, más de 15,000 entradas, sin problemas. Siempre es mejor determinar la causa raíz de su problema y resolverlo primero
bsd
3
¿Está utilizando su archivo host para bloquear las direcciones IP? Si es así, debería usar iptables con ipset. El uso de iptables solo causará un gran impacto en el rendimiento, sin embargo, con ipset, una lista de casi 500,000 ips tiene un impacto insignificante.
cybernard

Respuestas:

57

Los efectos problemáticos incluyen una resolución lenta del nombre de host (a menos que el sistema operativo de alguna manera convierta la lista lineal en una estructura de búsqueda más rápida) y el potencial de una interacción sorprendente con la tabfinalización del shell mucho antes de que se alcance un tamaño de archivo significativo.

¡Por ejemplo! Si se colocan 500,000 entradas de host en/etc/hosts

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

Para la ciencia, la tabfinalización predeterminada del nombre de host en ZSH tarda aproximadamente ~ 25 segundos en mi sistema para devolver un mensaje de finalización (concedido, esto está en una computadora portátil desde 2008 con un disco de 5400 RPM, pero aún así).

thrig
fuente
21

No creo que tenga un límite de tamaño en términos de número de líneas.

Antes de DNS (que se puso en uso en 1985), fue este archivo el que sirvió como el único medio para realizar búsquedas de nombres de host, por lo que supongo que esto significa que el archivo debería poder tener miles o al menos cientos de entradas para ser capaz de soportar los nodos de Internet anteriores a 1985 mejor conectados.

Aquí hay un ejemplo de 1985 (el formato ha cambiado un poco): http://jim.rees.org/apollo-archive/hosts.txt Este archivo tiene 1680 líneas de las cuales 1325 son líneas de host. Las 355 líneas restantes están en blanco, comentarios, redes o puertas de enlace 1 .

El único límite real que pude encontrar fue que en algunos sistemas, las líneas individuales están limitadas a menos de BUFSIZcaracteres (1024 en mi máquina OpenBSD).

Si tiene más de un puñado de entradas /etc/hosts, debería considerar configurar un servidor de nombres local, pero esa es mi opinión personal.


1 Gracias a Jeff Schaller por desenterrar esto.

Kusalananda
fuente
Antes de DNS, no creo que fuera común convertir la tabla de host de Internet completa al /etc/hostsformato. La mayoría de los sistemas Unix ni siquiera estaban en Internet, e incluso si una máquina lo fuera, no necesitaba una tabla de host completa, solo el puñado de máquinas con las que necesitaba hablar. Me sorprendería si hubiera muchas máquinas con más de 100 entradas.
Barmar
13

¿Cómo puedo determinar el límite de tamaño de / etc / hosts?

Es un archivo normal, por lo que el límite correspondería a los límites del sistema de archivos subyacente (que estaría limitado por la cantidad de discos detrás de él), menos el espacio utilizado por cualquier otro archivo en el mismo sistema de archivos (probablemente root ( /)):

  • ext2 / 3: 2 TiB
  • ext4: 16 TiB (con el tamaño de bloque predeterminado de 4KiB)
  • xfs: 500 TiB

¿Cómo puedo establecer el límite de tamaño de / etc / hosts?

Como es un archivo editado manualmente, solo manualmente:

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

(para eliminar las líneas 100 y más allá).

Jeff Schaller
fuente
3
Es cierto en principio, pero los límites del sistema de archivos (por ejemplo, terabytes) son prácticamente irrelevantes.
Basile Starynkevitch
11

Los límites de tamaño solo se aplican al asignar buffers estáticos. gethostbyname(3), que analiza las entradas /etc/hosts, no asigna buffers estáticos, y nunca lo ha hecho. La versión original de 1983 del algoritmo BSD 4.3 muestra un archivo abierto, mientras que la línea de análisis, el patrón de archivo cerrado:

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

Las implementaciones modernas conservan esta herencia en todo lo esencial.

De todos modos, internamente, la *hostentfamilia de funciones almacena un puntero de archivo a la línea actual en el archivo. sethostentabre el archivo y establece la posición del puntero del archivo. gethostentobtiene datos y avanza el puntero. endhostentCierra el puntero del archivo. La Biblioteca GNU C ofrece una referencia exhaustiva sobre estas funciones.

Como puede suponer por la implementación, las entradas que ocurren antes en el archivo se resuelven más rápido. Si su archivo de hosts es enorme, esto entra en juego.

Entonces, no importa cuán grande sea el archivo, el sistema operativo lo consumirá. Eventualmente, sin embargo, alcanzará los límites del sistema de archivos (según la respuesta de Jeff Schaller ). También tiene límites máximos de tamaño de línea (según la respuesta de Kusalananda ). Pero, al final, puedes hacerlo tan grande como quieras. Pero por favor, no lo hagas.

obispo
fuente
2
Usando glibc y linux, desafortunadamente esto no es tan sencillo. Si llama a gethostbyname y el sistema está configurado en consecuencia (predeterminado en muchos sistemas), en lugar de leer / etc / host, llamará al nscd. No tengo idea si el nscd solo almacenará en caché los hits en el archivo o intentará almacenarlo en caché en su conjunto. En el último caso, tendría una limitación de memoria ram para el tamaño del archivo (suponiendo que la configuración nscd permita esa cantidad de entradas)
PlasmaHH
1
La versión 4.3BSD está aquí . Soportaba una versión dbm-hashed de / etc / hosts. IIRC, dbm impuso algunos límites de tamaño que podrían hacer que los intentos de crear un hash db fallen.
Mark Plotnick
2

... Me he estrujado el cerebro y, por mi vida, no puedo pensar en una sola situación o circunstancia en la que abordarías cualquier tipo de problema de límite de tamaño /etc/hosts: te encontrarás con problemas prácticos como el grave el rendimiento golpeó a la getaddrinfo()familia de llamadas del sistema que todos tienen que consultar el archivo antes de decidir si enviar una consulta DNS, por no mencionar los problemas para mantener un archivo de texto plano de ese tamaño.

Sospecho que lo que tenemos aquí es una falta de comunicación a un nivel superior. ¿Qué problema estás tratando de resolver con un /etc/hostsarchivo gigantesco ? Estoy casi seguro de que hay una mejor solución que esta.

Shadur
fuente
8
Algunas personas usan un hostsarchivo para poner en la lista negra anuncios / malware / tracking / etc. Hay listas seleccionadas en Internet, la que uso es 41k líneas y 1.1MB de tamaño.
Bert
Probablemente sería mejor usar el rendimiento dnsmasqpara eso; consulte, por ejemplo, dnsgate (que no he probado).
reinierpost
La mía tiene 1.7MB con 57k líneas. Puede obtener su gran /etc/hostsarchivo de hostsfile.org
styrofoam fly
@reinierpost que es bastante perspicaz en realidad!
Jeff Schaller