Il kernel è il componente centrale di un sistema operativo che gestisce le risorse hardware e fornisce ai programmi i servizi di basso livello necessari per funzionare. Coordina CPU, memoria, dispositivi, processi, filesystem e comunicazioni, creando un confine controllato tra le applicazioni e l’hardware.

Quando apri un file, avvii un programma, invii dati attraverso la rete o utilizzi una periferica, l’applicazione non dovrebbe poter manipolare liberamente memoria, processore e dispositivi. Passa invece attraverso interfacce controllate dal sistema operativo, che esegue le operazioni che richiedono privilegi elevati.

Questa distinzione spiega anche perché kernel, sistema operativo e distribuzione Linux non sono sinonimi. Linux è il nucleo del sistema; Debian o Ubuntu sono sistemi completi costruiti intorno ad esso.

Capire questo livello aiuta inoltre a comprendere perché un driver difettoso può bloccare un computer, come funzionano le system call, cosa significa architettura monolitica o microkernel e perché un container non è semplicemente una macchina virtuale più piccola.

Cos’è il kernel in informatica

In informatica, il kernel è il software che opera nel livello più privilegiato del sistema e coordina l’accesso alle risorse fondamentali del computer.

Un modello semplificato può essere rappresentato così:

applicazioni → librerie/runtime → system call → livello privilegiato → hardware

Non significa che ogni applicazione comunichi direttamente con il sistema operativo a ogni istruzione. Gran parte del lavoro viene svolta da librerie, runtime e altri componenti in user space. Quando però serve un’operazione privilegiata — leggere un file, creare un processo, ottenere memoria, utilizzare la rete o comunicare con un dispositivo — quel confine diventa centrale.

Il risultato è una separazione delle responsabilità: le applicazioni chiedono un servizio, mentre il sistema decide come eseguirlo in sicurezza sulle risorse disponibili.

Dove si trova tra hardware, sistema operativo e applicazioni

Immagina un’applicazione che deve leggere un file da disco.

Il programma conosce il percorso del file e sa quali dati vuole ottenere, ma non deve sapere come comandare direttamente il controller NVMe, come interpretare la struttura fisica del dispositivo o come coordinarsi con altri processi che stanno utilizzando lo stesso hardware.

Il percorso concettuale è più simile a questo:

applicazione → richiesta di lettura → interfaccia di sistema → filesystem → driver → dispositivo

Una parte importante di questo percorso viene coordinata dal livello privilegiato del sistema operativo.

Nel caso di Linux, per esempio, il Virtual File System offre un’interfaccia comune attraverso la quale operazioni come open(), read() e write() possono lavorare con filesystem differenti.

La stessa logica vale per molte altre risorse: il programma formula una richiesta a un livello di astrazione più alto e il sistema si occupa dei dettagli necessari per portarla fino all’hardware.

Kernel e sistema operativo non sono la stessa cosa

Usare i due termini come sinonimi crea confusione soprattutto quando si parla di Linux.

Il kernel è una parte del sistema operativo, non necessariamente l’intero sistema operativo.

Una distribuzione GNU/Linux comprende normalmente molto altro:

  • il nucleo Linux;
  • librerie di sistema;
  • shell e utility;
  • package manager;
  • servizi;
  • bootloader;
  • strumenti di amministrazione;
  • repository software;
  • applicazioni e componenti aggiuntivi.

È per questo che Debian non coincide con Linux: Debian utilizza Linux come base, ma costruisce intorno ad esso un sistema operativo completo.

Lo stesso vale per Ubuntu Server, che aggiunge pacchetti, strumenti di amministrazione, configurazioni e un proprio ciclo di manutenzione.

La distinzione diventa ancora più evidente osservando Windows e macOS: entrambi possiedono un proprio nucleo di sistema, ma nessuno identificherebbe l’intero sistema operativo esclusivamente con quel componente.

Come passa una richiesta dal programma all’hardware

La definizione “il kernel è il cuore del sistema operativo” è facile da ricordare, ma spiega poco.

Il passaggio decisivo è capire cosa accade quando un programma ha bisogno di qualcosa che non può fare direttamente.

Supponiamo che un’applicazione voglia aprire un file.

A livello concettuale:

  1. l’applicazione invoca una funzione attraverso una libreria o un runtime;
  2. quando necessario viene effettuata una system call;
  3. la CPU passa attraverso un meccanismo controllato verso codice privilegiato;
  4. il sistema valida la richiesta;
  5. individua le strutture e le risorse interessate;
  6. esegue o coordina l’operazione;
  7. restituisce il risultato al processo;
  8. l’esecuzione continua in user space.

Il dettaglio esatto cambia fra sistemi operativi e architetture hardware, ma il modello generale è importante: questo livello non elimina il confine fra software e hardware, lo governa.

Diagramma del percorso da applicazione e user space attraverso una system call fino al kernel e all’hardware
Le applicazioni non controllano direttamente l’hardware: le richieste privilegiate attraversano interfacce controllate prima di raggiungere le risorse del sistema.

User space e kernel space

Uno dei principali meccanismi di protezione consiste nel separare il codice applicativo dal codice con privilegi più elevati.

In user space vengono eseguiti normalmente applicazioni e molti servizi. Il loro accesso alle risorse è limitato.

Nel kernel space opera invece il codice che deve poter gestire strutture e risorse critiche.

Non è soltanto una convenzione organizzativa.

La separazione limita ciò che un programma normale può fare. Un’applicazione non dovrebbe poter decidere autonomamente di leggere qualunque area della memoria fisica, modificare strutture interne del sistema o impartire comandi arbitrari alle periferiche.

Microsoft descrive chiaramente questa differenza nella documentazione dedicata a user mode e kernel mode: un processo user-mode dispone del proprio spazio di indirizzi virtuale, mentre il codice kernel-mode opera con privilegi molto più ampi.

La conseguenza pratica è importante. Un crash in user space può restare confinato al processo; un errore grave nel codice privilegiato può compromettere l’intero sistema.

Le system call: come un programma richiede un servizio

Le system call, o chiamate di sistema, sono uno dei principali punti di ingresso attraverso i quali il software in user space richiede servizi al sistema operativo.

Esempi concettuali comprendono:

  • aprire o leggere un file;
  • creare un processo;
  • allocare o mappare memoria;
  • comunicare attraverso socket;
  • modificare determinati attributi;
  • attendere eventi;
  • interagire con dispositivi.

La documentazione dell’API userspace di Linux raccoglie diverse interfacce che costituiscono il contratto tra applicazioni e sistema.

È utile però evitare un’altra semplificazione: il programma che scrivi normalmente non implementa a mano ogni passaggio verso una system call.

Se utilizzi PHP, Python, Node.js, Java o una libreria C, molti dettagli vengono gestiti da runtime e librerie. Il confine rimane comunque lì sotto.

Quando un backend apre un file di configurazione, una libreria stabilisce una connessione di rete o un database scrive dati su storage, prima o poi le operazioni che richiedono risorse protette arrivano alle interfacce del sistema operativo.

Kernel mode: perché i privilegi cambiano il rischio

Più privilegi significano più possibilità, ma anche conseguenze potenzialmente più gravi.

Un componente che opera in modalità privilegiata può dover:

  • accedere a memoria protetta;
  • rispondere a interrupt hardware;
  • controllare dispositivi;
  • modificare strutture di sistema;
  • partecipare allo scheduling;
  • gestire I/O;
  • applicare controlli di sicurezza.

Questa è una delle ragioni per cui driver e moduli vanno trattati in modo diverso da una normale applicazione.

Non tutto il codice di un driver deve necessariamente essere kernel-mode in ogni sistema operativo: esistono anche modelli di driver in user space. Il principio resta però lo stesso. Più codice sposti nel dominio privilegiato, maggiore è la quantità di software che può incidere direttamente sulla stabilità e sulla sicurezza dell’intero sistema.

Le funzioni fondamentali del sistema

Non esiste una singola funzione chiamata “gestione del computer”. Il sistema coordina diversi sottosistemi, ciascuno con responsabilità precise.

Le implementazioni cambiano fra sistemi operativi, ma quattro aree sono particolarmente utili per costruire un modello mentale: esecuzione, memoria, I/O e comunicazione.

Processi, thread e scheduling della CPU

Un computer può avere centinaia o migliaia di processi e thread attivi, ma il numero di core della CPU è molto inferiore.

