realisations:olive

Olive

Dans le monde de Popeye, le héros est en couple avec Olive, c'est donc le nom de ma tour de bureau ;). Plusieurs configurations matériels et rôles se sont succédées. En plus des fonctions bureautiques et jeux, cette machine a rempli de nombreux services : enregistrements TV et diffusion sur une TV cathodique, serveur de transcode, configuration multi seat 2 puis 3 places… Le choix des composants internes est largement guidé par le silence offert.
Olive
Agrandir
Olive

AMD Athlon

  • Carte mère : Asus A7V8X-X
  • Processeur : AMD Athlon XP 2200+ @1.8 GHz
  • Ram : SDRAM PC133 512 Mo
  • Disques
    • Hitachi Deskstar P7K500 IDE - 320 Go - 16 Mo
    • Samsung Spinpoint T133 - 300 Go
  • OS : Debian i386

09/2005 : pour afficher une image sur ma TV cathodique, j'ai acheté un adaptateur VGA ↔ Composite à bas prix. Ce type de modèle ne possède pas de composant actif ni passif et branche simplement une prise Composite sur 2 broches de la prise VGA.

Adaptateur VGA <-> Composite
Agrandir
Adaptateur VGA <-> Composite

Malheureusement, il faut une carte graphique capable de produire un signal PAL/SECAM sur sa sortie avec une fréquence d'horloge très basse ainsi que de changer la modulation du signal différent du VGA. Le vendeur ayant bien omis de préciser ce petit détail… :@

Caractéristiques :

  • Réception : Analogique hertzien
  • Tuner : 1
  • Connectique : PCI

11/2005 : j'ai acheté une carte Hauppauge PVR-350 afin d'utiliser sa sortie S-Vidéo pour la brancher sur la prise péritel de la TV. La PVR 350 est une carte PCI intégrant un encodeur et un décodeur matériel mpeg2 avec entrée et sortie analogiques. Il suffit de lui envoyer un flux mpeg2 directement sur le bon device et elle le décode en l'affichant sur sa sortie. Elle peut être utilisé en tant que carte graphique “traditionnelle” avec une résolution pour la TV de 720×576 mais sans accélération 3D. Seul le mode XV est disponible.

Carte Hauppauge PVR 350
Agrandir
Carte Hauppauge PVR 350

Tout en conservant l'utilisation “normale” de la tour avec un bureau e16, j'ai configuré un 2e serveur X avec un driver ivtv sur le display :1 utilisant cette carte. Il affichait l'interface Mythtv.

Le choix de cette carte était guidé par le manque de stabilité de la sortie S-Vidéo des drivers libres des cartes ATI Radeon et ma non-confiance dans les drivers propriétaires des 2 marques NVidia et ATI.

Pour piloter l'ensemble, j'utilisais la télécommande et son récepteur infrarouge spécifique fournit avec cette carte. Un script shell était mappé sur l'une de ses touches pour basculer l'affichage du X bureautique ou du X mythtv à l'aide de la commande chvt.

Télécommande
Agrandir
Télécommande

Depuis que Mimosa est actif, cette carte n'est plus en service.

Caractéristiques :

  • Réception : Numérique hertzien (DVB-T)
  • Tuners : 2
  • Connectique : PCI

04/2007 : pour enregistrer des émissions de télévision sur la TNT, j'ai opté pour une carte sur port PCI : Hauppauge WinTV-NOVA-T-500.

Carte Hauppauge NOVA-T-500
Agrandir
Carte Hauppauge NOVA-T-500

Cette carte est composée de 2 tuners USB DVB-T et d'un hub USB 2.0 avec un adaptateur PCI, le tout sur un même circuit imprimé. Le noyau reconnait chacun de ses composants de manière indépendante. C'est une astuce du constructeur qui vend d'autre produit sous forme de clé USB avec ce même tuner.

Le double tuner permet d'enregistrer sur une chaine et d'en regarder une autre. Très confortable et de fait, indispensable pour la suite :).

Caractéristiques :

  • Réception : Numérique câble (DVB-C)
  • Tuner : 1
  • Connectique : PCI

01/2008 : suite à un déménagement, le nouvel appart était câblé et donc plus de DVB-T mais du DVB-C. J'ai fait l'acquisition de 2 cartes PCI SATELCO EasyWatch PCI DVB-C permettant de recevoir la TV numérique par le câble.

SATELCO EasyWatch PCI DVB-C
Agrandir
SATELCO EasyWatch PCI DVB-C

Elles sont reconnues sans problème par le noyau et Mythtv sait également la piloter.

Quad core

09/2008 : cure de jeunesse :gift:

Caractéristiques :

  • Carte mère : Intel DG33FB
  • Processeur : Intel Core 2 Quad Q6600 @2.4 GHz (Révision G0 avec un TDP de 95 W)
  • Radiateur : Noctua NH-U12P
  • Ram : 2 Go
  • Disques
    • 2x Hitachi Deskstar P7K500 S-ATA - 320 Go - 16 Mo
  • OS : Debian amd64

