ulimit: diferencia entre límites duros y blandos

87

¿Cuál es la diferencia entre límites duros y blandos en ulimit?

Para el número de archivos abiertos, tengo un límite flexible de 1024 y un límite rígido de 10240. Es posible ejecutar programas que abren más de 1024 archivos. ¿Para qué es el límite blando?

daniel kullmann
fuente
44
Estás hablando ulimit -n? Intente ejecutar un shell con un valor muy bajo ( bash -c 'ulimit -n 4; exec 3>a; exec 4>b; exec 5>c'). ¿Cuál es la salida?
Gilles

Respuestas:

77

Un límite rígido solo puede aumentarse por root (cualquier proceso puede reducirlo). Por lo tanto, es útil para la seguridad: un proceso no root no puede sobrepasar un límite estricto. Pero es inconveniente porque un proceso no root no puede tener un límite inferior al de sus hijos.

El proceso puede cambiar un límite flexible en cualquier momento. Por lo tanto, es conveniente siempre que los procesos cooperen, pero no es bueno para la seguridad.

Un caso de uso típico para los límites flexibles es deshabilitar los volcados de núcleo ( ulimit -Sc 0) mientras se mantiene la opción de habilitarlos para un proceso específico que está depurando ( (ulimit -Sc unlimited; myprocess)).

El ulimitcomando de shell es una envoltura alrededor de la setrlimitllamada del sistema, por lo que allí es donde encontrará la documentación definitiva.

Tenga en cuenta que algunos sistemas pueden no implementar todos los límites. Específicamente, algunos sistemas no admiten límites por proceso en los descriptores de archivos (Linux sí); si el suyo no lo hace, el comando de shell puede ser un no-op

Gilles
fuente
66
+1 para el caso de uso de límites suaves. El límite de tamaño de conjunto residente ( ulimit -m, RLIMIT_RSS) es un ejemplo de un límite que ya no es efectivo en Linux. Sin embargo, el límite de memoria virtual ( ulimit -v, RLIMIT_AS) funciona.
Adam Zalcman
@Gilles, ¿quiere decir que sin reiniciar el proceso, cuando cambiamos el límite flexible, puede tener efecto de inmediato?
Ryan
1
@Ryan Sí, un programa puede cambiar su propio límite flexible en cualquier momento llamando setrlimit(en la medida permitida por el límite rígido a menos que se ejecute como root, por supuesto). La mayoría de los programas no tienen un comando que le permita al usuario hacer eso, pero puede intentar conectarse al programa con un depurador y hacer que emita una setrlimitllamada, o en Linux puede llamar prlimit(para lo cual no conozco ningún shell utilidad).
Gilles
1
Ahora también hay una prlimitutilidad de shell.
telcoM
0

El límite duro es para fines de seguridad. Para un usuario no root, solo puede disminuir el límite rígido desde el límite rígido establecido actualmente; No puede aumentarlo. El usuario root solo puede aumentar el límite rígido (o tal vez con el privilegio sudo, no estoy seguro de eso). Lo que puede hacer un usuario no root es elegir un límite (llamado límite flexible) que puede estar en el rango [0, límite rígido] para sus procesos. Es el límite suave que es visto y tomado en consideración por los procesos.

Ankit Shubham
fuente