Articles tagués “linux

Raspberry Pi, WiFi, ssh et ligne de commande

J’ai rebranché mon vieux Raspberry Pi pour les besoins de geekeries personnelles. J’ai vu qu’il existait une version Lite de Raspbian et j’ai choisi de l’utiliser car mon Raspberry Pi n’est pas de première jeunesse et ma carte SD ne fait que 4 Go. J’ai eu une petite surprise en démarrant le système : il n’y a pas de serveur X. Il faut donc tout faire en ligne de commande. Challenged accepted!

Démarrer le Raspberry Pi

Raspbian Lite est téléchargeable sur le site de la fondation Raspberry. La version actuelle est Jessie. Je me suis aidé de deux articles que j’avais écrit il y a déjà longtemps pour créer ma carte SD avec l’image du système. J’ai branché mon clavier, ma télé, l’alimentation et j’ai obtenu prompt.

Changer le layout du clavier

Parce que qu’un système qwerty quand on a un clavier azerty c’est pas sympa, surtout si on a besoin d’utiliser des symboles, j’ai commencé par passer en azerty. Internet vous propose plusieurs techniques, j’ai utilisée celle-ci :

sudo dpkg-reconfigure keyboard-configuration

La configuration est intuitive avec une interface type ncurse. Quand c’est terminé, il suffit de redémarrer avec la commande reboot.

Configuration du WiFi

Aucune difficulté à ce que Raspbian reconnaisse mon dongle WiFi. Je l’ai branché et il est directement apparu comme wlan0 quand j’ai appelé la commande ifconfig. La partie un peu moins fun est la configuration du réseau WiFi (SSID + passphrase). La fondation Raspberry propose un tutoriel pour cela. Je crois avoir eu besoin de redémarrer à nouveau pour que ça fonctionne (en plus de la procédure expliquée dans le lien).

Configuration IP manuelle

En général, le serveur DHCP de votre box assignera toujours la même IP à votre Raspberry Pi. Il est quand même plus prudent de lui affecter une adresse IP fixe pour le retrouver facilement. Idéalement, il faudrait aussi demander à votre box de ne plus attribuer cette adresse IP par DHCP…

J’ai tout d’abord regardé quelle était mon adresse actuelle, quel masque de sous-réseau était utilisé et quelle était l’adresse de la gateway :

$ ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr 74:da:38:5d:fc:6b  
          inet addr:192.168.1.17  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: 2a01:cb05:8980:9400:944d:6692:7db0:9552/64 Scope:Global
          inet6 addr: fe80::9d35:79ba:e404:4253/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:14436 errors:0 dropped:400 overruns:0 frame:0
          TX packets:4818 errors:0 dropped:1 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:17129734 (16.3 MiB)  TX bytes:701974 (685.5 KiB)
$ ip route
default via 192.168.1.1 dev wlan0  metric 303 
192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.17  metric 303

J’ai ensuite modifié le fichier /etc/network/interfaces de manière adaptée :

cat /etc/network/interfaces
[...]

allow-hotplug wlan0
iface wlan0 inet static
    address 192.168.1.17
    netmask 255.255.255.0
    gateway 192.168.1.1
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

[...]

Activation de ssh

La dernière étape pour que mon système puisse être headless était d’activer le serveur SSH et ainsi pouvoir me connecter depuis mon ordinateur de bureau. La fondation Raspberry explique comment faire ceci dans ce tutoriel. Avec Raspbian Lite, il suffit de créer un fichier ayant pour nom ssh, à la racine de la carte SD. J’ai donc éteint mon Raspberry Pi et j’ai inséré ma carte mémoire dans mon Mac et j’ai utilisé le terminal :

$ cd /Volumes/boot/
$ touch ssh

Une fois le Raspberry Pi redémarré, vous pouvez regarder si le serveur SSH est démarré avec la commande suivante :

ps -eaf | grep ssh