Premier quad core du marché, le Q6600 est disponible en plusieurs revisions, la première chauffait beaucoup, en prenant la “G0”, le TDP a été revu à la baisse. J'ai monté dessus un radiateur Noctua, celui ci est perpendiculaire à la carte mère et est particulièrement gros. Cela permet de dissiper efficacement la chaleur, j'ai également pu adapter un regulateur de température à base de Mofset pour sous alimenter le ventilateur pour diminuer le bruit.

J'ai désolidarisé la cage des disques durs pour la suspendre, ce qui permet de ne pas transmettre les vibrations des disques en rotation au boitier. J'ai utilisé de la ficelle à roti en la faisant passer dans les baies 5“1/4 en haut de la tour pour redescendre jusqu'à la bonne hauteur.

Efficace et simple 8-)

Le ventilateur arrière du boitier est thermo-régulé. Sa sonde de température est installée au bout d'un fil de 30 cm environ permettant ainsi de mesurer la température à un endroit stratégique du boitier et non juste sur le ventilateur comme la plupart des modèles.

Nouvelle tour avec les 2 cartes DVB-C
Agrandir
Nouvelle tour avec les 2 cartes DVB-C

Les émissions enregistrées sont au format mpeg2 et les programmations démarrent 15 min avant et terminent 20 min après l'heure souhaitée. Les fichiers produits sont très gros : ~1.5 Go par heure pour du 480p. Pour gagner de la place, Mythtv intégre un éditeur de publicités pour supprimer ces portions de vidéos des fichiers originaux. Les vidéos sont alors transcodées en mpeg4. Ainsi, j'économise jusqu'à 50% d'espace disque =). Le quad core dévore les transcodes en parallèle.

Le multiseat est la possibilité d'offrir un accès simultané à un même ordinateur pour plusieurs utilisateurs physiques avec chacun sou clavier / souris / écrans / sessions graphiques étanches 8-).
Multiseat

01/2009 : j'ai testé le déport d'affichage à partir d'une 2e machine se connectant à Olive. J'ai utilisé Wimpy pour tester la solution en lançant X via un :

X :1 -query olive

X démarre, les applications graphiquement légères fonctionnent bien mais OpenOffice est lent et saccadé et les vidéos ne se jouent pas :/. C'est “normal”, ce n'est qu'un déport d'affichage, le rendu est calculé sur le serveur puis transmis via le réseau au client pour un bête affichage à la différence d'un X avec une carte graphique locale qui déleste le processeur d'un certains nombre de tâches.

Déport d'affichage
Agrandir
Déport d'affichage

Intégration difficile

02/2009 : ce 2e essai nécessite une carte graphique dédiée à chaque place physique.

