LPIC 101.3 Los runlevels el apagado y el reinicio

Introducción:

Esta lección particularmente me parece muy interesante porque aprendemos como funcionan los distintos runlevels (niveles de ejecución) en linux, para que sirven cada uno y como los podemos usar de una manera óptima. La cuestión de los runlevels es algo heredado de unix como tantas otras cosas de linux. Los runlevels indican que cosas se ejecutan en cada momento. Podríamos tener un runlevel en el que la máquina se comportase como servidor web y otro solo para administración. Los runlevels pueden modificarse a gusto del consumidor y son 7 desde el 0 hasta el 6. Veremos los usos por defecto que dan tanto la distribución de Debian como la de RedHat a estos runlevels:

Debian

  • 0: Se trata de un runlevel especial, ya que es secuencial y se usa para parar el sistema (shutdown). Una vez termina de pararse el sistema se apaga de ahí que sea un estado secuencial.
  • 1,s,S: Son distintos nombre para indicar lo mismo, que es el conocido como single-user mode también como conocido como de mantenimiento. Con este init tendremos un número de servicios mínimo levantado, no tendremos dispositivos de red, no se permitirá que se conecten usuarios que no sean root, etc. Este método se usa para hacer labores de mantenimiento en la máquina que requieran que esta permanezca lo más invariable posible durante este periodo.
  • 2: Modo multiuser. Es el modo por defecto en Debian
  • 3,4,5: Estos modos no son usados por defecto
  • 6: De nuevo un estado transicional en este caso para reiniciar la máquina.

Redhat:

  • 0: Igualito que Debian, modo shutdown.
  • 1,s,S: Igualito que Debian, single-user mode.
  • 2: Al igual que en Debian es el modo multiuser, pero no es el modo por defecto ya que no tiene activado ni compartición por NFS ni el modo gráfico.
  • 3: Aquí si que se usa, es el sistema completo con todo funcionando salvo las X. Este es el sistema pordefecto de Redhat. (*ver nota).
  • 4: Este runlevel no se usa por defecto.
  • 5: Igual que el rulevel 3 (con todo corriendo) con la diferencia de que aquí se arrancan las X por defecto.
  • 6: Igualito que Debian, modo reboot.

* Nota: En el libro de O’Reilly con el que me estoy documentando así lo indica, pero revisando la configuración de RedHat indica que la configuración por defecto es que arranque con init 5, es decir con X, pero no lo afirma categóricamente. De cualquier forma es configurable el runlevel por defecto como veremos más adelante. Por twitter el bueno de rhoml me chiva que esto en realidad depende del tipo de instalación que hagas, si haces una en modo gráfico te iniciará en runlevel 5 y si es en terminal te iniciará en runlevel 3, tiene mucho sentido la verdad 🙂

single-user mode

Merece la pena dedicarle un apartado en concreto a este runlevel por lo particular de este. Tenemos practicamente todo desactivado y por tanto como adelantaba en la introducción podemos hacer tareas que requieran no tener en el momento acticidad de usuarios. Algo típico de este modo es corregir problemas de corrupción de filesystems.

Para arrancar en modo single user mode podemos hacerlo de dos formas. Por un lado indicarselo al arranque mediante el paso de comandos en el boot como vimos en la lección de ayer, para ello tan solo tendremos que añadir a la línea de arranque por defecto de nuestro sistema el numero 1 o la palabra single detras. Otra opción es desde un sistema ya arrancado usar el comando init con el parámetro 1 detrás, es decir init 1. No es la mejor forma esta porque pasa automáticamente a este modo por lo que echa de golpe a todos los usuarios sin aviso previo, lo cual no es la mejor idea. No obstante la posibilidad existe y si queremos usar este modo sin necesidad de reinicio podemos usarlo, teniendo en cuenta que deberemos encargarnos antes de los usuarios.

Vistazo a la estructura del directorio /etc y al proceso init

Los runlevels explicados en la introducción son los conceptos, la organización pero no la configuración real de cada runlevel. Para ver esta configuración tendremos que ver varios ficheros que estan en el directorio /etc Lo malo aquí es que estos ficheros dependerán de cada distribución, aquí comentaré los mismos que el libro de O’Reilly los de ya que es cumple los “Linux standards Base (LSB)” que es lo que se estudia para esta certificación.

/etc/rc.sysinit o /etc/init.d/rcS
rc.sysinit es un script de inicialización monolítica. en Debian varia un poco ya que rcS corre varios pequeños scripts que estan en dos directorios. En ambos casos se lanzan en boot time. Estos son unos scripts que se encargan de cargar digamos las funciones básicas antes de que se levanten los demonios por ejemplo se encarga de montar los filesystems.

Veamos el funcionamiento práctico de Debian en esto con unas pruebas que he estado haciendo. Por cierto os recomiendo que hagáis vosotros pruebas de estas, que entréis en vuestras máquinas del laboratorio y os miréis los directorios /etc/rc* ya que hay cosas muy interesante y en general estan documentadas dentro de los mismos ficheros de configuración.

