Ajustes del kernel con sysctl

Introducción

El kernel de Linux expone cientos de parámetros configurables en tiempo de ejecución a través del pseudosistema de ficheros /proc/sys/. sysctl es la herramienta estándar para leer y modificar esos parámetros sin necesidad de recompilar el kernel ni reiniciar el sistema.

/proc/sys — El origen de los parámetros

Cada parámetro del kernel es un fichero dentro de /proc/sys/. Los directorios reflejan la jerarquía de los parámetros:


/proc/sys/
├── kernel/          ← parámetros del núcleo (hostname, panic, pid_max...)
├── net/             ← parámetros de red (ip_forward, tcp_syncookies...)
│   ├── ipv4/
│   └── ipv6/
├── vm/              ← gestión de memoria virtual (swappiness, dirty_ratio...)
└── fs/              ← sistemas de ficheros (file-max, inotify...)
          

Se puede leer o escribir directamente en estos ficheros, pero sysctl es la forma recomendada.

Leer parámetros


$ sysctl -a                              # listar todos los parámetros y sus valores
$ sysctl -a | grep swappiness            # filtrar
$ sysctl vm.swappiness                   # leer un parámetro concreto
vm.swappiness = 60
$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
          

La notación de sysctl usa puntos (vm.swappiness) mientras que la ruta en /proc/sys usa barras (/proc/sys/vm/swappiness). Son equivalentes.

Modificar parámetros en caliente

Los cambios con sysctl -w son inmediatos pero temporales: se pierden al reiniciar el sistema.


# sysctl -w vm.swappiness=10
vm.swappiness = 10

# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

# Equivalente escribiendo directamente en /proc/sys:
# echo 10 > /proc/sys/vm/swappiness
          

Hacer los cambios permanentes

Para que los valores persistan tras el reinicio, hay que añadirlos a los ficheros de configuración que systemd carga durante el arranque.

Fichero principal (válido en todas las distribuciones):


/etc/sysctl.conf
          

Directorio de ficheros adicionales (forma recomendada en sistemas modernos):


/etc/sysctl.d/*.conf
/usr/lib/sysctl.d/*.conf    ← ficheros de los paquetes (no editar)
          

Los ficheros en /etc/sysctl.d/ se procesan en orden alfabético antes que /etc/sysctl.conf. La convención es usar nombres como 99-custom.conf.

Ejemplo de /etc/sysctl.d/99-custom.conf:


# Reducir uso de swap
vm.swappiness = 10

# Activar reenvío de paquetes IP (necesario para routers/NAT)
net.ipv4.ip_forward = 1

# Protección contra ataques SYN flood
net.ipv4.tcp_syncookies = 1

# Evitar que el kernel entre en pánico silenciosamente
kernel.panic = 10
          

Aplicar los ficheros de configuración sin reiniciar:


# sysctl -p                          # aplica /etc/sysctl.conf
# sysctl -p /etc/sysctl.d/99-custom.conf   # aplica un fichero concreto
# sysctl --system                    # aplica todos los ficheros en orden
          

Parámetros más relevantes

Red (net.ipv4):

  • net.ipv4.ip_forward = 1 → habilita el reenvío de paquetes IP entre interfaces. Necesario en routers, servidores con NAT y contenedores.
  • net.ipv4.tcp_syncookies = 1 → protección contra ataques SYN flood. Recomendado en servidores expuestos a internet.
  • net.ipv4.conf.all.rp_filter = 1 → filtrado de ruta inversa: descarta paquetes cuyo origen no es enrutable de vuelta. Evita spoofing.
  • net.ipv4.conf.all.accept_redirects = 0 → deshabilita la aceptación de ICMP redirects (protección ante ataques de man-in-the-middle).
  • net.ipv4.tcp_fin_timeout = 30 → tiempo en segundos que una conexión TCP en estado FIN_WAIT_2 permanece antes de cerrarse. Reducirlo libera sockets más rápido.

Memoria virtual (vm):

  • vm.swappiness = 60 → agresividad del kernel para usar swap (0=mínimo, 100=máximo). En servidores con mucha RAM se suele bajar a 10.
  • vm.dirty_ratio = 20 → porcentaje de RAM que puede contener datos sucios (sin escribir a disco) antes de que el proceso que escribe sea bloqueado.
  • vm.dirty_background_ratio = 10 → porcentaje de RAM con datos sucios antes de que el kernel empiece a escribir en segundo plano.
  • vm.overcommit_memory = 1 → permite sobrecomprometer memoria (habitual en entornos con contenedores y Redis).

Kernel:

  • kernel.panic = 10 → segundos de espera antes de reiniciar automáticamente tras un kernel panic (0 = no reiniciar).
  • kernel.pid_max = 32768 → número máximo de procesos simultáneos.
  • kernel.dmesg_restrict = 1 → restringe el acceso a dmesg a usuarios root. Evita que usuarios no privilegiados vean información del kernel.

Sistema de ficheros (fs):

  • fs.file-max = 100000 → número máximo de descriptores de fichero abiertos simultáneamente en todo el sistema.
  • fs.inotify.max_user_watches = 524288 → número máximo de watches de inotify por usuario. Necesario aumentarlo en entornos con IDEs o herramientas de watch intensivas.

Flujo de trabajo completo


# 1. Consultar el valor actual
$ sysctl vm.swappiness
vm.swappiness = 60

# 2. Cambiar en caliente para probar
# sysctl -w vm.swappiness=10

# 3. Verificar que el cambio se aplicó
$ sysctl vm.swappiness
vm.swappiness = 10

# 4. Si el resultado es el deseado, hacer el cambio permanente
# echo "vm.swappiness = 10" >> /etc/sysctl.d/99-custom.conf

# 5. Verificar que el fichero se aplica correctamente
# sysctl --system | grep swappiness
          

Para el examen LPIC-1: conocer sysctl -a, sysctl -w, sysctl -p, la ubicación de /etc/sysctl.conf y /etc/sysctl.d/, y los parámetros net.ipv4.ip_forward y vm.swappiness.

Troubleshooting de arranque

Índice de la sección

Índice del curso