Arranque y parada del sistema

De Wikiunix

Arranque y parada del sistema
Contiene explicaciones de los niveles de la forma de comportarse de estos sistemas en su inicio y su apagado, así como los niveles las formas en que puede hacerse.
Tiempo 4 horas
Nivel Unixero profesional
Bibliografía Proceso de arranque en WikipediaArranque del sistema: Administración de linux. Una guía básica. - Pedro Pablo Fábrega (Creative Commons) • Guía de Instalación de Debian GNU/Linux - Capítulo 5: Arranque del sistema de instalación (LGPL)
Prerrequisitos Conceptos básicosÓrdenes avanzadasKernelEstructura

Unix es un sistema operativo complejo, y tanto arrancar como detener el sistema es más complicado que emplear un interruptor. Una de las funciones del administrador del sistema es la de arrancarlo y detenerlo de forma correcta. Es importante que el administrador comprenda bien este proceso, debido a que durante el arranque el sistema es especialmente vulnerable.

Cuando se necesita apagar la máquina que está ejecutando un sistema Unix es necesario detener el sistema. Además hay varias razones por las que el administrador necesita detenerlo y arrancar en modo monousuario, para tener el máximo control sobre él, o bien, que sólo estén presentes algunas características del sistema. Entre estas razones se encuentran:

  • Añadir un nuevo hardware a la configuración del sistema.
  • Actualizar algunas aplicaciones.
  • Posibilidad de corrupción en el sistema de ficheros.
  • Sospecha de un fallo hardware.
  • Realizar copias de seguridad del sistema u otras tareas administrativas.


Contenido

Niveles de ejecución

Los sistemas Unix tienen varios modos diferentes de operación llamados estados del sistema o niveles de ejecución. Estos niveles hacen posible al administrador limitar la actividad en el sistema cuando efectúe ciertas tareas administrativas.

Un nivel de ejecución se puede definir como un método software para configurar el sistema, indicando qué procesos ejecutar, modo monousuario o multiusuario, dispositivos, etc.

En Unix existen siete niveles de ejecución numerados del 0 al 6. Estos son:

Nivel Función Descripción
0 Parada Finaliza servicios y programas activos, así como desmonta sistemas de archivos activos y para CPU.
1 Monousuario Finaliza la mayoría de servicios, permitiendo sólo la entrada del administrador (root). Se usa para las tareas de mantenimiento y corrección de errores críticos.
2 Multiusuario sin red No se inician servicios de red, permitiend sólo entradas locales en el sistema.
3 Multiusuario Inicia todos los servicios excepto los gráficos asociados a X Window.
4 Multiusuario Suele usarse para realizar pruebas.
5 Multiusuario X Igual que el nivel 3, pero con soporte X para la entrada de usuarios (login gráfico).
6 Reinicio Para todos los programas y servicios. Reinicia el sistema.


El nivel 1 se utiliza para las tareas administrativas, pues sólo se permitirá la entrada al root. Los niveles 2 al 5, permitirán diferenciar distintas configuraciones del sistema, permitiendo iniciar X Window, dispositivos hardware, etc. Por este motivo, la configuración de los niveles de ejecución es una tarea importante para el administrador del sistema.

Proceso de arranque del sistema

El proceso de iniciar el sistema desde un estado de parada o apagado se denomina bootstrapping o booting. Durante esta fase se carga en memoria una pequeña parte de código denominada bootstrap loader, y se inicia el sistema operativo. Este código puede estar almacenado en un disquete o bien en el disco duro, en el MBR.

Si arrancamos desde el disco duro, el código en el MBR examina la tabla de particiones, identifica la partición activa, lee el sector de arranque de la partición, y ejecuta el código almacenado en ese sector de arranque.

Este código se encarga de leer el núcleo del sistema operativo del disco e inicializarlo.

Una vez cargado el núcleo en memoria se realiza una serie de pasos:

  • Reconocer el hardware.
  • Montar los sistemas de ficheros indicados en el fichero /etc/fstab, empezando por el raíz.
  • Lanzar el proceso init que realizará las acciones asociadas al nivel de ejecución escogido.

El proceso init

El proceso init es el primero que se ejecuta cuando se produce el arranque del sistema, encargándose de inicializar el sistema, creando y controlando el resto de los procesos. De este modo, el proceso init se convierte en el padre de todos los procesos.

Durante el arranque del sistema, el proceso init examina el fichero /etc/inittab en busca de un nivel de ejecución por omisión (initdefault). Si no hay ninguno presente, lo pregunta. El proceso init utiliza el fichero /etc/inittab para determinar cómo será inicializado el sistema, ejecutando las órdenes indicadas en este fichero.

El proceso init se ejecuta en segundo plano, y se queda esperando la terminación de todos los procesos que se creen en el sistema, o bien recibir una señal de error, o a que se cambie el nivel de ejecución mediante las órdenes init, telinit, halt shutdown.

Cuando se le indica un cambio de nivel de ejecución, init envía una señal de terminación a todos sus procesos hijos que no deban ejecutarse en el nuevo nivel. A continuación se inicia el nuevo nivel de ejecución lanzando los procesos indicados en el fichero /etc/inittab.

Configuración de los niveles de ejecución

La existencia de diferentes niveles de ejecución permite configurar el sistema según nuestras necesidades, ejecutando los procesos necesarios. Su objetivo es activar o desactivar los distintos servicios del sistema.

El fichero /etc/inittab controla el proceso de inicialización del sistema, proporcionando al proceso init las instrucciones para crear y ejecutar los procesos asociados a los distintos niveles de ejecución. Para ello, init busca en este fichero las entradas correspondientes al nivel de ejecución.

Cada línea del fichero posee cuatro campos separados por el carácter ':', como se muestra a continuación:

identificador:nivel:acción:orden
  • identificador: Cadena de 1-4 caracteres que identifica la línea.
  • nivel: Especifica los niveles de ejecución en los que la línea va a ser procesada.
    • 0 Parada
    • 1 Monousuario
    • 2345 Multiusuario
    • 6 Rearranque
    • sS Monousuario
    • aAbBcC Otros
  • acción: Especifica la acción a realizar.
  • orden: Especifica el proceso que se va a ejecutar.
Archivo: /etc/inittab

# El nivel de ejecución por omisión
id:2:initdefault:
# Fichero de inicialización del sistema
# en tiempo de arranque.
si::sysinit:/etc/init.d/rcS
# Qué realizar en modo monousuario
:S:wait:/sbin/sulogin
# Indica los procesos a ejecutar en los distintos
# niveles de ejecución
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
# Acción a realizar cuando se pulsa CTRL-ALT-DEL
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
# Acción a realizar cuando se pulsa ALT-Cursor
kb::kbrequest:/bin/echo "Keyboard Request edit
/etc/inittab to let this work."
# Qué hacer cuando la fuente de energía del
# sistema falla o vuelve.

pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop
# Iniciar las consolas virtuales
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6
# Iniciar las terminales en el puerto serie
T1:23:respawn:/sbin/getty -L ttyS1 19200 vt100
# Iniciar un módem
T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3



Asociados al fichero /etc/inittab existen una serie de directorios que sirven para configurar los distintos niveles. El directorio /etc/init.d contiene los distintos scripts que se ejecutan cuando se cambia de nivel de ejecución. Estos ficheros son referenciados por enlaces simbólicos en los directorios /etc/rcN.d, siendo N el nivel de ejecución. Por tanto, cada nivel posee su directorio /etc/rcN.d.

Cuando se inicializa el sistema en un nivel determinado, se ejecutan todos los ficheros que existen en el directorio corespondiente. Los nombres de estos Sxxnombre o Kxxnombre, donde xx son dos números ficheros son de la forma que indica el orden en que se ejecuta, nombre es el nombre del script que se ejecuta, S indica que se inicia un servicio y K que se finaliza. Cuando se cambia de nivel, se ejecutarán primero los scripts que comienzan por K, seguido por los que comienzan por S.

Además, existe un directorio especial, /etc/rc.boot, que contiene los scripts que se ejecutan cuando la máquina arranca. Se utiliza principalmente para la inicialización de dispositivos hardware, etc.

Cambio de nivel de ejecución

