Attivare gigabit ethernet sulla scheda di rete

Tags: 

Poco tempo fa ho scoperto che uno dei pc che ho a casa non attivava la gigabit ethernet: avevo appena montato un nuovo switch di rete, e c'era qualcosa che decisamente non andava con le velocità. Per verificare la cosa ho usato il comando ethtool, seguito dal nome dell'interfaccia da controllare (per capire il nome dell'interfaccia ci sono vari metodi, io uso ifconfig). Questo il risultato:

> sudo ethtool enp3s0
 
       Supported ports: [ TP MII ] 
       Supported link modes:   10baseT/Half 10baseT/Full  
                               100baseT/Half 100baseT/Full  
                               1000baseT/Half 1000baseT/Full  
       Supported pause frame use: Symmetric Receive-only 
       Supports auto-negotiation: Yes 
       Supported FEC modes: Not reported 
       Advertised link modes:  10baseT/Half 10baseT/Full  
                               100baseT/Half 100baseT/Full  
                               1000baseT/Half 1000baseT/Full  
       Advertised pause frame use: Symmetric Receive-only 
       Advertised auto-negotiation: No 
       Advertised FEC modes: Not reported 
       Speed: 100Mb/s 
       Duplex: Half 
       Port: MII 
       PHYAD: 0 
       Transceiver: internal 
       Auto-negotiation: off 
       Supports Wake-on: pumbg 
       Wake-on: g 
       Current message level: 0x00000033 (51) 
                              drv probe ifdown ifup 
       Link detected: yes

Da notare i campi speed, duplex e auto-negotiation, che certificano che la scheda è impostata per andare a 100Mb/s half duplex, nonostante supporti la gigabit ethernet.

Modificare l'impostazione è molto semplice, basta usare il comando:

sudo ethtool -s enp3s0 speed 1000 duplex full autoneg on

Lanciando nuovamente il comando sopra potrete verificare che ora la scheda è impostata come gigabit, e testando un traferimento vedrete che andrà molto meglio.

 

Il problema è che questo comando sarà attivo solo da ora al prossimo riavvio della macchina.

Come fare per eseguirlo all'avvio della macchina, ma solo quando l'interfaccia di rete è pronta per accettare comandi? (Perchè se fatto troppo presto nel boot non funzionerà).

Guardando questa guida di arch linux che illustra una situazione simile (attivare il wake-on-lan sulla scheda di rete, cosa che si fa sempre con ethtool) sembrano esserci molteplici modi per risolvere il problema:

https://wiki.archlinux.org/index.php/Wake-on-LAN#Make_it_persistent

 

In realtà, almeno nella mi esperienza, la cosa è stata più complicata del previsto. Il metodo che mi sembrava più corretto, ovvero aggiungere un regola udev, non funzionava (non so perchè, non ho avuto molto tempo per analizzare la cosa). Anche l'aggiunta via crontab, metodo piuttosto brutale, non funziona (e questo ci sta).

Allora sono andato via systemd, ma anche qui lo script di quella guida non funziona. In questo caso ho analizzato meglio la cosa: nei log si nota che, nonostante la riga "Requires=network.target", al momento dell'esecuzione dello script la rete non è ancora pronta per accettare comandi.

Facendo altre ricerche ho trovato l'inghippo: non bisogna agganciarsi a network.target, ma a network-online.target !

Qui spiega meglio perchè: https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

 

In pratica, questo è il file di servizio systemd, creato in /etc/systemd/system/net-ethtool-1000m@.service (notare la @ finale, che permette di fare un file parametrizzato).

[Unit]
Description=Enable gigabit ethernet for %i
Wants=network-online.target
After=network-online.target
 
[Service]
ExecStart=/usr/bin/ethtool -s %i speed 1000 duplex full autoneg on
Type=oneshot
 
[Install]
WantedBy=multi-user.target

 

A questo punto ho abilitato il servizio per la mia interfaccia specifica e l'ho eseguito:

sudo systemctl enable net-ethtool-1000m@enp3s0
sudo systemctl start net-ethtool-1000m@enp3s0

 

Risultato ottenuto!

 

P.S. Alcune guide indicano che se avete NetworkManager per la gestione di rete invece di network-online.target dovete usare NetworkManager-wait-online.service

Vedi: https://wiki.archlinux.org/index.php/NetworkManager#Enable_NetworkManage...

Io ho NetworkManager ma network-online.target ha funzionato bene...

Aggiungi un commento