Raspberry Pi Zero et USB-net (1)

Publié par cpb
Fév 05 2017

Pi Zero et USB-netLe petit Raspberry Pi Zero est un nano-ordinateur bien sympathique. Il dispose des capacités équivalentes au Raspberry Pi modèle 1 B+, pour un encombrement à peine supérieur à celui d’un ticket de métro.

Victime de son succès le Pi Zero s’écoule au compte-gouttes, mais il devient possible d’en obtenir un assez facilement pour 4$ (plus environ 4$ de port !).

Il existe de nombreux tutoriels de prise en main, à commencer par ceux – excellents – d’Adafruit. L’article ci-dessous permet une prise de contrôle uniquement par l’interface USB-net, sans souder de connecteur série, sans brancher de clavier (ce qui nécessiterait un adaptateur USB-A femelle micro USB-B mâle) ni même d’écran (ce qui nécessiterait un adaptateur HDMI femelle micro-HDMI mâle). Nous allons utiliser le Raspberry Pi Zero nu, et un simple câble USB micro-USB comme on en emploie pour connecter un téléphone portable et un PC.

Préparation de la carte micro-SD

Récupérons une version récente de la distribution Raspbian.

$ wget https://downloads.raspberrypi.org/raspbian/images/raspbian-2017-01-10/2017-01-11-raspbian-jessie.zip
$ unzip 2017-01-11-raspbian-jessie.zip
$ ls -l 2017-01-11-raspbian-jessie.img
-rw-r--r-- 1 cpb cpb 4371513344 janv. 10 17:59 2017-01-11-raspbian-jessie.img

Insérons une carte SD de capacité suffisante (au moins 8Go) dans le PC. Sur mon PC elle est reconnue comme un périphérique bloc /dev/sdc1 et automatiquement montée.

$ umount /media/${USER}/*
$ sudo dd if=2017-01-11-raspbian-jessie.img of=/dev/sdc bs=1M

Une fois la copie terminée, j’extraie la carte et la réinsère dans le PC. Elle est alors automatiquement montée sur /media/$USER/boot et /media/$USER/<numéro de partition>.

Nous ajoutons une ligne à la fin du fichier

/media/$USER/boot/config.txt:
[...]
dtoverlay=dwc2

Et nous insérons une option modules-load sur la ligne d’arguments du kernel. Attention, à ne pas insérer de retour-chariot, le fichier doit contenir une unique ligne.

/media/$USER/boot/cmdline.txt:
modules-load=dwc2,g_ether dwc_otg.lpm_enable=0 console=[...]

Avec cette configuration, le Pi Zero présentera une interface USB-net, un réseau IP point-à-point avec le PC auquel il sera connecté. Pour initialiser l’adresse IP de cette interface, ajoutons le paragraphe suivant dans le fichier de configuration du réseau.

/media/$USER/<numero de partition>/etc/network/interfaces:
[...]
allow-hotplug usb0
iface usb0 inet static
    address 192.168.7.2
    netmask 255.255.255.0
    network 192.168.7.0
    broadcast 192.168.7.255
    gateway 192.168.7.1
    dns-nameservers 80.67.169.12  # French Data Network DNS.

Le sous-réseau point-à-point sera donc en 192.168.7.x. Le Pi Zero prendra l’adresse 192.168.7.2. On suppose que le PC prendra l’adresse 192.168.7.1 et servira de passerelle vers Internet.

J’ai utilisé ici l’adresse IP d’un DNS ouvert de l’association FDN. Vous pouvez bien entendu utiliser tout autre résolveur.

 

Une dernière modification va nous permettre d’activer automatiquement le démon SSH afin de pouvoir se connecter facilement au Pi Zero.
Nous ajoutons deux lignes avant la commande exit 0 dans le fichier rc.d.

/media/$USER/<numero de partition>/etc/rc.d:
[...]

update-rc.d  ssh  enable
invoke-rc.d  ssh  start

exit 0

Nous pouvons démonter, extraire la carte micro-SD, l’insérer dans le Raspberry Pi Zero, et brancher ce dernier au PC en employant sa prise “USB” (et non pas “PWR IN”).

$ umount /media/$USER/*

Pi Zero et USB-net

Boot du Raspberry Pi Zero

Avant de brancher le Pi Zero, nous examinons la liste des interfaces réseau proposées par le PC.

$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
    link/ether b0:48:7a:83:3f:86 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:1d:09:23:b5:8e brd ff:ff:ff:ff:ff:ff
[...]

Le premier boot est un peu plus long que les suivants (environ une minute) car il étend automatiquement la taille du système de fichiers pour utiliser toute la carte SD. Avec une ligne comme “watch -n 1 ip link show” sur votre PC, vous verrez apparaître l’interface USB-net.

$ watch -n 1 ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
    link/ether b0:48:7a:83:3f:86 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:1d:09:23:b5:8e brd ff:ff:ff:ff:ff:ff
[...]
9: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 8a:f4:12:06:cd:84 brd ff:ff:ff:ff:ff:ff

Si votre PC présente directement les noms d’interface réseau du kernel, vous verrez apparaître l’interface usb0. Si votre système affiche les noms “prédictibles” de systemd, vous verrez une interface du type enp0s29u1u3 dont les numéros dépendront du port USB sur lequel vous branchez votre Pi Zero.

Pour pouvoir communiquer avec le Raspberry Pi, nous devrons commencer par forcer une adresse IP côté PC. Pour cela nous pouvons utiliser le Network Manager :

Boîte "Connexion réseau"
Cliquez sur “Ajouter”.

Boîte "Sélectionnner un type de connexion"Cliquez sur “Créer”.

Boîte "Modification de Connexion Ethernet 1"Sélectionnez votre interface et passez à l’onglet “Paramètres IPv4”.

Saisissez les adresses réseau, et cliquez sur “Routes”.

Boîte "Modification des routes IPv4 pour Wired Connection 1"Cochez la case “Utiliser cette connexion uniquement pour les ressources de son réseau”, puis cliquez sur “Ok”.

Vous pouvez maintenant tenter un “ping” vers le Raspberry Pi Zero :

$ ping 192.168.7.2
PING 192.168.7.2 (192.168.7.2) 56(84) bytes of data.
64 bytes from 192.168.7.2: icmp_seq=1 ttl=64 time=0.445 ms
64 bytes from 192.168.7.2: icmp_seq=2 ttl=64 time=0.293 ms
64 bytes from 192.168.7.2: icmp_seq=3 ttl=64 time=0.380 ms
^C
--- 192.168.7.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.293/0.372/0.445/0.066 ms

Et à présent, nous allons nous connecter en utilisant SSH sur le Raspberry Pi Zero.

$ ssh pi@192.168.7.2
The authenticity of host '192.168.7.2 (192.168.7.2)' can't be established.
ECDSA key fingerprint is SHA256:Ua2GcT+NJsw4VRdqHEs95IrGCWkwhI+SFFB+yfT4TMU.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.7.2' (ECDSA) to the list of known hosts.
pi@192.168.7.2's password: raspberry

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Nov 25 23:28:21 2016

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.4.34+ #930 Wed Nov 23 15:12:30 GMT 2016 armv6l GNU/Linux
pi@raspberrypi:~ $ lscpu
Architecture:          armv6l
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             1
Model name:            ARMv6-compatible processor rev 7 (v6l)
CPU max MHz:           1000.0000
CPU min MHz:           700.0000

L’initialisation de la connexion par SSH est un peu longue, nous résoudrons cela ultérieurement.

Conclusion

Nous avons réussi à nous connecter sur le Raspberry Pi Zero depuis un PC sous Linux (l’équivalent depuis Windows serait tout à fait possible en utilisant PuTTY) sans autre accessoire qu’un câble USB de téléphone.

Pour le moment notre Pi Zero est un peu coupé du monde, car il ne dispose pas d’accès Internet. Nous allons configurer ceci dans le prochain article

Suivant :

Précédent :

4 Réponses

  1. Stéphane Peters dit :

    Bonjour, chouette article, merci!
    Pour le ssh qui traîne, c’est probablement dû à l’impossibilité de résolution DNS.
    Solution: ajouter manuellement l’adresse IP dans le fichier hosts.

    /media/$USER//etc/hosts:
    […]

    192.168.7.1 monpc

    Bonne continuation.

  2. Fabrice Mousset dit :

    Bonjour,

    encore un superbe article, dommage que je n’ai pas de RPI-Zero pour jouer avec…

    Pour les “lenteurs” de connexion ssh, je pense qu’il suffit de désactiver la résolution dns inverse du serveur ssh.
    Dans /etc/ssh/ssh_config, il suffit d’ajouter:
    UseDNS no

URL de trackback pour cette page