La maledetta RTL8168 e Linux

Diciamo che non mi accade così spesso di configurare una nuova macchina Linux bare metal, per cui mi sento un po’ giustificato, ma vorrei raccontare delle maledizioni di quando mi accorgo che ancora una volta la macchina che sto configurando ha un NIC RTL8111/8168/8411 e Linux mi carica automaticamente il modulo r8169. Ora diciamola tutta, la scheda non è così poco diffusa, è quella che generalmente viene montata sulle schede madri con LAN 1Gbps, la cosiddetta Gigabit LAN, ed il driver caricato di default, è caricato di default da quanto? 10 anni? ok la storia è questa. Ma è anche probabile che a qualcuno questo modulo funzioni correttamente anche sulla RTL8168, perché il team di sviluppo dice che negli ultimi anni ci ha lavorato, tant’è che sul repository ufficiale del modulo r8168 si legge:

If you are using r8168-dkms because the in-kernel r8169 does not
support your NIC or is not working properly, please check the
following:

* Have you tried a more recent kernel? The problem may be fixed
  there already. In that case the current r8169 driver may be
  ported back to an older kernel - please report a bug against
  the Debian kernel package where r8169 is not working as
  expected.

* If no version of the in-kernel driver r8169 supports your NIC,
  please report this to the r8169 maintainers, so that this can
  be fixed:

    To: Realtek linux nic maintainers <[email protected]>
    To: Francois Romieu <[email protected]>
    Cc: [email protected]

  You may also wish to open a Debian bug report (against the
  src:linux package) and Cc that.


If you want to switch back from r8168-dkms to the in-kernel r8169
driver it is necessary to purge the r8168-dkms package,
otherwise the blacklist for r8169 won't be removed.

Sarà… ma il mio Proxmox 8.2.9 con quel modulo continuava a fare il downshift, mandandomi questo bellissimo messaggio:

r8169 0000:01:00.0 enp1s0: Link is Up - 100Mbps/Full (downshifted) - flow control off

Unica soluzione quindi installare il modulo specifico, ed ecco come ho fatto.

Prima di tutto un po’ di precisazioni, si tratta di una macchina con Proxmox aggiornata alla 8.2.9 (al momento in cui scrivo l’ultimissima), quindi in caso abbiate distro differenti alcuni comandi cambiano.

La procedura “sarebbe”:

  1. aggiungo ai sorgenti apt le repository non-free e non-free-firmware;
  2. installo pve-headers e r8168-dkms con apt-install -y pve-headers r8168-dkms;
  3. per sicurezza blacklisto il modulo r8169;
  4. faccio il build ed installo il modulo con dkms build r8168/8.051.02 && dkms install r8168/8.051.02;
  5. attivo il modulo con modprobe r8168;
  6. riavvio networking con systemctl restart networking

Parlo al condizionale perché il build, con l’ultima versione del kernel, restituisce errore… eppure il modulo è all’ultima versione della repository.

Faccio una ricerca online e trovo però che l’ultima versione rilasciata del modulo (non ancora nella repository perché taggata unstable) è recentissima, di 3 settimane fa, decido quindi di installare questa. La procedura completa quindi è la seguente:

# Installo pve-headers e dkms
apt install -y pve-headers dkms

# Scarico il modulo aggiornato, lo estraggo e ne copio il contenuto in /usr/src
cd /tmp
wget https://ftp.debian.org/debian/pool/non-free/r/r8168/r8168_8.054.00.orig.tar.bz2
tar -xf r8168_8.054.00.orig.tar.bz2
rm r8168_8.054.00.orig.tar.bz2
mkdir -p /usr/src/r8168-8.054.00/
mv ./r8168_8.054.00/src/* /usr/src/r8168-8.054.00/
rm -rf r8168_8.054.00

# Creo il file dkms.conf (la versione potrebbe differire)
echo PACKAGE_NAME="r8168" > /usr/src/r8168-8.054.00/dkms.conf
echo PACKAGE_VERSION="8.054.00" >> /usr/src/r8168-8.054.00/dkms.conf
echo BUILT_MODULE_NAME[0]="$PACKAGE_NAME" >> /usr/src/r8168-8.054.00/dkms.conf
echo DEST_MODULE_LOCATION[0]="/updates/dkms" >> /usr/src/r8168-8.054.00/dkms.conf
echo AUTOINSTALL="YES" >> /usr/src/r8168-8.054.00/dkms.conf
echo REMAKE_INITRD="YES" >> /usr/src/r8168-8.054.00/dkms.conf

# Procedo a build ed installazione del modulo
dkms add -m r8168 -v 8.054.00
dkms build -m r8168 -v 8.054.00 -k $(uname -r)
dkms install -m r8168 -v 8.054.00 -k $(uname -r)

modprobe r8168
systemctl restart networking

# Eventualmente rimuovo la versione precedente del modulo
dkms remove r8168/8.051.02 --all

Per sicurezza aggiungo il modulo r8169 alla blacklist di pve, aggiungendo quindi blacklist r8169 al file /etc/modprobe.d/pve-blacklist.conf.

echo "blacklist r8169" | sudo tee -a /etc/modprobe.d/pve-blacklist.conf

Dopo aver seguito tutti i passaggi, lanciando un lspci -k dovremmo vedere:

01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 0c)
        Subsystem: Realtek Semiconductor Co., Ltd. RTL8111/8168/8211/8411 PCI Express Gigabit Ethernet Controller
        Kernel driver in use: r8169
        Kernel modules: r8168

Il driver in uso è r8169 perché ancora non abbiamo riavviato, a seguito del reboot avremo:

01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 0c)
        Subsystem: Realtek Semiconductor Co., Ltd. RTL8111/8168/8211/8411 PCI Express Gigabit Ethernet Controller
        Kernel driver in use: r8168
        Kernel modules: r8169, r8168

Con questa procedura ho installato il modulo per la scheda NIC RTL8168 aggiornato, in modo che il sistema non carichi più la versione generica r8169 ma utilizzi quella specifica per la scheda in vostro possesso.

Commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *