Problemas con Realtek RTL8111/8168B Gigabit Ethernet

A partir de la rama 2.6.37, en adelante, del kernel Linux el driver r8169 da problemas con las tarjetas de red Realtek RTL8168 al transferir grandes volúmenes de datos. En este tutorial se verá como instalar el controlador privativo de Realtek para solucionar este problema.

Tabla de contenidos: 


Antecedentes
Al comenzar grandes transferencias de datos, a través de la red, el sistema se bloquea totalmente. En mi caso, la transferencia de datos era hacia un raid5, al poco de iniciarse la transferencia, el kernel del sistema se bloqueaba. El fallo durante la escritura al raid5 provocaba que la integridad del raid se viera comprometida. Tras reiniciar el equipo, la tecla mágica SysRq no funciona, el raid debía ser resincronizado.

Puesto que la red, aparentemente, funcionaba sin problemas supuse que se debía a un problema con el raid. Sin embargo no pude hallar ningún problema en el raid. Así que me decidí a intentar repetir el bug pero controlando los mensajes de diagnóstico (tail -f /var/log/dmesg) e inicié la transferencia de un gran volumen de datos hacia otro disco, para descartar totalmente el raid. En los dos primeros intentos, el equipo se bloqueó y no se registro nada, en el tercero hubo suerte:
2011-06-13T22:15:03.884336+02:00 agd-desktop kernel: [  795.955257] r8169 0000:04:00.0: eth0: link up
2011-06-13T22:15:03.884351+02:00 agd-desktop kernel: [  795.955265] NOHZ: local_softirq_pending 08
2011-06-13T22:15:05.695358+02:00 agd-desktop kernel: [  797.764956] r8169 0000:04:00.0: eth0: link up
2011-06-13T22:15:05.695372+02:00 agd-desktop kernel: [  797.764964] NOHZ: local_softirq_pending 08
2011-06-13T22:15:05.711316+02:00 agd-desktop kernel: [  797.780942] r8169 0000:04:00.0: eth0: link up
2011-06-13T22:15:05.960348+02:00 agd-desktop kernel: [  798.029792] r8169 0000:04:00.0: eth0: link up
2011-06-13T22:15:05.960361+02:00 agd-desktop kernel: [  798.029799] NOHZ: local_softirq_pending 08
2011-06-13T22:15:06.435353+02:00 agd-desktop kernel: [  798.504457] r8169 0000:04:00.0: eth0: link up
2011-06-13T22:15:06.435367+02:00 agd-desktop kernel: [  798.504464] NOHZ: local_softirq_pending 08

No había duda, el problema estaba relacionado con el controlador de red. Sin embargo en la versión 2.6.36 del kernel nunca tuve problemas transfiriendo grandes volúmenes de datos; el problema solo ha ocurrido en las versiones 2.6.37-r4, 2.6.38-r6 y 2.6.39-r1 de sys-kernel/gentoo-sources.

Kernel Bug Tracker
En el sistema de seguimiento de errores del kernel, Kernel Bug Tracker, encontré el Bug 32962 – r8169 self reboot the machine with RTL8111/8168B PCI Express Gigabit Ethernet. Dicho bug describía mi problema a la perfección. La única solución que ofrecen actualmente es instalar el controlador propietario de Realtek.


Descargar los drivers para la tarjeta de red
En la página de descargas de Realtek se encuentran los drivers de sus productos para casi todas las plataformas posibles: Windows, Linux, FreeBSD, SCO Unix, DOS, MacOS...

En mi caso preciso los drivers para el modelo RTL8111/8168B, el cual es compatible también con los siguientes modelos de chipset de Realtek: RTL8111B/RTL8168B/RTL8111/RTL8168, RTL8111C/RTL8111CP/RTL8111D(L), RTL8168C/RTL8111DP/RTL8111E y RTL8168E. [+/-] ¿como averiguar mi modelo?


Compilar el driver
Una vez descargado el paquete con el driver, en mi caso r8168-8.024.00.tar.bz2, es necesario descomprimir el contenido en /usr/src/linux/, hacer un enlace simbólico de /usr/src/linux/r8168-8.024.00/src a /usr/src/linux/src y por último compilar el driver haciendo uso del propio script autorun.sh:
agd-desktop # pwd
/usr/src/linux
agd-desktop # tar -xvjf  r8168-8.024.00
agd-desktop # ln -s  /usr/src/linux/r8168-8.024.00/src /usr/src/linux/src
agd-desktop # cd r8168-8.024.00/
agd-desktop # ./autorun.sh

En mi caso me arrojó un par de errores, por lo que tuve que crear algunos directorios ([+/-] Ver), tras lo cual todo funcionó perfectamente.
agd-desktop # ./autorun.sh 

Check old driver and unload it.
rmmod r8169
Build the module and install
Depending module. Please wait.
load module r8168
Completed.


Cargar el driver al inicio del sistema
Por último debemos indicar al sistema que driver debe cargar. Para ello deberemos colocar el driver problemático en /etc/modprobe.d/blacklist.conf y el driver que debe ser cargado en /etc/modules.autoload.d/kernel-2.6. Es decir:
agd-desktop # echo "blacklist r8169" >> /etc/modprobe.d/blacklist.conf 
agd-desktop # mkdir /etc/modules.autoload.d/
agd-desktop # echo "r8168" >>  /etc/modules.autoload.d/kernel-2.6

18 comentarios:

#
Unknown dijo...

Te hago una consulta cuales son los directorios que tubiste que crear para que no se sanla error al hacer ./autorun.sh

#
Unknown dijo...

En mi caso tuve que crear los siguientes subdirectorios dentro del directorio donde se localizan los módulos de mi kernel en ejecución: /lib/modules/2.6.38-gentoo-r6-agd/:

kernel/drivers/net
build

Si dudas donde debes de crear estos subdirectorios, haz un ls /lib/modules, y crea los dentro del directorio con el número más grande. En mi caso:


agd@agd-desktop $ ls /lib/modules/
2.6.34-gentoo-r11-agd 2.6.36-gentoo-r8-agd
2.6.34-gentoo-r12-agd 2.6.37-gentoo-r4-agd
2.6.36-gentoo-r5-agd 2.6.38-gentoo-r6-agd

Si sigues teniendo problemas, pega el mensaje de error que te da.

#
Ronindo dijo...

Hola:
He comprado un pc recientemente y estoy teniendo este problema (uso Ubuntu), he realizado estos pasos que vi en otra web en inglés pero el problema es que si actualizo al kernel nuevo versión 3 rc7 no me funciona e incluso me deja de funcionar internet ya que me elimina el driver conflictivo pero no me instala en correcto, no se si podrías decirme cómo hacerlo funcionar o qué modificaciones podría hacer en el Makefile del instalador para que funcione. Gracias de antemano

#
Unknown dijo...

Ronindo si actualizas el kernel debes volver a compilar el driver, es decir, debes de volver a realizar estos pasos. Si en el proceso de compilación te da algún error, pega-lo para saber que está ocurriendo e intentar darte una solución.

#
Ronindo dijo...

El mensaje de error es:

Check old driver and unload it.
Build the module and install
make[2]: *** No hay ninguna regla para construir el objetivo «modules». Alto.
make[1]: *** [modules] Error 2
make: *** [modules] Error 2

He creado las carpetas que indicas teniendo en cuenta que la carpeta del kernel es diferente pero sigue dando el mismo fallo

#
Unknown dijo...

Para compilar un driver son necesarias las fuentes. En tu comentario anterior dices que estas usando un kernel 3.0, por lo que imagino que te bajaste las fuentes y las compilaste por ti mismo.

