Yop

Aller au contenu | Aller au menu | Aller à la recherche

jeudi, 4 juin 2015

ESP8266 - Firmware et outils

Comme nous l'avons vu dans un le précédent billet, l'ESP8266 peut être flashé avec des firmwares alternatifs.


Modification des branchements

Pour je pense toutes les versions, il est nécessaire de mettre la GPIO0 à la masse au démarrage du module pour qu'il puisse rentre en mode "ready pour être flashé".
(Penser à l'enlever après ! )


Logiciel pour flasher

Sous GnuLinux, j'ai utilisé esptool.

$ sudo apt-get install python-serial
$ git clone https://github.com/themadinventor/esptool.git
$ ./esptool/esptool.py --help
usage: esptool [-h] [--port PORT] [--baud BAUD]

Exemple avec NodeMCU si votre port série est /dev/ttyUSB0

$ wget https://github.com/nodemcu/nodemcu-firmware/raw/master/pre_build/latest/nodemcu_latest.bin
$ python esptool.py --port /dev/ttyUSB0 write_flash 0x000000 nodemcu_latest.bin
Connecting...
Erasing flash...
Writing at 0x00062000... (100 %)

Leaving...


Firmwares

Frankenstein

Frankenstein est un firmware qui permet de se passer des commandes AT pas très intuitives, et d'utiliser à la place des commande beaucoup plus simples.

Exemples de commandes qui elles se passent d'explication:

iwscan
iwconnect ApName password
ifconfig
listen 8080
send 192.168.0.101 8080 hello
deepsleep 10000
gpio out 0 1

etc..

simple...


NodeMcu

NodeMcu ici ou ici est je pense, à la date de rédaction de ce billet, le firmware le plus utilisé.

Il utilise des scripts en Lua.

NodeMCU 0.9.5 build 20150214 powered by Lua 5.1.4
lua: cannot open init.lua
> print("hello")
hello
>

Exemple de code pour faire tourner un serveur HTTP:

-- a simple http server
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
conn:on("receive",function(conn,payload)
print(payload)
conn:send("<h1> Hello, NodeMCU.</h1>")
end)
end)

Le mieux est d'aller voir les autres exemples sur le site web ou sur GitHub pour se rendre compte.

Au démarrage, le fichier init.lua sera exécuté, s'il existe.
Il est donc possible par exemple de faire tourner un serveur HTTP connecté en Wifi qui permet de basculer les GPIOs.
Oui, oui, tout ceci pour 2€50 ! Sans avoir besoin d'un Arduino etc.. L'Internet des objets est là.


esp8266-cli

esp8266-cli permet de réaliser simplement des opérations sur le système de fichier accessible sous le firmware NodeMcu.

Il permet donc de copier facilement ses scripts, les supprimer etc.. en ligne de commande.

$ sudo npm install -g esp8266

J'ai eu l'erreur "/usr/bin/env: node: No such file or directory" qui a été corrigé par

$ ll /usr/bin/nodejs
-rwxr-xr-x 1 root root 1.4M Oct 19 2013 /usr/bin/nodejs
$ sudo ln -s /usr/bin/nodejs /usr/bin/node

Exemples de copie de fichier vers l'ESP8266:

$ echo pouet > toto
$ sudo esp port set /dev/ttyUSB0
$ sudo esp file list
$ sudo esp file write toto
$ sudo esp file list
6 bytes toto
$ sudo esp file read toto
pouet

$ sudo esp file remove toto
$ sudo esp file list


ESPlorer

Dispo ici, écrit en Java, il est multi-plateformes

$ java -jar ESPlorer.jar

esp8266-esplorer.png

dimanche, 31 mai 2015

Découverte de l'ESP8266

esp8266-coin.png

Présentation

L'ESP8266 est un petit module Wifi très bon marché (de l'ordre de 2,80€ port compris au jour de l'écriture de ce billet).
Il permet à l'origine de s'interfacer en serial avec d'autres périphériques et donc de faire de l'UART vers Wifi. Par exemple pour qu'un Arduino puisse se connecter à Internet pour récupérer la météo, ou envoyer la température d'un radiateur.
Son faible coût et ses capacités croissantes (firmwares alternatifs, nouvelles versions hardware) ont font un candidat sérieux pour tous les "objets connectés".

Par rapport à un module 433MHz du même ordre de prix, les avantages principaux sont:
- Possibilité de se passer d'Arduino etc.. Le module peut etre flashé pour mettre son propre firmware et donc faire un peu ce qu'on veux (dans la limite de ce qu'autorise 80Mhz).
- On ne se soucie plus d'implémenter un protocole, de mettre du "manchester" etc... On est direct en TCP/IP classique pour nos applications.
- On bénéficie du chiffrement Wifi. (WPA/WPA2)
- Il y a des GPIOs (le nombre dépend des modèles)
- La portée semble tout a fait correcte et on pourra donc installer un module partout ou le signal Wifi peut être capté... Et donc généralement n'importe ou dans la maison.

Le seul bémol, c'est que le Wifi est assez consommateur de courant. Même si le but n'est par exemple de l'allumer que quelques secondes par heure pour envoyer la température etc... Donc a étudier ce que cela donne sur batterie et quels sont les moyens possibles d'optimisation. (Deep Sleep 10µA ?)

Hardware

Il existe à ce jour 12 versions de ce module. Voir ici
Je ne détaillerais donc pas les branchements dans le détail mais en gros, un Vcc, une masse, un TX, un RX et d'autres trucs (GPIOs).

/!\ Ce module est en 3.3V !
Ne PAS y mettre 5V ...j'ai testé par erreur...je confirme... Il n'aime pas ;)

C'est valable pour l'alim et pour les niveaux TX/RX.
L'alimentation doit semble t-il pouvoir founir jusqu'à 215 mA suivant les paramètres et phases Wifi.

La plupart des versions n'ont pas le classique pas de 2.54 pour les connecteurs.. il faut donc bidouiller un peu pour les mettre sur nos breadboards ou se procurer une carte adaptateur.

adapteurDIYESP8266.jpg

adapterESP8266.png

Software

Il faut donc s'interfacer avec le module en sérial.

Tous les modules ne sont pas fournis avec la même version de firmware, et d'ailleurs on peut modifier le firmware.

Mon 1er module est arrivé en 9600 bauds. D'autres semblent etre en 57600 ou 115200.
Toutes les versions n'ont pas non plus les même CR/LF.

J'ai testé d'abord avec GNU Screen

esp8266GnuScreen.png

Avec la version par défaut de mon 1er module, avec screen, il faut alors utiliser Crtl + m puis Ctrl + j pour indiquer les fin de lignes, et valider les commandes.

Sinon on peut utiliser un peu n'importe quel logiciel (minicom, picocom etc..)
En graphique, il y a aussi cutecom moins connu:

esp8266CuteCom.png



Commandes AT principales avec le firmware de base

- Test

AT
doit renvoyer
-> OK

Sinon vérifier le cablage, le baudrate, les fins de ligne etc...

- ReStarT du module

Permet également de voir version de firmware.

AT+RST

