Categoria: PC

  • La maledetta RTL8168 e Linux

    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.

  • NVME su RaspberryPi 5, ma non ho l’adattatore 🤔

    Pronto per approfondire la mia esperienza con questo nuovo RasPi ho acquistato l’hat per l’installazione di un NVME. Come ho già spiegato, non consiglio di adottare un hat con più di uno slot M.2, in quanto la lane al massimo regge un NVME a velocità quasi massima, adottarne due non farebbe altro che dimezzarne le prestazioni. Mi sono però subito imbattuto in un problema, come installare il sistema operativo sull’NVME dato che non ho a disposizione un adattatore da NVME a USB3.0? ho dovuto quindi escogitare una soluzione alternativa.

    Sul RaspberryPi 5 avevo già in funzione una versione di Raspbian su SD, ho installato quindi una nuova immagine di Raspbian con il metodo classico su una seconda scheda SD, di qualsiasi dimensione, non importa… anzi deve essere di capacità inferiore a quella dell’NVME. Poi ho installato l’hat con l’NVME ed ho verificato che il sistema lo leggesse. A questo punto ho collegato, tramite un lettore usb, l’SD con l’immagine del sistema operativo e con il comando dd ne ho trasferito il contenuto sull’NVME:

    dd if=/dev/sdb of=/dev/nvme0n1 status=progress

    Nel comando dd il parametro if identifica l’input disk (sorgente), il parametro of identifica l’output disk (destinazione) mentre l’opzione status=progress mostra la barra di avanzamento. Ovviamente i percorsi possono cambiare, potete verificarli con il comando lsblk.

    Terminata la copia, l’NVME sarà pronto per effettuare il boot. Se avete effettuato gli stessi passaggi svolti da me non occorrerà effettuare alcun ridimensionamento dell’unità nel caso la dimensione dell’NVME fosse superiore a quella della SD in quanto il Raspberry Pi in fase di attivazione effettua già di predefinito l’estensione dell’unità.

    A questo punto ho impostato l’unità NVME come predefinita, tenendo comunque conto del fatto che rimuovendo l’SD, il boot avverrà comunque dall’NVME. Ho effettuato l’operazione molto semplicemente con il comando raspi-config, che serve anche ad impostare il PCIe a Gen 3.0, utile a ridurre al minimo il collo di bottiglia bus – NVME. Dopo aver lanciato il comando, quindi, ho selezionato il menu “6. Advanced Options” e poi “A4. Boot Order” per andare ad impostare l’NVME come primo device al boot. Poi ho selezionato “A8. PCIe Speed” ed ho risposto “Sì” alla domanda “Would you like PCIe Gen 3 to be enabled?”.

    Fatto questo ho riavviato il Raspberry Pi 5 per iniziare l’installazione del sistema operativo su NVME.

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