Monthly Archives: F Y

Méthodes de contrôle à distance d’une SBC (exemple avec la Cubieboard)

* Port série
* SSH
* SSH + X11
* XDMCP
* Protocole X
Port série/UART/RS232

Si il n’y a pas de réseau, dans la séquence U-boot, ou pour d’autres raisons. Connecté via (remplacer le x par le numéro correspondant) :
* Un câble série entre l’ordinateur de contrôle et la carte contrôlée (CubieBoard ici) et utiliser le port /dev/ttySx.
* Un câble/adaptateur USB<=> série standard (comme compatible PL2303, CH340, FT2232C…) et utiliser le port /dev/ttyUSBx.

Branchement du port série sur la Cubieboard

Branchement du port série sur la Cubieboard

Voir aussi cet article, section Premiers tests de démarrage

Quelques commandes possibles (en terminal) pour se connecter en série. Les arguments des exemples sont avec câble USB-série (/dev/ttyUSB0), pour un câble série utiliser à la place /dev/ttyS0 (ou 1 pour le second, etc)

Paquet              commande
busybox             busybox microcom -t 5000 -s 115200 /dev/ttyUSB0
minicom             minicom -D /dev/ttyUSB0 
gtkterm-git (AUR)   gtkterm -s 115200 -p /dev/ttyUSB0
python-pyserial     python -m serial.tools.miniterm /dev/ttyUSB0 115200
screen              screen /dev/ttyUSB0 115200
tinyserial          com /dev/ttyUSB0 115200
picocom             picocom --baud 115200 /dev/ttyUSBS0

Il est possible de changer les paramètre d’un ttyS/ttyUSB à l’aide de la commande stty (voir man stty)

stty -F /dev/ttyUSB0 cs8

Les commandes suivantes ont une interface graphique, ici nom du paquet Arch Linux (AUR)
* gtkterm-git (AUR)
* easyterm (AUR)

SSH

ssh utilisateur@cubieboard

SSH + affichage d’application X via tunnel SSH

Il faut d’abord vérifier que le transfert X11 via SSH est autorisé. Pour cela, il faut vérifier que dans /etc/ssh/sshd_config, vous avez bien :

X11Forward yes

Si ça n’était pas le cas, il faut relancer le service SSH après modification, puis:

ssh -X utilisateur@cubieboard

Si cette erreur apparaît

Xlib:  extension "RANDR" missing on display "localhost:10.0".

Se déconnecter et réessayer avec :

ssh -Y utilisateur@cubieboard

Avec cette méthode, concernant les applications 3D :
* Si OpenGL ou OpenGL ES purement logiciel, cela passera (mais lentement).
* Si OpenGL ES accéléré, ça ne marche pas.
Une solution de contournement, utliser LLVMpipe (la plus rapide des implémentations logicielles), Il y aura OpenGL complet mais dont le rendu ne sera fait que par le CPU/SIMD :

LIBGL_ALWAYS_SOFTWARE=1 $application

ou bien

export LIBGL_ALWAYS_SOFTWARE=1
$application

XDMCP

Avec cette méthode à propos des applications 3D :
* OpenGL logiciel ou OpenGL ES (logiciel ou avec accélération matérielle), ne fonctionne pas du tout, du moins en cas de mélange x86 <-> ARM. Il est toujours possible d’utiliser LLVMpipe

Attention XDMCP va écouter sur le port 177 en TCP, penser à le protéger sur un poste nomade ou qui n’est pas derrière un parre-feu

Vous pouvez le protéger comme suit (il faut être root ou le faire en sudo), si vous n’avez pas encore de règle. On définit d’abord l’adresse IP du seul host à autoriser dans la variable HOST_A_AUTORISER (j’ai donné 192.168.0.2 pour l’exemple, il faut le remplacer). Il peut être nécessaire d’autoriser la sortie si vous avec un DROP par défaut (ce que je conseillerais plutôt)

HOST_A_AUTORISER=192.168.0.2
iptables -I INPUT -p tcp --dport 177 -m comment --comment "interdit tout XDMCP" -j DROP
iptables -I INPUT -p tcp --dport 177 -s ${HOST_A_AUTORISER} -m comment --comment "autorise host toto XDMCP" -j ACCEPT

Sur la Cubieboard, ajouter dans /etc/lightdm/lightdm.conf

[XDMCPServer]
enabled=true

puis redémarrer lightdm comme suit :

service lightdm restart

Sur le poste de contrôle :
* Installer le paquet xnest si nécessaire, puis

Xnest :1 -query cubieboard

VNC

Sur la cubieboard. Installer un serveur VNC, par exemple tightvncserver (vnc4server exigera un mot de passe) :

