Varios
Enviar email
In English please

Valid XHTML 1.0! ¡Valid CSS 2.1!

Lecturas -

Para prepararme para mi charla del Linux Demo Day '99 en Uruguay organizada por el UYLUG (Grupo de Usuarios Linux del Uruguay) escribí las cosas que quería mas o menos decir y en el orden en que las pensaba decir.

Éste documento es el resultado de esa preparación luego de ser aprolijada un poco como para ser publicada en una página WEB, con el motivo de que talvez a alguien le sirva.

¿Qué es el Kernel?

El kernel es un programa especial que maneja el hardware de la computadora y permite correr otros programas, los cuales dependen del kernel para funcionar y tienen poca o ninguna idea acerca de éste hardware.

El kernel Linux posee varias caracteristicas muy comunes en los sistemas Unix como:

  • Verdadera multitarea (el que solo uso Windows en su vida, no conoce la multitarea verdadera, por ejemplo, es imposible que un programa paralize toda la computadora o que cuando se formatee un diskette la computadora se congele por completo).
  • Memoria virtual (esto es un complejo manejo de la memoria, con utilizacion de disco duro como memoria, deteccion de accesos ilegales, etc).
  • Librerías compartidas (ésto permite ejecutables mas pequeños y una utilización mas eficiente de la memoria del sistema).
  • Carga por demanda (esto es un mecanismo complejo que permite que solo lo que se usa de un ejecutable o libreria sea cargado en memoria, y luego, si la memoria escacea, la memoria ocupada por ejecutables y librerias que no se esté usando es liberada sin necesidad de hacer swap a disco).
  • Ejecutables compartidos con copia en escritura (esto es que cuando se ejecuta varias veces el mismo programa al mismo tiempo, es decir, hay múltiples instancias corriendo de un mismo programa, la memoria usada por las diferentes instancias del programa es la misma, es decir, comparten memoria; cuando una de las instancias del programa quiere modificar parte del contenido de esa memoria compartida, esa parte es copiada a otra region de memoria y modificada por esa instancia del programa; es decir que comparten memoria hasta que alguna instancia modifique una parte y ahi el contenido se copia y la instancia hace la modificación; en definitiva es un uso mas eficiente de la memoria).
  • Módulos cargados y descargados dinamicamente (los módulos del kernel son pequeños programas que agregan funcionalidad al kernel; muchas partes del kernel pueden ser compiladas en módulos en vez de tenerlas todas en el módulo principal del kernel, ésto permite que dicho módulo sea cargado solamente cuando su funcionalidad sea requerida y sea descargado cuando ya no sea necesaria; la carga y descarga de módulos puede hacerse de forma automática y dinámica, así como también manualmente).
  • Completo sistema de manejo de redes, multimedia (audio, video, scanners), dispositivos infrarojos, comunicaciones radiales, etc.
  • Manejo transparente de varios sistemas de archivos al mismo tiempo (es decir, se puede acceder al sistema de archivos propio de Linux al mismo tiempo que al de Windows o varios otros sistemas de archivos).
  • Manejo de administración avanzada de energía (para ahorrar batería en los LapTops o computadores portátiles y evitar contaminación del medio ambiente).
  • Soporte de dispositivos Plug&Play para PCI e ISA (ésto permite la autodetección y seteo automatico de éstos dispositivos).

El mismo se distribuye mediante la licensia publica de la GNU (o sea la GPL), que muy resumidamente dice que el software es gratuito y con código fuente abierto.

Linux corre en computadoras compatibles Intel 386 o superior, ARM, DEC Alphas, SUN Sparcs, Motorola 68000 (como Atari y Amiga), MIPS, PowerPC, IBM S/390 y otras.

Versiones, instalación y actualización del kernel

El código fuente del kernel se instala en el directorio "/usr/src/linux".

Para obtener la versión del kernel, puede fijarse en el archivo llamado "Makefile", que es un archivo de texto y que al principio del mismo dice por ejemplo "VERSION = 2", en la siguiente linea dice "PATCHLEVEL = 2" y en la siguiente linea dice "SUBLEVEL = 13", bueno, esto correspondería a la versión 2.2.13 del kernel.

¿Cómo es la versión del kernel?: bueno, el primer numero corresponde a la versión mayor, éste numero es incrementado cada vez que se hacen cambios muy importantes. El segundo número corresponde a versiones que incorporan cambios de mediana importancia, como agregar soporte para una cierta tecnología nueva o mejoras en performance, etc., éste numero cuando es par significa que el kernel es una versión estable, si es inpar significa que el kernel es experimental y que sólo personas que pretendan testearlo y programar en él deberían usarlo. El tercer numero es la versión de revisión y cambia cada vez que se realizan cambios de menor importancia, como corrección de errores, o adición de algun controlador para cierto dispositivo, y otros cambios que no afectan negativamente la estabilidad. En el caso de los kernels experimentales (que repito son los que el numero de versión del medio es inpar) la tercer versión cambia cada vez que hay cambios y una versión puede andar relativamente bien pero la siguiente versión puede romper muchas cosas o ni siquiera compilar.

El principal lugar para bajarse el código fuente entero del kernel o parches es http://www.kernel.org/.

¿Qué es un parche?: un parche es un pequeño archivo que contiene las diferencias entre una versión de un archivo o conjuntos de archivos y otra. En el caso del kernel los mismos son para actualizar e incrementar en 1 la versión de revision (es decir el tercer número) y deben ser aplicados en orden, es decir, si la versión del kernel que se tiene es la 2.2.11, hay que bajarse el parche para la version 2.2.12 y el parche para la versión 2.2.13, luego hay que aplicar primero el parche de la versión 2.2.12 y despues el de la 2.2.13, no se puede alterar éste orden.