\0x04Z\0xcb
@\0xfd\0x13:6\0xa0;\0xd8@\0xae\0xea\0xfa\0x11\0xc8V\0x0c.\0xea\0xaa\0xfe
Vendor:www.ai-thinker.com Version:0.9.2.4

- Version du firmware

Get firMwaRe ?

AT+GMR

0018000902-AI03

- Mode de fonctionnement du Wifi

Wifi MODE

Il y a 3 modes: Station pour se connecter à un AP (1) / AP pour que des machines se connectent au module (2) / Combinaison des 2 ? (3)

AT+CWMODE=1

- Voir le mode de fontionnement

AT+CWMODE?
+CWMODE:1

- Lister les SSID

Wifi ListAP

AT+CWLAP

+CWLAP:(0,"SFR WiFi Mobile",-69,"xx:xx:xx:xx:xx:xx",1)
+CWLAP:(2,"NEUF_1234",-69,"xx:xx:xx:xx:xx:xx",1)
+CWLAP:(0,"SFR WiFi FON",-69,"xx:xx:xx:xx:xx:xx",1)
+CWLAP:(2,"DartyBox_1234",-80,"xx:xx:xx:xx:xx:xx",6)
+CWLAP:(4,"Livebox-1234",-76,"xx:xx:xx:xx:xx:xx",6)
+CWLAP:(0,"orange",-77,"xx:xx:xx:xx:xx:xx",6)
+CWLAP:(0,"FreeWifi",-46,"xx:xx:xx:xx:xx:xx",11)
+CWLAP:(0,"FreeWifi_secure",-47,"xx:xx:xx:xx:xx:xx",11)

Le 1er chiffre indique:

0: OPEN
1: WPA_PSK
2: WPA2_PSK
4: WPA_WPA2_PSK

- Se connecter à un SSID

Wifi Join AP

AT+CWJAP="NomSSID","motDePasse"

- Voir sur quel SSID on est connecté

AT+CWJAP?
+CWJAP:"NomSSID"

- Voir son adresse IP

AT+CIFSR
192.168.1.218

- Mode Client TCP:

Ce mode permet au module d'aller se connecter vers un serveur.
Par exemple d'aller demander le contenu d'une page sur Internet.

- Activation des connexions multiples

0: Une seule connexion
1: Connexions multiples

Connection IP MUltiple ConneXions

AT+CIPMUX=1

- Ouvrir une connection vers un serveur

Connection IP START

AT+CIPSTART=4,"TCP","google.com",80

4 est le numéro de canal Le reste parle de lui même.

- Indiquer les données qui vont être envoyées:

Connection IP SEND

AT+CIPSEND=4,18
>

4 pour le numéro de canal
18 est le nombre d'octets qui vont être envoyés (GET / HTTP/1.0\r\n\r\n )
Un > indique que les données vont ensuite pouvoir être envoyées.

- Envoi des données vers le serveur

> GET / HTTP/1.1

SEND OK

-Réception des données depuis le serveur:

+IPD,4,524:HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.fr/?gfe_rd=cr&ei=1jrdVILoHonu8wfClICYBw
Content-Length: 258
Date: Thu, 12 Feb 2015 23:44:22 GMT
Server: GFE/2.0
Alternate-Protocol: 80:quic,p=0.08

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.fr/?gfe_rd=cr&amp;ei=1jrdVILoHonu8wfClICYBw">here</A>.
</BODY></HTML>

+IPD,4,524 signifie:
IPD: IP Data
4: Numéro de canal
524: Nombre d'octets de la réponse

- Mode Serveur TCP:

- Activation des connexions multiples

0: Une seule connexion
1: Connections multiples

AT+CIPMUX=1

- Mise en écoute du module sur le port TCP 80

Le 1er paramètre est 1 pour ouvrir le port, 0 pour le fermer.

Connexion IP SERVER

AT+CIPSERVER=1,80

- Test de connexion depuis une autre machine du LAN

$ telnet 192.168.1.218 80
Trying 192.168.1.218...
Connected to 192.168.1.218.
Escape character is '^]'.
AbcdEFGhi

Le module recoit bien les données:

Link
+IPD,0,11:AbcdEFGhi
OK

0 étant le numéro de canal
11 étant le nombre d'octets (avec \r\n\r\n )

- Répondre à la requète du client

Il y a a priori environ 1 minute de timeout pour répondre lors de mes tests (Message Unlink)

On indique le canal de réponse, le nombre d'octets, puis les données à transmettre:

AT+CIPSEND=0,9
> POUET

Coté client, on recoit bien la réponse:

$ telnet 192.168.1.218 80
Trying 192.168.1.218...
Connected to 192.168.1.218.
Escape character is '^]'.
AbcdEFGhi
POUET

- Fermeture de la connexion

On indique le numéro de canal 0

AT+CIPCLOSE=0

$ telnet 192.168.1.218 80
Trying 192.168.1.218...
Connected to 192.168.1.218.
Escape character is '^]'.
aaabbcc
hello worConnection closed by foreign host.
$

Conclusion

Ceci n'est qu'une présentation générale de l'ESP8266, et de son firmware par défaut.
Cela montre quand même qu'avec 2,80€, on peut se connecter "facilement" en Wifi.

Mais grâce au SDK, il est possible d'utiliser d'autres firmwares facilitant l'utilisation, et plusieurs projets sont en cours avec probablement le plus utilisé NodeMCU qui pourra être le sujet d'un autre billet.

lundi, 23 février 2015

Problème de dimension du terminal lors de connexions à travers un port série

Amené à travailler avec le terminal, à travers des connexions série, on constate un problème d'ajustement de la taille après l'utilisation de certaines commandes telles que vi etc...

J'utilise généralement la commande suivante pour me connecter sur le port série /dev/ttyUSB0

screen /dev/ttyUSB0 115200

Le problème est que certains logiciels comme l'éditeur vi considèrent que le la fenêtre de terminal n'est que de 24 lignes. Cela reste ainsi ensuite même après être sorti de l'éditeur. Ce qui laisse une bande vide en bas empêchant d'utiliser toute la hauteur du terminal.

serialProblemeLignesVides.png

Le problème, expliqué par Akkana Peck sur son blog est que screen n'a pas de possibilité d'envoyer par le port série, la taille originale de la fenêtre du terminal, (alors que c'est ce qui se passe en SSH par exemple).

Il ne semble pas non plus y avoir une commande qui permet de demander au terminal sa taille.

Cela n'a pas l'air simple à résoudre, heureusement pour nous, Akkana partage un petit script en python qui ruse en allant déplacer le curseur pour trouver la bonne taille etc.. et permet de résoudre le problème.

TerminalSerialResolution.png

On peut également le mettre par exemple dans le fichier .bash_profile pour qu'il se lance à l'ouverture de la session.

Je ne sais pas s'il quelqu'un connait une meilleure solution à ce problème ? Mais en tout cas cela fonctionne parfaitement pour moi depuis plusieurs mois... et je me suis dit qu'il pouvait être utile de partager l'astuce :)

dimanche, 22 février 2015

Minitel et Raspberry

Voici comment j'ai branché un minitel avec un Raspberry.
Ou autrement dit, branché un minitel sur Internet :)

minitelRasp.jpg

