Merci de cliquer ici si vous souhaitez vous inscrire sur le forum.

Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Terminaux légers/serveur pour Primtux 3 amd64 legacy et Raspberry Pi
#1
[h]Linux Terminal Server Project (LTSP][/h]
En 2015, à l’occasion d’une discussion avec notre directrice d’école, il s’est
avéré que l’état du parc informatique dans sa classe de petite et moyenne sections était bien en
dessous de ses besoins. Ceux-ci sont de quatres postes au plus. Considérant le coût important
que peut représenter l’achat de postes informatiques complets (environ 2900 € pour 4 postes),
c’est vers une architecture client-serveur, qui rempli adéquatement les conditions d’économie de
place et de coûts, que mon choix se portera. Le rôle de clients sera attribué aux Raspberry Pi, des
nano-ordinateurs mono-carte de faible coût et peu gourmands en énergie électrique. Le serveur,
qui sera aussi serveur de sauvegardes pour la mairie, fera tourner une distribution éducative. La
machine sera un ordinateur de bureau de bonne facture avec un bon processeur et suffisamment
d’espace disque et de mémoire. L’ensemble fonctionnera sous des systèmes d’exploitation GNU-
Linux. Le choix de Linux s’explique par l’absence de coût d’installation logicielle (pas licences à
payer) et par la fiabilité (peu ou prou de virus) et la stabilité du système, donc de sa maintenance
(très peu de redémarrage des serveurs, etc).


À la recherche d’informations concernant un système clients-serveur à base de Raspberry, je
découvre le projet Linux Terminal Server Project (LTSP)[LTSP]. Celui-ci, grace à debootstrap,
permet de construire un système complet dans un répertoire donné et la commande chroot
permet « d’entrer » dans ce nouveau système.
Dans un premier temp, j’étais convaincu que ce système correspondrait en tout point à mon
projet : LTSP permet en effet de mettre en place assez facilement et rapidement un système
client-serveur linux en recyclant comme clients des machines de faibles puissances ou obsolètes en
regard de la demande croissante en ressources des systèmes actuels. De plus, LTSP est largement
plébicité dans le domaine de l’informatique pédagogique et il existe de nombreux exemples où
il est couplé avec le Raspberry.
Mais dans les faits, l’installation d’un système racine via LTSP est assez longue, et hasar-
deuse si la connexion internet est de qualité moyenne : à la moindre coupure inetrnet, il faut
recommencer toute l’installation du système chrooté.
Nous avons finalement constaté que LTSP n’était qu’une collection de scripts, une sorte
de front-end, utilisant en arrière-plan des outils déjà existants de base sous Linux, conçu pour
faciliter l’installation du système par des utilisateurs n’ayant pas de grandes connaissances en
informatique et pour correspondre à une plage de systèmes assez large.
Il est également clair que LTSP n’est pas fait pour une virtualisation totale car les scripts
ne prennent leur configuration qu’installés en dur dans le système hôte.
LTSP est prévu en fait pour être installé directement sur la machine hôte, comme système
dédié.
Or, pour des questions de sécurité évidentes, car le serveur sera aussi utilisé comme serveur
de sauvegardes pour la mairie, il n’est pas question de mélanger les activités scolaires et les
activités administratives de la mairie dans un même environnement.
Ainsi, devant le manque de documentation et le fait qu’en utilisant les outils sous-jacents
déjà complètement documentés, nous obtiendrions un résultat semblable, nous avons abandonné
LTSP pour ne garder de lui que son gestionnaire de connexion LTSP Display Manager (LDM)
sur les Raspberry.
[h] Les outils de base Unix/GNU/Linux[/h]
En décorticant LTSP, nous avons constaté que :
— l’installation du système chrooté peut se faire sans LTSP, directement avec les outils de
base debootstrap et chroot
— le principe de communication entre les serveur LTSP et les clients est basé sur SSH 2 .
— Nous avons utilisé et configuré le protocole SSH pour la communication entre les Rasp-
berry et le serveur. C’est par SSH, que sont transmises les actions du clavier et de la
souris et par lui encore qu’arrivent les images à l’écran.
Le son est géré à part par le serveur de son Pulseaudio.

