Taggato: Linux Mint, macbook pro, macos
- Questo topic ha 0 risposte, 1 partecipante ed è stato aggiornato l'ultima volta 3 mesi, 2 settimane fa da
flongo.
-
AutorePost
-
-
29 Giugno 2026 alle 12:12 #65086
flongoAmministratore del forumRegistro 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
nomodesetil 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=consoleNota: 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-genericPer 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 percorsivmlinuz/initrdnel file40_custome rieseguireupdate-grub.3.2 Se la voce personalizzata smette di funzionare
- Verificare che il kernel indicato in
40_customesista ancora in/boot - Verificare che
apt-mark holdsia ancora attivo:sudo apt-mark showhold - In caso di emergenza, è sempre possibile avviare con
nomodesetdal menu GRUB (premere “e” sulla voce di boot, aggiungerenomodesetalla rigalinux) 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_brightnessNota: se modificando
intel_backlightla luminosità reale del pannello non cambia, ma modificandogmux_backlightsì, 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.shTest manuale (chiederà la password, finché non si configura il passo 4.3):
sudo /usr/local/bin/set-brightness.sh 504.3 Permesso senza password: regola sudoers
Per permettere allo script grafico (4.4) di richiamare
set-brightness.shsenza 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 consudo /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.shad ogni movimento. Richiede il modulotkinter.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.desktopNota: 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; avviabrightness-gui.pycon un doppio click. Non contiene logica propria.brightness-gui.py (Interfaccia)
Finestra con slider visibile; ad ogni movimento richiamaset-brightness.shpassandogli la percentuale scelta.set-brightness.sh (Operativo)
Unico componente che scrive davvero nel sistema (filegmux_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
-
-
AutorePost
- Devi essere connesso per rispondere a questo topic.