Par contre, ma carte mère, ne supporte l'utilisation de sa carte graphique intégrée en plus d'une carte additionnelle (limitation du BIOS :'( ) J'ai ajouté une GeForce 7600 GT en PCI-Express et une GeForce FX 5200 (elle chauffait trop) Ati Radeon 7000 sur bus PCI.

Geforce 7600 GT PCI-Express
Agrandir
Geforce 7600 GT PCI-Express
Ati Radeon 7000 PCI
Agrandir
Ati Radeon 7000 PCI

La version 7.2 de Xorg inclus des options permettant de lancer plusieurs X sur un même VT à l'aide de des options -sharevts et -novtswitch. Cela autorise plusieurs instance de X à s'exécuter réellement simultanément à la différence du lancement traditionnel de plusieurs X sur des displays différents mais sur un même VT et nécessitant de basculer de l'un à l'autre avec les touches CTRL + ALT + F7 ou CTRL + ALT + F8.

Par contre, l'intégration du multiseat dans Debian Lenny est inexistante. Après avoir passé plusieurs très longues soirées à tenter de faire marcher l'ensemble, voici l'état des lieux :

  • il faut configurer le bios pour démarrer sur la carte graphique du bus PCI, sinon celle ci n'est reconnue qu'avec 0 Kbits de ram…
  • à cause de ce paramétrage, il faut lancer un X qui “ping” les cartes graphiques avec l'option -probeonly afin d'initialiser les cartes graphiques;
  • Pour démarrer 2 serveurs avec un même fichier de configuration, il faut spécifier dedans des sections ServerLayout pour chaque place en définissant écran, clavier, souris;
  • GDM n'est pas en mesure de lancer 2 X avec 2 utilisateurs différents, il faut alors s'en passer et tout faire à sa place : lancement du X avec le DISPLAY, le user, le ServerLayout correspondant, lancement du gestionnaire de bureau…

Le problème de cette configuration est qu'elle était très fragile : une mise à jour sur 2 des paquets Xorg ou des drivers NVidia la cassait. A chaque problème, le WAF prends une claque :(. Au final, j'ai verrouillé les mises à jour pour empêcher les problèmes. Mais bien sûr avec le temps, ma distribution vieillissait, je ne pouvais plus installer de nouveaux paquets sans devoir tout mettre à jour…

Configuration manuelle

Voici mes fichiers de configurations et scripts :

le script de démarrage /etc/init.d/multiseat lance les différentes instances de X de la manière suivante :

  • lecture du fichier de configuration /etc/multiseat.conf;
  • pour chaque seat lue, invoque startx-autologin avec le user donné et en lui passant le display et layout;
  • startx-autologin est en charge de lancer le X et de la relancer lorsqu'il plante avec un maximum de 3 tentatives;
  • /etc/X11/xorg.conf.multiseat est la conf de X et contient l'agencement des places Place > Ecran > Carte graphique > Clavier > Souris. Il y a également le chemin du device précis dans /dev pour la souris ou le clavier.
/etc/multiseat.conf
[place1]
layout=Layout1
user=user1
display=:0
 
[place2]
layout=Layout2
user=user2
display=:1
/etc/init.d/multiseat
#! /bin/bash
### BEGIN INIT INFO
# Provides:          multiseat
# Should-Start:      console-screen kbd acpid dbus hal network-manager
# Required-Start:    $local_fs $remote_fs x11-common
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: xorg autologin multiseat
### END INIT INFO
 
# Do NOT "set -e"
 
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
CONF="/etc/multiseat.conf"
DESC="Multiseat"
NAME=multiseat
DAEMON=/usr/local/bin/startx-autologin
 
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
 
#exit 0
 
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
 
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions
 
declare -Ax layout
declare -Ax user
declare -Ax display
 
#
# Function that starts the daemon/service
#
do_start()
{
    ARG_SEAT=$1
    # returns
	#   0 if daemon has been started
    echo -n " ${ARG_SEAT}"
    rm -f /var/run/xorg-autologin-${layout[$ARG_SEAT]}.exit
    /bin/su -l ${user[$ARG_SEAT]} -c "${DAEMON} ${display[$ARG_SEAT]} ${layout[$ARG_SEAT]}" >/home/${user[$ARG_SEAT]}/.xsession-errors 2>&1 &
    return 0
}
 
#
# Function that stops the daemon/service
#
do_stop()
{
    ARG_SEAT=$1
	# Return
	#   0 if daemon has been stopped
	#   1 if daemon was already stopped
	#   2 if daemon could not be stopped
	#   other if a failure occurred
    echo -n " ${ARG_SEAT}"
    touch /var/run/xorg-autologin-${layout[$ARG_SEAT]}.exit
    pkill -u ${user[$ARG_SEAT]} startx-autologin
    pkill -u ${user[$ARG_SEAT]} xinit
	return 0
}
 
 
print_usage()
{
    	cat >&2 << EOC
Usage: $SCRIPTNAME 
    start [seat]
    stop [seat]
    restart [seat]}
EOC
    	exit 3
}
 
read_conf()
{
    while IFS='= ' read var val
    do
        if [[ $var == \[*] ]]
        then
            section=$var
        elif [[ $val ]]
        then
            eval "$var$section=$val"
        fi
    done < $CONF
}
 
check_user() 
{
    if [ "${user[$1]}" == "" ];
    then
        echo -n " seat '$1' unknown" 
        log_end_msg 1
        exit 1
    fi
}
 
read_conf
 
case "$1" in
  start)
	log_daemon_msg "Starting $DESC" 
    set +e
    if [ "$#" -eq 2 ];
    then
        check_user $2
        do_start $2
    elif [ "$#" -eq 1 ];
    then
        for K in "${!layout[@]}"; do do_start $K; done
    else 
    	echo 
        print_usage 
    fi
    set -e
	case "$?" in
		0|1) log_end_msg 0 ;;
		2) log_end_msg 1 ;;
	esac
  ;;
  stop)
	log_daemon_msg "Stopping $DESC"
    if [ "$#" -eq 2 ];
    then
        check_user $2
        do_stop $2
    elif [ "$#" -eq 1 ];
    then
        for K in "${!layout[@]}"; do do_stop $K; done
    else 
    	echo 
        print_usage 
    fi
    set -e
	case "$?" in
		0|1) log_end_msg 0 ;;
		2) log_end_msg 1 ;;
	esac
  ;;
  restart)
        shift
        $0 stop $*
        sleep 1
        $0 start $*
  ;;
  *)
    print_usage
	;;
esac
 
:
/usr/local/bin/startx-autologin
#!/bin/sh
NB_RETRY=3
EXIT_FILE=/var/run/xorg-autologin-$2.exit
 
start() {
    NB=0
    while [ $NB_RETRY -eq 0 ] || [ $NB -lt $NB_RETRY ]
    do
        echo "Exec nb $NB $*" 
        $*
        #if [ $? -eq 0 -o -f $EXIT_FILE ];
        # le process est tjs relance
        if [ -f $EXIT_FILE ];
        then
            exit
        fi
        ps=$(ps auxww | grep -v grep)
        # reboot
        echo $ps | grep -q "/etc/rc.d/rc 6"
        ret=$?
        if [ $ret -eq 0 ]
        then
            exit
        fi
        # shutdown
        echo $ps | grep -q "/etc/rc.d/rc 0"
        ret=$?
        if [ $ret -eq 0 ]
        then
            exit
        fi
        NB=$(($NB + 1))
        sleep 2
    done
}
 