[h] La partie logicielle[/h]
Présentation du système
De fait, lors des tests sur les Raspberry avec Raspbian Jessie installée, nous avons pu constaté
l’évolution de SytemVInit vers systemd. Par la suite, j’ai abandonné le principe de chroot pour
celui de conteneur par systemd-nspawn, beaucoup plus simple à mettre en place et à contrôler.
Primtux tournera donc dans un conteneur systemd-nspawn, l’évolution du chroot utilisé dans
LTSP.
Ceci est valable pour primtux 3 amd64 legacy et raspberry sous raspbian stretch lite avec systemd.
Toutes les commandes sont effectuées en tant qu'administrateur root

[h]Les clients raspberry[/h]
Sur le raspberry, on commence par installer l'image sur la carte sd puis au premier lancement, on lance raspi-config pour configurer les locales en fr UTF8, le clavier en français azerty et le fuseau horaire, le nom d'hôte et passer au Predictable Network Interface Names via raspi-config -> Network options -> N3 Network interface names. Ref. : https://www.raspberrypi.org/forums/viewt...p?t=191252

Ensuite on force l'adresse MAC de la carte réseau dans /boot/cmdline.txt en rajoutant à la fin :

Code :
smsc95xx.macaddr=B8:27:EB:XX:XX:XX
(juste changer les 3 derniers couples de valeurs)

Activation du serveur ssh
Créer un fichier texte vide nommé ssh dans le répertoire /boot

Installer les paquets nécessaires au son et LDM

On installe ensuite les paquets suivants : xserver-xorg pulseaudio pulseaudio-module-zeroconf alsa-base ldm fuse et ntfs-3g (pour pouvoir monter les clés usb en ntfs)

Code :
apt-get update && apt-get upgrade && apt-get install xserver-xorg pulseaudio pulseaudio-module-zeroconf alsa-base ldm fuse ntfs-3g

Activation du montage des périphériques de stockages USB

Remplacer la ligne MountFlags=slave par MountFlags=shared dans /lib/systemd/system/systemd-udevd.service
Code :
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=udev Kernel Device Manager
Documentation=man:systemd-udevd.service(8) man:udev(7)
DefaultDependencies=no
Wants=systemd-udevd-control.socket systemd-udevd-kernel.socket
After=systemd-udevd-control.socket systemd-udevd-kernel.socket systemd-sysusers.service
Before=sysinit.target
ConditionPathIsReadWrite=/sys

[Service]
Type=notify
OOMScoreAdjust=-1000
Sockets=systemd-udevd-control.socket systemd-udevd-kernel.socket
Restart=always
RestartSec=0
ExecStart=/lib/systemd/systemd-udevd
KillMode=mixed
WatchdogSec=3min
TasksMax=infinity
MountFlags=shared
MemoryDenyWriteExecute=yes
RestrictRealtime=yes
RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6
puis rebooter

Configuration du réseau

La configuration réseau sera effectuée par le biais de systemd-networkd par DHCP.

Passer de Network Manager à Systemd-Networkd
Il est relativement simple de passer de Network Manager à systemd-networkd (et vice versa).
Tout d'abord, désactivez le service network-manager et activez systemd-networkd comme suit :
Code :
systemctl disable network-manager
systemctl enable systemd-networkd
systemctl start systemd-networkd
Vous devez également activer le service systemd-resolved, utilisé par systemd-networkd pour la résolution de noms de réseau. Ce service implémente un serveur DNS de mise en cache.
Code :
systemctl enable systemd-resolved
systemctl start systemd-resolved
Une fois démarré, systemd-resolved créera son propre fichier resolv.conf dans le répertoire /run/systemd. Cependant, il est courant de stocker les informations de résolution DNS dans /etc/resolv.conf et de nombreuses applications reposent toujours sur /etc/resolv.conf. Pour des raisons de compatibilité, créez un lien symbolique vers /etc/resolv.conf comme suit.
Code :
rm /etc/resolv.conf
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
systemctl restart systemd-resolved
systemctl restart systemd-networkd

Dans /etc/dhcpcd.conf, on change :