apt-get install tightvncserver

Ajouter dans /etc/lightdm/lightdm.conf :

[VNCServer]
enabled=true

Attention XDMCP va écouter sur le port 177 en TCP, penser à le protéger sur un poste nomade ou qui n’est pas derrière un parre-feu

Vous pouvez le protéger comme suit (il faut être root ou le faire en sudo), si vous n’avez pas encore de règle. On définit d’abord l’adresse IP du seul host à autoriser dans la variable HOST_A_AUTORISER (j’ai donné 192.168.0.2 pour l’exemple, il faut le remplacer). Il peut être nécessaire d’autoriser la sortie si vous avec un DROP par défaut (ce que je conseillerais plutôt)

HOST_A_AUTORISER=192.168.0.2
iptables -I INPUT -p tcp --dport 5900 -m comment --comment "interdit tout VNC" -j DROP
iptables -I INPUT -p tcp --dport 5900 -s ${HOST_A_AUTORISER} -m comment --comment "autorise host toto VNC" -j ACCEPT

puis redémarrer lightdm comme suit :

service lightdm restart

Sur le poste de contrôle :
* Installer le paquet xvncviewer si nécessaire, puis

xvncviewer cubieboard

Protocole X

Il est également possible de lancer une application à distance via le protocol X, c’est un peu comme le tunnel X11 SSH mais en plus direct, sur un test glxgears LLVMpipe on passe de 17fps en tunnel SSH à 20fps en direct. C’est une des méthodes les plus complexes à mettre en place. Il ne faut l’utiliser que si le poste est protégé par un routeur en mode NAT avec un par feu limitant les adresses IP autorisées, sur un réseau local, ou éventuellement au travers d’un tunnel encrypté du genre VPN, mais avec bon chiffrement, car peut être très dangereux.

Par défaut, le protocole tcp X est désactivé sur le serveur X des distributions récentes. Pour l’activer, il faut modifier la ligne de /etc/X11/xinit/xserverrc en retirant la directive -nolisten tcp, à faire sur le serveur X (donc le poste client qui affichera l’application). Cela donnera quelque chose comme ça (attention, cela ne marche pas avec systemd) :

#!/bin/sh
#exec /usr/bin/X -nolisten tcp "$@"
exec /usr/bin/X "$@"

Attention XDMCP va écouter sur le port 6000 en TCP, penser à le protéger sur un poste nomade ou qui n’est pas derrière un parre-feu

Vous pouvez le protéger comme suit (il faut être root ou le faire en sudo), si vous n’avez pas encore de règle. On définit d’abord l’adresse IP du seul host à autoriser dans la variable HOST_A_AUTORISER (j’ai donné 192.168.0.2 pour l’exemple, il faut le remplacer). Il peut être nécessaire d’autoriser la sortie si vous avec un DROP par défaut (ce que je conseillerais plutôt)

HOST_A_AUTORISER=192.168.0.2
iptables -I INPUT -p tcp --dport 6000 -m comment --comment "interdit tout X11" -j DROP
iptables -I INPUT -p tcp --dport 6000 -s ${HOST_A_AUTORISER} -m comment --comment "autorise host toto X11" -j accept

Il faut ensuite relancer le serveur X.

Puis sur le poste client contenant le serveur X, il faut autoriser le serveur d’application à accéder à X :

xhost + $serveur_application

Et ajouter les règles d’autorisation de pare-feu. Par exemple, sur un poste utilisant le noyau Linux (interface locale est typiquement eth1 ou autre à déterminer :

iptables -I INPUT -s $serveur_application -d $serveur_X -i $interface_locale -p tcp -m tcp --dport 6000 -j ACCEPT -m comment --comment --comment "connexions X"
iptables -I OUTPUT -d $serveur_application -s $serveur_X -o $interface_locale -p tcp -m tcp --sport 6000 -j ACCEPT -m comment --comment "connexions X"

Sur le serveur d’application c’est le contraire :

iptables -I OUTPUT -s $serveur_application -d $serveur_X -o $interface_locale -p tcp -m tcp --dport 6000 -j ACCEPT -m comment --comment "connexions X"
iptables -I INPUT -d $serveur_application -s $serveur_X -i $interface_locale -p tcp -m tcp --sport 6000 --dport 1024: -j ACCEPT -m comment --comment "connexions X"

Sur le serveur d’application, il faut alors définir le client. Typiquement, sous bash :

export DISPLAY $serveur_X:0

Pour des raisons de sécurité et séparation des interfaces il est possible de l’afficher sur une session X différente de celle utiliser pour les travaux locaux (il faut dans ce cas tout préparer) :

export DISPLAY $serveur_X:1

Tester avec une commande de base xterm, xclock ou autre. Si ça fonctionne bien, cela devrait fonctionner avec n’importe quelle application.

Installer ubuntu-13.10 beta ARM sur Cubieboard2 depuis une autre système ARM Cubie :)

