Multiposte avec plusieurs cartes graphiques
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/