Code :
# Use the hardware address of the interface for the Client ID.
clientid
# or
# Use the same DUID + IAID as set in DHCPv6 for DHCPv4 ClientID as per RFC4361.
#duid
Commenter la valeur duid et dé-commenter la valeur clientid pour avoir une demande basée sur l'adresse mac auprès du serveur dhcp

Configuration du serveur de son PulseAudio

On ajoute si il n'y est pas déjà le fichier /etc/asound.conf :
Code :
pcm.!default {
        type hw
        card 0
        device 0
}

ctl.!default {
        type hw
        card 0
        device 0
}
Afin de démarrer pulseaudio en tant que système via systemd, créer le fichier /etc/systemd/system/pulseaudio.service
Code :
[Unit]
Description=PulseAudio daemon

[Install]
WantedBy=multi-user.target

[Service]
Type=simple
PrivateTmp=true
ExecStart=/usr/bin/pulseaudio --system --realtime --disallow-exit --no-cpu-limit
pour autoriser les flux audio en réseau pour pulseaudio, on rajoute à la fin du fichier /etc/pulse/system.pa :
Code :
load-module module-native-protocol-tcp auth-ip-acl=192.168.0.0/16;127.0.0.1
load-module module-zeroconf-publish
et dans la section réseau de /etc/pulse/default.pa :
Code :
### Network access (may be configured with paprefs, so leave this commented
### here if you plan to use paprefs)
#load-module module-esound-protocol-tcp
load-module module-native-protocol-tcp auth-ip-acl=192.168.0.0/16;127.0.0.1
#load-module module-native-protocol-tcp
#load-module module-zeroconf-publish
Lancer manuellement pulseaudio pour vérifier qu'il n'y a pas d'erreurs :
Code :
systemctl start pulseaudio.service
systemctl status pulseaudio.service
et pour le faire se lancer au démarrage :
Code :
systemctl enable pulseaudio.service

Connexion au serveur par LDM

Créer le service /etc/systemd/system/ldm-primtux3-connect.service. On lance le script après l'établissement du réseau. :

Code :
[Unit]
Description=ldm-primtux3-connection
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/root/primtux_client.sh

[Install]
WantedBy = multi-user.target
Le script /root/primtux_client.sh qui est lancé :
Code :
#!/bin/sh

# Préparer le server X (affichage)
/usr/bin/Xorg &
export DISPLAY=:0

# attendre que X se lance
/bin/sleep 5

# Variables pour LDM

export LDM_XSESSION=startfluxbox
export LDM_SSHOPTIONS="-o StrictHostKeyChecking=no -o CheckHostIP=no"
export LDM_SERVER=192.168.2.4

# Lancer LDM qui redémarre automatiquement si il est stoppé
while true
do
  /usr/sbin/ldm
done
Rendre le script executable :
Code :
chmod +x /root/primtux_client.sh

Clonage de la carte SD du Raspberry

Voir ce tuto : http://www.framboise314.fr/clonez-la-car...pberry-pi/. N’oubliez pas de modifier l’adresse MAC dans /boot/cmdline.txt et le nom d’hôte dans raspi-config (ou dans /etc/hostname) après le clonage.

