Linux #02.07 Arranque y Servicios en Linux

Niveles de Arranque y Servicios
Fichero /Etc/Inittab
Comando Init
Arranque del Sistema con Diskete
Configuración del Gestor de Arranque LILO
Configuración del Gestor de Arranque GRUB

Niveles de Arranque y Servicios

Linux utiliza el arranque INIT de Sys; init es el primer proceso que se ejecuta en el sistema, del cual dependen los demás. Es importante conocer el funcionamiento de los llamados niveles de ejecución(o runlevels), y en los servicios que se proporcionan en cada nivel.

Un servicio es una funcionalidad proporcionada por la máquina. Se activan y se paran a través de scripts. La configuración de los servicios se suele tener en el directorio /etc, los scripts están en /etc/init.d/, aquí podemos encontrar scripts con nombres parecidosa los servicios y suelen aceptar parámetros de activación y parada.

/etc/init.d/servicio start arranque del servicio.

/etc/init.d/servicio stop parada del servicio.

/etc/init.d/servicio restart parada y posterior arranque del servicio.

Cuando arrancamos un sistema GNU/Linux se arranca el kernel y a continuación se arranca el proceso init, que es el encargado de ejecutar y activar el resto del sistema a través de unos niveles de ejecución.

Nota: Se llama nivel de ejecución a la configuración de programas y servicios que serán ejecutados orientados a un determinado funcionamiento.

Runlevel Función Descripción (Ver fotografía)

Estos niveles suelen estar configurados en los sistemas GNU/Linux (y UNIX) por dos sistemas diferentes, el BSD, o el System V.

El modelo runlevel de System V, utiliza un fichero de configuración llamado /etc/inittab para decidir el runlevel del cual vamos a arrancar el sistema.

Según el runlevel escogido el sistema dispone de otros ficheros contenidos en /etc/rcn.d, donde n es el número de runlevel, en donde se encuentra la lista de servicios por activar o parar. Dentro de estos directorios se encuentran una serie de scripts o enlaces a scripts de los servicios.

Los scripts tienen un nombre relacionado con el servicio, una S o K inicial que indica si es el script para iniciar (S) o matar (K) elservicio, y un número que refleja el orden en que se ejecutarán los servicios.

Existen algunos comandos que sirven para manejar los niveles de ejecución.

  • Los scripts del directorio /etc/init.d/ nos permiten arrancar, parar o reiniciar servicios individuales.
  • telinit, permite cambiar el nivel de ejecución, únicamente habrá que indicar el número. Por ejemplo si tuviéramos que hacer una tarea como root, sin usuarios trabajando, haríamos un telinit 1, y pasamos al modo monousuario. Para volver al modo multiusuario pondremos telinit 3. También puede utilizarse el comando init para la misma tarea.
  • shutdown, permite parar (’h’ de halt) o reiniciar el sistema (’r’ de reboot).
  • wall, permite enviar mensajes de advertencia a los usuarios del sistema.
  • pidof, permite averiguar el PID (process ID) asociado a un proceso.

Respecto a todo el modelo de arranque, las distribuciones presentan algún pequeño cambio:

  • Red Hat: el runlevel 4 no tiene un uso declarado. Los directorios son: /etc/rc.d/rcn.d. El runlevel por defecto es el 5 con arranque con X.

En el fichero /etc/sysconfig se encuentran los archivos que especifican valores por defecto de la configuración de dispositivos o servicios. El guión /etc/rc.d/rc.sysinit es invocado cuando el sistema arranca; el guión /etc/rc.d/rc.local se invoca cuando finaliza el proceso de carga y sirve para indicar configuraciones específicas de la máquina.

El arranque de los servicios se hace por medio de los scripts almacenados en /etc/rc.d/init.d. Red Hat proporciona unos scripts de utilidad para manejar servicios: /sbin/service para parar o iniciar un servicio por el nombre; y /sbin/chkconfig, para añadir enlaces a los ficheros S y K necesarios para un servicio.

  • Debian dispone de comandos de gestión de los runlevels como updaterc.d, permite instalar o borrar servicios arrancándolos o parándolos en otros runlevels.

