Mostrando las entradas con la etiqueta linux-kernel. Mostrar todas las entradas
Mostrando las entradas con la etiqueta linux-kernel. Mostrar todas las entradas

¿Qué ocurre al iniciar Linux?

Pues una pregunta muy interesante a si que veamos gráficamente que es lo que ocurre cuando iniciamos nuestro querido linux.

Articulo completo en http://gndx.org/

Visto en BlogUbuntu


Novedades para el futuro Kernel 2.6.24

  • Soporte de Tickless: Una nueva infraestructura para gestionar el tiempo muerto de la CPU.
  • Markers: Esta es una de las partes que conforma lo que podríamos llamar "DTrace de Linux".
  • Puntos de montaje "bind" de sólo lectura: Ahora se pueden hacer monturas "bind" de sólo lectura.
  • Mejoras del gestor de procesos: Se podrá configurar cómo particionar el tiempo de CPU entre usuarios o grupos.
  • Antifragmentación de la memoria: Una mejora definitiva que afecta a la asignación de memoria al más bajo nivel posible.
  • Task Control Groups: Esta es una caracterísitica que sirve para la asignación y control de recursos a grupos de procesos.
  • Drivers para dispositivos inalámbricos: En Linux se añaden drivers continuamente, pero en esta ocasión se ha añadido una buena cantidad más.
  • Autorización USB: Ahora la pila USB puede configurarse a través de sysfs para que los dispositivos USB conectados al sistema no esten "autorizados" para funcionar.
  • Reunificación x86-32 y x86-64: Ya no hay arch/i386 y arch/x86_64, ahora hay arch/x86 (aunque se conservan algunos enlaces simbólicos por compatibilidad).
  • Espacios de nombres para los PIDs y la pila de red: Esto tiene que ver con la virtualización a nivel de sistema operativo, tipo vServer o OpenVZ, las "jails" de los BSDs o los Containers de Solaris.
  • Límites de memoria "sucia" para cada dispositivo: Los límites de la cantidad de memoria que puede estar "sucia" (sin escribir a disco) son independientes para cada dispositivo y se calculan dinámicamente.
  • Soporte SPI/SDIO en la capa MMC: ¿Sabían ustedes que las mierdas de ranuras donde se meten las tarjetas de memoria MMC en las cámaras digitales pueden actuar como bus si al fabricante le da la gana añadir los cables y chips necesarios, y que se les puede conectar tarjetas de red y cosas así? Ahora Linux soporta esa tecnología.
Artículo completo en Linux Al Poder. copy and paste vivalinux!

Torvalds: "No necesitamos un kernel 3.0"

En APC Magazine, se ha publicado una entrevista realizada a Linus Torvalds uno de los comentarios de Linus Torvalds fue: "Precisamente esa evolución continua le hace desestimar la hipotética salida del kernel 3.0, algo que será difícil que veamos a corto plazo"

Tambien ha destacado la buena marcha del kernel 2.6, al que cada 2 o 3 meses se le realizan cambios significativos, pero no radicales.

La entrevista al completo en inglés, en APC Magazine, con muchos más detalles:
http://apcmag.com/7012/linus_torvalds_talks_about

Fuente Linux para Todos

Charla de Andrew Morton sobre el estado actual del kernel

Andrew Morton, actual mantenedor de la rama mm de Linux (que contiene parches que no están suficientemente probados y que acabarán entrando en la rama 2.6), dio en Google una charla sobre el estado actual del kernel. En ella se habla sobre los cambios recientes en el núcleo, los varios frentes abiertos en los que se está trabajando y también sobre varias partes que están un poco descuidadas y qué acciones deberían tomarse para remediar esto. Por último se habla de la gran importancia que tienen los pequeños 'testers' individuales y da varios consejos sobre como mejorar la efectividad de sus contribuciones. Sin duda una charla muy recomendable para quien le apetezca ponerse al día del desarrollo de Linux.

Fuente Barrapunto

Anatomía del kernel Linux

Muchos medios confunden el nombre del núcleo del sistema operativo ('Linux') con el sistema operativo en sí --que debería ser llamado GNU/Linux-- pero para aclarar más la situación podemos leer un interesante artículo sobre las principales características y subsistemas que componen el kernel Linux, así como un repaso a la historia de su desarrollo. El artículo, de la excelente base de conocimiento de IBM, es de lectura obligada para los linuxeros.

Leido en Barrapunto

Traducido "Linux kernel management style"

Se a publicado una traducción de "Linux kernel management style", el maravilloso documento de Linus Torvalds sobre gestión del kernel.
Tras un breve periodo de revisión comunitaria por fin se da a conocer al gran público la traducción del documento realizada con permiso del propio Linus. Empieza así: "El estilo de gestión es muy personal y mucho más difícil de cuantificar que las reglas de estilo de programación, así que este documento puede tener o no que ver con el mundo real. Empezó como un divertimento, pero eso no quiere decir que no pueda ser verdad. Tendrás que decidir por ti mismo."

Leido en Barrapunto

Linux Kernel v0.01

Para nostalgicos, coleccionistas, curiosos, fetichistas, geeks, nerds.......etc,etc.
Observe que es un UNIX apenas funcional con toneladas de bugs,. Mucha gente lo utiliza como el primer paso al aprender a hackear el núcleo de Linux, tiene alrededor de 10.000 lineas.

Descarga

Cambios en Linux 2.6.19

Desde el blog de Diego Calleja, responsable de LinuxChanges, vemos las nuevas características que se están añadiendo a la siguiente versión del kernel Linux, la 2.6.19. Un Changelog para humanos.

Kernel: nueva numeración

A partir de ahora, los kernels numerados 2.6.impar serán versiones "inestables", y no se aceptarán nuevas funcionalidades para el siguiente kernel par, sino que sólo podrán corregirse bugs. La idea, original de Alan Cox en la Linux Kernel Mailing List, ha recibido el visto bueno de Andrew Morton y Linus Torvalds.
Esta medida acaba con el sistema antiguo, en el que la versión inestable del kernel era la 2.impar.numerodeversión. Asi que atentos al cambio. Mas información

Animación 3D del desarrollo del Kernel

Aunque es un poco vieja, esta aninación no tiene desperdicio. Se trata de un tour 3D guiado por el desarrollo del código fuente del Kernel 2.4.5 teniendo en cuenta las siguientes referencias:

* Los cuadrados grises son archivos.
* Un árbol verde es una estructura de directorio.
* Las líneas azules son dependencias de funciones.
* Las líneas rojas son dependencias de variables.
* Los flashes amarillos muestran modificaciones en el tamaño de los archivos.
* Los flashes verdes muestran archivos movidos de un directorio a otro.
* Los flashes rojos son nuevos archivos.




Fuente: VivaLinux

The Linux Kernel Map

Aquí está un fácil organigrama de seguir (???)para todos los que dicen que Linux es complicado.

Mitos, mentiras y verdades sobre el Kernel de Linux

Una presentación muy interesante del simposio 2006 de OLS que habla de los mitos del núcleo de Linux, cuál es la comunidad alrededor del núcleo de Linux y cómo usted puede conseguir implicado. En Ingles

Enlace

Razones para usar kernels precompilados

Hay una especie de "regla no escrita" en el mundo linuxero que dice que toda persona "debe" compilar su propio kernel, como parte de su proceso de aprendizaje o de incremento de su "estatus geek". Nada más lejos de la realidad

El kernel, al igual que el resto del software del sistema, no deberia necesitar compilarse - como cualquier software diseñado decentemente. Lo que mucha gente no sabe es que Linux 2.6 es lo suficientemente avanzado como para que un kernel precompilado funcione perfectamente sin retoques en la mayoría de sistemas

* Razón 1: Hay un mito sobre el kernel: La gente piensa que optimizando el kernel, el sistema irá más rápido, y que si no lo haces irá lentísimo y estarás desaprovechando tu equipo.

Vamos a ignorarlo y hacer un análisis serio. Pregunta: ¿Cuanto tiempo de CPU gasta un sistema normal ejecutando codigo en espacio de usuario y cuanto gasta ejecutando código del kernel?. sar (maravilloso programa que no debería faltar en vuestros sistemas) puede decirlo:

20:05:01 CPU %user %nice %system %iowait %idle
20:05:01 all 6,23 0,00 0,50 0,25 93,03


Como se puede ver en este caso, de todo el tiempo de CPU transcurrido en mi sistema en un uso típico de escritorio (email, firefox, escribir artículos malos) solo un 0.50% del tiempo de CPU ha sido utilizado por el kernel, y un 6.23% por programas de espacio de usuario (un servidor dará diferentes números, de hecho un servidor web dará porcentajes diferentes a un pc haciendo de router). Es decir, 12.46 veces más. De todos los ciclos de CPU durante el que se ejecuta "software real" (todo lo que no es tiempo "idle") el 92.57% se ejecutan en espacio de usuario, y un 7.42% en el kernel.

Lo que quiere decir esto es que en un uso normal el sistema se pasa la mayor parte del tiempo ejecutando software en espacio de usuario, y que por lo tanto optimizar el kernel no mejorar el rendimiento del sistema de manera notable, por la simple razón de que la mayor parte del tiempo no es su código el que se está ejecutando. En las distros precompiladas tiene especialmente poco sentido: ¿Para qué optimizar para el procesador de turno el 7.42% del tiempo de ejecución si el software que se ejecuta el 92.57 del tiempo está "optimizado" para i586 o i386?.

