====== 202.1 Customizing SysV-init system startup ====== Perteneciente a [[informatica:certificaciones:lpic:lpic-2:202_system_startup|LPI Topic 202: System Startup]] * **Weight**: 3 * **Description**: Candidates should be able to query and modify the behaviour of system services at various targets / run levels. A thorough understanding of the systemd, SysV Init and the Linux boot process is required. This objective includes interacting with systemd targets and SysV init run levels. * **Key Knowledge Areas**: * Systemd * SysV init * Linux Standard Base Specification (LSB) * Terms and Utilities: * ''/usr/lib/systemd/'' * ''/etc/systemd/'' * ''/run/systemd/'' * ''systemctl'' * systemd-delta * ''/etc/inittab'' * ''/etc/init.d/'' * ''/etc/rc.d/'' * ''chkconfig'' * ''update-rc.d'' * ''init'' and ''telinit'' GRUB es el cargador de arranque estándar actual. ===== Proceso de arranque de Linux ===== 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: - Carga del kernel: el cargador de arranque especifica qué kernel cargar. - Inicio de los registros (config, System.map... y demás registros de configuración que acompañan al kernel) - Descompresión del kernel: se descomprime en el ramkdisk - Inicialización del kernel y la memoria - Inicio del kernel - Activación de las CPUs restantes - Creación de los procesos **init**. 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/sh'' Si 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. ===== System V ===== ==== Niveles de ejecución ==== 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: * **0**: parada del sistema (reservado, no se puede tocar) * **1**: modo //single-user//. No inicia servicios de red, se podría decir que es un modo de rescate (reservado, no se puede tocar) * **2**, **3**, **4**: full multi-user. Sería el modo por defecto de arranque. * **5**: multiuser, pero con entorno gráfico (si está instalado el Xserver) * **6**: reinicio del sistema (reservado) * **S**: modo single-user (desde el arranque, no lo seleccionamos, suele ser cuando hay algún error durante el arranque) * **A**, **B**, **C**: runlevels especiales "on demand" ==== Configuración System V ==== 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 inittab * ''runlevel'': lista de niveles de ejecución para lo cuales se llevarán a cabo las acciones especificadas * ''accion'': describe qué acción se debería llevar a cabo * ''comando'': especifica el proceso a ejecutar Ejemplo de regla: id:3:initdefault: Estaría diciendo que ese sistema arranca por defecto en el runlevel 3. Acciones válidas: * **initdefault**: define el nivel de ejecución por defecto del sistema. * **sysinit**: ejecuta el script en el arranque del sistema, independientemente del nivel de ejecución. * **wait**: ejecuta el comando indicado y espera su ejecución para pasar a la siguiente línea. * **respawn**: ejecuta el comando en segundo plano y continúa leyendo las líneas del inittab. 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: * Manualmente: ''ln -s /etc/init.d/sshd /etc/rc3.d/S10sshd'' * Automático: ''update-rc.d'' (Debian) * Automático: ''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á. === Añadir servicios a runlevel === 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 ] ''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 defaults Ejemplo: update-rc.d cron defaults === Eliminar servicios de runlevel === Red Hat: chkconfig --del Debian: update-rc.d remove === Estado de los servicios === Red Hat: chkconfig --list Debian: service --status-all === /etc/rc.local === Script independiente del nivel de ejecución. Se ejecuta después de todos los scripts de los nivesles de ejecución. ===== Systemd ===== 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: * script = unidad * target = runlevel Cada archivo de configuración tiene una extensión que especifica qué tipo de unidad es (''multi-user.target'', ''cron.service''...) ==== Targets ==== Los targets funcionan como estados del sistema, similares a los runlevels * multi-user.target ~ runlevel 2, 3 o 4 * graphical.target ~ runlevel 5 * rescue.target ~ runlevel 1 * poweroff.target ~ runlevel 0 * reboot.target ~ runlevel 6 * Para conocer el target por defecto: ''systemctl get-default'' * Para cambiar de target: ''systemctl isolate multi-user.target'' * Para cambiar el target por defecto: ''systemctl set-default '' * Para ver todos los disponibles: ''systemctl list-unit-files --type=target'' ==== Configuración ==== 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. ==== Gestionar servicios ==== Con la herramienta ''systemctl'' también podemos habilitar y deshabilitar servicios: * Habilitar:: ''systemctl enable '' * Comprobar si está habilitado: ''systemctl is-enabled '' * Deshabilitar: ''systemctl disable '' * Detener: ''systemctl stop '' * Arrancar: ''systemctl start '' * Estado: ''systemctl status '' ===== Tests ===== 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''