Categoria: PC

  • 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.

  • Il mouse risveglia Windows e non va in sospensione

    Sembra strano ma a volte ci abituiamo a delle routine e dopo tempo ci sembra anche normale svolgere determinate operazioni. In particolare, quando stacco dal PC sono abituato a metterlo in sospensione ma costantemente il mouse lo risveglia, è praticamente impossibile mettere in sospensione Windows perché quando si clicca sul pulsante per attivare la sospensione Windows già recepisce il comando di wake up dal mouse quindi il sistema va in sospensione per un solo secondo per poi riattivarsi. Cosa ho fatto fino a ieri? posizionavo il mouse su “Sospendi”, spegnevo il mouse ed attivavo la sospensione con invio… ma appunto fino a ieri, perché mi sono finalmente chiesto “perché tutto ciò?”.

    La soluzione ovviamente è semplice: disattivare il risveglio con il mouse. In questo modo rimane attivo solo quello con la tastiera, oltre che con il pulsante di accensione, ma dove si trova questa opzione? è un po’ nascosta su Windows 11, bisogna cercare “Impostazioni del mouse”, poi “impostazioni aggiuntive per il mouse”, “Hardware” e poi “Proprietà”. Poi “Generali”, “Impostazioni” ed infine “Risparmio energia”. Qui, alla fine, dopo tanti giri, troveremo l’opzione “Consenti al dispositivo di riattivare il computer”, che va ovviamente disattivata.

    Da ieri non ho più la mia routine 😛