1. El documento describe el proceso de arranque de Linux, el cual pasa por varias etapas incluyendo el BIOS, el MBR, GRUB y el núcleo.
2. GRUB muestra un menú que permite al usuario seleccionar el sistema operativo a cargar y pasa el control al núcleo seleccionado.
3. Una vez cargado, el núcleo inicia el proceso INIT el cual genera otros procesos y configura el entorno del sistema operativo.
Avances tecnológicos del siglo XXI y ejemplos de estos
Entender linux
1. Prof. Dr. Jorge Domínguez Chávez
Entendiendo el inicio de operaciones de LINUX
Todos los días, miles de usuarios de LINUX encienden sus computadores, esperan pocos segundos (o
minutos dependiendo la velocidad de su CPU) para ver a su sistema operativo favorito cargar, y obtener
la pantalla de bienvenida !!! Les causa un inmenso placer hacer log en su sistema operativo favorito y
trabajar.
El Proceso de arranque en LINUX es el proceso de arranque de un sistema operativo que en muchos
aspectos es similar a los procesos de arranque de BSD1
y otros sistemas UNIX2
, de los cuales deriva.
¿Cuáles son los objetivos de este trabajo?
1. Ofrecer una descripción básica del trabajo interno y de las operaciones del núcleo (kernel) de
LINUX en favor de los lectores.
2. Todos los archivos mencionados en este trabajo se refieren al núcleo de LINUX 3.2. Aunque
estos archivos son comunes a todo UX* y pueden ser encontrados en cualquier sistema Linux,
el autor utiliza la versión Debian Wheezy.
Proceso típico
En LINUX, el flujo de control durante el arranque es desde el BIOS, al gestor de inicio y al núcleo
(KERNEL). El núcleo inicia el planificador (para multitarea) y ejecuta el primer espacio de usuario (es
decir, fuera del espacio del núcleo) y el programa de arranque (que establece el entorno de usuario y
permite la interacción del usuario y el inicio de sesión), momento en el que el núcleo se inactiva hasta
ser llamado externamente.
La etapa del cargador de inicio no es totalmente necesaria. Determinados BIOS pueden cargar y pasar
el control a LINUX sin hacer uso del cargador. Cada proceso de arranque será diferente dependiendo de
la arquitectura del procesador y el BIOS.
1. El BIOS realiza las tareas de inicio específicas del hardware.
2. Una vez que éste es reconocido y se inicia correctamente, el BIOS carga y ejecuta el código de
la partición de arranque del dispositivo de arranque designado, que contiene la fase 1 de un
gestor de arranque LINUX. La fase 1 carga la fase 2 (la mayor parte del código del gestor de
arranque). Algunos cargadores pueden utilizar una fase intermedia (conocida como fase 1.5)
1 Berkeley Software Distribution o BSD (en castellano, «distribución de software Berkeley») es un sistema operativo
derivado del sistema UNIX generado por los aportes realizados a ese sistema por la Universidad de California en Berkeley,
USA.
2 Unix (registrado oficialmente como UNIX®) es un sistema operativo portable, multitarea y multiusuario; desarrollado, en
principio, en 1969, por los Laboratorios Bell de ATT.
2. para lograr esto, ya que los modernos discos de gran capacidad no pueden ser totalmente leídos
sin código adicional.
3. El gestor de arranque, a menudo, presenta al usuario un menú de opciones posibles de arranque.
Luego, carga el sistema operativo, al que descomprime en la memoria y establece las funciones
tanto del sistema como del hardware esencial y la paginación de memoria, previo a llamar a la
función start_kernel().
4. A continuación, la función start_kernel()realiza la mayor parte de la configuración del
sistema (interrupciones, el resto de la gestión de memoria, la inicialización del dispositivo,
controladores, etc), antes de continuar, por separado el proceso, inactivo y planificador, así
como el proceso de Init (que se ejecuta en el espacio de usuario).
5. El planificador toma control efectivo de la gestión del sistema y el núcleo queda inactivo.
6. El proceso Init ejecuta los comandos (scripts) necesarios para configurar todos los servicios y
estructuras que no sean del sistema operativo, a fin de permitir que el entorno de usuario sea
creado y pueda presentarse al usuario con una pantalla de inicio de sesión.
En el apagado, Init es llamado a cerrar las funcionalidades del espacio de usuario de una manera
controlada, a través de secuencias de comandos, tras lo cual termina y el núcleo ejecuta el apagado.
Espacio de usuario temprano
El espacio de usuario temprano se utiliza en versiones recientes del núcleo de LINUX para sustituir
tantas funciones como sea posible, funciones que originalmente se cargarían en el núcleo durante el
proceso de inicio. Los usos típicos del espacio de usuario temprano son para detectar los controladores
de dispositivos (Drivers) necesarios para cargar el sistema de archivos del espacio de usuario principal
y cargarlos desde un sistema de archivos temporal.
Este espacio, el cual es externo al núcleo se refiere a un espacio de aplicación, típicamente UNIX o en
sistemas operativos UX*. Algunas veces, la expresión espacio de usuario puede referirse a una
aplicación que lleva a cabo sus propias llamadas al sistema o su propia entrada y salida (E/S). Por lo
común, como parte de una aplicación, hará llamadas al sistema y a otras actividades del sistema desde
el núcleo.
En el sentido jerárquico del sistema de archivos, el espacio de usuario se refiere a cualquier espacio de
almacenamiento en disco del sistema que no es parte de su almacenamiento crítico, es decir, el espacio
de almacenamiento de los usuarios, como sus documentos personales y otros datos no críticos. En los
sistemas Unix reside en los directorios /home, /export/home o /usr/home.
Proceso en detalle
Como primer punto revisamos el proceso de carga o boot process del Sistema Operativo LINUX.
Vemos que LINUX pasa por diferentes etapas de carga. Comprender como LINUX carga es muy
importante en términos de manejo efectivo de los errores en caso de que el proceso falle. Averiguar lo
que ha pasado y pasa en las etapas de la secuencia de arranque es de suma importancia para un buen
funcionamiento de su computador y de su sistema operativo LINUX.
En LINUX hay 6 etapas de carga, vea la figura 1. Luego se discuten esas etapas en detalle.
3. BIOS (Sistema Básico de Entrada Salida)
1. Encendido del pc, el hardware transfiere el control a BIOS.
2. BIOS es el primer programa en ejecutarse y es independiente del Sistema Operativo.
3. BIOS reside en la ROM (Memoria sólo Lectura).
4. El primer paso de BIOS es Potenciar Autoprueba (POST) el cual recorre la información del
hardware y verifica el inicio de carga (bootloader).
5. Recorre los dispositivos de almacenamiento de datos (Floppy, CD y/o DVD, y USB). Durante
el período de recorrido, el usuario puede presionar las teclas (F2, F12 esto dependen de su
computadora) para cambiar la secuencia de carga de su sistema.
6. BIOS lee el primer sector del disco duro, al que se denomina sector de carga y donde reside el
proceso de inicio de carga (bootloader). Una vez que éste es detectado, carga la BIOS y pasa el
control al bootloader, luego se inicia el siguiente nivel en la secuencia de carga.
MBR (Registro Maestro de Carga)
1. Un registro de inicio principal, también conocido como registro maestro de inicio o master boot
record (abreviado MBR) es el primer sector ("sector cero") de un dispositivo de
almacenamiento de datos, como un disco duro, cd, dvd, usb. A veces, MBR se emplea para el
inicio del sistema operativo con bootstrap, otras veces es usado para almacenar una tabla de
particiones y, en ocasiones, se usa sólo para identificar un dispositivo de disco individual,
aunque en algunas máquinas esto último no se usa y es ignorado.
2. En la práctica, el MBR casi siempre se refiere al sector de inicio de 512 bytes, o el sector de
partición de una partición para computadores compatibles con IBM PC. Debido a la amplia
implementación de computadores PC clones, este tipo de MBR se usa mucho, hasta el punto de
ser incorporado en otros tipos de computador y en nuevos estándares multiplataforma para el
particionado y el inicio. Ver siguiente tabla.
Figura 1: Proceso de inicio de
carga en LINUX
4. Almacenamiento de un master boot record estándar
Dirección Descripción
0x0000 Área de código
0x01B8 4 bytes; firma del disco (opcional)
0x01BC 2 bytes; normalmente 0x0000
0x01BE
Tabla de particiones3
primarias, cada entrada es de 16 bytes (esquema
estándar de la tabla de particiones del MBR)
0x01FE 2 bytes; firma del MBR (0x55AA)
3. MBR tiene un tamaño de 512 bytes, divididos en tres componentes:
1. Los primeros 446 bytes son el iniciador de carga primario (sólo código ejecutable).
2. Los siguientes 64 bytes son información de la tabla de particiones.
3. Los últimos 2 bytes son usados como número mágico (validación verificación de MBR).
Primer sector físico del disco (pista cero)
446 bytes Código máquina (gestor de inicio)
64 bytes
Tabla de particiones (4 registros que definen cada una de las
particiones primarias)
2 bytes Firma de unidad de inicio ("55h AAh" en hexadecimal)
Registro de la tabla de particiones - 16 bytes
Offset Descripción
0x00 Binario codificado en decimal
0x01 Más binario, Cabezal, Sector (CHS) del primer sector en la partición.
0x04 Tipo de partición
0x05 Cilindro, Cabezal, Sector (CHS) del último sector de la partición.
3 Una partición de un disco duro es una división lógica en una unidad de almacenamiento (por ejemplo
un disco duro o unidad flash), en la cual se alojan y organizan los archivos mediante un sistema de
archivos. Existen distintos esquemas de particiones para la distribución de particiones en un disco. Los
más conocidos y difundidos son MBR (Master Boot Record) y GPT (GUID Partition Table). Las
particiones, para contener datos tienen que poseer un sistema de archivos. El espacio no asignado en un
disco no es una partición, por lo tanto no puede tener un sistema de archivos. Existen múltiples
sistemas de archivos, con diferentes características, como FAT, NTFS, FAT32, EXT2, EXT3, EXT4,
Btrfs, FedFS, Reise, Reiser4 y otros.
Los discos ópticos (DVD, CD) utilizan otro tipo de particiones llamada Formato de Disco Universal
( UDF o Universal Disc Format), el cual agrega archivos y carpetas y es por ello que es usado por la
mayoría de software de escritura por paquetes, conocidos como programas de grabación de unidades
ópticas. Este sistema de archivos es obligatorio en unidades de (DVD) pero también se admiten en
algunos (CD)
5. 0x08 (4 bytes) Logical block address del primer sector de la partición
0x0C (4 bytes) Longitud de la partición, en sectores
4. Bootloader puede residir en el MBR o en cualquier otra localidad.
5. MBR contiene información de GRUB/LILO y ejecuta su carga.
GRUB (GRand Unified Bootloader)
1. GRUB se carga y se ejecuta en 4 etapas:
1. La primera etapa del cargador la lee el BIOS desde el MBR.
2. La primera etapa carga el resto del gestor de arranque (segunda etapa). Si la segunda
etapa está en una unidad grande, en ocasiones se carga una fase intermedia 1.5, que
contiene código adicional para permitir que los cilindros por encima de 1024, o unidades
tipo LBA, puedan leerse. El gestor de arranque 1.5 es almacenado (si es necesario) en el
MBR o en la partición de arranque.
3. La segunda etapa del gestor de arranque ejecuta y muestra el menú de inicio de GRUB
que permite al usuario elegir un sistema operativo y examinar y modificar los
parámetros de inicio.
4. Después de elegir un sistema operativo, se carga y se le pasa el control.
GRUB soporta métodos de arranque directo, arranque chain-loading, LBA, ext2, ext3, ext4 y hasta "un
pre-sistema operativo en máquinas x86 totalmente basado en comandos". Contiene tres interfaces: un
menú de selección, un editor de configuración y una consola de línea de comandos.
2. GRUB tiene su propio menú e interface y tiene la capacidad de navegar por el sistema de
archivos.
3. Muestra una lista de los núcleos (kernel) disponibles definidos en /etc/grub.conf. Provee las
opciones para elegir uno de ellos sí una imagen múltiple de núcleos está instalada.
Configuración
El archivo de configuración GRUB es /boot/grub/menu.lst. Algunas veces verá referencias a
/etc/grub.conf, pero el archivo no existe en Debian (al menos en mi laptop)
Debe contener, al menos, las siguientes lineas:
default=0
timeout=30
# To boot the default kernel
title Debian LINUX
root (hd0,1)
kernel /boot/vmlinuz root=LABEL=/
initrd /boot/initrd.img
6. Revisión rápida de comandos
•default: SO por defecto a cargar, si no presiona las teclas (F2, F12) para cambiar la secuencia de carga
de su sistema. Note que es la primera linea contiene un 0.
•timeout: tiempo en segundos de espera antes que el sistema operativo por defecto sea cargado.
•Title: Texto que es mostrado en el menú. Inicia una sección de SO hasta que otra linea Title es
encontrada.
•Root: La partición donde el directorio /boot está. Todos los caminos serán relativos a la partición,
así que no es necesario especificarla para cada archivo.
•Kernel: es la imagen del núcleo de LINUX a ser cargada con sus opciones.
•Initrd: es la imagen initrd para cargar el núcleo.
Notar que el comando root no está relacionado con el parámetro root para el núcleo de LINUX. Root
especifica que partición tiene los caminos relativos. Sí tiene una partición /boot en (hd0,0) entonces:
root (hd0,0)
kernel ''vmlinuz root=LABEL=''
es la misma que:
kernel (hd0,0)/vmlinuz
GRUB nombres de dispositivos y particiones
Grub usa números para nombrar discos duros y particiones, empezando con 0. esto confunde un poco
al usuario LINUX para llamar hda1 al primer disco – primera partición. Vea la siguiente tabla.
LINUX grub
First IDE bus, master hda hd0
First IDE bus, master, first primary partition hda1 hd0,0
First IDE bus, slave, first extended partition hdb5 hd1,4
1. GRUB muestra una ventana de inicio y espera pocos segundos para intervenir, si no carga la
imagen por defecto del núcleo.
2. GRUB Bootloader inicia el núcleo y carga la imagen initrd.
Núcleo (Kernel)
1. Mount sistema de archivos root.
2. Núcleo inicia proceso INIT. primer proceso iniciado por el núcleo el cual cual tiene
Process ID4
(PID) de 1.
3. Carga módulo initrd. initrd (disco RAM inicial) es un sistema de archivos temporal root
cargado en la RAM hasta que el sistema de archivos root sea montado.
4 PID es la abreviatura de Process ID es decir es el identificador de un proceso, un numero que identifica de manera
inequívoca a un proceso.
7. INIT
1. INIT (padre de todos los procesos).
2. INIT (abreviatura para inicialización) demonio5
(deamon) que genera los otros procesos.
3. INIT lee el archivo /etc/inittab pro instrucciones para proceder.
4. Aquí el inittab de Debian Wheezy.
# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $
# The default runlevel.
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
# What to do in single-user mode.
~~:S:wait:/sbin/sulogin
# /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
5 La palabra demonio viene de DAEMON (Disk And Execution Monitor) que es un tipo especial de proceso
informático que se ejecuta en segundo plano en lugar de ser controlado directamente por el usuario (es un proceso
no interactivo). Los programadores de Unix adoptaron este nombre para referirse a estos procesos y como son
afectos a las siglas y a los acronimos recursivos extendieron su uso.
8. l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin
# What to do when CTRL-ALT-DEL is pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
# Action on special keypress (ALT-UpArrow).
#kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."
# What to do when the power fails/returns.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop
# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
# <id>:<runlevels>:<action>:<process>
#
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
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
9. # Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3
1. Runs scripts /etc/rc.d/*
Programas Runlevel
Existen 7 runlevel, numerados del 0 al 6, aunque es posible crear más, cada uno tiene su propio
significado en LINUX. Los diferentes niveles son los siguientes:
1. Run Level 0 – Halt (detener)
2. Run Level 1 – Single user mode (modo único usuario)
3. Run Level 2 – Multiuser but without NFS (multiusuario sin NFS)
4. Run Level 3 – Full multiuser mode (Modo multiusuario completo)
5. Run Level 4 – unused / User-definable (no usado/ definible por el usuario)
6. Run Level 5 – X11 (ambiente gráfico)
7. Run Level 6 – reboot (recargar)
De acuerdo con la configuración del nivel de ejecución por defecto, el sistema lee y ejecuta los
programas de los siguientes directorios.
1. Run Level 0 – /etc/rc.d/rc0.d/
2. Run Level 1 – /etc/rc.d/rc1.d/
3. Run Level 2 – /etc/rc.d/rc2.d/
4. Run Level 3 – /etc/rc.d/rc3.d/
5. Run Level 4 – /etc/rc.d/rc4.d/
6. Run Level 5 – /etc/rc.d/rc5.d/
7. Run Level 6 – /etc/rc.d/rc6.d/
/etc/rc0.d/ es enlazado al directorio /etc/rc.d/rc0.d/. Dentro el directorio /etc/rc.d/rc0.d/ puede ver
programas cuyo nombre empieza con S y K lo que significa startup y kill respectivamente. También,
hay un número secuencial a S y K. Estos números son la secuencia programas de inicio a través de
started o killed durante la carga.
El runlevel 0 es la condición de apagado del sistema. La mayoría de computadores actuales se apagan
al llegar a este nivel.
El 1 es conocido como de mono-usuario o usuario único. Suele llamarse modo de rescate (rescue mode
10. o trouble-shooting). En este nivel no ejecuta ningún servicio o demonio. Normalmente es posible
iniciar el sistema en modo rescate desde el GRUB, o añadiendo la palabra single al final de la línea de
comandos del kernel.
Del runlevel 2 al 5 son modos multiusuario, y el modo usado por defecto.
Si 0 es la condición de apagado, 6 es reinicio del sistema. Exactamente igual que el runlevel 0 salvo
que reinicia al terminar la secuencia en lugar de apagar.
¿Dónde residen los Run Level?
Están definidos mediante archivos, como en todo sistema LINUX, se encuentran en el directorio /etc:
/etc/rc0.d Run level 0
/etc/rc1.d Run level 1
/etc/rc2.d Run level 2
/etc/rc3.d Run level 3
/etc/rc4.d Run level 4
/etc/rc5.d Run level 5
/etc/rc6.d Run level 6
Observe el contenido del runlevel 2:
ls /etc/rc2.d/
README S18acpid S18postgresql S20gdm3
S01motd S18acpi-support S18rsync S20pulseaudio
S13rpcbind S18anacron S18speech-dispatcher S20saned
S14nfs-common S18atd S18ssh S21bootlogs
S16acpi-fakekey S18battery-stats S19avahi-daemon S22laptop-mode
S16binfmt-support S18clamav-freshclam S19bluetooth S22minissdpd
S16rsyslog S18cron S19exim4 S22rc.local
S16sudo S18dbus S19network-manager S22rmnologin
S17apache2 S18mysql S20cups S22teamviewerd
Cada archivo es un enlace simbólico a su respectivo script residente en /etc/init.d. Estos scripts
controlan la detención o inicio de un servicio.
El nombre de los enlaces de estos directorios puede ser poco intuitivos al principio, pero vea su
significado, la sintaxis es:
[K | S] + nn + [string]
Es decir, la primera letra del nombre es una K o una S, seguidas de un número de dos dígitos, del 01 al
99 y por último una cadena de texto. La K significa que el servicio será detenido al entrar al runlevel
(Kill), la S para iniciarlo (Start). El número indica la prioridad del servicio dentro del runlevel, por
ejemplo, S02apache y S01php inicia primero php y luego apache. Si dos servicios tienen el mismo
orden de prioridad numérico, se procede en orden alfabético.
11. ¿Cómo determinar en qué runlevel se encuentra el sistema?
El comando runlevel muestra el último runlevel que fue ejecutado, y el actual:
runlevel
N 2
N significa Nada, informando que no ha habido cambio de runlevel desde que inició el sistema, 2 es el
runlevel actual.
Para ir de un runlevel a otro ejecute el comando telinit seguido del número del runlevel deseado.
Aunque sea correcto, se recomienda no apagar o reiniciar el sistema cambiando a los runlevel 0 o 6.
¿Cómo agregar un servicio a un runlevel?
Si desea agregar un servicio a un runlevel deberemos usar el comando update-rc.d. Sí requiere que
nginx o Apache se ejecuten en cada inicio del sistema, basta con agregarlos a los runlevel 2-5,
correspondientes al modo multiusuario:
# update-rc.d nginx start 90 2 3 4 5 . stop 01 0 1 6 .
El 90 es el número de prioridad para el inicio (S90nginx) aplicado a los runlevles 2-5, 01 para la
prioridad de detención (K01nginx) en los runlevel 0 1 y 6. Lo más sencillo es aplicar los valores por
defecto con
# update-rc.d nginx defaults
Referencias
1. ↑ Ohloh Analysis Summary - GNU GRU.
2. ↑ Sitio oficial de GNU GRUB (en inglés)
3. ↑ GRUB Manual - 1.2 Grub History (en inglés)
4. ↑ Página del Proyecto PUPA (en inglés)
5. ↑ GRUB 2 en Ubuntu 9.10 Karmic Koala
Enlaces externos
• Configuración de GRUB, una guía básica (para GRUB Legacy)
• GAG, Gestor de Arranque Gráfico
• GNU GRUB Manual 1.99 (en inglés)
• GRUB - Guía Ubuntu
• GrubWiki Command List (Comandos para ambas versiones de GRUB, en inglés)
• Grub from the Ground Up (en inglés)
• Recuperar GRUB - Guía Ubuntu
• GRUBack: utilidad para recuperar GRUB sin salir de Windows
• LILO homepage (en inglés).
• LILO mini-HOWTO (en inglés).
• LILO error messages (en inglés).