Utilisant des moniteurs anciens (VGA) pour mes PC sous I3/X11 à partager entre plusieurs PC dont 1 sous Windows, j'ai acquis des KVM et cela m'a conduit à faire 2 constats: via le KVM, l'un des moniteur a vu sa résolution sous I3 réduite drastiquement (1024x768) là où j'avais précédemment du 1650x1050 (ça se voit !) et l'autre idem alors que dans le même temps je m'aperçois que je peux avoir du 1920x1080 sous Windows ...

Version courte

  1. récupérer des fichiers EDID correspondant aux résolutions souhaitées, par exemple sur edid-generator
  2. mettre ces fichiers dans /etc/X11/edid puis ajouter le fichier /etc/X11/xorg.conf.d/20-nidia.conf présent à la toute fin de cet article
  3. relancer le serveur X via sudo systemctl restart gdm3 par exemple (si vous utilisez gdm3)

Version longue

Le Linuxien en moi voit rouge et part en quête pour laver l'affront. Un petit tour sur Internet et me voilà en train de jouer avec XRandR (X Resize and Rotate, d'où le nom, pour la petite histoire). Là encore, déception: je m'aperçois que les résolutions que j'avais précédemment ou que je voudrais ne sont pas listées dans le domaine du possible renvoyé par xrandr... Mais j'apprends au moins que mes moniteurs sont respectivement appelés DVI-I-0 (celui visant le 1680x1050) et le DVI-I-1 (pour le rêvé 10920x1080). Au passage, ce sont des moniteurs VGA branchés sur le PC Linux via des adaptateurs DVI/VGA de ma carte graphique NVidia GeForce 560 Ti (pilote nvidia legacy 390.154) d'où ces noms puis via 2 KVM VGA. Le premier est un Samsung SyncMaster 2223nw et le second un LG FLATRON E2242. Enfin, tant qu'à vous raconter ma vie, mon Linux est une Debian 11 à jour.

Premier espoir vite déçu: nvidia-settings ne m'offre pas davantage de résolutions disponibles.

J'utilise alors un pis-aller pour au moins disposer des résolutions maximum indiquées disponibles par xrandr:

 $ xrandr --output DVI-I-0 --primary --mode 1600x900 --output DVI-I-1 --mode 1600x900 --left-of DVI-I-0

Maintenant que l'affichage a retrouvé un peu de décence, j'en conclus que je peux utiliser le même procédé en ajoutant au préalable les modes manquants toujours via xrandr --addmode et cvt. Diantre, me voilà nanti d'un message d'erreur des plus mystérieux:

 $ cvt 1950 1080
 # 1920x1080 59.96 Hz (CVT 2.07M9) hsync: 67.16 kHz; pclk: 173.00 MHz
 Modeline "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
 
 $ xrandr --newmode Modeline "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
 $ xrandr --addmode DVI-I-1 "1920x1080_60.00"
 X Error of failed request:  BadMatch (invalid parameter attributes)
   Major opcode of failed request:  140 (RANDR)
   Minor opcode of failed request:  18 (RRAddOutputMode)
   Serial number of failed request:  33
   Current serial number in output stream:  34

De retour sur la toile, je trouve un peu de tout, pas toujours récent (vu le matériel, ceci est peu surprenant) y compris que le driver Nvidia ne sait pas faire ... Attendu que l'un des moniteurs exhiba une résolution désormais disparue, convenez qu'il eût été étonnant que j'y crusse (oui on peut utiliser l'imparfait du subjonctif dans un article informatique).

Poursuivant mes investigations, j'ai la confirmation de mon hypothèse de départ, à savoir que mes moniteurs ne parviennent pas à transmettre au serveur X les résolutions dont ils sont capables, et probablement pour l'un deux, que c'est le KVM qui bloque ou altère le transfert d'information ou que mon Linux ne sait pas récupérer. Et, en effet, un standard VESA nommé EDID (Extended Display Information Data) joue ce rôle et doit être mis à mal par mes KVM.

Il va donc falloir trouver un autre moyen de passer les informations de résolution de mes moniteurs au serveur X. Premier essai en ajoutant une ligne Modeline dans le fichier de configuration xorg.conf, dans les sections Monitor correspondant à mes 2 écrans ... sauf que, nouveau désappointement, point de fichier xorg.conf. Il est vrai que ça faisait un moment que je n'avais pas regardé ces sujets, me contentant du comportement assez magique et en tout cas dynamique de mes Linux visiblement capables de deviner - jusqu'à maintenant - mes configurations.

