Salta al contenuto principale

uname: che sistema e che kernel sono?

Inviato da tuxsa il

Prima di installare un programma, cercare un pacchetto o chiedere aiuto su un forum, c'è una domanda che torna sempre: "su che macchina stai lavorando?". uname risponde in un attimo: dice il nome del kernel, la sua versione, l'architettura del processore e il nome della macchina. È uno dei comandi più brevi da scrivere e dei più usati quando si fa assistenza.

Cos'è

uname (da UNIX name) fa parte del pacchetto coreutils, quindi è presente su ogni distribuzione. Mostra le informazioni di base sul sistema operativo in esecuzione, ma con una precisazione importante: quello che chiamiamo "Linux" è in senso stretto solo il kernel, il cuore che dialoga con l'hardware. Debian, Ubuntu, Fedora e le altre sono distribuzioni, cioè il kernel più i programmi che lo accompagnano. uname parla del kernel; per sapere quale distribuzione è installata servono altri comandi (li vediamo più avanti).

Cosa fa

Stampa uno o più dati sul sistema: il nome del kernel, il nome della macchina in rete, la versione del kernel, l'architettura dell'hardware e il nome del sistema operativo. Senza opzioni mostra solo il nome del kernel; con le opzioni si sceglie cosa vedere.

Come si usa

$ uname [opzioni]

Gli esempi mostrano un server Debian 12 chiamato web01.

Esempio 1: il comando senza opzioni

$ uname
Linux

Il risultato è il nome del kernel. Da solo serve a poco su Linux, ma è utile negli script che devono funzionare anche su altri sistemi: su macOS lo stesso comando risponde Darwin, su FreeBSD FreeBSD.

Esempio 2: tutte le informazioni, con -a

$ uname -a
Linux web01 6.1.0-28-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.119-1
(2024-11-22) x86_64 GNU/Linux

Con -a (all) si vede tutto in una riga sola (qui spezzata in due per leggerla meglio). È l'output che si incolla in una richiesta di aiuto o nella segnalazione di un errore. Le parti, in ordine:

  • Linux: il nome del kernel;
  • web01: il nome della macchina (hostname);
  • 6.1.0-28-amd64: la versione (release) del kernel;
  • #1 SMP PREEMPT_DYNAMIC Debian 6.1.119-1 (2024-11-22): il numero di compilazione, le caratteristiche del kernel e la data;
  • x86_64: l'architettura del processore;
  • GNU/Linux: il sistema operativo.

Esempio 3: una informazione alla volta

$ uname -s
Linux
$ uname -n
web01
$ uname -r
6.1.0-28-amd64
$ uname -v
#1 SMP PREEMPT_DYNAMIC Debian 6.1.119-1 (2024-11-22)
$ uname -m
x86_64
$ uname -o
GNU/Linux

Ogni lettera corrisponde a un dato: -s (kernel name), -n (nodename), -r (kernel release), -v (kernel version), -m (machine), -o (operating system). Si possono combinare: uname -sr stampa per esempio Linux 6.1.0-28-amd64.

Esempio 4: capire il numero del kernel

$ uname -r
6.1.0-28-amd64

Il numero ha una struttura precisa: 6.1.0 è la versione del kernel (maggiore, minore e correzione), -28 è la revisione scelta dalla distribuzione (che aggiunge le sue correzioni di sicurezza) e amd64 indica l'architettura a 64 bit di Debian. Su Ubuntu avrai qualcosa come 6.8.0-48-generic, su un kernel personalizzato il nome sarà diverso. Per sapere se un servizio funziona con un certo kernel, conta soprattutto la prima parte (6.1).

Esempio 5: l'architettura del processore

$ uname -m
x86_64
$ arch
x86_64