Serve quindi un componente che decida quale attività può utilizzare una CPU e quando.

È il ruolo dello scheduler.

In Linux, la documentazione dedicata allo scheduler mostra che il problema comprende classi e politiche differenti, bilanciamento fra CPU e requisiti specifici per workload diversi.

Per un’introduzione non serve entrare negli algoritmi interni. Basta capire il meccanismo:

molte attività pronte → scheduler → CPU disponibili

Lo scheduler deve reagire a processi che si bloccano, tornano eseguibili, terminano o competono per il processore. Su sistemi multicore deve inoltre decidere come distribuire il lavoro fra più CPU logiche.

Dire semplicemente che “il kernel controlla la CPU” è quindi riduttivo. Il punto è gestire il modo in cui il tempo di esecuzione viene assegnato alle attività del sistema.

Memoria fisica, memoria virtuale e isolamento dei processi

La RAM è una risorsa condivisa, ma un’applicazione non lavora normalmente ragionando direttamente in termini di celle fisiche sparse nei moduli di memoria.

Il sistema utilizza la memoria virtuale per presentare ai processi spazi di indirizzamento controllati e separati, mappandoli sulle risorse fisiche disponibili.

La documentazione Linux sulla gestione della memoria comprende memoria virtuale, demand paging, allocazione per componenti privilegiati e programmi user space e mapping dei file negli spazi di indirizzamento dei processi.

Questo permette di ottenere proprietà essenziali:

  • isolamento fra processi;
  • protezione delle aree riservate;
  • condivisione controllata;
  • mapping di file;
  • gestione della pressione sulla memoria;
  • utilizzo della RAM attraverso un livello virtuale.

La memoria virtuale non significa semplicemente “usare il disco quando finisce la RAM”. Quella è soltanto una possibile conseguenza di alcuni meccanismi di gestione. Il concetto centrale è separare l’indirizzo visto dal processo dalla posizione fisica effettiva della memoria.

Driver e gestione delle periferiche

Una tastiera, una scheda di rete, un controller storage e una GPU espongono caratteristiche molto differenti.

Se ogni applicazione dovesse conoscere direttamente il protocollo di ogni dispositivo, il software diventerebbe ingestibile.

I driver forniscono il livello specializzato necessario per controllare l’hardware attraverso le interfacce previste dal sistema.

Linux dispone di un’ampia Driver API, perché il supporto ai dispositivi comprende bus, interrupt, power management, DMA e molti altri sottosistemi.

Il percorso concettuale può quindi diventare:

programma → API del sistema → codice privilegiato → driver → dispositivo

Questo spiega anche perché installare o aggiornare un driver non equivale a installare una normale applicazione: in alcuni casi quel software entra direttamente nel percorso che controlla l’hardware.

Filesystem, rete e comunicazione

Le responsabilità non si fermano a CPU e RAM.

Fra le altre funzioni rientrano:

  • filesystem;
  • stack di rete;
  • socket;
  • IPC, cioè comunicazione tra processi;
  • gestione dei dispositivi;
  • timer;
  • controllo degli accessi;
  • gestione degli interrupt.

Prendiamo ancora Linux.

Il VFS offre un’interfaccia comune ai filesystem, mentre lo stack di rete permette ai programmi di utilizzare socket senza implementare direttamente Ethernet, IP o TCP.

Questi sottosistemi mostrano perché il nucleo del sistema non può essere ridotto a un piccolo “programma di avvio”: continua a lavorare per tutto il tempo in cui il computer è operativo.

Tipi di kernel: monolitico, microkernel e architetture ibride

La classificazione è utile, ma diventa facilmente troppo scolastica.

Nella realtà esistono implementazioni che prendono idee da più famiglie e confini che cambiano in base a cosa consideriamo parte del livello privilegiato.

La distinzione più utile riguarda quanto software viene mantenuto nel dominio con privilegi elevati e quanto viene spostato fuori.