La existencia de distintos niveles de ejecución permite que el sistema, durante su funcionamiento, pueda pasar de uno a otro según nuestras necesidades.

Durante las transiciones al modo monousuario, los sistemas de ficheros no son desmontados. Sólo se desmontan durante la transición al estado de parada del sistema.

Acciones a realizar sobre un proceso en el nivel de ejecución:

  • respawn: Reiniciar el proceso cuando termine la ejecución. Es la acción a realizar para las consolas virtuales (getty).
  • wait:El proceso se ejecuta una vez empezado a ejecutar el nivel de ejecución, y el proceso init esperará su terminación.
  • once: El proceso se ejecutará una única vez.
  • boot: El proceso se ejecutará durante el arranque del sistema. En este caso, el campo nivel será ignorado.
  • bootwait: El proceso se ejecutará durante el arranque del sistema, mientras init espera su terminación.
  • off: No realiza nada.
  • ondemand: Se ejecutará sólo cuando se entre en ese nivel, pero no cuando ocurra un cambio de nivel.
  • initdefault: Se especifica el nivel de ejecución por omisión en el arranque del sistema. Si no existe, pedirá el nivel de arranque.
  • sysinit: El proceso se ejecutará durante el arranque del sistema.
  • ctrlaltdel: Se ejecutará cuando el usuario pulse la combinación de teclas Ctrl + Alt + Del.
  • powerwait: Se ejecutará cuando reciba una senal que indica un fallo en la fuente de energía. init esperará la terminación del proceso para continuar.
  • powerfail: Igual al anterior, pero init no esperará la terminación.
  • powerokwait: Se ejecutará cuando la fuente de energía esté de nuevo funcionando.


La orden shutdown

La orden shutdown se utiliza para detener, rearrancar o pasar a modo monousuario el sistema. Sólo el superusuario puede ejecutarla.

La sintaxis es:
shutdown [opciones] tiempo [mensaje]
donde tiempo especifica cuando se va a producir el cambio. Se puede usar la palabra now para un cambio inmediato, o especificar un tiempo futuro en uno de los siguientes formatos:
  • +n: Especifica los minutos.
  • hh:mm: Especifica el tiempo absoluto.

El argumento mensaje se le enviará a todos los usuarios conectados al sistema notificándoles, a intervalos de tiempo cada vez menores, que se va a cambiar de nivel.

Cuando se usa sin opciones, la orden shutdown pasa el sistema a modo monousuario. La opción -r rearranca el sistema y la opción -h detiene el sistema.

Ejemplo:

shutdown +10 "El sistema se detendrá para rutinas de mantenimiento"


La orden halt

La orden halt puede ser usada para detener el sistema. Esta orden sólo puede ser utilizada por el superusuario.

La sintaxis es:
halt [opciones]

La orden halt detiene todos los procesos, sincroniza los discos, registra la parada escribiendo una entrada en el fichero de informes (/var/log/wtemp) del sistema, desmonta los sistemas de ficheros y luego para el procesador.


La orden reboot

La orden reboot detiene todos los procesos, sincroniza los discos, registra el rearranque escribiendo una entrada en el fichero de informes del sistema (/var/log/wtemp). Sin embargo, no proporciona un tiempo de espera ni informa a los usuarios sobre la parada y el arranque del sistema. Por tanto, esta orden no debería ser utilizada si hay usuarios conectados. En ese caso, se debe utilizar la orden shutdown -r.

Se debe tener privilegios de superusuario para utilizar esta orden.

La sintaxis es:
reboot [opciones]

Nota: Si se hacen cambios en el software del sistema o en ficheros de configuración que se ejecutan cuando éste se inicia, debemos rearrancarlo para que estos cambios tengan efecto.


La orden init

La orden init permite realizar cualquier transición entre niveles de ejecución.

Esta orden sólo la puede ejecutar el superusuario.

La sintaxis es:
init nivel
donde nivel especifica el nuevo nivel que se quiere alcanzar:
  • 0: Detiene el sistema.
  • 1: Cambia al modo monousuario.
  • 2345: Cambia al modo multiusuario.
  • 6: Rearranca el sistema.
  • sS: Cambia al modo monousuario.
  • qQ: Examina las entradas en /etc/inittab.
  • aAbBcC: Procesa en el fichero /etc/inittab las entradas que correspondana los niveles de ejecución a, A, b, B, c o C.


