Ricerca nel sito web

Come modificare i parametri di runtime del kernel in modo persistente e non persistente


Nella Parte 13 di questa serie LFCS (Linux Foundation Certified Sysadmin) abbiamo spiegato come utilizzare GRUB per modificare il comportamento del sistema passando le opzioni al kernel per il processo di avvio in corso.

Allo stesso modo, è possibile utilizzare la riga di comando in un sistema Linux in esecuzione per alterare determinati parametri del kernel di runtime come modifica una tantum o in modo permanente modificando un file di configurazione.

Pertanto, è possibile abilitare o disabilitare i parametri del kernel al volo senza troppe difficoltà quando necessario a causa di una modifica richiesta nel modo in cui è previsto che il sistema funzioni.

Presentazione del file system /proc

L'ultima specifica del Filesystem Hierarchy Standard indica che /proc rappresenta il metodo predefinito per gestire le informazioni sul processo e sul sistema così come altre informazioni sul kernel e sulla memoria. In particolare, /proc/sys è dove puoi trovare tutte le informazioni su dispositivi, driver e alcune funzionalità del kernel.

L'effettiva struttura interna di /proc/sys dipende fortemente dal kernel utilizzato, ma è probabile che al suo interno si trovino le seguenti directory. A sua volta, ognuna di esse conterrà altre sottodirectory in cui vengono mantenuti i valori per ciascuna categoria di parametri:

  1. dev: parametri per dispositivi specifici collegati alla macchina.
  2. fs: configurazione del filesystem (quote e inode, per esempio).
  3. kernel: configurazione specifica del kernel.
  4. net: configurazione di rete.
  5. vm: utilizzo della memoria virtuale del kernel.

Per modificare i parametri runtime del kernel utilizzeremo il comando sysctl. Il numero esatto di parametri che possono essere modificati può essere visualizzato con:

sysctl -a | wc -l

Se vuoi visualizzare l'elenco completo dei parametri del kernel, basta fare:

sysctl -a 

Poiché l'output del comando precedente sarà composto da MOLTE righe, possiamo utilizzare una pipeline seguita da less per ispezionarla più attentamente:

sysctl -a | less

Diamo uno sguardo alle prime righe. Tieni presente che i primi caratteri di ogni riga corrispondono ai nomi delle directory all'interno di /proc/sys:

Ad esempio, la riga evidenziata:

dev.cdrom.info = drive name:        	sr0

indica che sr0 è un alias per l'unità ottica. In altre parole, è così che il kernel “vede” quell'unità e usa quel nome per fare riferimento ad essa.

Nella sezione seguente spiegheremo come modificare altri parametri di runtime del kernel “più importanti” in Linux.

Come cambiare o modificare i parametri di runtime del kernel Linux

In base a quanto spiegato finora è facile vedere che il nome di un parametro corrisponde alla struttura della directory all'interno di /proc/sys dove si trova.

Per esempio:

dev.cdrom.autoclose → /proc/sys/dev/cdrom/autoclose
net.ipv4.ip_forward → /proc/sys/net/ipv4/ip_forward

Controlla i parametri del kernel Linux

Detto questo, possiamo visualizzare il valore di un particolare parametro del kernel Linux utilizzando sysctl seguito dal nome del parametro o leggendo il file associato:

sysctl dev.cdrom.autoclose
cat /proc/sys/dev/cdrom/autoclose
sysctl net.ipv4.ip_forward
cat /proc/sys/net/ipv4/ip_forward

Imposta o modifica i parametri del kernel Linux

Per impostare il valore di un parametro del kernel possiamo anche usare sysctl, ma usando l'opzione -w e seguito dal nome del parametro, dal segno di uguale e dal valore desiderato.

Un altro metodo consiste nell'utilizzare echo per sovrascrivere il file associato al parametro. In altre parole, i seguenti metodi equivalgono a disabilitare la funzionalità di inoltro dei pacchetti nel nostro sistema (che, tra l'altro, dovrebbe essere il valore predefinito quando un box non deve trasferire traffico tra reti):