Il valore di -m dice per quale tipo di processore bisogna scaricare i programmi. I valori più comuni:

  • x86_64: i PC e i server a 64 bit (Intel e AMD), detta anche amd64 nei pacchetti Debian;
  • aarch64: ARM a 64 bit (Raspberry Pi 4 e 5 con sistema a 64 bit, i server ARM, i Mac con chip Apple se si usa Linux in una macchina virtuale), detta arm64 nei pacchetti;
  • armv7l: ARM a 32 bit (i Raspberry Pi più vecchi o con sistema a 32 bit), detta armhf;
  • i686: PC a 32 bit, ormai rari.

Il comando arch è un'abbreviazione di uname -m. Attenzione ai nomi: lo stesso processore si chiama x86_64 per uname ma amd64 per apt e dpkg (vedi l'articolo su apt): dpkg --print-architecture dà il nome usato dai pacchetti.

Esempio 6: quale distribuzione è installata?

$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
ID=debian
$ lsb_release -a
Distributor ID: Debian
Description:    Debian GNU/Linux 12 (bookworm)
Release:        12
Codename:       bookworm

uname non sa il nome della distribuzione: per quello si legge il file /etc/os-release, presente su tutte le distribuzioni moderne (con cat, vedi l'articolo relativo). Il comando lsb_release -a dà la stessa informazione, ma su alcune installazioni minime va installato a parte. Per avere solo il nome leggibile: grep PRETTY_NAME /etc/os-release.

Esempio 7: tutto in un colpo solo con hostnamectl

$ hostnamectl
 Static hostname: web01
       Icon name: computer-vm
         Chassis: vm
      Machine ID: 4f2a9c1d5e7b4a0f8c3d6e1b2a9f7c40
         Boot ID: 9b8e7d6c5a4f3e2d1c0b9a8f7e6d5c4b
  Virtualization: kvm
Operating System: Debian GNU/Linux 12 (bookworm)
          Kernel: Linux 6.1.0-28-amd64
    Architecture: x86-64

Sui sistemi con systemd (vedi l'articolo su systemctl), hostnamectl riunisce in un solo output il nome della macchina, la distribuzione, il kernel, l'architettura e perfino se si tratta di una macchina virtuale. Il risultato è un riepilogo molto comodo quando si fa assistenza. Gli identificativi mostrati qui sono inventati.

Esempio 8: altre fonti sul kernel

$ cat /proc/version
Linux version 6.1.0-28-amd64 (debian-kernel@lists.debian.org) (gcc-12 (Debian
12.2.0-14) 12.2.0, GNU ld (GNU Binutils for Debian) 2.40) #1 SMP PREEMPT_DYNAMIC
Debian 6.1.119-1 (2024-11-22)
$ hostname
web01
$ nproc
4

Il file /proc/version è la fonte da cui uname prende i dati, e aggiunge il compilatore usato per costruire il kernel (anche qui l'output è su una riga sola, spezzata per leggerla). hostname mostra solo il nome della macchina, come uname -n. nproc dice quanti processori (o core) sono disponibili: non fa parte di uname, ma si cerca spesso insieme; per il dettaglio c'è lscpu.

Esempio 9: il kernel in uso è quello aggiornato?

$ uname -r
6.1.0-28-amd64
$ ls /boot/vmlinuz-*
/boot/vmlinuz-6.1.0-28-amd64  /boot/vmlinuz-6.1.0-31-amd64
$ sudo reboot

Dopo un aggiornamento (vedi l'articolo su apt), il nuovo kernel viene installato ma non è in uso finché non si riavvia. Il confronto è semplice: uname -r dice il kernel in esecuzione, e i file /boot/vmlinuz-* elencano quelli installati. Se ne esiste uno più recente, con un numero di revisione più alto (qui -31 contro -28), le correzioni di sicurezza non sono ancora attive e serve un riavvio.

Esempio 10: uso negli script

#!/bin/bash
ARCH=$(uname -m)

case "$ARCH" in
    x86_64)  FILE="programma-linux-amd64" ;;
    aarch64) FILE="programma-linux-arm64" ;;
    armv7l)  FILE="programma-linux-armv7" ;;
    *) echo "Architettura non supportata: $ARCH" >&2; exit 1 ;;
