
Si, así es, seguro alguna vez te toco encontrarte con una memoria rota. Bueno, si usas GNU/Linux considerate afortunado, porque las memorias que contienen sectores defectuosos pueden utilizarse sin ningún tipo de problemas. ¿Cómo?, simple, al kernel le podemos decir que no utilice los sectores defectuosos de la misma, por lo que el resto de la memoria puede utilizarse sin problemas.
Lo primero que tenemos que hacer es detectar los sectores defectuosos, para esto utilizamos el memtest86+, cuya instalación en Debian simplemente se reduce a hacer un
apt-get install memtest86+
Luego editamos el /boot/grub/menu.lst y descomentamos la siguiente línea
# memtest86=true
Guardamos y corremos lo siguiente
update-grub
Eso actualizará nuestro grub, y agregará la opción de memtest a éste.
El paso siguiente es reiniciar la máquina y elegir memtest86+ en el grub, con lo que empezamos a correr el testeo de memoria. Entre las opciones que debemos configurar en el memtest, esta el como informa los errores que encuentra, necesitamos que muestre los errores en el formato BadRam, el que luego veremos porque. Para esto simplemente nos vamos a la parte de opciones (presionamos la “c”), de ahí nos vamos “Error Report Mode ” (presionamos 5 ), y por últimos seleccionamos la opción “BadRam Patterns”. Listo, dejamos correr el test, en cuanto al tiempo que este debe correr, digamos que mientras más mejor, pero bueno, para tener un número les digo que sería bueno dejarlo corriendo unas 10 hs, por ejemplo toda una noche.
Pasadas estas 10hs de test, anotamos le reporte de errores, el que luego utilizaremos para decirle al kernel, que direcciones no utilice. En mi caso solo apareció un solo sector defectuoso, y el reporte solo tenía lo siguiente:
badram = 0x01c751f4,0xfffffffc
Tomamos nota de esto y presionamos escape para reiniciar (el test nunca termina, nosotros decidimos cuando es suficiente).
Ahora que ya tenemos el reporte, lo que tenemos que hacer es aplicarle un patch al kernel, y si señores, lamentablemente tendremos que compilar el kernel , pero no se desanimen, que es una tarea emocionante .
Antes de continuar, les digo que no es recomendable compilar el kernel en la misma máquina que tiene las memorias defectuosas, por lo que sería bueno que los pasos siguientes se realizaran en otra máquina, y luego de que generemos el .deb con la imagen customizada del kernel y con el patch en cuestión, copiemos este .deb a la maquina con problemas, y lo ejecutemos allí.
El patch en cuestión se llama badram, y en Debian el paquete que lo contiene se llama kernel-patch-badram, por lo que hacemos
apt-get install kernel-patch-badram
Luego de instalar este paquete, debemos instalar los fuentes del kernel al cual le aplicaremos el patch, en mi caso uso el último disponible, el linux-sources-2.6.22, así que hacemos
apt-get install linux-source-2.6.22
Configuramos el kernel, para que trabaje en base a nuestro hardware, por lo que ya saben,
cd /usr/src
tar -xvfj linux-source-2.6.22.tar.bz2
cd linux-source-2.6.22
make xconfig
Elegimos las opciones que más se adecuen a nuestro hardware, entre las que estan el tipo de arquitectura y el procesador. No voy a entrar en detalle sobre esto, porque sería demasiado extenso, el tío google sabe un montón de esto, así que cualquier consulta sobre como elegir las opciones de configuración del kernel, estarán más que contestadas .
Después de que seleccionamos las opciones de nuestro kernel, pasamos a compilarlo, para lo que vamos a utilizar la herramienta make-kpkg, la que compilará y empaquetará el kernel nuevo (generará un .deb con el kernel que compilamos).
apt-get install kernel-package
luego ejecutamos
cd /usr/src/linux-source-2.6.22
make-kpkg –append-to-version=custom`date +%d%m%y` –initrd –added-patches badram kernel_image
NOTA: el `date +%d%m%y` es para que ponga la fecha de hoy, es a libre elección esto, yo prefiero ponerle fecha para después acordarme cuando lo compile.
Bueno, esperamos a que termine de compilar y empaquetar y listo, ya tenemos en /usr/src el paquete con nuestro kernel compilado, emparchado y empaquetado, en mi caso el .deb se llama linux-image-2.6.22.151007_2.6.22.151007-1.0.Custom_i386.deb.
Copiamos este .deb a la maquina con problemas, y lo instalamos simplemente haciendo
dpkg -i linux-image-2.6.22.151007_2.6.22.151007-10.00.Custom_i386.deb
Después editamos el archivo /boot/grub/menu.lst y a la línea del kernel nuevo le agreamos lo que nos genero el memtest86+, o sea, badram=0x01c751f4,0xfffffffc. En definitiva, la sección del kernel nuevo nos queda de la siguiente manera:
title Debian GNU/Linux, kernel 2.6.22.151007
root (hd0,4)
kernel /boot/vmlinuz-2.6.22.151007 root=/dev/hda5
ro badram=0x01c751f4,0xfffffffc
initrd /boot/initrd.img-2.6.22.151007
savedefaultListo, reiniciamos y elegimos el nuevo kernel, y ya estaremos usando solo la memoria sana , para chequear que realmente haya tomado el parámetro de badram, hacemos un dmesg |less y nos debería aparecer algo como
…
Kernel command line: root=/dev/hda5 ro
badram=0x01c751f4,0xfffffffc
PAGE_OFFSET=0xc0000000
BadRAM option is =0x01c751f4,0xfffffffc
–> marking 0x01c751f4, 0xfffffffc
0000000000001c75 =0000000000001c7
…
Lo primero que tenemos que hacer es detectar los sectores defectuosos, para esto utilizamos el memtest86+, cuya instalación en Debian simplemente se reduce a hacer un
apt-get install memtest86+
Luego editamos el /boot/grub/menu.lst y descomentamos la siguiente línea
# memtest86=true
Guardamos y corremos lo siguiente
update-grub
Eso actualizará nuestro grub, y agregará la opción de memtest a éste.
El paso siguiente es reiniciar la máquina y elegir memtest86+ en el grub, con lo que empezamos a correr el testeo de memoria. Entre las opciones que debemos configurar en el memtest, esta el como informa los errores que encuentra, necesitamos que muestre los errores en el formato BadRam, el que luego veremos porque. Para esto simplemente nos vamos a la parte de opciones (presionamos la “c”), de ahí nos vamos “Error Report Mode ” (presionamos 5 ), y por últimos seleccionamos la opción “BadRam Patterns”. Listo, dejamos correr el test, en cuanto al tiempo que este debe correr, digamos que mientras más mejor, pero bueno, para tener un número les digo que sería bueno dejarlo corriendo unas 10 hs, por ejemplo toda una noche.
Pasadas estas 10hs de test, anotamos le reporte de errores, el que luego utilizaremos para decirle al kernel, que direcciones no utilice. En mi caso solo apareció un solo sector defectuoso, y el reporte solo tenía lo siguiente:
badram = 0x01c751f4,0xfffffffc
Tomamos nota de esto y presionamos escape para reiniciar (el test nunca termina, nosotros decidimos cuando es suficiente).
Ahora que ya tenemos el reporte, lo que tenemos que hacer es aplicarle un patch al kernel, y si señores, lamentablemente tendremos que compilar el kernel , pero no se desanimen, que es una tarea emocionante .
Antes de continuar, les digo que no es recomendable compilar el kernel en la misma máquina que tiene las memorias defectuosas, por lo que sería bueno que los pasos siguientes se realizaran en otra máquina, y luego de que generemos el .deb con la imagen customizada del kernel y con el patch en cuestión, copiemos este .deb a la maquina con problemas, y lo ejecutemos allí.
El patch en cuestión se llama badram, y en Debian el paquete que lo contiene se llama kernel-patch-badram, por lo que hacemos
apt-get install kernel-patch-badram
Luego de instalar este paquete, debemos instalar los fuentes del kernel al cual le aplicaremos el patch, en mi caso uso el último disponible, el linux-sources-2.6.22, así que hacemos
apt-get install linux-source-2.6.22
Configuramos el kernel, para que trabaje en base a nuestro hardware, por lo que ya saben,
cd /usr/src
tar -xvfj linux-source-2.6.22.tar.bz2
cd linux-source-2.6.22
make xconfig
Elegimos las opciones que más se adecuen a nuestro hardware, entre las que estan el tipo de arquitectura y el procesador. No voy a entrar en detalle sobre esto, porque sería demasiado extenso, el tío google sabe un montón de esto, así que cualquier consulta sobre como elegir las opciones de configuración del kernel, estarán más que contestadas .
Después de que seleccionamos las opciones de nuestro kernel, pasamos a compilarlo, para lo que vamos a utilizar la herramienta make-kpkg, la que compilará y empaquetará el kernel nuevo (generará un .deb con el kernel que compilamos).
apt-get install kernel-package
luego ejecutamos
cd /usr/src/linux-source-2.6.22
make-kpkg –append-to-version=custom`date +%d%m%y` –initrd –added-patches badram kernel_image
NOTA: el `date +%d%m%y` es para que ponga la fecha de hoy, es a libre elección esto, yo prefiero ponerle fecha para después acordarme cuando lo compile.
Bueno, esperamos a que termine de compilar y empaquetar y listo, ya tenemos en /usr/src el paquete con nuestro kernel compilado, emparchado y empaquetado, en mi caso el .deb se llama linux-image-2.6.22.151007_2.6.22.151007-1.0.Custom_i386.deb.
Copiamos este .deb a la maquina con problemas, y lo instalamos simplemente haciendo
dpkg -i linux-image-2.6.22.151007_2.6.22.151007-10.00.Custom_i386.deb
Después editamos el archivo /boot/grub/menu.lst y a la línea del kernel nuevo le agreamos lo que nos genero el memtest86+, o sea, badram=0x01c751f4,0xfffffffc. En definitiva, la sección del kernel nuevo nos queda de la siguiente manera:
title Debian GNU/Linux, kernel 2.6.22.151007
root (hd0,4)
kernel /boot/vmlinuz-2.6.22.151007 root=/dev/hda5
ro badram=0x01c751f4,0xfffffffc
initrd /boot/initrd.img-2.6.22.151007
savedefaultListo, reiniciamos y elegimos el nuevo kernel, y ya estaremos usando solo la memoria sana , para chequear que realmente haya tomado el parámetro de badram, hacemos un dmesg |less y nos debería aparecer algo como
…
Kernel command line: root=/dev/hda5 ro
badram=0x01c751f4,0xfffffffc
PAGE_OFFSET=0xc0000000
BadRAM option is =0x01c751f4,0xfffffffc
–> marking 0x01c751f4, 0xfffffffc
0000000000001c75 =0000000000001c7
…