Linux Black Screen HOWTO (fix it).

Deve essere uscita qualche release nuova di X.org, oppure deve essere arrivata sul mercato qualche partita di computer portatili bacati, perche’ mi scrivono due o tre persone chiedendomi come aggirare il problema del Black Screen. Siccome non ha senso aiutare solo due persone in una email, faccio un post. Ha avuto questo problema anche il PC di Lady Uriel, quindi vi dico come l’ho risolto io.

Punto primo: state lontani dai forum. Sono fatti da gente che vi dice “hai provato a fare questo?” oppure “prova a fare quello” , e se ad UNO degli utenti che seguono il thread funziona il PC , allora mettono il problema in [SOLVED] , anche se a voi non funziona una cippa, e anche se a voi non funziona ancora.

Un altro problema e’ che nessuno cerca di capire il problema in se’, ma tutti si sforzano di sparare il consiglio che risolve le cose. Quanto di piu’ lontano da quella che dovrebbe essere (e che un tempo fu) la mentalita’ Linux.

Andiamo per gradi. Questo problema succede comunemente su laptop di nuova generazione che hanno due schede video. Ovviamente ci sara’ anche qualcuno che ha un Black Screen perche’ ha pisciato sul portatile, o per millanta altri problemi. Ma il problema di Black Screen cui mi riferisco e’ solo uno. Ed e’ dovuto al fatto che il vostro portatile ha DUE schede video, tipicamente una Intel a basso consumo e un’altra scheda ad alto consumo (e piu’ potente), di solito radeon oppure nvidia.

Facciamo che voi, come Lady Uriel, abbiate un computer che ha due schede video, una Intel e una Radeon (mutatis mutandis, potrete applicare quanto scrivo al caso nvidia). Come fate a saperlo?

Beh, la mia soluzione si basa sul fatto che possiate entrare nel menu di Grub e partire in rescue mode, in qualsiasi modo la vostra distribuzione lo chiami (safe mode, rescue mode, schettino mode, etc).  Quindi, assumo che sappiate entrare nel menu’ di Grub (basta premere ESC mentre il PC parte) e che sappiate editare la riga di comando aggiungendo opzioni al kernel (premendo la lettera “e”). Se non siete familiari con un  boot loader, usate Windows.

Se riuscite a partire in modalita’ single e ad avere il prompt come root, potete capire se avete il problema facendo cosi’:

two_vga
Cliccate per ingrandire.

Come potete vedere, (mi sono collegato via ssh al pc che fa da media center a casa, a voi non sara’ un terminale ma lo schermo intero) il pc in questione ha due schede grafiche. Una Intel ed una Radeon.

Quando un PC del genere lavora con windows, si suppone che passi da una scheda all’altra, a seconda di quanti e quali schermi ha attaccati, e alle condizioni della batteria del laptop. Questo e’ importante, perche’ ci fa venire in mente una domanda che ogni architetto di sistemi si pone.

Qual’e’ la prima cosa che un architetto di sistemi si chiede quando due diversi dispositivi si occupano, a tempi alterni, della stessa cosa? La domanda e’ “who is the orchestrator?”. Chi, cioe’, dirige questo balletto di schede video? E la seconda domanda e’: questo organo che dirige, parla con Linux e con XWindows? La risposta e’ abbastanza facile: il sospettato e’ ACPI, un piccolo chip che se ne sta sulla scheda madre a svolgere alcuni compiti legati alla gestione delle periferiche .La seconda risposta e’ che se abbiamo dei problemi, sospettiamo che ACPI non parli bene (o non parli affatto) con Linux riguardo all’uso delle schede video.

Ok, adesso sappiamo che e’ ACPI. Questo ci da’ una soluzione? No. Se ACPI e’ in ballo ma non e’ la soluzione, e non ci aiuta, allora e’ parte del problema.

Quindi, il primo parametro che aggiungeremo al Kernel e’ “acpi=off”.