CMD="/usr/bin/xinit -- $1 -layout $2 -sharevts -novtswitch"
start $CMD
/etc/X11/xorg.conf.multiseat
Section "ServerLayout"
    Identifier     "Layout2"
    Screen 0       "LCD2" 0 0
    InputDevice    "Mouse2" "CorePointer"
    InputDevice    "Keyboard2" "CoreKeyboard"
EndSection
 
Section "ServerLayout"
    Identifier     "Layout1"
    Screen 0       "LCD1" 0 0
    InputDevice    "Mouse1" "CorePointer"
    InputDevice    "Keyboard1" "CoreKeyboard"
EndSection
 
Section "Files"
    FontPath        "/usr/X11R6/lib/X11/fonts/local/"
    FontPath        "/usr/X11R6/lib/X11/fonts/misc/"
    FontPath        "/usr/X11R6/lib/X11/fonts/75dpi/:unscaled"
    FontPath        "/usr/X11R6/lib/X11/fonts/100dpi/:unscaled"
    FontPath        "/usr/X11R6/lib/X11/fonts/Type1/"
    FontPath        "/usr/X11R6/lib/X11/fonts/Speedo/"
    FontPath        "/usr/X11R6/lib/X11/fonts/75dpi/"
    FontPath        "/usr/X11R6/lib/X11/fonts/100dpi/"
EndSection
 
Section "InputDevice"
    Identifier     "Mouse1"
    Driver         "evdev"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/input/by-id/usb-Microsoft_Corporation_Microsoft_®_Laser_Mouse_6000-event-mouse"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
    Option         "GrabDevice" "on"
EndSection
 
Section "InputDevice"
    Identifier     "Keyboard1"
    Driver         "evdev"
    Option         "Device" "/dev/input/by-path/platform-i8042-serio-0-event-kbd"
    Option         "XkbModel" "microsoft"
    Option         "XkbRules" "xorg"
    Option         "XkbLayout" "fr"
    Option         "XkbOptions" "altwin:super_win"
    Option         "GrabDevice" "on"
EndSection
 
Section "InputDevice"
    Identifier     "Mouse2"
    Driver         "evdev"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/input/by-id/usb-Logitech_USB_Optical_Mouse-event-mouse"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
    Option         "GrabDevice" "on"
EndSection
 
Section "InputDevice"
    Identifier     "Keyboard2"
    Driver         "evdev"
    Option         "Device" "/dev/input/by-id/usb-_USB_Keyboard-event-kbd"
    Option         "XkbModel" "pc105"
    Option         "XkbLayout" "fr"
    Option         "GrabDevice" "on"
EndSection
 
Section "Monitor"
    Identifier     "Monitor_iiyama"
    ModeLine       "1680x1050_60.00" 147.14 1680 1784 1968 2256 1050 1051 1054 1087 -hsync +vsync
    ModelName      "Idek Iiyama PLE2003WSV"
    HorizSync       31.0 - 83.0
    VertRefresh     55.0 - 76.0    
EndSection
 
Section "Monitor"
    Identifier     "Monitor_iiyama2"
    VendorName     "Unknown"
    ModelName      "Idek Iiyama PL2480H"
    HorizSync       30.0 - 83.0
    VertRefresh     55.0 - 76.0
EndSection
 
Section "Device"
    Identifier     "nvidia 7600 GT"
    Driver         "nvidia"
    Option         "NoLogo" "true"
    Option         "NvAGP" "1"
    Option         "TripleBuffer" "true"
    BusID          "PCI:1:0:0"
EndSection
 
Section "Device"
    Identifier     "radeon 7000"
    Driver         "ati"
    Screen         0
    BusID          "PCI:7:0:0"
EndSection
 
Section "Screen"
    Identifier     "LCD1"
    Device         "nvidia 7600 GT"
    Monitor        "Monitor_iiyama2"
    DefaultDepth    24
    Option         "metamodes" "1920x1080_60_0 +0+0; 1680x1050_60_0 +0+0"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection
 
Section "Screen"
    Identifier     "LCD2"
    Device         "radeon 9200"
    Monitor        "Monitor_iiyama"
    SubSection     "Display"
        Viewport   0 0
        Modes      "1680x1050_60.00" "1440x900"
    EndSubSection
EndSection
 
Section "ServerFlags"
    Option  "HandleSpecialKeys" "Always"
    Option  "AutoAddDevices"    "off"
    Option  "AutoEnableDevices" "off"
    Option  "AllowEmptyInput"   "off"  
EndSection

14.04 : Works out of the box

J'ai refait ma configuration multiseat sous Ubuntu en m'aidant de cette doc.