Esto tampoco quiere decir que la optimización no influya en absoluto: Hay ciertas funciones (como las funciones que mueven porciones de memoria de un sitio a otro) que se utilizan mucho y algunas tienen incluso optimizaciones específicas en ensamblador. Lo que quiero decir es que esperar que el optimizar el kernel vaya a acelerar notablemente un sistema típico es lo mismo que esperar que un grano de arena sea distinguible en un desierto.


* Razón 2: Las diferencias entre procesadores puede que no justifican la optimización. Eso tampoco quiere decir que no existan esas diferencias o que no vayan a influir: Simplemente, las diferencias no son tan grandes como para justificar la optimización. Las distribuciones suelen tener un kernel i586 por defecto (excepto ubuntu y debian) y muchas kernels precompilados adicionales disponibles (para k7, para athlon64, para p4) en los repositorios. En serio, no necesitas recompilar el kernel solo porque en el kernel no añadieron una opción al gcc que tu "sabes" que en "teoria" optimiza mucho el ejecutable para tu máquina. Como ejemplo extremo está Ubuntú: Su kernel por defecto está optimizado con instrucciones de i386 (pero optimizadas para un pentium 4, esto es otro tema), y apuesto a que mucha gente ni siquiera se ha dado cuenta. Además hay que tener en cuenta una pecularidad de la plataforma x86: Todos sus procesadores se parecen "enormemente" entre si. De hecho, es la base de su éxito: Si x86 está donde está es en gran parte por no cambiar demasiado y preservar la compatibilidad lo máximo posible. En general, cuando las empresas dedicadas a CPUs preparan una nueva versión de CPU intentan copiar al máximo y dentro de las posibilidades de la nueva arquitectura el comportamiento de los procesadores anteriores, por la simple razón de que los compiladores tardan años en optimizarse para una arquitectura determinada. Eso puede suponer que al salir el producto a la calle el rendimiento sea pobre y que el producto fracase comercialmente. ¿A alguien le suena Itanium?

Una de las principales diferencias entre los x86 (además de las diferencias fundamentales como netburst vs opteron etc) son las extensiones "multimedia": MMX, SSE, 3dnow. Estas son especialmente irrelevantes para el kernel: Existe una regla en el kernel que prohibe utilizar código en punto flotante en el kernel excepto en unos pocos lugares controlados (usarlo demasiado obligaría a guardar los contenidos del coprocesador matemático entre cambios de contexto y eso enlentecería mucho el kernel). Se utilizan en algunos puntos, pero se evitan como si tuvieran la peste

Lo que quiero decir aquí es que esto es como los benchmarks de Intel vs AMD: "En x benchmark AMD gana a intel un 5%". Si, el AMD es más rápido, pero esa "ventaja" supone que en vez de tardar un minuto el amd lo hace en 59 segundos, que es prácticamente lo mismo. Es muy probable que no notes las optimizaciones que estes haciendo al compilar a mano el kernel. Son demasiado pequeñas. Las principales diferencias vienen casi siempre de mano los algoritmos: No hay optimización de procesador en el mundo que vaya a hacer que el kernel descarte correctamente tal o cual dato en el cache de disco o el orden correcto en el elevator del kernel, por ejemplo, y te aseguro que esa decisión va a influir muchísimo más en el rendimiento de tu máquina que cualquier optimización a nivel de procesador


* Razón 3: Seguridad: Si descargas y compilas tu propio kernel, el día que haya un fallo de seguridad en el kernel tendrás que: 1) Enterarte. Algo que no es fácil, porque los fallos de seguridad del kernel casi nunca se reportan en barrapunto o slashdot o osnews (y si piensas que si, significa que no te has enterado de muchos fallos de seguridad o incluso de que alguien ha hackeado tu servidor gracias a uno de esos bugs y tiene instalado un rootkit en él ahora mismo, y no tengo por qué estar siendo paranoico) 2) reconfigurar 3) recompilar

Sin embargo, si instalas un kernel precompilado, lo instalarás a partir de los paquetes de tu distro, y los sistemas de actualización de tu distro te lo actualizarán automáticamente en cuanto haya nueva actualización de seguridad. Es una opción bastante más inteligente...


* Razón 4: Tener muchas cosas (opciones) compiladas en el kernel no daña necesariamente el rendimiento: Alguna gente se cree que tener todos los sistemas de archivos en el kernel, o la emulación de coprocesador matemático va a hacer las cosas mas lentas. ¿Por qué? No se trata mas que de un gran IF: Si algo no se usa, no tiene porque afectar al resto. El código de un dispositivo que no se tiene jamás se ejecutará. Y por supuesto la mayoría de kernels precompilados no hacen esas cosas - se modularizan las cosas exageradamente, hasta el punto que algunas distros nisiquiera compilan el sistema de archivos del sistema de archivos root / en el kernel, compilan todos como módulo y cargan el necesario en el initrd


* Razón 5: Tener muchos módulos es útil: La gente suele compilar su kernel porque quiere "compilar solo el soporta para su hardware y quitar el resto". Esto está relacionado con el punto anterior. La pregunta es: ¿Por qué? Los módulos no utilizan nada más que espacio en el disco al menos que no se carguen. Probablemente tengas un /usr/X11R6/lib/modules/drivers/vmware_drv.o en tu sistema. ¿Recompilas las X solo para desactivar ese driver? ¿Recompilas para desactivar las librerias de accesibilidad de gnome solo porque no las necesitas? Tener 100 o los módulos que sean ahí no hace daño. Tampoco es ninguna guarrada: Es lo correcto. El objetivo del kernel es que tu hardware funcione, y el soportar más hardware del que tienes significa que podrás cambiar de hardware sin recompilar el kernel: Y esto es importante para todos, porque con USB y firewire es imposible determinar en tiempo de compilación que dispositivos vas a acabar conectando a tu equipo. La flexibilidad es una característica del software, y es buena.

Una vez sufrí un problema relacionado con esto: No tengo un lápiz USB, asi que no tenía compilado el soporte. Pero resulta que un amigo vino con un disco duro externo USB, y como no tenia ganas de hacerle soportar la espera de compilar un kernel, tuve que iniciar en Windows. Windows paraba la transferencia a la mitad y el driver dejaba de funcionar asi que finalmente tuve que hacer esperar a mi amigo. Moraleja: Un sistema moderno tiene USB y firewire y por lo tanto no tiene una configuración de hardware estática

Udev es quien se encarga de hacer gran parte del trabajo de configurar el hardware del sistema y cargar los modulos de tu hardware y no cargar los que no son. Si yo por ejemplo enchufo mi webcam Creative Go Plus, el kernel notifica a udev de que se ha insertado un dispositivo en el bus usb, udev mira que es mirando identificando el hardware y carga los dos ó 3 módulos de soporte básico de USB, el módulo de la camara, el módulo del chip de la camara, y el módulo de V4l. Automaticamente. Pero si no la enchufo, no las carga, y puedo hacer que udev descargue los módulos cuando desenchufo la cámara - no hay "bloatware" en ningún lado. Las máquinas se inventaron para hacer cosas por nosotros. Utilizalas para ello y utiliza un kernel precompilado y udev. Muchisima gente de la que compila su kernel a mano no activa el soporte de hotplug (necesario para udev), porque piensa "que no lo necesita". Lo cual nos lleva al siguiente punto


* Razón 6: Configurar el kernel no es fácil y los mantenedores del paquete precompilado saben que necesitas mucho mejor que tú, aunque no lo creas: El número de opciones disponibles en la fase de configuración del kernel se multiplica en cada versión, y a día de hoy es prácticamente imposible saber configurar correctamente todas las opciones. Mi config tiene 1034 opciones diferentes entre las activadas y desactivadas. ¿Sabes configurar correctamente esas 1034 opciones? Puedes pensar que sabes, pero siendo realistas no hay nadie en el mundo que sepa configurar por si mismo un kernel por completo. Yo llevo años compilando decenas y decenas de kernels por afición al desarrollo del kernel, y aun hay muchas opciones que no se que hacen, ni si debería activarlas o no. Ni tan siquiera los hackers del kernel lo saben, ni Linus Torvalds, te lo aseguro (bueno, quizás Alan Cox...) Los que mantienen una arquitectura no se enteran de que cosas están haciendo los del soporte USB, y viceversa. Por si fuera poco, muchas opciones no están documentadas (o están mal documentadas, que es peor), algunas son peligrosas y otras no puedes saber si activarlas o desactivarlas porque simplemente te da lo mismo (como pasa con cualquier proyecto software que tenga este tamaño: nadie puede conocer 200 MB de código C, además en linux se tiene la "manía" de hacer todo extremadamente configurable hasta el punto que dudo mucho que exista un kernel más configurable) Y la configuración por defecto que trae el kernel de kernel.org está muy lejos de tener los valores por defecto ideales. Moraleja: Deja que los mantenedores de tu distribución se ocupen de la compleja tarea de configurar el kernel. Ellos tienen los recursos (varias personas, sistemas de seguimiento de bugs por si se equivocan en algo, etc) para hacerlo, tú no.

¿Y esto para que lo escribo? Para intentar evitar que la gente se pase la vida compilando kernels por "tradición". Eso no quiere decir que esté prohibido compilarles: Compilar kernels es una actividad divertida y entretenida para un geek, siempre que tenga una razón para ello (por ejemplo, que le da la gana). Lo absurdo es hacer lo que hace la gente: Compilar por que si, sin tan siquiera tener ganas, como si fuera una "obligación" a su estatus de "geek".

