Multiposte avec plusieurs cartes graphiques

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche

Configuration de X

Par défaut le fichier de X («xorg.conf») n'est plus indispensable pour un poste de travail classique. Mais dans notre cas il est indispensable pour s'y retrouver. Vous avez le choix entre créé plusieurs fichiers de configuration distinct, un par poste. Ou en faire un unique qui comportera l'ensemble des configurations qui seront classé dans des «Layout» différent. Personnellement je vous conseille 1 seul fichier de conf pour 2 poste, mais au delà ça commence a devenir illisible donc de faire un fichier par poste. Pour notre exemple nous allons configurer 2 poste dans un seul fichier de configuration. Dans un premier temps nous allons définir les «Layout» que nous allons utilisés. Il regroupe l'ensemble de la configuration des poste, le «screen» (écran + carte graphique) et les périphérique d'entré (clavier / sourie).

Section "ServerLayout"
  #L'identifiant qui nous permettra de dire à X d'utiliser cette configuration
    Identifier     "poste0"
  #Le premier «0» désigne l'écran, comme vous pouvez avoir plusieurs écran par carte/poste vous pouvez avoir des lignes supplémentaire avec un 1, 2 et ainsi de suite. «ecran0» désigne une section que l'on verra plus tard. Enfin les 2 autres «0» positionne l'écran suivant des coordonnée si plusieurs écran sont en jeux. 
    Screen      0  "ecran0" 0 0 
  #Désigne la section pour un périphérique d'entré, ici un clavier
    InputDevice    "clavier0" "CoreKeyboard" 
  #Désigne la section pour un périphérique d'entré, ici une sourie
    InputDevice    "sourie0" "CorePointer" 
EndSection


Section "ServerLayout"
    Identifier     "poste1"
    Screen      0  "ecran1" 0 0
    InputDevice    "clavier1" "CoreKeyboard"
    InputDevice    "sourie1" "CorePointer"
EndSection

Ensuite nous définissons les périphérique d'entrés (ici juste pour le poste 0). Pour identifier les périphériques matériel et leur point d'entré logiciel il vous suffit d'aller faire un tour dans «/dev/input/*», de faire un «cat» sur un des fichier présent et de généré des évènement clavier/sourie. Si votre «cat» vous sort quelque chose alors vous avez identifié le périphérique correspondant.

####################################
# Peripherique d'entree du poste 0 #
####################################
#Clavier du poste 0
Section "InputDevice"
  #Identiant permettant au Layout de l'appeler
    Identifier    "clavier0" 
    Driver    "evdev"
  #Clavier branché sur un port PS/2, donc l'accès par «by-path» est toléré, mais il vaut mieux «by-id»
    Option    "Device"     "/dev/input/by-path/platform-i8042-serio-0-event-kbd" 
    Option    "XkbLayout"  "fr"
    Option    "XkbVariant" "latin9"
  #IMPORTANT, permet un accès exclusif au périphérique. Sans ça les serveurs X ajouteront automatiquement tous les périphérique disponible aux controle, et du coup toutes les sourie/clavier contrôleront tous les pointeurs.
    Option    "GrabDevice" "on" 
EndSection

#Sourie du poste 0
Section    "InputDevice"
    Identifier    "sourie0"
    Driver "evdev"
  #Sourie branché en USB et comme à chaque redémarrage le chemin peut se modifier (ou pas) il faut préféré l'identification par «by-id»
    Option "Device" "/dev/input/by-id/usb-B16_b_02_USB-PS_2_Optical_Mouse-event-mouse" 
    Option "GrabDevice" "on"
EndSection

Ensuite on définit la section «screen» qui est une agrégation d'une carte graphique et d'un écran.

#######################################
# Carte graphique et ecran du poste 0 #
#######################################

Section "Device"
    Identifier     "carteVideo0"
    Driver         "radeon"
    VendorName     "AMD/ATI"
    BoardName      "Radeon HD 6550D"
  #Trouvable en faisant un «lspci», pour ici «00:01.0 VGA compatible controller» se trouvait dans la sortie de la commande.
    BusID          "PCI:0:1:0"
  #Définition du premier (et seul) écran
    Screen          0
  #Avec un «xrandr» vous pouvez savoir quel prise est utilisé pour connecter l'écran (DVI, HDMI, DP, VGA). Le «Monitor-» est une nécéssité de nommage et le «-0» représente la carte graphique utilisé, la première (donc «0») dans ce cas, mais pour le deuxième poste on pourra trouver «Monitor-DVI-1»
        Option         "Monitor-HDMI-0" "HannsG"
EndSection

