17 años en Internet

06 diciembre 2012

Arrancando el fsck forzoso de forma automática al fallar el fsck normal en un arranque

Hará dos años, incluso puede que un poco más, le regalé a mi madre mi viejo netbook para que lo usara como ordenador personal. Le puse un monitor externo, un ratón y un teclado y le instalé una Ubuntu que modifiqué para que fuera liviana. El caso es que el software que le puse, pese a ser a día de hoy "escaso" o desfasado, cumple sobrádamente con las funcionalidades que ella necesita. Y ahí está, aguantando, más de dos años leyendo su correo electrónico en él, mirando los powerpoints que le mandan sus amigas, visionando las fotos de su cámara, viendo vídeos en Youtube, hablando con su hermana por Skype, etcétera.

Más de dos años sin formatear el equipo o sin instalarle ni mantenerle un antivirus. Parece una tontería, pero esto demuestra que un Linux bien montado puede ser utilizado sin problemas por usuarios casuales y que para más inri requiere de un mantenimiento técnico casi nulo. De hecho, lo configuré para que fuera tan fácil de usar que mi padre y mi hermano se lo toman prestado de vez en cuando.

El caso es que hasta la fecha sólo requería un único mantenimiento: Cada vez que había una caída de luz o cada vez que desenchufaban el portátil sin apagarlo antes (le quité la batería), el sistema operativo no arrancaba porque en ese caso la distribución se iniciaba automáticamente en modo consola para que el usuario root hiciera una comprobación forzosa del disco duro. Bueno, realmente realiza la comprobación automáticamente, pero  al detectar inodos corruptos el inicio del sistema se detiene y monta los discos duros en modo sólo lectura para que el administrador lo revise.

La solución era siempre la misma, teclear "fsck.ext2 /dev/sda1 -y" y reiniciar la máquina. La cosa es que yo no quería deshabilitar esta comprobación automática, puesto que el disco del netbook es una memoria flash integrada en placa y por lo tanto es propenso a estropearse. Además, al vivir entonces con mis padres no me costaba nada acercarme al equipo y teclear la famosa línea.

Esta semana mi hermano desenchufó por error el portátil y al no vivir ya con ellos no pude ir a revisárselo. Tres días, contando hoy, se pasó mi madre sin poder revisar su correo... así que le he creado un script automático para eliminar el único mantenimiento que requería la máquina. Le he probado un par de veces y la solución funciona bien en su ordenador. Sí señores, ahora ya tiene un equipo que seguirá funcionando hasta después de que yo muera (textualmente hablando). Quien sabe, a lo mejor dentro de mil años un humano mutado con cuatro brazos y con pantallas planas en lugar de ojos le de al botón power y se quede extrañado a ver a mis padres de fondo de pantalla.

Bromas aparte, os contaré lo que hice. Lo primero es lo primero, el script que debe de ejecutar el usuario root: fileSystemCheck.sh.
#!/bin/bash
clear
echo "Habéis apagado mal equipo."
echo "Sebas."
echo "Arrancando comprobación automática de disco:"
sleep 10
fsck.ext2 /dev/sda1 -y
clear
echo "Comprobación finalizada. Reiniciando el equipo."
echo "No volváis a apagar mal el equipo, se puede estropear."
Problemática del script:
  • Debe arrancarlo únicamente el usuario root.
  • No sirve de nada darle permisos de ejecución, puesto que cuando en caso de fallo el disco duro se monta automáticamente con permisos de sólo lectura (sin permiso de ejecución).
Pero tengamos en cuenta lo siguiente:
  1. Al fallar la comprobación automática, el sistema arranca en modo consola con el usuario root ya logueado, sin requerir contraseña. Por consiguiente, partimos de la premisa que un usuario root podrá ejecutarlo sí o sí.
  2. Mis padres o mi hermano no saben ingresar como root. Por lo tanto el único caso donde se hará un ingreso de usuario root será cuando la comprobación automática falle.
  3. Para garantizar que este script sólo pueda ser ejecutado por root, no se debe de guardar en ningún directorio que pertenezca a los típicos de $PATH (como /bin o /sbin o /usr/bin, etcétera...). Es más, se puede guardar en /root/fileSystemCheck.sh, puesto que el directorio /root sólo puede ser listado por el usuario root.
  4. Por consiguiente, hay que modificar el sistema de forma que arranque el script /root/fileSystemCheck.sh siempre que se detecte un login del usuario root.
Vale, parece claro. ¿Pero cómo cumplimos el punto cuatro? Muy fácil, editando el fichero /root/.bashrc. De hecho verás que todos los usuarios de un sistema GNU/Linux poseen un fichero .bashrc en su carpeta $HOME. Este archivo es el responsable de cargar todas las variables de entorno siempre que se inicie una sesión por consola (tanto física como por conexión remota).

En este caso, editaremos el fichero /root/.bashrc y añadiremos las siguientes dos líneas al final del todo:
/bin/sh /root/fileSystemCheck.sh
exit
La primera línea pide al intérprete estándar de shell que ejecute el script que hemos creado. Esto nos garantiza su ejecución pese a no tener permisos de ejecución en él. La otra línea se ejecutará una vez finalizado el script y causa la muerte del proceso que lo invoca. En este caso, al haber arrancado el sistema en modo consola y monousuario, este "exit" producirá el reinicio automático del equipo.

2 comentarios:

  1. Como siempre muy buenos tips. Por cierto si no es molesta la pregunta, on tas viviendo ahora?

    ResponderEliminar

Si te ha gustado la entrada o consideras que algún dato es erróneo o símplemente deseas dar algún consejo, no dudes en dejar un comentario. Todo feedback es bienvenido siempre que sea respetuoso. También puedes contactarme vía Twitter @Hamster_ruso si lo consideras necesario.