Si vous un brin plus optimiste, vous pouvez essayé directement depuis votre PC :

$ ping 192.168.1.17
PING 192.168.1.17 (192.168.1.17): 56 data bytes
64 bytes from 192.168.1.17: icmp_seq=0 ttl=64 time=18.548 ms
64 bytes from 192.168.1.17: icmp_seq=1 ttl=64 time=6.127 ms
^C
--- 192.168.1.17 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 6.127/12.337/18.548/6.211 ms
imac-de-pierre:/ pierregradot$ ssh pi@192.168.1.17
The authenticity of host '192.168.1.17 (192.168.1.17)' can't be established.
ECDSA key fingerprint is SHA256:xv5CB0epvX+e8sKhgLFp2bP+1jzU8j7PzGAVAnZs8q4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.17' (ECDSA) to the list of known hosts.
pi@192.168.1.17's password: 

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: Mon Apr  3 16:22:55 2017
pi@raspberrypi:~ $ echo "Hell yeah!"
Hell yeah!
pi@raspberrypi:~ $ 

Et voilà ! J’ai débranché le Raspberry Pi de la télé, j’ai rangé mon clavier, et c’était bon !

PS : en fait, si vous avez un câble Ethernet, vous pouvez vous passer d’un clavier et d’une télé. Voici comment faire : Headless Raspberry Pi Setup.

 

 

Publicités

XBee et XCTU sous Linux

Cela doit bien faire 2 ans que deux modules XBee (des Pro S1 de chez Digi) traînent dans mes tiroirs et je n’en avais rien fait. Ayant pour projet de faire des capteurs de température et d’humidité sans fil, je me suis dit que c’était le bon moment de les utiliser. L’idée est d’envoyer les données à un Raspberry Pi pour traitement. J’ai donc pris mon XBee Explrer Dongle, j’y ai connecté un module Xbee et je l’ai branché à mon PC. Digi fournit un logiciel pour gérer les modules XBee connectés à un PC, les configurer, envoyer et recevoir des données : il s’agit de XCTU. De nombreux tutoriels sur Internet disent que XCTU n’est disponible que sous Windows mais cette époque est révolue ! Vous pouvez télécharger les différentes versions pour Windows, Linux et Mac ici.

Installation et lancement

Si vous êtes sous Linux et que vous ne savez pas si vous devez opter pour la version 32 ou la version 64 bits, il vous suffit de taper la commande uname -a pour savoir si vous avez un processeur 32 ou 64 bits. Exemple dans mon cas :

~$ uname -a
Linux pgradot-xubuntu 4.4.0-53-generic #74-Ubuntu SMP 
Fri Dec 2 15:58:04 UTC 2016 i686 i686 i686 GNU/Linux

Le i686 m’indique que mon processeur est 32 bits.

Une fois le téléchargement terminé, rendez le fichier exécutable et lancez-le avec les droits administrateurs :

$ chmod u+x 40002880_G.run
$ sudo ./40002880_G.run

Un wizard vous guide dans l’installation de XCTU. Par défaut, le logiciel s’installe dans /opt/Digi où un sous-dossier XCTU-NG est créé. On y trouve launcher et app (le premier lançant le second). Si vous lancez l’un des deux sans les droits administrateurs, cela ne fera qu’ouvrir une petite fenêtre qui ne contient rien et que vous ne pourrez pas fermer… Ayez le réflexe sudo, ça marchera beaucoup mieux ! Vous verrez alors ceci :

xbee 1 startup

Ajout de modules

Vous pouvez ajouter des modules radios ou les découvrir en cliquant que les icônes en haut à gauche. L’ info-bulle vous avait sans doute déjà fait deviner le mode opératoire. Le mien étant branché via un dongle USB, il apparaît comme étant /dev/ttyUSB0 :

xbee 2 add device

XCTU récupère et affiche tout la configuration du nouveau module :

xbee 3 device added

