Curso Administración UNIX

Configuración del kernel

El núcleo o "kernel"
Tipos de kernel
Cuándo configurar el kernel
Configurar kernel en Solaris
Configurar kernel en Linux
Bibliografía

El núcleo o "kernel".

En el sistema operativo UNIX se reconocen tres niveles de abstracción:
- el hardware;
- el núcleo del sistema operativo (kernel);
- los programas de usuario (aplicaciones).
El kernel presenta al usuario o los programas de aplicación una interfaz de programación de alto nivel, implementando la mayoría de las facilidades requeridas por éstos. Reúne el manejo de una serie de siguientes conceptos ligados al hardware de nivel más bajo:
- procesos (tiempo compartido, espacios de direccionamiento protegidos);
- señales y semáforos;
- memoria virtual ("swapping", paginado);
- sistema de archivos;
- tubos ("pipes") y conexiones de red.
Una parte del kernel es independiente de los dispositivos presentes en el sistema, pero otra contiene los controladores necesarios para manejar partes específicas del hardware. El kernel intrepreta los pedidos de los programas y los traduce en secuencias de bits que, presentadas a los registros de los controladores, operan sobre los dispositivos físicos.
El kernel está escrito casi todo en C, salvo una pequeña parte en lenguaje ensamblador para los procesos de bajo nivel. El tamaño puede ir desde unos 400 KB hasta más de 15 MB.

Tipos de kernel.

Todos los sistemas permiten indicar al kernel qué hardware encontrará, o cuál no debe buscar; algunos kernels pueden explorar el sistema por sí solos.
Solaris usa un kernel totalmente modular, y puede cargar los controladores de dispositivos al momento que se necesitan, gracias a la coherencia de la arquitectura propietaria de Sun, mucho mayor que la de un computador personal. HP-UX también puede determinar su hardware sin intervención del administrador. FreeBSD y los UNIX BSD en general requieren indicación explícita del hardware del equipo; esto resulta a veces difícil por la poca información técnica que los fabricantes de partes PC proveen a los usuarios. Linux compila los controladores en el kernel como los BSD, pero también maneja módulos a la manera de Solaris, aunque no tan limpiamente, debido a las limitaciones de la arquitectura PC.
En la siguiente tabla se muestra el nombre del directorio donde se compila el kernel (directorio de compilación), así como nombre y ubicación del kernel para algunos sistemas ejemplo:
Sistema Directorio de compilación Kernel
Solaris (usa módulos) /kernel/unix
HP-UX /stand /stand/vmunix
Linux /usr/src/linux /vmlinux o /boot/vmlinuz
FreeBSD /usr/src/sys /kernel

Cuando configurar el kernel.

Para la instalación las distribuciones proveen uno o más kernels típicos, adaptados a grandes grupos de hardware corriente, con muchos controladores y paquetes opcionales que no se usarán en nuestro sistema particular. Aunque no interferirán con el uso del sistema, un kernel adaptado a nuestro hardware será más chico, ocupará menos memoria, y ejecutará más rápido. Si bien los kernels modernos pueden descartar en parte los controladores innecesarios, sus opciones quedarán activadas. Reconfigurar el kernel para el hardware específico tiende a optimizar el rendimiento del sistema.

 

 

Otras razones para reconfigurar el kernel son la actualización de versiones y el agregado de nuevos dispositivos físicos. Incorporar un nuevo controlador requiere actualizar las tablas y estructuras de datos del kernel. En muchas distribuciones esto implica reconfigurar el kernel; en otras puede bastar correr un programa de inserción de módulos cargables en tiempo de ejecución.

Configurar kernel en Solaris.

En el arranque el kernel de Solaris sondea los dispositivos e inicializa un controlador por cada uno de los que encuentra. Mediante la técnica de módulos cargables incorpora sólo el código correspondiente a los dispositivos físicamente presentes. No obstante, en algunos casos este automatismo puede fallar, por errores o por no estar previsto ese dispositivo en particular, haciendo necesaria la configuración manual.
Solaris maneja la siguiente estructura de directorios para la carga de módulos:
 
