Salta al contenuto principale

swapon: attivare e disattivare lo spazio di swap

Inviato da tuxsa il

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  64M

La 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       5

Con 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 argument

swapoff 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=miaswap

Come 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      3

swapon -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 = 10

Il 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, --raw e --bytes ne 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 ETICHETTA e -U UUID: indicano l'area per etichetta o UUID.
  • -v: messaggi dettagliati.
  • -d[=POLITICA]: abilita il "discard" per gli SSD (once o pages): 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: swapoff deve 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 con free prima.
  • Permessi del file di swap: sempre chmod 600 e 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 mkswap non si attivano ("read swap header failed").
  • File con "buchi": un file creato con truncate è "sparso" e mkswap avverte che il kernel potrebbe rifiutarlo (l'avviso contains holes l'ho visto nell'articolo su mkfs). Per lo swap crea il file con dd o fallocate.
  • Per renderlo permanente: swapon vale fino al riavvio. Aggiungi una riga a /etc/fstab (per esempio /swapfile none swap sw 0 0) e controlla con swapon -a e swapon --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: swapon da 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 di swapon --show.

Riepilogo

ComandoCosa fa
swapon --showElenca le aree di swap attive
swapon FILEAttiva un file o una partizione di swap
swapon -p 10 FILEAttiva con una priorità
swapon -aAttiva tutto ciò che è in /etc/fstab
swapon -L ETICHETTAAttiva per etichetta
swapon -U UUIDAttiva per UUID
swapoff FILEDisattiva un'area
swapoff -aDisattiva tutto
mkswap FILEPrepara un'area di swap (prima di attivarla)
sysctl vm.swappinessMostra la propensione del kernel a usare lo swap