[h]Le serveur headless debian stretch[/h]
(Je n'explique pas tout ici pour le serveur)

Le serveur est installé sur 2 disques durs de 1 TO chacun avec 2 cartes réseau.
Les disques sont partitionnés avec raid 1 logiciel et lvm.

Configuration du réseau

La configuration réseau sera effectuée par le biais de systemd-networkd. Sur les deux cartes réseau présentes physiquement, une sera configurée en DHCP sur un sous-réseau 192.168.10.0/24 et la seconde sera pontée et obtiendra aussi son adresse par DHCP sur le sous-réseau 192.168.2.0/24. Les deux cartes seront de toute manière en adressage statique sur le serveur DHCP. Le conteneur aura une adresse séparée 192.168.2.4/24, dirigée sur le pont, via une interface réseau virtuelle sur l'hôte.

Passer de Network Manager à Systemd-Networkd
Il est relativement simple de passer de Network Manager à systemd-networkd (et vice versa).
Tout d'abord, désactivez le service network-manager et activez systemd-networkd comme suit.
Code :
systemctl disable network-manager
systemctl enable systemd-networkd
systemctl start systemd-networkd
Vous devez également activer le service systemd-resolved, utilisé par systemd-networkd pour la résolution de noms de réseau. Ce service implémente un serveur DNS de mise en cache.
Code :
systemctl enable systemd-resolved
systemctl start systemd-resolved
Une fois démarré, systemd-resolved créera son propre fichier resolv.conf dans le répertoire /run/systemd. Cependant, il est courant de stocker les informations de résolution DNS dans /etc/resolv.conf et de nombreuses applications reposent toujours sur /etc/resolv.conf. Pour des raisons de compatibilité, créez un lien symbolique vers /etc/resolv.conf comme suit.
Code :
rm /etc/resolv.conf
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
Configurer les connexions réseau avec systemd-networkd
Pour configurer les périphériques réseau avec systemd-networkd , vous devez spécifier les informations de configuration dans les fichiers texte avec l’extension .network. Ces fichiers de configuration réseau sont ensuite stockés et chargés depuis /etc/systemd/network. Lorsqu'il y a plusieurs fichiers, systemd-networkd les charge et les traite un par un dans l'ordre lexical.
Commençons par créer un dossier /etc/systemd/network.
Code :
mkdir /etc/systemd/network
Lister les noms des interfaces réseau ( Predictable Network Interface Names ) avec la commande ip link :
Code :
ip link
Code :
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 40:8d:5c:6f:c4:1d brd ff:ff:ff:ff:ff:ff
3: enp4s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP mode DEFAULT group default qlen 1000
    link/ether 3c:8c:f8:21:06:d7 brd ff:ff:ff:ff:ff:ff
Configurons d'abord la première carte réseau enp2s0 pour DHCP. Pour cela, créez le fichier de configuration suivant. Le nom d'un fichier peut être arbitraire, mais rappelez-vous que les fichiers sont traités dans l'ordre lexical.
Code :
nano /etc/systemd/network/enp2s0.network
Code :
[Match]
Name=enp2s0
[Network]
DHCP=v4
La seconde carte réseau sera attribuée au sous-réseau ltsp via un pont (bridge) br0 :
Code :
nano /etc/systemd/network/enp4s1.network
Code :
[Match]
Name=enp4s1

[Network]
Bridge=br0
Création du pont br0 :
Code :
nano /etc/systemd/network/bro.netdev
Code :
[NetDev]
Name=br0
Kind=bridge
Le pont br0 est configuré en DHCP
Code :
nano /etc/systemd/network/bro.network
Code :
[Match]
Name=br0

[Network]
DHCP=v4
Code :
systemctl restart systemd-networkd

Création du conteneur primtux3
Dans /var/lib/container/primtux3 en y copiant une Primtux 3 déjà installée sur une machine virtuelle Virtualbox sur une ordinateur du réseau.
Sur le serveur, à cause des limitations de droits de connexion en ssh, créer auparavant un répertoire de destination intermédiaire dans le compte utilisateur:
Code :
mkdir primtux3_vm
Depuis l’ordinateur sur lequel est installée la machine virtuelle et dans un terminal à l’intérieur de cette même machine virtuelle , en excluant les fichiers et répertoires inutiles au conteneur, copier le système Primtux3 vers le serveur dans le compte utilisateur par rsync  via ssh :
Créer d’abord le fichier d’exclusion :
Le fichier exclud.lst : 
Code :
-------------------- 
/proc 
/tmp 
/mnt 
/etc/fstab 
-------------------- 
Lancer la copie du système sur le port ssh que vous avez déterminé lors de la configuration du serveur openssh (non expliquée ici) :
Code :
sudo rsync -ravHz --exclude-from=exclud.lst -e "ssh -p 222" / user@192.168.X.X:~/primtux3_vm/
Ensuite sur le serveur, copier le répertoire /home/user/primtux3_vm en le renommant vers /var/lib/machines/ :
Code :
cp -a /home/user/primtux3_vm /var/lib/machines/primtux3
Changer le propriétaire du répertoire nouvellement créé pour root :
Code :
ls -l /var/lib/machines/primtux3
chown -R root : /var/lib/machines/primtux3
Créer ensuite un service primtux3 à lancer au démarrage du serveur. Il faut ajouter des directives ExecStartPost qui sont exécutées après le démarrage du conteneur car en cas de redémarrage, systemd-nspawn modifie les UID et les droits des utilisateurs contre une UID unique et enlève le bit setuid de /usr/bin/sudo :

Code :
nano /etc/systemd/system/primtux3.service
Code :
[Unit]
Description=Container primtux3

[Service]
ExecStart=/usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --directory=/var/lib/machines/primtux3 --network-bridge=br0
ExecStartPost =/ bin/bash -c " chown -R root: /var/lib/ machines / primtux3 "
ExecStartPost =/ bin/bash -c " chmod u+s /var/lib/ machines / primtux3 /usr/bin/sudo"
ExecStartPost =/ bin/bash -c " chown -R 1000:1000 /var/lib/ machines / primtux3 /home/administrateur /"
ExecStartPost =/ bin/bash -c " chown -R 1001:1001 /var/lib/ machines / primtux3 /home/01- mini/"
ExecStartPost =/ bin/bash -c " chown -R 1002:1002 /var/lib/ machines / primtux3 /home/02- super /"
ExecStartPost =/ bin/bash -c " chown -R 1003:1003 /var/lib/ machines / primtux3 /home/03- maxi/"

KillMode=mixed
Type=notify
RestartForceExitStatus=133
SuccessExitStatus=133

[Install]
WantedBy=multi-user.target
Pour le lancer au démarrage du système via systemd-nspawn, il faut l'activer ainsi :
Code :
systemctl enable primtux3.service
et pour le lancer manuellement :
Code :
systemctl start primtux3.service

[h]Configuration du son coté serveur[/h]
Toutes les données sont transférées par ssh sauf le son qui l’est par le serveur de son pulseaudio sur les raspberry.
Dans chaque compte, il faut indiquer où aller chercher le serveur de son pulseaudio - c’est-à-dire sur les raspberry : ça se fait dans ~.fluxbox/startup en ajoutant
PULSE_SERVER=$LTSP_CLIENT
export PULSE_SERVER
et aussi pendant qu’on y est
export LANG=fr_FR.UTF-8
afin d’avoir primtux3 en français. Il faut garder le même nombre de lignes au fichier donc on remplace 3 lignes commentées par les précédentes :
Code :
#!/bin/sh
#
# fluxbox startup-script:
#
# Lines starting with a '#' are ignored.

# Change your keymap:
xmodmap "/home/primtux/.Xmodmap"

# Applications you want to run with fluxbox.
# MAKE SURE THAT APPS THAT KEEP RUNNING HAVE AN ''&'' AT THE END.
#
PULSE_SERVER=$LTSP_CLIENT
export PULSE_SERVER
export LANG=fr_FR.UTF-8
# idesk &
#
# Debian-local change:
#   - fbautostart has been added with a quick hack to check to see if it
#     exists. If it does, we'll start it up by default.
which fbautostart > /dev/null
if [ $? -eq 0 ]; then
    fbautostart
fi

# And last but not least we start fluxbox.
# Because it is the last app you have to run it with ''exec'' before it.
exec /usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1 &
exec xfce4-panel &
exec lxpanel &
exec rox -p 1 &
# exec /usr/bin/BNE-Linux &
# exec /usr/local/bin/primtux/handymenu-mini &
# exec /usr/local/bin/primtux/handymenu-super &
# exec /usr/local/bin/primtux/handymenu-maxi &
exec /usr/local/bin/primtux/accueil &
# exec xscreensaver -nosplash &
exec fluxbox
# or if you want to keep a log:
# exec fluxbox -log "/home/primtux/.fluxbox/log"
puis pour ne pas laisser quiconque éteindre ou redémarrer le container ce qui rendrait toute connexion depuis les raspberry inopérante, il faut supprimer dans /usr/share/shutdown/shutdown_gui.glade les lignes 23 à 84 tout ce qui concerne shutdown et reboot et modifier le placement des images dans la fenêtre (plus simplement copiez ce fichier à la place de l’original) :
Code :
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.4.1 on Sat Feb 16 01:52:03 2008 -->
<glade-interface>
  <widget class="GtkWindow" id="ShutdownBox">
    <property name="width_request">350</property>
    <property name="height_request">310</property>
    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
    <property name="title" translatable="yes">PrimTux Shutdown Menu</property>
    <property name="resizable">False</property>
    <property name="modal">True</property>
    <property name="window_position">GTK_WIN_POS_CENTER</property>
    <property name="icon">help-browser.png</property>
    <property name="skip_taskbar_hint">True</property>
    <property name="skip_pager_hint">True</property>
    <property name="urgency_hint">True</property>
    <property name="deletable">False</property>
    <property name="opacity">0</property>
    <child>
      <widget class="GtkLayout" id="layout1">
        <property name="visible">True</property>
        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
        <child>
          <widget class="GtkButton" id="LogoutButton">
            <property name="width_request">210</property>
            <property name="height_request">52</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
            <property name="label" translatable="yes">_Fermer la session</property>
            <property name="use_underline">True</property>
            <property name="response_id">0</property>
            <signal name="clicked" handler="on_LogoutButton_clicked"/>
          </widget>
          <packing>
            <property name="x">36</property>
            <property name="y">86</property>
          </packing>
        </child>
        <child>
          <widget class="GtkImage" id="image3">
            <property name="width_request">62</property>
            <property name="height_request">47</property>
            <property name="visible">True</property>
            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
            <property name="stock">gtk-stop</property>
          </widget>
          <packing>
            <property name="x">41</property>
            <property name="y">91</property>
          </packing>
        </child>
        <child>
          <widget class="GtkButton" id="CancelButton">
            <property name="width_request">210</property>
            <property name="height_request">52</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
            <property name="label" translatable="yes">_Annuler</property>
            <property name="use_underline">True</property>
            <property name="response_id">0</property>
            <signal name="clicked" handler="on_CancelButton_clicked"/>
          </widget>
          <packing>
            <property name="x">37</property>
            <property name="y">168</property>
          </packing>
        </child>
        <child>
          <widget class="GtkImage" id="image4">
            <property name="width_request">50</property>
            <property name="height_request">44</property>
            <property name="visible">True</property>
            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
            <property name="stock">gtk-undo</property>
          </widget>
          <packing>
            <property name="x">46</property>
            <property name="y">168</property>
          </packing>
        </child>
        <child>
          <widget class="GtkImage" id="image5">
          <property name="width_request">67</property>
            <property name="height_request">285</property>
            <property name="visible">True</property>
            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
            <property name="pixbuf">logo.png</property>
            <property name="icon_size">2</property>
          </widget>
          <packing>
            <property name="x">261</property>
            <property name="y">14</property>
          </packing>
        </child>
        <child>
          <widget class="GtkHSeparator" id="hseparator1">
            <property name="width_request">207</property>
            <property name="height_request">20</property>
            <property name="visible">True</property>
            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
          </widget>
          <packing>
            <property name="x">38</property>
            <property name="y">145</property>
          </packing>
        </child>
      </widget>
    </child>
  </widget>
</glade-interface>
J’ai ensuite copier chaque compte, en les renommant pour simplifier, autant de fois qu’il y a de raspberry :
Code :
cp -a /home/01-mini mini1
De même pour super et maxi.
Démarrer le container, se loguer dedans avec
Code :
machinectl login primtux3
créer les utilisateurs correspondants avec adduser et changer les propriétaires des homes pour les utilisateurs nouvellement créés.
Vérifier dans /etc/passwd, changer le shell si nécessaire pour /bin/bash car ssh en a besoin.
Pour sortir du container, taper rapidement 3 fois ] en maintenant la touche control + Alt Gr enfoncée (^]]])

