¿Cómo puedo determinar o establecer el límite de tamaño de /etc/hosts
? ¿Cuántas líneas puede tener?
¿Cómo puedo determinar o establecer el límite de tamaño de /etc/hosts
? ¿Cuántas líneas puede tener?
Respuestas:
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í).
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 BUFSIZ
caracteres (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.
/etc/hosts
formato. 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.
¿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 ( /
)):
¿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á).
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 *hostent
familia de funciones almacena un puntero de archivo a la línea actual en el archivo. sethostent
abre el archivo y establece la posición del puntero del archivo. gethostent
obtiene datos y avanza el puntero. endhostent
Cierra 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.
... 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/hosts
archivo gigantesco ? Estoy casi seguro de que hay una mejor solución que esta.
hosts
archivo 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.
dnsmasq
para eso; consulte, por ejemplo, dnsgate (que no he probado).
/etc/hosts
archivo de hostsfile.org