DPD Niveles de Ejecucion
De Gleducar, http://www.gleducar.org.ar
Contenido |
Comprendiendo los Niveles de ejecución
A diferencia de la mayoría de los sistemas No-Unix que solo tienen dos modos de funcionalidad (encendido y apagado), los sistemas tipo Unix, incluyendo a GNU/Linux, tienen diferentes niveles de ejecución como el nivel "Mantenimiento" o el nivel "Multiusuario", etc..
Los niveles de ejecución están numerados desde 0 hasta 6 y varían de una distribución de GNU/Linux a la otra. La descripción para cada nivel de ejecución está a menudo comentada en /etc/inittab.
Ejemplos de niveles de ejecución en GNU/Linux:
| Nivel 0 | Detiene de forma de segura el sistema operativo e intenta apagar el equipo. |
|---|---|
| Nivel 1 | En el modo "usuario único" (single user mode), una sola terminal está habilitada para el (úni) superusuario, el resto de los usuarios están deslogueados. |
| Nivel 2 | Es un modo multiusuario, pero no se inician los servicios de red como NFS, servidor de mail o servidor web. |
| Nivel 3 | Es el modo multiusuario completo, todos los servicios de red están habilitados. |
| Nivel 4 | No está definido y generalmente no se usa. |
| Nivel 5 | Es como el nivel 3, modo multiusuario completo, pero agrega el Gestor de Ventanas (X System) |
| Nivel 6 | Reinicia la máquina de forma segura. |
Los niveles 0, 1 y 6 cumplen la misma función en todos los sabores GNU/Linux
Controles de niveles de ejecución INIT
Ambos init y telinit son usados para cambiar de un nivel de ejecución a otro. Recuerda que init es el primer programa lanzado luego de que el kernel a accedido al dispositivo maestro.
En el tiempo de carga se le indica a init cual es el nivel de ejecución que debe alcanzar, esto se define en /etc/inittab en la línea:
id:5:initdefault:
Cuando el sistema se inicia es posible cambiar el nivel de ejecución invocando init (o telinit que es un enlace simbólico apuntando al primero).
Por ejemplo, para cambiar al nivel de ejecución 4 podemos usar alguno de los siguientes comandos:
init 4
o
telinit 4
El PID para init es siempre '1'. Es posible averiguar que nivel de ejecución esta corriendo el sistema con el comando runlevel.
runlevel N 5
El primer número es el nivel de ejecución previo (o N si no es aplicable) y el segundo número es es el nivel de ejecución actual.
Servicios y scripts de control en tiempo de ejecución
Cada nivel de ejecución esta compuesto por una serie de servicios que pueden ser iniciados o detenidos. Los servicios son controlados por los scripts de control del nivel de ejecución que encontramos dentro de /etc/rc.d/init.d o /etc/init.d (varia según la distribución, el primero para las distribuciones basadas en Red Hat y el segundo para las basadas en Debian). Cada rc-script controla, usando un argumento, el demonio asociado con el servicio.
Ejemplo: reiniciando el servidor Apache:
/etc/rc.d/init.d/httpd restart
o
/etc/init.d/httpd restart
Argumentos contemplados
| restart | reinicia el servicio |
|---|---|
| stop | detiene el demonio asociado al servicio |
| inicio | inicia el servicio |
| status | retorna el estado del servicio (corriendo o detenido) |
Servicios típicos dentro de /etc/rc.d/init.d/
ls /etc/rc.d/init.d/ anacron cups identd kadmin krb5kdc mcserv nscd random smb xfs apmd dhcpd innd kdcrotate kudzu named ntpd rawdevices snmpd xinetd arpwatch functions ipchains keytable ldap netfs pcmcia rhnsd squid atd gpm iptables killall linuxconf network portmp rwhod sshd autofs halt irda kprop lpd nfs pgsql sendmail syslog crond httpd isdn krb524 marsrv nfslock pppoe single tux
Cuando un servicio es iniciado se ejecutará hasta que un nueveo nivel de ejecución es iniciado.
Seleccionando servicios por nivel de ejecución
Veamos que sucede cuando cambiamos de un nivel de ejecución a otro.
Digamos que querés pasar al nivel de ejecución 2, entonces escribirías:
/sbin/init 2
Esto fuerza a init a leer el archivo de configuración /etc/inittab. Nosotros vamos a mirar el archivo en detalle en la siguiente sección. Por ahora nos limitaremos a observar una sola línea dentro de /etc/inittab que iniciará todos los servicios de ese nivel:
L2:2:wait:/etc/rc.d/rc 2
El comando /etc/rc.d/rc 2 iniciará en /etc/rc.d/rc2.d se iniciara con una S y detendrá los servicios conla letra K. La siguiente lista de ejemplo muestra que el demonio httpd será detenido mientras el demonio syslogd esté en ejecución:
ls /etc/rc.d/rc2.d/ -l | egrep "httpd|syslog" lrwxrwxrwx 1 root root 15 Mar 23 21:01 /etc/rc.d/rc2.d/K15httpd -> ../init.d/httpd lrwxrwxrwx 1 root root 16 Mar 20 20:03 /etc/rc.d/rc2.d/S12syslog -> ../init.d/syslog
Se puede observar que los los scripts son enlaces simbólicos a los rc-scripts en /etc/rc.d/init.d.
Por lo tanto, si no querés que un proceso se ejecute en un determinado nivel de ejecución podés eleminar su enlace simbólico correspondiente en /etc/rc.d/rN.d.
Editores en tiempo de ejecución
Un editor de tiempo real manejará automáticamente los enlaces simbólicos permitiendo al administrador del sistema cambiar el estado de un servicio como lo necesite. Una vez más, las distintas distribuciones ofrecen diferentes herramientas para estos fines.
Lo bueno de inittab
Como prometimos, a continuación echaremos un vistazo más de cerca a /etc/inttab.
El archivo tiene la siguiente estructura:
id : runlevel : action : command
El archivo /etc/inittab
id:3:initdefault: # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 # Run xdm in runlevel 5 x:5:respawn:/etc/X11/prefdm –nodaemon
El campo id puede ser cualquiera. Si un nivel de ejecución es especificado entonces el comando y la acción requerida se desarrollara solamente en el nivel de ejecuciòn especifico. Si ningún número es especificado entonces la linea sera ejecutada en cualquier nivel de ejecución.
Características reconocidas en el archivo /etc/inittab:
- El nivel de ejecución por defecto
- está establecido al comienzo del archivo con el id y con la acción initdefault. Nótese que no se dado ningún comando. Esta linea simplemente le dice a init cual es el nivel de ejecución default.
- Primer programa llamado por init
/etc/rc.d/rc.sysinit. Este script establece el sistema por defecto asi como la variable PATH, determina si la red esta permitida, el nombre del host, etc ...
- Servicios de nivel de ejecución default
- Si el nivel de ejecución default es 3, entonces solamente la linea "l3" va a ser ejecutada. La acción es "wait", ningún otro programa es lanzado hasta que todos los servicios en el nivel de ejecución tres esten corriendo.
- Las terminales getty
- Las lineas con id de 1 a 6, lanzan la terminal virtual. Aqui es donde usted puede alterar el número de terminales virtuales.
- Nivel de ejecución 5
- La linea final de inittab lanza el manejador de Xwindow sí el nivel de ejecución 5 es rechazado.
- Comentarios
- 1. Puede poner un modem para que escuche conexiones en inittab. Si su modem esta enlazado a
/dev/ttyS1entonces la siguiente linea va a permitir conexión de datos (no fax) despues de dos tonos de llamada:
S1:12345:respawn:/sbin/mgetty -D -x 2 /dev/ttyS1
- 2. Cuando hace cambios en
/etc/inittabnecesita forzar ainitpara que vuelva a leer esta configuración del archivo. Esto es más fácil hacerlo usando:
/sbin/init q
LILO y GRUB
Durante el arranque, el cargador necesita saber dónde está el kernel (generalmente en /boot/) y cual dispositivo es el root-device.
BOOTLOADER ----> KERNEL ----> / ----> /sbin/init
Alternativamente, un cargador de arranque puede cargar un RAM disk en la memoria conteniendo scripts y módulos del kernel necesarios para acceder al root device. Esto puede ser el caso del root device es manejado por un módulo no residente (también llamado dinámico).
BOOTLOADER -----> INITRD ----> KERNEL ----> / ----> /sbin/init
Common dynamic modules
| ext3 | Tipo de sistema de archivos extendido y con journaling |
| lvm | Adminstrador de volumenes lógicos |
| raidx | raid por software con soporte nivel x |
| scsi | Soporte SCSI |
Instalando LILO
El cargador de arranque LILO es instalado por /sbin/lilo que lee las opciones configuradas del archivo /etc/lilo.conf
LILO no lee sistemas de archivos, solo agregados (MBR) en discos físicos. Por lo tanto el mapeador lee información del archivo /etc/lilo.conf (por ejemplo, cual cargador de segunda etapa usar, cual kernel o RAM disk inicial) y traduce esta información usando un sistema de mapeo propio de LILO al arranque.
Las opciones principales en /etc/lilo.conf son:
| boot* | Dónde debe ser instalado LILO (/dev/hda es el MBR)
|
| install | Dónde instalar la segunda etapa (boot.b por defecto)
|
| prompt | Da al usuario la posibilidad de elegir el SO a arrancar |
| default | Nombre de la imagen que arrancará por defecto |
| timeout | Usada con prompt, causa una espera de LILO (la unidad es 1/10 de segundo) |
| image* | Ruta al kernel a arrancar (se puede usar other para cargar una cadena)
|
| label* | Nombre de la imagen. Es la etiqueta que aparece en la lista de arranque |
| root* | El nombre del dispositivo donde está el sistema de archivos / |
| read-only* | Monta el sistema de archivos principal en modo solo lectura para que fsck trabaje correctamente
|
| append | Le da parámetros al kernel de módulos compilados estáticamente |
| linear/lba3 | Estas opciones son excluyentes entre si. Ambas le dicen a LILO si leer el disco usando: direccionamiento lineal de bloques (tipicamente usado para discos muy grandes), lba32 es usado para disponer acceso a datos más allá de los primeros 1024 cilindros. |
Instalando GRUB
El cargador GRUB es instalado con el comando grub-install. Las opciones de configuración son guardadas en el archivo /boot/grub/menu.lst o /boot/grub/grub.conf. Tal como LILO, GRUB es un pequeño shell que puede leer ciertos sistemas de archivos. Esto permite a GRUB leer la información del grub.conf o menu.lst
Principales secciones de /boot/grub/menu.lst o /boot/grub/grub.conf
1. General/Global
| default | Imagen que arrancará por defecto (la primer entrada es 0) |
| timeout | Tiempo para elegir SO en segundos |
2. Image
| title | Nombre de la imagen |
| root | Donde está la segunda etapa del cargador y el kernel (hd0,0 es el /dev/hda) |
| kernel | Ruta para el kernel comenzando desde el raiz, por ejemplo /vmlinuz
|
| ro | solo lectura |
| root | La raiz del sistema de archivos |
| initrd | Ruta al disco principal |
Opciones de arranque
En el momento de arranque del sistema, se pueden pasar parámetros a los programas LILO o GRUB. Estos tienen una interfaz limitada para leer entradas del usuario.
Pasando parámetros al prompt de LILO:
boot: linux s
Pasando parámetros al prompt de GRUB:
Una vez que GRUB ha arrancado correctamente, puede ver el menú principal con una lista de títulos. Haga lo siguiente:
- presione 'e' para editar un título del menú
- recorra hacia abajo hasta la línea que contiene 'kernel' y presione 'e' nuevamente.
- puede agregar algunas opciones aquí.
- para arrancar con estas opciones, escriba 'b'. En caso contrario apretar la tecla Return para salir sin cambiar nada.
Presionando la tecla ESC puede ir hacia atrás. Puede navegar al menú principal de esta forma.
Alternativamente, el archivo de configuración del cargador de arranque (lilo.conf o grub.conf) puede ser usado para guardar estas opciones.
Pasando parámetros al init
Los cargadores de arranque pueden pasar parámetros de nivel de ejecución al init. Primero el kernel es cargado, esto arrancará /sbin/init por defecto, el cual toma el control del proceso de arranque.
Los niveles de ejecución comunes son: s, single, S, 1, 2, 3, 4, 5, 6
Si no se indican parámetros, init lanzará el nivel de ejecución especificado en /etc/inittab.
Pasando parámetros al Kernel
Las opciones del kernel tienen el formato item=valor
| acpi= | activa/desactiva ACPI |
| init= | le dice al kernel cual programa arrancar del dispositivo principal |
| mem= | especifica la cantidad de RAM a usar |
| root= | especifica el dispositivo principal |
Cuidado! El cargador de arranque le pasa parámetros a los módulos del kernel residentes solamente.
En /etc/lilo.conf los parámetros del kernel son declarados con la opción append.
Ejemplos:
- append= "pci=bisoirq"
- append=�?ram=16M�?
- append=�?/dev/hdc=ide-scsi�? (for CD writers)
Durante el arranque, todos los mensajes del kernel son guardados en /var/log/dmesg por defecto. Este archivo puede ser leído o enviado al stdout con el comando /bin/dmesg.
Del arranque al bash
Trataremos ahora de ir a través de cada etapa del proceso de arranque.
- Etapa del cargador de arranque
- Si el cargador de arranque tiene éxito, podrá comenzar la segunda etapa mostrando un prompt o una imagen de fondo con una lista de sistemas operativos o kernels para arrancar. Si se especificó un RAM disk inicial, se cargará aquí.
- Etapa del kernel
- El kernel es cargado desde el medio especificado en el
lilo.confogrub.conf. Es cargado y descomprimido. Si se carga un RAM disk inicial, los módulos extras son cargados acá. - El kernel buscará el hardware existentes en el sistema: CPU, RAM, bus PCI, etc.
- El kernel entonces monta el dispositivo principal como de solo lectura.
- Por último, el kernel carga
/sbin/init, el primer proceso en el espacio del usuario.
- El kernel es cargado desde el medio especificado en el
- Etapa INIT
- El INIT lee
/etc/inittaby sigue las instrucciones.- El nivel de ejecución por defecto es leído
- Pone en funcionamiento el
rc.sysinit- Todos los sistemas de archivos locales son montados o (si es necesario) se ejecuta la verificación de integridad (
fsck), de acuerdo con las entradas del/etc/fstab - Se inician las
quotas, etc.
- Todos los sistemas de archivos locales son montados o (si es necesario) se ejecuta la verificación de integridad (
- El INIT llega al nivel de ejecución por defecto y ejecuta
/etc/rc.d/rc N - Se inician las
gettyy finaliza el proceso de arranque.
- El INIT lee
El prompt de acceso es ahora administrado por las gettys en las terminales. Después de que el usuario haya escrito el nombre de usuario y contraseña...
/bin/login ha comenzado.
La contraseña del usuario es comparada con la que está en /etc/passwd o /etc/shadow