Multiseat/Config

De Wiki Ubuntu Party
Aller à : navigation, rechercher

La mise en place d'un Multiseat fonctionne bien sous Ubuntu mais nécessite une configuration logiciel assez peu documentée.



  • Notes suite aux prestations 2012

Nous utilisons maintenant des LXC pour que chaque poste soit maître chez lui (droits sudo).

Il s'avère plus pratique de séparer les X par carte graphique. Ainsi, xrandr fonctionne et peut être exploité par les scripts pour automatiser certaines taches. En revanche il n'est plus possible de déplacer n'importe quel écran vers n'importe quelle position.

Ubuntu 12.04 fonctionne bien, avec Unity-2D. Pour les prochaines versions d'Ubuntu il faudra trouver une solution pour l'accélération 3D : virtualGl ? xephyr patché ?

Concernant les claviers-souris et le son, nous pouvons envisager d'utiliser des raspberrypi (par exemple) pour en déporter la gestion.


Attention, si au lancement de X il y a des input/output error, il faut envisager d'ajouter de la vmalloc (GRUB_CMDLINE_LINUX_DEFAULT) :

 vmalloc=192MB

La configuration qui suit suppose un multiseat de 4 postes.

  • Installer quelques prérequis
 apt-get install xserver-xephyr wmctrl aosd-cat
 # au delà de lucid, il semble nécessaire de choper la version de lucid (ephyr qui remplace evdev ne gère pas les inputdevices de la même façon, voire mal)
 wget https://launchpad.net/ubuntu/+archive/primary/+files/xserver-xephyr_1.7.6-2ubuntu7.6_i386.deb
 dpkg -i xserver-xephyr_1.7.6-2ubuntu7.6_i386.deb
 for user in 0 1 2 3; do adduser charrue$user --disabled-password --gecos multiseatuser;done
 vim /etc/init.d/charrues
#!/bin/sh
### BEGIN INIT INFO
# Provides:          charrues
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Should-Start:      xfs $named slapd hal
# Should-Stop:       xfs $named slapd hal
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

set -e
PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/usr/local/bin/charrues
test -x $DAEMON || exit 0
. /lib/lsb/init-functions

case "$1" in
  start)
      log_daemon_msg "Starting X display manager" "charrues"
      $DAEMON
      log_end_msg 0
  ;;
  restart)
    /etc/init.d/charrues start
  ;;
  stop)
    log_daemon_msg "Stopping X display manager" "charrues"
    pkill charrues
    pkill X
    log_end_msg 0
  ;;
  *)
    echo "Usage: /etc/init.d/charrues {start|stop|restart}"
    exit 1
    ;;
esac

exit 0
 vim /usr/local/bin/charrues
#!/bin/bash
SEAT=/usr/local/bin/charrues_add_seat
OSD=/usr/local/bin/charrues_osd

pkill -9 $SEAT
pkill X
echo -n "On tue X"
while [ ! -z "`pgrep X`" ]; do sleep 2; echo -n ".";pkill -9 X;done

/usr/bin/X -br -audit 0 -dpms -s 0 -logverbose 20 &
sleep 1

# $SEAT  n  user       resolution   position
#        |  |          |            `-------- X position, 0 fo seat 1, 1024 for seat 2 if seat 1 is 1024x768
#        |  |          `--------------------- screen resolution (800x600, 1024x768, 1280x1024)
#        |  `-------------------------------- username used for the session
#        `----------------------------------- seat number, first is 1, sequential (no jump!)

$SEAT    1  charrue0     1280x1024          0
$SEAT    2  charrue1     1280x1024       1280
$SEAT    3  charrue2     1280x1024       2560
$SEAT    4  charrue3     1280x1024       3840
$SEAT    5  charrue4     1280x1024       5120
$SEAT    6  charrue5     1280x1024       6400

# ecrans 17"
#$SEAT    1  charrue0     1024x768          0
#$SEAT    2  charrue1     1024x768       1024
#$SEAT    3  charrue2     1024x768       2048
#$SEAT    4  charrue3     1024x768       3072
#$SEAT    5  charrue4     1024x768       4096
#$SEAT    6  charrue5     1024x768       5120


sleep 10 # on attend approximativement 10sec que tout se lance et on rappelle la numérotation des écrans
for dsp in 1 2 3 4;do $OSD $dsp;done

 vim /usr/local/bin/charrues_add_seat

#!/bin/bash
XEPHYR=/usr/bin/Xephyr
GNOME=gnome-session
OSD=/usr/local/bin/charrues_osd

XEP_DISPLAY=$1
XEP_USERLOG=$2
XEP_SCRSIZE=$3
LASTXPOS=$4

# nettoyage user
tar czf /root/$XEP_USERLOG.`date '+%H.%M.%S.%d-%m-%y'`.tgz /home/$XEP_USERLOG
rm -rf /home/$XEP_USERLOG
cp -r /etc/skel /home/$XEP_USERLOG
chown -R $XEP_USERLOG /home/$XEP_USERLOG