Section "Monitor"
    Identifier     "LCD28"
    VendorName     "Hanns.G"
    ModelName      "HSD Hanns.G HG281"
    Option         "PreferredMode" "1920x1200"
EndSection

# Section qui relie les 2 composants ensemble.
Section "Screen"
    Identifier     "ecran0"
    Device         "carteVideo0"
    Monitor        "LCD28"
    DefaultDepth    24
    Option         "TwinView" "0"
    Option         "metamodes" "DFP: 1920x1200 +0+0"
    SubSection     "Display"
        Depth       24
        Modes      "1920x1200_60"
    EndSubSection
EndSection

Donc au final on obtient un ficher tel que celui çi :

#Configuration multi-poste

#############
# Serveur X #
#############

Section "ServerLayout"
    Identifier     "poste0"
    Screen      0  "ecran0" 0 0
    InputDevice    "clavier0" "CoreKeyboard"
    InputDevice    "sourie0" "CorePointer"
EndSection


Section "ServerLayout"
    Identifier     "poste1"
    Screen      0  "ecran1" 0 0
    InputDevice    "clavier1" "CoreKeyboard"
    InputDevice    "sourie1" "CorePointer"
EndSection

#Section "Files"
#    RgbPath         "/usr/X11R6/lib/X11/rgb"
#EndSection

Section "Module"
    Load        "dbe"
    Load        "extmod"
    Load        "type1"
    Load        "freetype"
    Load        "glx"
EndSection

Section "ServerFlags"
    Option      "Xinerama"          "0"
#    Option      "AutoEnableDevices" "false"
#    Option      "AutoAddDevices"    "false"
#    Option      "AllowEmptyInput"   "true"
#    Option      "AutoAddGPU"        "false"
EndSection

####################################
# Peripherique d'entree du poste 0 #
####################################
#Clavier du poste 0
Section "InputDevice"
    Identifier    "clavier0"
    Driver    "evdev"
    Option    "Device"     "/dev/input/by-path/platform-i8042-serio-0-event-kbd"
    Option    "XkbLayout"  "fr"
    Option    "XkbVariant" "latin9"
    Option    "GrabDevice" "on"
EndSection

#Sourie du poste 0
Section    "InputDevice"
    Identifier    "sourie0"
    Driver "evdev"
#    Option "ZAxisMapping" "4 5"
    Option "Device" "/dev/input/by-id/usb-B16_b_02_USB-PS_2_Optical_Mouse-event-mouse"
    Option "GrabDevice" "on"
EndSection

####################################
# Peripherique d'entree du poste 1 #
####################################
#Clavier du poste 1
Section "InputDevice"
    Identifier    "clavier1"
    Driver    "evdev"
    Option    "Device"     "/dev/input/by-id/usb-TrulyErgonomic.com_Truly_Ergonomic_Computer_Keyboard-event-kbd"
    Option    "XkbLayout"  "fr"
    Option    "XkbVariant" "bepo"
    Option    "GrabDevice" "on"
EndSection

#Sourie du poste 1
Section "InputDevice"
    Identifier    "sourie1"
    Driver    "evdev"
#    Option    "ZAxisMapping" "4 5"
    Option    "Device" "/dev/input/by-id/usb-1d57_Game_mouse-if01-event-mouse"
    Option    "GrabDevice" "on"
EndSection

#######################################
# Carte graphique et ecran du poste 0 #
#######################################

Section "Device"
    Identifier     "carteVideo0"
    Driver         "radeon"
    VendorName     "AMD/ATI"
    BoardName      "Radeon HD 6550D"
    BusID          "PCI:0:1:0"
    Screen          0
    Option         "Monitor-HDMI-0" "HannsG"
EndSection

Section "Monitor"
    Identifier     "LCD28"
    VendorName     "Hanns.G"
    ModelName      "HSD Hanns.G HG281"
    Option         "PreferredMode" "1920x1200"
EndSection

Section "Screen"
    Identifier     "ecran0"
    Device         "carteVideo0"
    Monitor        "LCD28"
    DefaultDepth    24
    Option         "TwinView" "0"
    Option         "metamodes" "DFP: 1920x1200 +0+0"
    SubSection     "Display"
        Depth       24
        Modes      "1920x1200_60"
    EndSubSection
EndSection

#######################################
# Carte graphique et ecran du poste 1 #
#######################################

Section "Device"
    Identifier     "carteVideo1"
    Driver         "radeon"
    VendorName     "AMD/ATI"
    BoardName      "Radeon HD 6450/7450/8450 / R5 230 OEM"
    BusID          "PCI:1:0:0"
    Screen         0 
    Option         "Monitor-DVI-1" "Acer"
EndSection

Section "Monitor"
    Identifier     "LCD22"
    VendorName     "ACER"
    ModelName      "ACER B229w"
    Option         "PreferredMode" "1680x1050"