Autor: Diego Calleja - http://diegocg.blogspot.com/

Actualizando al kernel 2.6.10 en Slackware 10.1

Autor: Paco Revilla
URL: http://www.espaciolinux.com
Esta guía es una modificación del documento publicado en el taller Linux, titulado: Actualizando al kernel 2.6.7 en Slackware 10. Por motivo de claridad se han hechos modificaciones para adaptarlo al nuevo kernel 2.6.10 que la nueva versión 10.1 de Slackware incluye en su paquetería testing. Aunque el proceso para instalar este kernel es el mismo que ya antes se había explicado, ha habido la necesidad de aclararlo con sus correspondiente versión para que pueda ser de mejor utilidad para quien lo necesite.

Paquetes a utilizar
Lo primero que tenemos que hacer es identificar e instalar los paquetes necesarios para iniciar la configuración de nuestro nuevo kernel. La mayoría de los paquetes necesarios los podemos encontrar en el directorio testing/packages/linux-2.6.10 del segundo disco de instalación de Slackware 10.1. Tambíen podemos obtenerlo desde el FTP de Slackware.Los paquetes básico a instalar son:

* kernel-generic-2.6.10-i486-1.tgz
* kernel-modules-2.6.10-i486-1.tgz
* mkinitrd-1.0.1-i486-2.tgz (ubicado en slackware/a del primer disco)

En el directorio testing/packages/linux-2.6.10 encontraremos también los paquetes alsa-driver, kernel-headers y kernel-source que podemos instalar opcionalmente. No es necesario hacer un upgrade de nuestro actual kernel para instalar el 2.6.10, incluso es recomendable dejar intacto nuestro actual kernel por si llegara a fallar algo con el que estamos por instalar. Por lo tanto, hacemos una instalación completa de los paquetes:

# installpkg kernel-generic-2.6.10-i486-1.tgz
# installpkg kernel-modules-2.6.10-i486-1.tgz
# installpkg mkinitrd-1.0.1-i486-2.tgz

Configuración de la imagen initrd
Para poder utilizar el nuevo kernel es necesario hacer una imagen initrd si estamos utilizando los sistema de archivos ext3 o reiserfs en la partición root (/). initrd, es un pequeño sistema de archivos Linux que se carga en la RAM e inicia junto con el kernel pero antes de montar la partición root; esto nos servira para añadir módulos extras al kernel 2.6.10, por ejemplo el soporte para los sistemas de archivos ext3 y reiserfs. Para las particiones root con sistemas de archivos ext2 no es necesario crear la imagen initrd, si es este el caso podemos omitir las siguientes instrucciones y pasar a configurar el gestor de arranque.

En una terminal nos cambiamos al directorio /boot y nos logueamos como root:

$ cd /boot
$ su
password:


Una vez como root ejecutamos lo siguiente si nuestro sistema de archivos es reiserfs:

# mkinitrd -c -k 2.6.10 -m reiserfs


En caso de que tengamos un sistema de archivos ext3 podremos ejecutarlo de esta manera:

# mkinitrd -c -k 2.6.10 -m jbd:ext3 -f ext3 -r /dev/hdxy


En donde x es el numero de disco de nuestro sistema y donde y es el numero de la partición root (ejemplo: /dev/hda3)

Lo que haremos con el comando mkinitrd es hacer un árbol de archivos con los módulos a cargar al kernel, y también vamos a crear la imagen initrd.gz que será la que llamaremos al iniciar el sistema mediante el gestor de arranque (GRUB, LILO, etc).


Configuración del gestor de arranque.
Como paso final debemos de actualizar el gestor de arranque añadiéndole una nueva entrada para el kernel. Para hacer esto podemos hacer una duplicación de la entrada ya existente y hacerle los cambios necesarios para adaptarlo a las nuevas necesidades.

En el caso de GRUB procederemos a abrir el archivo de configuración:

# vi /boot/grub/menu.lst


Encontraremos la entrada actual del sistema, ejemplo:

title Slackware-10.1
kernel (hd0,6)/vmlinuz-ide-2.4.29 ro root=/dev/hda8


La copiamos, la duplicamos en el archivo de configuración de GRUB y la modificamos para el kernel 2.6.10:

title Slackware-2.6.10
root(hd0,6)
kernel=/vmlinuz-generic-2.6.10 ro root=/dev/hda8
initrd=/initrd.gz


En el ejemplo podemos ver lo siguiente:

root(hd0,6) = Con esto indicamos donde esta la partición boot donde están el kernel y la imagen initrd.
root=/dev/hda8 = Aquí se indica donde esta la partición root del sistema (/).
initrd=/initrd.gz = Esta es la nueva línea que añadiremos para cargar la imagen initrd y con ello el soporte ext3 y reiserfs.

Los valores root(hd0,6) y /dev/hda8 corresponden al ejemplo mostrado, por lo cual es necesario cambiarlos para adaptarlos a la configuración del sistema en donde estamos trabajando

En el caso de LILO abriremos el archivo de configuración de la siguiente manera:

# vi /etc/lilo.conf


Copiamos y duplicamos la entrada ya existente del kernel 2.4.29 y le añadimos la línea initrd, ejemplo:

image = /boot/vmlinuz-generic-2.6.10
initrd = /boot/initrd.gz
root = /dev/hda8 (acá colocamos la partición correspondiente)
label = Slack-2.6.10 (si el nombre es demasiado largo no lo toma)
read-only

Observacion: en "label = Slackware-2.6.10" es demasiado largo, se los dice lilo cuando lo reinstalan, coloque algo mas corto.
Despues de salvar la nueva configuración ejecutamos en la terminal:

# lilo


Nota: Para los sistemas ext2 no es necesario incluir la linea initrd, sólo es necesario la linea del kernel. Las entradas son sólo un ejemplo de configuración, por lo cual es necesario adaptarlas a la configuración del sistema con que se trabaja.

Despues de terminar de configurar el gestor de arranque reiniciamos el sistema y accedemos con el nuevo kernel. En caso de que no surja ningún imprevisto y ya probado el funcionamiento del sistema con el nuevo núcleo, opcionalmente podemos desinstalar todo los componentes del kernel 2.4.29.

Los problemas mas comunes a considerar durante la carga del kernel son un llamamiento erroneo del nuevo kernel mediante el gestor de arranque o el que no se detectara correctamente algún dispositivo o configuración previa. Por eso es importante mantener instalado el kernel 2.4.29 hasta estar completamente seguro del funcionamiento del núcleo 2.6.10 con el sistema.

Comentarios
Para cualquier duda, observación o sugerencia sobre este documento puedes hacerlo através del siguiente enlace:


Licencia original del documento
Derechos de Autor © 2005 por Paco Revilla para espaciolinux.com.
Se otorga permiso para copiar, distribuir y/o modificar este documento bajo los términos de la Licencia de Documentación Libre GNU, Versión 2 o cualquier otra versión posterior publicada por la Free Software Foundation; con la Seccion Invariante "Licencia original del documento". Una copia de la licencia es proveída en el sitio a través de este enlace: Licencia de Documentación Libre GNU.

Compilando el kernel

El kernel es el que se encarga de comunicar los programas con los dispositivos físicos de la computadora.
Es conveniente tener el kernel actualizado por varios motivos, entre ellos: Mas y mejor soporte de Hardware y corrección de errores.

Autor: Hernan

Para recómpilar un kernel se necesita tener instalado el gcc, libc y para los 2.6 las mod-utils (que son las nuevas herramientas insmod, rmmod, lsmod, etc para los kernel 2.6). Gralmente esta todo eso, si no fijate de tener todos los paquetes de desarrollo!

Al momento de compilar nuestros kernel's vamos a poder elegir usar los drivers como modulos o built-in.

A mi me gusta poner todo built-in.

Generalmente compilo como built-in solo los drivers que se van a cargar en el booteo, como ser los discos rígidos y los que se utilizen en todo momento, como ser las NIC's (placas de red), la placa de sonido y otras cosas más.

A medida que le vayan tomando la mano al sistema y vayan conociendo su hardware, necesidades, etc. van a ir optimizando su kernel.

Sabiendo que al compilar el kernel uds van a setear todo aquel soporte que necesitan y quieren cargar para su hard, lo que necesitan hacer es:

Bajarse el source que mas les guste de ftp.kernel.org/ o algún otro mirror.

Descomprimirlo en /usr/src y linkearlo a /usr/src/linux

ln -s /usr/src/linux-2.x.x-x /usr/src/linux

Entrar al directorio que contiene los sources con cd linux-2.x.x-x

Tienen varias opciones para empezar a configurar su kernel.

make menuconfig es algo mucho mas cómodo ya que pueden configurarlo a traves de una hermosa (???, jeje, para modo texto va bien) interfaz utilizando ncurses.

make xconfig es aún mucho mas cómodo pero van a necesitar tener configurada las X.

Hoy por hoy en los kernels 2.6 tambien se puede hacer un make gconfig el cual utiliza las librerias de gnome.

Una vez que eligieron el método que mejor les pareció van a tener que configurar todo lo que necesiten, lo mejor seria usar menuconfig pq el dia q no tienen por alguna razon andando el servidor x (y me ha pasado) se van a querer matar! y aunque ahora voy a intentar explicarles lo mas importante, va a depender, mayormente, de su criterio y hardware.