[h]Serveur DHCP[/h]
Je met ici la configuartion du serveur dhcp avec le paquet isc-dhcp-server, mais dans mon cas j’utilise un pare-feu pfSense qui fait office de serveur dhcp (entre autres).
Configuration du serveur isc-dhcp-server. On installe le paquet isc-dhcp-server :
Code :
apt-get install isc-dhcp-server
Ecrire le fichier /etc/dhcp/dhcpd.conf :
Code :
#
# Default LTSP dhcpd.conf config file.
#

authoritative;                                    

subnet 192.168.xx.0 netmask 255.255.255.0 {
    range 192.168.xx.10 192.168.xx.50;            # Plage d'adresse desservie par le serveur DHCP du serveur LTSP
    option domain-name "aaaa.bbbbb.ccc";    # nom DNS du réseau pédagique
    option domain-name-servers 192.168.xx.xx;         # adresse IP du serveur DNS
    option broadcast-address 192.168.xx.255;}
        host rasp1 {
        hardware ethernet B8:27:EB:XX:XX:XX;
        fixed-address 192.168.xx.xx;
        }      

        host rasp2 {
        hardware ethernet B8:27:EB:XX:XX:XX;
        fixed-address 192.168.xx.xx;
        }

        host rasp3 {
        hardware ethernet B8:27:EB:XX:XX:XX;
        fixed-address 192.168.xx.xx;
        }      

        host rasp4 {
        hardware ethernet B8:27:EB:XX:XX:XX;
        fixed-address 192.168.xx.xx;
        }