J'ai trouvé plusieurs liens qui expliquent différentes manières de procéder, mais toutes imposent de créer un petit circuit électronique... et aucune ne propose d'utiliser le PL2303... Comme cette méthode me semble plus simple, j'écris ce billet.

Il vous faudra principalement:
- Un minitel avec prise DIN et touche Fonction (Recup ou ~ 5€)
- Un adaptateur USB/Serial PL2303 avec niveaux 5V (~ 1€)
- Une prise DIN (~ 1€)

Tous les minitels n'ont pas de port DIN. Il faut donc bien choisir.
Le minitel doit avoit cette prise au dos.. ainsi que la touche Fonction.

priseDIN.png

toucheFonction.png

L'adaptateur USB/Serial PL2303 existe avec, soit des niveaux de 3V3, soit des niveaux de 5V.
Pour l'utilisation avec le Minitel il faut utiliser un PL2303 avec les niveaux 5V.

Comme on n'est jamais vraiment certain, il vaux mieux vérifier.

pl2303Multimetre.jpg

La prise DIN comporte 5 connecteurs.

docMinitel.png

DINSoude.jpg

1: RX : à connecter sur TX du PL2303
2: Masse: à connecter sur la masse du PL2303
3: TX : à connecter sur RX du PL2303
4 et 5 se sont pas utilisés ici.

PL2303Soude.jpg

On branche ensuite simplement le PL2303 sur un port USB du Rasp, et la prise DIN sur le Minitel.

Coté OS, il est maintenant nécessaire de dire à Raspbian "d'envoyer une console" sur notre PL2303 qui est reconnu par défaut en /dev/ttyUSB0

Comme expliqué entre autres sur Pila's blog, on ajoute donc au fichier /etc/inittab la ligne:

T1:23:respawn:/sbin/getty -L -i -I "\033\143" ttyUSB0 4800 minitel1b-80

puis on exécute un sudo init q ou reboot pour appliquer la modification.

Coté Minitel, il faut lui dire d'utiliser la prise DIN, donc une fois allumé on fait:

Fnct + T, puis A (ou F) : passage en mode péri-informatique (80 colonnes).
Fnct + T, puis E : désactivation de l'écho local.
Fnct + P, puis 4 : réglage de la vitesse de transmission à 4800 bauds.

Avec cette méthode, le prompt de login ne s'affiche pas parfaitement, mais après avoir tapé quelques caractères, tout rentre dans l'ordre.

MinitelEtRasp.jpg

ScreenMinitel.jpg

MinitelPing.jpg


A quoi ca sert ?
A rien.. ok.. :)
Mais il faut bien recycler nos vieux Rasp modèles B ! ;)

Quelques autres liens sur le sujet:
Pila's blog ici et ici / x0r ici et ici / xavier / Yip / ForumRaspberry / alphak / furrtek / Labomedia / Aplu

samedi, 26 avril 2014

Ballon de haute altitude avec le Raspberry Pi

Un de mes projets autours du Rasp, était d'envoyer un ballon dans la stratosphère.

Le rasp était utilisé pour tout centraliser; les logs, le gps, les capteurs, le lien radio, les sms ... et un des 2 dispositifs photo avec la caméra "officielle" du Rasp.

J'ai mis une partie des photos sur picts.hab.uggy.org
Il y a des photos prises en vol, ainsi que d'autres sur la préparation etc...

Au sol, le tout était également géré sous GnuLinux.

Le site de référence qui m'a permis de réussir ce projet est UKHAS

Je vais probablement monter un petit blog/site sur ce sujet des ballons stratosphériques et leur "gestion" sous GnuLinux.
J'ai monté un petit blog/site sur ce sujet des ballons stratosphériques et leur "gestion" sous GnuLinux.
J'ai fais le choix de le faire en anglais.
Il est à l'adresse hab.uggy.org

Le sujet "High Altitude Balloon" et tout ce qui y rapporte (Raspberry mais pas seulement) sera traité sur cet autre site. Si ce sujet vous interresse, abonnez vous au flux Rss de l'autre site. Sinon, vous ne devriez plus trop en entendre parler sur ce site ;)

vendredi, 27 décembre 2013

Mise à dispostion rapide de screenshots

J'utilise généralement Shutter pour prendre des screenshots.

J'évite de stoquer ces screenshots sur les sites publics, donc jusqu'à présent, quand je voulais ensuite partager ce screenshot, en gros:
- je l'enregistrais localement
- je faisais un scp du fichier dans le répertoire qui va bien sur un serveur web
- Je faisais des copier/coller de l'URL avec le nom du fichier pour communiquer l'URL.

On peut faire des variantes avec sshfs, scripter quelques trucs.. etc.. mais c'est pas forcément l'idéal.

Mais ce coup ci, j'en avais plusieurs à faire et j'ai donc cherché un truc "propre" pour simplifier le process.