Basandome en un kernel 2.6

--General Setup

Generalmente no van a necesitar tocar nada aca (puse la opción porque el titulo les va a parecer tentador, pero no... let it be)

--Loadable module support

Aca tienen las opciones para poder cargar / descargar / forzar descargar modulos, tanto como habilitar la carga automatica de modulos del kernel (se cargan automaticamente según se vayan necesitando) y el soporte para modulos que pertenecen a otras versiones del kernel.

--Processor type and features

Aca eligen la subarquitectura que corresponde (dejenlo como estan a no ser que su plataforma no sea una pc), el tipo de procesador, aca pongan el micro que tienen, si su sistema es UP o SMP (Uni-processor o Symmetric multi-processing) (Si tienen un p4 con HT pueden veneficiarse con la opción SMP), la función preemptible kernel (Uno de las mejores opciones, creanme que van a notar mucho la diferencia uds), APIC, cooprocesador matemático, MTRR (se usa para controlar los accesos del procesador a los rangos de memoria, o sea... activenlo, esto afecta mucho el rendimiento si no lo tienen seteado).

--Power management option

está mas que claro, utilizen la que mas les guste, dejenlo como esta o ninguna.

--Bus options

Aca especifican como va a ser el modo de acceso del PCI (puede ser directo, según lo que especifique el bios o cualquiera de las dos opciones).

Si tienen slots ISA... habiliten el soporte para el mismo si no tienen ISA saquenlo!.

Aca tambien van a encontrar soporte para PCMCIA/CardBus (si no es notebook saquen esto) y PCI Hotplug (dudo q alguien tenga esto).

--Executable file formats

pasamos de largo!

--Device drivers

Lo importante aca es:

--Parallel port (si tenes impresora paralelo obvio q lo necesitas, si no sacalo!)

--Plug and Play Support

--Block devices... asegurense de tener habilitado el loopback, lo van a necesitar. Tambien RAM disk.

--ATA/ATAPI/MFM/RLL support

Esta es una de las partes mas importantes en cuanto a rendimiento de su sistema respecta. Aca estan los controladores IDE...

mínimamente van a querer habilitar 'Include IDE/ATA-2 DISK support','Include IDE/ATAPI CDROM support','SCSI emulation support','PCI IDE chipset support','Sharing PCI IDE interrupts support', 'Generic PCI bus-master DMA support',' Use PCI DMA by default when available' y luego van a tener que escoger el driver del chipset que corresponda a su motherboard, en mi caso como es un mother con chipset SIS lo tengo configurado con el 'SiS5513 chipset support'.

--SCSI device support

Aca ponemos legacy SCSI support

SCSI disk support

SCSI cdrom support

SCSI generick support

estos los vamos a necesitar si queremos montar por ej un pendrive!

--Multi-device support (RAID and LVM)

esto saquenlo a menos q tengan raid en su pc!

--IEEE 1394 (FireWire) support

Si no tenes firewire al pedo, salcalo!

--I2O device support (Intelligent I/O support) (Si no saben no toquen, como yo).

--Networking support

Esta parte es tambien de las mas importantes, aca no solo van a elegir el tipo de adaptador que tienen sino que tambien, como quieren que funcione (bridge, routed, etc.), protocolos (IPV4, IPV6, IPX, PPP, SLIP, CSLIP), filtros (IPCHAIN, IPTABLES), fare queues y mil mil cosas mas. Es inmensa la cantidad de cosas que pueden habilitad aca y me tadaría demasiado tiempo explicar una por una para que sirve (y buscar información de las que no tengo idea para no chamuyarlos). Solo limitense a habilitar la/las placas de red que tengan esto lo hacen en la seccion ethernet y depende de la velocidad de sus placas! y las opciones de PPP/SLIP.

--ISDN subsystem

si hay algun loco con una conección ISDN, metale mano nomas.

--Input device support

joystick, mouse, touchscreens, pc speacker eso aca!

--Character devices

Aca van a setear los puertos serie, soporte para impresoras paralelo, y el soporte AGP (/dev/agpgart), aca solo ponen esta opcion y la placa de video q tengan, si es una placa de video nvidia y queremos untilizarla con la aceleracion solo esta opcion y debemos sacar todas las demas, si si y el q dice nvidia tb!

--I2C

Bien, esto es interesante aca yo puse todo como modulo, esto sirve para monitorear los sensores de nuestro motherboard, aca les dejo un link de como usar este soporte! Se pueden dar una vuelta por mi blog y ver el post sobre lm_sensors!

--Multimedia device

alguna capturadora de video? si no sacalo!

--Graphic Support

Aca ponen:

Frame buffer devices

VGA 16 color graphic support

Vesa VGA support

y virtual frame buffer support

y en caso de tener alguna de esas placas de video ponganla, insisto q si queres usar tu nvidia con la aceleracion y el driver nvidia no pongas la opcion nvidia.

--Sound

Bien, aca ponene el 1ro y en la 2da opcion entran y ponen el 1ro el 2do y todos los OSS

se van a la parte de PCI y ponen su placa de sonido!

Solo seteen la placa de sonido que corresponda. Para aquellos con placas de sonido AC97 usen el driver Intel i8x0/MX440, SiS 7012; Ali 5455; NForce Audio; AMD768/8111.

Para aquellos con la misma placa pero con mothers basados en el chipset VIA el driver es VIA 82C686A/B, 8233 South Bridge si no me equivoco.

Si quieren pueden usar OSS pero les aviso que en un futuro no muy lejano esa opción va a desaparecer del kernel.

--USB support

aca pongan todos los q dice HCI y busquen las cosas usb q puedan tener, si tienen un pendrive pongan el soporte para mass storage. el resto saquenlo!

--File Systems

Este es el tipo de File systems que puede manejar el kernel.

El sistema de archivos mas común es el Ext2, Ext3 o Reiser, sobre el que uds instalaron, seguramente, su sistema GNU/linux, Yo puse soporte para todos!.

Si quieren poder montar sus particiones de windows van a tener que habilitar las opciones que correspondan en el submenu DOS/FAT/NT Filesystems. Lo mismo para los CD-ROM/DVD... ISO9660 7 joliet y UDF Support.

Una vez que setearon todo a su gusto le dan al Exit, cuando les pregunte si quieren salvar la nueva configuración del kernel le dan que si. En ese momento los va a devolver al shell.


Los paso para compilar el kernel 2.6 son tan fáciles como hacer un:


make bzImage

make modules

make modules_install

Después de esto solo nos queda mover el kernel propiamente dicho (arch/i386/boot/bzImage) a /boot con el nombre bzImage-2.6.x-X donde x es la version de kernel y X es tu version y el System.map-2.6.x-X es obvio q van los mismos q antes, en la raiz de los sources del kernel a la misma carpeta (/boot).

Luego hay q editar el bootloader

para Grub

editamos /boot/grub/menu.lst

title Linux-2.6.x.X

root (hd0,1)

kernel /boot/bzImage-2.6.x.X ro root=LABEL=/ <--- aca pone lo mismo q ya tenes escrito para el otro kernel!

para lilo

editamos /etc/lilo.conf

image=/boot/bzImage-2.6.x.X

label=Linux-2.6.x.X

root=/dev/hdaX <-- aca X es tu numero de particion.

read-only

guardar y no olvidarse de ejecutar el comando "lilo" para que grabe los nuevos parametros en el MBR. Para grub no es necesario mas que editar el archivo!

Reinicien y Listo! Ya tienen un nuevo Kernel, si al cargar kernel panic a no desesperar es cuestion de configuracion del kernel, carguen el kernel anterior y revisen todos los pasos!

Bueno, esto solo pretende ser general de lo que van a encontrar en un kernel y para que puede servir cada cosa.

Cada una de las opciones salvo las generales, dependen pura y exclusivamente de tu PC.

El que tenga alguna drama, me manda un mail a hernan82arg2004@ciudad.com.ar


Saludos y espero q sirva!

Compilando el kernel Linux 2.6.x en 8 pasos

Copyright (C) 2004 Marco Antonio Islas Cruz
Permision is granted to copy, distribute and/or midify this document
under the therms os the GNU Free Documentations License, Version 1.1
or any later version published by the Free Software Foundation;
with no Invariant Sections, with no Front-Cover Texts, and with no
Back-Cover Texts. http://www.gnu.org/copyleft/fdl.html

Bien, en este pequeño manualito, veremos de una forma rapida y sencilla el proceso de compilacion del Kernel en Linux.

Por si no lo sabes, el kernel es el "corazon" de cualquier Sistema Operativo. asi, SunOS, *BSD, Linux, MS-DOS, Windows u otros sistemas tienen un kernel que administra los recursos del sistema.

Una de las razones por las que GNU/Linux es uno de los sistemas mas poderosos, es por constante actualizacion del kernel. "Actualizar el nucleo (el kernel) es simple asunto de juntar las fuentes y compilarlo uno mismo. Se debe compilar el nucleo por si mismo para activar o desactivar ciertas funciones, ademas de asegurarse de que el nucleo estara optimizado para correr en esa maquina. El proceso es casi indoloro"1.

La compilacion de la que se hace mencion en este documento fueron realizadas en Slackware GNU/Linux 10.0, Aunque en todas las distribuciones deberia ser practicamente igual puede haber ligeros cambios,