esac

echo "Scarico $FILE per $(uname -sr)"
curl -fLO "https://example.org/download/$FILE"

Lo script sceglie quale file scaricare in base all'architettura (case confronta un valore con vari modelli), e si ferma con un errore se non la conosce. È lo schema classico degli script di installazione di molti programmi. $(...) inserisce nel testo l'output di un comando; per curl vedi il relativo articolo, e example.org è un indirizzo inventato.

Opzioni utili

  • -a: tutte le informazioni, su una riga; -s: nome del kernel (predefinito).
  • -n: nome della macchina; -r: versione del kernel; -v: numero di compilazione e data.
  • -m: architettura; -p: tipo di processore e -i: piattaforma hardware (spesso unknown, quindi poco utili); -o: sistema operativo.
  • arch: equivale a uname -m; hostname: equivale a uname -n.
  • /etc/os-release, lsb_release -a, hostnamectl: informazioni sulla distribuzione.
  • lscpu, nproc: informazioni sul processore; uptime: da quanto tempo la macchina è accesa.

Attenzione a

  • uname non dice la distribuzione: un kernel 6.1.0-28-amd64 può essere Debian, ma anche una derivata. Per sapere cosa è installato leggi /etc/os-release.
  • Linux e kernel non sono la stessa cosa: la versione di uname -r non è quella della distribuzione. "Debian 12" e "kernel 6.1" sono due numeri diversi, e non vanno confusi nelle richieste di aiuto.
  • I nomi delle architetture cambiano: x86_64 (per uname) è amd64 (per i pacchetti Debian e Ubuntu), e aarch64 è arm64. Scegliere il file sbagliato dà un errore di formato eseguibile, di solito poco chiaro.
  • Un sistema a 32 bit può girare su un hardware a 64 bit: su un Raspberry Pi con sistema a 32 bit, uname -m mostra armv7l anche se il processore è a 64 bit. Quello che conta è il sistema installato, non il processore.
  • I container usano il kernel della macchina ospite: dentro un container Docker uname -r mostra il kernel del server, non uno proprio. Quello che cambia nel container è la distribuzione (/etc/os-release), non il kernel.
  • Il nome della macchina può non essere quello pubblico: uname -n mostra il nome impostato sul sistema, che non coincide necessariamente con l'indirizzo con cui si raggiunge il server (per quello si usano ip e ping). Per cambiarlo si usa sudo hostnamectl set-hostname nuovo-nome.
  • Il kernel in uso e quello installato possono differire: dopo un aggiornamento serve un riavvio per usare il nuovo (esempio 9). Su un server importante, programma il riavvio in un orario adatto, perché ogni servizio si ferma per qualche istante.
  • Su altri sistemi cambia: su macOS e sui sistemi BSD uname esiste, ma alcune opzioni (come -o) possono mancare o dare risultati diversi. Se scrivi uno script che deve funzionare ovunque, prova solo -s, -r e -m.
  • Le informazioni sono pubbliche: l'output di uname -a mostra il nome della macchina e il kernel. Prima di incollarlo in un forum o in una segnalazione pubblica, valuta se il nome del server è un'informazione che vuoi rendere nota.

Riepilogo

ComandoCosa fa
unameMostra il nome del kernel (Linux)
uname -aTutte le informazioni, su una riga
uname -rVersione del kernel in uso
uname -mArchitettura del processore
uname -nNome della macchina
uname -srNome e versione del kernel insieme
cat /etc/os-releaseDistribuzione e versione installate
hostnamectlRiepilogo di macchina, sistema e kernel
dpkg --print-architectureArchitettura nel formato dei pacchetti Debian
cat /proc/versionDettagli di compilazione del kernel
nprocNumero di processori disponibili