Onglets configuration, console et réseau

XCTU est intuitif et l’info-bulle de droite nous dit qu’il existe 3 onglets, chacun correspondant à un mode :

  1. Le mode configuration, ouvert par défaut, permet de voir la configuration des modules comme montré précédemment mais aussi de la modifier et d’envoyer la nouvelle configuration au module.
  2. Le monde console permet soit d’interagir via des commandes AT avec un module, soit d’envoyer des paquets sur le réseau. Vous pouvez enregistrer des paquets et jouer des séquences d’envoi. Certainement très pratique pour des tests.
  3. Le mode réseau, pour avoir un aperçu de la topologie du réseau sans fil à portée.

Commandes AT

Si vous souhaitez envoyez des commandes AT à votre module, il suffit d’aller dans l’onglet console et d’appuyer sur le bouton Open (qui se transforme en bouton Close, visible en vert dans l’image ci-dessous). Vous tapez alors +++ dans à gauche, vous attendez une seconde et le module répond OK pour indiquer qu’il est bien passé en mode commande. Tapez alors vos commandes en les terminant par entrée et le module vous répondra. Sans activité de votre part pendant 3 secondes, le module sort automatiquement et silencieusement du mode commande et l’envoi d’une nouvelle commande sera alors sans réponse. Sparkun a écrit un très bon aide-mémoire pour les commandes AT disponibles.

xbee 4 at

Pour aller plus loin

Exploring XBees and XCTU par Sparkun


update-alternatives

Hier, j’ai voulu installé Eclipse sous Xubuntu avec le nouvel installateur Oomph. Au lancement de l’installateur, j’ai eu un message d’erreur car je ne disposais que de Java 7 et que l’installateur avait besoin de Java 8. Je me suis alors dit qu’il était temps de mettre en oeuvre la technique des update-alternatives dont m’avait parlé mon administrateur système préféré.

État des lieux de Java

Tout d’abord, commençons par regarder ce vers quoi pointe la commande java :

$ ls -la $(which java)
 lrwxrwxrwx 1 root root 22 sept. 20 19:05 /usr/bin/java -> /etc/alternatives/java

Le principe d’update-alternatives est de ne pas faire de lien direct vers la vraie implémentation mais un lien vers une alternative, qui est dans /etc/alternatives qui pointe à son tour vers le programme réellement chargé de la commande. Regardons les alternatives connues du système des alternatives pour java :

$ update-alternatives --list java
/usr/lib/jvm/java-7-openjdk-i386/jre/bin/java

Il n’y a pour l’instant qu’un seul programme connu pour la commande java et c’est sans surprise un Java 7.

Installation d’une nouvelle alternative pour Java

Personnellement, j’ai choisi d’utiliser le JDK 8 d’Oracle et j’ai récupéré la dernière version disponible sur le site officiel. J’ai décompressé l’archive tar.gz dans /usr/local :

$ ls
bin/ etc/ games/ include/ jdk1.8.0_60/ lib/ man@ sbin/ share/ src/

Pour installer une nouvelle alternative, il faut utiliser une ligne de commande de la forme suivante :

update-alternatives --install <link> <name> <path> <priority>

<link> est l’endroit où placer le lien qui pointera vers /etc/alternatives, <name> est la commande pour laquelle on installe une alternative et <path> est le chemin vers le programme concret. <priority> sert pour les groupes de liens et quand le mode automatique est utilisé. Plus la priorité est élevée, plus l’alternative aura une priorité forte. Pour installer une nouvelle alternative vers mon JDK 8, j’ai utilisé la commande suivante :

$ sudo update-alternatives --install /usr/bin/java java
    /usr/local/jdk1.8.0_60/bin/java 3000
update-alternatives: using /usr/local/jdk1.8.0_60/bin/java 
    to provide /usr/bin/java (java) in auto mode