/kernel
módulos comunes a máquinas con el mismo conjunto de instrucciones.
/platform/nombre-plataforma/kernel
módulos específicos para un tipo de máquina (reconocido en nombre-plataforma). Por ejemplo, "Ultra Enterprise". Puede determinarse con uname -i.
/platform/clase-hardware/kernel
módulos específicos para una clase de hardware (reconocido en clase-hardware). Por ejemplo, sun4u. Puede determinarse con uname -m.
/usr/kernel
similar a /kernel.
 
Solaris busca el kernel en las vías
/platform/nombre-plataforma/kernel:/kernel:/usr/kernel
El nombre del kernel buscado es "unix", y si no se encuentra, "genunix", un kernel más genérico conteniendo sólo la parte independiente de dispositivos. Los directorios de la vía contienen una serie de subdirectorios de clasificación de módulos, tales como drv, misc, cpu, strmod, sparcv9, fs, exec, sched, sys, genunix, unix. Normalmente no es preciso tocar ningún archivo de estos subdirectorios, a no ser que el fabricante de un dispositivo lo establezca en forma específica.
 
El kernel de Solaris se configura en un archivo maestro de nombre /etc/system, consistente en una serie de variables (fijadas con set) y directivas (palabras reservadas). Manejar mal este archivo puede impedir el arranque. Con boot -a se intenta arrancar desde una copia respaldo si se la ha creado previamente.
 
Un ejemplo de archivo /etc/system simple contendría algo así (excluyendo los comentarios):
rootfs:ufs
sistema de archivos tipo ufs.
rootdev:/sbus/@1,f800000/esp@0,800000/sd@3,0:a
dispositivo de arranque sd3a; /dev/sd3a es un enlace al nombre largo usado aquí.
moddir: /platform/SUNW/Ultra-Enterprise/kernel:/platform/sun4u/kernel:
  /kernel:/usr/kernel
vía de búsqueda para los módulos; va en una línea única.
forceload: drv/superplotter
fuerza la carga del módulo indicado; exclude fuerza la exclusión de un módulo.
set maxusers=64
dimensiona las tablas del kernel para atender un máximo de 64 usuarios simultáneos.
 
Una serie de comandos ayudan a encontrar fallas de configuración:
prtconf
imprime la configuración general de la máquina, incluyendo las dependencias entre controladores.
sysdef
descripción muy pormenorizada de la configuración de la máquina. Incluye todo lo mostrado por prtconf. Un impreso de la salida de este comando debe formar parte de la documentación de máquina.
modinfo
informa sobre los módulos cargables dinámicamente; es normal hallar 50 o más.
 
Esta breve descripción no es suficiente para configurar un kernel Solaris. En la mayoría de los casos la técnica de módulos cargados dinámicamente hace innecesario reconfigurar el kernel Solaris, pero si debiera hacerse, leer cuidadosamente la documentación antes de emprender la tarea.

Configurar kernel en Linux.

La configuración del kernel en Linux se basa en un archivo /usr/src/linux/.config de críptico contenido. Existen no obstante interfaces más comprensibles basadas en el comando make:
make config
pide una respuesta para cada opción de configuración; no permite corrección; poco flexible, conviene usar alguna de las otras.
make menuconfig
presenta las opciones de configuración en forma de menú con interfaz gráfica en terminal de caracteres, clasificadas por grupos y con ayuda explicativa sobre cada una. Cada opción puede compilarse en el kernel (marcada con *) o cargarse como módulo (marcada con M). Cuando la opción sólo puede tomarse compilada la propia interfaz así lo hace.
make xconfig
como make menuconfig pero en X-Windows. Requiere autorización para root en el uso del ambiente gráfico.
 