Travail en cours : Il y aura au boot des problèmes pour le dhcp automatique et l’horloge tant que le paquet de distribution *-desktop ne sera pas installé, j’ai encore besoin de trouver les paquets nécessaires à résoudre cela sans installer un bureau complet

Ubuntu 13.10 Saucy sur Cubieboard2

Ubuntu 13.10 Saucy sur Cubieboard2

Dans mon cas, je pars du système avec u-boot et noyau précédemment installés, ce qui facilite les chose.
Continue reading

Accélération 2D/3D/Vidéo sur la cubieboard2 (et MyPaint v1.1 + tablette graphique Wacom)

J’ai réussi ce week-end à obtenir, finalement assez facilement un support matériel relativement complet de la Cubieboard2. Il a fallu pour cela utiliser la version stage (bêta) du noyau Linux-Sunxi, ainsi que suivre pas à pas une page d’explication de la compilation du noyau sur le wiki de linux-sunxi.org. J’en ai profité pour traduire en français et améliorer certaines pages de documentation.

Focus qui a crée l’image système à l’origine de mes modifications, a aussi crée un article sur le sujet en s’inspirant de certaines de mes recommandations et maintenant, l’image modifiée est disponible dans la section download de cubieboard.org. Vous pouvez tout de même lire la suite pour comprendre comment faire dans le cas d’une autre distribution (j’ai du l’appliquer de nouveau certaines de ces règles pour ma version de (l/x)ubuntu 13.10
Continue reading

Créer des partitions disque alignées pour améliorer les performances, et réduit l’usure des SSD

Aligner les partitions d’un disque sur ses cylindres, c’est, sachant que les données les plus fréquentes tiennent sur un cylindre :

* Éviter de lire deux cylindres lorsqu’un seul est utile => gain de temps à la lecture, réduction de l’utilisation inutile des caches, gain de bande passante.
* Éviter d’écrire deux cylindres lorsqu’un seul est suffisant => gain de temps, réduction de l’utilisation inutile des caches, gain de bande passante et moins d’usure
* Pour la raison précédente, permet de prolonger grandement la vie d’un SSD (le nombre de cycle est limité sur un SLC, encore plus sur un MLC, et beaucoup plus sur un TLC, mais le prix de ce dernier est le plus bas au Go).

Un moyen simple de savoir si vos partitions sont alignés sur les cylindres

Lancer cfdisk sur le disque qui doit être optimisé (remplacez /dev/sda, par le disque à optimiser : /dev/sdb, /dev/sdc…) :

cfdisk /dev/sda

Si vous voyez une astérisque (ou étoile) tout à fait à droite, la partition n’est pas alignée sur les cylindres. Dans mon cas, ce SSD est à refaire complètement (sauf sda3) :

                           cfdisk (util-linux 2.20.1)

                           Unité disque : /dev/sda
                   Taille : 240057409536 octets,  240.0 Go
          Têtes : 255   Secteurs par piste : 63  Cylindres : 29185

    Nom         Ind.       Partition  S. Fic.          [Étiq.]        Taille (Mo
)------------------------------------------------------------------------------
                            Pri/Log   Espace libre                         1,05*
    sda1        Amorçage    Primaire  ext4                             51158,98*
                            Pri/Log   Espace libre                         1,22*
    sda2        Amorçage    Primaire  ext4                             53686,01*
                            Pri/Log   Espace libre                         0,41*
    sda3                    Primaire  ext4                            135207,16
                            Pri/Log   Espace libre                         2,62*





     [   Aide   ]  [ Nouvelle ]  [ Afficher ]  [ Quitter  ]  [ Unités  ]
     [ Écrire  ]

           Créer une nouvelle partition à partir de l'espace libre

Comment crée une seule partition, utilisant tout le disque, et bien alignée

Grâce à des anciens mode de fonctionnement de fdisk. J’ai trouvé l’astuce sur une doc d’ubuntu.

Remplacer /dev/sdX par le disque sur lequel vous désirez créer la partition alignée :

fdisk /dev/sdX
c
u
p
n
[touche entrée]
[touche entrée]
[touche entrée]
[touche entrée]
w

Et voilà, vous verrez le beau résultat sur cfdisk

Pour créer plusieurs partitions alignées : Choisissez les bonnes options où j'ai mis quatre fois [touche entrée] et recommencer n à chaque partition.