C’est maintenant Java 8 qui est utilisé par défaut car la nouvelle alternative a une priorité plus forte que l’alternative déjà disponible :

$ which java
/usr/bin/java
pgradot@pgradot-xubuntu:~$ java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) Client VM (build 25.60-b23, mixed mode)

A titre d’exemple, voici ce qui se passe pour une installation avec une priorité à 1000 au lieu de 3000 :

$ sudo update-alternatives --install /usr/bin/java java
    /usr/local/jdk1.8.0_60/bin/java 1000
pgradot@pgradot-xubuntu:~/Documents/git/PyTweet$ java -version
java version "1.7.0_79"
OpenJDK Runtime Environment (IcedTea 2.5.6) (7u79-2.5.6-0ubuntu1.14.04.1)
OpenJDK Client VM (build 24.79-b02, mixed mode, sharing)

Changer d’alternative

Il est simple de passer d’une alternative à une autre et il est donc pratique de garder plusieurs versions installées sur le système et de changer la cible concrète de la commande au besoin. Cela est utile quand un projet particulier réclame une version différente que la version utilisée généralement, que ce soit Java ou autre.

On commence par lister les alternatives pour la commande souhaitée :

$ sudo update-alternatives --list java
[sudo] password for pgradot:
/usr/lib/jvm/java-7-openjdk-i386/jre/bin/java
/usr/local/jdk1.8.0_60/bin/java

Il suffit ensuite d’utiliser la commande --set :

$ sudo update-alternatives --set java
    /usr/lib/jvm/java-7-openjdk-i386/jre/bin/java
update-alternatives: using /usr/lib/jvm/java-7-openjdk-i386/jre/bin/java
    to provide /usr/bin/java (java) in manual mode
$ java -version
java version "1.7.0_79"
OpenJDK Runtime Environment (IcedTea 2.5.6) (7u79-2.5.6-0ubuntu1.14.04.1)
OpenJDK Client VM (build 24.79-b02, mixed mode, sharing)

Il est pratique de lister les alternatives avant d’utiliser --set pour pouvoir copier-coller le chemin souhaité. Il n’est pas possible d’utiliser un programme qui n’a pas encore été ajouté comme alternative :

$ sudo update-alternatives --set java /usr/local/jdk1.8.0_60/bin/jav
update-alternatives: error: alternative /usr/local/jdk1.8.0_60/bin/jav
    for java not registered; not setting

L’erreur dit bien que l’alternative n’est pas connue et non que le programme n’existe pas.

Supprimer une alternative

Rien de bien compliqué pour supprimer une alternative. Si c’est l’alternative est actuellement utilisé, le gestionnaire des alternatives se rabat sur une autre alternative en se basant sur les priorités :

$ sudo update-alternatives --remove java /usr/local/jdk1.8.0_60/bin/java
update-alternatives: removing manually selected
    alternative - switching java to auto mode
update-alternatives: using /usr/lib/jvm/java-7-openjdk-i386/jre/bin/java
    to provide /usr/bin/java (java) in auto mode

C’est aussi l’un des avantages du système des alternatives. Il sera charge de mettre à jour les différents liens quand des alternatives sont modifiées.


NOOBS avec mon Raspberry Pi

Ça y est : j’ai enfin démarré mon Raspberry Pi ! Je l’avais reçu à l’automne dernier mais le nouveau travail que j’avais commencé peu après m’avait énormément occupé. De plus, développant plus au travail que je ne le faisais avant, je me sentais moins l’envie de développer à la maison.

Dois-je présenter le Raspberry Pi ? Mmmm….. Je pense que ce n’est vraiment pas nécessaire mais pour les quelques exceptions, vous pouvez lire la page dédiée sur Wikipédia.

