Capítulo 5. Administración de Linux en computadores aislados

Tabla de contenidos
Inicialización del sistema
Kernel y módulos
Hardware básico y Linux
Dispositivos y Linux
Instalación de Debian
Localización y configuración de algunos programas

Público y logros

Administrador de Red del colegio quién solucionará problemas cuando se presenten o instalará la plataforma de referencia en computadores fuera de red.

Inicialización del sistema

Indicadores de Logros:

Lectura: Inicialización del sistema

Un aspecto que un administrador de un sistema Linux debe considerar en ocasiones, es la secuencia de inicialización del sistema. Esto puede servir para iniciar junto con el sistema servicios importantes (especialmente si el computador se emplea como servidor), para eliminar servicios que no se usen y así aprovechar mejor los recursos o para afinar algunos detalles que afectarán a todos los usuarios del sistema. Por otra parte algunas fallas que pueden ocurrir en un sistema Linux pueden deberse a una secuencia de inicialización errada y para solucionarlas puede ser necesario seguirla de cerca.

Secuencia de inicio

Al iniciar un computador con Linux ocurren gran cantidad de procesos, deben ocurrir en un orden preciso porque unos dependen de otros (e.g. el cargador de arranque requiere la BIOS, el kernel requiere la inicialización que hace el cargador de arranque, los módulos requieren el kernel operando, las librerías y programas requieren el kernel y los módulos para interactuar con el usuario).

A grandes rasgos la secuencia de inicialización es:

Programa que está en memoria ROM que inicializa y maneja a bajo nivel el hardware y que inicia un cargador de arranque.

Programa que permite al usuario escoger el sistema operativo al cual entrar y carga el kernel del mismo.

Nombre en español de un programa que controla un tipo específico de hardware o un servicio. En inglés sería driver.

