Debian su Lenovo C-260 All-in-One Touch

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
Lock.png ATTENZIONE: questa guida tratta software a sorgente chiuso e potenzialmente non conforme alle Debian Free Software Guidelines.
Considerare la possibilità di ricorrere a programmi aderenti ai principi del Free Software.


Debian-swirl.png Versioni Compatibili

Debian 10 "buster"

Introduzione

Questa guida tratta l'installazione di Debian 10 (buster) su un PC All-in-One Lenovo C260 Touch con UEFI, e il superamento di tutti i problemi incontrati tra firmware difettosi di Lenovo e conseguenti problemi di convivenza con Windows.

Per avviare il menu UEFI è necessario premere F12 durante l'avvio e scegliere Enter Setup. Ho disabilitato i default "ottimizzati" per Windows, ma non ho toccato altro (secure boot attivo, CSM lasciato disattivato, ecc...).

Come sempre in questi casi prima di cominciare si raccomanda un backup completo del sistema su un disco esterno, in modo da poter ripristinare tutto alla situazione iniziale in caso di problemi. Un ottimo strumento per esempio è Clonezilla.

Preparazione

Purtroppo non esiste nessun altro firmware ufficiale di Lenovo per questo modello specifico, in modo da sostituire quello preinstallato. Ce n'è uno solo per il modello senza touch, ma non l'ho testato, non essendo un PC destinato a me e fuori garanzia da diversi anni.

Scaricare l'immagine

Bisogna installare quella per processori PC a 64 bit (architettura amd64), purtroppo con firmware non-free, in quanto richiesto per le schede di rete. Si possono trovare delle immagini netinst non ufficiali con firmware non-free incluso qui.

Scaricare il file firmware-10....-amd64-netinst.iso e copiarlo su una memoria USB.

In alternativa scaricare un'immagine normale (64-bit PC ossia amd64) e scaricare a parte gli archivi dei firmware non-free, sempre su una memoria USB. Possono essere reperiti qui. Saranno richiesti durante l'installazione.

Partizione

Da Windows ridimensionare l'ultima partizione (ce ne sono ben 6 tra Windows, EFI, e Lenovo!), in modo da far spazio per Debian, con gli strumenti di partizionamento disponibili nel sistema.

Installazione

Una volta preparato il sistema e la memoria USB, riavviare il PC con la memoria USB inserita per avviare l'installer di Debian buster.

Installazione del sistema

Selezionare la prima voce Graphical Install, premere e per modificarla, aggiungendo l'opzione acpi=off al termine della riga che inizia con linux, altrimenti il PC si blocca.
Poi avviare e scegliere le configurazioni desiderate, ricordandosi di scegliere il partizionamento guidato del solo spazio libero del disco.

Il firmware non-free è incluso, quindi non dovrebbero esserci problemi per l'installazione di tutto il sistema base. L'installazione di grub comunque non è andata a buon fine. Scegliere di concludere comunque l'installazione, l'installer dovrebbe mostrare a video come avviare comunque il sistema.

Primo avvio

Riavviare con la memoria USB ancora inserita, in modo da avviare l'installer. Premere c per avviare la rescue shell di Grub:

grub>

Selezionare la partizione, in questo caso la settima:

set root=(hd0,gpt7)

utilizzare TAB per verificare la correttezza del disco (hd0 o hd1) e della partizione con l'autocompletamento. La partizione che ci interessa è quella di tipo ext, e dovrebbe essere la penultima (con l'ultima riservata come swap).
Tutti i percorsi inizianti con / nei comandi successivi faranno riferimento a tale partizione.

Impostare come caricare Linux, scegliendo il corretto numero di partizione /dev/sdaX (con al posto di X lo stesso della partizione gptX scelta; in questo esempio la 7) e l'opzione acpi=off:

linux /vmlinuz root=/dev/sda7 acpi=off

Impostare come caricare il RAM disk:

initrd /initrd.img

E avviare il sistema:

boot

Risoluzione dei problemi

Ora che abbiamo avviato il sistema appena installato, dobbiamo installare grub e poi procedere alla risoluzione di tutti gli altri problemi riscontrati.

Forzare l'avvio di Debian

Sia grub-install (anche con --force-extra-removable) sia efibootmgr non risolvono nulla. Le loro configurazioni sono ignorate e il firmware di Lenovo avvia Windows a ogni avvio, ignorando e poi rimuovendo tutte le altre voci.

La soluzione qua proposta prevede il "mascheramento" di Debian come Windows per ingannare il firmware.