ArchitetturaIdea di fondoVantaggio potenzialeCompromesso principale
Monoliticamolti servizi operano nello spazio privilegiatocomunicazione interna diretta e buone prestazioniun bug nel codice privilegiato può avere impatto ampio
Microkernelil core mantiene un insieme più ristretto di meccanismimaggiore separazione dei componentipiù comunicazione fra servizi
Ibridacombina caratteristiche delle due famiglieequilibrio progettuale specificol’etichetta non descrive uniformemente tutte le implementazioni
Exokernelprotegge e assegna risorse lasciando molte astrazioni alle applicazioniforte controllo a livello applicativomodello specialistico

Kernel monolitico: cosa significa davvero

In un’architettura monolitica, una parte consistente dei servizi del sistema operativo viene eseguita nello spazio privilegiato e può comunicare attraverso chiamate interne.

Linux viene normalmente classificato come kernel monolitico, ma qui serve una precisazione fondamentale: monolitico non significa necessariamente statico o impossibile da estendere senza ricompilare tutto.

Linux supporta infatti moduli caricabili.

Un driver, un filesystem o un altro componente può in molti casi essere fornito separatamente ed essere caricato quando necessario.

La documentazione ufficiale descrive il caricamento automatico dei moduli e strumenti come modprobe. Questo significa che l’equazione:

architettura monolitica = ogni componente deve essere compilato permanentemente nell’immagine principale

è sbagliata.

Una definizione più utile è questa: “monolitico” descrive soprattutto dove vengono eseguiti determinati servizi e come sono organizzati, non l’assenza di modularità.

Microkernel: quali servizi restano nel core

Un microkernel prova a mantenere nel livello più privilegiato soltanto un insieme ristretto di meccanismi fondamentali.

A seconda dell’implementazione possono rientrare nel core elementi come:

  • scheduling;
  • comunicazione inter-processo;
  • gestione degli spazi di indirizzamento a basso livello;
  • interrupt;
  • primitive fondamentali di sincronizzazione.

Servizi che in un’architettura monolitica potrebbero essere eseguiti con privilegi elevati possono invece vivere in processi separati.

Il vantaggio concettuale è forte: se un servizio è separato e meno privilegiato, può essere più facile limitare l’impatto di alcuni errori.

Il compromesso è che componenti distinti devono comunicare. Message passing, transizioni di protezione e context switch possono avere un costo e rendono l’architettura più distribuita.

Non bisogna però trasformare questo in “microkernel = lento”. È un trade-off progettuale e le implementazioni moderne possono utilizzare tecniche sofisticate per ridurre questi costi.

Architetture ibride: perché la classificazione non è sempre netta

“Ibrido” viene utilizzato per descrivere architetture che combinano caratteristiche attribuite tradizionalmente ai modelli monolitici e ai microkernel.

Il problema nasce quando l’etichetta viene trasformata in una risposta universale.

Apple, per esempio, descrive ufficialmente XNU come un’architettura che combina Mach, componenti provenienti da FreeBSD e IOKit.

Per Windows bisogna invece essere più cauti.

Microsoft descrive un insieme di componenti kernel-mode, Executive, manager e librerie e specifica nella documentazione della Windows kernel-mode kernel library che il termine microkernel non si applica al nucleo Windows corrente.

Per questo non conviene imparare la materia memorizzando una tabella rigida:

Linux = monolitico
Windows = ibrido
altro sistema = microkernel

Le categorie sono strumenti per comprendere l’architettura, non etichette sufficienti a descriverla interamente.

Exokernel e nanokernel: casi più specialistici

L’exokernel nasce da una proposta di ricerca molto diversa dai sistemi operativi general purpose più comuni.

L’idea è mantenere nel livello privilegiato soprattutto protezione, allocazione e controllo sicuro delle risorse fisiche, lasciando a librerie a livello applicativo la costruzione di molte astrazioni tradizionalmente fornite dal sistema operativo.

Il lavoro originale del MIT sull’architettura exokernel parla infatti di gestione delle risorse a livello applicativo.

Nanokernel, invece, è un termine meno uniforme. È stato utilizzato in contesti diversi per indicare layer estremamente piccoli, primitive ancora più ridotte di un microkernel o livelli vicini all’hardware e alla virtualizzazione.

Per una guida introduttiva il punto da ricordare è questo: monolitico e microkernel sono categorie molto più utili per comprendere i sistemi general purpose comuni; exokernel e nanokernel appartengono soprattutto a discussioni architetturali più specialistiche.

Kernel Linux: cosa lo distingue e come viene distribuito