Nombre en español de un controlador que puede cargarse dinámicamente (i.e. cuando el kernel ya está en operación) y que permite así optimizar el uso de la memoria.

  1. Un programa mantenido de forma permanente en memoria del computador (BIOS [1]) inicializa varios aspectos del hardware, después de acuerdo a su configuración carga el primer sector de un disquete o de un disco duro [2] o de un CD-ROM y ejecuta el programa que allí se encuentra. Si el disquete/ disco/CD-ROM permite arrancar un sistema operativo tal programa se llama un cargador de arranque [3].

    Algunos aspectos configurables de la BIOS se mantienen en un tipo de memoria especial (e.g. EPROM que, usando una pila, puede mantener datos cuando el computador está desconectado), pueden configurarse empleando un programa[4].

  2. Algunos cargadores de arranque (como LILO o GRUB) pueden permitir al usuario escoger el sistema operativo al cual desea entrar (cuando en el mismo computador haya varios), y carga el kernel del sistema escogido, eventualmente pasando parametros dados por el usuario (ver Parámetros desde el cargador de arranque) [5]. Para sistemas Linux hay varios cargadores de arranque, los más conocidos son LILO y GRUB. También es posible arrancar un sistema Linux desde DOS con el cargador loadlin.

  3. Si el sistema escogido es Linux, el cargador de arranque, carga el kernel de este sistema. El kernel detecta algunos detalles del hardware (como el procesador, cantidad de memoria y algunos dispositivos), procesa parametros recibidos del cargador de arranque, inicializa algunos aspectos del hardware, prepara áreas de memoria, prepara el sistema de archivos virtual (ver Sistemas de archivos en Linux), prepara el sistema de módulos y lanza como primer proceso /sbin/init (a menos que se haya especificado otro programa como parámetro ver Parámetros desde el cargador de arranque). Varios de los mensajes que el kernel produce durante esta etapa pueden ser revisados en el archivo /var/log/dmesg y con el programa dmesg.

    Como los dispositivos de cada computador son diferentes, el kernel cuenta con controladores [6] para muchos tipos de hardware diferente (tanto para hardware muy antiguo, como para hardware muy nuevo) y para no ocupar tanto espacio en memoria el kernel emplea un sistema de módulos. Si todos los controladores para todos los tipos de hardware que el kernel soporta, se incluyeran directamente en el kernel (i.e estaticamente) desde el arranque, el kernel requeriría bastante memoria RAM (un kernel 2.2.18 con módulos requiere más de 13MB) y la gran mayoría de ese espacio no sería usado, sólo serían usadas las partes que controlan los dispositivos particulares de su computador.

    Un módulo es una parte del kernel que puede cargarse, usarse o quitarse después de que el kernel está funcionando. Algunos módulos ofrecen servicios (e.g soporte para cierto sistemas de archivos) y otros son controladores para hardware específico (por ejemplo hay módulos para tarjetas de sonido, para tarjetas de red, etc.). Durante el proceso de inicialización del sistema, algunos dispositivos son detectados y los módulos apropiados son cargados, sin embargo como se explica en este capítulo algunos dispositivos no pueden ser detectados o configurados automáticamente e incluso algunos no son soportados.

  4. Los scripts de este directorio son ejecutados por /sbin/init durante el arranque antes de ejecutar los del nivel configurado

    El programa /sbin/init, que normalmente es el primer proceso ejecutado por el kernel completa la secuencia de inicialización ejecutando los procesos de un nivel de ejecución. El nivel de ejecución se asocia con un número entre 0 y 6, o bien con 'S' de forma que el administrador puede configurar cada nivel de ejecución para que inicie procesos diferentes. Durante un arranque normal init ejecutará primero los procesos del nivel S (scripts del directorio /etc/rcS.d en orden). Estos scripts emplean algunas variables definidas en /etc/default/rcS para inicializar dispositivos y programas. A continuación presentamos la secuencia configurada en un sistema Debian recién instalado, posiblemente no entenderá todos los términos que serán introducidos en este y el próximo capítulo: instala el mapa de teclado (por defecto /etc/console-tools/default.kmap.gz que usted puede modificar de ser necesario), activa swap, revisa y de ser necesario monta la partición raíz y monta el directorio virtual /proc, configura dispositivos ISA Plug and Play de acuerdo a al archivo /etc/isapnp.conf, calcula dependencias entre módulos y carga los módulos y argumentos especificados en /etc/modules, chequea los demás sistemas de archivos que tengan inconsistencias o que hayan alcanzado la cuenta de montajes antes del chequeo [7], configura variables del kernel especificadas en /etc/sysctl.conf, configura puertos seriales con la última configuración usada, prepara dispositivos dinámicos /dev/pts [8], monta particiones locales y prepara zonas de intercambio, en sistemas que usan PPP limpiar cache de DNS, establece el nombre de la máquina tomandolo de /etc/hostname, activa interfaces de red empleando la configuración de /etc/network/interfaces y /etc/network/options, inicia interfaces que requieran BOOTP o DHCP, activa portmap, monta directorios remotos (con nfs, smb, o ncp), configura fuentes por usar en consolas virtuales [9], ajusta la hora del sistema y realiza otras labores de limpieza y mantenimiento rutinarias.

  5. En este archivo se configura el nivel de ejecución

    Después de ejecutar scripts del nivel S, init ejecuta los del nivel de ejecución configurado (el nivel se configura en el archivo /etc/inittab en una línea que dice initdefault). Por defecto es el nível 2 cuyos scripts están en el directorio /etc/init.d/rc2.d.

  6. Programa empleado para esperar llegada de nuevos usuarios e iniciar sesiones tipo texto, por ejemplo en consolas virtuales.

    A menos que se haya cambiado la configuración de /sbin/init, a continuación se ejecutan los scripts del nivel configurado, se inician terminales tty [10] en diversas consolas virtuales (por defecto en Debian de la 1 a la 6) que permiten a los usuarios iniciar sesiones tipo texto con el intérprete de comandos (ver Lectura Sistema de usuarios y manejo de clave). Para iniciar esas terminales usa el programa getty (ver Inicio de sesiones en consolas virtuales).

  7. Administrador de vistas de X-Window. Espera nuevos usuarios y les permite iniciar sesiones gráficas

    Si X-Window está configurado y si hay instalado un administrador de vistas [11] ---como xdm, kdm o gdm--- el último script del nivel 2 iniciará X-Window en la consola virtual 7 y permitirá a los usuarios iniciar sesiones gráficas con su login y clave (ver Inicio de sesiones X-Window).

Configuración de los niveles de ejecución