In /boot/efi/EFI dovremmo vedere tre cartelle:

$ ls /boot/efi/EFI
Boot debian Microsoft

Otteniamo privilegi di amministrazione e controlliamo la configurazione EFI:

# efibootmgr
BootCurrent: 0000
Timeout: 0 seconds
BootOrder: 0000,2001,2002,2003
Boot0000* Windows Boot Manager
Boot0001* UEFI Generic Boot
Boot0002* UEFI IPV6 Network Boot
Boot0003* UEFI IPV6 Network Boot
Boot0004* Windows Boot Manager

Non c'è traccia di Debian, e aggiungerla non avrebbe effetto. Effettuiamo allora il dump della configurazione di Windows (in questo caso Boot0000):

# efibootdump Boot0000
Boot0000: * Windows Boot Manager PciRoot(0x0)/Pci(0x13,0x0)/Sata(0,0,0)/HD(2,GPT,b7cde5d5-c1fb-4a14-9bf6-304e5ed0dc2d,0x1f4800,0x82000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)RC

Il valore che ci interessa è racchiuso tra File( e ), ossia \EFI\Microsoft\Boot\bootmgfw.efi. Dobbiamo utilizzare questo file per lanciare il caricatore di Debian (shimx64.efi) al posto di Windows.

Rinominiamo la cartella Microsoft in /boot/efi/EFI in Windows:

# cd /boot/efi/EFI
# mv Microsoft Windows

Ora, sempre dalla stessa cartella, creiamo la cartella Microsoft e ci copiamo dentro debian, chiamandola Boot:

# mkdir Microsoft
# cp -r debian Microsoft/Boot

E per finire creiamo una copia di shimx64.efi e la chiamiamo bootmgfw.efi:

# cd Microsoft/Boot
# cp shimx64.efi bootmgfw.efi

Ora il file \EFI\Microsoft\Boot\bootmgfw.efi avvia Debian sotto falso nome per ingannare il firmware Lenovo, che non funziona a dovere.