Si no se tiene instalado el Kernel, se debe ir hacia el directorio "/usr/src" y ejecutar el comando "tar -xzvf /ruta/archivo_del_kernel_bajado.tar.gz".

Si ya se tiene instalado y se desea aplicarle parches para actualizarlo, hay que ir hacia el directorio "/usr/src/linux" y ejecutar el comando "make mrproper" para borrar algunos archivos regenerables y modificaciones que se hicieron desde la ultima vez que se compilo el kernel. Luego se ejecuta el comando "gzip -cd /ruta/parche_bajado.gz | patch -p1" desde el mismo directorio, corriendo éste comando por cada parche en orden y secuencialmente.

Los posibles motivos para compilar el kernel

Pueden haber varios motivos para desear compilar el kernel.

Algunos de ellos pueden ser por ejemplo, el aumento de la performance del sistema por compilar un kernel especifíco al mismo, es decir, compilarlo optimizado para el procesador en el que corre y sin funcionalidades innecesarias; otro motivo puede ser la actualización del kernel porque las versiones nuevas corrigen errores o mejoran la performance de versiones anteriores; y otro motivo puede ser tambien la necesidad de tener un kernel mas nuevo porque soporta mas hardware o mejora el soporte para el hardware soportado en versiones anteriores. Para otras personas un motivo puede ser el gusto de compilarlo y de tener la última versión del mismo.

Compilación del kernel

Estando en el directorio donde está instalado el kernel, se ejecutan los comandos:

  • "make mrproper", para borrar archivos regenerables y revertir modificaciones que se hallan hecho anteriormente.
  • "make config", "make menuconfig", "make xconfig" o "make oldconfig". Se debe ejecutar uno de estos comandos para configurar las opciones del kernel, las cuales se graban en el archivo oculto ".config".
    • "make config" configura el kernel usando solamente al shell Bash (el cual es el mas común en Linux) y preguntando las opciones linea por linea.
    • "make menuconfig" es un método para modo texto mejorado con cuadros de dialogos a color y mayor libertad de uso, para poder usar éste método es necesario poseer los paquetes de desarrollo de programas basados en curses.
    • El método "make xconfig" es posiblemente el método mas intuitivo de todos, porque funciona bajo XWindow y es gráfico; para poder usar éste método es necesario tener instalados los paquetes de desarrollo para TCL/TK.
    • "make oldconfig" es un método especial, similar al "make config" pero que sirve para actualizar una anterior configuración del kernel a una nueva versión de éste, formulando solamente las preguntas nuevas. Por supuesto que para que funcione debe estar presente el viejo archivo de configuración, el cual es borrado por el "make mrproper" del principio, por lo tanto es recomendable luego de compilar un kernel, respaldar el archivo ".config" para la próxima versión que halla que compilar y restaurarlo luego del "make mrproper" y antes del "make oldconfig" del nuevo kernel.
    Todos éstos sistemas de configuración tienen ayuda en linea.
  • "make dep", para setear las dependencias, es decir, se fija qué partes del kernel han de ser compiladas.
  • "make bzImage", éste comando compila el kernel y deja la imagen instalada en el directorio "/usr/src/linux/i386/boot" con el nombre "bzImage".
  • "make modules". Éste comando compila las partes del kernel seleccionadas para que se compilen cómo módulos.
  • "make modules_install", para instalar las partes compiladas cómo módulos, en el directorio "/lib/modules/version", donde "version" es la versión del kernel como por ejemplo "2.2.13".
  • "make bzdisk", "make bzlilo" o "make install".
    • "make bzdisk" crea un diskette booteable en la primer unidad de diskettes, es necesario insertar un diskette vacio antes de ejecutar dicho comando. Esto es muy recomendable para probar que funcione un kernel nuevo.
    • "make bzlilo" instala el nuevo kernel en el archivo "/vmlinuz", haciendo un respaldo del anterior llamado "/vmlinuz.old", también instala un archivo con ciertos datos necesrios del kernel en "/System.map" respaldando los anteriores en "/System.old", y luego actualiza el LiLo, el cual es el programa que se encarga de cargar el kernel cuando la maquina prende.
    • "make install" instala el kernel según un programa "~/installkernel" o si éste no existe, "/sbin/installkernel". Ésto es usado por ejemplo para instalar el kernel de la forma que le guste al usuario por medio de un script que halla hecho él, o sino de la forma que utiliza su distribución, la cual varía de distribución en distribución. En caso de no existir ninguno de esos dos programas, es idéntico a "make bzlilo".
  • LoadLin: para aquellos que usan LoadLin para cargar el kernel (es un programa de DOS que permite cargar a Linux desde DOS), no deberán ejecutar "make bzlilo" o "make install" en el paso descrito anteriormente, sino que deberán copiar la imagen del kernel ubicada en el directorio "/usr/src/linux/i386/boot" con el nombre de "bzImage" a alguna partición de disco de DOS y decirle a LoadLin que cargue dicha imagen (para saber cómo hacer esto ver la documentación de LoadLin) y reemplazar el archivo "/System.map" o "/boot/System.map" con el archivo "/usr/src/linux/System.map".

¡Luego de seguir éstos pasos, reiniciar la máquina y probar el nuevo kernel!