Quando la memoria RAM sta per finire, Linux può spostare su disco i dati che non servono subito, per fare posto a quelli che servono. Lo spazio su disco usato per questo scopo si chiama swap. Si crea con mkswap, ma è swapon che lo mette effettivamente in funzione, e swapoff che lo spegne.
Cos'è
swapon fa parte di util-linux, come mkswap, mount e losetup. Il suo compagno swapoff fa l'operazione inversa. Lo swap può essere una partizione dedicata, un dispositivo (un volume LVM, per esempio) o un normale file: per il kernel sono equivalenti.
Cosa fa
swapon dice al kernel di cominciare a usare un'area di swap; swapon --show (o swapon -s) elenca quelle attive; swapon -a attiva tutte quelle elencate in /etc/fstab, ed è ciò che il sistema fa all'avvio. swapoff spegne un'area: prima il kernel riporta in RAM tutto ciò che vi era finito, e solo dopo la libera, quindi l'operazione può richiedere tempo e fallire se la RAM non basta.
Come si usa
$ sudo swapon [opzioni] [DISPOSITIVO|FILE]
$ sudo swapoff [opzioni] [DISPOSITIVO|FILE]Servono i permessi di root. Negli esempi uso file di swap in una cartella di prova (/tmp/sw), che nel mio sandbox funzionavano come uno swap vero. Sul tuo sistema un file di swap sta di solito in /swapfile o simili, mentre i nomi come /dev/sdb2 compaiono solo come esempi. Gli output sono di swapon 2.39.3, in inglese: con un sistema in italiano qualche riga potrebbe comparire tradotta.
Esempio 1: vedere lo swap attivo
$ swapon --show
NAME TYPE SIZE USED PRIO
/tmp/sw/swap.img file 64M 0B -2
$ cat /proc/swaps
Filename Type Size Used Priority
/tmp/sw/swap.img file 65532 0 -2
$ free -m | sed -n '1p;3p'
total used free shared buff/cache available
Swap: 63 0 63--show mostra una tabella con nome, tipo, dimensione, quantità usata e priorità. Se non c'è nessuno swap attivo non stampa niente; /proc/swaps (che -s, ormai deprecato, rispecchia) mostra gli stessi dati in kibibyte, e free (vedi l'articolo dedicato) riporta il totale nella riga Swap. Il sandbox aveva già 0 swap prima del test: la prima volta che ho lanciato swapon --show non stampava nulla. Nell'output ho allargato le tabulazioni con spazi.
Esempio 2: creare e attivare un file di swap
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=64 status=none
$ sudo chmod 600 /swapfile
$ sudo mkswap -L miaswap /swapfile
Setting up swapspace version 1, size = 64 MiB (67104768 bytes)
LABEL=miaswap, UUID=b7656b29-183a-4815-b9a1-53a265ef3a64
$ sudo swapon /swapfile
$ swapon --show=NAME,TYPE,SIZE
NAME TYPE SIZE
/swapfile file 64MLa sequenza è sempre la stessa: creare il file (con dd o con fallocate -l 64M /swapfile, che nel mio test ha funzionato allo stesso modo), limitare i permessi a root con chmod 600, formattarlo con mkswap, attivarlo con swapon. Per uno swap vero scegli la dimensione che ti serve (il file qui è piccolo per prova); i valori di UUID sono esempi e il percorso /swapfile è una convenzione, nel mio test il file stava in /tmp/sw. --show=COLONNE sceglie le colonne, --noheadings toglie l'intestazione, --bytes mostra le dimensioni in byte e --raw separa le colonne con spazi semplici.
Esempio 3: priorità tra più aree di swap
$ sudo swapon -p 10 swap.img
$ sudo swapon -p 5 s2.img
$ swapon --show=NAME,PRIO
NAME PRIO
/tmp/sw/swap.img 10
/tmp/sw/s2.img 5Con più aree attive il kernel usa per prima quella con la priorità più alta (da -1 a 32767, dove una priorità più alta ha la precedenza). Senza -p la priorità parte da -2 e decresce a ogni nuova area, come si vede nell'esempio 1. Se vuoi dare la precedenza a un'area veloce (un SSD, per esempio) rispetto a una lenta, assegnale una priorità maggiore; se due aree hanno la stessa priorità, il kernel le usa in parallelo.
Esempio 4: spegnere lo swap
$ sudo swapoff swap.img
$ swapon --show
$ sudo swapoff -a
$ sudo swapoff swap.img
swapoff: swap.img: swapoff failed: Invalid argumentswapoff indica l'area da spegnere; swapoff -a le spegne tutte (e free mostra poi uno swap totale pari a 0). L'ultimo comando prova a spegnere un'area non attiva e dà l'errore Invalid argument, con un codice di uscita diverso da zero. Con -v sia swapon sia swapoff descrivono ciò che fanno: swapoff swap.img e, per swapon -v, anche found signature [pagesize=4096, signature=swap].
Esempio 5: attivare per etichetta o per UUID
$ sudo swapon -L miaswap
$ sudo swapoff -L miaswap
$ sudo swapon -U b7656b29-183a-4815-b9a1-53a265ef3a64
$ sudo swapon LABEL=miaswapCome per mount, si può indicare l'area con -L (etichetta), -U (UUID) o con le forme LABEL= e UUID=. Funziona come blkid (vedi l'articolo): la ricerca passa dai nomi riconosciuti dal sistema. Nel mio sandbox, swapon -L e swapon -U hanno attivato l'area giusta (nel mio caso il file, non il dispositivo loop che ne aveva uno identico, per via della cache di blkid). Un'area già attiva non può essere riattivata: swapon: ...: swapon failed: Device or resource busy.
Esempio 6: gli errori più comuni
$ sudo swapon nonswap.img
swapon: nonswap.img: read swap header failed
$ sudo swapon nope.img
swapon: cannot open nope.img: No such file or directory
$ sudo swapon swap.img
swapon: swap.img: insecure permissions 0644, 0600 suggested."read swap header failed" significa che il dispositivo non è stato formattato con mkswap (nel mio test, un file di zeri): swapon esce con codice 255. L'avviso sui permessi (insecure permissions) in questa versione non impedisce l'attivazione (codice 0), ma va preso sul serio: chiunque potrebbe leggere il contenuto della RAM finito nel file. Meglio sempre chmod 600.
Esempio 7: attivare tutto dal file fstab
$ cat fstab.test
/tmp/sw/swap.img none swap sw,pri=7 0 0
/tmp/sw/s2.img none swap sw,pri=3 0 0
$ sudo swapon -a -T fstab.test
$ swapon --show=NAME,PRIO --noheadings
/tmp/sw/swap.img 7
/tmp/sw/s2.img 3swapon -a legge /etc/fstab e attiva tutte le righe di tipo swap; con -T puoi indicare un file diverso, il che permette di provare senza toccare quello vero (come ho fatto io). Le opzioni pri= impostano la priorità. Se una riga punta a un file inesistente, swapon -a stampa l'errore ed esce con 255, ma le altre aree vengono attivate lo stesso; con l'opzione nofail nella riga, un'area mancante viene saltata senza errori (nel mio test, codice 0). In /etc/fstab un file di swap compare così: /swapfile none swap sw 0 0.
Esempio 8: la propensione a usare lo swap (swappiness)
$ sysctl vm.swappiness
vm.swappiness = 60
$ sudo sysctl -w vm.swappiness=10
vm.swappiness = 10Il parametro vm.swappiness (60 è il valore predefinito; di norma va da 0 a 100, nei kernel più recenti fino a 200) regola quanto volentieri il kernel sposta dati su swap invece di scartare la cache dei file. Un valore basso, come 10, è comune su server e desktop con molta RAM. Con sysctl -w la modifica vale fino al riavvio (vedi l'articolo su sysctl); per renderla permanente va scritta in /etc/sysctl.conf o in un file di /etc/sysctl.d/. Nel mio sandbox la modifica è riuscita, e l'ho poi riportata a 60.
Esempio 9: uso negli script
#!/bin/bash
F="$1"
[ -n "$F" ] || { echo "uso: $0 file-di-swap" >&2; exit 1; }
if swapon --show=NAME --noheadings | grep -qx "$F"; then
echo "$F: già attivo"
exit 0
fi
[ -f "$F" ] || { echo "non esiste: $F" >&2; exit 1; }
chmod 600 "$F"
swapon "$F" && echo "$F: attivato"Lo script attiva un file di swap solo se non lo è già: swapon --show=NAME --noheadings stampa i nomi delle aree attive e grep -qx controlla se il nostro è tra questi (-x richiede la corrispondenza esatta, -q non stampa nulla). Al primo lancio ha risposto "attivato", al secondo "già attivo"; per un file inesistente "non esiste" (codice 1), senza argomenti il messaggio d'uso, e per un file che non è stato formattato con mkswap l'errore di swapon (255). Lo script va lanciato con sudo e con un percorso assoluto: swapon --show mostra i nomi con il percorso completo, e con un percorso relativo il controllo non trova l'area già attiva, per cui swapon risponde Device or resource busy (l'ho verificato).
Opzioni utili
--show[=COLONNE]: tabella delle aree attive (colonne:NAME,TYPE,SIZE,USED,PRIO,UUID,LABEL).--noheadings,--rawe--bytesne cambiano l'aspetto.-a: attiva tutte le aree in/etc/fstab.-T FILE: usa un altro file al posto di/etc/fstab.-p PRIORITÀ: priorità dell'area.-L ETICHETTAe-U UUID: indicano l'area per etichetta o UUID.-v: messaggi dettagliati.-d[=POLITICA]: abilita il "discard" per gli SSD (onceopages): nel sandbox l'attivazione con-dè riuscita, ma l'effetto sul disco non è verificabile.-e: salta in silenzio i dispositivi che non esistono; in questa versione funziona insieme a-a(da solo dà un errore d'uso, "bad usage").swapoff -a: spegne tutto;swapoff DISPOSITIVO: spegne un'area.
Attenzione a
- Dimensione e RAM libera:
swapoffdeve riportare in RAM tutto ciò che è finito su swap: se la RAM libera non basta, il comando può impiegare molto tempo o fallire, e se il sistema è già in difficoltà può peggiorarlo. Controlla confreeprima. - Permessi del file di swap: sempre
chmod 600e proprietà di root: nello swap può finire qualsiasi dato presente in RAM, anche password. - Formatta prima: un file o una partizione che non siano stati preparati con
mkswapnon si attivano ("read swap header failed"). - File con "buchi": un file creato con
truncateè "sparso" emkswapavverte che il kernel potrebbe rifiutarlo (l'avvisocontains holesl'ho visto nell'articolo sumkfs). Per lo swap crea il file conddofallocate. - Per renderlo permanente:
swaponvale fino al riavvio. Aggiungi una riga a/etc/fstab(per esempio/swapfile none swap sw 0 0) e controlla conswapon -aeswapon --show. - Swap su SSD e cifratura: l'uso intenso dello swap consuma gli SSD e, senza cifratura, lascia dati in chiaro su disco. Sono scelte da valutare, non verificate qui.
- Ibernazione: l'ibernazione ("suspend to disk") richiede uno swap grande almeno quanto la RAM e configurazioni aggiuntive:
swaponda solo non basta, e non l'ho provata. - Zram e swap compresso: molte distribuzioni usano uno swap compresso in RAM (
zram), gestito con altri strumenti: può far sembrare "vuoto" l'elenco diswapon --show.
Riepilogo
| Comando | Cosa fa |
|---|---|
swapon --show | Elenca le aree di swap attive |
swapon FILE | Attiva un file o una partizione di swap |
swapon -p 10 FILE | Attiva con una priorità |
swapon -a | Attiva tutto ciò che è in /etc/fstab |
swapon -L ETICHETTA | Attiva per etichetta |
swapon -U UUID | Attiva per UUID |
swapoff FILE | Disattiva un'area |
swapoff -a | Disattiva tutto |
mkswap FILE | Prepara un'area di swap (prima di attivarla) |
sysctl vm.swappiness | Mostra la propensione del kernel a usare lo swap |