Voilà !
Le flux vidéo n'est pas toujours terrible, le son parfois haché. Tuxpaint plante à la fermeture, mais contrairement à Eiffel, ça ne fige pas tout le serveur X, il reste possible d'utiliser le reste des applications. Mais dans l'ensemble, c'est quand même fluide. Il y a peut être moyen d'optimiser tout ça.

Il n'y a pas de verrouillage du pavé numérique dans la fenêtre de connexion de ldm et je n’ai pas encore chercher à le faire avec primtux3.

Je l’ai aussi testé sur un odroid-c2 avec une armbian 64 stretch.
To be continued ...

Sources :
https://www.freedesktop.org/software/sys...spawn.html
http://www.olafdietsche.de/2016/06/25/ne...-container
https://wiki.archlinux.org/index.php/systemd-networkd
https://lindenberg.io/blog/post/debian-c...md-nspawn/
http://xmodulo.com/switch-from-networkma...workd.html
https://www.freedesktop.org/wiki/Softwar...orkTarget/
https://www.freedesktop.org/wiki/Softwar...faceNames/
Répondre
#2
Merci d'avoir pris la peine de rédiger ce tuto.
Répondre
#3
Très intéressant.
Ca serait sans doute utile de mettre tout ça sur le wiki.
Peut-être rajouter une intro (avant d’enchaîner les points techniques) avec le pourquoi, la cible de cette installation.