Si es este el caso, es posible que el problema este en que no se existen enlaces simbólicos desde las fuentes a /lib/modules/. Puedes probar a crear un enlace simbólico desde tus fuentes a /lib/modules/TU KERNEL/build. Así, por ejemplo, si suponemos que tus fuentes son 3.0-rc7 deberás ejecutar: sudo ln -s /usr/src/3.0-rc7 /lib/modules/3.0-rc7/build

Es posible de que no exista /lib/modules/3.0-rc7/, en ese supuesto deberás de crearlo para poder crear el enlace simbólico.

#
Unknown dijo...

Acabo de darme cuenta, el error es muy descriptivo. Te está indicando que no existen las reglas modules.* en /lib/modules/3.0-rc7/, lo cual significaría que cuando compilaste el kernel no se ejecutó make modules y por tanto no se pobló /lib/modules/3.0-rc7.

#
Ronindo dijo...

Bueno, lo cierto es que en temas de compilación estoy muy verde por lo que la instalación del kernel la hice con archivos .deb, no se si esto influiría o si no es la mejor manera. También probé actualizando a ubuntu oneiric alpha con lo cual se actualizaba el kernel pero tenía el mismo problema. Como te digo no tengo demasiada idea de estas cosas (voy aprendiendo sobre la marcha).

#
Unknown dijo...

Necesitas instalar las fuentes del kernel, en ubuntu se llaman linux-headers. Deberas instalar las headers de tu kernel (3.0). Si no me equivoco ubuntu, tras instalar las headers, puebla /lib/modules/. Lo puedes comprobar simplemente listando el contenido del directorio, deberas de ver varias reglas nombradas como modules.*.

Una vez tengas las fuentes en /usr/src/3.0 y las reglas en /lib/modules/3.0/, podras compilar el driver.

#
Ronindo dijo...

Uno de los paquetes .deb es linux-headers-3.0.0-0300rc7_3.0.0-0300rc7.201107120911_all.deb y otro linux-headers-3.0.0-0300rc7-generic_3.0.0-0300rc7.201107120911_amd64.deb y el tercero que ejecuto es linux-image-3.0.0-0300rc7-generic_3.0.0-0300rc7.201107120911_amd64.deb
Supongo que deberían crear todas las carpetas y reglas correspondientes. Pero el problema se produce. En estos momentos estoy replanteándome volver a Ubuntu Natty y esperar si se soluciona el problema con los drivers en Oneric pero me preocupa que cuando finalmente se libere la versión definitiva y reinstale todo el sistema el problema siga.

#
Unknown dijo...

Acabo de probar a compilar el driver en una máquina virtual con Ubuntu, y no tuve ningún problema. La configuración de la máquina virtual con Ubuntu es:
- Ubuntu 11.04
- Kernel: 2.6.38-8-generic
- Paquetes: linux-headers-2.6.38-8, linux-headers-2.6.38-8-generic, linux-headers-2.6.38-8-virtual, gcc, gcc-4.4, gcc-4.5, gcc-opt y xutils-dev.

El proceso de compilación:
makeinstall@VM:/tmp/r8168-8.024.00$ uname -a
Linux VM 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 03:31:50 UTC 2011 i686 i686 i386 GNU/Linux
makeinstall@VM:/tmp$ tar -xvf r8168-8.024.00.tar.bz2
r8168-8.024.00/
r8168-8.024.00/Makefile
r8168-8.024.00/src/
r8168-8.024.00/src/Makefile
r8168-8.024.00/src/r8168_asf.h
r8168-8.024.00/src/rtl_eeprom.c
r8168-8.024.00/src/r8168.h
r8168-8.024.00/src/r8168_n.c
r8168-8.024.00/src/r8168_asf.c
r8168-8.024.00/src/rtl_eeprom.h
r8168-8.024.00/src/rtltool.h
r8168-8.024.00/src/rtltool.c
r8168-8.024.00/src/Makefile_linux24x
r8168-8.024.00/README
r8168-8.024.00/autorun.sh
makeinstall@VM:/tmp$ cd r8168-8.024.00/
makeinstall@VM:/tmp/r8168-8.024.00$ ls
autorun.sh Makefile README src
makeinstall@VM:/tmp/r8168-8.024.00$ ./autorun.sh