DEVE ESSERE MOLTO CHIARA UNA COSA: disabilitando ACPI, ci sono molte funzioni di routing degli irq e di altre cose legate al power management che mancheranno. Facendolo, otterrete una macchina a singolo core nella gran parte dei casi,  visto che occorre il routing degli irq. Inoltre, moltissime features di power management verranno disabilitate e userete la vecchia interfaccia APM. E’ possibile usare settaggi piu’ fini come “pci=noacpi” e altri , ma sono troppo specifici per il singolo computer per essere oggetto di un post generico.

Adesso andiamo al punto secondo: non sempre l’anarchia conviene. Adesso nessuno orchestra, ma come fara’ Linux a sapere che diamine di scheda usare e specialmente a che risoluzione mandarla? Se infatti eseguiamo X -configure, ci troviamo con un bel file di configurazione, che configura DUE schede video, ma ci offre la medesima scena muta. Occorre quindi prendere il posto di ACPI e fare noi da orchestratori.

Quale scheda vogliamo far girare? La domanda e’ interessante, e potremmo fare dei dibattiti filosofici. A me la filosofia non piace, quindi mi pongo una domanda: se vedo qualcosa sullo schermo (benche’ in modalita’ single) una scheda STA girando. Quale? Nel mio caso, la Intel. In quasi tutti i casi, la prima sul bus.

Quindi, faremo girare la Intel.

Ora, noi vogliamo che la intel decida la risoluzione dello schermo, o meglio, vogliamo dire alla Intel (mediante X windows) di gestire lo schermo. Questo deve iniziare da subito, per una ragione: molto prima che parta X windows, partono i moduli relativi alla scheda video. Se infatti eseguite il seguente comando in modalita’ single li vedete entrambi:

kernelmodules
Ecco i due moduli del kernel, tutti e due inclusi. Cliccare per ingrandire.

Se le cose stanno cosi’, il problema e’ abbastanza semplice: entrambi i moduli vogliono fare il proprio lavoro, ma non si capisce bene chi sia quello che lavora, che configura la bitmap che vedrete sullo schermo. Questi moduli del kernel di linux vengono caricati PRIMA che parta l’ambiente grafico. Quindi, anche se cambiate la configurazione di X windows, non cambia ancora nulla. Prima dovrete orchestrarli: “tu si, tu no”.

A questo punto, chiediamoci come possiamo comunicare con un modulo del kernel? Beh, chiediamolo ai moduli del kernel, che lo sanno:

moduli
Le interfacce esportate dai moduli, come direbbe oggi un programmatore.

Come vedete, ci sono un sacco di parametri che potete settare artificialmente, nella vostra scheda. Noterete che entrambe le schede hanno un parametro “modeset”, e noterete che in entrambe e’ descritto come un modo per abilitare la scheda o meno.

Allora, se vogliamo che la radeon parta ma non voglia agire da scheda video, dovremo dirle che modeset=0.

Questo lo trovate su tutti i forum, ma non basta. O meglio, basta a volte: se la scheda Intel, per qualche motivo, crede di dover fare la scheda grafica, allora basta. E cosi’ c’e’ uno stronzo che dice “it worked for me!” e da quel momento nessuno vi caca piu’.

Allo stesso modo troverete qualcuno che vi suggerisce di usare modeset=1 per la i915. Se la radeon parte dell’idea di NON fare la scheda grafica, funziona. E cosi’ c’e’ uno stronzo che dice “it worked for me!” e da quel momento nessuno vi caca piu’.

Io invece sono una persona logica che pensa che un orchestrator dica A TUTTI cosa fare. E quindi, io diro’ al kernel SIA che la scheda radeon NON deve agire, sia che la Intel DEVE farlo.

Cosi’, aggiungeremo al boot due parametri:

  • radeon.modeset=0
  • i915.modeset=1