Au bout de quelques secondes de recherche, je suis tombé sur le bien nommé shutter-scp (voir aussi ici. Et c'est exactement ce que je voulais.

Pour l'installation, il suffit de copier un fichier dans le bon répertoire de Shutter (voir le README).
Pour la configuration, il suffit de renseigner où faire le scp (Serveur:Répertoire) ainsi que l'URL qui sera communiquée (à saisir dans le champs "Mot de Passe").

Une fois le screenshot réalisé dans Shutter, un clic pour exporter, un autre pour valider le scp, puis un dernier pour copier l'URL complète.
Avec ma clé SSH chargée en mémoire, pas besoin de mot de passe, en 3 secondes, tout est fait.

ShutterScp1.png

ShutterScp2.png

Merci Christian Weiske

J'avais testé Screencloud qui supporte le SFTP.. Mais il ne supporte pas (encore) l'authentification par clé publique... donc pas possible pour moi.

vendredi, 6 décembre 2013

Backup incrémental avec le Rasp - rdiff-backup


  • Introduction

J'avais lu cet article de Benjamin concernant des sauvergardes distantes chiffrées.

Disposant désormais moi aussi d'un "site distant" où placer un Raspberry (celui avec la chaudière, j'ai pu me lancer également il y a quelques mois.. Mais en utilisant quelques variantes des outils.

- rdiff-backup (au lieu de rsync)
- LoopAES (au lieu de TrueCrypt )

Les raisons principales qui m'ont fait choisir rdiff-backup (par rapport a rsync ou à Duplicity ou encore rsnapshot ou certaines autres solutions sont principalement:

- Incrémental
Donc ne transfère que les modifications.

- Le backup est toujours le mirroir de la dernière version (hormis le répertoire additionel "rdiff-backup-data" qui contient les changements (et suppression).
En gros, il suffit de recopier le répertoire de backup pour repartir comme si de rien n'était si on veut juste restaurer la dernière version de la sauvegarde.

- Conserve les modifications (et suppressions).
Si un fichier est supprimé par erreur de la source, on ne veut PAS qu'il le soit aussi coté backup après synchronisation. Comme il y a bien quand même un "mirroir", le fichier "supprimé" est déplacé dans le répertoire additionel "rdiff-backup-data"

- Permet de restaurer un fichier/répertoire dans sa version à une date donnée.

- Permet de supprimer les anciennes versions de + de XX jours (ou de XX backups) afin de ne pas saturer le disque de backup.

  • Chiffrement

J'ai choisi LoopAES au lieu de Truecrypt uniquement pour des raisons de vitesse d'accès.

Des 2 cotés les données sont chiffrées et rendues accessible dans le répertoire /mnt/.data/

Les passphrases pour déchiffrer les données sont saisient manuellement une fois les Rasps démarrés.
Vu qu'un Rasp ne consomme qu'environ 4€ d'électricité par an, est silencieux et ne chauffe pas, ils restent allumés en théorie en permanence (en + j'ai un petit onduleur).
Les données sont accessible ensuite tout le temps que le Rasp reste allumé.
Mon but est principalement de restreindre l'accès aux données en cas de vol du Rasp/Disque dur. (Le voleur, même geek, à des chances de débrancher le Rasp/disque dur pour le voler ;) )

  • Configuration

- Installation de rdiff-backup des 2 cotés

$ sudo apt-get install rdiff-backup

- Principe

L'authentification SSH se fait par une clé SSH spécifique à la tâche de backup, ce qui permet d'automatiser la connexion et de restreindre les commandes utilisables par cette clé.

Il y a 2 choix possibles dans le sens des connexions.
- Le serveur qui envoit ses données à backuper sur le serveur de backup.
- Le serveur de backup qui vient récupérer les données sur le serveur à backuper.

J'ai choisi la 2ème option:

En cas de compromission du serveur à backuper, aucun accès possible sur le serveur de backup.
En cas de compromission du serveur de backup, un accès restreint à la commande rdiff-backup en lecture seule sur le serveur à backuper (pas d'accès au shell).

command="rdiff-backup --server --restrict-read-only...."

En cas de compromission de la clé privée. Celle ci ne peux pas être utilisée depuis une machine autre que celle déclarée sur le serveur à backuper.

from="1.2.3.4"

- Mise en place des clés SSH

Sur le serveur de backup:

$ ssh-keygen

pas de passphrase car on veut ensuite que la connexion puisse se faire automatiquement

on appelle ces clés par exemple:
id_rsa.backup
id_rsa.backup.pub

dans le fihier .ssh/config du serveur de backup

host ServeurABackuper
hostname host.example.org
user yop
identityfile /home/user/.ssh/id_rsa.backup
port 80

Ajout de la clé publique sur le serveur à backuper dans authorized_keys.
Pensez pour les tests à ne pas utiliser de "SSH Agent Forwarding" ;)
Tester avec une connexion SSH "normale"
Si ok, sécuriser en ajoutant les restrictions suivantes devant la clé:

from="1.2.3.4",command="rdiff-backup --server --restrict-read-only /",no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAABCDxxxx

Tester à nouveaux avec une connexion SSH "normale" (et sans "SSH Agent Forwarding"), la connexion doit être refusée (car seulement la commande rdiff-backup est authorisée avec cette clé)

PTY allocation request failed on channel 0

- Backup

Sur le serveur de backup:

$ rdiff-backup ServeurABackuper::/mnt/.data/ /mnt/.data/backup/ServeurABackuper

Le contenu de /mnt/.data/ du serveur à backuper se retrouve donc dans /mnt/.data/backup/ServeurABackuper/ du serveur de backup.

Est créé en plus, un répertoire propre à rdiff-backup "rdiff-backup-data"

Pour plus d'infos, utiliser les options:

$ rdiff-backup -v5 --print-statistics

- Exemple de suppression d'un fichier

On supprime un fichier sur le serveur à backuper.
On relance un backup.
Le fichier est bien "supprimé" coté répertoire de backup MAIS une copie (compressée en gz et renommée avec la date) est conservée dans le répertoire rdiff-backup-data/increments/

On peut voir les différentes "versions" d'un fichier

rdiff-backup --list-increments file

- Restaurer

Pour une restauration, on peut soit passer par une bête copie classique (cp / scp etc.. ), soit utiliser les options suivantes

rdiff-backup -r now host.net::/remote-dir/file local-dir/file
rdiff-backup -r 10D host.net::/remote-dir/file /tmp/file

10D étant bien entendu la version du fichier "file" d'il y a 10 jours.

Exemple pour restaurer un fichier qui a été supprimé du serveur à backuper hier, puis un backup a eu lieu cette nuit., dans ce cas le fichier a été supprimé le l'image "mirroir", mais est toujours présent dans rdiff-backup-data/increments:

rdiff-backup -r 2D SrvDeBackup::/mnt/.data/backup/xxxxx/yyyyy/file localrep/file

La commande ici est lançée depuis le serveur à backuper. On ne peut pas utiliser "now" car le fichier n'est déjà plus dans le mirroir à cause de la synchro de la nuit. Le fichier zzz n'est en fait plus présent dans /mnt/.data/backup/xxxxx/yyyyy/ mais la commande fonctionnera et ira chercher le fichier en réalité dans rdiff-backup-data/increments/

- Supprimer les anciennes versions de fichiers.

Comme on a pas non plus un espace illimité pour garder 10 000 versions de tous les fichiers (ou les fichiers supprimés) , il est nécessaire de supprimer régulièrement les "vielles" versions.

Ceci est réalisé par la commande suivante:

rdiff-backup --remove-older-than 2W host.net::/remote-dir

Ici les anciennes versions de plus de 2 semaines seront supprimées.
Bien ententu, ceci n'efface PAS les fichiers de la sauvegarde, même s'il datent de 10 ans, uniquement les anciennes versions.

rdiff-backup --remove-older-than 20B host.net::/remote-dir

Ici seules les modifications des 20 dernières sessions de Backups sont conservés.

J'aurais bien vu aussi une option qui aurait pris une taille en paramètre. Par exemple, "tu me supprimes les modifications de sessions de sorte que je n'utilise pas plus de 10Gio d'anciennes sessions"... Mais ceci n'existe pas. Il y a peut être une bonne raison ?

Dans mon cas, la commande est lancée en "local" dans le script tournant sur le serveur de backup

rdiff-backup --remove-older-than 12M --force /mnt/.data/backup/ServeurABackuper

  • Script et mise en cron

Mon script tourne sur le serveur de backup et fonctionne ainsi dans une cron chaque nuit:

- Vérification que le répertoire chiffré est bein accessible en clair et si oui:
- Backup
- Supression des anciennes versions
- Un petit mail récaptulatif

Sinon, petit mail d'alerte, car il y a du avoir un reboot.

  • Conlusion

La solution permet donc d'avoir à moindre frais (Un Rasp + un Disque dur + 4€ d'électricité par an + des beaux parents pour héberger le Rasp ;) ) une solution de backup:

- Discrète (ne prend pas trop de place et est silencieux)
- Incrémental (Optimisation bande passante et temps de backup)
- Securisé (Chiffré + SSH + pas dans le Cloud de la NSA + site distant)
- On peut restaurer tout notre backup facilement. Même en copiant simplement le répertoire.
- On conserve les anciennes versions des modifications/supressions que l'on peut restaurer facilement également.

samedi, 19 octobre 2013

Domotisation d'une chaudière avec le RaspberryPi

  • Introduction

