Verificar /proc: protocolo para confirmar el pseudo-sistema de archivos en Linux

Fuentes: Verifying /proc: a mechanism for reliable Linux filesystem checks
Imagen generada por IA con el prompt: Linux terminal window with code snippet showing inotify and statfs system calls, abstract filesystem tree diagram with /proc highlighted, dark blue gradient background, clean editorial technical illustration
Imagen generada con IA

Un ingeniero de software detalla en su blog personal un mecanismo para verificar de forma fiable que el pseudo-sistema de archivos /proc de Linux está correctamente montado antes de depender de él. La investigación nació al intentar construir un 'vigilante' del sistema de archivos que detectase cualquier cambio capaz de afectar a una ruta: creación, borrado, renombrado, cambios en enlaces simbólicos y, sobre todo, nuevos montajes. La herramienta habitual para esto, inotify(7), cubre la mayoría de los casos pero no los montajes: un watch de inotify sobre /foo/bar no detectaría un nuevo sistema de archivos montado en /foo.

El autor parte de una pregunta clave: ¿qué ocurre si /proc no está disponible? La página de manual de linkat(2) recomienda usar /proc/self/fd/$fd para vincular un fichero anónimo (abierto con O_TMPFILE) a un sistema de archivos, y glibc en ocasiones implementa llamadas al sistema leyendo directamente desde /proc. Muchas aplicaciones asumen, por tanto, su presencia de forma implícita. /proc/self/mounts es pollable y permite conocer los montajes, pero solo funciona si /proc está montado en primer lugar.

Para evitar esa suposición ciega, el autor propone un protocolo de verificación en varios pasos que combina inotify, statfs, statx y poll: 1) establecer un inotify watch sobre '/' que detecte modificaciones en /proc, excluyendo los montajes, y reiniciar la verificación hasta N veces; 2) abrir /proc y conservar el descriptor resultante para que, si después se monta algo encima, siga refiriendo al contenido previo; 3) usar statfs(2) para confirmar que f_type coincide con PROC_SUPER_MAGIC (0x9fa0), lo que garantiza un proc real aunque no descarta un bind mount enraizado en un subdirectorio; 4) comprobar con statx(2) que el número de inodo de /proc es 1, un ancla estable según el autor; 5) abrir /proc/$PID, verificar que no esté montado y usar el descriptor para acceder a /proc/$PID/mounts; 6) activar un poll(2) sobre /proc/$PID/mounts y, ante cualquier cambio, abrir /proc/$PID/mountinfo para confirmar el estado de los puntos de montaje. El resultado es una visión en vivo y coherente del estado de los montajes del proceso, y el autor planea contribuir con soporte de notificaciones de montaje a la crate 'inotify' de Rust, que actualmente carece de esa capacidad.