echo -n "X tourne t-il ? "
while [ -z "`pgrep -lf 'X '`" ]
do
  sleep 1
  echo -n "."
done 
echo "[OUI]"

XEP_MOUSEID=`ls -1 /dev/input/by-id/*Mouse-event* | head -n $XEP_DISPLAY | tail -n 1`
XEP_KEYBDID=`ls -1 /dev/input/by-id/*Keyboard-event* | head -n $XEP_DISPLAY | tail -n 1`
echo "-> clavier $XEP_KEYBDID pour DISPLAY $XEP_DISPLAY"
echo "-> souris $XEP_MOUSEID pour DISPLAY $XEP_DISPLAY"
echo 
echo -n "Lancement de Xephyr sur DISPLAY $XEP_DISPLAY en $XEP_SCRSIZE"
DISPLAY=:0 $XEPHYR -ac :$XEP_DISPLAY -screen $XEP_SCRSIZE -mouse evdev,,device=$XEP_MOUSEID -keybd evdev,,device=$XEP_KEYBDID,xkbrules=xorg,xkbmodel=evdev,xkblayout=fr &
XEP=
while [ -z "$XEP" ]
do 
  sleep 1
  XEP=$(xwininfo -root -children -display :0 | grep "Xephyr on :$XEP_DISPLAY" --max-count=1)
  echo -n '.'
  if [ -z "`pgrep -lf 'X '`" ];
  then
    echo "serveur X introuvable."
    exit
  fi
done
echo " [OK]"
echo -n "Placement du Xephyr"
DISPLAY=:0 wmctrl -i -r ${XEP} -e 0,$LASTXPOS,0,-1,-1
$OSD $XEP_DISPLAY
echo " [OK]"
while true;
 do
 if [ -z "`pgrep -lf 'Xephyr -ac :'$XEP_DISPLAY`" ];
 then
   echo "Xephyr introuvable."
   exit
 fi
 if [ -z "`pgrep -lu $XEP_USERLOG $GNOME`" ]; 
 then
   echo "Lancement gnome sur DISPLAY $XEP_DISPLAY";
   DISPLAY=:$XEP_DISPLAY su -l $XEP_USERLOG -c "$GNOME --session 2d-gnome";
   sleep 2
   $OSD $XEP_DISPLAY
 fi;
 sleep 2;
done &

LASTXPOS=$(( $LASTXPOS + `echo $XEP_SCRSIZE | cut -d x -f 1`))
 vim /usr/local/bin/charrues_osd
#! /bin/bash
Xosd=$1
Font="bitstream bold 80"
Time=30000
echo "$Xosd >" | DISPLAY=:$Xosd aosd_cat -u $Time --font="$Font" &
echo "< $Xosd" | DISPLAY=:$Xosd aosd_cat -x 930 -u $Time --font="$Font" &
 chmod +x /etc/init.d/charrues /usr/local/bin/charrues*
 update-rc.d -f gdm remove
 update-rc.d charrues defaults

ajouter 2 au stop runlevel de gdm dans /etc/init/gdm.conf -> stop on runlevel [0126]

 /etc/init.d/charrues start

Outils

  • lister toutes les sessions Xephyr, leurs dimensions et positions :
 xwininfo -root -children -display :0
  • tuer la session 6 :
 pkill -f 'Xephyr -ac :6'
  • /usr/local/bin/charrues_screenswitch
#! /bin/bash
X_a=$1
X_b=$2
X_a_info=`xwininfo -root -children -display :0 | grep "Xephyr on :$X_a" --max-count=1`
X_b_info=`xwininfo -root -children -display :0 | grep "Xephyr on :$X_b" --max-count=1`
X_a_pos=`echo -n $X_a_info | sed 's/.*[0-9]\+x[0-9]\++\([0-9]\+\)+[0-9].*/\1/'`
X_b_pos=`echo -n $X_b_info | sed 's/.*[0-9]\+x[0-9]\++\([0-9]\+\)+[0-9].*/\1/'`
X_a_id=`xwininfo -root -children -display :0 | grep "Xephyr on :$X_a" --max-count=1 | tr -d ' ' | cut -d '"' -f 1`
X_b_id=`xwininfo -root -children -display :0 | grep "Xephyr on :$X_b" --max-count=1 | tr -d ' ' | cut -d '"' -f 1`
DISPLAY=:0 sudo wmctrl -i -r $X_a_id -e 0,$X_b_pos,0,-1,-1
DISPLAY=:0 sudo wmctrl -i -r $X_b_id -e 0,$X_a_pos,0,-1,-1
charrues_osd $X_a
charrues_osd $X_b
  • Calculer le décalage pour les écrans d'une même résolution
width=1366 ; for i in {1..6}; do echo -n "$i × $width = " ; echo "$width*$i" | bc ; done
  • Calculer les décalage pour des écrans de résolution différente
sizes="1024 1280 1366 1366 1024"
offset=0 ; for s in $sizes; do echo $offset ; offset=$(($offset+$s)) ; done

Voir les astuces et recommandations pour les postes en libre service