Cómo configurar parámetros del kernel mediante sysctl

Publicado el 12 febrero 2016 por Drassill
Hoy quiero hablaros sobre una faceta de Linux relativamente poco conocida, la modificación de parámetros a nivel de kernel. Generalmente esto es desconocido para muchos usuarios, pues generalmente se pueden recurrir a alternativas que pueden ayudar a esquivar este proceso, si bien dichas alternativas suelen requerir la creación scripts que se ejecuten en el arranque. Cuando uno escucha el concepto de kernel, generalmente siente cierto respeto, pues se trata de una parte vital del sistema que en muchas ocasiones requiere tareas de compilación; tareas que en ocasiones no son en absoluto fáciles.
Lo que mucha gente desconoce es que existen algunos parámetros relacionados con éste que pueden ser modificados por el usuario sin recurrir a dichas técnicas, pues existe un directorio virtual (es decir que en realidad no existe en el disco duro) llamado proc, que contiene toda la información del sistema y además contiene también de un subdirectorio llamado sys que hace de enlace entre el kernel y el usuario final, mostrando en su interior una gran variedad de parámetros de éste, perfectamente legibles y modificables. Es este directorio (/proc/sys/) el que nos interesa especialmente, ya que aquí podremos "jugar" con el núcleo del sistema sin problemas.

Si nos ponemos a navegar por este directorio veremos que existen varias opciones que nos pueden resultar incluso familiares; directorios como net con el que hemos interactuado más de una vez en este blog; especialmente en la creación de cortafuegos; o ficheros sueltos como drop_caches, que podemos usar para liberar la caché del sistema. El contenido de cualquier fichero puede ser modificado con extrema facilidad; por ejemplo podemos editar sin problema alguno el fichero ip_forward con un simple echo como en el siguiente ejemplo:
echo1>/proc/sys/net/ipv4/ip_forward
Más sencillo imposible. La cuestión está que este método requiere navegar por el directorio en cuestión, buscar el parámetro, mirar qué valor posee, etc... Antes de lanzar finalmente el comando echo. Además, otra pega que tiene este método es que no realiza un cambio persistente, con lo que requiere crear un script en el arranque para cada vez que iniciemos el equipo implante el cambio.
Es por eso que tenemos a nuestra disposición el comando sysctl. Gracias a este parámetro podemos encontrar y editar los parámetros con mucha mayor fluidez; por ejemplo, para ver un listado de TODOS los parámetros disponibles, junto con sus respectivos valores, habría que escribir el comando:
sysctl -a
En caso de vernos abrumados por exceso de información, siempre podemos filtrar el resultado mediante grep, para obtener un resultado mucho más acotado. Viendo el listado obtenido veremos que el formato de todos ellos es muy parecido al de la ruta de directorio, pero excluyendo la mención de /proc/sys, pues ya es mencionado de forma implícita por sysctl. Por ejemplo, si leyésemos el parámetro ip_forward mostrado anteriormente, su formato de salida sería:
net.ipv4.ip_forward = 0
Si quiesemos ahora cambiar dicho parámetro, también podríamos recurrir al comando sysctl, si bien en vez de recurrir al parámetro -a, se usaría el parámetro -w. Para editar el anterior parámetro escribiríamos:
sysctl -w net.ipv4.ip_forward = 1
Esto haría exactamente lo mismo que el comando echo lanzado anteriormente, pero se habría realizado mediante sysctl. Si deseásemos hacer este cambio persistente, podemos hacerlo sin recurrir a script alguno, ya que existe un fichero de configuración relacionado con sysctl denominado sysctl.conf. Con únicamente añadir esta línea al final de dicho fichero ya haríamos que el cambio fuese persistente y que no perdiésemos dicha configuración en futuros reinicios:
net.ipv4.ip_forward = 1
Como podéis el realizar cambios en el kernel de forma permanente puede ser más sencillo de lo parece, siempre y cuando se comprendan las limitaciones que tiene el directorio /proc/sys. Esto puede evitarnos innecesarias compilaciones del núcleo, con todas las posibles complicaciones que ello podría conllevar.
Espero que os haya resultado útil.
Saludos.