Linux è probabilmente il caso più facile da osservare direttamente perché codice sorgente, documentazione e processo di sviluppo sono pubblici.

È però proprio questa visibilità a creare un equivoco frequente: Linux non coincide automaticamente con una distribuzione GNU/Linux.

Linux non è una distribuzione

Quando installi Debian, Ubuntu, Fedora o un’altra distribuzione, non installi soltanto Linux.

Il sistema comprende un nucleo più un insieme coordinato di software user space.

Possiamo semplificare così:

Linux + librerie + utility + servizi + package manager + pacchetti = distribuzione GNU/Linux

Due distribuzioni possono quindi utilizzare release differenti, configurazioni diverse e patch proprie pur appartenendo entrambe allo stesso ecosistema.

Questo è particolarmente importante su un server: sapere che una certa release upstream esiste non significa che sia automaticamente quella da installare manualmente sulla macchina.

La distribuzione mantiene normalmente la propria build attraverso repository e un proprio ciclo di aggiornamento.

Un’architettura monolitica può essere modulare

Una delle caratteristiche pratiche di Linux è il supporto ai Loadable Kernel Modules.

Puoi vedere i moduli attualmente caricati con:

lsmod

e ottenere informazioni su un componente specifico con:

modinfo nome_modulo

Questo modello consente di aggiungere funzionalità al sistema in esecuzione senza compilare necessariamente ogni elemento nell’immagine principale.

Driver hardware, filesystem e altri sottosistemi possono essere modulari.

Non tutto deve però essere un modulo. Alcune funzionalità possono essere integrate direttamente, altre disabilitate e altre ancora fornite esternamente.

È quindi più corretto descrivere Linux come kernel monolitico modulare che usare “monolitico” come sinonimo di “un unico blocco immutabile”.

Mainline, stable e longterm: come funzionano le release Linux

Il progetto distingue diversi tipi di release.

La pagina ufficiale sulle release attive separa in particolare:

  • prepatch/RC, candidate destinate soprattutto a sviluppo e test;
  • mainline, ramo principale dello sviluppo;
  • stable, che riceve correzioni per le release stabili;
  • longterm, mantenute più a lungo con backport delle correzioni rilevanti.

Ma questo non significa che un amministratore debba scaricare automaticamente la versione più recente da kernel.org.

Le distribuzioni mantengono proprie build e possono applicare patch senza seguire esattamente la numerazione dell’ultima release upstream.

Su un server Debian o Ubuntu, quindi, la domanda corretta non è soltanto:

Qual è l’ultima versione pubblicata?

ma anche:

Quale release è supportata dalla mia distribuzione e dal mio workload?

Per sistemi di produzione è spesso la distinzione più importante.

Come vedere quale versione Linux stai usando

Il comando più semplice è:

uname -r

L’opzione -r mostra la kernel release.

Se vuoi vedere più informazioni:

uname -a

La documentazione GNU di uname distingue fra nome del sistema, release, versione, architettura e altri dati.

L’output di uname -r, per esempio:

6.x.y-distribuzione

può includere informazioni aggiunte dal maintainer.

Non va quindi interpretato automaticamente come semplice numero della release vanilla pubblicata su kernel.org.

Windows e macOS: architetture diverse da Linux

Le responsabilità generali sono simili: anche Windows e macOS devono coordinare memoria, processi, thread, I/O e hardware.

Cambia però l’architettura interna e cambia il modo in cui i vari componenti vengono organizzati.

Windows: kernel mode, Executive e componenti privilegiati

Windows distingue nettamente user mode e kernel mode.

Microsoft documenta, fra i componenti privilegiati:

  • memory manager;
  • process and thread manager;
  • I/O manager;
  • Plug and Play manager;
  • power manager;
  • componenti di sicurezza;
  • librerie di basso livello;
  • Executive support.

Il componente più vicino all’hardware fornisce operazioni come scheduling e gestione degli interrupt, mentre altri elementi privilegiati offrono servizi più ampi.

Questo è il motivo per cui descrivere Windows semplicemente come “un microkernel” è fuorviante: Microsoft afferma esplicitamente che questa etichetta non si applica all’architettura corrente.

