How To Get Linux Version

How To Get Linux Version

Reading time1 min
#Linux#Sysadmin#OpenSource#LinuxVersion#LinuxCommands#LinuxScripting

Mastering Linux Version Detection: A Practical Playbook for Sysadmins and Engineers

Knowing the precise Linux version on a target system is mandatory for compatibility, patching, and deploying stable automation. Changing package formats, subtle init system differences, and breaking changes in glibc often trace back to an unknown or assumed OS release.


The “uname” Trap—and Why It Isn’t Enough

Consider a troubleshooting session where an Ansible playbook halts with:

TASK [Ensure Python 3] 
fatal: [10.12.0.21]: FAILED! => {"changed": false, "msg": "Unsupported distribution"}

Running uname -a gives:

Linux node42 5.15.0-1051-azure #59-Ubuntu SMP x86_64 GNU/Linux

But this only shows kernel details—not the distribution, not the release.


Canonical Linux Version Sources

Stop guessing. Use standardized system files and tested tools:

/etc/os-release

For most distributions after ~2015, /etc/os-release is canonical. It is consistent, correctly updated by distro maintainers, and script-friendly.

cat /etc/os-release

Sample (from Ubuntu 22.04.3 LTS):

NAME="Ubuntu"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 22.04.3 LTS"
VERSION_ID="22.04"
VERSION_CODENAME=jammy

Pro tip: Source the file for shell availability:

source /etc/os-release
echo "Detected $NAME version $VERSION_ID ($VERSION_CODENAME)"

Key fields:

  • VERSION_ID — useful for semver comparisons
  • VERSION_CODENAME — important with Ubuntu apt sources

Gotcha: Some minimal Docker containers or specialty distros omit /etc/os-release. Always check file presence.


Legacy and Edge Cases: Distro-Specific Files

If /etc/os-release is missing or incomplete, try these:

  • /etc/lsb-release (Debian/Ubuntu variants pre-16.04, plus certain derivatives)
  • /etc/redhat-release (CentOS/RedHat 6/7, Amazon Linux 1/2)
  • /etc/debian_version (Debian, Ubuntu; version only, sparse metadata)
  • /etc/SuSE-release (older openSUSE/SLES)

Quick check:

distdetected=""
for file in /etc/os-release /etc/lsb-release /etc/redhat-release /etc/debian_version; do
    if [ -f "$file" ]; then
        echo "$file:"
        cat "$file"
        distdetected=1
    fi
done
if [ -z "$distdetected" ]; then
    echo "No standard version file found."
fi

Note: CentOS Stream 8/9, RHEL 8+, Amazon Linux 2 all provide /etc/os-release.


lsb_release Tool

If you maintain mixed estates (legacy VMs, developer laptops), lsb_release can unify checks—where installed.

lsb_release -a

Example output:

Distributor ID: Ubuntu
Description:    Ubuntu 22.04.3 LTS
Release:        22.04
Codename:       jammy

Extract just the release:

lsb_release -rs
# => 22.04

Not always installed by default.

  • Debian/Ubuntu: sudo apt-get install lsb-release
  • RHEL/Fedora: sudo dnf install redhat-lsb-core

Kernel and Architecture: Sometimes Relevant, Always Check

For driver compatibility, kernel interfaces, or compiling modules, kernel version (uname -r) and architecture (uname -m) are essential.

uname -r    # 5.15.0-1051-azure
uname -m    # x86_64

Combined status block (for logs or deployment banners):

printf "Distro      : %s\n" "$(grep ^PRETTY_NAME /etc/os-release | cut -d= -f2 | tr -d '"')"
printf "Kernel      : %s\n" "$(uname -r)"
printf "Arch        : %s\n" "$(uname -m)"

Practical Detection Pattern

A robust detection script should:

  • Prefer /etc/os-release
  • Fallback sensibly for edge systems (old Red Hat, Docker images, cloudy vendor images)
  • Always output kernel and arch
#!/bin/bash
# ./detect-linux-version.sh

if [ -f /etc/os-release ]; then
    . /etc/os-release
    echo "Distribution : $PRETTY_NAME"
    echo "Version ID   : $VERSION_ID"
    echo "Codename     : ${VERSION_CODENAME:-N/A}"
elif [ -f /etc/lsb-release ]; then
    . /etc/lsb-release
    echo "Distribution : $DISTRIB_ID $DISTRIB_RELEASE ($DISTRIB_CODENAME)"
elif [ -f /etc/redhat-release ]; then
    echo "Red Hat-derived: $(cat /etc/redhat-release)"
elif [ -f /etc/debian_version ]; then
    echo "Debian-based (raw): $(cat /etc/debian_version)"
else
    echo "Unrecognized Linux distribution—manual inspection required."
fi

echo "Kernel       : $(uname -r)"
echo "Architecture : $(uname -m)"

Known issue: BusyBox-based containers may return ambiguous or missing results. Consider injecting an /etc/os-release during CI/CD image builds for clarity.


Command Reference Table

Info TypeCommandDistribution Scope
Distro/version std.cat /etc/os-releaseModern, cross-distro
LSB infolsb_release -aMost, not always pre-installed
RedHat legacycat /etc/redhat-releaseRHEL/CentOS ≤7
Debian legacycat /etc/debian_versionDebian/Ubuntu, incomplete
Kernel versionuname -rAll
Architectureuname -mAll

Non-obvious: Automation with Inline Detection

When writing playbooks or Dockerfiles, prefer runtime checks:

RUN . /etc/os-release && echo "$ID/$VERSION_ID" > /build/distro-stamp.txt

And in Ansible:

- name: Read distro version
  shell: ". /etc/os-release && echo $VERSION_ID"
  register: distro_version

Summary

Accurately detecting a Linux system’s version goes beyond a single command. Combine /etc/os-release parsing, command-line utilities, and kernel/arch checks for robust outcomes—especially in mixed or container-first estates. False positives or ambiguous output cause hard-to-debug automation failures; invest time in a rock-solid detection method.


Note: Some long-lived enterprise systems still surprise—don’t assume, always verify actual version files on disk.