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