Profitant du beau temps qui me met de bonne humeur, je me suis décidé ! Comme conseillé sur le site de la fondation, je commence avec NOOBS après l’avoir téléchargé avec succès, SHA-1 à l’appui. Je suis quelqu’un de discipliné (et aussi parce que c’est quand même super pratique pour s’assurer du bon téléchargement du fichier) donc j’ai suivi les instructions proposées. J’ai donc formaté ma carte SD et c’était long car elle était pleine, j’ai copié les fichiers sur la carte, j’ai cherché mon Raspberry Pi un petit moment, je me suis fait une très belle alimentation avec mon chargeur de téléphone Android (qui fournit 5V / 0,7A comme réclamé par la carte). Puis est venu le moment du branchement : clavier, souris, HDMI vers ma télé, câble Ethernet vers la Freebox et enfin alimentation.

Magie ! Ça démarre ! L’écran d’accueil nous propose de choisir notre langue et la distribution qu’on souhaite installé. Je choisis français parce que mince ! c’est disponible ! et Raspbian parce que c’est recommandé. On attend à nouveau pour que ça installe la distribution sur la carte. L’installation se termine avec l’apparition d’une pop-up signalant le succès de l’opération puis c’est le tour un menu de configuration façon ncurse que je passe rapidement en sélectionnant Finish. On se retrouve alors dans une console. L’utilisateur est pi et son mot de passe est raspberry . ls montre un dossier prometteur nommé python_games 🙂

Je m’aperçois que mon clavier est en anglais (ça pose d’ailleurs des soucis pour taper le mot de passe…), j’aurais dû entrer dans Internationalisation menu. On peut accéder à nouveau au menu de configuration en tapant sudo raspi-config. Je prends alors le temps de configurer un peu mieux tout ça, modifiant keymap et locale et activant le serveur ssh. La carte redémarre et on peut lancer le mode graphique avec startx. Je vous laisse sur cette magnifique capture d’écran (cliquez pour agrandir), faite avec scrot et rapatriée via ssh avec scp.

Raspberry Pi with Raspbian


Dual screen sous Ubuntu

Aujourd’hui, j’ai voulu connecté un écran externe à mon ordinateur portable. Je l’avais déjà fait sans souci sous Windows Seven ; cette fois, j’étais sous Ubuntu 11.10 (Oneiric Ocelot). J’ai innocemment branché mon second écran et constaté…. qu’il ne se passait rien. Le périple a commencé.

La première étape est de trouver l’outil des préférences système dans Unity. Dans le lanceur d’application, il s’appelle Paramètres système. On va ensuite dans Affichage et on voit qu’on peut activer le second écran qui a été branché et qui est correctement reconnu. On choisit les résolutions et la position et on fait Appliquer. Second drame avec ce message d’erreur :

message_erreur_dual_screen

La seconde étape est d’aller sur le site français d’Ubuntu pour connaître les méthodes pour gérer le multi-écran. Je choisis d’utiliser la méthode recommandée et de me servir de la commande xrandr. Cette commande me renvoie :

$ xrandr
Screen 0: minimum 320 x 200, current 1280 x 800, maximum 1280 x 1280
LVDS connected 1280x800+0+0 (normal left inverted right x axis y axis) 331mm x 207mm
1280x800       60.0*+
1280x768       60.0 +
1280x720       60.0 +
1024x768       60.0 +
1024x600       60.0 +
800x600        60.0 +
800x480        60.0 +
720x480        60.0 +
640x480        60.0 +
DFP1 disconnected (normal left inverted right x axis y axis)
CRT1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 338mm x 270mm
1280x1024      60.0 +   75.0
1280x800       60.0 +   75.0*
1280x720       60.0 +
1280x960       60.0
1152x864       75.0     60.0
1280x768       59.9
1024x768       75.0     70.1     60.0
1024x600       60.0
800x600        72.2     75.0     70.0     60.3     56.2
800x480        60.0
720x480        60.0
640x480        75.0     72.8     60.0

L’écran externe est donc CRT1. J’adapte donc les commandes données dans la documentation d’Ubuntu et entre :

