jueves, 2 de diciembre de 2010

A tunear el kernel...

En la entrada anterior ya hice mención sobre lo que significa compilar un kernel.

Los Pro:
  • El kernel funciona ajustado a la máquina por lo que le saca todo el provecho al procesador.
  • Si se es lo suficientemente avezado se puede dejar un kernel de un mínimo tamaño que redunda en el uso más eficiente de la memoria, aunque para las memorias y los discos existentes esto importa poco.
Los Contra:
  • No es fácil
  • El hacer algo mal en la compilación/instalación puede dejar un sistema inutilizable.
  • Si la distro tiene actualizaciones  recurrentes del kernel estas no serán efectivas en el kernel compilado por lo que se deberá obtener las fuentes del kernel nuevamente y volver  compilarlo.
Mucho he escuchado a cerca de NO compilar el kernel, pero para audio y video es estrictamente necesario.

Vamos a ver una forma de compilar el kernel en la distro Ubuntu que es homóloga a la manera Debian. Lo llevé a la forma menos complicada para que nadie se maree.

Aquí vamos.

En la Ubuntu y Debian se hace una manera muy particular de compilar el kernel con la que se puede respalda éste en un paquete instalable y así llevarlo a otros equipos o bien guardarlo para no pasar por lo mismo en caso de emergencias, reinstalaciones, cambios de PC, etc.

Los siguientes son los pasos que seguí en Kubuntu 10.04 LTS el 30 de noviembre de 2011 con las actualizaciones al día.

Paso 1: Obtención de las fuentes.
Vamos a bajar lo necesario para hacer  nuestra instalación. Abrimos un terminal y escribimos:
$ sudo -i
para ser súper usuarios en la consola. Luego ejecutamos la instalación.
$ apt-get install fakeroot build-essential makedumpfile libncurses5 libncurses5-dev linux-source initramfs-tools kernel-package
Se supone que con eso tendríamos todo pero por si acaso yo hago lo siguiente:
$ apt-get build-dep linux-source
Con eso ya me aseguro de poder compilar el kernel.
El siguiente paso es (1)ir al directorio /usr/src y (2)descomprimir el kernel, (3)hacer un enlace simbólico al directorio del código del kernel (OPCIONAL), (4)acceder al directorio (5)y por último copiar el archivo de configuración del kernel en uso es altamente recomendable:
  1. $ cd /usr/src
  2. $ tar xvjf linux-source-2.X.XX.tar.bz2
  3. $ ln -sf linux-sorce-2.X.XX linux
  4. $ cd linux
  5. $ cp -vi /boot/config-$(uname -r) .config
Ahora viene la parte interesante que es configurar las opciones de compilación.

Lo primero que hago es:
$ make menuconfig
Y esto abre el programa en el que vamos a escoger las opciones indicadas.

Esta es la apariencia de menuconfig.

Uno se puede mover a través de las opciones con las flechas del teclado y para seleccionar una opción se presiona enter.

Vamos a presionar enter en la primera opción "General Setup".

Luego vamos a bajar hasta la segunda opción "()Local Version - append to kernel release" y presionamos enter.

En esta opción vamos a colocar un texto para diferenciar las versiones. Es muy importante acostumbrarse a cambiar esta opción ya que si vamos a tener más de un kernel instalado este valor se agrega a la carpeta en /lib/modules y no creará conflictos con la instalación. Yo recomiendo poner una referencia a la fecha de compilación, ejemplo 30-11.




Presionamos enter para salir a la pantalla anterior, presionamos la flecha a la derecha para posicionarnos en la opción exit, presionamos enter y volvemos a las opciones de "General Setup" en donde vamos a bajar hasta "RCU Subsystem".

Presionamos enter y entramos en la siguiente pantalla en donde seleccionaremos haciendo enter en :  "RCU Implementation(Tree-based hierarchical RCU)"

y si está disponible (aquí se nota que no soy un experto si no más bien un "experimentado"... la primera vez no me salió pero la segunda sí... raro) vamos a escoger "Preemtable tree-based hierarchical RCU", si no lo dejamos como está... bueno no hay más opciones.



Seleccionamos "exit" las veces necesarias para volver a la primera pantalla, y esta vez vamos a bajar hasta "Processor type and features"


En la siguiente pantalla vamos a bajar hasta "Processor family (generic x86_64)" esta es la opción por defecto en mi caso ya que instalé una versión kubuntu para procesadores de 64bits, para las otras versiones la opción por defecto dice x86. Aquí es donde debemos poner la familia que corresponde a nuestro procesador.

Para mi caso que tengo un opteron AMD64 X2 tengo que seleccionar "Opteron/Athlon64/Hammer/K8"


Retrocedemos y bajamos hasta "Maximum number of CPUs". En la entrada anterior dijimos cómo saber cuantos procesadores o cores teníamos instalados. Pongan el número que corresponda o un número pequeño. En mi caso además del X2 (dos cores) también tengo un X4 así que podría perfectamente dejarle le valor 4 para así instalarlo en el otro equipo.



