Badram es un parche para el nucleo de Linux que nos permite utilizar algunos módulos de memoria RAM averiados. Si nuestra memoria tiene averiadas algunas direcciones fijas, es posible decirle al núcleo de Linux que no escriba nada en esas direcciones. Por desgracia, y hasta que se incluya el badram en el núcleo de Linux, no nos queda mas remedio que usarlo como parche. Aquí va una pequeña explicación sobre como parchear el núcleo y usar badram. Está centrado en Ubuntu Feisty, aunque debería de ser extrapolable facilmente. De todas formas, y puesto que lo que vamos a hacer aquí no es un proceso trivial, y nos llevará un buen rato, no puedo dejar de recomendar una lectura de la página de badram antes de decidirnos a hacer nada. Por último, quiero advertir que esto no es una guia exhaustiva ni sobre badram ni sobre la compilación del kernel, sino una pequeña recetilla que escribo con la esperanza de que pueda ayudar a alguien, y sin ofrecer ninguna garantía. Un consejo, si alguien quiere hacer lo que aquí explico, que investigue un poco antes, y sobre todo, que se lea esto enterito antes de hacerlo. Para saber lo que puede esperar.
1. En primer lugar debemos detectar que posiciones de nuestra memoria están averiadas. Para ello empleamos el programa memtest86+ que viene incluido por defecto en Ubuntu. En otras distribuciones debería ser sencillo de instalar mediante el sistema de paquetería que cada una use. Una vez estemos ejecutando memtest86+ debemos decirle que muestre los resultados como cadenas para badram (“badram patterns”). Cuando el memtest lleve un rato funcionando copiaremos con mucho cuidado el resultado (o mejor aún, le tiraremos una foto a la pantalla si podemos). Necesitaremos esas notas mas adelante. Puesto que el memtest86+ genera varias líneas, creo (y es lo que me funciona) que basta con anotar la última.
2. Una vez hecho esto, necesitamos instalar unos cuantos paquetes, y para ello necesitamos arrancar el ordenador. Para hacer esto, conviene conocer el parámetro mem. Me explico. En la foto se vé que la primera posición de mi memoria que está averiada está en los 130 megas. Es decir, que los primeros 130 megas de mi RAM funcionan bien. En el arranque podemos decirle a linux que no use toda la memoria disponible, sino una cantidad que le indiquemos nosotros. Por ejemplo, si yo quiero usar solo 128 megas de RAM, le pasaré al kernel el parámetro mem=128M
La manera de hacerlo paso a paso es:
- Pulsamos ESC cuando veamos que el GRUB está cargando (lo veremos, en inglés, al poco de encender el ordenador). Con esto hemos sacado el menú de GRUB
- Una vez en ese menú, veremos una lista con varios núcleos y el memtest86+ Nos quedamos sobre el núcleo que está seleccionado y pulsamos e (editar)
- Una vez pulsado esto, nos saldrán varias líneas. Nos ponemos sobre la que empieza por “kernel” y pulsamos e
- Nos saldrá una línea larga. Avanzamos hasta el final de la línea y añadimos mem=128M (o lo que sea en cada caso). Pulsamos intro y después b
3. Una vez arrancado el sistema, vamos a instalar paquetes.
En primer lugar, las fuentes del nucleo. Podemos ver la versión del nucleo que estamos ejecutando con uname -r En mi caso 2.6.20-15-generic. Esto significa que debo instalar el paquete llamado linux-source-2.6.20
sudo apt-get install linux-source-2.6.20
Aparte de este, vamos a instalar unos cuantos paquetes mas para poder compilar el núcleo.
sudo apt-get install build-essential bin86 kernel-package
sudo apt-get install libqt3-headers libqt3-mt-dev
Y por último, bajamos de la web de badram el parche correspondiente a nuestra versión del núcleo.
Una vez instalados los paquetes, en primer lugar, vamos a /usr/src y extraemos las fuentes del nucleo que acabamos de instalar:
cd /usr/src
sudo tar jxvf linux-source-2.6.20.tar.bz2
Y después creamos un enlace simbolico, de forma que el directorio /usr/src/linux apunte a las fuentes que acabamos de instalar, en mi caso, esto es:
sudo ln -s /usr/src/linux-source-2.6.20 /usr/src/linux
4. A continuación vamos a aplicar el parche que acabamos de descargar. Lo copiamos a /usr/src/linux y lo aplicamos. En mi caso, lo que tengo que hacer es:
sudo patch -p1 < Nombre_del_parche.patch
5. Como paso previo a la configuración de nuestro núcleo, copiamos la configuracón actual a la raiz de las fuentes del nucleo, es decir:
sudo cp /boot/config-2.6.20-15-generic /usr/src/linux/.config
6. Ya estamos listos, basta con ponernos en /usr/src/linux y hacer sudo make xconfig para configurar nuestro nuevo nucleo. Para confirmar que hemos aplicado el parche correctamente, vamos a “Processor type and features” y comprobamos que “Work around bad spots in RAM” está activado.
7. Una vez hecho esto, y todo lo que hayamos querido tocar en la configuración del nucleo, una última cosa que tuve que hacer yo para lograr tener una consola de alta resolución. Antes de compilar debemos tocar el archivo /etc/initramfs-tools/modules
y añadir vesafb y fbcon, así conseguiremos que el framebuffer de la consola siga funcionando.
8. Por último, para compilar basta con ir a /usr/src/linux y hacer
sudo make-kpkg clean
y por último
make-kpkg --append-to-version=.XXXX --initrd kernel_image
Las XXXX las podeis sustituir por algún nombre para identificar el kernel. Yo he puesto badram2
Para una explicación mas detallada de este paso, os remito a está página
9. Tras esperar un buen rato, tendremos nuestro kernel compilado. Ya queda poco. Nos habrá quedado en /usr/src, así que vamos allí y lo instalamos:
sudo dpkg -i linux-image-2.6.20.3-ubuntu1.badram2_2.6.20.3-ubuntu1.badram2-10.00.Custom_i386.deb
10. Una vez instalado, debemos pasarle a nuestro nuevo nucleo la linea que nos dió memtest86+ Esto lo hacemos editando el archivo /boot/grub/menu.lst En ese archivo buscamos la sección que tenga exactamente el nombre del kernel que acabamos de instalar (en mi caso es Ubuntu, kernel 2.6.20.3-ubuntu1.badram2, puedo identificarlo gracias al badram2 del nombre). Dentro de esa sección buscamos la línea que comienza con kernel, y al final añadimos la linea del memtest86+. En mi caso, esto es:
badram=0x08284f28,0xfd7dfffc,0x08274f28,0xfd77fffc,0x08200f28,0xfff83ffc,0x0aa80f28,0xfffe7ffc,0x0aaf0f28,0xfffffffc,0x0aad0f28,0xffffbffc,0x0aa80f28,0xfff9fffc,0x082b0f28
11 Y ya está. Reiniciamos y arrancamos con el nuevo kernel. Para comprobar que badram está funcionando, basta con hacer:
dmesg | grep BadRAM
Que me devuelve la siguiente línea:
[ 30.121477] Memory: 601976k/655280k available (2018k kernel code, 52020k reserved, 895k data, 328k init, 0k highmem, 264k BadRAM)
12. Un último comentario. Como tengo una tarjeta NVIDIA y estoy usando los drivers propietarios, al reiniciar, me encuentro con que las X no arrancan. Para arreglar esto, basta con instalar el paquete nvidia-kernel-source, descomprimir el archivo que nos instala en /usr/src, entrar al directorio que nos crea, compilar con make module e instalar.



