Skip to content

Finding your Linux distribution and OS info#

The first question you ask when you SSH into a server for the first time, or inherit a setup you know nothing about, is this: what distribution is this, what version, how long since it was last updated? The answer is not in one single command - it lives in a few places, and which one you check depends on what you actually need to know.

The fast answer: hostnamectl#

hostnamectl

On most modern systemd-based distributions (Ubuntu 16.04+, Debian 9+, RHEL/CentOS/Rocky/AlmaLinux 7+), one command gives you the distro name, version, kernel and architecture together. Look at the "Operating System" line near the top of the output.

Distro identity: /etc/os-release#

If hostnamectl is not available (or you want machine-readable output for a script), go straight to the source:

cat /etc/os-release
NAME="Ubuntu"
VERSION="24.04.1 LTS (Noble Numbat)"
ID=ubuntu
ID_LIKE=debian
VERSION_ID="24.04"

The ID and VERSION_ID fields are what you want for scripted if branches - far more reliable than grepping the distro name, because the format has barely changed since 2012, when systemd introduced the os-release standard.

Don't forget ID_LIKE

Rocky Linux sets ID=rocky but ID_LIKE="rhel centos fedora". A script deciding whether it is in the RHEL family or the Debian family usually checks ID_LIKE rather than ID - otherwise you need a new case branch for every new derivative distro.

Kernel and architecture#

uname -a
Linux server 6.8.0-51-generic #52-Ubuntu SMP x86_64 GNU/Linux

In order: hostname, kernel version, build date/number, architecture (x86_64, aarch64). If you only want the kernel version, uname -r is enough.

Virtual or physical#

systemd-detect-virt

Returns a virtualization technology like kvm, vmware, xen, lxc, or none for bare metal. On a VeriTeknik VPS the expected answer is kvm; this one line settles "is this virtual or real hardware" when you are diagnosing a hardware issue.

From a script: detecting the distro in one shot#

Writing an install script that needs to branch on package manager:

#!/usr/bin/env bash
source /etc/os-release
case "$ID" in
  ubuntu|debian) echo "apt-based: $PRETTY_NAME" ;;
  rocky|almalinux|rhel|centos) echo "dnf-based: $PRETTY_NAME" ;;
  *) echo "unknown distro: $PRETTY_NAME" ;;
esac

To also catch derivative distros via ID_LIKE:

source /etc/os-release
if [[ "$ID_LIKE" == *debian* || "$ID" == "debian" ]]; then
  echo "Debian family"
fi

With Morpheus

"what distribution and version is this server running"

Morpheus reads /etc/os-release and uname -a and summarizes it in one sentence - it can also check for packages with pending updates.

Commands people mix up#

Command Gives you When to use it
hostnamectl Distro + version + kernel + arch, human-readable Quick overview
cat /etc/os-release Machine-readable distro identity Branching inside a script
uname -r Kernel version only Kernel module/compatibility checks
lsb_release -a Older but still common; missing on some minimal images Habit on Debian/Ubuntu derivatives
systemd-detect-virt Virtualization technology, or none Hardware/performance diagnosis

Checklist#

  • [ ] hostnamectl shows the distro name and version
  • [ ] Scripts read $ID from /etc/os-release instead of grepping the distro name
  • [ ] uname -r matches the kernel version you expect