Xrandr e udev: configurare un monitor esterno in automatico: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
m (rimosso gruppo staff)
 
(16 versioni intermedie di 3 utenti non mostrate)
Riga 1: Riga 1:
{{stub}}
{{Versioni compatibili|Buster}}
{{Versioni compatibili|Wheezy}}
==Introduzione==
==Introduzione==
Questa guida si propone di spiegare come usare udev e xrandr per configurare in automatico uno o più monitor quando si collegano alla vga, dvi o hdmi.
Questa guida si propone di spiegare come usare <code>udev</code> e <code>xrandr</code> per configurare in automatico uno o più monitor quando si collegano alla VGA, DVI o HDMI.


Normalmente per configurare un monitor esterno si utilizza xrandr. Seguendo le seguenti istruzioni sarete in grado di farlo una tantum e dalla volta successiva in poi in maniera automatica, possibilmente scegliendo la configurazione a seconda del monitor che si attacca.
Normalmente per configurare un monitor esterno si utilizza <code>xrandr</code>. Seguendo le seguenti istruzioni sarete in grado di farlo una tantum e dalla volta successiva in poi in maniera automatica, possibilmente scegliendo la configurazione a seconda del monitor che si attacca.
 
Per raggiungere questo scopo, si userà [[udev]], che attiverà uno [[script]] al collegamento (o scollegamento) di un monitor. Questo script, tramite l'[http://en.wikipedia.org/wiki/Extended_display_identification_data edid] riconosce univocamente il monitor esterno. A questo punto con una serie di if, possiamo configurare a piacere il nostro monitor.