La configuration s'est grandement simplifiée depuis Xorg 7.2 et est maintenant très bien intégrée dans la distribution, il suffit de :

  • tagguer les périphériques souris, clavier, carte graphique à l'aide de règles UDEV
  • ajouter un fichier de configuration Xorg par seat
  • configurer LightDM

Plus besoin d'écrire de script de lancement de X ni de se battre avec un “ping” des cartes graphiques pendant le boot…

Matériel
Configuration

Voici un extrait de mes règles UDEV, l'objectif est d'identifier le périphérique voulu et de le tagguer avec seat0, seat1 ou seat2. Pour les cartes graphiques, il faut ajouter en plus le tag master-of-seat.

/etc/udev/rules.d/99-multiseat.rules
# périphériques HID
# Souris Logitech noir
ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c05b", ENV{ID_SEAT}="seat1", TAG+="seat1"
 
# Souris Microsoft Laser 6000
ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00f0", ENV{ID_SEAT}="seat0", TAG+="seat0"
 
# Souris verte
ATTRS{idVendor}=="15d9", ATTRS{idProduct}=="0a4f", ENV{ID_SEAT}="seat2", TAG+="seat2"
 
# il est également possible d'affecter une clés USB à une place
ATTRS{idVendor}=="13fe", ATTRS{idProduct}=="3e00", ENV{ID_SEAT}="seat1", TAG+="seat1"
# ou même un port USB particulier d'un HUB
DEVPATH=="/devices/pci0000:00/0000:00:14.0/usb3/3-4/3-4.1/3-4.1.4/*", ENV{ID_SEAT}="seat1", TAG+="seat1"
 
# cartes graphiques
# carte nvidia
SUBSYSTEM=="drm", KERNEL=="card[0-9]*", ATTRS{vendor}=="0x10de", TAG+="master-of-seat"
DEVPATH=="/devices/pci0000:00/0000:00:01.0/0000:01:00.0/*", ENV{ID_SEAT}="seat0", TAG+="seat0"
DEVPATH=="/devices/pci0000:00/0000:00:1c.4/0000:06:00.0/*", ENV{ID_SEAT}="seat1", TAG+="seat1"
 
# carte intel integrée
SUBSYSTEM=="drm", KERNEL=="card[0-9]*", ATTRS{vendor}=="0x8086", TAG+="master-of-seat"
DEVPATH=="/devices/pci0000:00/0000:00:02.0/*", ENV{ID_SEAT}="seat2", TAG+="seat2"

Pour identifier un périphérique plusieurs méthodes peuvent être utilisées :

udevadm info --export-db

Ne choisir que les devices avec TAGS=:seat: et récupérer les valeurs ATTRS{idVendor} et ATTRS{idProduct}.
ou lancer

udevadm monitor

puis brancher le device et tenter de l'identifier. Pour avoir tout les détails :

udevadm info -a -p /devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2

Optionnellement, un fichier de conf Xorg par seat permet de surcharger la configuration par défaut.

/etc/X11/xorg.conf.d/90-seat0.conf
Section "Device"
    Identifier "card0"
    Driver "nvidia"
    Option "NoLogo" "True"
    MatchSeat "seat0"
    Option "ProbeAllGpus" "false"
    BusID "PCI:1:0:0"
EndSection
/etc/X11/xorg.conf.d/90-seat2.conf
Section "Device"
    Identifier  "card0"
    Driver      "intel"
    BusID       "PCI:0:2:0"
EndSection

LightDM supporte désormais le lancement de plusieurs sessions en parallèle avec le user correspondant et les bonnes options pour X :

/etc/lightdm/lightdm.conf
[LightDM]
logind-load-seats=true
logind-check-graphical=true
 
[Seat:seat0]
xserver-config=/etc/X11/xorg.conf.d/90-seat0.conf
autologin-user=user1
 
[Seat:seat1]
xserver-config=/etc/X11/xorg.conf.d/90-seat1.conf
autologin-user=user2
 
[Seat:seat2]
autologin-user=user3

Reboot et magie ! Les 3 écrans s'allument ! =)

16.04 : évolutions

Ma crainte lors de l'upgrade en 16.04 était de casser cette configuration, mais tout s'est passé sans trop de problèmes mais 2 choses ont changées : l'affectation d'un display et le son

DISPLAY