El runlevel por defecto en Debian es el 2, el X Window System no se gestiona desde /etc/inittab, existe el gestor como un servicio más del runlevel 2.

Fichero /etc/inittab

Para Init es necesario un fichero de configuración que le indique lo que debe hacer, /etc/inittal. Este fichero contiene información del nivel por defecto a ejecutar, previsión ante determinadas situaciones, describe los procesos que se cargan en el inicio y arranque.

/etc/inittab tienen el siguiente formato:

Id:Niveles_Ejecución: Acción:Proceso

  • id: Una secuencia única de 1 a 4 caracteres que identifican la entrada de inittab
  • niveles_ejecución: Lista de niveles de ejecución para los que se llevarán a cabo las acciones definidas a continuación en la línea.
  • acción: La acción se llevará a cabo.
  • proceso: El proceso a ejecutar.

Las acciones que podemos definir en el campo acción son:

initdefault: Especifica el nivel de ejecución por defecto al arrancar el sistema.

Respawn: El proceso se reiniciará cuando termine.

once: El proceso se ejecutará una sola vez cuando se entre en el nivel de ejecución especificado.

wait: El proceso se iniciará una vez cuando se entre en el nivel de ejecución e init esperará a su terminación.

boot: El proceso se ejecutará durante el arranque del sistema.

bootwait: El proceso se ejecutará durante el arranque del sistema, mientras init espera su terminación.

sysinit: El proceso se ejecutará durante el arranque del sistema, antes que cualquier entrada boot o bootwait. El campo niveles_ejecución se ignora.

powerwait: El proceso se ejecutará si init recibe una señal SIGPWR, que indica algún  problema con la alimentación eléctrica. Init esperará que el proceso termine.

powerfail: Como powerwait, excepto que init no espera a que termine el proceso.

powerokwait: El proceso se ejecutará si init recibe la señal SIGPWR, con la condición de que haya un fichero llamado /etc/powerstatus que contenga la palabra OK. Esto significa que se ha restablecido la alimentación eléctrica.

ctrlaltdel: Especifica qué proceso se ejecutará al pulsar la combinación de teclas [Ctrl+Alt+Supr]. Normalmente, reiniciar la máquina.

Comando Init

Podemos ejecutar init desde línea de comandos con alguno de los siguientes argumentos:

0, 1, 2, 3, 4, 5, 6: Para cambiar al nivel de ejecución especificado.

Q, q: Si queremos que init relea el fichero /etc/inittab.

S, s: Entra en modo monousuario.

U, u: Reejecuta init respetando el estado actual. No se relee el fichero /etc/inittab.

02.07

Arranque del Sistema con Disquete

Es posible arrancar Linux utilizando un «disquete de arranque» que contiene una copia del núcleo de Linux. Este núcleo tiene la partición raíz de Linux codificada en él, para que sepa donde buscar en el disco duro el sistema de ficheros raíz. (El comando rdev puede ser utilizado para poner la partición raíz en la imagen del núcleo; ver más adelante.) Por ejemplo, este es el tipo de disquete creado por Slackware durante la instalación.

Para crear su propio disquete de arranque, localice en primer lugar la imagen del núcleo en su disco duro. Debe estar en el fichero /Image o /etc/Image. Algunas instalaciones utilizan el fichero /vmlinux para el núcleo. En su lugar, puede que tenga un núcleo comprimido. Un núcleo comprimido se descomprime a si mismo en memoria en tiempo de arranque, y utiliza mucho menos espacio en el disco duro. Si se tiene un núcleo comprimido, puede encontrarse en el fichero /zImage o /etc/zImage. Algunas instalaciones utilizan el fichero /vmlinuz para el núcleo comprimido.

Una vez que se sabe donde está el núcleo, hay que poner el nombre de la partición raíz de un dispositivo raíz en la imagen del núcleo, utilizando el comando rdev. El formato de este comando es:

rdev<nombre-de-nÚcleo><dispositivo-raÍz></dispositivo-raÍz></nombre-de-nÚcleo>

<nombre-del-nÚcleo>es el nombre de la imagen del núcleo</nombre-del-nÚcleo>