Installiamo grub per sicurezza (in caso l'installazione non sia andata a buon fine, ma non dovrebbe essere necessario, visto che tanto è installato come Microsoft):

# grub-install

Si noti che il problema ACPI non è ancora stato risolto, quindi invece di aggiornare grub è preferibile risolvere almeno quello, per non dover aggiungere manualmente acpi=off ogni volta alle opzioni di avvio. Inoltre non è ancora possibile avviare Windows.

ACPI e numero di core riconosciuti

Con ACPI disabilitato (acpi=off), oltre a non poterne utilizzare le funzioni, non si riescono a utilizzare tutti i core disponibili (4 per questo modello). Non è proprio una soluzione accettabile!

Ho provato diverse alternative ad acpi=off, e la migliore sembrerebbe essere idle=nomwait.

Modifichiamo quindi il file /etc/default/grub, per esempio con nano:

# nano /etc/default/grub

per impostare la riga con GRUB_CMDLINE_LINUX (non la riga GRUB_CMDLINE_LINUX_DEFAULT, infatti vogliamo che la modifica abbia effetto anche se riavviassimo il sistema per singolo utente root), in modo da ottenere:

GRUB_CMDLINE_LINUX="idle=nomwait"

E rendiamo effettive le modifiche, aggiornando grub:

# update-grub2

Si noti che Windows non è stato trovato.

Info.png Parametri di boot
Per completezza, questi sono gli altri parametri controllati:
acpi=ht
risolve i freeze, ma continua a mostrare soltanto uno dei 4 core;
nolapic
come sopra;
noapic
nessun effetto, neanche in combinazione con le precedenti opzioni;
idle=poll
risolve il problema come idle=nomwait, riconoscendo tutti e 4 i core, ma è una soluzione ancora meno efficiente; quindi da usarsi solo se quella presentata non fosse sufficiente.

Non è stato trovato nulla da configurare nell'UEFI, e non si è risolto neanche disattivando ogni possibile opzione per il risparmio energetico.

Segnalo per completezza che i problemi riscontrati non si sono risolti nemmeno installando un kernel Linux dai backports (attualmente alla versione 5.2).


Avvio grafico (splash screen)

Se si volesse avviare con splash screen grafico all'avvio al posto delle scritte di avvio dei vari servizi, è possibile specificarlo in /etc/default/grub alla riga GRUB_CMDLINE_LINUX_DEFAULT:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

E poi aggiornare:

# update-grub2

Si consiglia comunque di abilitarlo eventualmente soltanto una volta risolti i problemi relativi ad ACPI, in modo da escludere che siano dovuti all'opzione splash.

Permettere l'avvio di Windows

Per poter avviare Windows, da Debian bisogna creare una voce nel boot manager EFI per Windows, nel nuovo percorso (/boot/efi/EFI/Windows):

# efibootmgr -c -a -L Windows -p 2 -l "/boot/efi/EFI/Windows/Boot/bootmgfw.efi"

Supponendo che /boot/efi sia montata in /dev/sda2, altrimenti impostare il corretto numero di partizione dopo l'opzione -p (basta usare: findmnt /boot/efi).
Nel dettaglio:

-c
crea una nuova voce;
-a
abilita la voce all'avvio;
-L label
assegna un'etichetta alla voce;
-d disk
solo se diverso da /dev/sda, è il disco contenente la partizione EFI;
-p num
imposta il numero di partizione EFI;
-l path
imposta il percorso del loader (è quello ottenuto inizialmente con efibootdump, modificando la cartella Microsoft con Windows, di nostra creazione).

Ora è necessario far riconoscere la voce a os-prober.
Copiamo lo script /usr/lib/os-probes/mounted/efi/20microsoft per crearne uno 21windows, e lo modifichiamo con nano:

# cd /usr/lib/os-probes/mounted/efi
# cp -p 20microsoft 21windows
# nano 21windows

Modifichiamo la voce microsoft (NOTA: solo la parte dopo item_in_dir!) alla riga:

for microsoft in $(item_in_dir microsoft "$efi"); do

per ottenere:

for microsoft in $(item_in_dir windows "$efi"); do

in questo modo os-prober, che è invocato a ogni aggiornamento di grub in automatico, cerca nella cartella Windows invece che in quella Microsoft, attualmente occupata da Debian.

Eseguiamo ora nuovamente un aggiornamento di grub:

# update-grub2

E al prossimo avvio dovremmo vedere sia Debian sia Windows.

Spegnimento

Dulcis in fundo, dopo ogni spegnimento il PC si riavvia.
Wake On Lan era disabilitato, quindi non poteva essere quello, ma in caso accertarsene all'avvio dal menu di configurazione UEFI.

Per risolvere il problema, creiamo un semplice script in /usr/local/sbin/before-poweroff.sh con nano:

# nano /usr/local/sbin/before-poweroff.sh

e questo contenuto:

#! /bin/sh
for f in /sys/bus/*/devices/*/power/control; do
    echo on > "$f"
done
sleep 1
exit 0 

e diamogli i permessi di esecuzione:

# chmod 744 /usr/local/sbin/before-poweroff.sh

Questo script imposta a on la gestione dell'energia di tutti i dispositivi, invece di lasciarlo su auto, impedendo l'autosospensione dei dispositivi e forzandone il ripristino.

Ora dobbiamo farlo eseguire prima di ogni spegnimento, creando un servizio di systemd apposito (senza DefaultDependencies, essendo uno script avviato in fase di spegnimento), da avviarsi in automatico quando viene invocato poweroff.target e che termini prima che sia eseguito systemd-poweroff.service, in modo da garantire la precedenza del nostro script.
Creiamo quindi con nano un file /etc/systemd/system/before-poweroff.service:

# nano /etc/systemd/system/before-poweroff.service

con questo contenuto:

[Unit]
Description=Poweroff helper script
DefaultDependencies=no
Before=systemd-poweroff.service

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/before-poweroff.sh

[Install]
WantedBy=poweroff.target

Lo installiamo nel sistema e ricarichiamo tutte le configurazioni di systemd:

# systemctl enable before-poweroff
# systemctl daemon-reload

Ora finalmente il problema dello spegnimento che causa il riavvio del sistema è risolto.

Sospensione automatica

La sospensione automatica, se utilizzate Gnome (come di default) o qualunque altro Desktop Environment che la prevede, talvolta causa un freeze del sistema. Sinceramente mi sono limitato a disattivarla (Settings -> Power)...

Elenco delle cose ancora da fare

Provare la sospensione, verificare il supporto con nuovi kernel senza il parametro idle=nomwait (testato anche con backports, versione 5.2 attualmente) e testare se l'installazione si poteva completare con tale parametro al posto di acpi=off.

Se non altro il touch funziona senza bisogno di fare nulla.




Guida scritta da: HAL 9000 10:20, 6 ott 2019 (CEST) Swirl-auth20.png Debianized 20%
Estesa da:
Verificata da:

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