Mon but était de pouvoir allumer le chauffage (chaudière) d'une maison secondaire à distance. La chaudière est équipée d'un thermostat qui peut maintenir une température programmée automatiquement, mais le besoin est de pouvoir passer, à la demande, et à distance, du mode "Hors gel" au mode "JeVeux18°C".
Par exemple X semaines sans rien chauffer du tout.. puis du jour au lendemain décider de vouloir 18°C. (Si vous pensez que ce n'est pas grave d'arriver dans une maison à 2°C, vous n'avez probablement pas encore d'enfants ;) )

Trève de blabla.. en vrac:

- La chaudière est équipée d'un "boitier/thermostat" filaire déporté, qui permet de contrôler la chaudière.
- La première idée était de voir si le fabriquant ne proposait pas un module permettant de réaliser ceci.
-> Oui, a priori c'est possible mon bon Monsieur, en échange d'un peu plus de 300€ HT.
- Mmmm... j'achète 10 Rasp pour ce prix là moi :)
- On va donc partir sur l'utilisation du Rasp, qui de toute façon est déjà sur place ;)
- La seconde idée est de voir quel est le protocole utilisé entre le thermostat et la chaudière.. pour ensuite essayer de l'implémenter sur le Rasp.
- Après investigations, il s'agit du protocole eBUS
- A première vue, cela semblerais à peu près jouable de l'implémenter (UART etc.. ) même si le "projet" à l'air d'être complètement mort.
- Mais très vite, cela semble quand même bien galère... Une partie du peu de doc est en Allemand.. Risque de péter la chaudière et le thermostat, beaucoup de temps à passer pour (essayer d') implémenter le protocole et trouver les bons menus..le tout sans être sûr d'y parvenir..et le tout pour un protocole déjà mort.
- On en vient donc finalement rapidement à la 3ème idée: simuler la séquence d'appui sur les boutons du thermostat filaire existant, qui permet de passer du mode "HorsGel" au mode "JeVeux18°C"

  • Approche

- Démontage du thermostat existant.
- On trouve rapidement les contacts des 2 boutons utilisés pour aller dans les menus.
- On soude les 4 fils, on les fait sortir sur le coté.. et on referme le tout.
- Le thermostat pourra donc toujours être utilisé en "local" en appuyant sur les boutons.. mais ensuite en plus à distance par le Rasp.

chaudiere-filsSoudes.png

- Maintenant il faut pouvoir faire "contact" entre les 2 fils de chaque bouton pour simuler l'appui.
- On est en courant continu.. et avec un ampèremètre, on le mesure l'histoire de voir.
- Plusieurs solutions sont envisageables pour créer le contact et donc simuler l'appui sur le bouton; transistor, relai "normal", reed relay, circuit intégré, etc..
- J'écarte l'idée du transistor, car je ne sais pas ce qu'il y a devant et derrière les boutons "interrupteurs" du thermostat.. n'étant pas spécialiste, je n'ai pas envie de cramer le tout... (qui coûte certainement le même prix que le module de commande à distance ;) )
- Après recherche sur le net.. le 74HCT4066 est censé faire l'affaire.
- Je prends mon 74HCT4066, je n'ai aucun problème pour allumer/éteindre une LED par exemple.. mais cela ne marche pas sur les contacts de la chaudière.. Je ne sais pas pourquoi... (Trop faible intensité ? J'ai bien mis à la masse les entrées non utilisées, j'ai aussi testé avec une résistance de 50 Ohms.. bref..)
- On passe à la solution de backup (c'est que l'hiver approchait ;) ).. des Reed Relay que j'avais en stock. (Commandés aussi pour un autre besoin).
- Les miens (1.8€) sont en "5V" (3,7V minimum pour se fermer) et un "level shifter" est donc nécessaire pour "monter" les 3.3V de la GPIO du Rasp à 5V.
- Je ne m'étant pas sur les Level Shifter dans ce billet. Cela pourra être l'objet d'un autre.
- L'intensité est largement en dessous de la limite.. donc c'est ok.

  • Schémas

chaudiere.png

Je n'ai pas vraiment le temps de faire un beau schéma sous Fritzing.
Donc vous aurez la version "moche/papier" ;)

chaudiere-schema.png


  • Mise en place

- Test sur breadboard avec donc les level shifter et 2 reed relais.
- Les entrées des relais sont donc commandées par 2 GPIOs du Rasp (17 et 18 dans mon cas).
- J'installe wiringPi parce que c'est plus simple (et parce que je le vaux bien).
- Je passe les 2 GPIOs en "sortie"

$ gpio mode 0 out
$ gpio mode 1 out

- Je créé les contacts en passant à 1 les GPIOs pendant 0.3 secondes.
- Pour moi la séquence est assez simple (Bouton A / Bouton B / Bouton A):

gpio write 0 1 && sleep 0.3 && gpio write 0 0 && sleep 1 && gpio write 1 1 && sleep 0.3 && gpio write 1 0 && sleep 1 && gpio write 0 1 && sleep 0.3 && gpio write 0 0

- Les tests sont concluants... \o/

chaudiere-breadboard.png

- On dégaine le fer à souder
- On soude le tout comme sur la breadboard de test..
- On rajoute un DS18B20 (1€) et sa résistance pour pouvoir connaitre la température à distance. (Je ne détaille pas cette partie, voir par exemple ici ou .
- On rajoute une LED pour montrer que le montage est sous tension. (Et pour impressionner Madame).
- On force les GPIOs en mode "sortie" et à 0 dès le boot dans le /etc/rc.local
- On refait un petit script plus propre.
- On re-teste..
- C'est OK, on peut aller boire une bière.

chaudiere-soude.png

  • Futur

- Finaliser le boitier et les câbles vers le thermostat
- Interface web (en plus de SSH) pour avoir la température et allumer la chaudière.
- Voir si on veut commander la chaudière par SMS avec Gammu
- Voir si on veut implémenter d'autres séquences (passage en HorsGel en cas d'oubli en partant)

  • Conclusion

Il n'y a pas difficulté particulière à réaliser ceci.. Et pas réellement d’intérêt à publier ces informations propres à une chaudière.. Le but est juste de montrer qu'avec un peu de motivation, un esprit un peu DIY et quelques Euros de composants, on peut facilement utiliser le Rasp pour domotiser plein de choses.. et j'espère que cela donnera des idées à certains pour mettre en place leurs propres projets domotiques ! :)

mardi, 3 septembre 2013

Envoi de SMS par le RaspberryPi

J'ai un projet où le Rasp doit envoyer des informations par SMS.

J'ai acheté 10€ une clé 3G d'occasion pour l'utiliser avec Gammu

  • Informations sur la clé

$ dmesg | grep tty | grep usb
[ 1014.053491] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB0
[ 1014.062066] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB1
[ 1014.069542] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB2
$
$ lsusb | grep -i Huawei
Bus 001 Device 006: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem
$

  • Installation de Gammu

$ sudo apt-get install gammu

  • Paramétrage

$ gammu-detect
; Configuration file generated by gammu-detect.
; Please check The Gammu Manual for more information.

[gammu]
device = /dev/ttyUSB0
name = Phone on USB serial port HUAWEI_Technology HUAWEI_Mobile
connection = at

[gammu1]
device = /dev/ttyUSB1
name = Phone on USB serial port HUAWEI_Technology HUAWEI_Mobile
connection = at

[gammu2]
device = /dev/ttyUSB2
name = Phone on USB serial port HUAWEI_Technology HUAWEI_Mobile
connection = at
$

Dans /etc/gammurc on met juste:

[gammu]
device = /dev/ttyUSB0
name = Phone on USB serial port HUAWEI_Technology HUAWEI_Mobile
connection = at

$ gammu identify
Périphérique : /dev/ttyUSB0
Fabricant : Huawei
Modèle : unknown (K3565)
Firmware : 11.111.11.11.11
IMEI : 222222222222222

Si un code PIN est activé

$ gammu getsecuritystatus
Waiting for PIN.
$ gammu entersecuritycode PIN 1234
$ gammu getsecuritystatus
Nothing to enter.
$

  • Envoi de SMS

$ gammu sendsms TEXT 0612345678 -text "Test 1"
If you want break, press Ctrl+C...
Sending SMS 1/1....waiting for network answer..OK, message reference=1
$

$ echo "Test 2" | gammu sendsms TEXT 0612345678
If you want break, press Ctrl+C...
Sending SMS 1/1....waiting for network answer..OK, message reference=2
$

  • Divers

$ gammu getlocation
Latitude : 48.XXXXXX
Longitude : 2.XXXXXX
Range : 50000
Number of samples : 70
$

Gammu envoi la CellID sur le site web du projet open source OpenCellID (GET HTTP).
(Il faut un accès Internet dans ce cas, donc je ne pourrais l'utiliser)

  • Conclusion

Nous avons donc pour 10€ de clé, et 2€ (voir 0€ ;) ) de forfait mensuel une solution d'envoi de SMS illimité.

Pour toutes les infos, voir la doc .

mardi, 6 août 2013

Tests chiffrement RaspberryPi

Il y a différents moyens de chiffrer des fichiers sous GnuLinux, mais ils se classent généralement dans 2 catégories.

  • Le chiffrement où l'on créé un volume chiffré.. et on met les fichiers dedans.

On trouve par exemple:
Truecrypt
loop-AES
dm-crypt

  • Le chiffrement fichier par fichier.

On trouve par exemple:
eCryptfs
EncFS

Le but de ce billet n'est pas de comparer les avantages/inconvénients de ces différents logiciels ni de décrire leur installation... mais uniquement de lister les résultats de mes tests de vitesse d'écriture sur le disque dur (non SSD) branché en USB sur mon Raspberry Pi.

Voir ces tests de vitesse sans chiffrement.

- Sans chiffrement
dd if=/dev/zero bs=4096 count=244140 of=/data/file_1GB
999997440 octets (1,0 GB) copiés, 35,4711 s, 28,2 MB/s

- Truecrypt(AES/256)
999997440 octets (1,0 GB) copiés, 229,275 s, 4,4 MB/s

- loop-AES (AES/128)
999997440 octets (1,0 GB) copiés, 164,494 s, 6,1 MB/s

- dm-crypt(LUKS) (AES/256)
999997440 octets (1,0 GB) copiés, 653,715 s, 1,5 MB/s

- eCryptfs (AES/128/fnek)
999997440 octets (1,0 GB) copiés, 187,407 s, 5,3 MB/s

- EncFS (Expert/AES/128/Blocs 4096)
999997440 octets (1,0 GB) copiés, 308,457 s, 3,2 MB/s


dimanche, 28 juillet 2013

sshuttle - VPN / SSH

sshuttle est a mi-chemin entre le VPN et le port forwarding SSH.
Il permet en gros, de faire une sorte de VPN avec juste un serveur SSH en face.

Concrètement, je l'utilise surtout lorsque je suis connecté à des réseaux type "Wifi Hotel".
Je connecte sshuttle vers mon Raspberry chez moi, en écoute en SSH (port 80 et authentification uniquement par clé).
De cette manière tout ce qui sort de mon pc est chiffré quand il passe sur le réseau Wifi, y compris mon trafic Internet, qu'il soit fait par mon navigateur, ou même un simple apt-get.

Il remplace donc avantagement un tunnel SSH avec l'option -D ainsi que l'utilisation de tsocks

Il n'encapsule pas exactement TCP dans TCP, ce qui évite des problèmes de performances réseau.
La partie DNS est "tunnelisée" avec l'option --dns
/!\ UDP (autre que DNS) et ICMP ne passent pas dans le tunnel.

sshuttle est dispo dans les dépots debian, mais pour moi l'authentification par clé ne fonctionnait pas.
Si c'est toujours le cas, passez donc par github pour l'installation de la dernière version:

$ git clone git://github.com/apenwarr/sshuttle
$ cd ./sshuttle

$ curl ip.uggy.org
x.x.x.x
$
$ ./sshuttle --dns -r y.y.y.y:80 0/0
Connected.

On ouvre par exemple un autre terminal

$ curl ip.uggy.org
y.y.y.y
$

Avec la commande sshuttle ci-dessus, toutes les connexions (0/0) DNS et TCP passent par le tunnel SSH (OpenSSH ouvert sur le port 80).
Pas besoin donc de configurer son navigateur pour passer par un proxy Socks, ni d'activer l'option network.proxy.socks_remote_dns, ni d'utiliser tsocks.

On peut utiliser aussi utiliser par exemple:
- l'option -D pour le faire tourner en démon.
- l'option -x pour exclure des réseaux.

Allez voir le README pour toutes les informations.


samedi, 13 juillet 2013

Raspberry sur batterie

