Wiki d'Imatgedart
Wiki d'Imatgedart
Potser ja sabeu que el tema dels dos monitors en GNU/Linux m'ha portat sempre força de corcoll. Per als suspicaços en relació a Debian, sapigueu que quan utilitzava Ubuntu els resultats no eren millors, i imprevisibles por añadidura. Però bé, la resta podeu obviar aquest parèntesi.
El cas és que a casa tinc un monitor addicional al qual connecto el portàtil quan treballo allí. Però és clar, quan no sóc treballant a casa, només utilitzo una sola pantalla. Durant un temps això no va suposar cap problema, com a mínim massa aparent. Jo tenia configurat el servidor gràfic per a dues pantalles. Si no hi havia la segona pantalla connectada, el servidor gràfic es comportava com si només n'hi hagués una de configurada, i aquí s'acabava el problema.
Segurament a causa de les millores en els drivers d'Nvidia, però, això ha deixat de ser així, de tal manera que si engegava l'ordinador configurat per a dues pantalles i només n'hi havia una, el servidor gràfic no arrencava. Llavors em calia entrar en mode de rescat, fer els cp pertinents dels diversos xorg.conf que tinc al directori /etc/X11 i, si volia tenir plenes garanties de funcionament, reiniciar l'ordinador.
L'altre dia no podia dormir i vaig decidir arremangar-me per trobar una solució que algú segur que ja havia buscat abans: poder fer que d'alguna manera es pogués escollir l'opció d'arrencar l'ordinador amb el servidor gràfic per a una o bé dues pantalles. Vaig decidir començar per començar buscant al google:
grub entry for different xorg.conf
i a partir d'aquí vaig anar trobant tota la resta.
Les solucions basades en GRUB a la qüestió que plantejava es fonamenten en el fet que, per cada entrada de GRUB, es poden passar arguments per a l'arrencada del kernel. Bé, això no té res de particular. Si mireu les vostres entrades de GRUB dins el fitxer /boot/grub/menu.lst veureu que la línia de kernel porta ja alguns arguments.
La particularitat és que si hi afegim algun argument que no sigui relatiu a l'arrencada del kernel, aquest ho ignorarà però allò que haguem posat serà passat com una variable d'entorn que podrem utilitzar en un moment posterior per fer allò que ens interessi.
Prèviament a això, evidentement, ens caldrà tenir dos fitxers xorg.conf diferents, per exemple xorg.conf.1pantalla i xorg.conf.2pantalles, cada un amb els paràmetres i opcions adients per a les respectives configuracions de monitors.
Després de modificar el GRUB, només caldrà automatizar l'execució d'un script que, en funció del valor/existència de la variable d'entorn, faci una còpia d'xorg.conf.1pantalla o xorg.conf.2pantalles, segons convingui, a xorg.conf.
El meu fitxer /boot/grub/menu.lst tenia aquesta pinta (amb moltes omissions) abans d'editar-lo:
# (coses més enrere) ## ## End Default Options ## title Debian GNU/Linux, kernel 2.6.26-2-amd64 root (hd0,0) kernel /boot/vmlinuz-2.6.26-2-amd64 root=/dev/sda1 ro quiet initrd /boot/initrd.img-2.6.26-2-amd64 title Debian GNU/Linux, kernel 2.6.26-2-amd64 (single-user mode) root (hd0,0) kernel /boot/vmlinuz-2.6.26-2-amd64 root=/dev/sda1 ro single initrd /boot/initrd.img-2.6.26-2-amd64 ### END DEBIAN AUTOMAGIC KERNELS LIST # (coses més endavant)
Doncs bé, es tracta d'afegir, com deia, a la línia del kernel la variable d'entorn i el valor que volem que tingui en cada cas. Per a això, veureu que vaig duplicar la primera de les entrades (ja que la segona és la de single-user mode i aquesta no ens incumbeix) per a tenir-ne una per a cada opció de pantalles:
# (coses més enrere) ## ## End Default Options ## title Debian GNU/Linux, kernel 2.6.26-2-amd64 root (hd0,0) kernel /boot/vmlinuz-2.6.26-2-amd64 root=/dev/sda1 ro quiet XORG=unapantalla initrd /boot/initrd.img-2.6.26-2-amd64 title Debian GNU/Linux, kernel 2.6.26-2-amd64 dues pantalles root (hd0,0) kernel /boot/vmlinuz-2.6.26-2-amd64 root=/dev/sda1 ro quiet XORG=duespantalles initrd /boot/initrd.img-2.6.26-2-amd64 title Debian GNU/Linux, kernel 2.6.26-2-amd64 (single-user mode) root (hd0,0) kernel /boot/vmlinuz-2.6.26-2-amd64 root=/dev/sda1 ro single initrd /boot/initrd.img-2.6.26-2-amd64 ### END DEBIAN AUTOMAGIC KERNELS LIST # (coses més endavant)
Així la variable XORG que definim a cada una de les dues primeres entrades tindrà el valor unapantalla o duespantalles segons quina entrada triem.
Aquest script és un fitxer de text que ha de tenir el contingut següent:
#!/bin/sh
case $XORG in
unapantalla)
# if PARAM== unapantalla : Si la variable té aquest valor s'executa la línia següent:
cp /etc/X11/xorg.conf.1p /etc/X11/xorg.conf
echo "Single Screen Setup for GDM : Enabled" #I això és la informació que se'ns mostra en el log d'arrencada
;;
duespantalles)
# if PARAM== duespantalles : Si la variable té aquest valor s'executa la línia següent:
cp /etc/X11/xorg.conf.20100513_2p /etc/X11/xorg.conf
echo "Dual Screen Setup for GDM : Enabled" #I això és la informació que se'ns mostra en el log d'arrencada
;;
*)
#default conf here
;;
esac
exit 1
Desarem aquest script com un fitxer sense extensió, amb el nom que més ens agradi (en el meu cas el vaig anomenar xorg_tria), dins el directori /etc/init.d. Però aquí no s'acaba tot. Caldrà fer enllaços simbòlics des d'aquest directori als alres directoris amb nom rc#.d, on # és un nombre indicatiu del runlevel en el qual els scripts continguts dins aquesta carpeta s'executen.
La veritat és que aquest tema dels runlevel em va una mica gros; simplement us diré que, dins aquests directoris, els enllaços simbòlics que comencen per S es refereixen a l'arrencada de programes (Start), mentre que els que comencen per K es refereixen a la finalització (Kill). Darrere d'aquesta lletra hi ha un nombre, que indica l'ordre en què aquest escript s'executarà. És a dir, un fitxer que comenci per S35 s'executarà abans que un que comenci per S75.
La manera com he implementat aquesta solució partint de la informació que vaig trobar és, per tant, partint del prova i error, amb la qual cosa pot ser que hi hagi coses que sigui millor fer d'una altra manera o que no calgui fer. Tornant a la creació dels enllaços simbòlics, faríem quelcom semblant a aquesta seqüència:
# cd /etc/rc2.d/ # ln -s /etc/init.d/xorg_tria S29xorg_tria
Amb això el que estic fent és crear un enllaç simbòlic dins el directori rc2.d (aquell on sóc actualment) anomenat S29xorg_tria. I potser us preguntareu en virtut de què li poso S29 i no S163, per exemple. Doncs bé, perquè veig que hi ha un altre enllaç simbòlic al mateix directori que es diu S30gdm. GDM (Gnome Display Manager) és, com sospitareu, un dels programes implicats en el servidor gràfic. Per tant, qualsevol canvi que impliqui els paràmetres de què fa ús el servidor gràfic cal que sigui fet abans que aquest arrenqui. Com que S29 s'executa abans que S30, tot resolt. Després, amb el nautilus amb mode root o bé des del terminal amb l'ordre cp, només caldria copiar aquest mateix enllaç simbòlic S29xorg_tria a les carpetes següents: rc3.d, rc4.d i rc5.d.
Insisteixo que alguns temes abordats aquí se m'escapen i poden no estar ben explicats; tingueu en compte també que estic parlant d'una distribució Debian Lenny i, si n'utilitzeu una altra, el vostre cas podria ser lleugerament o molt diferent. Però espero que com a mínim n'hagueu tret alguna pista que us pugui ser útil.
Ei, gràcies per ser a aquesta pàgina.
Potser has notat que ha canviat una mica.
Estic "en ello".