1-. Bien, lo primero que haremos sera descargarnos las fuentes del kernel, lo podemos hacer entrando en www.kernel.org, de donde podremos descargar el parche (Nota: Al referirse como parchar o parche, no se refiere a "Corregir errores" o "Tapar hoyos", sino al echo de actualizar sin tener que compilar TODO el nucleo), asi como el codigo fuente completo del nucleo linux. Al momento de escribir estas lineas, el kernel mas nuevo es el reciente Kernel 2.6.0.

2.- Una vez que ya tenemos las fuentes de nuestro kernel lo descompactamos en "/usr/src/", como el kernel esta empaquetado con dos diferentes metodos, mostraremos los dos:

linux-2.6.x.tar.bz2

# tar -xjvf linux-2.6.x.tar.bz2
# bzip2 -d linux-2.6.x.tar.bz2 | tar -xvf


linux-2.6.x.tar.gz

# tar -xzvf linux-2.6.x.tar.gz
# gzip -d linux-2.6.x.tar.gz | tar -xvf


3.- Esto nos generara una carpeta en donde se encuentran las fuentes del kernel algo asi como "/usr/src/linux-2.6.x/", podemos crear un enlace simbolico para nuestra carpeta, llamandolo "linux" (/usr/src/linux), esto porque muchos programas se referiran a las fuentes por /usr/src/linux/. De esta manera no tendremos que cambiar el nombre del directorio. Lo haremos de la siguiente manera:

#ln -s /usr/src/linux-2.6.x/ /usr/src/linux


4.- En este momento, tenemos lo necesario para empezar con la configuracion de nuestro kernel, asi que dentro de la carpeta que contiene las fuentes ejecutaremos el comando "make" con la variable "config","menuconfig" o "xconfig".


#make config

#make menuconfig

#make xconfig


Cualquiera de las tres opciones son para configurar el kernel, y van de mas complicado a mas sencillo. Con "make config" se nos haran preguntas sobre las opciones, todas y cada una de ellas acerca de la configuracion del modulo (Nada recomendable, es un proceso mas tardado de lo que imaginas) este proceso es en modo texto. "make menuconfig" tambien es un proceso en modo texto, con la diferencia de que aqui apreciaremos todo en un menu. Con "make xconfig" realizaremos la configuracion del kernel en modo grafico --Solo si contamos con X--, de todas esta es la opcion mas recomendada, pues es mas sencilla y organizada.

La configuracion del kernel no la explicare, pues es un proceso que cada quien lo tiene que realizar ajustanto el kernel a sus necesidades. La recomendacion que puedo hacer es meter en el kernel lo que es realmente necesario y que casi siempre se va a utilizar. El kernel se carga completo desde un principio, asi que si metemos en el kernel muchos modulos, se hara muy grande y nos consumira mas memoria y ciclos del CPU. Ahora, tampoco es bueno dejarlo todo como modulo, si dejamos como modulo por ejemplo la tarjeta de red en una computadora que esta siempre conectada, el proceso de carga y descarga del modulo cada vez que el dispositivo se utiliza ralentizaria nuestro kernel. Tambien hay que tomar en cuenta ke no debemos poner como modulos cosas que seran necesarias para booteo de nuestra maquina. Por ejemplo, si estamos utilizando el sistema de ficheros Ext3 (Ext2 + Journaling), en nuestro kernel lo marcamos como modulo, y nuestro kernel reside en una particion Ext3, nuestro kernel sera incapaz de bootear por si solo (a menos que utilices Initrd). Pues a la hora de intentar cargarse no podra cargar el modulo (pues no tiene soporte para Ext3), no podra leer el sistema de ficheros y por consiguiente, no podra Bootear.

En caso de que tu kernel no funcione a la primera (Es normal que a la primera no nos quede el kernel como lo queremos), debe haber sido porque en alguna de las opciones la marcaste con "m"(modulo) o como "n"(no incluir ni en el kernel ni como modulo). Recuerda siempre guardar el archivo de configuracion de tu kernel, pues en caso de tener que reconfigurarlo, no tendras que partir desde cero.

5.- Ok, ya que tenemos configurado nuestro kernel, se nos instara a que realizemos la compilacion del mismo, es un proceso sencillo, y nuestro ordenador hara todo :), para ello ejecutaremos "make dep" para generar las dependencias, "make clean" para limpiar de anteriores binarios, y "make bzImage" para generar la imagen comprimida del kernel. Para ahorrarnos tiempo, marquemoslo todo en la misma linea de comando:

#[make dep;]make clean; make bzImage


Nota: En los kernels 2.6.x no es necesario hacer el "make dep" esto solo es necesario para kernels inferiores o iguales a la verison 2.4.x

En esto de la compilacion nos tardara un rato, dependiendo de lo que le hayamos metido a nuestro kernel, asi como de la velocidad de nuestro micro. Referencia: Tengo un procesador P4-M a 1.8 Ghz, tardó aproximadamente 15-20 mins cambiando solo algunos parametros. En este momento podemos despegarnos de la computadora por un minuto, tal vez para preparar lo que haremos mientras compilamos los modulos ;-).

6.- Una vez compilado el kernel tendremos que compilar todo lo que hayamos marcado como modulos. Este proceso es quiza el mas tardado de todos, pues habra una buena cantidad de modulos que compilar (a menos que sepas bien lo que necesitas y le hayas kitado todos los innecesarios). Como ya habia dicho antes, es buen momento para retirarse a tomar cafe, a platicar con alguien ver una pelicula o hacer algo mas. Referencia: En mi maquina ha tardado algo asi de una hora compilando los modulos, quite drivers innecesarios, soporte para sistemas de ficheros que no utilizo, y algunos los mande al kernel.

Esto lo haremos con

#make modules


Una vez compilados los modulos, no se nos debe olividar instalarlos en la carpeta de modulos correspondiente a nuestro kernel, lo marcaremos con :

#make modules_install


7.- Realizando esto, ya tenemos todo lo que necesitamos en binarios, no mas compilaciones (si todo salio bien). La imagen comprimida de nuestro kernel se encuentra en la carpeta "/usr/src/linux-2.6.0/arch/i386/boot/" (si fue compilado para i386). Lo que haremos sera copiar el archivo bzImage a /boot/. Por seguridad cambiemos el nombre.

#cp bzImage /boot/2.6.x


8.- Ya en este lugar, lo que tendremos que hacer es una imagen de booteo (initrd).

* Por que necesito initrd? (tomado deREADME.initrd del disco 2 Slackware 10.0 "testing/packages/linux-2.6.7" )
o La razon mas usual para usar initrd es porque tu necesitas cargar los modulos de kernel antes de poder montar la particion de root. Usualmente estos modulos son requeridos para soportar el sistema de ficheros usados en la particion raiz (ext3, reiserfs, xfs), o tambien el controlador del disco duro (SCSI, RAID,etc). Escecialmente, hay diferentes opciones disponibles en los modernos kernels Linux que no es practico hacer kernels para cubrir las necesidades de todos. Es mucho mas flexible crear un solo kernel generico y una serie de modulos para este kernel.
* Como genero una imagen initrd??
o Entra en /boot
o

mkinitrd -c -k 2.6.7 -m jbd:ext3 -f ext3 -r /dev/hdb3

o Esto funcionara para crear una imagen initrd en /boot para el kernel 2.6.7 con sistema de ficheros ext3, es necesario que esta en /dev/hdb3. Nota que es necesario tener ambos modulos (jbd y ext3) para poder utilizarlo.


9.- Ya por ultimo tendremos que ajustar nuestro gestor de arranque para que bootee con el nuevo kenel, en LiLo seria algo asi:

image=/boot/vmlinuz
label="linux"
root=/dev/hda8
initrd=/boot/initrd.gz
*append="quiet devfs=mount acpi=off"
*vga=788
read-only

Nota: Los marcados con * son extra, he tomado esta configuracion de mi lilo.conf

No es para nada recomendable, es mas seria algo "estupido", borrar la imagen del kernel anterior en /boot/, o eliminarla de nuestro gestor de arranque, pues, si por alguna razon nuestro kernel no es capaz de bootear, lo necesitaremos para corregir los errores. A menos que estemos COMPLETAMENTE SEGUROS de que nuestro kernel si funciona bien

Configuración y Compilación del Kernel

Autor: PinkX
La intención de este documento es orientar a quienes quieren, por primera vez, compilar ellos mismos el kernel de su máquina. Comenzaré por explicar conceptos básicos como qué es el kernel, y describiré algunas de las características más comunes e importantes.

En ningún caso pretendo describir la funcionalidad de cada una de las opciones que forman parte del kernel, sino únicamente servir de guía en este importante paso.

¿Qué es el Kernel?
Debemos comenzar por respondernos esta pregunta. El Kernel en sí es el corazón o núcleo del Sistema Operativo. En nuestro caso, el kernel se llama Linux, y el Sistema Operativo en sí lo compone el kernel junto con una serie de programas y aplicaciones.

¿Para qué compilar el Kernel?
Una pregunta que a veces los usuarios principiantes se hacen es justamente esta: para qué compilar el kernel si ya tienen su máquina funcionando. La respuesta es simple, y es que entre una versión y otra de los distintos kernel se agregan caracterísitcas nuevas al mismo además de una serie de mejoras. Por otro lado, el kernel que acompaña a las distribuciones es un kernel genérico, esto quiere decir que no tiene ningún tipo de optimización para nuestro hardware específico, viene por defecto para procesadores i386, y lo más probable que tenga soporte para una gran cantidad de dispositivos que es innecesaria puesto que no los poseemos.