J'ai un projet où le Rasp sera autonome, et devra tourner sur batterie.
J'ai donc décidé d'utiliser un modèle A (pas besoin d'Ethernet, 10€ moins cher et consomme moins si pas d'utilisation d'hub USB)

J'ai ensuite acheté:

- un LM2596 à 1,35€ (port inclu).

- Un support pour 6 piles AA (1,22€ port inclu)

- Un cable USB (pour la prise de l'alim)

Le LM2596 à pour but ici de maintenir une tension de 5V pour alimenter le Rasp. Ceci même si les 6 piles accumulateurs AA fournissent 6 x 1.2V. (Pour ce test il s'agit de 2000mAH 1.2V Ni-MH.)

Il suffit de tourner la petite vis pour ajuster la tension de sortie:

lm2596.png

En pratique, j'ai coupé le serveur X et juste utilisé le script suivant (lancé par le cable sérial)

#!/bin/bash
while true
do
echo `date` >> /home/pi/heure
sleep 60
done

$ nohup ./heure.sh &

Une fois qu'il s'est éteint, on regarde le fichier /home/pi/heure pour voir l'heure de début et de fin : 18h27 d'autonomie

D'après mon compteur d'énergie, il consomme dans cette configuration 1.6 W

lm2596-battery.png

Dans mon cas, il y aura quand même des trucs branchés en USB..Il a des chances de consommer comme un modèle B... D'autres tests plus complets seront nécessaires.

A tester également quelques pistes pour le faire consommer moins...


samedi, 18 mai 2013

Renommer les fichiers proprement - detox

Detox est un petit soft qui permet de renommer des fichiers contenant des caractères un peu spéciaux.

J'utilisais jusqu'à présent une "grosse" function dans mon .bashrc pour essayer de faire cela "moi-même".. ce qui fait que je n'étais jamais encore tombé sur ce petit soft.

Vous pouvez éditer le fichier /usr/share/detox/safe.tbl pour modifier le comportement du remplacement des caractères...

Exemple; on créé un fichier avec des caractères un peu spéciaux :

$ touch "éa%b =c+dàe[f)g"
$ detox -v éa%b =c+dàe[f\)g
Scanning: éa%b =c+dàe[f)g
éa%b =c+dàe[f)g -> ea_b_c_dae-f-g
$ ls ea_b_c_dae-f-g
ea_b_c_dae-f-g
$


Le fichier à été renommé en supprimant tous les caractères particuliers.

Dans la vraie vie c'est surtout pratique pour renommer les trucs téléchargés (légalement bien entendu).

Pour plus d'infos:

man detox
man detox.tbl
man detoxrc

mercredi, 8 mai 2013

Monter une image disque (.img) contenant plusieurs partitions

Le RaspberryPi nécessite 2 partitions et les OS sont généralement founis en .img

J'avais besoin de comparer certains fichiers entre mon installation Rasbian et la distribution Raspbmc.

Je télécharge donc raspbmc-final.img sur mon laptop puis:

$ mkdir mount
$ sudo fdisk -l raspbmc-final.img

Disk raspbmc-final.img: 1363 MB, 1363148800 bytes
4 heads, 32 sectors/track, 20800 cylinders, total 2662400 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000d692e

Device Boot Start End Blocks Id System
raspbmc-final.img1 4096 147455 71680 c W95 FAT32 (LBA)
raspbmc-final.img2 151552 2662399 1255424 83 Linux

Si on veut monter la 1ère partition qui démarre au sector 4096, l'offset à utiliser est donc 512x4096=2097152

$ sudo mount -o loop,offset=2097152 raspbmc-final.img mount/
$ cat mount/cmdline.txt
dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootfstype=ext4 noatime quiet rootwait loglevel=1 zram.num_devices=2
$ sudo umount mount/

Si on veut monter la 2ème partition qui démarre au sector 151552, l'offset à utiliser est donc 512x151552=77594624

$ sudo mount -o loop,offset=77594624 raspbmc-final.img mount/
$ cat mount/etc/hostname
raspbmc
$ sudo umount mount/

man fdisk
[...] starting offset and the size of each partition is stored in two ways: as an absolute number of sectors [...]

man mount
[...] mount knows about four options, namely loop, offset, sizelimit and encryption [...]



[Edit:] Tassatux m'indique dans le commentaires que kpartx est créé a cet effet:

This tool, derived from util-linux' partx, reads partition tables on specified device and create device maps over partitions segments detected. It is called from hotplug upon device maps creation and deletion.

Voir les commentaires pour les informations supplémentaires.

mardi, 23 avril 2013

Système de fichier Raspberry sur clé ou disque USB

Comme indiqué dans le très bon article de Framboise314, il est interressant, compte tenu de la fiabilité limité des carte SD en écriture, et compte tenu des vitesses d'accès, de placer le système de fichier sur une clé ou disque dur USB.

Les opérations décrites ci-dessous différent de celles de l'article de Framboise314 (mais le but reste le même).
Les principales différences (qui justifient donc un peu ce post) sont:
- Opérations effectuées à partir d'un autre poste GnuLinux (et non depuis le Rasp)
- Opérations comprenant l'installation depuis le fichier .img
- Opérations effectuées en terminal (pas besoin de X, pourrait être scripté, etc.. )
- Pas de copie carte SD -> clé USB (mais .img -> clé USB et .img -> carte SD donc probablement plus rapide ?)
- Utilisation de UUID pour le fstab afin de pouvoir utiliser d'autres disques USB.
- Utilisation d'une clé USB qui n'est pas encore ni partitionée ni formatée.
- L'opération sur la clé USB intervient dans la foulée de l'installation sur la carte SD (pas de déplacement de données perso)

On part du principe que la clé USB est vue sur le PC qui prépare, en /dev/sdb. (/dev/sda étant généralement le disque dur du PC)
Les commandes suivante ne sont PAS a effectuer sur le Rasp (car il n'est pas encore installé :) ..vous me suivez ? ).

/!\ On joue avec dd, avec la table des partitions etc.. Donc n'utilisez les commandes suivantes que si vous les comprenez...

- Lister les partitions

sudo fdisk -l

- Démonter les éventuelles partitions existantes qui se seraient montées automatiquement en insérant la carte SD et la clé USB.

umount /dev/mmcblk0p1 && umount /dev/mmcblk0p2
umount /dev/sdb1 && umount /dev/sdb2

- On claque les 100 premiers Mio du .img sur la carte SD (à priori seuls les 57 premiers Mio devraient suffir)

sudo dd if=/data/RaspberryPi/2013-02-09-wheezy-raspbian.img of=/dev/mmcblk0 bs=1M count=100 && sudo sync

- En même temps, on claque le .img sur la clé USB. On utilise pv pour visualiser l'avancement.

sudo dd if=/data/RaspberryPi/2013-02-09-wheezy-raspbian.img | pv -tpreb | sudo dd of=/dev/sdb bs=4M && sudo sync

- On modifie le fichier cmdline.txt

mkdir /tmp/toto
sudo mount /dev/mmcblk0p1 /tmp/toto
sudo vi /tmp/toto/cmdline.txt

root=/dev/sda2

sudo umount /dev/mmcblk0p1

C'est bien sda2 qui est utilisé car 2ème partition du premier "disque" du Rasp... et je n'ai pas trouvé à la date de rédaction de ce post de moyen de forcer ce paramètre en utilisant UUID :( (mais si quelqu'un à trouvé un moyen qui fonctionne, qu'il laisse un commentaire et sinon j'imagine que ceci pourra changer par un upgrade d'un futur firmware )

- On détermine le UUID de sdb2 (pour le fstab)

sudo partprobe /dev/sdb
sudo blkid | grep sdb2

- On modifie le fichier fstab

sudo mount /dev/sdb2 /tmp/toto
sudo vi /tmp/toto/etc/fstab

/dev/mmcblk0p1  /boot           vfat    defaults,ro          0       0
UUID=XXXXXXXX-AAAA-BBBB-CCCC-YYYYYYYYYYYY / ext4 defaults,noatime 0 0

sudo umount /dev/sdb2

/dev/mmcblk0p1 est donc en ReadOnly (ro) et /dev/sda2 est remplacé par l'UUID correspondant.Ceci permet d'avoir d'indentifier avec certitude le bon disque USB dans le cas où plusieurs sont branchés. Attention a renlever le ReadOnly dans certains cas (Upgrade du firmware - rpi-update / Modif memory_split et donc globalement tout ce qui fait des modifs dans /boot... )

La parition sdb2 ne fait qu'une partie de la taille totale de la clé USB car crée par dd et le .img
Il faut donc l'agrandir.

- Lister les partitions et afficher leur taille de manière lisible

sudo parted -l

- Augmentation de la taille de la partition sdb2
Je ne sais pas comment l'agrandir proprement dit.. donc on va supprimer la référence dans la table des partitions puis la recréer avec la taille totale. Il y a t-il une meilleure méthode ?

sudo fdisk /dev/sdb

Puis utiliser "p" pour noter le point de départ de la seconde partition (Avec la version actuelle de Raspbian et d'Occidentalis c'est 122880)

Command (m for help): d
Partition number (1-4): 2
Command (m for help): n
Select (default p): p
Partition number (1-4, default 2):
First sector (2048-15663103, default 2048): 122880
Last sector, +sectors or +size{K,M,G} (122880-15663103, default 15663103):
Using default value 15663103
Command (m for help): p
Command (m for help): w

sudo parted -l

doit maintenant lister une taille de partition sdb2 prenant la taille quasi totale de la clé USB

- Augmentation de la taille du système de fichier EXT4

sudo e2fsck -f /dev/sdb2
sudo resize2fs /dev/sdb2

A noter qu'on peut également ensuite avec parted supprimer les 2 partitions inutiles:
/dev/mmcblk0p2 (de toute façon on n'utilise pas l'espace additionnel de la SD)
/dev/sdb1 (on pert 57 Mio)

Procédure testée plusieurs fois sur des clés USB différentes, des cartes SD différentes, avec des images différentes (Rasbian/Occidentalis).

Cable console RaspberryPi

Pour prendre la main sur le Rasp sans clavier/souris/écran/réseau, il est possible d'utiliser le port série disponible sur les GPIO.

Un tutorial en anglais est disponible sur l'excellent Adrafruit

Si le prix du cable/convertisseur Adafruit vous semble réberbatif ($10 ou 12€ chez les revendeurs français et sans les frais de ports ), sachez que j'ai pu tester avec succès les 2 "cables/convertisseurs" suivants.

1,37 EUR (Port inclu!)

3,81 EUR les 2 (Port inclu!)

L'un des mots clé semble donc bien être "PL2303" pour chercher d'autres vendeurs.

Sous Gnu/Linux, rien de spécial à installer comme soft/driver (contrairement aux OS privateurs à priori)...
La console du Rasp est ensuite accessible par la commande:

sudo screen /dev/ttyUSB0 115200

vendredi, 12 avril 2013

Tests vitesse accès disque RaspberryPi

Les tests ont étés réalisés avec dd sur RaspberryPi.

Pour l'écriture, on "lit" depuis /dev/zero ce qui fait que la vitesse de lecture n'est pas un frein.

dd if=/dev/zero bs=xxxx count=yyyy of=file_1GB

Pour la lecture, on "écrit"vers /dev/null ce qui fait que la vitesse d'écriture n'est pas un frein.

dd if=file_1GB of=/dev/null bs=xxxx

Les tests ont été réalisés en jouant avec un fichier d'une taille de 1 Gio mais avec différentes valeurs de bs.

La taille à priori optimale de bs est déterminée en utilisant la commande:

stat -c "%o" file_1GB

D'autres commandes peuvent être utile pour déterminer bs

fdisk -l /dev/sda1 | grep "I/O size"
dumpe2fs /dev/sda1 | grep -i "Block size"

A titre d'information, il semblerait que la commande "cp" utiliserait un bs de 4096 octets.

Les tests ont étés réalisés sans une utilisation parallèle du bus USB (pas d'autre périphérique sur les ports USB, utilisation ethernet limitée aux commandes passées en SSH )


  • Clé USB Corsair EXT4

- bs=4096
Écriture: 29.2 MB/s
Lecture: 27.1 MB/s

Afin de démontrer l'importance de la valeur de bs pour les tests, test avec 1024:

- bs=1024
Écriture: 15.5 MB/s
Lecture: 21.7 MB/s

  • Clé USB Corsair FAT32

- bs=16384
Écriture: 20.7 MB/s
Lecture: 26.0 MB/s

- bs=4096
Écriture: 20.1 MB/s
Lecture: 26.9 MB/s

  • Disque Dur USB FAT32

- bs=4096
Écriture: 21.3 MB/s
Lecture: 25.1 MB/s

- bs=32768
Écriture: 21.6 MB/s
Lecture: 24.7 MB/s

  • Disque Dur USB EXT4

- bs=4096
Écriture: 31.1 MB/s
Lecture: 24.0 MB/s

Ne me demandez pas pourquoi la vitesse d'écriture est parfois supérieure à la vitesse de lecture.

dimanche, 31 mars 2013

Consommation électrique RaspberryPi

Ayant fait l'acquisition d'un compteur d'énergie, je me suis livré à quelques mesures avec le Rasp (modèle B) ( 800 Mhz - cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq ) et quelques accessoires.

  • Rasp - Raspbmc écran d'acceuil XBMC: ~ 3.1 W
  • Rasp - Rascpbmc lecture vidéo Youtube: ~ 3.3 W
  • Rasp - Raspbian sans rien faire: ~3.0W
  • Rasp - Raspbian pendant apt-get upgrade: ~3.6W
  • Hub USB alimenté +Rasp (alimenté par le hub) + ports USB reliés entre eux (ce qui change la conso): ~ 4.0W
  • Hub USB alimenté: ~0.9W
  • Hub USB alimenté +Rasp (alimenté par le hub) + clé USB: ~ 4.2W
  • Clé USB: ~ 0.2W
  • Hub alimenté +Rasp (alimenté par le hub)+ clé USB + disque dur USB 2.5" (pas SSD): ~6.1W
  • Disque dur USB 2.5" (pas SSD): ~ 1.9W

D'après la page des tarifs EDF, un Rasp (4W) allumé 24/24 (en abonnement heures pleines/creuses) coûte donc 4,36€ d'électricité par an.

mardi, 15 janvier 2013

Telécommande XBMC RaspberryPi

J'utilise le récepteur USB infrarouge acheté une bouchée de pain chez DX avec ma télécommande universelle Logitech.

Pour faire fonctionner le tout sous RaspBmc, j'ai du effectuer:

cp /etc/lirc/lircd.conf /etc/lirc/lircd.conf.bak
mv /etc/lirc/rc6-mce-lircd.conf /etc/lirc/lircd.conf
vi /etc/modules
lirc_rpi
reboot

mercredi, 31 octobre 2012

Underscore et DNS

  • On ne peut PAS avoir un underscore dans un nom (record A, CNAME)

A "name" (Net, Host, Gateway, or Domain name) is a text string [...] drawn from the alphabet (A-Z), digits (0-9), minus sign (-), and period (.)

RFC952

Certaines parties de cette RFC (longueur du nom etc..) ne sont plus d'actualité car mises à jour dans des RFC plus récentes, mais a priori rien n'a changé pour la partie qui indique que l'underscore n'est pas authorisé pour un nom.


  • On peut avoir un underscore dans d'autres type d'enregistrement (SRV, TXT etc.. )

The format of the SRV RR

_Service._Proto.Name TTL Class SRV Priority Weight Port Target

An underscore (_) is prepended to the service identifier to avoid collisions with DNS labels that occur in nature.

RFC2782


Bind ignore tout simplement un enregistrement A qui contient un underscore.

- page 1 de 42