È un buon esempio del limite delle classificazioni scolastiche. Sapere dove vengono eseguiti i componenti e come interagiscono è più informativo dell’etichetta presa da sola.

XNU su macOS: Mach, BSD e IOKit

macOS utilizza XNU, parte del sistema Darwin.

Il repository open source di Apple descrive XNU come un’architettura che combina:

  • Mach;
  • componenti BSD derivati da FreeBSD;
  • IOKit per il modello dei driver.

Nel source tree questa combinazione è visibile anche nella separazione fra directory come osfmk, legata ai sottosistemi basati su Mach, bsd e iokit.

Questo non significa che macOS sia semplicemente “Mach con un’interfaccia grafica”.

XNU è il risultato dell’integrazione di più componenti e rappresenta un’architettura differente sia da Linux sia da Windows.

Container e macchine virtuali: la differenza che conta

Uno dei modi migliori per capire perché questo livello del sistema è importante consiste nel confrontare container e macchine virtuali.

Entrambi permettono di isolare workload, ma il confine dell’isolamento non è lo stesso.

Perché i container Linux condividono il kernel dell’host

Un container non contiene normalmente un’intera istanza Linux indipendente a livello di kernel.

Docker definisce il container come un ambiente isolato che condivide il nucleo del sistema operativo sottostante. Questo è uno dei motivi per cui i container possono avere un overhead più contenuto rispetto a una VM completa.

Se vuoi approfondire il livello applicativo, nella guida dedicata trovi come funziona Docker e come utilizza i container.

Il modello può essere rappresentato così:

Applicazione A ─┐
Container A     │
                ├── Linux host ── hardware
Applicazione B ─┤
Container B     │

Namespaces, cgroup e altri meccanismi permettono di separare processi e risorse, ma il componente privilegiato resta condiviso.

Questo ha conseguenze pratiche.

Un’immagine container deve essere compatibile con l’ambiente nel quale verrà eseguita. Non puoi pensare a un container Linux come a un pacchetto che porta automaticamente con sé qualunque nucleo di sistema necessario.

Perché una macchina virtuale può avere un proprio kernel

Una macchina virtuale introduce invece un confine di virtualizzazione hardware.

Schema semplificato:

Applicazione
Sistema guest
Kernel guest
──────────────
macchina virtuale
hypervisor
hardware

Il sistema guest può quindi utilizzare una propria istanza del componente centrale del sistema operativo.

Una VM Linux può essere ospitata sopra un sistema differente perché il confine non dipende soltanto dalle primitive di isolamento dell’host.

Questo spiega una differenza decisiva:

AspettoContainerMacchina virtuale
Kernelnormalmente condiviso con l’ambiente hostproprio del sistema guest
OS guest completonon richiesto per ogni containernormalmente presente
Isolamentolivello sistema operativolivello virtualizzazione
Overheadgeneralmente inferioregeneralmente superiore
Caso tipicopackaging ed esecuzione applicativasistema operativo completo

Non significa che uno sia sempre migliore dell’altro.

I container sono molto efficaci quando vuoi distribuire applicazioni in ambienti riproducibili. Le VM sono più adatte quando serve un confine di virtualizzazione differente o un sistema operativo guest indipendente.

Quando i container diventano numerosi e distribuiti su più nodi entra in gioco l’orchestrazione. Kubernetes affronta quel problema a un livello superiore: non sostituisce il sistema operativo dei nodi, ma organizza workload che continuano a dipendere dalle risorse sottostanti.

Nei servizi CaaS una parte di questa infrastruttura viene ulteriormente gestita dal provider, ma CPU, memoria, rete e host continuano a esistere sotto l’astrazione.

Aggiornamenti e compilazione: quando intervenire

Per la maggior parte degli utenti Linux non è qualcosa da scaricare e compilare manualmente.

Su una normale distribuzione, aggiornamenti e patch arrivano attraverso il sistema di pacchetti e il ciclo di manutenzione previsto.

Esistono però scenari in cui conoscere la versione installata diventa importante.

Aggiornamenti, sicurezza e riavvio

Gli aggiornamenti possono correggere:

  • vulnerabilità;
  • regressioni;
  • problemi di compatibilità;
  • bug nei driver;
  • problemi nei sottosistemi;
  • supporto hardware.