$ xrandr --output CRT1 --pos 1280x0 --mode 1024x768
xrandr: screen cannot be larger than 1280x1280 (desired size 2304x800)

Pas de chance, j’ai le même message d’erreur qu’avec l’outil graphique… Effectivement, la somme des dimensions de mes écrans dépassent le maximum autorisé. Je pourrais réduire la résolution de mon écran principal et mettre une résolution faible à mon écran externe. Cette solution s’exclue d’elle-même dès son énoncé : je ne vais quand même pas travailler avec des résolutions minables juste pour avoir deux écrans. Je recherche ce message d’erreur dans Google et trouve une aide précieuse dans cette page. Il y est expliqué le concept d’écran virtuel dans lequel les deux écrans physiques doivent rentrés. Par défaut, sa limite semble être 1600×1600 (c’était mon cas avant que je ne bricole ; la limite de 1280×1280 est apparue quand j’ai fait marche arrière pour l’écriture de l’article), à moins que ça ne soit une limitation des pilotes de ma carte graphique. J’avoue ne pas avoir trop creusé ce point. Toujours est-il qu’il est possible d’augmenter cette taille pour que l’écran virtuel soit assez grand pour contenir mes deux écrans physiques.

La troisième étape est donc d’éditer le fichier xorg.conf en prenant soin d’en faire une sauvegarde auparavant*. Il faut que la somme des tailles des écrans séparés soit plus petite que la taille de l’écran virtuel. Grâce à la liste affichée par xrandr, vous avez la taille maximale de chaque écran que vous pouvez sommer pour obtenir la taille de l’écran virtuel nécessaire pour être tranquille. Dans mon cas j’ai donc ajouté la ligne suivante à mon fichier xorg.conf dans Section "Screen" / Subsection "Display" :

Virtual 2560 1824

Je redémarre le serveur X avec la commande suivante* pour que mes modifications soient prises en compte :

sudo restart lightdm

Je retente la commande déjà utilisée pour afficher mon second écran et le miracle se produit. En parcourant la page de manuel de xrandr, je trouve une option pour utiliser la résolution la plus adaptée :

$ xrandr --output CRT1 --pos 1280x0 --preferred

Tout est presque bon.

Oui, il y a un presque et il vient d’Unity, l’interface par défaut d’Ubuntu. La barre de menu (Unity Global Menu) ne s’affiche pas sur l’écran secondaire et quand l’application est en mode plein écran sur l’écran secondaire, cette barre reste vide sur l’écran principal. On peut double-cliquer dessus pour remettre l’application en mode fenêtré mais impossible d’accéder au menu de l’application. Avec Cinnamon par exemple, pas de soucis puisque pas de barre globale de menu.

* : tant pour pour l’utilisation du fichier de sauvegarde que pour le redémarrage du serveur X, j’ai été méfiant. Si pour X raisons (oui, le jeu de mots est pourri…) je cassais mon serveur graphique, il fallait être capable de sauver la mise. J’ai donc fait quelques recherches sur l’utilisation de la console (la vraie, et non le terminal) et la manipulation du serveur X. Cela a été une sorte de périple dans le périple.

Commençons par l’utilisation de la console, qui elle n’a pas besoin du serveur X pour fonctionner. Tout ce que vous avez besoin de savoir pour y accéder est décrit dans la partie 1 de la page dédiée à cette console sur Ubuntu-Fr.

Continuons avec le serveur X. Avec Unity, le service associé est LightDM mais cela dépend du gestionnaire graphique et on peut avoir GDM ou KDM. Ils servent de simplification à l’utilisation de XDM. Le service peut être lancé, arrêté ou redémarré. Il y a plusieurs techniques pour le faire, certaines ont mieux marché que d’autres sur mon PC. En vrac, on a :

sudo /etc/init.d/lightdm restart
sudo service lightdm restart
sudo restart lightdm

Le mot restart peut être remplacé par start ou stop.