La orden telinit

La orden telinit está asociada a la orden init para especificarle el cambio de un nivel de ejecución. Por tanto, presenta el mismo formato que ella, pues esos parámetros se le pasan a init para realizar la acción apropiada.

Esta orden sólo puede ser utilizada por el superusuario, o bien por ciertos usuarios con los privilegios adecuados.

La sintaxis es:
telinit nivel


Entrada al modo multiusuario

Una vez que el proceso init ejecuta las acciones indicadas en el directorio /etc/rcN.d relacionadas con el nivel de ejecución que se quiere alcanzar, si éste es el modo multiusuario (niveles 2 a 5), inicia las consolas virtuales indicadas en el fichero /etc/inittab, ejecutando la orden getty.

La orden getty muestra el mensaje que aparece en el fichero /etc/issue y a continuación ejecuta la orden login que se encarga de pedir el nombre y la contraseña al usuario para permitirle la entrada al sistema. Para ello, comprueba en el fichero /etc/passwd la validez de los datos introducidos. Si son válidos, ejecuta el shell de entrada del usuario. Si no son válidos termina su ejecución.

init es el proceso padre de todos, creando nuevos procesos vía fork y después ejecutando el programa adecuado con exec, incluso los programas getty y login.

Una vez finalizada la ejecución del proceso de usuario se avisa al proceso init para que vuelva a reiniciar la consola virtual que permita la entrada de un nuevo usuario, esto se consigue especificando la acción respawn en la línea correspondiente a la orden getty en el fichero /etc/inittab.

Proceso de arranque

Al encender la computadora las primeras operaciones las realiza la BIOS (Sistema Básico de Entrada/Salida o Basic Input-Output System). En esta etapa se realizan operaciones básicas de hardware. El proceso de arranque será diferente dependiendo de la arquitectura del procesador y la BIOS.

Una vez que el hardware se reconoce y se deja listo, la BIOS carga en memoria el código ejecutable del gestor de arranque y le pasa el control. Hay variedad de BIOS que permiten al usuario definir en qué dispositivo/partición se encuentra dicho gestor.

Gestores de arranque

Un cargador de arranque (boot loader en inglés) es un programa diseñado exclusivamente para cargar un sistema operativo en memoria. La etapa del cargador de arranque es diferente de una plataforma a otra.

Como en la mayoría de arquitecturas este programa se encuentra en el MBR, el cual es de 512 bytes, no es suficiente para cargar en totalidad un sistema operativo. Por eso, el cargador de arranque consta de varias etapas.

Para las plataformas x86, el BIOS carga la primera etapa del cargador de arranque (típicamente una parte de LILO o GRUB). El código de esta primera etapa se encuentra en el sector de arranque (o MBR). La primera etapa del cargador de arranque carga el resto del cargador de arranque.

Los cargadores de arranque modernos típicamente preguntan al usuario cual sistema operativo (o tipo de sesión) desea inicializar.

GRUB

GRUB se carga y se ejecuta en 4 etapas:

  1. La primera etapa del cargador la lee el BIOS desde el MBR (master boot record, primer sector de arranque).
  2. La primera etapa carga el resto del cargador (segunda etapa). Si la segunda etapa está en un dispositivo grande, se carga una etapa intermedia (llamada etapa 1.5), la cual contiene código extra que permite leer cilindros mayores que 1024 o dispositivos tipo LBA (logical block addressing o dirección lógica de bloques).
  3. La segunda etapa ejecuta el cargador y muestra el menú de inicio de GRUB. Aquí se permite elegir un sistema operativo junto con parámetros del sistema.
  4. Cuando se elige un sistema operativo, se carga en memoria y se pasa el control.

GRUB soporta métodos de arranque directo, arranque chain-loading, LBA, ext2 y hasta "un pre-sistema operativo totalmente basado en comandos". Tiene tres interfaces: un menú de selección, un editor de configuración y una consola de línea de comandos.