Per raggiungere questo scopo, si userà [http://guide.debianizzati.org/index.php/Udev_e_Debian udev], che attiverà uno script al collegamento (o scollegamento) di un monitor. Questo script, tramite l'[http://en.wikipedia.org/wiki/Extended_display_identification_data edid] riconosce univocamente il monitor esterno. A questo punto con una serie di if, possiamo configurare a piacere il nostro monitor.
==Xrandr==
==Xrandr==
Prima di tutto, bisogna capire che configurazione si ha. Lanciando da terminale <code>$ xrandr</code> si avrà un output simile al seguente
Prima di tutto, bisogna capire che configurazione si ha. Lanciando da terminale <code>xrandr</code> si avrà un output simile al seguente:
<pre>
<pre>
$ xrandr
Screen 0: minimum 320 x 200, current 1366 x 768, maximum 8192 x 8192
Screen 0: minimum 320 x 200, current 1366 x 768, maximum 8192 x 8192
LVDS1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 270mm x 150mm
LVDS1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 270mm x 150mm
Riga 20: Riga 21:
DP1 disconnected (normal left inverted right x axis y axis)
DP1 disconnected (normal left inverted right x axis y axis)
</pre>
</pre>
Qui, <code>LVDS1</code> è il monitor del portatile, <code>VGA1</code> è una porta vga, <DP1> è un porta DisplayPort, probabilmente presente nel chipset grafico, ma nel caso in questione non fisicamente collegata ad una porta. Generalmente altri possibili output sono <code>HDMI</code>, <DVI> con ovvia interpretazione.
Qui, <code>LVDS1</code> è il monitor del portatile, <code>VGA1</code> è una porta VGA, <DP1> è un porta DisplayPort, probabilmente presente nel chipset grafico, ma nel caso in questione non fisicamente collegata ad una porta. Generalmente altri possibili output sono <code>HDMI</code>, <DVI> con ovvia interpretazione.


Prendere nota dei propri dati. Serviranno successivamente.
Prendere nota dei propri dati. Serviranno successivamente.


Ora collegare un monitor esterno e configurarlo, secondo le proprie necessità, con xrandr. Ad esempio
Ora collegare un monitor esterno e configurarlo, secondo le proprie necessità, con <code>xrandr</code>. Ad esempio:
<pre>
<pre>
xrandr --output LVDS1 --pos 1280x256 --primary --output VGA1 --pos 0x0 --auto
$ xrandr --output LVDS1 --pos 1280x256 --primary --output VGA1 --pos 0x0 --auto
</pre> che rende primario l'output sul monitor del portatile, e affianca a sinistra un mointor collegato  alla porta vga. In questo caso, dato che il monitor esterno ha una risoluzione verticale maggiore del portatile, si è scelto di allineare i due monitor in basso.
</pre>
che rende primario l'output sul monitor del portatile, e affianca a sinistra un monitor collegato  alla porta VGA. In questo caso, dato che il monitor esterno ha una risoluzione verticale maggiore del portatile, si è scelto di allineare i due monitor in basso.


Se si hanno più monitor esterni, configurare ogni monitor.
Se si hanno più monitor esterni, configurare ogni monitor.
==Edid==
==Edid==
Come detto in precedenza, tramite l'edid avremo un modo univoco per riconoscere un monitor esterno. Per trovare l'edid del monitor, bisogna prima di tutto collegarlo e attivarlo tramite xorg. A questo punto dare
Come detto in precedenza, tramite l'edid avremo un modo univoco per riconoscere un monitor esterno. Per trovare l'edid del monitor, bisogna prima di tutto collegarlo e attivarlo tramite Xorg. A questo punto dare:
<pre>
<pre>
$ cat /sys/class/drm/card0-VGA-1/edid | hexdump -v -e '"" "%X" '
$ cat /sys/class/drm/card0-VGA-1/edid | hexdump -v -e '"" "%X" '
</pre>
</pre>
Si otterrà una stringa esadecimale. Ricordarsi di cambiare "VGA-1" a seconda dell'output avuto in precedenza da xrandr. Copiare questa stringa.
Si otterrà una stringa esadecimale. Ricordarsi di cambiare "VGA-1" a seconda dell'output avuto in precedenza da <code>xrandr</code>. Copiare questa stringa.
 
==Regola udev==
==Regola udev==
Il punto interessante è che udev si accorge quando si collega (o scollega) un monitor ad una porta (per esempio vga). A questo punto si crea una regola udev che lancia uno script. Quindi bisogna creare il file <code>/etc/udev/rules.d/90-monitor.rules</code>
Il punto interessante è che udev si accorge quando si collega (o scollega) un monitor ad una porta (per esempio VGA). A questo punto si crea una regola udev che lancia uno script. Quindi bisogna creare il file <code>/etc/udev/rules.d/90-monitor.rules</code>.
 
Per esempio con [[nano]] e [[privilegi di amministrazione]]:
<pre>
# nano /etc/udev/rules.d/90-monitor.rules
</pre>
E scrivere:
<pre>
<pre>
ACTION=="change", SUBSYSTEM=="drm", RUN+="/path/to/script/monitor.sh"
ACTION=="change", SUBSYSTEM=="drm", RUN+="/usr/local/sbin/monitor.sh"
</pre>
</pre>
Questa regola attiverà lo script <code>/path/to/script/monitor.sh</code> ad ogni collegamento o scollegamento di un cavo esterno
Poi salvare (con <code>Ctrl-o</code>) e uscire (con <code>Ctrl-x</code>).
 
Questa regola attiverà lo script <code>/usr/local/sbin/monitor.sh</code> ad ogni collegamento o scollegamento di un cavo esterno.
 
==Script principale==
==Script principale==
Creare e rendere eseguibile il seguente file <code>/path/to/script/monitor.sh</code>
Creare il seguente file con percorso e nome <code>/usr/local/sbin/monitor.sh</code>
<pre>
<pre>
UNI=stringa esadecimale contenente l'edid dello schermo
#! /bin/bash
VGA=/sys/class/drm/card0/card0-VGA-1/
 
UNI="stringa esadecimale contenente l'edid dello schermo"
VGA="/sys/class/drm/card0/card0-VGA-1"


export DISPLAY=":0.0"


export DISPLAY=:0.0
# esci se Xorg non è attivo
pidof /usr/lib/xorg/Xorg > /dev/null 2>&1 || exit 0


if [[ `cat $VGA\status` == "connected" ]]
if [[ "$(cat -- "${VGA}/status")" == "connected" ]]
then
then
   xrandr --output LVDS1 --primary --output VGA1 --auto;
   xrandr --output LVDS1 --primary --output VGA1 --auto;
   EDID=`cat $VGA\edid | hexdump -v -e '"" "%X" '`;
   EDID=$(cat -- "${VGA}/edid" | hexdump -v -e '"" "%X" ');
   if [[ $UNI == $EDID ]]
   if [[ "$UNI" == "$EDID" ]]
   then
   then
     xrandr --output LVDS1 --pos 1280x256 --primary --output VGA1 --pos 0x0 --auto
     xrandr --output LVDS1 --pos 1280x256 --primary --output VGA1 --pos 0x0 --auto
Riga 63: Riga 80:
fi
fi
</pre>
</pre>
Spieghiamo cosa fa lo script.


<code>UNI</code> è una costante, l'edid dello schermo esterno, ottenuto come detto in precedenza. La variabile <code>VGA</code> è il path nel syfs della porta vga (ricordarsi che può cambiare a seconda della propria configurazione).
Poi renderlo eseguibile, assegnandogli i giusti permessi e utente/gruppo riservati:
<pre>
# chmod 744 /usr/local/sbin/monitor.sh
# chown root:root /usr/local/sbin/monitor.sh
</pre>
 
Spieghiamo ora cosa fa lo script:
* <code>UNI</code> è una costante, l'edid dello schermo esterno, ottenuto come detto in precedenza;
* <code>VGA</code> è il [[path]] nel syfs della porta VGA (ricordarsi che può cambiare a seconda della propria configurazione);
* <code>DISPLAY</code> identifica il server <code>Xorg</code> attivo, e il primo (e in genere unico) presente è identificabile con <code>:0[.0]</code>; se si è in dubbio è sufficiente stampare il contenuto della variabile su un terminale di una sessione grafica, per esempio con:<pre>echo $DISPLAY</pre> in modo che sia utilizzabile da udev.


Se lo schermo risulta connesso (primo if) si abilita tramite xrandr lo schermo esterno (necessario altrimenti non si riesce a prendere l'edid). Dopodiché se l'edid è uguale a quello della costante UNI si configura xrandr in una certa maniera (in questo caso alla stessa maniera della sezione [#Xrandr], altrimenti si lascia tutto come in precendeza.
Se lo schermo risulta connesso (primo if) si abilita tramite <code>xrandr</code> lo schermo esterno (necessario altrimenti non si riesce a prendere l'edid). Dopodiché se l'edid è uguale a quello della costante UNI si configura <code>xrandr</code> in una certa maniera (in questo caso alla stessa maniera della sezione [[#Xrandr|Xrandr]], altrimenti si lascia tutto come in precedenza.


Se lo schermo non è attaccato si deconfigura il secondo monitor.
Se lo schermo non è attaccato si deconfigura il secondo monitor.


Ovviamente creando più costanti e più elseif, si possono configurare quanti monitor esterni si vogliono.
Ovviamente creando più costanti e più elseif, si possono configurare quanti monitor esterni si vogliono.
==Sofisticherie==
==Sofisticherie==
Ovviamente si possono fare cose decisamente sofisticate, come abilitare l'audio dvi/hdmi o cose del genere. Inoltre facendo il parsing dell'edid, tramite get-edid e parse-edid, si può andare a cercare il nome del modello e fare cose molto sofisticate (anche se quasi inutili...) come se hai questo modello di monitor attaccato imposta xrandr in questa maniera (uno potrebbe avere 10 monitor uguali... però il seriale sarebbe diverso).
Ovviamente si possono fare cose decisamente sofisticate, come abilitare l'audio DVI/HDMI o cose del genere. Inoltre facendo il parsing dell'edid, tramite ''get-edid'' e ''parse-edid'', si può andare a cercare il nome del modello e fare cose molto sofisticate (anche se quasi inutili...) come se hai questo modello di monitor attaccato imposta <code>xrandr</code> in questa maniera (uno potrebbe avere 10 monitor uguali... però il seriale sarebbe diverso).


Ovviamente le possibilità sono solo limitate dalla fantasia.
Ovviamente le possibilità sono solo limitate dalla fantasia.
{{Autori
|Autore= [[Utente:Gmc|Gmc]] 16:31, 22 set 2012 (CEST)
|Estesa_da=
|Verificata_da=
: [[Utente:HAL 9000|HAL 9000]] 15:43, 21 set 2019 (CEST)
|Numero_revisori=1
}}
[[Categoria: Xorg]]
[[Categoria: Xorg]]
{{Autori | Autore = [[Utente:Gmc|Gmc]] 16:31, 22 set 2012 (CEST) }}
[[Categoria:Bash]]
[[Categoria:Bash Scripting]]

Versione attuale delle 16:31, 12 ott 2019

Debian-swirl.png Versioni Compatibili

Debian 10 "buster"

Introduzione

Questa guida si propone di spiegare come usare udev e xrandr per configurare in automatico uno o più monitor quando si collegano alla VGA, DVI o HDMI.

Normalmente per configurare un monitor esterno si utilizza xrandr. Seguendo le seguenti istruzioni sarete in grado di farlo una tantum e dalla volta successiva in poi in maniera automatica, possibilmente scegliendo la configurazione a seconda del monitor che si attacca.

Per raggiungere questo scopo, si userà udev, che attiverà uno script al collegamento (o scollegamento) di un monitor. Questo script, tramite l'edid riconosce univocamente il monitor esterno. A questo punto con una serie di if, possiamo configurare a piacere il nostro monitor.

Xrandr

Prima di tutto, bisogna capire che configurazione si ha. Lanciando da terminale xrandr si avrà un output simile al seguente:

$ xrandr
Screen 0: minimum 320 x 200, current 1366 x 768, maximum 8192 x 8192
LVDS1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 270mm x 150mm
   1366x768       60.0*+
   1360x768       59.8     60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
DP1 disconnected (normal left inverted right x axis y axis)

Qui, LVDS1 è il monitor del portatile, VGA1 è una porta VGA, <DP1> è un porta DisplayPort, probabilmente presente nel chipset grafico, ma nel caso in questione non fisicamente collegata ad una porta. Generalmente altri possibili output sono HDMI, <DVI> con ovvia interpretazione.

Prendere nota dei propri dati. Serviranno successivamente.

Ora collegare un monitor esterno e configurarlo, secondo le proprie necessità, con xrandr. Ad esempio:

$ xrandr --output LVDS1 --pos 1280x256 --primary --output VGA1 --pos 0x0 --auto

che rende primario l'output sul monitor del portatile, e affianca a sinistra un monitor collegato alla porta VGA. In questo caso, dato che il monitor esterno ha una risoluzione verticale maggiore del portatile, si è scelto di allineare i due monitor in basso.

Se si hanno più monitor esterni, configurare ogni monitor.

Edid

Come detto in precedenza, tramite l'edid avremo un modo univoco per riconoscere un monitor esterno. Per trovare l'edid del monitor, bisogna prima di tutto collegarlo e attivarlo tramite Xorg. A questo punto dare:

$ cat /sys/class/drm/card0-VGA-1/edid | hexdump -v -e '"" "%X" '

Si otterrà una stringa esadecimale. Ricordarsi di cambiare "VGA-1" a seconda dell'output avuto in precedenza da xrandr. Copiare questa stringa.

Regola udev

Il punto interessante è che udev si accorge quando si collega (o scollega) un monitor ad una porta (per esempio VGA). A questo punto si crea una regola udev che lancia uno script. Quindi bisogna creare il file /etc/udev/rules.d/90-monitor.rules.

Per esempio con nano e privilegi di amministrazione:

# nano /etc/udev/rules.d/90-monitor.rules

E scrivere:

ACTION=="change", SUBSYSTEM=="drm", RUN+="/usr/local/sbin/monitor.sh"

Poi salvare (con Ctrl-o) e uscire (con Ctrl-x).

Questa regola attiverà lo script /usr/local/sbin/monitor.sh ad ogni collegamento o scollegamento di un cavo esterno.

Script principale

Creare il seguente file con percorso e nome /usr/local/sbin/monitor.sh

#! /bin/bash

UNI="stringa esadecimale contenente l'edid dello schermo"
VGA="/sys/class/drm/card0/card0-VGA-1"

export DISPLAY=":0.0"

# esci se Xorg non è attivo
pidof /usr/lib/xorg/Xorg > /dev/null 2>&1 || exit 0

if [[ "$(cat -- "${VGA}/status")" == "connected" ]]
then
  xrandr --output LVDS1 --primary --output VGA1 --auto;
  EDID=$(cat -- "${VGA}/edid" | hexdump -v -e '"" "%X" ');
  if [[ "$UNI" == "$EDID" ]]
  then
    xrandr --output LVDS1 --pos 1280x256 --primary --output VGA1 --pos 0x0 --auto
  fi
else
  xrandr --output VGA1 --off
fi

Poi renderlo eseguibile, assegnandogli i giusti permessi e utente/gruppo riservati:

# chmod 744 /usr/local/sbin/monitor.sh
# chown root:root /usr/local/sbin/monitor.sh

Spieghiamo ora cosa fa lo script:

  • UNI è una costante, l'edid dello schermo esterno, ottenuto come detto in precedenza;
  • VGA è il path nel syfs della porta VGA (ricordarsi che può cambiare a seconda della propria configurazione);
  • DISPLAY identifica il server Xorg attivo, e il primo (e in genere unico) presente è identificabile con :0[.0]; se si è in dubbio è sufficiente stampare il contenuto della variabile su un terminale di una sessione grafica, per esempio con:
    echo $DISPLAY
    in modo che sia utilizzabile da udev.

Se lo schermo risulta connesso (primo if) si abilita tramite xrandr lo schermo esterno (necessario altrimenti non si riesce a prendere l'edid). Dopodiché se l'edid è uguale a quello della costante UNI si configura xrandr in una certa maniera (in questo caso alla stessa maniera della sezione Xrandr, altrimenti si lascia tutto come in precedenza.

Se lo schermo non è attaccato si deconfigura il secondo monitor.

Ovviamente creando più costanti e più elseif, si possono configurare quanti monitor esterni si vogliono.

Sofisticherie

Ovviamente si possono fare cose decisamente sofisticate, come abilitare l'audio DVI/HDMI o cose del genere. Inoltre facendo il parsing dell'edid, tramite get-edid e parse-edid, si può andare a cercare il nome del modello e fare cose molto sofisticate (anche se quasi inutili...) come se hai questo modello di monitor attaccato imposta xrandr in questa maniera (uno potrebbe avere 10 monitor uguali... però il seriale sarebbe diverso).

Ovviamente le possibilità sono solo limitate dalla fantasia.




Guida scritta da: Gmc 16:31, 22 set 2012 (CEST) Swirl-auth40.png Debianized 40%
Estesa da:
Verificata da:
HAL 9000 15:43, 21 set 2019 (CEST)

Verificare ed estendere la guida | Cos'è una guida Debianized