Effectivement, désormais, il n'est plus nécessaire de tout décrire par le menu. Mais dans notre cas, il va quand même falloir donner quelques informations. Pour ça, on dispose du répertoire /etc/X11/xorg.conf.d dans lequel les fichiers présents sont exploités dans l'ordre alphanumérique après la sus dite divination. En conséquence, point n'est besoin de tout décrire, seulement ce que nous voudrions préciser, en l’occurrence nos résolutions. Donc un petit fichier 10-monitors.conf (il faut une extension conf pour ce que le fichier soit pris en compte) reprenant le Modeline tel qu'émis par cvt pour nos deux résolutions:

  0 Section "Monitor"
  1   Identifier "DVI-I-0"
  2   Option "PreferredMode" "1650x1050_60.00"
  3   VendorName "SAM"
  4   ModelName "Samsung 2223nw"
  5   HorizSync 30.0 - 81.0
  6   VertRefresh 56.0 - 75.0
  7   Option "DPMS"
  8   Modeline "1680x1050_60.00"  146.25  1680 1784 1960 2240  1050 1053 1059 1089 -hsync +vsync
  9 EndSection
 10
 11 Section "Monitor"
 12   Identifier "DVI-I-1"
 13   Option "PreferredMode" "1920x1080_60.00"
 14   VendorName "LG"
 15   ModelName "Flatron E2242"
 16   Modeline "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
 17 EndSection

Et voilà ! Ne me restait plus qu'à relancer le serveur X (non, pas à redémarrer, on n'est pas sous Windows, que diable !):

 $ sudo systemctl restart gdm3

Inutile de dire que la déception a été à la hauteur de mes espérances et que mes certitudes ont été brutalement réduites à néant: me revoilà avec mes pathétiques résolutions minimalistes agrémentées d'un brin de découragement. Même l'ajout dans un second temps des fréquences de synchronisation horizontale et de rafraîchissement vertical n'a pas entamé l'immobilisme insolent de mon serveur X.

Manifestant un entêtement digne du plus obstiné des bretons, je reviens sur la piste des EDID pour découvrir qu'on peut les fournir directement au serveur X via la configuration du Device (à savoir la carte graphique) et l'option "CustomEDID". Bien, mais où trouver ces fichiers ? Plusieurs possibilités, depuis des logs, depuis le driver sous Windows, en les construisant ... ce qui m'amène à découvrir edid-generator sur github. Il se trouve de plus que dans le dépôt github sont déjà fournis des fichiers EDID pour certaines résolutions dont celles dont j'ai besoin. Je comprends également qu'on peut préciser pour quel moniteur X doit prendre en compte ces fichiers, donc nouvelle tentative.

Je commence par copier les fichiers 1920x1080.bin et 1680x1050.bin dans un répertoire /etc/X11/edid puis je modifie mon fichier 10-monitor.conf renommé pour l'occasion 20-nvidia.conf:

 Section "Monitor"
   1     Identifier     "DVI-I-0"
   2     VendorName     "Samsung"
   3     ModelName      "SyncMaster 2223nw"
   4     Option         "DPMS"
   5 EndSection
   6
   7 Section "Monitor"
   8     Identifier     "DVI-I-1"
   9     VendorName     "LG"
  10     ModelName      "Flatron E2242"
  11     Option         "DPMS"
  12     Option         "LeftOf" "DVI-I-0"
  13 EndSection
  14
  15 Section "Device"
  16     Identifier     "Device0"
  17     Driver         "nvidia"
  18     VendorName     "NVIDIA Corporation"
  19     Option         "CustomEDID" "DVI-I-1:/etc/X11/edid/1920x1080.bin"
  20     Option         "CustomEDID" "DVI-I-0:/etc/X11/edid/1680x1050.bin"
  21     Option         "IgnoreEDID" "false"
  22     Option         "UseEDID" "true"
  23 EndSection

Après redémarrage du serveur X, je peux pousser un retentissant "Hourr ... argh": le moniteur de droite est bien en 1920x1080, mais celui de gauche est désormais éteint. Il semblerait que seule la première Option CustomEDID soit prise en compte, autrement dit, qu'on ne puisse avoir qu'une seule ligne de ce type. Certes, mais alors comment faire pour prendre en compte mes deux EDID ?

Et bien, en les chaînant et en les séparant par un point virgule:

 Section "Monitor"
   1     Identifier     "DVI-I-0"
   2     VendorName     "Samsung"
   3     ModelName      "SyncMaster 2223nw"
   4     Option         "DPMS"
   5 EndSection
   6
   7 Section "Monitor"
   8     Identifier     "DVI-I-1"
   9     VendorName     "LG"
  10     ModelName      "Flatron E2242"
  11     Option         "DPMS"
  12     Option         "LeftOf" "DVI-I-0"
  13 EndSection
  14
  15 Section "Device"
  16     Identifier     "Device0"
  17     Driver         "nvidia"
  18     VendorName     "NVIDIA Corporation"
  19     Option         "CustomEDID" "DVI-I-1:/etc/X11/edid/1920x1080.bin; DVI-I-0:/etc/X11/edid/1680x1050.bin"
  20     Option         "IgnoreEDID" "false"
  21     Option         "UseEDID" "true"
  22 EndSection

Et cette fois-ci, je peux enfin crier victoire: mes deux écrans sont allumés et exhibent fièrement la meilleure résolution dont ils sont capables.