Por último, el compilar el kernel es un paso altamente educativo y didáctico para comprender en mayor profundidad el funcionamiento del sistema, y siempre es bueno saberlo por si alguien lo pregunta ;-)

¿Qué necesito para poder compilar el kernel?
En primer lugar, un compilador (gcc). Necesitamos además las librerías de desarrollo correspondientes al sistema (glibc), y en algunos casos requeriremos también del ensamblador as que se distribuye en el paquete binutils. Otros ensambladores disponibles para Linux son gasm o nasm.

Una vez que confirmemos la existencia de todas estas herramientas en nuestro sistema, es necesario contar, obviamente, con las fuentes del kernel.

En la mayoría de las distribuciones estas se incluyen en el disco de instalación, pero no se instalan por defecto. De todas maneras es recomendable bajar siempre la última versión puesto que la mayoría de los fabricantes de distribuciones incluye código adicional en su kernel que no forma parte del original.

Si tienes la seguridad que cuentas con los fuentes 100% originales sin modificaciones, es posible que te actualices a la última versión a través de parches.

Los parches son archivos que contienen las diferencias entre un árbol de fuentes y otro. Por ende, es mucho más conveniente actualizar nuestro kernel a través de este metodo sobre todo si contamos con una conexión a internet relativamente lenta, puesto que los parches son de muy pequeño tamaño.

Parchando el kernel
Si tienes una versión completa del kernel, no es necesario que leas esta sección, aunque puedes hacerlo para fines educativos.

Los parches se aplican en forma consecutiva. Esto quiere decir que, si por ejemplo, tu versión actual del kernel es la 2.2.13 y deseas actualizarte a la 2.2.16, necesitas los parches 2.2.14, 2.2.15 y 2.2.16. Estos deben ser aplicados en ese orden, uno después del otro, y no es necesario realizar una compilación en cada paso. Es necesario remarcar que no es posible parchar una versión mayor del kernel: del 2.0.36 no se puede parchar al 2.2.

Siguiendo el ejemplo anterior en que actualizaremos el kernel 2.2.13 al 2.2.16, supondremos que los parches se encuentran en nuestro directorio home para el usuario usuario, en formato gzip. El árbol de nuestro kernel actual se encuentra en /usr/src/linux, que a su vez debe ser un link simbólico a /usr/src/linux-2.2.13. Dentro de ese directorio, llamamos el siguiente comando:

localhost:/usr/src/linux# gzip -cd /home/usuario/patch-2.2.14.gz | patch -p0
localhost:/usr/src/linux# gzip -cd /home/usuario/patch-2.2.15.gz | patch -p0
localhost:/usr/src/linux# gzip -cd /home/usuario/patch-2.2.16.gz | patch -p0

Esta serie de comandos puede ser reemplazada por el siguiente, siempre y cuando tengamos solo aquellos parches en dicha ubicación:

localhost:/usr/src/linux# gzip -cd /home/usuario/patch-2.2.1* | patch -p0

Si después de lo anterior no obtenemos ningún mensaje de error (y espero que así sea), todo está bien y ahora contamos con un árbol actualizado con la última versión del kernel. Entonces actualizamos el link simbólico, renombrando el directorio primero:

localhost:/usr/src# mv linux-2.2.13 linux-2.2.16
localhost:/usr/src# ln -sf linux-2.2.16 linux

Finalmente tenemos todo listo para configurar y compilar.

El proceso de configuración
Como mencioné en un principio, una de las razones por la cual compilar el kernel es para ajustarlo y optimizarlo a nuestro hardware. Esto se hace por medio de la configuración, un proceso con una gran cantidad de opciones. Acá trataré de describir solo aquellas más comunes e importantes.

Antes de comenzar, es necesario tomar en cuenta lo siguiente: muchas de las características propias del kernel pueden ser compiladas dentro del mismo o como módulos. La diferencia radica principalmente en que, mientras más modularizado sea nuestro kernel, más pequeño será el tamaño de su imagen, lo que por ende nos lleva a una mejor utilización de la memoria.

Por otro lado, la utilización de módulos tiene otra gran ventaja: un kernel dinámico hace más facil la tarea de agregar o eliminar hardware, puesto que solamente es necesario compilar e instalar o eliminar el módulo correspondiente, respectivamente, y no reconfigurar todas las opciones del sistema y compilar un nuevo kernel. Además, los módulos son cargados en memoria y eliminados de ella en demanda, haciendo nuevamente un manejo más eficiente de los recursos.

Por último, cabe decir que hay quienes ven en la existencia de módulos un gran riesgo de seguridad: un módulo malicioso puede ser capaz de esconder procesos, usuarios, etc. (por ejemplo el módulo heroine). Por supuesto, los módulos requieren de privilegios root para ser instalados, por lo que la máquina debe tener un compromiso de seguridad previo para que esto suceda (cosa que un buen administrador no permitirá ;-)).

Dicho todo esto, vamos a lo nuestro. La configuración del kernel se lleva a cabo a través de un programa interactivo que muestra todas las posibles opciones. En este sentido, existen tres posibilidades: un sencillo programa de consola que consta en una serie de preguntas (no recomendado, es muy tedioso y no da la posibilidad de retroceder), otro es un programa al igual de consola pero con una interfaz basada en ncurses lo que lo hace mucho más amigable para el usuario (definitivamente la mejor alternativa), y por último un programa similar pero para X11 (no recomendado puesto que puede presentar problemas de estabilidad). Estos programas se ejecutan, respectivamente, de la siguiente manera:

localhost:/usr/src/linux# make config

localhost:/usr/src/linux# make menuconfig

localhost:/usr/src/linux# make xconfig

Todos estos cuentan con pantallas de ayuda para la gran mayoría de cada una de las opciones de configuración. Como mencioné más arriba, la segunda alternativa es la más segura, y es según la cual me guiaré en el resto de este documento.

Al ejecutar este comando, nos encontraremos luego de un instante frente a una pantalla con una serie de opciones.

¿Qué elegir?
Las opciones a elegir pueden presentarse de la siguiente manera:

[*] Caracteristica que solo es posible compilar dentro del kernel
< > Opcion que puede ser compilada como modulo independiente

Como la primera, las opciones que presentan ese tipo de paréntesis solamente se pueden compilar como parte del kernel y las opciones son "Y" o "N", mientras que en la segunda se nos da la posibilidad de implantarlas como módulo donde las opciones son "Y", "M" (módulo, o también interpretado como maybe, quizás) o "N".

A continuación, describiré brevemente las categorías y opciones más importantes:

Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers

Al seleccionar esta opción se nos preguntará durante el proceso de configuración si queremos incluir en nuestro kernel características muy nuevas y/o experimentales, incrementando la cantidad de posibilidades.

Processor type and features --->
(386) Processor family
(1GB) Maximum Physical Memory
[ ] Math emulation
[*] MTRR (Memory Type Range Register) support
[ ] Symmetric multi-processing support

En esta sección se indica el tipo de procesador y sus características: primero seleccionamos la familia de la CPU (386, 486, 586, 686, etc.), es importante elegir la que corresponde y no una mayor a la nuestra.

El resto de las opciones debieran de ser comunes para la mayoría de los usuarios: la cantidad máxima de memoria física (1 o 2 Gb), emulación matemática (no es necesario a menos que tengamos un 386 sin coprocesador), MTRR (muy importante para quienes poseen aceleradores gráficos), y SMP (sólo para quienes tienen procesadores duales/múltiples).

Loadable module support --->
[*] Enable loadable module support
[*] Set version information on all symbols for modules
[*] Kernel module loader

Definitivamente queremos soporte para las 3 ;-)

General setup --->

Opciones generales de configuración: soporte para redes, PCI, entre otros. De suma importancia:

[*] System V IPC
[*] BSD Process Accounting
[*] Sysctl support
<*> Kernel support for a.out binaries
<*> Kernel support for ELF binaries

Recomendado leer las pantallas de ayuda para cada una de las opciones ("?")

Plug and Play support --->

