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
LinuxIl 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/LinuxCon -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/LinuxOgni 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-amd64Il 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_64Il 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 ancheamd64nei 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), dettaarm64nei pacchetti;armv7l: ARM a 32 bit (i Raspberry Pi più vecchi o con sistema a 32 bit), dettaarmhf;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: bookwormuname 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-64Sui 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
4Il 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 rebootDopo 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 (spessounknown, quindi poco utili);-o: sistema operativo.arch: equivale auname -m;hostname: equivale auname -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
unamenon dice la distribuzione: un kernel6.1.0-28-amd64può 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 -rnon è 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(peruname) èamd64(per i pacchetti Debian e Ubuntu), eaarch64è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 -mmostraarmv7lanche 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 -rmostra 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 -nmostra il nome impostato sul sistema, che non coincide necessariamente con l'indirizzo con cui si raggiunge il server (per quello si usanoipeping). Per cambiarlo si usasudo 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
unameesiste, ma alcune opzioni (come-o) possono mancare o dare risultati diversi. Se scrivi uno script che deve funzionare ovunque, prova solo-s,-re-m. - Le informazioni sono pubbliche: l'output di
uname -amostra 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
| Comando | Cosa fa |
|---|---|
uname | Mostra il nome del kernel (Linux) |
uname -a | Tutte le informazioni, su una riga |
uname -r | Versione del kernel in uso |
uname -m | Architettura del processore |
uname -n | Nome della macchina |
uname -sr | Nome e versione del kernel insieme |
cat /etc/os-release | Distribuzione e versione installate |
hostnamectl | Riepilogo di macchina, sistema e kernel |
dpkg --print-architecture | Architettura nel formato dei pacchetti Debian |
cat /proc/version | Dettagli di compilazione del kernel |
nproc | Numero di processori disponibili |