Driver NVIDIA su Debian 12 BookWorm e Secure Boot
fonte: https://r1bnc.com/post/93/
PREMESSA: includo queste informazioni a solo scopo di annotazione, dopo le ricerche fatte ho preferito usare il metodo della disattivazione della validazione al boot piuttosto che addentrarmi poi alla firma dei driver.
I driver NVIDIA non funzionano su Debian con Secure Boot abilitato, o si disabilita il Secure Boot, o si disattiva solo la validazione o serve firmarli prima.
Per disattivare la validazione (metodo più veloce e senza dover agire sulle imposazioni macchina) si procede con il comando:
sudo mokutil --disable-validation
Verrà richiesta una password da 8 a 16 caratteri, conviene mettere una cosa semplice tipo 11111111 perchè poi verranno richiesti dei caratteri a caso (tre nel mio caso) indicando la posizione nella password, dopo ogni carattere immesso va premuto INVIO per confermare.
Dopo il riavvio del PC si entrerà nella schermata di gestione MOK , si selezione l’opzione per cambiare lo stato della validazione, verranno richiesti i caratteri della password, riavviare poi al termine.
Nei successivi boot uscirà un messaggio in alto che avvisa che il boot non è sicuro, poi partirà senza problemi e se i driver NVIDIA erano già installati è facile che funzionino già da soli, per verificare usare il comando:
$ nvidia-smi
Usando questo metodo non serve fare altro.
Per procedere invece alla firma dei driver con Secure Boot attivo occorre innanzi tutto avere i certificati MOK se non si hanno già:
sudo su -
mkdir /root/module-signing
cd /root/module-signing
# Replace USERNAME by your username on the machine
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=USERNAME/"
chmod 600 MOK.priv
Verrà generata una coppia di chiavi MOK.priv e MOK.der
Si importa la chiave nel boot PC (la password impostata verrà richiesta dopo al boot nella fase di importazione, sarà richiesta solo una volta):
mokutil --import /root/module-signing/MOK.der
# You will be prompted for your password twice
# input the temporary one you just imagined
Riavviare il PC, alla schermata blu con la richiesta di importazione della chiave selezionare Enroll MOK e seguire le indicazioni (verrà richiesta la password di prima), riavviare poi il PC.
Controlliamo che il certificato sia attivo:
sudo mokutil --test-key /root/module-signing/MOK.der
/root/module-signing/MOK.der is already in the enrollment
request
Ora il certificato è caricato nel boot e si può procedere alla firma dei moduli.
I driver quasi sicuramente sono gestiti da DKMS, gli si deve dire dove sono i certificati per le firme, si apre il file /etc/dkms/framework.con e aggiunge:
mok_signing_key="/root/module-signing/MOK.priv"
mok_certificate="/root/module-signing/MOK.der"
Se nonostante i parametri i driver non vengono firmati, si può provare a indicare uno script di comando, sempre in framework.conf aggiungere:
sign_tool="/etc/dkms/sign_helper.sh"
Creare poi lo script /etc/dkms/sign_helper.sh:
/lib/modules/"$1"/build/scripts/sign-file sha512 /root/.mok/
client.priv /root/.mok/client.der "$2"
Renderlo poi eseguibilie:
sudo chmod +x /etc/dkms/sign_helper.sh
Per procedere alla firma le istruzioni che ho trovato parlano di driver nel formato .ko ma nel mio caso erano in formato compresso .ko.xz , ho quindi creato uno script adattandolo ai file compressi:
#!/bin/bash
# Impostazione delle variabili d'ambiente
VERSION="$(uname -r)"
SHORT_VERSION="$(uname -r | cut -d . -f 1-2)"
MODULES_DIR="/lib/modules/$VERSION"
KBUILD_DIR="/usr/lib/linux-kbuild-$SHORT_VERSION"
MOK_PRIV="/root/module-signing/MOK.priv"
MOK_DER="/root/module-signing/MOK.der"
KBUILD_SIGN_PIN=""
# Chiedi la passphrase per la chiave privata
echo -n "Passphrase per la chiave privata: "
read -s KBUILD_SIGN_PIN
export KBUILD_SIGN_PIN
# Directory dove si trovano i driver
cd "$MODULES_DIR/updates/dkms"
# Trova tutti i file .ko.xz e firmali uno per uno
find -name "*.ko.xz" | while read i; do
# Decomprimiamo il file .ko.xz
echo "Decomprimendo $i..."
xz -d "$i"
# Firma del file .ko
KO_FILE="${i%.xz}" # Rimuove l'estensione .xz
echo "Firmando il modulo $KO_FILE..."
sudo --preserve-env=KBUILD_SIGN_PIN "$KBUILD_DIR/scripts/sign-file" sha256 "$MOK_PRIV" "$MOK_DER" "$KO_FILE"
# Ricomprimi il file .ko firmato in .ko.xz
echo "Ricomprimendo $KO_FILE..."
xz "$KO_FILE"
# Rimuovi il file temporaneo senza l'estensione .xz
rm -f "$KO_FILE"
echo "Modulo $KO_FILE firmato e ricompressione completata."
done
# Aggiornamento dell'initramfs
echo "Aggiornando initramfs..."
sudo update-initramfs -k all -u
# Firma del kernel (serve?)
#echo "Firmando il kernel..."
#sbsign --key "$MOK_PRIV" --cert "/root/module-signing/MOK.pem" "/boot/vmlinuz-$VERSION" --output "/boot/vmlinuz-$VERSION.tmp"
# Sostituisci il kernel firmato
#sudo mv "/boot/vmlinuz-$VERSION.tmp" "/boot/vmlinuz-$VERSION"
echo "Operazione completata."
Riavviare e verificare con il comando nvidia-smi.