Sorpresa: soporte para dispositivos PnP (plug 'n pray)

Block devices --->

Configuración de dispositivos adicionales: de suma importancia, no olvidar: Si contamos con un disco duro IDE desde el cual booteamos Linux, el soporte para este tipo de dispositivos NO debe ser configurado como módulo; esto es motivo para un kernel panic al momento de iniciar el sistema. Lo mismo va para quienes poseen discos SCSI.

<*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
<*> Include IDE/ATA-2 DISK support

El resto de las opciones son para dispositivos específicos en su mayoría, nuevamente "?".

Networking options --->

Opciones de red: soporte para firewall, IP aliasing, masquerading, entre otros. No olvidar "?".

SCSI support --->

Soporte para dispositivos SCSI, desde controladoras hasta una variedad de periféricos.

Network device support --->

Soporte para diversos dispositivos de red, como adaptadores Ethernet, Token Ring, X.25, etc. ("?").

ISDN subsystem --->

Configuración ISDN. "?".

Character devices --->

Diversas opciones de dispositivos tales como soporte para terminales virtuales, consolas, puertos seriales, autodetección de IRQs, mouse, joysticks, adaptadores de captura de video y otros. "?".

Filesystems --->

Soporte para diversos sistemas de archivos: Ni se te ocurra compilar el soporte para ext2 como módulo. Como siempre, "?".

Console drivers --->

Drivers para la consola de texto, desde el normal VGA hasta extensión framebuffer. Nuevamente "?".

Sound --->

Soporte para sonido, junto con módulos para una gran cantidad de tarjetas. Muy importante ver la ayuda correspondiente a la tuya ("?") además de la documentación existente en /usr/src/linux/Documentation/sound.

Kernel hacking --->

La única opción que encontraremos dentro de esta categoría es Magic SysRq key, la cual nos permite, si la habilitamos, poder acceder a pantallas informativas y otras funciones muy útiles (sobre todo si se cae el sistema) a través de combinaciones de teclas. Una vez más recomiendo leer la ayuda correspondiente ("?").

Y a continuación, ¿qué?
Una vez finalizada la configuración del kernel (y estando seguros de que todo está como corresponde), debemos salir del programa y guardar los cambios.

Hecho esto, procedemos a generar las dependencias y limpiar los objetos residentes anteriores que puedan andar por ahi:

localhost:/usr/src/linux# make dep && make clean

Pregunta (para quienes no saben): ¿qué significa el &&? Respuesta: es un operador lógico que significa and (y), en términos prácticos, separa dos comandos, y siempre y cuando la salida del primero haya sido true (verdadero), o sea, haya tenido éxito, ejecutará el siguiente. De esta forma, nos aseguramos que solo se continuará si es que no hay errores.

A continuación, la parte más larga: la compilación de la imagen del kernel:

localhost:/usr/src/linux# make zImage

Mientras esto ocurre, podemos disfrutar de una taza de café, aunque en los procesadores actuales esto es cada vez menos posible ;-)

Si al finalizar este proceso obtenemos un mensaje diciéndonos que el sistema es demasiado grande (system too big) tenemos dos posibilidades: tratar de compilar la imagen en un formato comprimido reemplazando el comando anterior por:

localhost:/usr/src/linux# make bzImage

o bien modularizando en mayor forma nuestro sistema, esto es, eliminando aquellas opciones innecesarias y utilizar la mayor cantidad de módulos posibles. Luego repetir el paso anterior.

Si, por el contrario, el sistema no nos arrojó ningún mensaje de error, estamos listos para el siguiente paso: compilar los módulos, e instalarlos:

localhost:/usr/src/linux# make modules && make modules_install

Otra pequeña espera (quizás mayor que la primera). Una vez terminado, estamos listos para nuestro siguiente paso.

La instalación del nuevo kernel
Si estás aquís es porque (espero) durante todo el proceso no has sufrido ningún fallo. Nuestro siguiente paso puede ser el más complejo y es instalar de forma definitiva el nuevo kernel en el sistema.

Aunque, según me han dicho, esto se puede hacer fácilmente en forma automática a través del siguiente comando:

localhost:/usr/src/linux:# make install

El asunto es que nunca lo he probado yo personalmente, ni me llama la atención hacerlo. Si eres de esas personas como yo, quienes prefieren hacer todo manualmente y entender un poco mejor como funciona todo esto, entonces sigue las instrucciones que se dan a continuación (en caso contrario y asumiendo que el comando anterior funcionó puedes dejar de leer):

Lo primero es copiar la imagen generada al directorio /boot del sistema. La ubicacion original de la imagen depende de la arquitectura, En este caso utilizaremos la del x86:

localhost:/usr/src/linux:# cp arch/i386/boot/zImage /boot/vmlinuz-2.2.16

Donde, por supuesto, reemplazaremos zImage con bzImage en caso de que hayamos generado la imagen con ese procedimiento, y tambien cambiamos el nombre del destino a la versión del kernel correspondiente. A modo de idea: yo mantengo links simbólicos a dos versiones del kernel, de esta manera al actualizarlo solo debo además actualizar los links, y no reconfigurar LILO:

localhost:/:# ln -sf /boot/vmlinuz-2.2.16 /boot/vmlinuz
localhost:/:# ln -sf /boot/vmlinuz-2.2.13 /boot/vmlinuz-old

Esto es, por supuesto, siguiendo nuestro primer ejemplo en el cual deseamos actualizar desde la versión 2.2.13 a la 2.2.16. Paso siguiente: actualizar el LILO.

Como mencioné anteriormente, si utilizas el sistema de links simbólicos descrito arriba solo será necesario que el LILO lo modifiques una primera vez. Lo que a continuación se muestra es un extracto del archivo de configuración de LILO, ubicado en /etc/lilo.conf correspondiente a la sección de la imagen de Linux:

image = /boot/vmlinuz
root = /dev/hda1
label = Linux
read-only

La idea es agregar una nueva sección, correspondiente a la nueva imagen, y cambiar el nombre de etiqueta de la actual, por lo que esta parte de nuestro archivo debiera de quedar de la siguiente manera:

image = /boot/vmlinuz
root = /dev/hda1
label = Linux
read-only

image = /boot/vmlinuz-old
root = /dev/hda1
label = Linux-old
read-only

No es mi intención en este caso describir la sintaxis de la configuración del LILO sino citarlo para lo que es necesario. Si deseas más detalles al respecto puedes referirte a la página del manual del lilo.conf(5).

El último paso: actualizar el LILO. Para eso, simplemente, lo ejecutamos:

localhost:/# lilo
Added Linux *
Added Linux-old

Lo olvidaba. Recomiendo también crear un link simbólico para el archivo System.map con el fin de no tener que copiarlo cada vez que compilemos un nuevo kernel (este archivo contiene información específica de la versión sobre los símbolos en los módulos):

localhost:/# ln -sf /usr/src/linux/System.map /boot/System.map

Fin
Eso es todo. Fin. Reinicia el nuevo kernel. Si funciona, felicitaciones. Si no, revisa cual pudo haber sido tu error.

Que es el kernel?

* Qué es el Kernel?
* Dónde conseguir el kernel
* Configuración e instalación del kernel
* Parches(patches) para el kernel
* Consejos sobre el kernel
* Enlaces sobre el kernel
* Directorio del kernel


Que es el kernel?

El kernel o nucleo de linux se podria definir como el corazon de este sistema operativo. Es el encargado de que el software y el hardware de tu ordenador puedan trabajar juntos.

Las funciones mas importantes del mismo, aunque no las unicas, son:

* Administracion de la memoria, para todos los programas en ejecucion.
* Administracion del tiempo de procesador, que estos programas en ejecucion utilizan.
* Es el encargado de que podamos acceder a los perifericos/elementos de nuestro ordenador de una manera comoda.

Existen dos versiones del Linux kernel:

* Version de produccion: La version de produccion, es la version estable hasta el momento. Esta version es el resultado final de las versiones de desarrollo o experimentales.

Cuando el equipo de desarrollo del kernel experimental, decide que ha conseguido un kernel estable y con la suficiente calidad, se lanza una nueva version de producion o estable. Esta version es la que se deberia utilizar para un uso normal del sistema, ya que son las versiones consideradas mas estables y libres de fallos en el momento de su lanzamiento.

* Version de desarrollo: Esta version es experimental y es la que utilizan los desarrolladores para programar, comprobar y verificar nuevas caracteristicas, correcciones, etc. Estos nucleos suelen ser inestables y no se deberian usar, a no ser que sepas lo que haces.

Como interpretar los numeros de las versiones:

* Las versiones del kernel se numeran con 3 numeros, de la siguiente forma: XX.YY.ZZ

XX: Indica la serie principal del kernel. Hasta el momento solo existen la 1 y 2. Este numero cambia cuando la manera de funcionamiento del kernel ha sufrido un cambio muy importante.
YY: Indica si la version es de desarrollo o de produccion. Un numero impar, significa que es de desarrollo, uno par, que es de produccion.
ZZ: Indica nuevas revisiones dentro de una version, en las que lo unico que se ha modificado, son fallos de programacion/bugs.

* Unos ejemplos nos ayudaran a entenderlo mejor:

ej1: version del kernel 2.4.0: Kernel de la serie 2 (XX=2), version de produccion 4 (YY=4 par), primera version de 2.4 (ZZ=0)
ej2: version del kernel 2.4.1: Kernel de la serie 2, version 4, en el que se han corregido errores de programacion presentes en la version 2.4.0 (ZZ=1)
ej3: version del kernel 2.5.0: version 0 del kernel de desarrollo 2.5.

Donde conseguir el kernel

El kernel se puede bajar de un gran numero de servidores en internet. En el directorio del kernel en este servidor, podras bajar las ultimas versiones del Kernel, bajadas directamente de http://www.kernel.org/.

En este enlace tienes la lista internacional oficial de servidores espejos, de donde es posible bajarse cualquier version del kernel (ultima y antiguas).

Configuracion e instalacion de un nuevo kernel

Este es uno de los temas que asustan a los nuevos usuarios de Linux. Lo primero deciros que no hay razon para asustarse, la configuracion e instalacion de un nuevo kernel en nuestro sistema es mas facil de lo suena.

Lo que si hay que hacer es tener claro una serie de cosas antes de ponernos a trabajar, para asi evitar problemas. A continuacion tienes una pequena guia sobre como configurar e instalar un nuevo kernel en tu sistema.

Has decidido instalar un nuevo kernel en tu sistema, que es lo que tenemos que hacer?

