Attivare gigabit ethernet sulla scheda di rete
Inserito Lun,
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: yesDa 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 onLanciando 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_NetworkManager_Wait_Online
Io ho NetworkManager ma network-online.target ha funzionato bene...

Commenti
Non ci sono ancora commenti.
Lascia un commento
Il tuo indirizzo email non sarà pubblicato. I commenti vengono pubblicati dopo la moderazione.