Linux Mint su MacBookPro8,2 (2011) fix schermo nero e luminosità

Home › Forum › Mac › Linux Mint su MacBookPro8,2 (2011) fix schermo nero e luminosità

Visualizzazione 0 filoni di risposte
  • Autore
    Post
    • #65086
      flongo
      Amministratore del forum

      Registro Interventi

      MacBookPro8,2 – Linux Mint 21.3

      Fix schermo nero (gmux) e controllo luminosità
      Giugno 2026


      1. Panoramica del problema

      Il MacBookPro8,2 (2011) è equipaggiato con due GPU: una Intel HD 3000 integrata (a basso consumo) e una AMD Radeon HD 6490M/6750M discreta (più potente, per compiti grafici pesanti). Un chip dedicato chiamato gmux gestisce lo switch automatico tra le due, instradando anche il segnale video verso il pannello LCD interno.

      Su Linux, questo switch dinamico (gestito dal framework vgaswitcheroo su macOS) è storicamente fragile. In questo caso, il gmux risultava instradato sulla GPU AMD anche quando il sistema tentava di usare la sola Intel: risultato, schermo nero permanente, già a partire dal menu GRUB, ben prima che Linux stesso si caricasse.

      La diagnosi ha richiesto di escludere, uno alla volta: driver mancanti, conflitti tra moduli kernel, configurazioni Xorg corrotte, crash di lightdm. Il vero problema si trovava a un livello più basso di tutti questi: il routing hardware del segnale video, gestito dal gmux a livello EFI, prima ancora che il sistema operativo entri in scena.

      1.1 Sintomi osservati

      • Schermo completamente nero al boot, anche durante il menu GRUB
      • Possibile accesso a un terminale testuale (TTY) tramite combinazione di tasti (Fn+Ctrl+Alt+F1)
      • Con il parametro nomodeset il sistema si avviava in modalità grafica minima (VESA), senza accelerazione
      • Il driver Intel (i915) e Mesa (crocus) risultavano installati e funzionanti, ma il segnale non arrivava fisicamente al pannello

      2. Soluzione: forzare il routing video su Intel

      La soluzione consiste nello scrivere direttamente, tramite GRUB, quattro valori in altrettante porte hardware (I/O) del chip gmux, prima che Linux venga caricato. Questo forza il gmux a instradare il segnale video e i dati EDID verso la GPU Intel, e taglia l’alimentazione alla GPU AMD evitando stati intermedi ambigui.

      2.1 Significato dei quattro comandi

      outb 0x728 1
      Porta di selezione: attiva la GPU Intel come GPU “selezionata” dal gmux.

      outb 0x710 2
      Instrada il segnale video verso il pannello LCD seguendo il percorso Intel, anziché AMD.

      outb 0x740 2
      Instrada le linee DDC (Display Data Channel) verso Intel, permettendo al driver i915 di leggere correttamente l’EDID del pannello (risoluzione nativa, frequenze supportate).

      outb 0x750 0
      Taglia l’alimentazione della GPU discreta AMD, evitando uno stato intermedio ambiguo tra le due schede.

      Nota: i valori sono specifici per il chip gmux di questo modello (MacBookPro8,2 / 9,1). Su altri modelli Apple potrebbero non essere applicabili o richiedere valori diversi.

      2.2 Dati necessari prima di procedere

      Per costruire la configurazione, servono due informazioni specifiche del proprio sistema:

      UUID della partizione di root:
      findmnt -no UUID /
      Versione del kernel più recente installata (ordinamento numerico corretto):
      ls -1v /boot/vmlinuz-*
      Nota: UUID sta per Universally Unique Identifier: un codice univoco assegnato a ogni partizione del disco alla formattazione, indipendente dal nome del dispositivo (che può cambiare tra un boot e l’altro).

      2.3 Modifica di /etc/default/grub

      Aprire il file con privilegi elevati:
      sudo nano /etc/default/grub
      Impostare il contenuto come segue:

      GRUB_DEFAULT="Linux Mint (Force Intel Graphics - gmux fix)"
      GRUB_TIMEOUT_STYLE=menu
      GRUB_TIMEOUT=5
      GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
      GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
      GRUB_CMDLINE_LINUX=""
      GRUB_TERMINAL=console

      Nota: GRUB_TERMINAL=console forza GRUB a usare il terminale testuale invece di quello grafico (gfxterm), che su questo hardware non si disegna correttamente prima dello switch del gmux. GRUB_DEFAULT punta al nome esatto della voce di menu personalizzata, creata al passo successivo, così si avvia automaticamente senza scegliere a mano. GRUB_TIMEOUT=5 lascia margine per intervenire manualmente in caso di necessità.

      2.4 Creazione della voce di menu personalizzata

      Aprire il file delle personalizzazioni (non viene mai sovrascritto da update-grub):
      sudo nano /etc/grub.d/40_custom
      Lasciare intatte le righe iniziali di commento, e aggiungere in fondo (sostituendo UUID e versione kernel con i propri dati):

      menuentry 'Linux Mint (Force Intel Graphics - gmux fix)' {
          insmod gzio
          insmod part_gpt
          insmod ext2
          search --no-floppy --fs-uuid --set=root TUO-UUID-QUI
          set gfxpayload=keep
          outb 0x728 1
          outb 0x710 2
          outb 0x740 2
          outb 0x750 0
          linux /boot/vmlinuz-5.15.0-181-generic root=UUID=TUO-UUID-QUI ro quiet splash
          initrd /boot/initrd.img-5.15.0-181-generic
      }

      Applicare le modifiche e riavviare:
      sudo update-grub
      Nota: dopo il riavvio, è normale che lo schermo resti nero per 15-30 secondi prima che appaia il login grafico: è il tempo necessario al gmux per completare lo switch.

      2.5 Bloccare il kernel per mantenere la configurazione stabile

      La voce di menu personalizzata punta a una versione specifica del kernel (scritta a mano). Se il sistema rimuove automaticamente i kernel vecchi durante gli aggiornamenti, la voce smetterebbe di funzionare. Per evitarlo, si blocca quella versione specifica:

      sudo apt-mark hold linux-image-5.15.0-181-generic \
        linux-headers-5.15.0-181-generic \
        linux-modules-5.15.0-181-generic

      Per annullare il blocco in futuro (ad esempio dopo aver verificato che un kernel più recente funziona correttamente con lo stesso fix):

      sudo apt-mark unhold linux-image-5.15.0-181-generic \
        linux-headers-5.15.0-181-generic \
        linux-modules-5.15.0-181-generic

      3. Manutenzione futura: kernel e GRUB

      Il resto del sistema (librerie, applicazioni, Xorg, Mesa) continua ad aggiornarsi normalmente; solo il kernel specifico è bloccato. Periodicamente, è bene controllare che tutto sia ancora coerente.

      3.1 Verificare il kernel più recente disponibile

      ls -1v /boot/vmlinuz-*
      Se il numero più alto corrisponde ancora a quello scritto nella voce di menu (40_custom), non serve fare nulla. Se è cambiato, aggiornare a mano i percorsi vmlinuz/initrd nel file 40_custom e rieseguire update-grub.

      3.2 Se la voce personalizzata smette di funzionare

      • Verificare che il kernel indicato in 40_custom esista ancora in /boot
      • Verificare che apt-mark hold sia ancora attivo: sudo apt-mark showhold
      • In caso di emergenza, è sempre possibile avviare con nomodeset dal menu GRUB (premere “e” sulla voce di boot, aggiungere nomodeset alla riga linux) per rientrare nel sistema in modalità grafica minima e correggere la configurazione

      4. Controllo della luminosità

      Dopo aver risolto il problema dello schermo nero, è emerso un secondo problema collegato: i tasti funzione F1/F2 e i controlli grafici di XFCE regolano l’interfaccia intel_backlight, ma la luminosità fisica reale del pannello è governata da un’interfaccia diversa, gmux_backlight. Risultato: muovere lo slider di sistema non ha alcun effetto visibile.

      Diversi parametri kernel (acpi_backlight=vendor, acpi_backlight=native) sono stati testati senza successo: il problema sembra strutturale a questa configurazione hardware (GPU AMD disattivata) e non risolvibile lato software in modo nativo. La soluzione adottata è stata costruire uno strumento dedicato che scrive direttamente sull’interfaccia corretta (gmux_backlight).

      4.1 Verificare i due controlli di backlight

      ls /sys/class/backlight/
      cat /sys/class/backlight/gmux_backlight/brightness
      cat /sys/class/backlight/gmux_backlight/max_brightness
      cat /sys/class/backlight/intel_backlight/brightness
      cat /sys/class/backlight/intel_backlight/max_brightness

      Nota: se modificando intel_backlight la luminosità reale del pannello non cambia, ma modificando gmux_backlight sì, la causa è questa discrepanza tra le due interfacce.

      4.2 Script operativo: set-brightness.sh

      Questo script è l’unico componente che scrive davvero nel sistema. Richiede privilegi root.

      File: /usr/local/bin/set-brightness.sh

      #!/bin/bash
      BACKLIGHT_PATH="/sys/class/backlight/gmux_backlight/brightness"
      MAX_PATH="/sys/class/backlight/gmux_backlight/max_brightness"
      
      if [ -z "$1" ]; then
          echo "Uso: $0 <percentuale 0-100>"
          exit 1
      fi
      
      PERCENT="$1"
      MAX=$(cat "$MAX_PATH")
      
      if [ "$PERCENT" -lt 0 ] || [ "$PERCENT" -gt 100 ]; then
          echo "Percentuale fuori range (0-100)"
          exit 1
      fi
      
      VALUE=$(( MAX * PERCENT / 100 ))
      
      echo "$VALUE" > "$BACKLIGHT_PATH"
      echo "Luminosita impostata a: ${PERCENT}% ($VALUE / $MAX)"

      Installazione:

      sudo nano /usr/local/bin/set-brightness.sh
      (incollare il contenuto sopra, poi salvare)
      sudo chmod +x /usr/local/bin/set-brightness.sh

      Test manuale (chiederà la password, finché non si configura il passo 4.3):
      sudo /usr/local/bin/set-brightness.sh 50

      4.3 Permesso senza password: regola sudoers

      Per permettere allo script grafico (4.4) di richiamare set-brightness.sh senza chiedere la password ogni volta, si crea una regola sudoers dedicata, limitata esclusivamente a questo script.

      Creazione (usare sempre visudo, mai un editor diretto: convalida automaticamente la sintassi prima di salvare):
      sudo visudo -f /etc/sudoers.d/backlight-control
      Contenuto del file (sostituire “tuoutente” con il proprio nome utente):

      File: /etc/sudoers.d/backlight-control
      tuoutente ALL=(root) NOPASSWD: /usr/local/bin/set-brightness.sh
      Nota: la regola autorizza l’esecuzione, senza password, esclusivamente di questo script specifico, non un accesso root generico. Verificare il funzionamento con sudo /usr/local/bin/set-brightness.sh 70 (non deve più chiedere la password).

      4.4 Interfaccia grafica: brightness-gui.py

      Finestra con uno slider 0-100% che richiama set-brightness.sh ad ogni movimento. Richiede il modulo tkinter.

      Dipendenza (se non già presente):
      sudo apt install python3-tk
      File: /home/tuoutente/brightness-gui.py

      #!/usr/bin/env python3
      """
      Controllo luminosità per MacBookPro8,2 (gmux_backlight)
      Interfaccia grafica semplice con slider 0-100%.
      """
      
      import tkinter as tk
      import subprocess
      
      SCRIPT_PATH = "/usr/local/bin/set-brightness.sh"
      BRIGHTNESS_FILE = "/sys/class/backlight/gmux_backlight/brightness"
      MAX_FILE = "/sys/class/backlight/gmux_backlight/max_brightness"
      
      def leggi_percentuale_attuale():
          try:
              with open(BRIGHTNESS_FILE, "r") as f:
                  valore = int(f.read().strip())
              with open(MAX_FILE, "r") as f:
                  massimo = int(f.read().strip())
              return round((valore / massimo) * 100)
          except Exception:
              return 50
      
      def imposta_luminosita(percentuale):
          try:
              subprocess.run(
                  ["sudo", SCRIPT_PATH, str(int(percentuale))],
                  check=True,
                  capture_output=True,
                  text=True,
              )
              etichetta_valore.config(text=f"{int(percentuale)}%")
          except subprocess.CalledProcessError as e:
              etichetta_valore.config(text="Errore!")
              print("Errore nello script:", e.stderr)
      
      def on_slider_change(valore):
          imposta_luminosita(valore)
      
      finestra = tk.Tk()
      finestra.title("Luminosità Schermo")
      finestra.geometry("320x160")
      finestra.resizable(False, False)
      
      titolo = tk.Label(finestra, text="Regola la luminosità", font=("Sans", 12, "bold"))
      titolo.pack(pady=(15, 5))
      
      slider = tk.Scale(
          finestra,
          from_=0,
          to=100,
          orient=tk.HORIZONTAL,
          length=280,
          command=on_slider_change,
          showvalue=False,
      )
      slider.set(leggi_percentuale_attuale())
      slider.pack(pady=5)
      
      etichetta_valore = tk.Label(finestra, text=f"{slider.get()}%", font=("Sans", 14))
      etichetta_valore.pack(pady=10)
      
      finestra.mainloop()

      Installazione:

      nano ~/brightness-gui.py
      (incollare il contenuto sopra, poi salvare)
      chmod +x ~/brightness-gui.py
      python3 ~/brightness-gui.py
      (per testare l'avvio manuale)

      4.5 Icona sulla Scrivania: Luminosita.desktop

      Collegamento cliccabile che avvia l’interfaccia grafica con un doppio click, senza passare dal terminale.

      File: ~/Scrivania/Luminosita.desktop

      [Desktop Entry]
      Version=1.0
      Type=Application
      Name=Luminosità Schermo
      Comment=Regola la luminosità del MacBook
      Exec=python3 /home/tuoutente/brightness-gui.py
      Icon=preferences-desktop-display
      Terminal=false
      Categories=Utility;

      Installazione:

      nano ~/Scrivania/Luminosita.desktop
      (incollare il contenuto sopra, poi salvare)
      chmod +x ~/Scrivania/Luminosita.desktop

      Nota: al primo doppio click, XFCE potrebbe mostrare un avviso di sicurezza (“Avviatore di applicazioni non sicuro”): è normale per i file .desktop creati manualmente. Scegliere “Rendi eseguibile” per autorizzarlo in modo permanente.


      5. Schema riassuntivo dei componenti

      I tre file della sezione luminosità lavorano insieme in catena, ciascuno con un ruolo distinto:

      Luminosita.desktop (Lanciatore)
      Icona sulla Scrivania; avvia brightness-gui.py con un doppio click. Non contiene logica propria.

      brightness-gui.py (Interfaccia)
      Finestra con slider visibile; ad ogni movimento richiama set-brightness.sh passandogli la percentuale scelta.

      set-brightness.sh (Operativo)
      Unico componente che scrive davvero nel sistema (file gmux_backlight), con privilegi root.

      Catena d’uso quotidiano: doppio click sull’icona, si apre la finestra con lo slider, muovendo lo slider la luminosità del pannello cambia immediatamente.

      5.1 Verifica complessiva dello stato del sistema

      Comandi utili per controllare che tutto sia in ordine dopo un aggiornamento o un riavvio:

      # Driver grafico in uso (deve mostrare crocus, accelerazione attiva)
      glxinfo | grep -i "OpenGL renderer"
      glxinfo | grep -i "direct rendering"
      
      # Kernel bloccato ancora attivo
      apt-mark showhold
      
      # Kernel più recente disponibile su disco
      ls -1v /boot/vmlinuz-*
      
      # Valori di luminosità correnti
      cat /sys/class/backlight/gmux_backlight/brightness
      cat /sys/class/backlight/gmux_backlight/max_brightness
      • Questo topic è stato modificato 3 mesi, 2 settimane fa da flongo.
      • Questo topic è stato modificato 3 mesi, 2 settimane fa da flongo.
      • Questo topic è stato modificato 3 mesi, 2 settimane fa da flongo.
      • Questo topic è stato modificato 3 mesi, 2 settimane fa da flongo.
Visualizzazione 0 filoni di risposte
  • Devi essere connesso per rispondere a questo topic.