Cosi’ siamo sicuri che una fa questo e l’altra fara’ l’altro.

Adesso pero’ dobbiamo dire ad X windows di usare la scheda Intel. E’ una cosa abbastanza facile.
Andate dentro /etc/X11 e piazzateci un file che si chiama xorg.conf . In alcune distribuzioni come Ubuntu, allergiche a qualsiasi cosa non sia una sfilata di moda , potrebbe mancare. Ma voi ce lo mettete perche’ voi VOLETE determinare cosa cazzo fara’ il computer.Non volete? Compratevi un Apple e non rompete i coglioni. Andiamo avanti.  Dicevo, dovete prendere il controllo di X (che oggi fa tutto da se’) e decidere che diamine faccia il PC.

Allora, copiate il vecchio file per avere un backup, e  fate un file /etc/X11/xorg.conf fatto cosi’:   xorg

Adesso, ricapitoliamo: vogliamo aggiungere al kernel i seguenti parametri, agendo su Grub:

“acpi=off radeon.modeset=0 i915.modeset=1”

E poi, configurata la scheda video su X, ci aspettiamo che funzioni tutto. Abbiamo finito?

NO. C’e’ ancora un problemino:

quando Linux parte, non e’ che vi fanno vedere le utilissime stringhe che ogni kernel stampa alla partenza. No. Questo malcelato senso di inferiorita’ che hanno quelli che leggono lo scritto , nei confronti di chi guarda solo le figure , fa si che OGNI maledetta distribuzione metta uno splash screen davanti al boot. Anche questo dovra’ in qualche modo sapere come diamine settare le schede, ma siccome e’ una roba primitiva non c’e’ modo di dirgli tutte queste cose. Allora, disabilitiamo quella roba e basta: esiste un’opzione che agisce solo in quella fase, impedendo che qualcosa tenti di manovrare le schede video nella fase iniziale, ed e’ l’opzione “nomodeset” . La stringa complessiva e’:

“nomodeset acpi=off radeon.modeset=0 i915.modeset=1”

Allora, torniamo al punto: quello che vogliamo fare e’:

  1. Entrare nel menu di Grub premendo Esc
  2. Usando il tasto “e” cambiare le opzioni di avvio del kernel.
  3. Aggiungervi “nomodeset acpi=off radeon.modeset=0 i915.modeset=1”
  4. Avviare il pc con f10.

A questo punto, fate ripartire il PC, e puf, ecco qui il vostro desktop.

Questo non significa che avete finito. Adesso avete una macchina che manca di diversi pezzi, che sono normalmente gestiti da ACPI. Pero’ avete un desktop, il che significa che potete cercare documentazione E andare a vedere come riabilitare i pezzi che mancano, usando tutte le opzioni piu’ tipiche del vostro hardware, come pci=noacpi, acpi_osi, e cosi’ via. Se non volete imparare tutte queste cose… beh, usate windows.

immagino che tutto questo abbia annoiato chi non si intende molto di informatica.Inoltre, rischia di scatenare guerre di religione tra sistemi operativi, attirando qui farlocchi.  Ebbene , per farmi perdonare da alcuni e per tenere lontani i farlocchi delle guerre di religione… TETTE&CULI!

[ndr: qui giacevano 2 foto di assai procaci fanciulle assai poco vestite]

Ah, si: il computer di casa si chiama proprio “invernomouth”. E non vi dico come si chiama il mio PC personale. Ah, si: per ottenere il prompt “Forza Bologna” con il path scritto sopra (che vi lascia la riga di comando libera) e l’orario dei comandi (utilissimo se lavorate con altri e vi chiedono “quando hai eseguito quella cosa che non la trovo nei log), aprite il file .bash_login  e scrivete:

export PS1=’e];[email protected]$1a
33[01;34m(t)[w] 33[00m
‘”[33[01;34m][u[33[01;37m]@[33[01;31m]h]# 33[01;00m “

Uriel