USB Gadget - ethernet à travers USB
classé dans Blog, Asrall, Linux
Cet article est aussi présent dans mes pages de documentation.
https://docs.nah.re/raspberry_pi/usb-otg-g-ether.html
Avant-propos
Ceci est un petit tutoriel en français, sur l'intégration de g_ether sur un Raspberry PI Zero.
Un minimum de connaissances de GNU/Linux et de la ligne de commande est nécessaire.
Installation de Raspbian
Premier détail : je n'ai pas copié une raspbian lite ou full sur la microSD, parce qu'on n'a pas du tout la même définition de léger.
Du coup, je suis parti sur raspberrypi-ua-netinst https://github.com/FooDeas/raspberrypi-ua-netinst
L'avantage d'une installation en unattended + netinst, c'est que l'on définit les paramètres dans un fichier de configuration, on branche un câble réseau (via un adaptateur micro USB OTG + une carte ethernet USB), on démarre et on laisse tourner.
Une fois l'installation terminée, je me suis connecté sur le Raspberry PI via SSH (toujours via le réseau).
Intégration de g_ether
Maintenant, on peut s'attaquer à l'intégration du gadget USB Ethernet (g_ether).
Se connecter avec le compte root (peu importe la méthode on va modifier des fichiers et installer des trucs)
Ouvrir /boot/config.txt. Ajouter à la fin du fichier, après [all]
#USB G_Ethernet dtoverlay=dwc2
Si vous lisez des vidéos avec omxplayer et que celui-ci râle avec le message
COMXAudio::Decode timeout
Ajoutez dans le même fichier (/boot/config.txt)
gpu_mem=128
Enregistrer et fermer.
Ouvrir /boot/cmdline.txt
ajoutez à la fin de la commande.
modules-load=dwc2,g_ether
N'insérez surtout pas de saut de ligne.
La commande pourrait ressembler à ça :
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty3 elevator=deadline fsck.repair=yes root=/dev/mmcblk0p2 rootfstype=ext4 rootwait modules-load=dwc2,g_ether quiet logo.nologo loglevel=3 vt.global_cursor_default=0
Ici, j'ai configuré pour que tout soit silencieux, avec aucun message sur la sortie vidéo. Ne copiez pas bêtement la commande sans savoir à quoi correspond quiet ou vt.global_cursor_default=0. Ce n'est pas le but de ce tuto rapide, je ne détaillerai pas à quoi ça correspond.
Enregistrer et fermer le fichier.
Configuration du réseau
Pour éviter de se prendre la tête avec l'attribution de l'adresse IP une fois la carte branchée sur un PC (ou MAC) en USB, j'installe un serveur DHCP qui fera cette tâche automatiquement.
Installer le paquet isc-dhcp-server
apt install isc-dhcp-server
Activer le service (activer, ne pas démarrer tout de suite) avec systemd
systemctl enable isc-dhcp-server
On configurera le serveur DHCP juste après. On va d'abord configurer le réseau pour g_ether.
Ouvrir le fichier /etc/network/interfaces. Y ajouter :
# Ethernet over USB allow-hotplug usb0 iface usb0 inet static address 10.10.10.10 netmask 255.255.255.0 broadcast 10.10.10.255 gateway 10.10.10.10
Ici, j'ajoute une interface usb0, qui a une adresse IP 10.10.10.10. Cette IPv4 étant dans les plages réservées pour un usage privé, cela ne posera pas de problème ni de conflit. usb0 sera créé lorsque le raspberry pi sera branché en USB.
Enregistrer et fermer.
Ouvrir maintenant /etc/dhcp/dhcpcd.conf
Supprimer tout le contenu et insérer :
default-lease-time 600; max-lease-time 7200; ddns-update-style none; authoritative; log-facility local7; subnet 10.10.10.0 netmask 255.255.255.0 { range 10.10.10.11 10.10.10.20; option routers 10.10.10.10; option broadcast-address 10.10.10.255; default-lease-time 600; max-lease-time 7200; option domain-name "local"; }
Les cinq premières lignes sont pour le paramétrage du serveur dhcp, les huit lignes en bas correspondent à la configuration du réseau.
Je définis le réseau comme étant sur 10.10.10.0, s'étendant jusqu'à 10.10.10.255 via le masque réseau.
Je définis ensuite la plage allant de 10.10.10.11 à 10.10.10.20 (ce qui me sera suffisant).
J'indique que le routage se fera sur 10.10.10.10, qui correspond à l'adresse du Raspberry PI (que j'ai défini dans /etc/network/interfaces).
Le reste n'est pas vraiment important (durée des sessions dhcp, nom de domaine local).
Enregistrer et fermer.
Ouvrir maintenant /etc/default/isc-dhcp-server
Décommenter les lignes
DHCPDv4_CONF=/etc/dhcp/dhcpd.conf DHCPDv4_PID=/var/run/dhcpd.pid
Ajouter usb0 dans INTERFACESv4, comme ceci :
INTERFACESv4="usb0"
Enregistrer et fermer.
Tests
Éteindre le Raspberry PI
sudo poweroff
Tout débrancher, puis brancher un câble micro USB (data, pas charge seule) sur le port "USB" du Raspberry (pas sur "pwr IN"), brancher l'autre côté du câble USB sur un PC.
Après quelques dizaines de secondes, une interface réseau devrait apparaître (sous Windows, il y ait de fortes chances que le pilote rdnis ne s'installe pas automatiquement, il faudra l'installer manuellement via ajouter un pilote, choisir le pilote, type carte réseau, fabricant Microsoft, sélectionner rdnis ou un truc s'en approchant, répondre oui à l'avertissement comme quoi le pilote n'est peut être pas compatible).
Vérifiez si le Raspberry PI est bien reconnu comme une carte réseau.
Sous Windows
ipconfig /all
Sous Mac OS X et autres BSD
ifconfig
Sous GNU/Linux
ip a
Normalement, quelques lignes indiquant
inet 10.10.10.17/24 brd 10.10.10.255 scope global dynamic noprefixroute enp0s19f2u1
ou
inet 10.10.10.17 netmask 255.255.255.0 broadcast 10.10.10.255
ou un truc indiquant qu'il y a une IP commençant par 10.10.10 devrait s'afficher.
Si c'est le cas, taper
ping 10.10.10.10
S'il y a une réponse, cela signifie que cela fonctionne.
PING 10.10.10.10 (10.10.10.10) 56(84) bytes of data. 64 bytes from 10.10.10.10: icmp_seq=1 ttl=64 time=0.504 ms 64 bytes from 10.10.10.10: icmp_seq=2 ttl=64 time=0.543 ms 64 bytes from 10.10.10.10: icmp_seq=3 ttl=64 time=0.539 ms 64 bytes from 10.10.10.10: icmp_seq=4 ttl=64 time=0.542 ms ^C --- 10.10.10.10 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 111ms rtt min/avg/max/mdev = 0.504/0.532/0.543/0.016 ms
Il n'y a plus qu'à se connecter dessus.
ssh pi@10.10.10.10
Si vous avez pu vous connecter via ssh à travers la connection USB, félicitations.
Conclusion
Ce n'est pas très compliqué à mettre en place, le problème étant de réunir les différentes informations éparpillées un peu partout sur le net, et souvent en anglais (ce qui ne me pose pas de problème, mais ce n'est pas le cas de tout le monde).
Remerciements
Un gros merci à Albert, pour m'avoir prêté son Raspberry PI Zero.