Check old driver and unload it.
Build the module and install
install: no se puede crear el fichero regular «/lib/modules/2.6.38-8-generic/kernel/drivers/net/r8168.ko»: Permiso denegado
make[1]: *** [install] Error 1
make: *** [install] Error 2
makeinstall@VM:/tmp/r8168-8.024.00$ sudo ./autorun.sh
sudo: unable to resolve host VM
[sudo] password for makeinstall:

Check old driver and unload it.
Build the module and install
[: 48: r8168: unexpected operator
Backup r8169.ko
rename r8169.ko to r8169.bak
Depending module. Please wait.
load module r8168
Completed.
makeinstall@VM:/tmp/r8168-8.024.00$ lsmod | grep ^r8
r8168 177261 0


Como ves, aunque el compilador se quejo, finalmente se compilo e incluso ubuntu se encargó el solo de cargar el modulo r8168. Prueba con la configuración que he usado, ya que con ella funciona.

#
Ronindo dijo...

Finalmente he conseguido hacerlo funcionar pero en el kernel 2.8.38-10 en el 3.0-0 no consigo que funcione aunque realice los mismos pasos. De momento seguiré con ubuntu Natty y a ver si en Oneiric consiguen solucionar estos problemas de drivers Realtek.
Muchas gracias

#
Unknown dijo...

;)

#
danitool dijo...

Solo quiero decir que Realtek apesta, debe ser el hardware con las especificaciones más altas y sin embargo de peor calidad que existe (por algo es chino),

y encima no hay opción, todos los chips de sonido y ethernet que se montan en TODAS las placas base son Realtek.

#
Unknown dijo...

En lo que me toca nunca he tenido problemas con el soporte de Realtek. Si algo ha fallado solo he tenido que descargar y compilar sus drivers; y todo ha salido funcionando, como en este caso.

#
Anónimo dijo...

Ubuntu 11.10, kernel 3.0.0.15, driver propietario versión 8.0.27.00 (compila correctamente) pero el problema persiste. No tuve otra solución que reemplazar la nic (desactivarla y poner una PCI)
El problema me volvió loco, desarme toda la red, server, etc, pensando que la falla venía por otro lado. A menos, que quede documentado, es una falla del driver de realtek (tengo win7 en boot dual y alli funciona perfecto la placa).
Esperemos en algún momento lo resuelvan

#
Unknown dijo...

Hola, tengo un sistema operativo fedora 17, la version del kernel es 3.6.9-2, al intentar compilar el driver me sale este error:

Check old driver and unload it
Build the module and install
make:*** /lib/modules/3.6.9-2.fc17.i686/build: No such file or directory. Stop

make[1]: *** [clean] Error 2
make: *** [clean] Error 2

Procedí entonces a crear dicha carpeta pues el mensaje de error es un tanto claro, pero cuando entre al directorio en donde debía crear la carpeta "build", encontré un enlace simbólico llamado "build", el cual estaba roto porque estaba sombreado de color negro, este era una enlace al directorio /usr/src/kernels/3.6.9-2.fc17.i686, entonces me dirigí a este directorio, pero no había nada, el directorio /usr/src/kernels estaba vacío. Cómo puedo solucionar ese problema?, ya tengo instalado el paquete kernel-headers, hay algún otro paquete necesario? cordiales saludos.

#
Unknown dijo...

George necesitas las fuentes del kernel. En Red Hat, y derivadas, los paquetes fuentes se marcan como devel.

Así que necesitaras instalar kernel-devel-3.6.9-algo.arquitectura. Haz un yum search para saber el nombre exacto del paquete.

En principio debería de funcionar ya.

Suerte ;)

Publicar un comentario

Recuerde que puede utilizar algunos códigos HTML como <b>para negrita</b>, <i>para cursiva</i> y <a href="URL">para enlaces</a>.