Cómo parar e iniciar servicios durante y después del arranque de linux

+1
0
-1

Cómo parar e iniciar servicios durante y después del arranque de linux.

Para ello primero nos tenemos que hacer una idea de cómo es el proceso de arranque:

/sbin/init es el primer proceso y padre del resto.

El archivo de configuración del inicio /etc/inittab contiene: El runlevel por defecto, lanzar las terminales y otras opciones. Dependiendo del runlevel se entrará con una u otra configuración.

Vamos a ver un ejemplo en kubuntu del archivo de configuración del inicio /etc/inittab:

#Por defecto en kubuntu se entra con el runlevel 2
id:2:initdefault:
# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS
# /etc/init.d executes the S and K scripts upon change of runlevel.
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6

Importante: Los runlevel 0 y 6 tienen una función determinada en linux: Cerrar y reiniciar el sistema, respectivamente. En cambio, el resto de los runlevel, pueden configurarse para arrancar y parar determinados servicios. Ejemplo: El runlevel 0, que cierra el sistema, envía la señal terminar a todos los procesos, desactiva las particiones de intercambio, desmonta los sistemas de ficheros local y remoto, si lo hay, etc.

Con independencia del runlevel seleccionado se ejecutarán todos los script/servicios de
/etc/rcS.d/

El script /etc/init.d/rc recibe un argumento con el runlevel a arrancar. Va al directorio /etc/rcX.d/, donde X es el runlevel, y en dicho directorio hay enlaces simbólicos que apuntan a scripts en /etc/init.d que son los que realmente arrancan los servicios e inicializan el teclado, sincronizan el reloj hardware, etc

Los enlaces simbólicos en /etc/rcX.d empiezan por S o K (start) o (kill), seguidos de dos dígitos y apunta a un script con el mismo nombre pero sin S ni K ni los dos dígitos en /etc/init.d

Para que un servicio NO se cargue en el arranque cambiarle en /etc/rcX.d la S, de start, inicial por la K, de kill.
sudo mv SnombreServicio KNombreServicio

Para que SI se cargue :
sudo mv KNombreServicio SNombreServicio

Lo que hemos hecho es renombrar el enlace: sudo mv nombreantiguo nombrenuevo, o más exactamente en linux, mover el archivo dentro del mismo directorio con un nombre nuevo

En ambos casos incluir los dos dígitos entre S ó K y el nombre del servicio. Éste número indica el orden en que arrancará el servicio. A un número menor se arrancará antes que otro con uno mayor.

Si lo que queremos es parar o arrancar un servicio después del arranque del sistema:
/etc/init.d/nombreServicio start/stop

En ubuntu se puede utilizar el comando update-rc.d para hacer exactamente lo mismo:
sudo update-rc.d -f nombre_servicio remove

Y para ponerlo:
sudo update-rc.d nombre_servicio

En Suse se puede utilizar el comando insserv para hacer también exactamente lo mismo:
sudo insserv -r /etc/init.d/nombre_servicio

Y para ponerlo:
sudo insserv -d /etc/init.d/nombre_servicio

Además en ubuntu, para configurar los servicios, existe la herramienta BUM (Boot Up Manager) que esta en las secciones adicionales de Ubuntu. Él configura servicios o da las razones de porque no puede hacerse. (Gracias Eneried)

En Debian, para configurar los servicios, existe la herramienta rcconf, la cual selecciona/deselecciona los servicios con la barra espaciadora.

Las herramientas anteriores no funcionan en todas las distribuciones pero si se usa una distribución en particular que tiene una herramienta que nos facilita el trabajo sería erroneo no aprovecharlo.

Lo que hacen update-rc.d, insserv y rcconf es crear o borrar los enlaces directos en el directorio del runlevel por defecto para que arranquen o no. (Crear/borrar del directorio /etc/rcX.d el enlace a /etc/init.d)(En Suse de /etc/init.d/rcX.d el enlace a /etc/init.d)

Si por un error se borra el script de arranque de un servicio en /etc/init.d pero sigue su enlace en el runlevel por defecto /etc/rcX.d aparecerá un error en el inicio indicando que no puede leer el script XX no existe el fichero

* * *

Hay una manera más fácil de poner o quitar un servicio y de cambiar el runlevel de arranque desde el propio escritorio kde.

En kubuntu:

Menú “Inicio”, menú “System Settings”, icono “System Services”, botón “Administrator Mode”, aquí introduces tu contraseña y te aparecerán todos los servicios, los arrancados y los parados, y el runlevel que tienes activo. Podrás cambiar ese runlevel eligiendo el que desees de una lista desplegable.

Más abajo verás los servicios en una lista con el nombre del servicio, si el servicio arranca o no con el arranque del sistema y el status actual, esto es, si está o no arrancado.