A menos que se especifique un proceso inicial diferente desde el cargador de arranque (con el parámetro init ver Parámetros desde el cargador de arranque por defecto el primer proceso es /sbin/init. Este programa lee el archivo de configuración /etc/inittab para iniciar otros procesos organizados en niveles de ejecución y con ellos el resto del sistema operativo.

Primer programa cargado por el kernel Linux, encargado de continuar el proceso de inicialización o de cambiar el nivel de ejecución.

Cada línea del archivo /etc/inittab puede ser un comentario (si comienza con el caracter '#') o de la forma:


id:niveles:método:comando
Donde id es una identificación arbitraria de hasta de 4 letras, niveles indica el nivel o los niveles en los cuales se aplica, comando es el comando por ejecutar y método permite especificar la forma de iniciarlo o circunstancias bajo las cuales iniciarlo [12]

En un sistema que ya esta inicializado se puede emplear el programa /sbin/init (o /sbin/telinit) para cambiar el nivel de ejecución, especificando el nuevo nível como parámetro (e.g /sbin/init 1 ver Encendido).

Con esta letra comienzan scripts de un directorio para un nivel de ejecución (por ejemplo /etc/rc2.d) que /sbin/init debe ejecutar al entrar a ese nivel.

En Debian un nivel de ejecución es una configuración del sistema en la que sólo están presentes ciertos procesos, tales procesos son iniciados por scripts en un directorio particular (e.g /etc/rc2.d para el nivel 2). Los nombres de algunos de esos scripts comienzan con la letra 'S', esos son ejecutados cuando el sistema entra al nivel, los que comienzan con la letra 'K' son ejecutados cuando se sale del nivel (después de la letra 'S' o 'K' sigue un número de dos digitos que especifica el orden en el cual se ejecutan ---primero los de menor número---). Al entrar a un nivel los scripts 'S' son ejecutados con el parámetro "start", mientras que al salir los scripts 'K' se ejecutan con el parámetro "stop". Los niveles normales son:

0

Este nivel de ejecución es empleado para detener el sistema

Nivel para detener el sistema, es el nivel al que entra con los comandos halt o shutdown -r (ver Apagado y encendido de una red). Sus scripts están en el directorio: /etc/rc0.d.

1

Este nivel de ejecución es apropiado para un sólo usuario, sin conexión a red (modo mono-usuario).

Modo mono usuario [13], apropiado para ciertas tareas administrativas. Entrará a este nivel con el comando shutdown). Sus scripts están en /etc/rc1.d.

2-5

Operación normal multi usuario. Scripts en /etc/rcx.d (con un digito de 2 a 5 en lugar de x).

6

Este nivel de ejecución es empleado para reiniciar el sistema por reboot y shutdown.

Reinicio [14]. Entrará a este nivel con los comandos reboot o shutdown -r. Scripts en /etc/rc6.d.

Número que representa un conjunto de procesos que deben correr en una configuración del sistema, procesos iniciados por scripts de directorios de la forma /etc/rcx.d.

En este directorio están los scripts que pueden usarse para iniciar o terminar procesos o realizar tareas al arranque o cierre del sistema. En los directorios de los diversos niveles de ejecución hay enlaces a los scripts de este directio.

Los scripts de /etc/init.d normalmente reciben esta opción cuando son ejecutados al iniciar el nivel de ejecución.

Los archivos de los directorios /etc/rcx.d son enlaces a scripts del directorio /etc/init.d, esos scripts tiene el nombre del paquete (ver Paquetes en Debian) al que pertenecen y pueden recibir como parámetro: start, stop, restart (detener y reiniciar), force-reload (volver a leer archivos de configuración sin detener o de no ser posibile detener y reiniciar). Pueden crearse directamente con ln o en Debian con el programa update-rc.d, por ejemplo:


update-rc.d xdm start 99 2 3 4 5 . stop 20 0 1 6

que indica que el script xdm (el cual debe estar en /etc/init.d) debe ser ejecutado al entrar a los niveles 2, 3, 4 y 5 con prioridad 99 ( última). Así como cuando el sistema termina normalmente (con halt o reboot) o cuando sale de modo monousuario.

Script de Debian para agregar enlaces en los niveles de ejecución a archivos del directorio /etc/init.d.

Lecturas recomendadas: Inicialización del sistema

  • Páginas man de init, inittab, update-rc.d.

  • Puede consultarse otra explicación del proceso de inicialización en el Capítulo 7 de "The Linux System Administrators' Guide (Version 0.6.2)" disponible en http://www.tldp.org/LDP/sag/x1901.html.

Ejercicios: Inicialización del sistema

1. ¿Qué proceso tiene el identificador 1 en un arranque normal? (puede usar ps ax si requiere ayuda).
2. Identifique el script en el que se monta el directorio virtual /proc durante el arranque.
3. De forma análoga a la descripción de los scripts del nivel S presentado en esta sección, describa lo que hacen los scripts del nível de ejecución 2.
4. Agregue en el nivel de ejecución 3 un script que le envie un correo a su cuenta de usuario con la fecha y hora.
5. Cambie al nivel de ejecución 3 y compruebe que el script que creo en el punto anterior funciona.

1. ¿Qué proceso tiene el identificador 1 en un arranque normal? (puede usar ps ax si requiere ayuda).

/sbin/init

2. Identifique el script en el que se monta el directorio virtual /proc durante el arranque.

/etc/rcS.d/S10checkroot.sh

