Linux Avanzado Tema 1: Kernel: Configuración, Compilación y Actualización. Virtualización aplicación
de
plataforma
vs.
virtualización
de
Las máquinas virtuales (VMs), en su primera encarnación, fueron creadas por IBM hace 60 años como una forma para compartir sistemas principales grandes y costosos. Y aunque el concepto todavía se aplica en los sistemas IBM actuales, el concepto popular de una VM se ha ampliado y se ha aplicado a numerosas áreas que están por fuera de la virtualización.
Origen de la máquina virtual El primer sistema operativo en soportar virtualización completa para VMs fue el Conversational Monitor System (CMS). El CMS soportaba tanto virtualización como para-virtualización. A comienzos de los años 1970, IBM introdujo la familia VM de sistemas, que ejecutaba múltiples sistemas operativos de usuario individual, sobre su VM Control Program—un hipervisor temprano tipo-1. El área de la virtualización que IBM popularizó en los años 1960 se conoce como virtualización de plataforma (o sistema) . En esta forma de virtualización, la plataforma de hardware subyacente es virtualizada para ser compartida con cierto número de sistemas operativos y usuarios diferentes. Otra aplicación de la VM es ofrecer la propiedad de independencia de máquina. Esta forma, llamada virtualización de aplicación (oproceso) , crea un entorno abstracto (para una aplicación), haciéndolo independiente del entorno físico.
Aspectos de las máquinas virtuales de aplicaciones En el espacio de virtualización de aplicaciones, las VMs se utilizan para proporcionar un entorno independiente del hardware para la ejecución de aplicaciones. Por ejemplo, considere la Figura 1. En la parte superior está el lenguaje de alto nivel, que los desarrolladores usan para construir aplicaciones. Mediante un proceso de compilación, este código de alto nivel se compila en una representación intermedia llamada código objeto. En un entorno no virtualizado, este código objeto (que es independiente de la máquina) se compila en el código de la máquina nativa para ser ejecutado en la plataforma física. Pero en un entorno de virtualización de aplicación, el código objeto se interpreta dentro de una máquina abstracta para proporcionar la ejecución. La ventaja clave aquí es que el mismo código objeto puede ejecutarse en cualquier plataforma de hardware que soporte la máquina abstracta (el intérprete)). Figura 1. VM de aplicación para independencia de plataforma
Además de crear un entorno portátil en el cual ejecutar el código objeto, la virtualización de aplicación proporciona un entorno en el cual aislar la VM de otras aplicaciones que se estén ejecutando en el host. Esta configuración tiene numerosas ventajas, como una administración detallada de recursos y seguridad.
1
El código objeto de una VM también es llamado bytecode , definiendo específicamente un conjunto de instrucciones que ejecuta un intérprete. El término bytecode evolucionó desde implementaciones que implementaban eficientemente sus conjuntos de instrucciones virtuales como bytes individuales para simplicidad y desempeño. Ahora, vamos a ver algunos de los usos históricos de la virtualización de aplicación y a explorar algunos de sus usos modernos.
Historia de la máquina virtual Uno de los primeros usos de la virtualización de aplicación ocurrió en los años 1960, para el Basic Combined Programming Language (BCPL). El BCPL era un lenguaje imperativo desarrollado por Martin Richards en la Universidad de Cambridge y fue un precursor del lenguaje B que luego evolucionó hasta el lenguaje C que usamos hoy.
El BCPL, antes y ahora Aunque el BCPL se originó en 1966, todavía está bajo un activo desarrollo actualmente por su creador, Martin Richards. El primer compilador del BCPL se escribió para el sistema IBM 7094 bajo el Compatible Time Sharing System, uno de los primeros sistemas operativos desarrollados de tiempo compartido. Actualmente, usted puede usar el BCPL en una variedad de sistemas, incluyendo Linux. Aunque el BCPL tiene un lenguaje de alto nivel (similar a C), el código intermedio que generaba el compilador se llamó O-code(código objeto). El O-code podía ser interpretado en una máquina física (como una VM) o compilado a partir de O-code para el lenguaje de máquina nativa del host. Esta funcionalidad proporcionó numerosas ventajas en el contexto de independencia de máquina. Primero, al abstraer el O-code de la máquina física, este podía ser fácilmente interpretado por una variedad de hosts. Y segundo, el O-code podía ser compilado para la máquina nativa, lo cual permitía el desarrollo de un compilador y múltiples compiladores que traducen el O-code a instrucciones de máquina nativa (una tarea más simple). Esta independencia de máquina hizo que el lenguaje fuera portátil entre máquinas y por lo tanto popular debido a su disponibilidad. A comienzos de los años 1970, la Universidad de California en San Diego, implementó el enfoque de VM para la ejecución de Pascal compilado. Llamaron a la representación intermedia p-code, el cual buscó la independencia del hardware subyacente para simplificar el desarrollo del compilador Pascal (en lugar de depender de una arquitectura abstracta de pseudo-máquina). El lenguaje Forth también aplicó VMs, concretamente, a arquitecturas de dirección-cero o basadas en apilamientos. En 1972, Xerox PARC introdujo el lenguaje Smalltalkque dependía de una VM para ejecutarse. Smalltalk fue uno de los primeros lenguajes construidos alrededor del concepto de objetos. Tanto Smalltalk como p-code influenciaron fuertemente uno de los lenguajes basa dos en VM más prominentes que existe actualmente: el lenguaje Java. Java apareció por primera vez en 1995, desarrollado por Sun Microsystems, y desarrolló la idea de una programación independiente de la plataforma, mediante la Java Virtual Machine. Desde entonces, la tecnología Java se ha convertido en un bloque de construcción de las aplicaciones Web. Desde los scripts del lado del servidor hasta los applets del lado del cliente, la tecnología Java incrementó el conocimiento sobre las tecnologías de VM e introdujo tecnologías más nuevas que conectaron la interpretación y la ejecución nativa, usando técnicas de compilación justo-a-tiempo (JIT). Muchos otros lenguajes introdujeron el concepto de VMs. El lenguaje Erlang (desarrollado por Ericsson) usa una VM para ejecutar códigos de bytes Erlang y también para interpretar Erlang del árbol abstracto de sintaxis de la fuente. El lenguaje liviano Lua (desarrollado por la Pontificia Universidad Católica de Río de Janeiro, en Brasil) incluye una VM basada en el registro. Cuando se ejecuta un programa Lua, este se traduce en códigos de bytes y luego se ejecuta en la VM. Más adelante, este artículo observa un código de bytes estándar que puede utilizarse para cualquier lenguaje.
Las máquinas virtuales hoy El uso de las VMs para proporcionar una abstracción al host físico es un método común históricamente y hoy evoluciona y encuentra aplicación. Observemos algunas de las soluciones de fuente abierta más recientes que presionan el concepto de VMs hacia el futuro.
2
Dalvik VM Dalvik es una tecnología de VM de fuente abierta desarrollada por Google para el sistema operativo Android. Android es un kernel Linux modificado que incorpora una pila de software para dispositivos móviles (Figura 2). A diferencia de muchas tecnologías de VM que dependen de arquitecturas basadas en apilamientos, la Dalvik VM es una arquitectura virtual basada en registro (vea Recursos para más información sobre la arquitectura y el conjunto de instrucciones). Aunque las arquitecturas basadas en apilamientos son conceptualmente simples y eficientes, pueden introducir nuevas ineficiencias, como tamaños de programa más grandes (debido al mantenimiento del apilamiento). Figura 2. Arquitectura simple de un apilamiento de software Dalvik
Como Dalvik es la arquitectura de VM, descansa en un lenguaje de alto nivel compilado en códigos de bytes que la VM entiende. En lugar de reinventar la rueda, Dalvik depende del lenguaje Java como el lenguaje de alto nivel para el desarrollo de aplicaciones. Dalvik también depende de una herramienta especial llamada dx para convertir archivos de clase Java en ejecutables de VM Dalvik. Para desempeño, la VM puede también modificar el ejecutable Dalvik (dex) para optimizaciones adicionales, incluyendo compilación JIT, que traduce las instrucciones dex en instrucciones nativas para desempeño nativo. Este proceso también es conocido como traducción dinámica y es una técnica popular para aumentar el desempeño de las tecnologías de VM. Como se muestra en la Figura 2, un ejecutable Dalvik (junto con una instancia de la VM) es aislado como un proceso individual en el espacio de usuario Linux. La VM Dalvik ha sido diseñada para soportar la ejecución de múltiples VMs (en procesos independientes) simultáneamente. La VM Dalvik no está implementada en el tiempo de ejecución del estándar Java y por lo tanto, no hereda las licencias sobre este. En lugar de ello, Dalvik es una implementación limpia publicada bajo licencia de Apache 2.0.
Parrot Otro interesante proyecto de VM de fuente abierta es Parrot. Parrot es otra tecnología de VM basada en registro diseñada para ejecutar eficientemente lenguajes dinámicos (lenguajes que realizan ciertas operaciones en el momento de ejecución, que normalmente se ejecutan en el momento de la compilación, como alterar el sistema de tipo). Parrot fue diseñada originalmente como un tiempo de ejecución para Perl6, pero es un entorno flexible para la ejecución de códigos de bytes para muchos lenguajes (vea la Figura 3). Parrot soporta varios formularios de ingreso de información, como Parrot Abstract Syntax Tree (PAST), que es útil para los escritores de compilador; el Parrot Intermediate Representation (PIR), que es una representación de alto nivel que puede ser escrita por personas o automáticamente por compiladores; y el Parrot Assembly (PASM), que está por debajo de la representación intermedia pero que es útil tanto para personas como para compiladores. Cada formulario se traduce y ejecuta en código de byte Parrot en la VM Parrot.
3
Figura 3. Arquitectura simple de la VM Parrot
Parrot soporta un gran número de lenguajes, pero un aspecto que la hace tan interesante es su soporte tanto de lenguaje dinámico como de lenguaje estático, incluyendo soporte específico para lenguajes funcionales. El Listado 1 muestra un uso simple de PASM. Para instalar Parrot con Ubuntu, simplemente use apt-get: sudo apt-get install parrot La siguiente sesión ilustra un programa simple de manipulación de cadena de caracteres en Parrot. Note que aunque Parrot implementa este código como un conjunto, es mucho más rico en atributos que el conjunto al que usted puede estar acostumbrado(a). Las instrucciones en Parrot usan la sintaxis dest,src , de manera que el Listado 1 muestra una cadena de caracteres siendo cargada con texto. La instrucción length determina la longitud de la cadena de caracteres y la carga en un registro entero. La instrucción print emite el argumento para una salida estándar (stdout), y concat implementa la concatenación de cadena de caracteres. Listado 1. Ejemplo PASM
$ more test.pasm set S1, "Parrot" set S2, "VM" length I1, S1 print I1 print "\n" concat print print
S3, S1, S2 S3 "\n"
end $ parrot test.pasm 6 ParrotVM $
4
Usted encontrará un rico conjunto de instrucciones dentro de Parrot (vea Recursos para más detalles). Los autores optaron por riqueza de recursos sobre minimalismo, facilitando la codificación y construcción de compiladores para Parrot VM. Incluso con el alto nivel de abstracción que proporciona el PASM, el PIR es incluso más confortable para programadores de alto nivel. El Listado 2 proporciona un programa de ejemplo escrito en PIR y ejecutado por la VM Parrot. Este ejemplo declara una sub-rutina llamada square que eleva el número al cuadrado y lo retorna. Este proceso es llamado por la subrutina principal (etiquetada con :main para decirle a Parrot que lo ejecute primero) para imprimir el resultado. Listado 2. Ejemplo de PIR
$ more test.pir .sub square .param int arg arg *= arg .return(arg) .end .sub main :main .local int value value = square(19) print value print "\n" .end $ parrot test.pir 361 $
Parrot proporciona un rico entorno de virtualización de aplicación, para el desarrollo de aplicaciones independientes del tipo de máquina que también busquen alta eficiencia. Usted puede encontrar un gran número de lenguajes que soporten primeros planos de compilador diseñados para Parrot, incluyendo C, Lua, Python, Scheme, Smalltalk, y muchos otros.
Otros usos de las máquinas virtuales de aplicación Hasta ahora, usted ha visto los usos históricos de la virtualización de aplicaciones, incluyendo dos ejemplos presentes. Dalvik está potenciando el desarrollo de aplicaciones con las terminales actuales, y Parrot proporciona una infraestructura eficiente para escritores de compilador, para lenguajes estáticos y dinámicos. Pero el concepto de virtualización de aplicación está siendo implementado en otras numerosas áreas externas al enfoque que hemos explorado hasta ahora. Un uso particularmente interesante es similar probablemente se está ejecutando en la computadora que usted está usando en este momento. Los sistemas que utilizan la interfaz Extensible Firmware Interface (EFI), que es un reemplazo de la BIOS, pueden implementar controladores de firmware en lo que se conoce como el EFI Byte Code (EBC). El firmware de sistemas incluye un intérprete que es invocado cuando se carga una imagen EBC. Este concepto también está implementado en Open Firmware de Sun Microsystems usando Forth (un lenguaje que incluye su propia VM). En el mundo de los juegos, el uso de virtualización de aplicaciones no es nuevo. Muchos juegos modernos incluyen scripting de comportamiento de personajes que no son jugadores y de otros aspectos del juego, usando lenguajes que ejecutan códigos de bytes (como Lua). Pero el concepto de virtualización de aplicaciones en los juegos en realidad va mucho más atrás. Infocom, la compañía que introdujo las aventuras basadas en texto como Zork, vio el valor de la independencia del tipo de máquina en 1979. Infocom creó una VM llamada la Z-
5
machine (nombrada en honor a Zork). La Z-machine fue una VM que permitió llevar un juego de aventura más fácilmente a otras arquitecturas. En lugar de tener que llevar toda la aventura al nuevo sistema, se podía llevar un intérprete que representaba a la Z-machine. Esta funcionalidad simplificó el proceso de transporte hacia otros sistemas que podían tener un soporte de lenguaje diferente y arquitecturas de máquina totalmente diferentes. Aunque la meta de Infocom era facilitar el transporte entre las arquitecturas de su época, su trabajo continúa simplificando el transporte y da como resultado que estos juegos son accesibles a una nueva generación (incluso en plataformas móviles). Otras aplicaciones en juegos de las VM incluyen la ScummVM (que proporciona un entorno de VM para la Script Creation Utility para el lenguaje de scripting Maniac Mansion (SCUMM) (creado en 1987). SCUMM fue desarrollado por LucasArts para simplificar el desarrollo de juegos de aventuras gráficas. ScummVM se utiliza ahora en un gran número de juegos de aventura gráficos y de texto, en una variedad de plataformas.
Avanzando Así como la virtualización de plataforma (o sistema) ha cambiado la forma en la que aprovisionamos y administramos tanto servidores como PCs de escritorio, la virtualización de aplicaciones continúa proporcionando mecanismos eficientes para abstraer una aplicación de su sistema host. Dada la popularidad de este enfoque, será interesante ver una evolución del software y del hardware para hacer aún más flexible y eficiente la virtualización de aplicaciones.
Recursos Aprender •
Navegue más artículos developerWorks.
sobre
virtualización o todos
los
•
Wikipedia ofrece un gran conjunto de recursos para aprender más sobre las VMs (de plataforma y de aplicaciones). Visite la página sobre máquinas virtuales además de la página especialmente dedicada a máquinas p-code.
•
BCPL, el precursor al lenguaje B y a su sucesor C , creado en 1967 por Martin Richards. Usted puede leer el primermanual de referencia BCPL en línea como parte del Proyecto MAC. Usted también puede descargar la última versión del BCPL de su sitio principal.
•
EFI Byte Code, o EBC, especifica una capa interpretativa para controladores de componentes portátiles. Usted puede aprender más sobre EBC y UEFI en Boot Loaders: Small, Fast System Initialization (Dr. Dobb's, septiembre de 2010).
•
Aunque Forth ha estado presente desde los años 1970, continúa encontrando aplicaciones como lenguaje de VM. Usted puede encontrar a Forth aplicado en ciencias espaciales, sistemas incorporados, BIOS y en cualquier otra aplicación que exista con recursos escasos. Aprenda más sobre Forth en el Forth Interest Group.
•
Siga a developerWorks en Twitter, suscríbase a developerWorks, o siga a M. Tim Jones en Twitter.
•
En la zona Linux de developerWorks, encontrará cientos de artículos "cómo hacer" y tutoriales, así como descargas, foros de discusión, y gran cantidad de otros recursos para desarrolladores y administradores Linux.
•
Permanezca actualizado(a) con los Eventos técnicos y webcasts de developerWorks enfocados en una variedad de productos IBM y de temas de la industria TI.
un feed
artículos
de
Tim en
de tweets Linux en
6
•
Asista a presentaciones breves developerWorks ¡en vivo!, para actualizarse rápidamente sobre productos y herramientas IBM y sobre las tendencias de la industria.
•
Vea demostraciones developerWorks on-demand que van desde demostraciones sobre instalación y configuración de productos para principiantes, hasta funcionalidades avanzadas pera desarrolladores experimentados.
•
Las VMs de aplicaciones son populares en el mundo de los desarrolladores de juegos. Uno de los primeros usos lo hizo Infocom en sus juegos de aventura en texto (como Zork). Usted puede aprender más sobre la VM de Infocom llamada Z-machine, así como sobre los intérpretes que existen para diferentes plataformas. Otra aplicación de las VMs fue el SCUMM, usado por LucasArts en aventuras gráficas. SCUMM ha sido implementada como fuente abierta comoScummVM y está reviviendo juegos antiguos sobre nuevo hardware.
Autor:
M. Tim Jones es arquitecto de firmware integrado y el autor de Artificial Intelligence: A Systems Approach GNU/Linux Application Programming (ahora en su segunda edición), AI Application Programming (en su segunda edición) y de BSD Sockets Programming from a Multilanguage Perspective. Su experiencia en ingeniería va desde el desarrollo de kernels para vehículos espaciales geo-sincronizados hasta arquitectura de sistemas incorporados y desarrollo de protocolos de redes. Tim trabaja en Intel y vive en Longmont, Colorado. Compilación y edición: Ing. Sergio Aguilera. Facultad de Tecnología Informática. Universidad de Belgrano.
[email protected] Todos los Derechos Reservados a IBM Corp. – Marzo 2012.
7
Archivos del kernel El kernel base de Linux viene en dos versiones: zImage, que está limitada a alrededor de 508 KB, y bzImage para kernels de mayor tamaño (de hasta 2.5 MB). Por lo general, las distribuciones modernas de Linux usan el formato de kernel bzImage para permitir la inclusión de más características. Usted podría esperar que, debido a que la "z" de la zImage indica compresión de gzip, la "bz" de la bzImage podría significar que aquí se usa una compresión bzip2. Sin embargo, la "b" simplemente significa "big" (grande): todavía se usa la compresión gzip. En cualquier caso, como está instalado en el directorio /boot/, el kernel de base a menudo recibe el nombre de vmlinuz. Por lo general el archivo /vmlinuz es un vínculo a un archivo de nombres de versiones como por ejemplo /boot/vmlinuz-2.6.10-5-386. Existen algunos otros archivos en el directorio /boot/ asociado con el kernel de base que usted deberá tomar en (a veces los encontrará, en cambio, en la raíz del sistema de archivos). El Mapa del sistema es una tabla que muestra las direcciones para los símbolos del kernel. initrd.img es usado a veces por el kernel de base para crear un sistema de archivos simple en un ramdisk antes del montajes del sistema de archivos completo.
Módulos del kernel Los módulos del kernel incluyen un código de kernel adicional que se puede cargar después del kernel de base. Los módulos por lo general ofrecen una de las siguientes funciones: • Unidades de dispositivos: Soportan un tipo específico de hardware • Unidades de sistemas de archivos: Brindan la capacidad opcional de leer y/o escribir un sistema de archivos en particular • Llamadas al sistema: La mayoría tiene soporte en el kernel de base, pero los módulos del kernel pueden agregar o modificar los servicios del sistema • Unidades de red: Implementan un protocolo de red particular • Cargadores ejecutables: Analizan y cargan formatos ejecutables adicionales
Cómo compilar un kernel Cómo obtener fuentes de kernel Lo primero que usted debe hacer para compilar un nuevo kernel de Linux es obtener el código fuente para uno. El principal lugar donde buscar fuentes de kernels son los Archivos de almacenamiento de Kernels de Linux (kernel.org; consulte la sección Recursos para ver un vínculo). El proveedor de su distribución podrá también brindarle sus propias fuentes de kernels actualizadas, las cuales reflejan las mejoras específicas del proveedor. Por ejemplo, quizás usted consiga y abra una versión reciente de kernel con comandos similares a los siguientes: Listado 1. Cómo conseguir y abrir un kernel % cd /tmp/src/ % wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.12.tar.bz2 % cd /usr/src/ % tar jxvfy /tmp/src/linux-2.6.12.tar.bz2
Es probable que necesite permisos de raíz para abrir las fuentes de /usr/src/. No obstante, usted podrá abrir o compilar un kernel en un directorio de usuario. Consulte kernel.org para ver otros formatos de archivos de almacenamiento y protocolos de descarga.
Cómo verificar sus fuentes de kernel Si usted ha obtenido y abierto con éxito un archivo de almacenamiento de fuentes de kernels, su sistema deberá incluir un directorio como el que aparece a continuación: /usr/src/linux-2.6.12 (o un directorio de hojas si usted abrió el archivo en otro lugar). Es de particular importancia el hecho de que ese directorio deberá incluir un archivo README que será conveniente leer para buscar
8
información actualizada. Por debajo de este directorio hay numerosos subdirectorios que incluyen archivos fuentes, que son principalmente archivos .c o .h. La principal tarea de ensamble de estos archivos fuente en un kernel que funcione se encuentra encriptada en el archivo Makefile, que es utilizado por la utilidad make.
Cómo configurar el compilado Una vez que usted ha conseguido y abierto sus fuentes de kernel, tundra que configurar su kernel objetivo. Existen tres indicadores al comando make que usted puede usar para configurar las opciones del kernel. Técnicamente, usted puede también editar de manera manual el archivo .config, pero en la práctica, no se recomienda hacerlo (de esta manera usted renuncia al contexto de información adicional y puede crear fácilmente una configuración inválida). Los tres indicadores sonconfig, menuconfig, y xconfig. De estas opciones, make config es casi tan burda como la edición manual del archivo .config; exige que usted configure cada una de las opciones (cientos de ellas) en un orden fijo, sin poder realizar una exploración hacia atrás. Para las terminales de texto, make menuconfig le ofrece una atractiva pantalla de curses (maldiciones) que usted puede navegar para establecer las opciones que desea modificar. El comando make xconfig es similar para las interfaces X11 pero agrega un atractivo visual de gráficos adicional (que es especialmente agradable en Linux 2.6+). Para muchas de las opciones de kernel usted cuenta con tres opciones: (1) incluir la capacidad en el kernel de base; (2) incluirla como un módulo de kernel; (3) omitir totalmente la capacidad. Por lo general, no se producen daños (a excepción de un poco de tiempo de compilación adicional) para la creación de numerosos módulos de kernel, debido a que los mismos no se cargan a menos que sea necesario. Para los medios con espacio restringido, usted podrá omitir completamente ciertas capacidades.
Cómo ejecutar la compilación Para realmente construir un kernel basado en las opciones que usted ha seleccionado, deberá seguir diversos pasos: • make dep: Solamente necesario en 2.4, ya no es necesario en 2.6. • make clean: Limpia los archivos de objetos previos, lo que es una buena idea especialmente si ésta no es su primera compilación de un árbol de kernels determinado. • make bzImage: Construye el kernel de base. En circunstancias especiales, será conveniente usar make zImage para una imagen de kernel pequeña. Además, podrá usar make zlilo para instalar el jernel directamente dentro del cargador de arranque lilo, omake zdiskpara crear un disco flexible de arranque. Por lo general, es preferible crear la imagen del kernel en un directorio como /usr/src/linux/arch/i386/boot/vmlinuz usando make bzImage, y copiar manualmente desde la misma. • make modules: Construye todos los módulos de kernel cargables que usted ha configurado para su construcción. • sudo make modules_install: Instala todos los módulos de construcción en un directorio como por ejemplo/lib/modules/2.6.12/, donde la hoja del directorio recibe el nombre según la versión del kernel.
Cómo crear un ramdisk inicial Si usted construyó unidades de arranque importantes como módulos, un ramdisk inicial será una manera de conseguir por sí mismo las capacidades durante el proceso inicial de arranque. Esto se aplica especialmente a las unidades de sistemas de archivos que se compilan como módulos de kernel. Básicamente, un ramdisk inicial es una seudopartición de raíz mágica que reside solamente en la memoria y luego es chroot “eada” a la partición de disco real (por ejemplo, si su partición de raíz se encuentra en RAID). Los tutoriales posteriores de esta serie se ocuparán de este tema en más detalle. La creación de una imagen de ramdisk inicial se realiza con el comando mkinitrd. Consulte la página man sobre su distribución de Linux específica para las opciones particulares dadas al comando mkinitrd. En el más simple de los casos, usted podrá ejecutar algo como lo que aparece a continuación:
9
Listado 2. Cómo crear un ramdisk % mkinitrd /boot/initrd-2.6.12 2.6.12
Cómo instalar el kernel de Linux compilado Una vez compilado con éxito el kernel de base y sus módulos asociados (lo cual puede llevar algún tiempo, quizás horas en una máquina lenta), usted deberá copiar la imagen del kernel (vmlinuz o bzImage) y el archivo System.map en su directorio/boot/. Una vez copiados los archivos necesarios del kernel en /boot/, e instalados los módulos del kernel usando make modules_install, usted deberá configurar su cargador de arranque – por lo general lilo o grub – para acceder al /a los kernel/s adecuado/s.
Información adicional El sitio kernel.org contiene una cantidad de vínculos útiles para obtener más información sobre las características de los kernels y los requerimientos para la compilación. Un documento detallado de particular importancia es la Kernel Rebuild Guide [Guía para la reconstrucción de kernels] de Kwan Lowe. Usted encontrará vínculos a ambos en la sección
Cómo emparchar un kernel Cómo obtener un parche Las fuentes de kernels de Linux se distribuyen como árboles de fuentes principales combinados con parches mucho más pequeños. Por lo general, hacerlo de esta manera le permite obtener un kernel de súper vanguardia con descargas mucho más veloces. Esta disposición le permite aplicar parches con fines especiales desde fuentes que no sean kernel.org. Si usted desea emparchar varios niveles de cambios, deberá obtener cada parche incremental. Por ejemplo, suponga que para el momento en que usted lee este documento, se encuentra disponible un kernel de Linux 2.6.14, y usted había descargado el kernel 2.6.12 en la sección anterior. Usted podrá ejecutar: Listado 3. Cómo obtener parches incrementales % wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.13.bz2 % wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.14.bz2
Cómo abrir y aplicar los parches Para aplicar los parches, primero deberá abrirlos usando bzip2 o gzip, según el formato de archivo de compresión que usted haya descargado; luego aplique cada uno de los parches. Por ejemplo: Listado 4. Cómo descomprimir y aplicar parches % bzip2 -d patch2.6.13.bz2 % bzip2 -d patch2.6.14.bz2 % cd /usr/src/linux-2.6.12 % patch -p1 < /path/to/patch2.6.13 % patch -p1 < /path/to/patch2.6.14 Una vez aplicados los parches, proceda con la compilación de la manera descripta en la sección anterior. make cleaneliminará los archivos de objetos adicionales que no reflejen los nuevos cambios.
10
Cómo personalizar un kernel Acerca de la personalización Gran parte de lo que usted pensaría sobre la personalización de un kernel se discutió en la sección de este tutorial sobre cómo compilar un kernel (específicamente, las opciones make [x|menu]config). Mientras se compilan un kernel de base y los módulos del kernel, usted puede incluir u omitir capacidades para lograr capacidades específicas, ejecutar perfiles, y utilización de memoria. Esta sección analiza maneras de modificar el comportamiento del kernel en tiempo de ejecución.
Cómo buscar información sobre un kernel en ejecución Linux (y otros sistemas operativos similares a UNIX) usa una técnica especial, generalmente consistente y elegante para almacenar información sobre un kernel en ejecución (u otros procesos en ejecución). El directorio especial /proc/ incluye seudoarchivos y subdirectorios con una amplia variedad de información sobre el sistema en ejecución. Cada proceso que se crea durante el tiempo de actividad de un sistema Linux crea su propio subdirectorio numérico con numerosos archivos de estado. Gran parte de esta información se encuentra resumida por comandos del nivel del usuario y herramientas del sistema, pero la información subyacente reside en el sistema de archivos /proc/. De particular interés para comprender el estado del kernel en sí mismo son los contenidos de /proc/sys/kernel.
Más acerca de los procesos actuales Si bien el estado de los procesos, especialmente de los procesos del espacio del usuario, no pertenecen al kernel en sí mismo, es importante comprenderlos si usted intenta retocar un kernel subyacente. la manera más sencilla de obtener un resumen de procesos es con el comando ps (también existen herramientas gráficas y de un nivel superior). Con una ID de proceso en mente, usted podrá explorar el proceso que se ejecuta. Por ejemplo: Listado 5. Cómo explorar el proceso en ejecución % ps PID TTY TIME CMD 16961 pts/2 00:00:00 bash 17239 pts/2 00:00:00 ps % ls /proc/16961 binfmt cwd@ exe@ maps mounts stat status cmdline environ fd/ mem root@ statm
Este tutorial no puede cubrir toda la información incluida en estos seudoarchivos de procesos, pero simplemente a modo de ejemplo, veamos parte de status: Listado 6. Una mirada al seudoarchivo status $ head -12 /proc/17268/status Name: bash State: S (sleeping) Tgid: 17268 Pid: 17268 PPid: 17266 TracerPid: 0 Uid: 0 0 0 0 Gid: 0 0 0 0
11
FDSize: 256 Groups: 0 VmSize: 2640 kB VmLck: 0 kB
El proceso del kernel Al igual que con los procesos de los usuarios, el sistema de archivos /proc/ contiene información útil sobre un kernel en ejecución. El directorio /proc/sys/kernel/ tiene particular importancia: Listado 7. Directorio /proc/sys/kernel/ % ls /proc/sys/kernel/ acct domainname msgmni printk shmall threads-max cad_pid hostname osrelease random/ shmmax version cap-bound hotplug ostype real-root-dev shmmni core_pattern modprobe overflowgid rtsig-max swsusp core_uses_pid msgmax overflowuid rtsig-nr sysrq ctrl-alt-del msgmnb panic sem tainted
Los contenidos de estos seudoarchivos muestran información sobre el kernel en ejecución. Por ejemplo: Listado 8. Una Mirada al seudoarchivo ostype % cat /proc/sys/kernel/ostype Linux % cat /proc/sys/kernel/threads-max 4095
Módulos del kernel ya cargados Al igual que con otros aspectos de un sistema Linux en ejecución, la información sobre los módulos del kernel cargados reside en el sistema de archivos /proc/, específicamente en /proc/modules. Sin embargo, por lo general, usted accederá a esta información usando la utilidad lsmod (que simplemente coloca un encabezado en la visualización de los contenidos en bruto de /proc/modules); cat /proc/modules muestra la misma información. Veamos un ejemplo: Listado 9. Contenidos de /proc/modules % lsmod Module lp parport_pc parport sg st sr_mod sd_mod scsi_mod ide-cd cdrom nfsd af_packet
Size Used by Not tainted 8096 0 25096 1 34176 1 [lp parport_pc] 34636 0 (autoclean) (unused) 29488 0 (autoclean) (unused) 16920 0 (autoclean) (unused) 13100 0 (autoclean) (unused) 103284 4 (autoclean) [sg st sr_mod sd_mod] 33856 0 (autoclean) 31648 0 (autoclean) [sr_mod ide-cd] 74256 8 (autoclean) 14952 1 (autoclean)
12
ip_vs floppy 8139too mii supermount usb-uhci usbcore rtc ext3 jbd
83192 0 (autoclean) 55132 0 17160 1 (autoclean) 3832 0 (autoclean) [8139too] 15296 2 (autoclean) 24652 0 (unused) 72992 1 [usb-uhci] 8060 0 (autoclean) 59916 2 38972 2 [ext3]
Cómo cargar módulos del kernel adicionales Existen dos herramientas para cargar módulos del kernel. El comando modprobe es de un nivel algo superior, y maneja las dependencias de carga – es decir, otros módulos de kernel que puede necesitar un módulo del kernel cargado. En su interior, sin embargo, modprobe es sólo un contenedor para llamar a insmod. Por ejemplo, imagine que usted desea cargar soporte para el sistema de archivos Reiser en el kernel (suponiendo que ya no está compilado en el kernel). Usted podrá usar la opción modprobe nv para ver simplemente qué es lo que haría el comando, pero sin cargar nada en realidad: Listado 10. Cómo verificar las dependencias con modprobe % modprobe -nv reiserfs /sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/fs/reiserfs/reiserfs.o.gz
En este caso, no hay dependencias. En otros casos, es probable que existan dependencias (que serían manejadas pormodprobe si se ejecutara sin -n). Por ejemplo: Listado 11. Más modprobe % modprobe -nv snd-emux-synth /sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/drivers/sound/ soundcore.o.gz /sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/core/ snd.o.gz /sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/synth/ snd-util-mem.o.gz /sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/core/seq/ snd-seq-device.o.gz /sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/core/ snd-timer.o.gz /sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/core/seq/ snd-seq.o.gz /sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/core/seq/ snd-seq-midi-event.o.gz /sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/core/ snd-rawmidi.o.gz /sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/core/seq/ snd-seq-virmidi.o.gz /sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/core/seq/ snd-seq-midi-emul.o.gz /sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/synth/emux/
13
snd-emux-synth.o.gz
Imagine que desea cargar ahora un módulo del kernel. Puede usar modprobe para cargar todas las dependencias mientras tanto, pero para ser explícito, usted deberá usar insmod. A partir de la información presentada anteriormente, quizás usted podría querer ejecutar, por ejemplo, insmod snd-emux-synth. Pero si hace esto sin haber cargado primero las dependencias, recibirá quejas sobre los “símbolos sin solución”. Por lo tanto, tratemos de usar en cambio el sistema de archivos de Reiser, que es independiente: Listado 12. Cómo cargar un módulo de kernel % insmod reiserfs Using /lib/modules/2.4.21-0.13mdk/kernel/fs/reiserfs/reiserfs.o.gz
Por suerte, su kernel soportará ahora un nuevo sistema de archivos. Usted podrá montar una partición, la lectura/escritura del mismo, etc. Para otras capacidades del sistema, el concepto será el mismo.
Cómo quitar los módulos del kernel cargados Al igual que con la carga de módulos, la descarga puede realizarse en un nivel superior con modprobe o a un nivel inferior conrmmod. La herramienta de nivel superior descarga todo en orden de dependencia inverso. rmmod simplemente elimina un único módulo de kernel, pero fallará si los módulos se encuentran en uso (por lo general debido a las dependencias). Por ejemplo: Listado 13. Intento de descarga de módulos con dependencias en uso % modprobe snd-emux-synth % rmmod soundcore soundcore: Device or resource busy % modprobe -rv snd-emux-synth # delete snd-emux-synth # delete snd-seq-midi-emul # delete snd-seq-virmidi # delete snd-rawmidi # delete snd-seq-midi-event # delete snd-seq # delete snd-timer # delete snd-seq-device # delete snd-util-mem # delete snd # delete soundcore
Sin embargo, si un módulo de kernel es candidato para ser quitado, rmmod lo descargará de la memoria, por ejemplo: Listado 14. Cómo descargar módulos sin dependencias % rmmod -v reiserfs Checking reiserfs for persistent data
14
Cómo cargar automáticamente los módulos de kernel Usted puede hacer que se carguen automáticamente los módulos del kernel, si lo desea, usando el cargador de módulos de kernel de las recientes versiones de Linux, o el daemon de kerneld de las versiones más antiguas. Si usa estas técnicas, el kernel detectará el hecho de que no soporta una llamada al sistema en particular, y luego intentará cargar el módulo de kernel adecuado. Sin embargo, a menos que usted ejecute en sistemas con memorias muy restringidas, por lo general no hay motive para no cargar los módulos de kernel necesarios durante el inicio del sistema (consulte el siguiente tutorial de esta serie para ver más información al respecto). Algunas distribuciones vienen con el cargador de módulos de kernel activado.
Cómo efectuar la limpieza automática de los módulos del kernel Al igual que con la carga automática, la limpieza automática de los módulos de kernel es en gran medida un problema sólo de los sistemas con memorias restringidas, como por ejemplo los sistemas Linux incrustados. Sin embargo, usted deberá saber que los módulos de kernel pueden cargarse con el indicador insmod --autoclean, que los marca como descargables si no están en uso actualmente. El más antiguo daemon kerneld haría una llamada a rmmod --all de manera periódica para quitar los módulos de kernel sin uso. En casos especiales (si usted no está usando kerneld, lo cual no haría en los sistemas Linux recientes), podría agregar el comando rmmod --all a su crontab, para que funcionara quizás más o menos una vez por minuto. Pero en su mayoría, esta cuestión es superflua, debido a que los módulos del kernel por lo general usan mucha menos memoria que los procesos de usuarios típicos. Recursos Aprender • Lea la Kernel Rebuild Guide (Guía de reconstrucción de kernel) de Kwan Lowe para ver más detalles sobre cómo construir un kernel. •
Encuentre más recursos para desarrolladores Linux en la zona Linux de developerWorks.
Obtener los productos y tecnologías • Obtenga la fuente del kernel de Linux en kernel.org, los Linux Kernel Archives. •
Ordene el kit de evaluación de software para Linux, un set de dos DVD que incluye el último software de prueba para Linux de DB2®, Lotus®, Rational®, Tivoli® y WebSphere®.
•
Construya su próximo proyecto de desarrollo en Linux con el software de prueba de IBM, disponible para su descarga directa en developerWorks.
Comentar • KernelNewbies.org posee numerosos recursos para las personas nuevas en el ámbito del kernel: una Pregunta Frecuente, un canal de IRC, una lista de correo y un wiki. •
KernelTrap es una comunidad Web dedicada al uso compartido de lo último de las noticias sobre desarrollo de kernels.
•
Involúcrese en developerWorks.
la
comunidad
developerWorks
participando
en
los blogs
de
15
Administración de kernel para tiempo de ejecución En esta sección, aprenda cómo: • Usar los utilitarios de línea de comando para obtener información acerca del kernel y los módulos kernel que se están ejecutando actualmente • Cargar y descargar manualmente módulos kernel • Determinar cuándo se pueden descargar los módulos • Configurar el sistema para cargar módulos por nombres distintos a su nombre de archivo Técnicamente, Linux es el kernel de su sistema. El kernel brinda un marco para que las aplicaciones se ejecuten y usen varios dispositivos de hardware. Es un código de nivel bajo que maneja interfaces de hardware, planificación y administración de memoria, entre otras cosas. Muchos se refieren al sistema completo como GNU/Linux porque gran parte de las herramientas que hacen que la mayoría de las distribuciones se puedan usar provienen del proyecto GNU de la Fundación para el Software Libre (FSF). Sin embargo, a menudo veremos sólo "Linux" en lugar de "GNU/Linux."
uname El comando uname imprime información sobre su sistema y su kernel. El Listado 1 muestra las distintas opciones para unamey la información resultante; cada opción se define en la Tabla 3. Listado 1. El comando uname ian@pinguino:~$ uname Linux ian@pinguino:~$ uname -s Linux ian@pinguino:~$ uname -n pinguino ian@pinguino:~$ uname -r 2.6.12-10-386 ian@pinguino:~$ uname -v #1 Mon Jan 16 17:18:08 UTC 2006 ian@pinguino:~$ uname -m i686 ian@pinguino:~$ uname -o GNU/Linux ian@pinguino:~$ uname -a Linux pinguino 2.6.12-10-386 #1 Mon Jan 16 17:18:08 UTC 2006 i686 GNU/Linux
Tabla 3. Opciones para uname
Opción Descripción
-s
Imprimir el nombre del kernel. Éste es el predeterminado si no se especifica una opción.
16
-n
Imprimir el nodename o hostname.
-r
Imprimir la edición del kernel. Esta opción se usa habitualmente con los comandos de manejo de módulos.
-v
Imprimir la versión del kernel.
-m
Imprimir el nombre (CPU) del equipo.
-o
Imprimir el operativo.
-a
Imprimir toda la información anterior.
nombre
del
del
hardware
sistema
El Listado 1 es de un sistema Ubuntu ejecutado en una CPU Intel®. El comando uname se encuentra disponible en casi todos los sistemas UNIX® y similares a UNIX, como así también en Linux. La información impresa variará según la distribución y versión de Linux, como así también por el tipo de equipo en la cual se está ejecutando. El Listado 2 muestra los datos de salida de un sistema AMD Athlon 64 que ejecuta Fedora Core 4 y, a modo de comparación, un Apple PowerBook. Listado 2. Uso de uname con otro sistema Linux attic4 2.6.14-1.1656_FC4 #1 Thu Jan 5 22:13:55 EST 2006 x86_64 x86_64 x86_64 GNU/Linuxfilesystem Darwin Ian-Shields-Computer.local 7.9.0 Darwin Kernel Version 7.9.0: Wed Mar 30 20:11:17 PST 2005; root:xnu/xnu-517.12.7.obj~1/RELEASE_PPC Power Macintosh powerpc
Módulos kernel El kernel administra muchos de los aspectos de bajo nivel de su sistema, incluyendo hardware e interfaces. Con una gran variedad de hardware posible y varios sistemas de archivos distintos, el kernel que pudiera soportar todo esto sería demasiado grande. Afortunadamente, los módulos kernel le permite cargar software de soporte como drivers de hardware o sistemas de archivos cuando fuera necesario, de manera tal que usted pueda ejecutar su sistema con un pequeño kernel y luego cargar otros módulos a medida que lo necesite. A menudo el proceso de carga es automático, así como cuando se enchufan los dispositivos USB. El resto de esta sección analiza los comandos y la configuración para los módulos kernel. Los comandos para tareas como cargar o descargar módulos requieren autoridad de certificación raíz. Los comandos para visualizar información acerca de los módulos pueden ser ejecutados habitualmente por usuarios generales. Sin embargo, dado que se alojan en /sbin, por lo general no están en la ruta de usuario no root, por ende probablemente usted deba usar los nombres completos de la ruta de acceso si usted es un usuario no root.
17
lsmod Use el comando lsmod para visualizar los módulos que están actualmente cargados en su sistema, como se muestra en el Listado 3. Probablemente sus datos de salida sean diferentes, aunque debería ver algunas entradas comunes. Listado 3. Visualización de los módulos kernel con lsmod [ian@attic4 ~]$ /sbin/lsmod Module Size Used by nvnet 74148 0 nvidia 4092336 12 forcedeth 24129 0 md5 4161 1 ipv6 268737 12 parport_pc 29189 1 lp 13129 0 parport 40969 2 parport_pc,lp autofs4 29637 1 sunrpc 168453 1 ipt_REJECT 5825 1 ipt_state 1985 3 ip_conntrack 42009 1 ipt_state iptable_filter 3137 1 ip_tables 19521 3 ipt_REJECT,ipt_state,iptable_filter dm_mod 58613 0 video 16069 0 button 4161 0 battery 9541 0 ac 4933 0 ohci_hcd 26977 0 ehci_hcd 41165 0 i2c_nforce2 7105 0 i2c_core 21825 1 i2c_nforce2 shpchp 94661 0 snd_intel8x0 34945 1 snd_ac97_codec 76217 1 snd_intel8x0 snd_seq_dummy 3781 0 snd_seq_oss 37569 0 snd_seq_midi_event 9409 1 snd_seq_oss snd_seq 62801 5 snd_seq_dummy,snd_seq_oss,snd_seq_midi_event snd_seq_device 9037 3 snd_seq_dummy,snd_seq_oss,snd_seq snd_pcm_oss 51569 0 snd_mixer_oss 18113 1 snd_pcm_oss snd_pcm 100553 3 snd_intel8x0,snd_ac97_codec,snd_pcm_oss snd_timer 33733 2 snd_seq,snd_pcm snd 57669 11 snd_intel8x0,snd_ac97_codec,snd_seq_oss,snd_seq, snd_seq_device,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer soundcore 11169 1 snd snd_page_alloc 9925 2 snd_intel8x0,snd_pcm floppy 65397 0 ext3 132681 3 jbd 86233 1 ext3 sata_nv 9541 0 libata 47301 1 sata_nv sd_mod 20545 0
18
scsi_mod [ian@attic4 ~]$
147977 2 libata,sd_mod
Como podrá observar, este sistema tiene muchos módulos cargados, la mayoría de los cuales vienen con el kernel. Sin embargo, algunos, como los módulos nvnet, nvidia, y sata_nv de NVIDIA Corporation incluyen código registrado y no se proveen como parte de un kernel estándar. De esta manera, el enfoque modular le permite al código registrado conectarse a una fuente abierta de kernel. Suponiendo que la licencia del proveedor lo permita, un distribuidor Linux puede agregar módulos propios a una distribución, ahorrándole la necesidad de obtenerlo directamente de un proveedor y ayudándolo a garantizar los niveles apropiados que usted necesita. En el Listado 3, usted también puede observar que el soporte modular se extiende a otros dispositivos como video, unidades de disco duro SATA y SCSI, discos flexibles y tarjetas de sonido, como así también funciones de redes como IPV6, soporte para sistema de archivos como ext3, y llamada a procedimiento remoto (Remote Procedure Call o RPC) de Sun. Además del nombre de módulo, lsmod también muestra el tamaño del módulo y la cantidad de usuarios del mimo. Si el módulo es usado por cualquier otro módulo, éstos aparecen listados. Entonces, por ejemplo, el módulo soundcore es usado por el módulo snd, que a su vez es usado por otros módulos de sonido.
modinfo El comando modinfo muestra la información sobre uno o varios módulos. Como se muestra en el Listado 4, la información incluye la ruta de acceso completa al archivo, el autor, la licencia, cualquier parámetro que el módulo pudiera aceptar, versión, dependencias y otra información. Listado 4. Información del módulo básico [ian@attic4 ~]$ /sbin/modinfo floppy filename: /lib/modules/2.6.12-1.1456_FC4/kernel/drivers/block/floppy.ko author: Alain L. Knaff license: GPL alias: block-major-2-* vermagic: 2.6.12-1.1456_FC4 686 REGPARM 4KSTACKS gcc-4.0 depends: srcversion: 2633BC999A0747D8D215F1F parm: FLOPPY_DMA:int parm: FLOPPY_IRQ:int parm: floppy:charp [ian@attic4 ~]$ /sbin/modinfo sata_nv filename: /lib/modules/2.6.12-1.1456_FC4/kernel/drivers/scsi/sata_nv.ko author: NVIDIA description: low-level driver for NVIDIA nForce SATA controller license: GPL version: 0.6 vermagic: 2.6.12-1.1456_FC4 686 REGPARM 4KSTACKS gcc-4.0 depends: libata alias: pci:v000010DEd0000008Esv*sd*bc*sc*i* alias: pci:v000010DEd000000E3sv*sd*bc*sc*i* alias: pci:v000010DEd000000EEsv*sd*bc*sc*i* alias: pci:v000010DEd00000054sv*sd*bc*sc*i* alias: pci:v000010DEd00000055sv*sd*bc*sc*i* alias: pci:v000010DEd00000036sv*sd*bc*sc*i* alias: pci:v000010DEd0000003Esv*sd*bc*sc*i* alias: pci:v000010DEd*sv*sd*bc01sc01i*
19
srcversion:
3094AD48C1B869BCC301E9F
En el Listado 4, observe que en las líneas donde aparecen los nombres de archivo del módulo, estos nombres de archivo terminan con un sufijo .ko. Esto distingue a los módulos para kernels 2.6 de otros archivos de objetos y de los módulos para 2.4 y kernels anteriores que usaban el mismo sufijo .o como otros archivos de objeto. Usted también observará que la ruta de acceso del módulo incluye la versión de kernel. Por ejemplo, /lib/modules/2.6.12-1.1456_FC4/kernel/drivers/block/floppy.ko incluye 2.6.12-1.1456_FC4 como elemento de ruta de acceso. Éste es el mismo valor que el emitido por uname -r. Los módulos kernel son específicos para cada kernel, y esta estructura administra la relación. En los kernels 2.6 también puede usar modinfo para limitar las solicitudes a información específica sobre un módulo. Use la opción -F para extraer un único tipo de información, como por ejemplo parámetro, descripción, licencia, nombre de archivo, o alias. Use el comando muchas veces con diferentes opciones si necesita distintos tipos de información. En los kernels 2.4, parámetros como -p extraen información de parámetros. El comando actual modinfo también soporta los parámetros más antiguos. El Listado 5 muestra algunos ejemplos. Listado 5. Información específica del módulo [ian@attic4 ~]$ /sbin/modinfo -F parm snd cards_limit:Count of auto-loadable soundcards. major:Major # for sound driver. [ian@attic4 ~]$ /sbin/modinfo -F license nvidia floppy NVIDIA GPL [ian@attic4 ~]$ /sbin/modinfo -p snd major:Major # for sound driver. cards_limit:Count of auto-loadable soundcards.
rmmod Si el contador de uso del módulo está en 0, usted puede eliminarlo de manera segura. Por ejemplo, usted podría hacer esto como preparación para cargar una versión actualizada. Esta es una función importante del kernel modular porque no siempre tiene que reiniciar sólo para actualizar el soporte para algún dispositivo en particular. Para eliminar un módulo, use el comandormmod junto con el nombre de módulo, como se muestra en el Listado 7. Listado 7. Eliminar un módulo de un sistema en funcionamiento [root@attic4 ~]# rmmod floppy
Diríjase a las páginas man para consultar otras opciones disponibles conrmmod.
insmod y modprobe Una vez que haya eliminado el módulo, tal vez necesite volver a cargarlo, puede hacer esto usando el comando insmod, que toma el nombre completo de la ruta de acceso del módulo a recargar, junto con cualquier opción de módulos que fuera necesaria. Si usa este comando, probablemente desee usar la sustitución de comandos para generar el nombre de archivo. En el Listado 8 se muestran dos formas de hacer esto.
20
Listado 8. Cargar un módulo usando insmod [root@attic4 ~]# insmod /lib/modules/`uname -r`/kernel/drivers/block/floppy.ko [root@attic4 ~]# rmmod floppy [root@attic4 ~]# insmod $(modinfo -F filename floppy) La segunda forma que se mencionó anteriormente le ahorra la necesidad de recordar en qué subdirectorio (drivers/block en este caso) se encuentra un módulo, pero hay una manera aún mejor de cargar un módulo. El comando modprobe provee una interfaz de más alto nivel que opera con el nombre del módulo, en lugar de hacerlo con la ruta de acceso del archivo. También administra la carga de módulos adicionales de los cuales depende un módulo, y puede eliminar módulos así como también cargarlos. El Listado 9 muestra cómo usar modprobe para eliminar el módulo vfat, junto con el módulo fat que lo usa. Luego muestra qué haría el sistema si se volviera a cargar el módulo, y por último el resultado de recargar el módulo. Observe que se especifica la opción -v para obtener datos de salida detallados; de lo contrario, modprobe (y el comando insmod subyacente) visualizarán sólo mensajes de error del módulo propiamente dicho. Entre cada paso, los datos de salida de lsmod se canalizan a través de grep para mostrar si el módulo vfat o fat está cargado o no. Listado 9. Cargar un módulo usando modprobe [root@lyrebird root]# modprobe -r vfat vfat: Device or resource busy [root@lyrebird root]# lsmod | grep fat vfat 13132 1 fat 38744 0 [vfat] [root@lyrebird root]# umount /windows/D [root@lyrebird root]# modprobe -r vfat [root@lyrebird root]# modprobe -v --show vfat /sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/fat/fat.o /sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o [root@lyrebird root]# lsmod | grep fat [root@lyrebird root]# modprobe -v vfat /sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/fat/fat.o Using /lib/modules/2.4.21-37.0.1.EL/kernel/fs/fat/fat.o Symbol version prefix '' /sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o Using /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o [root@lyrebird root]# lsmod | grep fat vfat 13132 0 (unused) fat 38744 0 [vfat]
depmod Recién vio quemodprobepuede manejar la carga automática de múltiples módulos cuando algunos dependen de otros. Las dependencias se conservan en el archivo modules.dep en el subdirectorio /lib/modules para el kernel correcto, según lo determinado por el comando uname -r. Este archivo, junto a varios archivos map, es generado por el comando depmod. La -a(porall [“todo” en inglés]) ahora es opcional. El comando depmod escanea los módulos en los subdirectorios de /lib/modules para buscar el kernel en el que usted está trabajando y actualiza la información sobre dependencia. En el Listado 10 se muestra un ejemplo y los archivos cambiados resultantes.
21
Listado 10. Usar depmod para reconstruir modules.dep [root@lyrebird root]# date Thu Mar 16 10:41:05 EST 2006 [root@lyrebird root]# depmod [root@lyrebird root]# cd /lib/modules/`uname -r` [root@lyrebird 2.4.21-37.0.1.EL]# ls -l mod* -rw-rw-r-- 1 root root 54194 Mar 16 10:41 modules.dep -rw-rw-r-- 1 root root 31 Mar 16 10:41 modules.generic_string -rw-rw-r-- 1 root root 73 Mar 16 10:41 modules.ieee1394map -rw-rw-r-- 1 root root 1614 Mar 16 10:41 modules.isapnpmap -rw-rw-r-- 1 root root 29 Mar 16 10:41 modules.parportmap -rw-rw-r-- 1 root root 65171 Mar 16 10:41 modules.pcimap -rw-rw-r-- 1 root root 24 Mar 16 10:41 modules.pnpbiosmap -rw-rw-r-- 1 root root 122953 Mar 16 10:41 modules.usbmap [root@lyrebird 2.4.21-37.0.1.EL]# cd /root
Usted puede personalizar el comportamiento de modprobe y depmod usando el archivo de configuración /etc/modules.conf. Éste se usa comúnmente para nombres de módulos alias y para especificar comandos que deberán ejecutarse después que un módulo se cargó y antes de volver a cargarlo. No obstante, puede realizarse una amplia gama de otras configuraciones. El Listado 11 muestra un ejemplo de /etc/modules.conf. Consulte la página man para obtener más detalles sobre modules.conf. Listado 11. Ejemplo de archivo /etc/modules [root@lyrebird root]# cat /etc/modules.conf alias eth0 e100 alias usb-controller usb-uhci alias usb-controller1 ehci-hcd alias sound-slot-0 i810_audio post-install sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1 || : pre-remove sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1 || :
También es importante que sepa que algunos sistemas usan otro archivo de configuración llamado modprobe.conf, en tanto que otros almacenan información de configuración de módulos en el directorio /etc/modules.d directory. También puede encontrar un archivo llamado /etc/modules en algunos sistemas; este archivo contiene los nombres de los módulos kernel que deberán cargarse al momento de inicializar.
Módulos USB Cuando usted conecte un dispositivo USB, mediante hot plug, a su sistema Lynux, el kernel debe determinar qué módulos cargar para manejar el dispositivo. Esto normalmente es realizado por usted mediante un script de hot plug que usa el comando usbmodules para encontrar el módulo adecuado. También puede ejecutar usbmodules (como raíz) para que lo haga por usted. El Listado 12 muestra un ejemplo.
22
Listado 12. Módulos USB root@pinguino:~# lsusb Bus 005 Device 004: ID 1058:0401 Western Digital Technologies, Inc. Bus 005 Device 003: ID 054c:0220 Sony Corp. Bus 005 Device 001: ID 0000:0000 Bus 004 Device 001: ID 0000:0000 Bus 003 Device 001: ID 0000:0000 Bus 002 Device 001: ID 0000:0000 Bus 001 Device 003: ID 04b3:310b IBM Corp. Red Wheel Mouse Bus 001 Device 001: ID 0000:0000 root@pinguino:~# usbmodules --device /proc/bus/usb/005/003 usb-storage root@pinguino:~# usbmodules --device /proc/bus/usb/001/003 usbmouse usbhid La siguiente sección le muestra cómo construir y configurar un kernel personalizado.
Personalizar y construir kernels y módulos kernel En esta sección, aprenderá cómo: • Personalizar la actual configuración de kernel • Construir un kernel nuevo y los módulos kernel adecuados • Instalar un kernel nuevo y cualquier módulo • Asegurarse que el gestor de arranque pueda localizar al kernel nuevo y los archivos asociados Como aprendió en la sección anterior, Administración de kernel para tiempo de ejecución, el kernel le brinda soporte de bajo nivel para el hardware de su sistema y los sistemas de archivo. Una imagen de kernel moderna normalmente contiene sólo funciones esenciales, pero está configurada para soportar las funciones adicionales que usted pueda necesitar, mediante el uso de kernel modules. El soporte adicional se carga sólo cuando se lo necesita, por ejemplo cuando se conecta o desactiva un dispositivo. El código modular pasa a formar parte del kernel, ampliando las funciones de kernel de una manera dinámica. Si las funciones de un módulo kernel cargado no se han usado durante varios minutos, el kernel puede voluntariamente desvincularlo del resto del kernel y descargarlo de la memoria mediante un proceso conocido como autolimpieza. Sin los módulos kernel, su kernel que está ejecutándose, el cual se carga del disco como un archivo binario único, debería contener toda la funcionalidad que probablemente usted necesite para siempre. También necesitaría construir un kernel totalmente nuevo cada vez que desee agregar una funcionalidad a su sistema. Aunque no puede poner todo en un módulo. Como mínimo, la imagen de kernel que esté cargada debe poder montar su sistema de archivo raíz, su cargador de arranque puede cargar un disco RAM inicial (o initrd), que puede contener los módulos necesarios para montar el sistema de archivo raíz. No obstante, la imagen de kernel debe contener por lo menos soporte para el sistema de archivos RAM usado en el disco RAM inicial. Si no lo hace, su sistema no arrancará. Una vez que su sistema ha realizado bootstrap de sí mismo hasta este punto, sigue con el montaje del sistema de archivo raíz y luego comienza con los otros procesos de inicialización. Después de unos pocos segundos, el sistema ya está preparado y listo para usar. Sin embargo, el kernel se mantiene a la espera de las solicitudes para realizar el trabajo de los procesos de usuario y programar los recursos del sistema entre las tareas que los requieran. Los kernels modulares funcionan bien en sistemas de módem con mucho espacio de memoria RAM y en disco. Sin embargo, tal vez usted tenga un dispositivo de hardware como una tarjeta de video o un sistema de almacenamiento que no sea soportado por el kernel que vino con su distribución. Efectivamente, algunos drivers contienen código registrado que interferiríacon un kernel Linux puro, por eso algunos distribuidores no lo incluirán, aún cuando los términos de la
23
licencia del proveedor permitan su distribución al distribuidor que usted ha elegido. En este caso, usted necesitará por lo menos construir nuevos módulos, y posiblemente hasta construir un kernel nuevo. Linux se puede usar en muchos entornos, desde sistemas incrustados como teléfonos celulares, hasta dispositivos de redes como routers, decodificadores y también entornos de computación más tradicionales. Algunos de estos dispositivos usan un kernel que se ha personalizado para soportar sólo aquellas funciones que el sistema se propone soportar. Por ejemplo, un sistema destinado a ser un firewall inalámbrico probablemente no necesite soportar ningún otro sistema de archivos que el sistema de archivos de sólo lectura desde el cual se carga, sin embargo tal vez necesite soporte para hardware de redes avanzado que no forma parte del kernel estándar. Nuevamente, se requerirá un kernel personalizado.
Paquetes fuente El último paquete fuente para kernel Linux es el Linux Kernel Archives (consulte Recursos para acceder a un vínculo). A menos que usted ya sepa qué es lo que está haciendo, debería usar un paquete kernel de su distribución Linux, porque su distribuidor puede haberle agregado parches personalizados. Si usted descarga una fuente de los archivos públicos de kernel, descargará un archivo comprimido, y necesitará descomprimirlo usando gzip o bzip2, según cuál sea la versión de la fuente de kernel que haya descargado (.gz o .bz2). El directorio pub/linux/kernel/ en el servidor de descarga tiene un directorio para cada versión de kernel, por ejemplo 2.4, 2.5, o 2.6. A la fecha de este documento, la última versión bzip2 de kernel 2.6 kernel es linux-2.6.15.tar.bz2. En ese directorio de kernel, usted también verá el respectivo archivo ChangeLog-2.6.15.6 que describe los cambios en esta versión, y un parche patch-2.6.15.bz2, que es un archivo más pequeño que le permite complementar la versión de fuente anterior para equipararla con el nivel de 2.6.15. También observará los archivos de firmas que puede usar para verificar que su archivo de descarga no esté dañado, ya sea accidental o intencionalmente. La fuente comprimida está normalmente descomprimida en /usr/src, y crea un subdirectorio nuevo para la versión de kernel, como linux-2.6.15, que contiene el árbol de archivos necesarios para construir su kernel. Si usted ya tiene ese archivo, tal vez desee hacer una copia de seguridad del mismo o cambiarle el nombre antes de desempaquetar la nueva fuente de kernel. Esto le garantiza que pueda volver atrás si lo necesita, y también que no tendrá archivos cautivos que no deberían estar en su árbol de fuente de kernel. Necesita aproximadamente 40MB de espacio en disco para el tarball y alrededor de 350MB para el código fuente expandido. Algunos distribuidores, especialmente Red Hat, ahora distribuyen los encabezados y fuentes kernel necesarios para construir módulos kernel como un paquete de desarrollo kernel. La documentación puede estar en un paquete de documentación de kernel aparte. Éstos están diseñados para crear módulos y son suficientes para ello, como un módulo para tarjeta de gráficos exclusiva de un proveedor, pero no son suficientes para reconstruir un kernel personalizado. Su distribución deberá contar con información sobre cómo reconstruir un kernel y cómo se puede obtener la fuente. Consulte la documentación, como por ejemplo notas de versiones. Supongamos que usted usa FTP o HTTP para descargar la fuente RPM de kernel-2.6.151.1833_FC4.src.rpm de pub/fedora/linux/core/updates/4/SRPMS/ en download.fedora.redhat.com, y el archivo está en el directorio /root. Observe que los números de versión usados aquí probablemente sean diferentes para su sistema, por lo tanto asegúrese de conseguir la versión de fuente actualizada correspondiente al kernel que tiene instalado. Ahora, para Fedora, usted debe instalar el RPM fuente, luego pasar al directorio /usr/src/redhat/SPECS y por último construir el RPM fuente para crear el árbol fuente de kernel Linux, como se muestra en el Listado 13. Listado 13. Crear el árbol fuente de kernel para Fedora Core [root@attic4 ~]# uname -r 2.6.15-1.1833_FC4 [root@attic4 ~]# rpm -Uvh kernel-2.6.15-1.1833_FC4.src.rpm 1:kernel ########################################### [100%] [root@attic4 ~]# cd /usr/src/redhat/SPECS
24
[root@attic4 SPECS]# rpmbuild -bp --target $(arch) kernel-2.6.spec Building target platforms: x86_64 Building for target x86_64 Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.23188 + umask 022 + cd /usr/src/redhat/BUILD + LANG=C + export LANG + unset DISPLAY + '[' '!' -d kernel-2.6.15/vanilla ']' + cd /usr/src/redhat/BUILD + rm -rf kernel-2.6.15 + /bin/mkdir -p kernel-2.6.15 + cd kernel-2.6.15 + /usr/bin/bzip2 -dc /usr/src/redhat/SOURCES/linux-2.6.15.tar.bz2 + tar -xf ... + echo '# x86_64' + cat .config + perl -p -i -e 's/^SUBLEVEL.*/SUBLEVEL = 15/' Makefile + perl -p -i -e 's/^EXTRAVERSION.*/EXTRAVERSION = -prep/' Makefile + find . -name '*.orig' -o -name '*~' -exec rm -f '{}' ';' + exit 0
La fuente kernel de Linux para Fedora ahora está ubicada en /usr/src/redhat/BUILD/kernel2.6.15/linux-2.6.15. Por convención, el árbol /linux-2.6.15 habitualmente se mueve a /usr/src y simbólicamente se vincula a /usr/src/linux, como se muestra en el Listado 14. Esto no es estrictamente necesario, pero es más fácil de seguir junto con las referencias que asumen que el árbol fuente de kernel estará en .usr./src/linux. Listado 14. Mover el árbol fuente a ./usr/src [root@attic4 SPECS]# mv ../BUILD/kernel-2.6.15/linux-2.6.15 /usr/src [root@attic4 SPECS]# cd /usr/src [root@attic4 src]# ln -s linux-2.6.15 linux [root@attic4 src]# ls -ld lin* lrwxrwxrwx 1 root root 12 Mar 20 18:23 linux -> linux-2.6.15 drwxr-xr-x 20 root root 4096 Mar 20 18:13 linux-2.6.15
Antes de intentar construir algo, revise el archivo Changes (Cambios) que aparece en el directorio Documentation (Documentación). Entre otras cosas, enumera los niveles mínimos de paquetes de software que usted necesita para construir un kernel. Asegúrese de tener estos paquetes instalados. Usted puede observar Makefile y .config entre los archivos que se muestran en el Listado 13. El archivo make contiene varios objetivos para tareas como configurar las opciones de kernel, construir el kernel y sus módulos, e instalar los módulos y construir RPM o paquetes deb. Las fuentes kernel más recientes le permiten usar make helppara brindar una ayuda rápida en cada objetivo. Para los sistemas más viejos, tal vez necesite consultar la documentación o examinar el archivo make. El Listado 15 muestra los datos de salida parciales paramake help.
25
Listado 15. Ayuda para el archivo make usado para construir kernels [ian@attic4 linux-2.6.15]$ make help Cleaning targets: clean - remove most generated files but keep the config mrproper - remove all generated files + config + various backup files Configuration targets: config - Update current config utilising a line-oriented program menuconfig - Update current config utilising a menu based program xconfig - Update current config utilising a QT based front-end gconfig - Update current config utilising a GTK based front-end oldconfig - Update current config utilising a provided .config as base randconfig - New config with random answer to all options defconfig - New config with default answer to all options allmodconfig - New config selecting modules when possible allyesconfig - New config where all options are accepted with yes allnoconfig - New minimal config Other generic targets: all - Build all targets marked with [*] * vmlinux - Build the bare kernel * modules - Build all modules modules_install - Install all modules dir/ - Build all files in dir and below dir/file.[ois] - Build specified target only ...
Configuración El archivo .config en su directorio de construcción de kernels contiene información de configuración para su kernel, incluyendo el entorno del equipo de destino, las funciones a incluir, y si una función debería compilarse dentro del kernel o construirse como un módulo. Crear el archivo .config es el primer paso para construir o reconstruir un kernel. Usted lo crea usando uno de los destinos de configuración en el archivo make. Las principales opciones de configuración son: config El destino config usa una interfaz de línea de comandos para obtener respuestas a muchas preguntas para construir o actualizar su archivo .config. Con el advenimiento de los destinos de configuración basados en menú, rara vez se usa esta interfaz de línea de comandos. menuconfig El destino menuconfig usa un programa basado en ncurses y en menú para crear o actualizar su archivo .config. Usted sólo necesita responder preguntas para los elementos que desee cambiar. Este enfoque ha desplazado el destino de configuración anterior. Usted lo ejecuta en una ventana de terminal de manera local o remota. xconfig El destino xconfig usa un sistema de menú gráfico basado en QT front-end, como el usado con el escritorio KDE.
26
gconfig El destino gconfig usa un sistema de menú gráfico basado en un GTK front-end, como el usado con el escritorio GNOME. oldconfig El destino oldconfig le permite construir una configuración usando un archivo .config ya existente, como el que podría tener de otra creación previa u otro sistema. Por ejemplo, si usted instaló la fuente kernel para Fedora, como se describió anteriormente, puede copiar el archivo de configuración para su sistema en ejecución de/lib/modules/$(uname r)/build/.config a /usr/src/linux. Una vez que lo construyó, puede usar uno de los objetivos de configuración del menú para modificarlo si fuera necesario. La Figura 1 le muestra qué podría ver si ejecuta make menuconfig para un kernel serie 2.4. Presione Enter para descender a menús de menor nivel, y presione Esc para volver. La mayoría de los elementos cuentan con ayuda disponible. Haga clic en< Help (Ayuda) > y presione Enter, o simplemente escriba h. Presione Esc para volver a la configuración. Figura 1. Ejecutar make menuconfig en un kernel 2.4
La Tabla 4 muestra las diferentes opciones para incluir funciones en el kernel, ya sea incorporado o como módulos. Cuando una opción se resalta, presione la barra espaciadora para seleccionar entre las opciones permitidas para esta función. También puede presionar y para activar una opción, n para desactivarla, o m para compilarla como un módulo si fuera posible. Tabla 4. Opciones para menuconfig
Opción Descripción
[*]
La función se incorporará a kernel.
[]
La función no se incluirá en el kernel.
La función se construirá como un
27
módulo kernel.
La función no se incluirá en el kernel, pero se puede construir como un módulo.
La Figura 2 muestra aquello qué podría ver si ejecuta make gconfig para un kernel serie 2.6. Haga clic en las flechas para maximizar o minimizar los elementos del menú. La Ayuda se visualiza en un panel inferior. Figura 2. Ejecutar make gconfig en un kernel 2.6
A continuación se describen las principales secciones de configuración para un kernel 2.6. Probablemente no las encuentre a todas en kernel 2.4 y versiones anteriores, pero esta lista brinda una orientación general para saber dónde se puede encontrar cada elemento. Opciones para nivel de madurez de códigos Esta sección contiene una opción que determina si las opciones restantes le permiten elegir un código que sea considerado experimental. Si usted no selecciona esta opción, entonces podrá seleccionar sólo aquellas opciones que se consideran estables. Tenga en cuenta que las funciones que elija pueden o no funcionar en el nivel de código actual de su sistema, así que podría tener la opción de ayuda con depuración. Configuración general Esta sección le permite incluir una cadena de identificación con su kernel nuevo, junto con las opciones para varios atributos de kernel que no pertenecen a otro lugar, pero que usted puede especificar.
28
Soporte de módulo que se puede cargar Esta sección contiene una opción que determina si su kernel soportará módulos y si se pueden cargar y descargar automáticamente. Usted debería habilitar el soporte de módulo. Nivel de bloque Esta sección contiene soporte para discos superiores a 2TB, y le permite elegir el tipo planificación de disco que usted desee. Tipo de procesador y funciones Esta sección contiene opciones de configuración específicas para CPU. Aquí usted elige el procesador o la familia de procesadores que soportará su kernel, como así también si habilitar o no el acceso a varias funciones de procesador. Asegúrese de habilitar soporte de multiprocesamiento simétrico si tiene más de una CPU o una CPU con hyperthreading. Generalmente, usted debería habilitar la opción MTRR para permitir un mejor rendimiento gráfico con tarjetas de video AGP o PCI. Opciones para administración de energía Esta sección contiene varias opciones de administración de energía que son particularmente útiles en computadoras portátiles. Además de controlar los estados de la energía, aquí también encontrará opciones para controlar y monitorear elementos como temperatura o estados de ventilador. Opciones de bus (PCI etc.) Esta sección contiene opciones para los buses soportados por su sistema, como buses PCI, PCI Express y PC Card. Aquí usted también puede habilitar el sistema de archivo /proc/pci, aunque en cambio debería usar generalmentelspci. Formatos de archivos ejecutables / Emulaciones Esta sección contiene opciones para soportar varios formatos de archivos binarios. Usted debería habilitar el soporte binario ELF, también puede habilitar el soporte para binarios DOS para ejecutarlos en DOSEMU, como así también binarios accionados por contenedor como Java™, Python, Emacs-Lisp, etc. Por último, para un sistema de 64 bits que soporta emulación de 32 bits, probablemente usted quiera habilitar soporte binario de 32 bits. Redes La sección de redes es grande. Aquí usted puede habilitar sockets básicos y redes TCP/IP, como así también filtros de paquetes, creación de puentes, ruteo y soporte para una variedad de protocolos como IPV6, IPX, Appletalk y X.25. Aquí también puede habilitar soporte de radio inalámbrica, infrarroja y amateur. Drivers de dispositivos Esta sección también es muy extensa. Aquí usted habilita el soporte para la mayoría de sus dispositivos de hardware, incluyendo IDE/ATAPI o unidades de disco duro SCSI y dispositivos de memoria flash. Habilite DMA para sus dispositivos IDE; sino trabajarán en
29
el modo PIO más lento. Si usted desea soporte para varios dispositivos como RAID o LVM, aquí es donde los habilita, también puede configurar soporte de puertos paralelos si desea soporte de impresoras paralelas. Aquí es donde también usted configura una amplia gama de dispositivos de redes para soportar los protocolos de redes que configuró anteriormente. También encontrará soporte para dispositivos de captura de audio y video, USB e IEEE 1384 (Firewire), como así también una variedad de dispositivos para el monitoreo de hardware. En el apartado de dispositivos de carácter, probablemente usted desee habilitar soporte para impresoras paralelas y direccionar el soporte suministrado. Drivers de firmware Esta sección contiene unas pocas opciones relacionadas con la configuración y actualización de BIOS, como el uso de las funciones de Dell System Management en ciertos sistemas Dell. Sistemas de archivos Esta sección es para configurar los sistemas de archivo que desea que soporte su kernel, ya sea compilado o como módulos. Aquí también encontrará sistemas de archivos para medios extraíbles como disquetes, CD o DVD, con soporte para sistemas de archivos en redes como NFS, SMB, o CIFS. Aquí también se puede encontrar soporte para una variedad de particiones y soportes para lenguaje nativo (NLS). Soporte de instrumentación Esta sección le permite habilitar soporte de generación de perfiles experimentales con el fin de crear los perfiles para los movimientos de su sistema. Piratería de Kernel Esta sección le permite habilitar la depuración de kernel y elegir qué funciones serán habilitadas. Opciones de seguridad Esta sección le permite configurar varias operaciones de seguridad y habilitar y configurar SELinux (Security Enhanced Linux). Opciones criptográficas Esta selección le permite configurar varios algoritmos criptográficos, como MD4, DES y SHA256. Rutinas de biblioteca Esta sección le permite decidir si ciertos algoritmos CRC deberían compilarse o construirse como módulos.
Construcción Ahora que ya conoce los aspectos principales de la configuración de un kernel, está listo para construir uno. Si no está seguro del estado de su árbol de construcción, ejecute make clean antes de configurar su kernel nuevo. Para un objetivo de limpieza más completo, ejecute make mrproper;
30
esto eliminará su archivo .config como así también otros archivos usados por el proceso de construcción. Si usted hace esto y luego necesita restaurar un archivo .config file guardado como copia de seguridad, necesitará ejecutar make oldconfig antes de configurar. Mientras esté experimentando, debería darle un nombre personalizado a su kernel nuevo para que pueda identificarlo fácilmente. Haga esto configurando un valor de versión local y activando la opción para agregar automáticamente información de la versión a la cadena de versión en la sección de Configuración general, como se muestra en la Figura 3. Figura 3. Configurar un kernel personalizado
Con la intención de adoptar pequeños pasos, los ejemplos que se presentan en el resto de este tutorial se basan en construir un kernel con sólo los dos cambios que se muestran en la Figura 3. En principio, el kernel no requiere autoridad de certificación raíz para construir, aunque usted la necesitará para instalar su kernel nuevo. Sin embargo, si usted está usando un paquete instalado por su distribución, probablemente deba ejecutar como raíz debido a los permisos de directorio y archivo que se han configurado. Usted puede practicar en el modo usuario mediante la descarga de un tarball de fuente kernel de los archivos kernel de Linux y desempaquetándolo en su directorio principal, o haciendo una copia de su árbol de construcción kernel y cambiando los permisos de su ID de usuario. Para comenzar a construir un kernel 2.6, escriba make. Para comenzar a construir un kernel 2.4, ejecute estos tres comandos: make dep make bzImage make modules El primero crea los archivos de dependencia necesarios. El segundo construye el kernel y el último construye sus módulos. Ejecutar make en mi sistema AMD Athlon 3500+ lleva aproximadamente media hora para completar la construcción desde su comienzo. Los sistemas más lentos pueden tardar un par de horas para completar esta tarea, así que tómese un descanso o haga alguna otra cosa mientras espera. Observará mensajes de avance de las tareas como los que se muestran en el Listado 16 mientras la construcción se está ejecutando.
31
Listado 16. Ejecución de make [root@attic4 linux]# make CHK include/linux/version.h HOSTCC scripts/basic/fixdep HOSTCC scripts/basic/split-include HOSTCC scripts/basic/docproc SPLIT include/linux/autoconf.h -> include/config/* CC arch/x86_64/kernel/asm-offsets.s GEN include/asm-x86_64/asm-offsets.h ... LD [M] sound/usb/snd-usb-lib.ko CC sound/usb/usx2y/snd-usb-usx2y.mod.o LD [M] sound/usb/usx2y/snd-usb-usx2y.ko
Instalación Cuando haya completado la construcción de su kernel, todavía tiene que completar un par de pasos. Primero, necesita ejecutarmake modules_installpara instalar sus módulos kernel en un subdirectorio nuevo ./lib/modules. Si usted necesita módulos de propiedad exclusiva para una tarjeta de video o driver de red, como necesito para mi tarjeta de gráficos nVidia y chipset de placa madre nForce 4, éste es un buen momento para construir módulos usando las herramientas suministradas por el proveedor. Por último, necesita ejecutar make install para instalar el kernel nuevo y el disco de memoria RAM inicial en /boot y actualizar la configuración de su cargador de arranque. Estos pasos se ilustran en el Listado 17. Listado 17. Instalar el kernel y los módulos [root@attic4 linux]# make modules_install INSTALL arch/x86_64/crypto/aes-x86_64.ko INSTALL arch/x86_64/kernel/cpufreq/acpi-cpufreq.ko INSTALL arch/x86_64/kernel/microcode.ko INSTALL arch/x86_64/oprofile/oprofile.ko INSTALL crypto/aes.ko INSTALL crypto/anubis.ko INSTALL crypto/arc4.ko ... [root@attic4 linux]# ls -lrt /lib/modules | tail -n 3 drwxr-xr-x 5 root root 4096 Mar 4 14:48 2.6.15-1.1831_FC4 drwxr-xr-x 5 root root 4096 Mar 20 18:52 2.6.15-1.1833_FC4 drwxr-xr-x 3 root root 4096 Mar 20 21:38 2.6.15-prep-Topic105 [root@attic4 linux]# sh /root/NFORCE-Linux-x86_64-1.0-0310-pkg1.run -a \ > -n -K -k 2.6.15-prep-Topic105 Verifying archive integrity...OK Uncompressing NVIDIA nForce drivers for Linux-x86_64 1.0-0310................... [root@attic4 linux]# sh /root/NVIDIA-Linux-x86_64-1.0-8178-pkg2.run -a \ > -n -K -k 2.6.15-prep-Topic105 Verifying archive integrity... OK Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 1.0-8178.............. [root@attic4 linux]# make install CHK include/linux/version.h CHK include/linux/compile.h CHK usr/initramfs_list
32
Kernel: arch/x86_64/boot/bzImage is ready (#2) sh /usr/src/linux-2.6.15/arch/x86_64/boot/install.sh 2.6.15-prep-Topic105 arch/x86_64/boot/bzImage System.map "/boot" [root@attic4 linux]# ls -lrt /boot | tail -n 6 -rw-r--r-- 1 root root 1743149 Mar 20 21:45 vmlinuz-2.6.15-prep-Topic105 lrwxrwxrwx 1 root root 28 Mar 20 21:45 vmlinuz -> vmlinuz-2.6.15-prep-Topic105 -rw-r--r-- 1 root root 980796 Mar 20 21:45 System.map-2.6.15-prep-Topic105 lrwxrwxrwx 1 root root 31 Mar 20 21:45 System.map -> System.map-2.6.15-prep-Topic105 -rw-r--r-- 1 root root 1318741 Mar 20 21:45 initrd-2.6.15-prep-Topic105.img drwxr-xr-x 2 root root 4096 Mar 20 21:45 grub
Disco RAM inicial Observe que el proceso de construcción creó automáticamente el disco RAM inicial necesario (initrd) para usted. Siempre que necesite crear uno manualmente, hágalo usando el comando mkinitrd. Consulte las páginas man para obtener más detalles.
Cargadores de arranque Si todo funcionó correctamente, el paso make install también debería haber actualizado la configuración de su cargador de arranque. En el Listado 18 se muestran algunas líneas del mío. Listado 18. Archivo de configuración GRUB actualizado default=1 timeout=10 splashimage=(hd0,5)/boot/grub/splash.xpm.gz password --md5 $1$y.uQRs1W$Sqs30hDB3GtE957PoiDWO. title Fedora Core (2.6.15-prep-Topic105) root (hd0,11) kernel /boot/vmlinuz-2.6.15-prep-Topic105 ro root=LABEL=FC4-64 rhgb quiet initrd /boot/initrd-2.6.15-prep-Topic105.img title Fedora Core -x86-64 (2.6.15-1.1833_FC4)
La entrada para el kernel recientemente creado se colocó en la parte superior, pero se ajustó la entrada predeterminada para que se mantenga como la predeterminada anterior. Si en cambio usted usa LILO, entonces el comando grubby que se usa en el scrip construido debería haber actualizado su configuración LILO. Un comentario final. Usted se preguntará por qué la configuración de muestra agregó -Topic105, aunque todos los archivos creados tenían en cambio -prep-Topic105. Esta es una medida de seguridad de Fedora para evitar que usted inadvertidamente destruya su kernel activo. Esto se controla con la variable EXTRAVERSION configurada cerca de la parte superior del archivo make principal, como se muestra en el Listado 19. Edite el archivo si necesita eliminar esto. Listado 19. Archivo de configuración GRUB actualizado [root@attic4 linux]# head -n 6 Makefile VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 15 EXTRAVERSION = -prep NAME=Sliding Snow Leopard
33
Reiniciación Si todo funciona bien, ahora usted debería poder arrancar su sistema nuevo. Necesitará seleccionar la entrada de configuración para el kernel nuevo porque no está (todavía) predeterminada. Una vez que esté satisfecho con ella, puede predeterminarla. Cuando reinicie, use el comando uname para verificar el kernel de su sistema, como se muestra en el Listado 20. Listado 20. Verificación del nuevo sistema [ian@attic4 ~]$ uname -rv 2.6.15-prep-Topic105 #2 Mon Mar 20 21:13:20 EST 2006
Recursos Aprender • En "Tareas básicas para nuevos desarrolladores Linux" (developerWorks, marzo 2005), aprenda cómo abrir una ventana de terminal o ejecutar shell prompt y mucho más. •
Los archivos Kernel de Linux es el último recurso para el kernel de Linux. Verifique su espejo más cercano antes de descargar.
•
El proyecto kernelnewbies posee mucha información para aquellos que recién se inician en kernels y cómo crearlos.
•
La Kernel Rebuild Guide le muestra cómo configurar, construir e instalar un nuevo kernel.
•
La Linux Kernel Module Programming Guide de Linuxtopia es un libro online sobre los módulos kernel para Linux.
Autor:
David Mertz es Turing completo, pero probablemente no apruebe la Prueba de Turing. Para conocer más acerca de su vida, consulte su página Web personal. David escribe las columnas developerWorks Charming Python y XML Matters desde el año 2000. Consulte su libroText Processing in Python [Procesamiento de texto en Python]. Compilación y edición: Ing. Sergio Aguilera. Facultad de Tecnología Informática. Universidad de Belgrano.
[email protected] Todos los Derechos Reservados a IBM Corp. – Marzo 2012.
34