Hibernazione con swapfile su Debian 13 (Trixie): guida completa

Quando ho migrato il mio ThinkPad T14s Gen 2i da Fedora a Debian 13, una delle prime cose che ho notato è che l’hibernazione — chiudere il coperchio e ritrovare tutto esattamente come l’avevo lasciato, senza consumo di batteria — non funzionava subito come su Windows o su Fedora. Il motivo è semplice: Debian, come molte distribuzioni moderne, non crea più di default una partizione di swap dedicata, e senza swap (o senza uno swapfile configurato correttamente) l’hibernazione semplicemente non ha dove scrivere lo stato della RAM.

Configurarla con uno swapfile invece che con una partizione dedicata è stata la scelta giusta per me — più flessibile, ridimensionabile senza toccare le partizioni — ma richiede qualche passaggio in più rispetto al setup classico. Ecco esattamente cosa ho fatto.

Questa guida fa parte del percorso completo su Debian 13 Trixie su ThinkPad.

Perché uno swapfile e non una partizione swap

Le distribuzioni più recenti (Debian compreso, con l’installer che spesso non alloca più swap dedicato se hai abbastanza RAM) tendono a preferire lo swapfile per un motivo pratico: puoi crearlo, ridimensionarlo o eliminarlo senza dover ripartizionare il disco. Se in futuro cambio idea sulla dimensione, modifico un file — non tocco lo schema delle partizioni.

Il compromesso è che configurare l’hibernazione con uno swapfile richiede di recuperare manualmente due informazioni che con una partizione dedicata il sistema troverebbe da solo: l’UUID del filesystem che ospita lo swapfile, e l’offset fisico del file all’interno di quel filesystem.

Requisito: quanto deve essere grande lo swapfile

Per l’hibernazione, lo swapfile deve poter contenere l’intero contenuto della RAM (più un margine di sicurezza). Sul mio ThinkPad con 16GB di RAM, ho creato uno swapfile da 16GB esatti — se hai meno RAM o vuoi un margine più ampio, regola la dimensione di conseguenza.

Configurazione passo-passo

1. Crea lo swapfile

sudo fallocate -l 16G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

Se il tuo filesystem è Btrfs, fallocate da solo non basta — servono attributi specifici (No_COW e compressione disabilitata) prima di popolare il file, altrimenti l’hibernazione non funzionerà correttamente. Su ext4 (il filesystem di default di Debian) i comandi sopra sono sufficienti.

2. Rendilo permanente in fstab

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

3. Trova l’UUID del filesystem

findmnt -no UUID -T /swapfile

Segnati il valore restituito, ti servirà tra poco.

4. Trova l’offset dello swapfile

Questo è il passaggio che quasi tutte le guide generiche saltano o spiegano male. Su ext4:

sudo filefrag -v /swapfile | awk '$1=="0:" {print substr($4, 1, length($4)-2)}'

Il numero restituito è l’offset fisico (in blocchi filesystem) del primo blocco del file. È il valore che permette al kernel, durante il resume, di trovare lo stato salvato senza dover montare prima il filesystem.

5. Configura i parametri del kernel

Modifica la configurazione di GRUB:

sudo nano /etc/default/grub

Nella riga GRUB_CMDLINE_LINUX_DEFAULT, aggiungi (sostituendo con i tuoi valori reali):

resume=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx resume_offset=1234567

Poi applica le modifiche:

sudo update-grub

Se in futuro decidi anche di nascondere i messaggi del kernel e il menu di GRUB all’avvio (io l’ho fatto proprio su questo stesso file), ho scritto una guida dedicata: Boot silenzioso su Debian con GRUB e Plymouth.

6. Configura initramfs-tools

echo 'RESUME=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' | sudo tee /etc/initramfs-tools/conf.d/resume
sudo update-initramfs -u -k all

7. Riavvia e testa

sudo reboot

Dopo il riavvio, testa l’hibernazione direttamente:

sudo systemctl hibernate

Se tutto è configurato correttamente, il PC si spegne completamente e, alla riaccensione, ritrovi la sessione esattamente come l’avevi lasciata — browser aperti, documenti, tutto.

Il problema che quasi mi ha fatto rinunciare: l’offset che cambia

Qui viene la parte che ho imparato a mie spese. L’offset dello swapfile non è fisso per sempre: se il file viene ricreato, deframmentato, o se il filesystem riorganizza i blocchi (capita più spesso di quanto pensi), il valore cambia — e l’hibernazione smette di funzionare silenziosamente, senza errori evidenti, finché non provi a fare il resume e ti ritrovi con un boot pulito invece che con la sessione salvata.

La soluzione che uso è un hook di post-installazione del kernel, che ricalcola l’offset automaticamente ogni volta che viene installato un nuovo kernel (momento in cui initramfs viene comunque rigenerato):

sudo nano /etc/kernel/postinst.d/resume-offset-update

Contenuto dello script:

#!/bin/bash
OFFSET=$(filefrag -v /swapfile | awk '$1=="0:" {print substr($4, 1, length($4)-2)}')
sed -i "s/resume_offset=[0-9]*/resume_offset=$OFFSET/" /etc/default/grub
update-grub

Rendilo eseguibile:

sudo chmod +x /etc/kernel/postinst.d/resume-offset-update

Da quando ho aggiunto questo hook, non ho più avuto sorprese dopo un aggiornamento del kernel — che su Debian, con i rilasci regolari di sicurezza, capita con una certa frequenza.

Un’ultima nota pratica: se il tuo disco è pieno o vicino alla capienza massima, aggiungere uno swapfile da 16GB (o più, in base alla tua RAM) può creare problemi di spazio.

Se sei corto di spazio, un SSD NVMe da 1TB su Amazon costa ormai relativamente poco e ti toglie qualsiasi pensiero sullo spazio libero, sia per lo swapfile che per il resto del sistema.

Conclusione

L’hibernazione con swapfile su Debian 13 richiede qualche passaggio manuale in più rispetto a una partizione swap dedicata, ma una volta capito il meccanismo di UUID e offset è del tutto affidabile — e lo script di aggiornamento automatico elimina l’unico vero punto debole di questo approccio. Se stai configurando da zero un ThinkPad (o un notebook simile) su Debian, questa guida si inserisce bene insieme alle altre sistemazioni che ho documentato per lo stesso setup: dal WiFi Intel AX201 che si disconnette al GNOME Keyring che chiede sempre la password.

L’ho poi disattivata, ma la configurazione è questa.


Articoli correlati:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Torna in alto