Básicamente /etc/init.d/rcS nos dice que cargara “/etc/rcS.d/” de forma númérica/alfabética. Si entramos en el directorio veremos los scripts que cargarán los servicios y un README explicándonos como activar o desactivar servicios. En serio echad un vistazo a estos directorios/ficheros es básico para el aprendizaje el hacerlo. Y dedicarle el tiempo que haga falta a esto, considero fundamental para corregir problemas y configurar el sistema apropiadamente comprender de una manera correcta la forma de arranque del sistema.

/etc/rc.local
No se usa en sistemas Debian, en RedHat si. Cuando ya estan todos los scripts y ya con todos los demonios por defecto inicializados se lanza. Contiene las personalizaciones locales que modifican los servicios ya lanzados. El sentido de esto es hacer las modificaciones aquí en lugar del rc.sysinit la razón de hacerlo así es que en los upgrades del sistema el rc.sysinit se sobre-escribe perdiendo estos cambios pero el rc.local se conserva.

/etc/rc
Este script que no existe en Debian se usa para cambiar entre distintos runlevels.

/etc/init.d
En este directorio se encuentran los scripts encargados de inicializar (start), reinicializar (reboot) y parar (stop) los demonios, entre otros. desde la carga de los distintos runlevels se llama a estos scripts pero tambien podemos invocarlos manualmente. Por ejemplo si queremos inicializar a mano el servidor de apache en Redhat usaremos: “/etc/init.d/httpd start”. También podemos tener los parametros de status y de reload en los scripts, es recomendable ver la documentación de cada demonio para entender que hace cada opción en concreto para cada demonio.

En la gran mayoría de los casos al instalar un paquete automáticamente se nos crean estos scripts. En cualquier caso podríamos añadirlos nosotros manualmente o realizar modificaciones en rc.local (recordemos que en en tan solo el caso de RH esto último).

/etc/rc0.d – /etc/rc6.d
Ya tratados por encima anteriormente, estos directorios en realidad no contienen ficheros si no enlaces simbólicos a los scripts de inicialización de /etc/init.d . De esta forma en caso de querer cambiar algo en el script de arranque de apache y este estar presente en los init 2, 3 y 5 en lugar de modificarlos en cada uno tan solo lo haremos en /etc/init.d . Cuando se carga un runlevel se cargan todos los scripts que esten dentro de esta carpeta pero con cierta restricción y es que los nombres de los enlaces simbólicos tienen una metodología especial. En caso de empezar por S se cargaran, pero si empiezan por K (kill) se matan. Si realizamos modificaciones y queremos cargar de nuevo el init con los cambios deberemos ejecutar el script: “update-rc.d “. También como parte de la política de nombres después de la S o la K irá un número secuencial, este indicará el orden en el que se ejecutarán el inicio o parada de los servicios. Este número puede repetirse y significará que esos demonios se pararán o inicializarán a la vez y una vez esten arrancados pasarán al siguiente número. Si renombramos esto podremos por tanto cambiar el orden de parada o de arranque.

Os recomiendo que veais la diferencia entre el directorio: “etc/rc2.d” y el “etc/rc6.d”. Vemos que en el 2 lo que se hace es inicializar los servicios y en el 6 como es para reiniciar vamos matando los procesos.

Configurando el runlevel por defecto

Bien, creo que ya tenemos todos claro que es un runlevel, como se utiliza y como se modifica. Nos falta por tanto saber como podemos cambiar el runlevel por defecto. Imaginemos que tenemos una RedHat que arranca en runlevel 5 lanzando por tanto el modo gráfico pero al ser un servidor nosotros no queremos ocupar estos servicios y preferimos por tanto arrancar en runlevel 3. Bien este cambio es realmente trivial, para ello tendremos que mirar el fichero “/etc/inittab”. Este fichero tiene bastantes cosas pero lo que nos interesa es lo siguiente”

# The default runlevel.
id:2:initdefault:

En este caso, al tratarse de una debian el runlevel por defecto es 1, si quisieramos cambiarlo a 1 (single user) sería tan sencillo como cambiar el 2 por un 1 y guardar el fichero. En el próximo reinicio arrancará en runlevel 1. En el ejemplo que planteabamos antes de cambiar un arranque gráfico a uno en modo texto en Redhat deberíamos cambiar la línea:

id:5:initdefault:

Por esta otra:

id:3:initdefault:

Conocer y cambiar el runlevel actual del sistema

Podría darse el caso en el que queramos saber en que runlevel se encuentra nuestro sistema, por ejemplo para comprobar si efectivamente nuestra máquina arrancó en single user-mode para así poder comenzar con la intervención que teníamos planeada. Para ello nada más sencillo, tan solo deberemos usar el comando “runlevel” sin parámetros. Este comando nos dará como salida dos valores, el runlevel anterior y el runlevel actual. En caso de que el anterior sea una N quiere decir que no ha habido cambio de runlevel. Supongamos que cambiamos como queríamos antes manualmente el runlevel en nuestra redhat de 5 a 3 para prescindir de esta forma del entorno gráfico, si ejecutásemos runlevel obtendríamos el siguiente resultado:

runlevel
3 5

No obstante con esto solo conocemos el runlevel actual nunca lo modificaremos, en caso de querer modificarlo tendremos que usar o bien el comando init o el comando telinit. Estos comandos son muy sencillos y son el mismo comando (en realidad telinit es un alias de init) y tan solo tendremos que pasarle como parametro el init al que queremos que pase el sistema. Por ejemplo si estamos en runlevel 5 y queremos pasar al 3 ejecutaremos “init 3”, si quisieramos apagar podríamos usar “init 0” o “init 6” para reiniciar.

Shutdown

Aunque podemos apagar y reiniciar la máquina mediante init o su alias telinit es más conveniente hacerlo mediante el comando shutdown. Son varias las razones de esto, la primera es porque shutdown avisa a los usuarios. Indicará a los usuarios que se va a reiniciar o apagar la máquina con un mensaje que es personalizable. En segundo lugar podemos fijar un tiempo de espera, podemos decir que la máquina se apague a una hora en concreto o pasado un tiempo, de esta forma podríamos hacer que nuestro ordenador deje de funcionar después de las 12 que ya no le necesitaremos o tras 10 minutos y así alertar a usuarios conectados y tengan tiempo así a guardar sus trabajos. Shutdown tiene una serie de opciones con las que ejecutarse que resultan interesantes, estan son:

  • -f arranque rápido, en el siguiente arranque no comprobará los filesystems.
  • -h después de parar todos los servicios la máquina se apagará.
  • -k en realidad no se apaga pero manda el mensaje de apagado, esta opción es realmente una opción trollface 😛 O un poco BOFH si me permitis 😉
  • -r tras parar los servicios se reiniciará.
  • -F es el contrario de F en el siguiente arranque le toque o no se forzará a una comprobación de los filesystems.

Para indicar el tiempo podemos usar lo siguiente:
+(número) número será el número de minutos tras lo cual se hará shutdown de la máquina
now: la máquina hará un shutdown en ese mismo instante
hh:mm la máquina hará shutdown a la hora indicada (con formato 24h)

Sobre runlevels en debian os recomiendo leer debianadmin. Sobre todo la parte final con el uso de “update-rc.d” que no se habla mucho en la documentación de esta certificación y lo considero interesante.

Y con esto terminamos el tema 1 donde hemos hablado de sistema y del arranque, la semana que viene tiraremos con el tema 2 que como bien podéis ver el índice trata sobre la instalación y mantenimiento de paquetes en Linux. Estoy tratando de tomarme en la medida de lo posible lo más en serio que puedo esto y por lo tanto he hecho un calendario para el tema 2 que podéis consulta aquí.

6 comentarios en “LPIC 101.3 Los runlevels el apagado y el reinicio

  1. Buenas zordor, una duda. Cuando en los runlevels de RedHat hablas de iniciar con X o sin X, a que te refieres con X???

    Perdona mi ignorancia pero estoy aprendiendo todo esto gracias a ti.

    Mil gracias por estos posts y en general por tu blog. Se aprenden muchisimas cosas.

    1. Nada de ignorancia tio, al contrario me encanta que me hagas esa pregunta no sabes la ilusión que me hace que alguien este aprendiendo gracias a esto, de verdad 🙂

      Pues cuando estaba escribiendo el post pensé sobre escribir o no este término y decidí no hacerlo porque no tenía claro que se entendiese, pero luego por vaguería terminé usándolo por vaguería.

      Las X son el entorno gráfico en linux. Se las conoce así por el sistema X11… pero eso ya es otra historia 🙂 Antiguamente esto era algo que todos los que usábamos linux lo conocíamos ya que nos dábamos de leches para “arrancar las X” ya que no todo funcionaba tan fácilmente como linux ahora. Para arrancarlas se usaba y se sigue usando el comando “startx” 🙂

      Espero haber solucionado tu pregunta, por favor no dudes en preguntar cualquier otra cosa que no tengas clara 🙂

      1. Me habia preguntado mil veces porque se escribia startx al iniciar una distribución con entorno gráfico. no sabia de donde salía esa X.

        Me has rasuelto la duda por partida doble. Mil gracias.

  2. Hola,

    mi problema es que quiero parar unos servicios llamando al script de parada al apagar la máquina o reiniciar, en teoría sería añadir un enlace simbólico empezando con la letra K en el /etc/rc6.d/ al script de arranque y parada, y el sistema ya lo llamará con el parámetro stop o el start según empiece con K o con S.

    Pues no consigo que se ejecute el script al reiniciar el sistema, lo cual me causa corrupció de ciertos datos.

    Tendría que crear una llamada al script de parada con la opción stop en lugar de dejar que el sistema lo llame con esta opción al ver que empieza con K.

    ¿Qué puedo estar haciendo mal?

    Al iniciar sí que inicia el script, pero al no haber parado bien antes, tengo problemas.

    Saludos.

Los comentarios están cerrados.