<dispositivoraÍz>es el nombre de la partición raíz de Linux</dispositivoraÍz>

Ejemplo: para hacer que el dispositivo raíz en el núcleo /etc/Image sea /dev/hda2:

# rdev /etc/Image /dev/hda2

rdev también puede poner otras opciones en el núcleo, como puede ser el modo SVGA por defecto a utilizar en tiempode arranque. Tan sólo utilice «rdev -h» para obtener un mensaje de ayuda.

Una vez puesto el dispositivo raíz, tan sólo hay que copiar la imagen del núcleo al disquete. Siempre que se copia datos a un disquete, es una buena idea formatear previamente el disquete en MS-DOS. Esto establece la información de pista y sector en el disquete con la que puede detectarse como de alta o baja densidad.

Ejemplo: copiar el núcleo en el fichero /etc/Image al disquete en /dev/fd0

# cp /etc/Image /dev/fd0

Este disquete debe arrancar ahora Linux.

Configuración del Gestor de Arranque Lilo

Otro método de arranque es utilizar LILO, un programa que reside en el sector de arranque del disco duro. Este programa se ejecuta cuando el sistema se inicia desde el disco duro, y puede arrancar automáticamente Linux desde una imagen de núcleo almacenada en el propio disco duro.

LILO puede utilizarse también como una primera etapa de carga de varios sistemas. Cuando se arranca utilizando LILO, se inicia el sistema operativo por defecto, a menos que pulse |_ctrl_|, |_alt_|, o |_shift_|durante lel arranque.

En caso que pulse cualquiera de dichas teclas se presentará un indicador de arranque, donde debe teclear el nombre del sistema operativo a arrancar (como puede ser «linux» o «msdos»). Si se pulsa la tecla |_tab_|en el indicador de  arranque, se le presentará una lista de los sistemas operativos disponibles.

La forma más simple de instalar LILO es editar el fichero de configuración, /etc/lilo.conf, y ejecutar el comando # /sbin/lilo

El fichero de configuración de LILO contiene un párrafo para cada sistema operativo que se pueda querer arrancar.

Ejemplo: Fichero /etc/lilo.conf

# File generated by DrakX/drakboot

# WARNING: do not forget to run lilo after modifying this file
default=»linux» # Sistema operativo que salta por defecto

# Opciones del arranque

boot=/dev/hda

map=/boot/map

keytable=/boot/es-latin1.klt

prompt

nowarn

timeout=100

message=/boot/message

menu-scheme=wb:bw:wb:bw

#Mandrake 10.1

image=/boot/vmlinuz

label=»linux»

root=/dev/hda6

initrd=/boot/initrd.img

append=»acpi=ht resume=/dev/hda5 splash=silent»

vga=788

read-only

#Linux-nonfb

image=/boot/vmlinuz

label=»linux-nonfb»

root=/dev/hda6

initrd=/boot/initrd.img

append=»acpi=ht resume=/dev/hda5″

read-only

image=/boot/vmlinuz-2.4.27-0.pre2.1mdk

label=»2427-0pre21″

root=/dev/hda6

initrd=/boot/initrd-2.4.27-0.pre2.1mdk.img

append=»devfs=nomount acpi=ht resume=/dev/hda5

plash=silent»

vga=788

read-only

image=/boot/vmlinuz

label=»failsafe»

root=/dev/hda6

initrd=/boot/initrd.img

append=»failsafe acpi=ht resume=/dev/hda5″

read-only

#Windows

other=/dev/hda1

label=»windows»

table=/dev/hda

Configuración del Gestor de Arranque Grub

GNU GRUB es un gestor de arranque muy potente, capaz de arrancar un amplio abanico de sistemas operativos libres y otros.

Una de las facetas importantes de GRUB es su flexibilidad; GRUB entiende sistemas de ficheros y formatos ejecutables del núcleo, por lo que permite arrancar cualquier sistema operativo.

NOMENCLATURA

La sintaxis de dispositivos usada en GRUB es algo diferente a las que se puedan haber visto.

Ejemplos:

(fd0) :Requiere que se encierre el nombre del dispositivo entre paréntesis’. “fd” significa es que se trata de un disquete (floppy disk). El numero “0” es el número de la unidad, empezando a contar desde cero. La expresión significa que GRUBusará todo el disquete.

(hd0,1): “hd” indica un disco duro (hard disk). “0” número de la unidad, es decir, que se trata del primer disco duro, el “1” indica el número de la partición. Los números de partición se cuentan desde cero y no desde uno. La expresión representala segunda partición de la primera unidad de disco duro. En este caso, GRUB usa una partición del disco y no el disco entero.

(hd0,4): Esto indica la primera partición lógica de la primera unidad de disco.

Para poder acceder a discos o particiones, necesitas especificar el dispositivo mediante una instrucción, como `root (fd0)’ o `unhide (hd0,2)’. Para ayudarte a averiguar qué número es una partición que quieres, las opciones de la línea de órdenes auto-completan los argumentos.

Advierte que GRUB no distingue entre IDE y SCSI – simplemente cuenta las unidades desde cero sin que importe su tipo. Por lo general, el número de una unidad IDE es menor que el de una SCSI, aunque esto no se cumpliría si cambias la secuencia de arranque intercambiando las unidades IDE y SCSI en la BIOS.

Vamos a ver como se especifica esto en un archivo a partir del fichero.

Ejemplo:

(hd0,0)/vmLinuz: Esto especifica un archivo llamado `vmlinuz’ en la primera partición del primer disco duro. Nóta que también se pueden auto completar los nombres de archivo.

INSTALACIÓN

Necesitamos instalar GRUB debes instalarlo en tu disco. Existen dos formas de conseguirlo – usando la aplicación grub-install en un SO tipo UNIX, o mediante una Etapa 2 nativa. Ambas son bastante similares, sin embargo, es posible que la aplicación escoja una unidad equivocada de la BIOS así que conviene ser precavido.

Asimismo, si instalas GRUB en un SO tipo UNIX, asegúrate de tener un disco de arranque de emergencia a mano, para poder rescatar el ordenador en caso de que, por algún motivo, el disco duro quedara inservible (no pudiera arrancarse).

GRUB viene con imágenes de arranque, que se instalan en el directorio `/src/share/grub/i386-pc’. Es necesario copiar los archivos `stage1′, `stage2′ y `*stage1_5′ al directorio `/boot/grub’. Se llama directorio de imágenes y directorio de arranque al directorio donde se instalan las imágenes de GRUB y al directorio que GRUB usa para encontrarlas.

Crear un Diskete de Arranque Grub

Se necesita tomar los archivos `stage1′ y `stage2′ del directorio de imágenes, y escribirlos en el primer y segundo bloque de un disquete.

Precaución: Este método destruye cualquier dato que esté guardado en el disquete.

En UNIX esto se puede hacer con las órdenes siguientes:

# cd /usr/share/grub/i386-pc

# dd if=stage1 of=/dev/fd0 bs=512 count=1 1+0 records in 1+0 records out

# dd if=stage2 of=/dev/fd0 bs=512 seek=1 153+1 records in 153+1records out

Instalar Grub Nativamente

Precaución: Instalar la Etapa 1 de GRUB de esta manera borrará el sector de arranque normal de un SO.