Los pasos para una compilación de kernel en Linux incluyen:
cd /usr/src/linux
trasladarse al directorio de compilación. Puede tener un nombre más específico, como /usr/src/kernel-source-2.2.17, indicando la versión de kernel a que corresponden los fuentes; /usr/src/linux suele ser un enlace simbólico al nombre más específico.
make menuconfig
corre la interfaz de configuración. Fijar las opciones deseadas, ya sea internas o como módulos. La ayuda describe extensamente el significado de cada una, sugiriendo en muchos casos el ajuste.
make dep
resuelve las dependencias entre módulos de compilación en C (código objeto y encabezados), a más de otras.
make clean
asegura el inicio de la compilación en un ambiente limpio de rastros de compilaciones anteriores (elimina archivos intermedios). Se usa cuando quiere arrancarse una compilación desde cero, sin reutilizar el código objeto.
make bzImage
compila un kernel comprimido de nombre bzImage. Puede crearse un kernel en disquete sustituyendo este comando por make bzdisk, una opción segura para probar un nuevo kernel.
make modules
compila los módulos marcados en la configuración.
make modules_install
instala los módulos compilados.
cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz
copia el kernel generado hacia donde se espera encontrarlo en el arranque. Si se creó en disquete bastará arrancar el equipo con el disquete.
vi /etc/lilo.conf
LILO (LInux LOader) es el programa de carga del kernel. Se configura en el archivo /etc/lilo.conf. Entre sus opciones mínimas debe encontrarse el dispositivo de arranque (p.ej. /dev/hda3), la ruta y nombre del kernel a arrancar (usualmente /boot/vmlinuz o /vmlinuz).
/sbin/lilo
Instala LILO según la configuración de LILO recientemente ajustada.
 
Esta breve descripción no es suficiente para configurar un kernel Linux. Debe leerse la documentación, especialmente el archivo README ubicado en el directorio de compilación.
Es conveniente disponer de un modo alternativo de arrancar el sistema, por ejemplo en disquete, antes de recompilar el kernel. Alternativamente, compilar el kernel en disquete, probarlo y recién después de verificar el correcto funcionamiento de todos los servicios copiar hacia la ubicación definitiva en disco. Un disquete de arranque se crea simplemente haciendo
  cp /usr/src/linux/arch/i386/boot/bzImage /dev/fd0

Un disquete de arranque con el kernel actual se crea igualmente haciendo
  cp /boot/vmlinuz /dev/fd0

No confiar en estos disquetes hasta no probarlos.
Aún con error de LILO, si disponemos de un kernel sano puede indicarse a LILO su ubicación, así como otros parámetros. Al aparecer el prompt LILO: escribir algo así como

  vmlinuz root=/dev/hda3 ether=0,0,eth0 ether=0,0,eth1
donde se indica el arranque del kernel vmlinuz ubicado en la partición /dev/hda3, e intentar reconocer 2 tarjetas de red Ethernet.
Puede existir la opción make install para instalar el kernel en su ubicación definitiva y correr LILO; esto deja la máquina lista para arrancar con el nuevo kernel. Debe hacerse sólo después de haber probado el nuevo kernel compilado en disquete.
 

Bibliografía y Referencias.

Documentación de Solaris.
Documentación de Linux.
Páginas COMO (HOWTO) y mini-HOWTO, generalmente en /usr/doc/HOWTO y subdirectorios, sobre todo las relativas a Kernel, Módulos y LILO.
Linux Kernel HowTo  http://www.linuxdoc.org/HOWTO/Kernel-HOWTO.html
Documentación de compilación en /usr/src/linux y /usr/src/linux/Documentation, viene con el paqute de instalación del kernel elegido.

 

 
 
 


Víctor A. González Barbone  victor@iie.edu.uy
Instituto de Ingeniería Eléctrica - Facultad de Ingeniería - Montevideo, Uruguay.