EndSection

Section "Screen"
    Identifier     "ecran1"
    Device         "carteVideo1"
    Monitor        "LCD22"
    DefaultDepth    24
    Option         "TwinView" "0"
    Option         "metamodes" "DFP: 1680x1050 +0+0"
    SubSection     "Display"
        Depth       24
        Modes      "1680x1050_60"
    EndSubSection
EndSection

Test de la configuration

Pour cela il vous suffit de vous mettre dans une console et de taper la commande suivante :

X -layout <mon layout> -vtX

Ou le X doit être remplacer par un numéro de console libre, 8, 9, 10, 11 ou 12 en générale. Vous devriez changer de console pour celle visé et voir un écran gris avec le curseur manipulable. Si c'est bien le cas c'est que votre configuration est bonne.

Configuration de Pulseaudio

Configuration des droits

Normalement vous devez déjà avoir les groupes "pulse" et "pulse-access" de créé sur votre machine.

  • Modifier les utilisateurs en les ajoutant au groupe "pulse-access"

usermod -aG pulse-access <username>

  • On peut enlever l'utilisateur des groupes "audio" et "pulse" pour éviter qu'il prenne la main sur la carte son ou Pulseaudio
deluser <username> audio
deluser <username> pulse

Création du daemon système PulseAudio avec systemd

Bien que ce soit déconseillé de faire tourné pulseaudio en tant que daemon système, c'est le seul moyen pour que les 2 postes aient accès à la carte son en même temps. Pour cela il faut légèrement modifier la configuration de pulseaudio. Dans /etc/pulse il faut modifier 2 fichiers daemon.conf

...
daemonize = yes
...
local-server-type = system
...

client.conf

...
autospawn = no
...

Enfin il faut créer le fichier /etc/systemd/system/pulseaudio.service

[Unit]
Description=Pulseaudio sound server
Documentation=man:pulseaudio(1)
After=avahi-daemon.service network.target
Before=sound.target
Requires=dbus.socket
 
[Service]
Type=forking
BusName=org.pulseaudio.Server
ExecStart=/usr/bin/pulseaudio --system --disallow-exit --disallow-module-loading
ExecStop=/usr/bin/pulseaudio --kill
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
 
[Install]
WantedBy=multi-user.target

Et lancer la commandes suivante pour qu'il soit exécuter au démarrage :

systemctl enable pulseaudio.service

Si vous voulez tester tout de suite le service il vous suffit de faire

systemctl start pulseaudio.service

Configuration systemd

Il existe un soucis qui fait que seul le premier poste (seat0) est détecté par «systemd-logind» et du coup ça empêche certaines fonctionnalités de s'exécuter correctement. Par exemple le montage automatique des clée USB en cliquant sur l'icône qui apparait. Pour vérifier cela il faut vous connecter a 2 poste minimum et lancer la commande suivante :

loginctl

Si vous voyez tous vous utilisateurs connecté sur leur siège tant mieux pour vous. Sinon il faut faire les manipulations suivantes :

Rattachement du matériel

Tout d'abord faite la commande suivante, elle vous donne tous les matériels rattaché au premier poste et vous permettera de récupéré les chemins vers certains périphérique nécessaires.

loginctl seat-status seat0

Ensuite faite un premier essai en rattachant manuellement certains périphériques, ici la carte graphique :

loginctl attach seat-1 /sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/drm/card1 
loginctl attach seat-1 /sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/graphics/fb1

Normalement en refaisant la commande «loginctl list-seats» vous devriez voir le nouveau «seat». Repérer les chemins vers vers les périphérique de votre siège (clavier / sourie / carte son / carte graphique / … ), sachant que au minimum il nous faut la carte graphique.

Automatisation

Pour cela il est nécessaire d'éditer les règles udev

Fermeture de session

Un autre problème est qu'il se peut que certains programes ne se ferment pas correctement quand vous quittez votre session. Pour cela sur un autre poste que celui qui vient de se déconnecté il vous suffit de taper la commande suivante pour trouver les coupables :

loginctl session-status <numéro de session visé>

Dans mon cas il s'agissait de «gpg-agent» et de «gnome-keyring-daemon», comme je ne les utilisaient pas je les ai simplement supprimés.

Ressources

http://code.lexarcana.com/posts/simple-multiseat-setup-on-fedora-17.html http://code.lexarcana.com/posts/using-udev-to-configure-fedora-multi-seat-automatically.html https://wiki.ubuntu.com/MultiseatTeam/Instructions https://wiki.archlinux.fr/Systemd/logind http://www.freedesktop.org/wiki/Software/systemd/multiseat/