How To Get Os Version In Linux

How To Get Os Version In Linux

Reading time1 min
#Linux#Sysadmin#CommandLine#os-release#lsb_release

Mastering Linux OS Version Detection: Command-Line Techniques That Go Beyond Basics

Some troubleshooting starts with a simple question: what exact OS am I running? As any sysadmin knows, the wrong answer here can result in failed deployments, broken dependencies, and wasted hours debugging avoidable issues.

Most newcomers reach for uname -a. This command reveals the kernel version and architecture, but omits distribution and release specifics:

$ uname -a
Linux node01 5.15.0-1051-azure #59-Ubuntu SMP Tue Mar 19 14:00:39 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

Here, you're left guessing—are you on Ubuntu 20.04, 22.04, or even Debian with a custom kernel? No clear answer.

Reliable OS Version Discovery—Preferred Approaches

Critical: Always script for reproducibility. Expect some files or tools may be missing, especially on stripped-down containers or legacy hosts.

1. /etc/os-release: The Current Standard

Recent distributions (e.g., Ubuntu ≥16.04, Debian ≥8, Fedora ≥20, RHEL ≥7) uniformly ship /etc/os-release. This is a plain-text file with shell-compatible variable assignments:

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 22.04.4 LTS"
VERSION_ID="22.04"
...

A useful trick—since the file uses shell syntax, simply source it:

source /etc/os-release
echo "$PRETTY_NAME"
# Ubuntu 22.04.4 LTS

Note: Not all images have a complete set of fields. Alpine, for example, often omits marketing data like PRETTY_NAME.

Fast Extraction

. /etc/os-release && echo "$ID $VERSION_ID"
# ubuntu 22.04

2. The lsb_release Utility

Where available, lsb_release standardizes detection across less predictable environments. If missing, don't be shocked—some containers and minimal images drop it.

# Typical
$ lsb_release -a
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:        22.04
Codename:       jammy

# One-line
$ lsb_release -ds
"Ubuntu 22.04.4 LTS"

Install as needed:

  • Debian/Ubuntu: sudo apt-get install -y lsb-release
  • RHEL/CentOS/Fedora: sudo dnf install -y redhat-lsb-core (warning: installs Perl plus ~100MB of dependencies)

Gotcha: Output format can drift slightly between distros; always parse by field name, not line order.

3. Legacy Fallbacks: Per-Distro Release Files

Older (or intentionally minimal) systems may lack /etc/os-release. In such cases, fallback to distro-specific files:

FileExample ContentTypical Distro
/etc/redhat-releaseCentOS Linux release 7.9.2009 (Core)CentOS/RHEL (≤7)
/etc/centos-releaseCentOS Linux release 7.6.1810 (Core)CentOS
/etc/debian_version11.7Debian
/etc/SuSE-releaseSUSE Linux Enterprise Server 12 (x86_64)(open)SUSE

Quick check:

cat /etc/redhat-release 2>/dev/null || \
cat /etc/centos-release 2>/dev/null || \
(cat /etc/debian_version 2>/dev/null && echo "(Debian)")

Known issue: On some cloud images, /etc/XYZ-release may be a symlink to /etc/os-release, or outright missing. Always test before hardcoding.

4. With hostnamectl (systemd-enabled Hosts)

Systemd-based systems support hostnamectl, which, incidentally, reports the OS info:

$ hostnamectl
   Static hostname: buildvm
         Icon name: computer-vm
           Chassis: vm
        Machine ID: ...
           Boot ID: ...
  Operating System: Ubuntu 20.04.6 LTS
            Kernel: Linux 5.4.0-156-generic
      Architecture: x86-64

Script-friendly extraction:

hostnamectl | grep "Operating System" | cut -d: -f2-
#   Ubuntu 20.04.6 LTS
Trade-off

Direct kernel interaction (e.g., inside containers) sometimes yields only partial data. Don’t rely solely on hostnamectl in heavily containerized or chrooted environments.


Reliable Bash Pattern (Pragmatic Example)

A robust approach accommodates edge cases—missing files, absent utilities, alternate file locations:

#!/bin/bash
# Detect Linux distribution and version, prioritizing modern conventions.

if [[ -f /etc/os-release ]]; then
    . /etc/os-release
    echo "$PRETTY_NAME"
elif command -v lsb_release &>/dev/null; then
    lsb_release -ds
elif [[ -f /etc/centos-release ]]; then
    cat /etc/centos-release
elif [[ -f /etc/redhat-release ]]; then
    cat /etc/redhat-release
elif [[ -f /etc/debian_version ]]; then
    echo "Debian $(cat /etc/debian_version)"
else
    uname -a
    echo "(distribution unknown)"
fi

Grant execute: chmod +x detect_linux_version.sh

Side note: In restrictive container images (Alpine, BusyBox), supplement with /etc/issue as a last resort. Reliability varies.


Non-Obvious Tips and Pitfalls

  • Alpine Linux: No /etc/os-release before v3.2; check /etc/alpine-release.
  • Containers: Minimal builds may lack all standard files; sometimes only uname works.
  • Custom Builds: Enterprise images may have masked or rewritten release files for compliance—cross-check using multiple sources.
  • Parsing: Never assume output formatting is consistent between major/minor releases.

Summary

Kernel version alone rarely suffices. Modern best practice is /etc/os-release. Where absent, chain to legacy files or lsb_release—but don’t trust only one data point. Automate multi-path checks for predictable, safe results.


Side channel: If scripts fail to identify the OS when prepping multi-distro CI/CD runners, investigate image sources or builder stages. Sometimes, an upstream Dockerfile or Packer template misconfigures these basics—expect to fix them by hand.


For more on automating Linux estate discovery—especially in mixed-OS fleet or clouds with BYO images—review vendor or cloud-specific caveats before embedding into deployment pipelines.