3. De forma análoga a la descripción de los scripts del nivel S presentado en esta sección, describa lo que hacen los scripts del nível de ejecución 2.

Se inicia syslogd que maneja bitácoras, se inicia kerneld que puede cargar módulos por demanda, si el sistema usa PPP y existe el archivo /etc/ppp/ppp_on_boot con información apropiada se conecta a un ISP, inicia servidor de nombres, inicia programas usados por NFS, inicia servidor de correo, ratón y servicios en red configurados en /etc/inetd, se inicia logoutd para evitar ingreso a ciertos usuarios a ciertas horas, se inicia cola de impresión, se crea el enlace /dev/MAKEDEV de /sbin/MAKEDEV, se inicia el servidor de SSH, inicia servidor de fuentes para X11, inicia el servidor de NFS, inicia atd que maneja tareas iniciadas con at, inicia cron, elimina /etc/nologin --que había sido creado en el nivel S para no permitir accesos durante el arranque, inicia el administrador de vistas.

4. Agregue en el nivel de ejecución 3 un script que le envie un correo a su cuenta de usuario con la fecha y hora.

Crear un script (digamos mailboot) en /etc/init.d con:


	 date | mail usuario@localhost
Después ejecutar update-rc.d mailboot start 99 3

5. Cambie al nivel de ejecución 3 y compruebe que el script que creo en el punto anterior funciona.

Dos posibilidades: init 3 o cambiar en /etc/inittab el nivel por defecto a 3 ---después restablecer el 2.

Notas

[1]

BIOS es sigla de Basic Input Output System.

[2]

El primer sector de un disco duro tiene la tabla de particiones.

[3]

Cargador de arranque: del inglés boot loader.

[4]

En PCs el programa para configurar la BIOS normalmente está incluido en la BIOS misma y puede ejecutarse tras encender el computador presionando alguna tecla (e.g. Del o F1).

[5]

Además de los parámetros single y init=programa pueden emplearse parámetros específicos para módulos compilados estáticamente en el kernel y otros generales como ro o rw para montar la raíz en modo de sólo lectura o de escritura y lectura respectivamente, root=dispositivo para especificar el dispositivo para montar como raíz, debug o quiet para que el kernel muestre el máximo o el mínimo de mensajes informativos. Otros pueden verse con man bootparam.

[6]

Controlador: del inglés driver.

[7]

Si existe /fastboot no hace el chequeo, si existe /forcefsck chequea independiente de la cuenta de montajes. Este chequeo arregla errores sólo si FSCKFIX es yes en /etc/defaults.

[8]

Se trata de pseudoterminales, por ejemplo usadas por terminales X-Window.

[9]

Las fuentes por usar en consolas virtuales se configuran en /etc/console-tools/config

[10]

Una terminal tty permite hacer login en un sistema Linux, puede ser una consola virtual, un puerto serial (o modem) o una seudoterminal pty --como las terminales iniciadas en X-Window.

[11]

Administrador de vistas: del inglés display manager.

[12]

Los posibles métodos para iniciar un comando son: respawn que indica que se reiniciará el proceso cuando termine, wait que indica que se ejecutará una vez el proceso cuando se ingrese al nivel de ejecución y se esperará que complete antes de continuar, once similar a wait pero continua ejecutando otros proceso sin esperar a que termine, boot ejecutará el proceso durante el arranque (ignorando el nivel de ejecución) y continuará con otros sin esperar a que termine, bootwait análogo a boot pero espera a que termine antes de ejecutar otro proceso, off no hace nada, ondemand permite especificar tres niveles de ejecución especiales a, b y c, initdefault especifica el nivel de ejecución por defecto (el comando es ignorado), sysinit ejecuta durante el arranque antes de otros marcados con boot o bootwait (ignora nivel de ejecución), powerwait ejecuta el comando cuando una UPS indique que se acabó el suministro de energía (init espera a que el comando termine) --una UPS es un dispositivo con una batería que puede mantener encendido un computador por un tiempo después de un corte de energía eléctrica---, powerfail análogo a powerwait pero init no espera a que concluya, powerokwait se ejecutará el comando cuando el suministro de energía es restablecido, powerfailnow ejecuta el comando cuando la UPS indica que su batería está próxima a acabarse, ctraltdel proceso ejecutado cuando init recibe la señal SIGINT --que normalmente ocurre cuando el usuario presiona Ctrl-Alt-Del---, kbrequest ejecuta el comando cuando recibe la señal SIGWINCH ---que puede ser generada por una secuencia de teclas especiales.

[13]

Mono usuario: del inglés single user

[14]

Reinicio: del inglés reboot