Debian su Lenovo C-260 All-in-One Touch
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. |
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.
Parametri di boot Per completezza, questi sono gli altri parametri controllati:
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 |
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) | Debianized 20% |
Estesa da: | |
Verificata da: | |
Verificare ed estendere la guida | Cos'è una guida Debianized |