1. Bajarte la ultima version. De donde? Leete la seccion anterior.

NOTA: Si vais a instalar un kernel de las ultimas series de produccion, teneis que tener en cuenta que algunas distribuciones (si son antiguas) pueden no estar preparadas para hacer uso de estas series. Si vuestra distribucion no viene preparada para soportar los ultimos kernels, teneis que actualizar una serie de paquetes/programas antes de instalar el nuevo kernel (mas informacion en la documentacion que acompaña al kernel). o actualizar a una distribucion o version de vuestra distribucion que los soporte.

2. Tener claro lo que vamos a hacer, leete el documento HOWTO sobre el kernel (Ingles / Castellano)
3. Tener claro las opciones que tenemos que configurar, para poder utilizar el hardware de nuestro sistema, asi como las caracteristicas que queremos utilizar. Por ejemplo, si no utilizamos un dispositivo SCSI, no tenemos que configurar nada en el apartado SCSI de nuestro kernel. Asi nos ahorramos espacio y tiempo.

4. Entrar como root: su root
5. Copiar el archivo que te has bajado al directorio /usr/src/ cp linux-xx.xx.xx.tar.bz2 /usr/src/
6. Descomprimirlo y desempaquetarlo: tar -xvzpf linux-xx.yy.zz.tar.gz

NOTA IMPORTANTE: El archivo linux-xx.yy.zz.tar se desempaquetara en el directorio /usr/src/linux
Si ya existe un directorio llamado linux en tu sistema, renombralo, p.ej: mv linux linux-old . En algunas distribuciones, linux es un enlace simbolico a linux-xx.yy.zz, borra este enlace simbolico. Es importante que no exista ningun directorio/enlace simbolico llamado linux, antes de desempaquetar la nueva version.

7. Entrar en /usr/src/linux: cd /usr/src/linux
8. Configurar el kernel, esto se puede hacer de tres maneras diferentes:

make config (modo texto)

make menuconfig (modo texto con menus)

make xconfig (X-windows version)

9. Os recomiendo el ultimo comando o el segundo, totalmente desaconsejado usar el primero.

10. Os recomiendo que las opciones que vienen por defecto no las toqueis, si no sabeis lo que haceis. Configurar las opciones que quereis tener en vuestro nuevo kernel. Una vez terminada la configuracion, grabar los cambios y salir del programa de configuracion.

11. Una vez terminado el proceso de configuracion, tenemos que compilar nuestro nuevo nucleo. Para ello hay que hacer lo siguiente:

make dep
make clean
make bzImage

12. Si en el proceso de configuracion, elegimos alguna opcion como modulo, tendremos que compilar/instalar dichos modulos:

make modules
make modules_install

NOTA: No olvidar ejecutar como root el comando depmod -a la primera vez que arranqueis con vuestro nuevo kernel, para computar las dependencias entre modulos.

13. Ya tenemos el kernel y los modulos compilados, ahora tenemos que instalarlo. Casi todo el mundo utiliza LILO para arrancar el sistema, por ello explicare como instalarlo utilizando LILO.

Todavia estamos en /usr/src/linux ejecutar el comando make install , esto copiara el kernel que acabamos de crear, a el directorio /boot de nuestro sistema, con el nombre vmlinuz., o como un enlace simbolico vmlinuz -> vmlinuz-xx.yy.zz

14. Ahora tenemos que configurar LILO para que reconozca el nuevo kernel. Tendremos que modificar el fichero /etc/lilo.conf

Aqui teneis un ejemplo, del fichero /etc/lilo.conf antes de modificarlo:

boot=/dev/hda
prompt
timeout=50
image=/boot/vmlinuz-2.0.34
label=linux
root=/dev/hda1
read-only

Y aqui como quedaria despues de la modificacion para que reconozca nuestro nuevo kernel al arrancar:

boot=/dev/hda
prompt
timeout=50
image=/boot/vmlinuz
label=nuevokernel
root=/dev/hda1
read-only
image=/boot/vmlinuz-2.0.34
label=linux
root=/dev/hda1
read-only

15. Ahora solo tenemos que ejecutar el comando /sbin/lilo y arrancar el sistema de nuevo. Si tuviesemos algun problema con el nuevo kernel, siempre podriamos arrancar con el antiguo escribiendo linux cuando arrancamos y nos sale en pantalla lilo: De esta manera podemos entrar y ver que es lo que ha fallado.

NOTA: Recordar que existen multitud de opciones para configurar LILO, y que los ejemplos anteriores, son ejemplos. Puede que vuestro sistema necesite diferentes parametros y opciones. Leeros los documentos HOWTOS sobre el kernel y LILO antes de cambiar nada en vuestro sistema. Al final de esta pagina teneis enlaces a los mismos. Suerte y espero que tengais las cosas un poco mas claras.


Parches (patches) para el Kernel

* Que son los parches y para que sirven:

Un parche para el kernel no es mas que un fichero, que solamente contiene informacion sobre las lineas de codigo que han cambiado desde la version precedente del nucleo. De esta manera, solamente te tienes que bajar un fichero con los cambios, en vez del nucleo al completo. El ahorro en cantidad de Mb bajados es bastante considerable, sobre todo para aquellos que dependen del modem y no tiene una conexion rapida a internet.

Algo a tener muy en cuenta si vais a actualizar el nucleo por medio de parches en vez de bajaros el nucleo al completo, es que teneis que ir actualizando de version a version. Para que se entienda un poco mejor, aqui teneis un ejemplo:

Si teneis el nucleo 2.2.0 y vais a actualizarlo al 2.2.1, os podeis bajar el fichero patch-2.2.1.gz [70Kb] en vez, del nucleo 2.2.1 al completo [12.5Mb]. Pero si teneis el nucleo 2.2.0 y vais a actualizar al 2.2.4, NO os vale bajaros el fichero patch-2.2.4.gz nada mas, tendriais que bajaros el 2.2.1, 2.2.2, 2.2.3 y 2.2.4. Esto es porque los ficheros patch solamente contienen los cambios de version a version.

Si la diferencia entre la version que teneis y la que quereis instalar, es muy grande (p.ej: del 2.2.0 al 2.2.35), no os merece la pena actualizar por medio de parches, en este caso bajaros la version completa.

* Que hacer con un fichero patch-XX.YY.ZZ.gz?:

Ya te has bajado el fichero patch (se pueden bajar del mismo subdirectorio donde esta la version completa), que necesitas para actualizar el kernel, y ahora que haces?. Ahora, hay que aplicarlo al nucleo que tienes y compilar de nuevo. El procedimiento para actualizar el nucleo por medio de ficheros patch es el siguiente:
1. Copia el fichero patch-XX.YY.ZZ.gz al directorio /usr/src : cp patch-XX.YY.ZZ.gz /usr/src/
2. Cambia a este subdirectorio y descomprime el fichero: gunzip patch-XX.YY.ZZ.gz
3. Aplica el parche: patch -s -p0 < patch-XX.YY.ZZ
4. La opcion -s hara que solo se impriman mensajes de error. Si no recibes ningun mensaje de error (como deberia de ser ;-)) solamente te queda entrar en /usr/src/linux: cd /usr/src/linux
5. Y ejecutar make clean, make xconfig, make dep, make bzImage, el resto es igual que en la seccion anterior a partir del punto 12)


Consejos

* Pregunta: Necesito actualizar el kernel que utilizo, cada vez que una nueva version aparece?

Respuesta: NO. Porque? La explicacion es la siguiente:

Cuando un nuevo kernel aparece, puede ser por las siguientes causas:
o Nuevas caracteristicas se han anadido.
o Fallos de programacion se han corregido
o Fallos de seguridad se han corregido.
o Nuevo hardware es soportado.

Si las caracteristicas que se han anadido, no las vamos a utilizar, es evidente que no necesitamos actualizar.
Si los fallos de programacion que se han corregido, afectan a caracteristicas/drivers que no utilizamos, no necesitamos actualizar.
Si no utilizamos el nuevo hardware soportado, tampoco necesitamos actualizar.

De todas maneras es recomendable, actualizar de vez en cuando, sobre todo cuando se corrigen fallos de seguridad o cuando los cambios en el nuevo kernel afectan a caracteristicas/funciones/hardware que utilicemos.

El codigo esta ahi, libre y esperando a ser compilado en un nuevo ordenador, cada usuario debe de decidir cuando es hora de una actualizacion.

* Pregunta: Soy nuevo en Linux y acabo de instalar una distribucion, como actualizo el kernel?

Respuesta: Te aconsejo que esperes un poquito. La distribucion que acabas de instalar (si es de las ultimas) viene con un kernel de los "ultimos", totalmente funcional y que te sirve sin problemas.

Utiliza el sistema un tiempo, familiarizate con el nuevo sistema que acabas de instalar, y cuando comprendas un poco mas como funcionan las cosas, actualiza el kernel. Un buen punto de partida para encontrar informacion sobre el kernel, lo tienes en estas paginas.

Enlaces sobre el kernel

* The Linux Kernel Archives Pagina principal/oficial sobre el kernel
* KernelNotes Mucha informacion sobre kernel
* Linux Mama Actualizaciones no oficiales
* Kernel Howto (Ingles)
* Kernel Como (castellano)
* LILO MiniHowto (Ingles)
* Guia de programacion de modulos para el kernel (ingles)
* The Linux Kernel Libro (ingles)