Les display ne sont plus fixes entre chaque reboot, ainsi l'assise seat1 se verra affecté le display :0 ou :1 ou :2 en fonction de l'âge du capitaine et il n'est pas possible de fixer cela :'(

Pour valoriser correctement la variable d'environnement DISPLAY, un petit shell dans le ~/.zshrc ou ~/.bashrc est à ajouter :

export DISPLAY=$(w -oush | grep $USER | cut -d: -f 2 | awk '{print ":"$1}')
Son

Dans ma configuration précédente, j'avais supprimé les paquets relatifs à pulseaudio et les programmes fonctionnait avec alsa directement mais pulseaudio est désormais légion en 16.04.

Le soucis est qu'un démon pulseaudio par utilisateur est lancé avec chaque session et qu'il semble y avoir un accès exclusif à la carte son. Seule une session pouvait jouer du son et les autres se retrouvait avec un driver Dummy Ouput.

Configuration audio KO
Agrandir
Configuration audio KO

Les utilisateurs de ma configuration sont proches physiquement et partagent les mêmes enceintes branchées à une la carte son de la carte mère. Je n'ai pas besoin d'avoir une carte audio par utilisateur. La méthode la plus simple pour résoudre ce problème est de lancer pulseaudio en mode system-wide pour partager le même matériel audio. Il faut juste [https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/WhatIsWrongWithSystemWide/|être conscient des risques].

Pour lancer pulseaudio au boot, créer un service systemd en éditant le fichier /etc/systemd/system/pulseaudio-system.service :

/etc/systemd/system/pulseaudio-system.service
[Unit]
Description=PulseAudio Daemon System Wide
 
[Install]
WantedBy=multi-user.target
 
[Service]
PrivateTmp=true
ExecStart=/usr/bin/pulseaudio --system --realtime --disallow-exit --no-cpu-limit --daemonize=no
ExecReload=/bin/kill -HUP $MAINPID

Recharger la configuration de systemd

sudo systemctl daemon-reload

Ajouter les utilisateurs au groupe pulse-access

sudo useradd -G pulse-access <user>

Editer le fichier de configuration /etc/pulse/daemon.conf pour mettre les valeurs suivantes :

/etc/pulse/daemon.conf
daemonize = yes
system-instance = yes

Un reboot et normalement tout est bon !

Configuration audio opérationnelle
Agrandir
Configuration audio opérationnelle
Systemd

Pour connaitre les différentes places affectées, la commande loginctl du paquet systemd permet de lister les utilisateurs connectés :

loginctl
   SESSION        UID USER             SEAT
        c1       1002 user3            seat2
        c3       1001 user2            seat1
        c2       1000 user1            seat0

Il est également de les énumérer de la manière suivante :

w -oush
user3           :2                 ?    mate-session
user1   tty7    :0                4:53m cinnamon-session --session cinnamon
user2           :1                 ?    cinnamon-session --session cinnamon

Aster

Pour jouer à Battlefield, il faut impérativement un Windows, donc j'ai mis un dual boot. Mais pendant que je joue, le WAF est au plus bas :'(. J'ai recherché des logiciels faisant la même chose sous Windows et j'ai acheté Aster. Via une interface graphique assez simple, il est possible de configurer plusieurs utilisateurs tout en gardant la possibilité de jouer sur la place principale.

Configuration

L'interface permet d'affecter un clavier / souris / carte vidéo à une seat et de sélectionner les utilisateurs correspondant. L'ensemble démarre automatiquement au boot de Windows.

VM Ubuntu

Le WAF n'est pas encore suffisant : l'accès sous Windows aux fichiers stockés sur la partition Linux n'est pas simple. De plus, je ne voulais pas imposer un changement d'interface graphique Windows ou Gnome lorsque je joue. J'ai testé et mis en place une VM Ubuntu possédant un disque virtuel mappé sur la partition Linux du disque physique.

Ainsi, je démarre un VM Ubuntu qui monte le /home du disque physique en lecture / écriture comme un disque normal. En installant les mêmes paquets entre l'Ubuntu natif et l'Ubuntu VM, l'interface graphique est identique entre les 2. De plus, la VM s'affiche en plein écran et la perte de réactivité est à peine perceptible.

La procédure pour créer un disque virtuel sur un disque physique est censée être simple :

C:\Program Files\Oracle\VirtualBox>VBoxManage.exe internalcommands createrawvmdk -filename "C:\LinuxRAW.vmdk" -rawdisk "\\.\PhysicalDrive0" -partitions 3

Cela créer un disque vmdk de quelques ko qui est ensuite utilisable dans n'importe quelle VM. Il faut faire très attention à ne pas mettre un disque virtuel qui accède aux mêmes données que l'OS hôte : les systèmes de fichiers ne sont pas conçus pour être lus et écrit par 2 noyaux (Windows ou Linux) en même temps.

Malheureusement, la commande plante :

VBoxManage.exe: error: Cannot open the raw disk '\\.\PhysicalDrive0': VERR_SHARING_VIOLATION
VBoxManage.exe: error: The raw disk vmdk file was not created

J'ai ce bug qui n'était toujours pas résolu :@. Pas de possibilité de créer le disque sous Windows ⇒ reboot sous Linux et création du disque virtuel sur la partition qui héberge mon linux en priant très fort pour qu'il n'accède pas aux données car le disque est déjà monté et … ça marche sans casse ! :whew:

La configuration de la VM Ubuntu sous Windows est traditionnelle avec 3 Go de RAM, ce qui est suffisant pour un Firefox + OpenOffice. Les disques sont finalement les suivants :

  1. 1 disque virtuel à allocation dynamique contenant le / de la distribution;
  2. 1 disque virtuel raw mappé sur le LVM de mon linux contenant notamment le /home.
Configuration Virtual Box pour Ubuntu avec un disque raw
Agrandir
Configuration Virtual Box pour Ubuntu avec un disque raw

En sus, pour m'assurer une bonne fluidité dans les jeux, je n'ai alloué que 90% maximum de la CPU à cette VM :-p.

Bridage de la CPU
Agrandir
Bridage de la CPU

01/2009 : j'ai testé le déport d'affichage à partir d'une 2e machine se connectant à Olive. J'ai utilisé Wimpy pour tester la solution en lançant X via un :

X :1 -query olive

X démarre, les applications graphiquement légères fonctionnent bien mais OpenOffice est lent et saccadé et les vidéos ne se jouent pas :/. C'est “normal”, ce n'est qu'un déport d'affichage, le rendu est calculé sur le serveur puis transmis via le réseau au client pour un bête affichage à la différence d'un X avec une carte graphique locale qui déleste le processeur d'un certains nombre de tâches.

Déport d'affichage
Agrandir
Déport d'affichage

02/2009 : ce 2e essai nécessite une carte graphique dédiée à chaque place physique.

Par contre, ma carte mère, ne supporte l'utilisation de sa carte graphique intégrée en plus d'une carte additionnelle (limitation du BIOS :'( ) J'ai ajouté une GeForce 7600 GT en PCI-Express et une GeForce FX 5200 (elle chauffait trop) Ati Radeon 7000 sur bus PCI.

Geforce 7600 GT PCI-Express
Agrandir
Geforce 7600 GT PCI-Express
Ati Radeon 7000 PCI
Agrandir
Ati Radeon 7000 PCI

La version 7.2 de Xorg inclus des options permettant de lancer plusieurs X sur un même VT à l'aide de des options -sharevts et -novtswitch. Cela autorise plusieurs instance de X à s'exécuter réellement simultanément à la différence du lancement traditionnel de plusieurs X sur des displays différents mais sur un même VT et nécessitant de basculer de l'un à l'autre avec les touches CTRL + ALT + F7 ou CTRL + ALT + F8.

Par contre, l'intégration du multiseat dans Debian Lenny est inexistante. Après avoir passé plusieurs très longues soirées à tenter de faire marcher l'ensemble, voici l'état des lieux :

  • il faut configurer le bios pour démarrer sur la carte graphique du bus PCI, sinon celle ci n'est reconnue qu'avec 0 Kbits de ram…
  • à cause de ce paramétrage, il faut lancer un X qui “ping” les cartes graphiques avec l'option -probeonly afin d'initialiser les cartes graphiques;
  • Pour démarrer 2 serveurs avec un même fichier de configuration, il faut spécifier dedans des sections ServerLayout pour chaque place en définissant écran, clavier, souris;
  • GDM n'est pas en mesure de lancer 2 X avec 2 utilisateurs différents, il faut alors s'en passer et tout faire à sa place : lancement du X avec le DISPLAY, le user, le ServerLayout correspondant, lancement du gestionnaire de bureau…

Le problème de cette configuration est qu'elle était très fragile : une mise à jour sur 2 des paquets Xorg ou des drivers NVidia la cassait. A chaque problème, le WAF prends une claque :(. Au final, j'ai verrouillé les mises à jour pour empêcher les problèmes. Mais bien sûr avec le temps, ma distribution vieillissait, je ne pouvais plus installer de nouveaux paquets sans devoir tout mettre à jour…

Core i5

12/2014 : changement de la config pour jouer à battlefield 4 8-)

Caractéristiques :

  • Carte mère : MSI Z87-G43
  • Processeur : Intel Core i5-4460 @3,2 GHz
  • Radiateur : Cooler Master Hyper 412s
  • Ram : 12 Go
  • Cartes graphiques :
    • Gigabyte GeForce GTX 750 Ti
    • Asus GeForce GT 610
    • Intel HD Graphics 4600 (intégrée à la carte mère)
  • Disque dur
    • Western Digital Black - 640 Go
  • OS : Ubuntu amd64 Windows

Comme les configurations précédentes, le choix des composants est lié à leurs dégagements thermiques et silence.

Pour le radiateur de processeur, mon choix s'est porté sur le même type de modèle que mon précédent : Cooler Master Hyper 412s. C'est un modèle vertical et perpendiculaire à la carte mère et permet d'avoir un flux d'air aligné avec le ventilateur du boitier tout en ayant une surface d'échange thermique importante. Sur le fil d'alimentation du ventilateur du processeur, j'ai ajouté une résistance pour réduire sa vitesse de rotation (et donc le bruit!)

Cooler Master Hyper 412s
Agrandir
Cooler Master Hyper 412s

Le choix de la carte graphique a été compliqué car je veux du matériel silencieux et pas trop vieux. Mais, qui dit silence, dit moins de performance… De plus, je veux refaire ma configuration multi-seat et ajouter une place supplémentaire ⇒ il faut donc 3 cartes graphiques :

  • carte n°1 : Comme toute les CM de cette génération, elle est équipée d'une carte graphique intégrée. Contrairement à ma CM précédente, sur celle ci, il est possible d'avoir la carte intégrée active en même temps que des cartes additionnelles sur bus PCI-e, ce qui me permet de n'avoir à ajouter que 2 autres cartes.
  • carte n°2 : L'ATI Radéon commence à être juste même en bureautique : elle n'a pas assez de RAM pour afficher un bureau en 1680×1050 avec une profondeur de couleur de 32 bits. De plus, du tearing apparait lors de la lecture des vidéos car la carte n'offre aucune accélération matérielle et la lecture s'effectue avec un driver X11 au lieu de passer par xv. J'ai choisi une Geforce GT 610 fanless en PCI-e pour servir de carte graphique. Elle ne chauffe pas trop grâce à son radiateur imposant.
Asus Geforce GT 610 fanless
Agrandir
Asus Geforce GT 610 fanless
  • carte n°3 : La GeForce GTX 750 Ti en PCI-e m'a semblé être un bon compromis entre prix, silence et performance. Au final, dans Battlefield, toutes les options sont pratiquement au maximum et le jeu tourne à 60 fps. Il arrive qu'en haut de la tour de transmission sur la map “Paracel Storm” les fps chutent un peu puis reviennent ⇒ le paris a été payant =)
Gigabyte GeForce GTX 750 Ti
Agrandir
Gigabyte GeForce GTX 750 Ti

Pendant un temps, j'avais mis des gros élastiques pour suspendre la cage des disques dur. Avec le temps, ils se sont détendus et la cage touchait le bas du boitier. Je suis revenu avec de la ficelle à roti en ajoutant de la mousse autour de la cage métallique pour limiter les chocs lors du transport de la tour.

Les points de fixation sur la cage sont réalisés à l'aide de vis pelletier, écrous et rondelles comme le montre la photo suivante :

Fixation sur la cage de disque dur
Agrandir
Fixation sur la cage de disque dur

Pour suspendre l'ensemble dans la tour, la ficelle passe par les supports des baies 5“1/4 pour redescendre de chaque côté et s'accroche dans les 4 points de fixations de la cage. Une fois suspendu, cela ressemble à cela :

Cage suspendue
Agrandir
Cage suspendue

La carte réseau intégrée à la CM est Gb mais je n'ai qu'une seule prise RJ45 à haute vitesse dans le bureau. Pour pouvoir bénéficier de ce lien Gb avec un ordinateur portable dans le bureau, j'ai ajouté l'ancienne carte réseau Gb de popeye).