Comme ça, je vois pas mal de manip qui pourraient être automatisé dans un script. (ça pourrait être un taf complémentaire)

Est-ce possible d'expliquer pourquoi Network Manager est remplacé par Systemd-Networkd ?

C'est intéressant de savoir que les efforts effectués pour la rpi permettent également de supporter odroid-c2 !
Répondre
#4
Bonsoir,
Voilà, j'ai rajouté une intro pour expliquer un peu les motivations du projet. Concernant le choix de systemd-networkd, c'est tout d'abord parce qu'il me semble être bien intégré dans systemd, et si je me souviens bien, depuis le temps que je ne l'utilise plus, parce qu'il faut à network-manager un frontend graphique. Alors que, que ce soit sur le serveur, ou sur les raspberry, aucun n'ont d'interface graphique.à part un server x sur les raspi nécessaire pour le gestionnaire de connexion LDM.
Ensuite ce projet date un peu certes, 2016, et si je me souviens bien cela fonctionnait bien sur Odroid-c2 et c'est principalement un vrai port ethernet qui semblait intéressant.. Mais vu le prix de l'odroid, j'ai abandonné l'idée de remplacer les raspi par cette machine.
Quant aux scripts pour faciliter l'installation, je n'en ai pas pris la peine.
Répondre
#5
Merci pour cette intro très utile.

Dans le tuto, pourrais-tu compléter cette partie:
Citation :Les clients raspberry

Sur le raspberry, on commence par installer l'image sur la carte sd ...
Il serait là aussi fort utile de préciser de quelle image système tu parles, voire de donner un lien.

Si l'on s'aperçoit qu'il y a de la demande pour mettre en place cette solution, on pourrait alors travailler à la réalisation de scripts, avec les adaptations nécessaires pour une PrimTux4.
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)