Dado que GRUB entiende los sistemas de archivos ext2 y ext3 y además provee una interfaz de línea de comandos, es más fácil rectificar o modificar cuando se malconfigura o se corrompe. La nueva versión 2 de GRUB, soporta sistema de archivos ext4.

LILO

LILO es más antiguo. Es casi idéntico a GRUB en su proceso, excepto que no contiene una interfaz de línea de comandos. Por lo tanto todos los cambios en su configuración deben ser escritos en el MBR, y reiniciar el sistema. Un error en la configuración puede arruinar el proceso de arranque a tal grado de que sea necesario usar otro dispositivo que contenga un programa que sea capaz de arreglar ese defecto.

De forma adicional, LILO no entiende sistema de archivos, por lo tanto no hay archivos y todo se almacena en el MBR directamente.

Cuando el usuario selecciona una opción del menú de carga de LILO, dependiendo de la respuesta, carga los 512 bytes del MBR para otros sistemas, o la imagen del kernel Linux.

Programas relacionados

  • bootchart permite seguir el proceso de arranque para ver problemas e ineficiencias.

Ejercicios

Ejercicios de la sección de arranque y parada del sistema
Aspectos pedagógicos: Permiten asimilar el comportamiento del sistema al iniciarse y cerrarse. También sirven para distinguir las características de los niveles de arraque.
Preparación previa: Para hacer estos ejercicios debes acceder al sistema con el usuario por defecto usuario (recuerda que la contraseña es unix). A continuación:
  • Ve al directorio casa del usuario actual. Comprueba que existe un directorio llamado unix y dentro de éste un subdirectorio llamado arranque. Para ello ejecuta:
    ls unix
    Debe aparecer el directorio arranque. En caso de que no exista alguno de estos elementos, puedes hacer varias cosas:
    1. Descargar el archivo comprimido con la jerarquía de elementos de comprobación que se encuentra en la portada del wiki y descomprimirlo en el directorio casa del usuario actual.
    2. Apagar la máquina virtual y restaurar el snapshot que funcionaba bien.
    3. Apagar la máquina virtual y borrarla eliminando el disco duro virtual. A continuación, descargar el disco duro y volver a configurar la máquina de nuevo.
  • Ve al subdirectorio unix/arranque. Limpia el sistema antes de realizar los demás ejercicios para prevenir posibles incongruencias:
    sudo python arranque.py -c
    o
    sudo python arranque.py --clean
  1. Compruebe cuál es el modo de arranque por defecto de su sistema.
  2. Deseamos configurar el nivel de ejecución 4 para pruebas del sistema. Por eso deseamos que en dicho nivel:
    • No se ejecuten los servicios "cups" ni "pcmciautils"
    • El servicio "anacron" se ejecute inmediatamente después de la ejecución de "atd" (no modifique "atd" para ello, sólo "anacron")
  3. Vuelve al directorio inicial (arranque) y ejecuta el primer control intermedio:
    sudo python arranque.py -p 1
    o
    sudo python arranque.py --partial 1
Debes haber aprendido a: Queda por aprender:
Manejo y modificación de programas a ejecutar en los distintos niveles de ejecución Modificación del nivel por defecto
  1. Establezca el nivel de ejecución 4 como modo por defecto de su sistema.
  2. Asegúrese de que al pulsar Ctrl+Alt+Del en dicho nivel no se reinicie el sistema, sino que se almacena la hora de pulsación en el fichero /var/log/ctrl.log (cree este fichero si no existe y asegúrese de que sólo puede leerlo o modificarlo el root).
  3. Vuelve al directorio inicial (arranque) y ejecuta el control final:
    python arranque.py
Tras la realización de estos ejercicios debes tener clara la utilización y el manejo de las siguientes órdenes:
indeterminada


Si aún sigues teniendo dudas puedes:

  1. Releer el artículo Arranque y parada del sistema de nuevo al completo, o tan sólo las secciones en las que tengas dudas.
  2. Volver a desarrollar los ejercicios de nuevo.
  3. Revisar los artículos creados en el wiki para cada una de las órdenes.
  4. Revisar el manual de las órdenes implicadas (recuerda que tienes los enlaces en los artículos del wiki de cada una y además en está el manual del sistema).
Herramientas personales