A la derecha hay una botón para marcar si deseamos que el servicio que tengamos seleccionado a la izquierda arranque o no cuando lo haga el sistema, si lo deseleccionamos no arrancará, “Start during boot”.

Y más arriba una descripción del servicio.

* * *

Vamos a usar lo que hemos aprendido para crear un scrip desde otro scritp y hacer que se ejecute durante el arranque en el runlevel por defecto:

Nombre del script: ubcr.sh

Finalidad del script: Crear un scrip desde otro scritp y hacer que se ejecute durante el arranque en el runlevel por defecto.

Explicación: Crear un script desde otro script es un sencillo ejercicio para aprender a programar nuestros propios script. Pero para ir más allá vamos a crear un script que a su vez cree otro script, lo copie en /etc/inid.d y desde allí se creen los enlaces necesarios para que éste segundo script se ejecute durante el arranque de linux.

Puede parecer muy complicado pero es extramadamente sencillo. Se van a crear dos versiones, una para la distribución ubuntu y otra para la distribución Suse linux. únicamente varían a la hora de añadir nuestros script en el arranque, y para ello en ubuntu se utiliza el comando update-rc.d y en Suse se utiliza el comando insserv, pero el resultado es el mismo. Ah, en Suse es necesario incluir en los script del arranque tres líneas que NO son necesarias en ubuntu, se indican cuáles.

Nota para los usuarios de Suse: En Suse tenemos el script /etc/init.d/skeleton que es el esqueleto y el modelo correcto y adecuado para los script de arranque que hagamos nosotros y luego usaríamos insserv para incluir nuestro script dentro del run level.

En realidad lo que hacen update-rc.d e insserv es crear los enlaces simbólicos en /etc/rcX.d y /etc/init.d/rcX.d en ubuntu y Suse respectivamente.

#Creamos dos variables para guardar un texto y la ruta de destino del script a crear.
micad="#Esto es necesario sólo en Suse linux, en otras distribuciones eliminar"
mvdestino="/etc/init.d"
#Creamos el nuevo script y ponemos primera línea en él
echo \#!/bin/bash > $mvdestino/ubaloiecrear.sh
#Añadimos las siguientes línea
echo "/etc/rc.status $micad" >> $mvdestino/ubaloiecrear.sh #Ésto sólo necesario en Suse
echo "rc_reset $micad" >> $mvdestino/ubaloiecrear.sh #Ésto sólo necesario en Suse
echo "echo \"Ejecución del script:\" \$0 >> /tmp/ubaloieresultados" >> $mvdestino/ubaloiecrear.sh
#Hemos usado la barra para imprimir en el archivo destino caracteres especiales
echo "echo \"Hora:\"\`date +%H:%M:%S\`\" Fecha:\"\`date +%d/%m/%Y\` >> /tmp/ubaloieresultados" >> $mvdestino/ubaloiecrear.sh
echo "echo \"Argumento pasado al script, Start o Kill: \" \$1 >> /tmp/ubaloieresultados" >> $mvdestino/ubaloiecrear.sh
echo "rc_exit $micad" >> $mvdestino/ubaloiecrear.sh #Ésto sólo necesario en Suse

#Ahora hacemos al script ejecutable
chmod +x $mvdestino/ubaloiecrear.sh
#Y ahora lo añadimos al arranque de linux.
#Debemos tener derechos de root ya que vamos a escribir en directorios cuyo propietario es el root, así que la siguiente línea dará error a menos que estemos logueados como tal.
insserv /etc/init.d/ubaloiecrear.sh #ésto en Suse
#sudo update-rc.d -f ubaloiecrear.sh Esto en ubuntu, aquí ponemos sudo para ejecutar como root.

#El script que hemos creado desde éste otro quedaria así, en Suse:
#!/bin/bash
/etc/rc.status #Esto es necesario sólo en Suse linux, en otras distribuciones eliminar
rc_reset #Esto es necesario sólo en Suse linux, en otras distribuciones eliminar
echo "Ejecución del script:" $0 >> /tmp/ubaloieresultados
echo "Hora:"`date +%H:%M:%S`" Fecha:"`date +%d/%m/%Y` >> /tmp/ubaloieresultados
echo "Argumento pasado al script, Start o Kill: " $1 >> /tmp/ubaloieresultados
rc_exit #Esto es necesario sólo en Suse linux, en otras distribuciones eliminar

Lo que haría éste script es crear un archivo en /tmp llamado ubaloieresultados en el cual, durante el arranque de linux, se irían agregando el nombre del script ejecutado, siempre el que hemos creado, ahora parece una información inútil y repetida pero más adelante, en otros script, será muy importante saber qué script se ha ejecutado y dónde, pero bueno, eso es para daros ideas de por donde podéis expandir éste script. Bueno agrega más cosas como la hora y la fecha en que se ejecuta el script durante el arranque y parada y si se pasó Start y Kill.