Para mi X2 sólo coloco 2. 64 es un número ridículo... salvo que tengan 64 procesadores en su máquina.



 Después bajamos hasta "Preemtion Model"



Lo cambiamos por "Preemtible Kernel (Low-Latency Desktop)".


##############################################
## ATENCIÓN
## ESTO LO ACABO DE AGREGAR, SI LLEGARON AQUÍ POR CONSEJO
## DE ALGUIEN AVÍSENLE PARA QUE LO VEA
##11-01-2011
##############################################

 Después bajamos hasta Timer Frequency (100Hz).


Al seleccionarla (enter) nos va a mostrar el siguiente menú. Para que entiendan un poco: 100Hz es para servidores. Llevándolo a palabras sencillas (aunque no necesariamente reales) en un servidor, que requiere de hacer muchísimas tareas en paralelo, es mejor que se demore un porquito más en hacerlas ya que son todas tareas pequeñas y se supone que siempre van a estar llegando más, por lo que, por así decirlo, en un determinado lapso de tiempo va a pasar digamos 100 veces por un proceso hasta que lo termine. Para multimedia necesitamos que el procesador le de más fuerza a cada pasada (o que pase más veces por ese proceso) lo que hace que cada proceso genere menos retardo (latencia). Sin dudarlo tanto para escritorios normales como para entornos de desarrollo multimedia, bien vale la pena subir a 1000Hz.

##################################################
## FIN ACTUALIZACIÓN
##################################################

Luego bajamos hasta
Salimos hasta volver a la primera pantalla y bajamos hasta "Kernel Hacking". 





Bajamos hasta "Kernel Debugging" que va a estar con un "*" al lado izquierdo. Presionamos la barra de espacio hasta que ya no haya ningún caracter en ese lado de la opción. En otras palabras le estamos quitando la opción de depuración al kernel con lo que tanto el kernel como los módulos serán más pequeños en tamaño.

Salimos hasta que el programa nos pregunte si queremos guardar la configuración del kernel.


Respondemos que sí y estaríamos listos para dejar correr el compilador.

Algunos dirán "pero si se puede mejorar más". Sí se puede, pero estos son los pasos mínimos para que el kernel quede optimizado al procesador y no toquemos cosas que no sabemos aún. El que quiera investigar más, bienvenido, el que quiera cooperar, también.

Con el siguiente comando vamos a compilar el kernel lo cual va a tardar mucho con un kernel genérico, pero créanme que va a valer la pena.

$ fakeroot make-kpkg --initrd kernel-image kernel-headers
Podría tomar horas así que tengan una película a mano.

Se supone que no debería de haber mensajes de error si, los hay es mejor revisar qué hicimos mal antes de proceder.

Cuando todo haya terminado en el directorio /usr/src/ encontraremos dos paquetes deb instalables; uno tiene el kernel con sus módulos y el otro con los headers los cuales son necesarios para compilar algunos módulos que no vienen incluidos en el kernel. Los instalamos así:
$ dpkg -i /usr/src/*.deb
¡¡¡¡¡¡¡¡¡    ATENCIÓN     !!!!!!!!!

SE SUPONE que con esto termina la instalación (y lo probé en Kubuntu 10.10 y funcionó fenomenal) pero en Kubuntu 10.04 (o ubuntu, no hay ninguna diferencia sustancial a demás del escritorio por defecto) parece haber un bug y no lo instala como debe por lo que se deben seguir los siguientes pasos o el sistema se vuelve inarrancable.

Ojo con lo que sigue.

Fíjense en lo que dejé marcado con blanco. Ese nombre vale oro para lo que viene.

En nuestra consola escribiremos:
$ sudo update-initramfs -c -k 2.6.32.15+drm33.1130-11
Con esto se le crea la imagen initrd que no sé por qué la instalación no hace.

Y para que se afirme el arranque hay que ejecutar:

$ sudo update-grub

 Ahora sí ya debería poder reiniciar su equipo y disfrutar de su flamante y nuevo kernel.

Dos cositas más:
1.- Los paquetes deb que quedan en /usr/src se pueden respaldar y en caso de emergencia sólo hay que reinstalarlos, ya no será necesario volver a compilar el kernel.

2.- No sé la razón o si es idea mía pero los cambios se notan más la SEGUNDA vez que se bootea con el nuevo kernel. Por si no les convence prueben unos días con su nuevo kernel antes de enjuiciarlo y en enviarlo a la hoguera.

Hasta la próxima.

    3 comentarios:

    1. Muchas gracias por tu ayuda,con tus indicaciones lo conseguí.

      ResponderEliminar
    2. No hay de qué, me alegra mucho ayudar. Corre la voz y a disfrutar tu nuevo kernel.

      ResponderEliminar
    3. Gracias, he podido compilar hasta el kernel 3.6 y ahora compilando el 3.7 hasta en ubuntu 12.04 y debian 6 y me funciona perfecto.

      ResponderEliminar