Perteneciente a LPI Topic 202: System Startup
/usr/lib/systemd//etc/systemd//run/systemd/systemctl/etc/inittab/etc/init.d//etc/rc.d/chkconfigupdate-rc.dinit and telinitGRUB es el cargador de arranque estándar actual.
Quitando la parte referente al arranque eléctrico de la máquina, la BIOS… una vez que el cargador de arranque (bootloader) ha seleccionado el kernel adecuado, podemos distinguir 7 fases durante el arranque de Linux:
El kernel, una vez que termina todo su proceso, llama al proceso principal del sistema (init). El kernel intenta ejecutar los siguientes comandos en este orden:
/sbin/init/etc/init/bin/init/bin/shSi no encuentra ninguno de esos comandos se produce un kernel panic.
En sistemas tipo Unix, init es el primer proceso en ejecución tras la carga del kernel y el que se a su vez genera todos los demás procesos. Se ejecuta como demonio (segundo plano) y por lo general tiene PID (identificador del proceso) 1.
En el Unix original, el proceso init arrancaba los servicios mediante un único script denominado /etc/rc. System V (gestor de procesos clásico de Linux) introdujo un nuevo esquema de directorios en /etc/rc.d/ que contenía más scripts de arranque/parada de servicios en función del runlevel.
Los runlevels (niveles de ejecución) es un estado del sistema en el que se ha determinado la lista de servicios que arrancan o se detienen. Podemos usar estos niveles para personalizar cómo queremos que arranque nuestro sistema, con qué servicios.
El comando /sbin/runlevel muestra el nivel actual de ejecución.
Ejemplo de salida:
N 5
Muestra el runlevel anterior y el actual. Para el ejemplo anterior: N = ninguno; actual es 5.
Para cambiar el nivel de ejecución del sistema podemos usar los comandos init o telinit:
telinit 3
Si ahora ejecutamos de nuevo runlevel:
5 3
Directorios con los runlevesl:
/etc/rc0.d//etc/rc1.d//etc/rc2.d//etc/rc3.d//etc/rc4.d//etc/rc5.d//etc/rc6.d//etc/rcS.d/Cada uno contiene scripts que arranca o detiene unos determinados servicios.
Los niveles de ejecución son:
La configuración del esquema de arranque System V se define en el fichero /etc/inittab y sigue el formato:
id:runlevel:accion:comando
id: secuencia única de 1 a 4 caracteres que identifican una entrada de inittabrunlevel: lista de niveles de ejecución para lo cuales se llevarán a cabo las acciones especificadasaccion: describe qué acción se debería llevar a cabocomando: especifica el proceso a ejecutarEjemplo de regla:
id:3:initdefault:
Estaría diciendo que ese sistema arranca por defecto en el runlevel 3.
Acciones válidas:
Este archivo solo existe en System V por lo que si usamos por ejemplo Systemd, no lo tendremos.
El sistema carga los servicios según el runlevel que se indica en /etc/inittab. Se inicia la ejecución de cada script del directorio /etc/rcX.d (donde la X identifica el runlevel). Los scripts siguen ciertas nombras de nombrado:
K: identificador para detener el servicio (kill)S: identificador para iniciar el servicio (start)nn: orden de ejecución o parada (00 = primero; 99 = último)Ejemplo:
/etc/rc3.d/K01sshd
El script anterior sirve para detener el servicio sshd y es de los primeros scripts en iniciarse (01).
Como el orden de ejecución es importante, cuando añadimos scripts personalizados, es buena práctica ponerles el 99 y así nos aseguramos que se haya ejecutado todos los scripts anteriores por si nuestro script tiene dependencia de alguno de ellos
Cada uno de los archivos de /etc/rcX.d es un enlace simbólico al script de servicio ubicado en /etc/init.d. La creación de enlaces simbólicos puede hacerse:
ln -s /etc/init.d/sshd /etc/rc3.d/S10sshdupdate-rc.d (Debian)chkconfig (Red Hat)
Esta forma de trabajar con enlaces simbólicos es útil porque en lugar de copiar o borrar los scripts de /etc/rcX.d, solo tenemos que crear o eliminar los enlaces simbólicos y el script original nunca se borrará.
Para crear de forma automática los enlaces a las carpetas /etc/rcX.d, tenemos un par de posibilidades según la distribución:
Red Hat:
chkconfig [--level <NIVEL>] <servicio> <on|off>
chkconfig es el comando para comprobar y actualizar la información de runlevel para los servicios de sistema en Red Hat y CentOS. En sistemas Debian usaríamos update-rc.d
Ejemplo:
chkconfig --level 1 network on
Ejecutando chkconfig sin opciones, podremos ver cada uno de los servicios y los runleveles para los que está activado y desactivado.
Debian:
update-rc.d <servicio> defaults
Ejemplo:
update-rc.d cron defaults
Red Hat:
chkconfig --del <SERVICIO>
Debian:
update-rc.d <SERVICIO> remove
Red Hat:
chkconfig --list
Debian:
service --status-all
Script independiente del nivel de ejecución. Se ejecuta después de todos los scripts de los nivesles de ejecución.
En la actualidad, los sistemas Linux están pasando de utlizar el sistema de gestión de servicios SysV al nuevo systemd. El primer proceso que arranca se llama systemd, aunque muchas veces se “enmascara” como init.
En vez de utilizar scripts y runlevels, utiliza unidades y targets, siendo los targets un tipo especial de unidad. Cada target lo que hace es llamar a otras unidades, generalmente targets y servicios, siguiendo una cadena de dependiencias.
Haciendo una analogía con SysV, podemos decir:
Cada archivo de configuración tiene una extensión que especifica qué tipo de unidad es (multi-user.target, cron.service…)
Los targets funcionan como estados del sistema, similares a los runlevels
systemctl get-defaultsystemctl isolate multi-user.targetsystemctl set-default <TARGET>systemctl list-unit-files –type=target
Los archivos de configuración se almacenan en la ruta /lib/systemd/system.
Podemos crear archivos de configuración personalizados, copiando y modificando los que están en la ruta anterior y guardándolos en /etc/systemd/system.
Nunca se deben alterar los ficheros de /lib/systemd/system
Los ficheros almacenados en /etc/systemd/system tienen prioridad sobre los otros. Existe otra ruta que tiene aún mayor prioridad que es /run/systemd/system, pero los archivos en esta ruta se borran al reiniciar el sistema.
Con la herramienta systemctl también podemos habilitar y deshabilitar servicios:
systemctl enable <SERVICIO>systemctl is-enabled <SERVICIO>systemctl disable <SERVICIO>systemctl stop <SERVICIO>systemctl start <SERVICIO>systemctl status <SERVICIO>
En sistemas Debian, ¿qué comando se puede utilizar para detener el script init apache2 de la ejecución al arranque una vez que el script real haya sido eliminado de /etc/init.d/?
update-rc.d apache2 remove
Has escrito un script de arranque (/usr/local/bin/startup.sh) que debería ejecutarse automáticamente cuando entre en el runlevel 3. De acuerdo a los estándares, ¿cuál es la mejor manera de lograrlo?
chmod 700 /usr/local/bin/startup.sh; cd /etc/init.d/rc3.d/; ln -s /usr/local/bin/startup.sh S99startup.sh¿Qué comando arrancaría el servicio del servidor web Apache (httpd) en un CentOS 6 con SysVinit?
service httpd start