Desde éste script podemos partir para hacer otros realmente potentes y útiles, sí, se que saber quién entra y cuándo entra a la máquina se puede ver en los archivos logs, pero ¿y si están troyanizados? Una idea: De éste script podéis hacer un gestor de información sobre vuestra máquina potente. Podéis usar comandos de linux como ps cambiados de ruta para que no sean troyanizados y "mirar" con él/ellos la seguridad de vuestro sistema.(Realmente es más arduo que eso pero como principio ilustra las posibilidades que tiene)

exit 0

Podríamos haber obviado el crear un script desde otro y hacerlo directamente pero está bien complicar un poco las cosas para ver más posibilidades.

* * *

Saludos. Autor: ubaloie, Para más información: http://ubaloie.atwebpages.com

Agradecimientos: A Chaco del foro de www.ubuntu-es.org por sus aclaraciones tan acertadas y a lgsobalvarro, de www.kdelatino.org, por animarme a escribir éste pequeño tutorial; a Eneried del foro ubuntu-es por hacerme conocedor de la herramienta BUM para ubuntu.

Este documento está sometido a la licencia de creative commons. Es de agradecer que se comunique al autor el uso de éste documento en otro medio y se debe incluir de forma obligatoria la autoría y los agradecimientos.

Comentarios

Imagen de Anónimo

alquien sabe porque es el nivel 2 el por defecto cuando lo normal en un linux que ejecuta x seria el 5?

Imagen de Anónimo

muy bien explicado, me ha sido útil para aclarar algunas cosas. Tengo varias dudas por si alguien sabe:
1) el /etc/rcS.d se lee antes o después que del /etc/rcX.d correspondiente? donde X es el runlevel

2) Has dicho que si el runlevel con el que arrancas es por ej 2 se ejecutan los scripts que tienen enlaces en /etc/rc2.d que empiecen por S , los que empiezan por K se ignoran (vamos que como si estuvieran desactivados). Supongo que se ejecuta el script al que apunta en /etc/init.d pasándole el parámetro start. Mi pregunta es.. que pasa con el runlevel 0 (halt) y 6 (reboot) , tb se coge los que empiezan por S y se le pasa stop o aqui se invierte la cosa y se cogen los K y se les pasa stop ?

Imagen de ubaloie

Hola, dos aclaraciones muy importantes:

A) Los runlevel 0 y 6 tienen una función determinada en linux: Cerrar y Reiniciar el sistema, respectivamente. Punto.

B) En cambio, el resto de los runlevel pueden configurarse para arrancar y parar determinados servicios.

Ejemplo: El runlevel 0, que cierra el sistema, envía la señal terminar a todos los procesos, desactiva las particiones de intercambio, desmonta los sistemas de ficheros local y remoto, si lo hay, etc. Punto.

Saludos y me alegro de que te haya resultado útil.

/etc/rcS.d se "ejecuta" antes que el runlevel por defecto

Imagen de Anónimo

He estado buscando información y simplemente a los scripts cuyo enlace simbolico empieza por K mayúsculas se le pasa el parámetro stop y a los que empiezan por S mayúscula el parámetro start. Para que un script no se ejecute en un runlevel determinada una forma es cambiar la S mayúscula a s minúscula y será ignorado.

Imagen de Anónimo

Los scripts se ejecutan por orden alfanumérico, o sea, primero desde K00 hasta K99, y luego desde S00 hasta S99.

Imagen de eneried

Hola hola

Una forma fácil para configurar los servicios de Ubuntu es utilizar la herramienta BUM (Boot Up Manager) que esta en las secciones adicionales de Ubuntu. El configura servicios o da las razones de porque no puede hacerse...

No es más!

(^^)

Imagen de ubaloie

Hola, eneried, efectivamente hay programas para "gestionar" los servicios en linux y en particular en cada distribución. Comentas que para ubuntu está el programa BUM, el cual no conocía, y, por ejemplo, en debian, existe el programa rcconf, el cual selecciona/deselecciona los servicios con la barra espaciadora, pero lo que hace rcconf es crear o borrar los enlaces directos en el directorio del runlevel por defecto, exactamente igual a lo que hacemos nosotros manualmente, y rcconf no funciona en todas las distribuciones.

Está bien saber y probar éstos programas y está bien saber cómo hacerlo igualmente de manera manual o de otra forma. Lo bueno de Linux es que es realmente libre y te da esa libertad para hacer tu elección.

Yo ahora uso OpenSuse y gestiono los servicios de manera distinta.

Un saludo.