echo 0 > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=0

È importante notare che i parametri del kernel impostati utilizzando sysctl verranno applicati solo durante la sessione corrente e scompariranno al riavvio del sistema.

Per impostare questi valori in modo permanente, modifica /etc/sysctl.conf con i valori desiderati. Ad esempio, per disabilitare l'inoltro dei pacchetti in /etc/sysctl.conf assicurati che questa riga appaia nel file:

net.ipv4.ip_forward=0

Quindi esegui il comando seguente per applicare le modifiche alla configurazione in esecuzione.

sysctl -p

Altri esempi di importanti parametri di runtime del kernel sono:

fs.file-max specifica il numero massimo di handle di file che il kernel può allocare per il sistema. A seconda dell'uso previsto del tuo sistema (web/database/file server, per citare alcuni esempi), potresti voler modificare questo valore per soddisfare le esigenze del sistema.

In caso contrario, nella migliore delle ipotesi riceverai il messaggio di errore "Troppi file aperti" e, nel peggiore, potrebbe impedire l'avvio del sistema operativo.

Se a causa di un errore innocente ti trovi in quest'ultima situazione, avvia in modalità utente singolo (come spiegato nella Parte 13 – Configurazione e risoluzione dei problemi del boot loader Grub di Linux) e modifica /etc/sysctl.conf come istruito in precedenza. Per impostare la stessa restrizione in base al singolo utente, fare riferimento alla Parte 14 – Monitorare e impostare i limiti di utilizzo del processo Linux di questa serie.

kernel.sysrq viene utilizzato per abilitare il tasto SysRq sulla tastiera (noto anche come tasto di stampa dello schermo) in modo da consentire a determinate combinazioni di tasti di invocare azioni di emergenza quando il sistema non ha più risposto.

Il valore predefinito (16) indica che il sistema rispetterà la combinazione Alt+SysRq+key ed eseguirà le azioni elencate in sysrq.c documentazione trovata in kernel.org (dove key è una lettera nell'intervallo b-z). Ad esempio, Alt+SysRq+b riavvierà forzatamente il sistema (usalo come ultima risorsa se il tuo server non risponde).

Attenzione! Non tentare di premere questa combinazione di tasti su una macchina virtuale perché potrebbe forzare il riavvio del sistema host!

Se impostato su 1, net.ipv4.icmp_echo_ignore_all ignorerà le richieste ping e le tralascerà a livello di kernel. Questo è mostrato nell'immagine seguente: nota come le richieste ping vengono perse dopo aver impostato questo parametro del kernel:

Un modo migliore e più semplice per impostare parametri di runtime individuali è utilizzare i file .conf all'interno di /etc/sysctl.d, raggruppandoli per categorie.

Ad esempio, invece di impostare net.ipv4.ip_forward=0 e net.ipv4.icmp_echo_ignore_all=1 in /etc/sysctl.conf, possiamo creare un nuovo file chiamato net.conf all'interno di /etc/sysctl.d:

echo "net.ipv4.ip_forward=0" > /etc/sysctl.d/net.conf
echo "net.ipv4.icmp_echo_ignore_all=1" >> /etc/sysctl.d/net.conf

Se scegli di utilizzare questo approccio, non dimenticare di rimuovere quelle stesse righe da /etc/sysctl.conf.

Riepilogo

In questo articolo abbiamo spiegato come modificare i parametri runtime del kernel, sia persistenti che non persistenti, utilizzando sysctl, /etc/sysctl.conf e i file all'interno di / ecc/sysctl.d.

Nella documentazione sysctl puoi trovare maggiori informazioni sul significato di più variabili. Questi file rappresentano la fonte più completa di documentazione sui parametri che possono essere impostati tramite sysctl.

Hai trovato questo articolo utile? Speriamo sicuramente che tu lo abbia fatto. Non esitate a farci sapere se avete domande o suggerimenti per migliorare.