La disponibilità di una nuova release upstream non significa comunque che il server debba essere immediatamente spostato su quella versione.

In produzione devi considerare:

  • supporto della distribuzione;
  • compatibilità dei driver;
  • moduli esterni;
  • hypervisor;
  • software di sicurezza;
  • workload;
  • finestra di manutenzione;
  • possibilità di rollback.

Un aggiornamento che installa una nuova immagine richiede normalmente l’avvio di quella nuova versione prima che il sistema la utilizzi.

Per verificare cosa stai effettivamente eseguendo resta quindi utile:

uname -r

prima e dopo l’intervento.

Compilare una versione personalizzata: quando ha senso e quando no

Compilare Linux dai sorgenti è possibile e la documentazione ufficiale comprende un intero sistema di build.

Può avere senso quando:

  • stai sviluppando componenti di basso livello;
  • lavori su driver;
  • devi testare una patch;
  • sviluppi un sistema embedded;
  • hai requisiti hardware particolari;
  • stai eseguendo benchmark o ricerca;
  • devi modificare opzioni non disponibili nella distribuzione.

Per un normale server web, invece, compilare manualmente il kernel soltanto perché “ottimizzato è meglio” raramente è un buon punto di partenza.

Ottieni più responsabilità su:

  • aggiornamenti;
  • patch di sicurezza;
  • configurazione;
  • moduli;
  • compatibilità;
  • rollback;
  • troubleshooting.

Se la versione fornita dalla distribuzione soddisfa i requisiti, mantenerla attraverso i canali supportati è normalmente molto più semplice.

Domande frequenti

Il kernel è un software?

Sì. È software, anche se opera a un livello molto più vicino all’hardware e con privilegi più elevati rispetto alle normali applicazioni.

Il suo compito non è soltanto “far partire il sistema”: continua a gestire risorse e servizi fondamentali durante il funzionamento del computer.

Linux è un kernel o un sistema operativo?

Linux è un kernel.

Nel linguaggio comune si usa spesso “Linux” anche per indicare sistemi completi basati su di esso, ma tecnicamente una distribuzione come Debian o Ubuntu comprende moltissimi componenti aggiuntivi.

Cos’è un kernel panic?

Un kernel panic è una condizione nella quale il sistema rileva un problema grave dal quale non può proseguire in modo sicuro e porta la macchina a fermarsi o a seguire la policy configurata per il panic.

Non ogni errore produce necessariamente questo risultato. Linux distingue, per esempio, fra differenti condizioni di errore e può registrare un “Oops” senza arrivare sempre allo stesso esito.

Se il problema è ricorrente bisogna analizzare log, hardware, moduli, driver e cambiamenti recenti invece di limitarsi a riavviare il sistema.

Docker ha un kernel proprio?

Un normale container Linux non possiede un kernel Linux indipendente: condivide quello dell’ambiente nel quale viene eseguito.

Docker Desktop può utilizzare una macchina virtuale Linux su alcune piattaforme; in quel caso i container condividono la componente di sistema presente nella VM, non una copia contenuta nell’immagine Docker.

Si può cambiare kernel senza cambiare sistema operativo?

Sì.

Una distribuzione può installare nuove versioni o build mantenendo invariato il resto del sistema operativo. Può inoltre conservare più release installate per permettere l’avvio di una versione precedente in caso di problemi.

Questo non significa però che qualsiasi build sia automaticamente compatibile con qualunque distribuzione o configurazione.

Conclusione

Capire il kernel significa capire dove termina la libertà dell’applicazione e inizia il controllo del sistema sulle risorse.

Un programma può chiedere di aprire un file, utilizzare memoria, creare un processo o inviare dati in rete. Non dovrebbe però poter manipolare direttamente ogni componente hardware senza regole.

Il modello utile da ricordare è:

applicazione → user space → richiesta di sistema → livello privilegiato → risorse e hardware

Da qui diventano più comprensibili anche concetti che altrimenti sembrano separati: driver, memoria virtuale, system call, distribuzioni Linux, container, macchine virtuali e kernel panic.

E soprattutto diventa chiara una distinzione decisiva: il kernel non è tutto il sistema operativo, ma è il componente che permette al resto del sistema di utilizzare l’hardware in modo coordinato, protetto e controllato.