GRUB puede arrancar directamente GNU Mach, Linux, FreeBSD, NetBSD y OpenBSD, por lo que usarlo no debería dar problemas. Aunque es buena idea hacer una copia de seguridad del primer sector de la partición en la que vayas a instalar la etapa 1 de GRUB. Si instalas GRUB en el primer sector del disco duro no es tan importante tomar precauciones, ya que es fácil restaurarlo (por ejemplo, usando `FDISK /MBR’ desde DOS).

Instalar GRUB de manera nativa en el sistema es recomendable. Se necesita hacer un disquete de arranque de GRUB y arrancar el ordenador con él.

Lo primero es fijar el directorio de arranque como dispositivo raíz de GRUB:

grub> root (hd0,0)

Si no estás seguro de cual es la partición que contiene los archivos, puedes usar la orden find de la manera siguiente:

grub> find /boot/grub/stage1

Esto busca el archivo `/boot/grub/stage1′ y lista los dispositivos que lo contienen.

Una vez que has fijado correctamente el directorio raíz, utiliza la orden setup:

grub> setup (hd0)

Esta orden instala GRUB en el MBR de la primera unidad. Si lo que quieres es instalar GRUB en el sector de arranque de una partición en vez de en el MBR, especifica la partición en la que quieres instalar GRUB:

grub> setup (hd0,0)

Si instalas GRUB en una partición o en una unidad que no sea la primera, tendrás que arrancar en cadena a GRUB desde otro gestor de arranque.

Los ficheros que intervienen en la configuración del GRUB son dos:

/boot/grub/menu.lst: Le indicamos donde están las imágenes.

/etc/fstab: Para montar nuestra particion en el arranque.

Ejemplo:

Fichero /boot/grub/menu.lst

# menu.lst GRUB

timeout 10

default 0

#Windows

title Windows

root (hd0,0)

chainloader +1

#Mandrake 10.1

title Linux

kernel (hd0,5)/boot/vmlinuz root=/dev/hda6 acpi=ht resume=/dev/hda5 splash=verbose vga=788

initrd (hd0,5)/boot/initrd.img

#Knoopix

title Knoppix

kernel (hd0,6)/boot/vmlinuz root=/dev/hda7

initrd (hd0,6)/boot/initrd.img

title linux-nonfb

kernel (hd0,5)/boot/vmlinuz root=/dev/hda6 acpi=ht resume=/dev/hda5

initrd (hd0,5)/boot/initrd.img

title 2427-0pre21

kernel (hd0,5)/boot/vmlinuz-2.4.27-0.pre2.1mdk root=/dev/hda6 devfs=nomount acpi=ht resume=/dev/hda5 splash=silent vga=788

initrd (hd0,5)/boot/initrd-2.4.27-0.pre2.1mdk.img

title failsafe

kernel (hd0,5)/boot/vmlinuz root=/dev/hda6 failsafe acpi=ht resume=/dev/hda5

initrd (hd0,5)/boot/initrd.img

Fichero /etc/fstab

/dev/hda6 / reiserfs notail 1 1 #Mandrake 10.1

/dev/hdb /mnt/cdrom auto umask=0,user,iocharset=iso8859-15,codepage=850,noauto,ro,exec,users 0 0

/dev/hdc /mnt/cdrom2 auto umask=0,user,iocharset=iso8859-15,codepage=850,noauto,ro,exec,users 0 0

none /mnt/floppy supermount dev=/dev/fd0,fs=ext2:vfat,–,umask=0,iocharset=iso8859-15,sync,codepage=850 0 0

/dev/hda1 /mnt/win_c ntfs umask=0,nls=iso8859-15,ro 0 0 #Windows

/dev/hda8 /mnt/win_d vfat umask=0,iocharset=iso8859-15,codepage=850 0 0 none /proc proc defaults 0 0

/dev/hda5 swap swap defaults 0 0

Ahora ya puedes arrancar GRUB sin usar un disquete.

Nota: Algunas distribuciones GNU/Linux, poseen herramientas gráficas para la configuración del gestor de arranque, que facilitan la tarea.

Resumen

  • Linux utiliza el proceso de arranque init de Sys V.
  • Un servicio es una funcionalidad proporcionada por la máquina. La activación o parada de servicios se realiza mediante la utilización de scripts.
  • La mayoría de los servicios estándar, los cuales suelen tener su configuración en el directorio /etc, suelen controlarse mediante los scripts presentes en /etc/init.d/.
  • Un nivel de ejecución es sencillamente una configuración de programas y servicios que se ejecutarán orientados a un determinado funcionamiento.
  • Los niveles de ejecución son 7, numerados del 0-6.
  • El comando init se puede utilizar desde línea de comandos para cambiar de nivel de ejecución.
  • Los gestores de arranque para un sistema GNU/Linux, son LILO y GRUB.
  • El fichero de configuración del gestor de arranque LILO es /etc/lilo.conf.