Carte réseau D-Link DGE-528T
Agrandir
Carte réseau D-Link DGE-528T

Pour que la tour opère comme un switch entre les 2 cartes réseau, il faut activer l'ip forwarding du noyau :

echo 1 > /proc/sys/net/ipv4/ip_forward

Il faut également mettre en place un relais DHCP pour les demandes d'ip d'une machine connectée sur cette 2ème carte soit transmise (l'ip forward ne transmet les paquets en broadcast). J'utilise dhcrelay dispo dans le paquet isc-dhcp-relay. L'objectif de ce programme est de relayer les requêtes DHCP reçues par Olive vers le serveur DHCP de Popeye. Le fichier de configuration est très simple :

# What servers should the DHCP relay forward requests to?
SERVERS="10.0.0.1"

# On what interfaces should the DHCP relay (dhrelay) serve DHCP requests?
INTERFACES=""

# Additional options that are passed to the DHCP relay daemon?
OPTIONS=""

La liste des cartes additionnelles est la suivante (du haut vers le bas) :

  • Gigabyte GeForce GTX 750 Ti
  • Asus GeForce GT 610
  • Bracket USB
  • Carte réseau Gb
Olive à coeur ouvert
Agrandir
Olive à coeur ouvert

J'ai refait ma configuration multiseat sous Ubuntu en m'aidant de cette doc.

La configuration s'est grandement simplifiée depuis Xorg 7.2 et est maintenant très bien intégrée dans la distribution, il suffit de :

  • tagguer les périphériques souris, clavier, carte graphique à l'aide de règles UDEV
  • ajouter un fichier de configuration Xorg par seat
  • configurer LightDM

Plus besoin d'écrire de script de lancement de X ni de se battre avec un “ping” des cartes graphiques pendant le boot…

Pour jouer à Battlefield, il faut impérativement un Windows, donc j'ai mis un dual boot. Mais pendant que je joue, le WAF est au plus bas :'(. J'ai recherché des logiciels faisant la même chose sous Windows et j'ai acheté Aster. Via une interface graphique assez simple, il est possible de configurer plusieurs utilisateurs tout en gardant la possibilité de jouer sur la place principale.

  • realisations/olive
  • Dernière modification : 2024/04/01 10:00