Einleitung
Der r8169-Treiber für den Realtek-Netzwerkchip funktioniert bis zur Kernelversion 4.16 nicht immer korrekt. Es können Timeouts entstehen, die Netzwerkkarte zwischen den Zuständen link up/link down wechseln sowie Bandbreitenprobleme oder sogar Systemabstürze vorkommen.
Eine Lösung des Problems besteht in der Installation des offiziellen r8168 Treibers von Realtek statt dem r8169 des Linux Kernels. Er kann aus Fremdrepositories nachinstalliert oder selbst kompiliert werden. Alternativ kann der Kernel auf Version 4.17+ aktualisiert werden.
Dieser Artikel beschreibt, wie dabei vorzugehen ist.
Option A - Installation von kmod-r8168 aus elrepo.org
Die elrepo.org-Webseite bietet zusätzliche Pakete rund um Redhat Enterprise Linux Distributionen an, zu denen auch CentOS gehört. Um Pakete aus diesem Repository nutzen zu können, muss man dieses zunächst im System einbinden.
HINWEIS: Wenn kein Standard-Kernel verwendet wird (Virtuozzo, OpenVZ, etc.) muss das Modul selbst kompiliert werden!
Zuerst muß der öffentliche GPG-Schlüssel importiert werden.
rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org
Für RHEL-6, CentOS-6 oder SL-6:
rpm -Uhv http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
Für RHEL-7, CentOS-7 oder SL-7:
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
Zum Schluß kann nun einfach das Paket mit dem neuen Kernel-Modul installiert werden.
yum --enablerepo=elrepo install kmod-r8168
Nach einem Neustart wird der geänderte Treiber verwendet. Er bleibt auch nach einer Aktualisierung des Kernels aktiv.
Option B - Installation aus den Quellen
Schritt 1 - Voraussetzungen
Es sollte zunächst der neueste Kernel via yum
beziehungsweise apt-get
installiert werden und gebootet sein.
CentOS
Zum Übersetzen müssen nun noch die Header-Pakete
des Kernels, kernel-devel
und kernel-headers
, sowie der Compiler
installiert werden, um den Treiber zu übersetzen:
yum install gcc gcc-c++ kernel-devel kernel-headers
Debian/Ubuntu
Bei Debian/Ubuntu hängt der Name des Header-Pakets vom ausgewählten Kernel ab. Alle weiteren zur Übersetzung notwendigen Pakete werden durch build-essentials
installiert:
aptitude install build-essential linux-headers-`uname -r` screen
Proxmox
Bei Proxmox liegen die Header im Paket pve-headers
aptitude install pve-headers-`uname -r`
Schritt 2 - Herunterladen und Entpacken der Quellen
cd /tmp
wget http://mirror.hetzner.de/tools/Realtek/drivers/r8168-8.046.00.tar.bz2
tar xf r8168-8.046.00.tar.bz2
Schritt 3 - Kompilieren des Treibers
Das Paket enthält ein autorun.sh
Skript, welches automatisch den Treiber kompiliert und den vorhanden r8169 Treiber ersetzt. Hierbei wird die Netzwerkverbindung getrennt. Sie sollten dieses Skript daher in einer screen-Sitzung starten und nur dann benutzen, wenn Sie sich absolut sicher sind, dass das Kernelmodul ohne Fehler gebaut werden kann. Sie können dies zuvor durch make modules
überprüfen.
cd r8168-8.046.00
make modules
oder
make all
Falls bei make modules
keine Fehler aufgetreten sind, können Sie den Treiber im laufenden System ersetzen. Hierbei wird die Netzwerkverbindung unterbrochen und der r8169 dauerhaft deaktiviert!
# screen
# cd r8168-8.046.00
# ./autorun.sh
Falls Sie keine Unterbrechung im laufenden Betrieb möchten oder den r8169 Treiber nur temporär deaktivieren möchten, können Sie stattdessen den Treiber wie unten beschrieben aktivieren.
Schritt 4 - Aktivieren des Treibers
CentOS
In der Datei /etc/modprobe.conf
muss der zuständige Treiber für die Schnittstelle `eth0 geändert werden. Hierfür muss der Eintrag
alias eth0 r8169
zu
alias eth0 r8168
geändert werden.
Der kompilierte Treiber muss nun noch aktiviert werden. Da der Server währenddessen für einige Sekunden nicht übers Netzwerk erreichbar sein wird, werden die nötigen Befehle in ein Shell-Skript geschrieben.
echo "rmmod r8169" > /tmp/r8168
echo "depmod -a" >> /tmp/r8168
echo "modprobe r8168" >> /tmp/r8168
echo "service network restart" >> /tmp/r8168
echo "service ipaliases restart" >> /tmp/r8168
Das angelegte Skript ausführen:
sh /tmp/r8168
Nach wenigen Sekunden sollte der Server mit dem neuen Netzwerkkartentreiber wieder übers Netzwerk erreichbar sein. Das Arbeitsverzeichnis kann nun gelöscht werden:
rm -rf /root/r8168
Debian/Ubuntu
Nach der Installation des Treibers müssen zunächst die Modulabhängigkeiten aktualisiert werden:
depmod -a
Als erstes muss verhindert werden, dass der Kernel den r8169 Treiber automatisch lädt. Hinweis: Sind zusätzliche Gbit-Netzwerkkarten im Server verbaut, darf der Treiber nicht auf die Blacklist gesetzt werden.
Ubuntu / Debian 6.0 (squeeze):
echo "blacklist r8169" >> /etc/modprobe.d/blacklist.conf
Als nächstes wird das Einbinden des neuen Treibers in die initrd
erzwungen. Dies sorgt auch bei zusätzlich eingebauten Netzwerkkarten dafür, daß das r8168-Modul vor dem r8169-Modul geladen wird.
echo "r8168" >> /etc/initramfs-tools/modules
Anschließend wird diese neu erzeugt.
update-initramfs -v -t -u
Abschließend kann der Server neu gebootet werden.
Nach einer Aktualisierung des Kernels muss der Treiber gegebenenfalls neu kompiliert werden.
Schluss
Hier wurden zwei verschiedene Wege gezeigt, das Treiberproblem bei Realtek-Netzwerkchips zu beheben