Skip to content

Instantly share code, notes, and snippets.

@yatish609
Forked from natefoo/00README.md
Created April 9, 2020 06:23
Show Gist options
  • Select an option

  • Save yatish609/183d6fef66d0b2bb64d8605bdc64275c to your computer and use it in GitHub Desktop.

Select an option

Save yatish609/183d6fef66d0b2bb64d8605bdc64275c to your computer and use it in GitHub Desktop.
Linux Distribution Detection

Distribution Detection

I am working on adding support for building and distributing (via PyPI) Python Wheels with C Extensions to the Python wheel and pip packages. The discussion on Distutils-SIG continues, but I believe it is fairly certain that some effort to correctly identify Linux distributions will need to be made. I've begun efforts to add this support to wheel.

How you can help

If you have a Linux distribution or version of a listed distribution not in this gist, or one of the ones I have not directly verified, I could use the following:

  • The contents of /etc/os-release, if it exists
  • Whether or not the lsb_release program is installed, and whether it's part of a "default" install
  • The output of lsb_release -a if installed
  • The contents of /etc/lsb-release, if it exists
  • The contents of any other /etc/*-release files
  • Any other reliable way to determine the flavor and version of your Linux distribution, especially if none of the above exist

And finally, you can test the platform detection on your platform by downloading and installing (e.g. in a virtualenv) my changes to wheel and running:

% python -c 'import wheel.pep425tags; print wheel.pep425tags.get_platforms()'

e.g.:

% pip install -e 'hg+https://bitbucket.org/natefoo/wheel#egg=wheel'
% python -c 'import wheel.pep425tags; print wheel.pep425tags.get_platforms()'
['linux_x86_64_ubuntu_14_04', 'linux_x86_64', 'any']

If lsb_release is optional on your system and especially if /etc/os-release does not exist, it'd be even more helpful to run the above prior to installing lsb_release, and again afterward.

Arch

I have not verified this information on an Arch install, I gathered the information from the web.

Arch

/etc/os-release

Via the filesystem package

NAME="Arch Linux"
ID=arch
PRETTY_NAME="Arch Linux"
ANSI_COLOR="0;36"
HOME_URL="https://www.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://bugs.archlinux.org/"

lsb-release -a

lsb_release is not installed as part of the base system, but is available in the lsb-release package.

Just guessing based on looking at the package source:

Distributor ID:	Arch
Description:	Arch Linux
Release:	rolling
Codename:	????

/etc/lsb-release

/etc/lsb-release is installed with the lsb-release package. I believe these would be its contents:

LSB_VERSION=1.4-14
DISTRIB_ID=Arch
DISTRIB_RELEASE=rolling
DISTRIB_DESCRIPTION="Arch Linux"

Distro-specific files

/etc/arch-version:

It is an empty file, but its existence indicates that the distro is Arch.

get_platforms()

Untested, should be:

['linux_x86_64_arch_rolling', 'linux_x86_64', 'any']

CentOS

CentOS 7

/etc/os-release

NAME="CentOS Linux"                                                                                                        
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

lsb-release -a

lsb_release is not installed as part of a base system, but is available in the redhat-lsb-core package.

Distributor ID:	CentOS
Description:	CentOS Linux release 7.1.1503 (Core) 
Release:	7.1.1503
Codename:	Core

/etc/lsb-release

Does not exist

Distro-specific files

/etc/centos-release:

CentOS Linux release 7.1.1503 (Core) 

/etc/redhat-release and /etc/system-release are symlinks to /etc/centos-release.

get_platforms()

['linux_x86_64_centos_7', 'linux_x86_64', 'any']

CentOS 6

/etc/os-release

Does not exist

lsb-release -a

lsb_release is not installed as part of a base system, but is available in the redhat-lsb-core package.

Distributor ID:	CentOS
Description:	CentOS release 6.7 (Final)
Release:	6.7
Codename:	Final

/etc/lsb-release

LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch

Distro-specific files

/etc/centos-release:

CentOS release 6.7 (Final)

/etc/redhat-release and /etc/system-release are symlinks to /etc/centos-release.

get_platforms()

With lsb_release installed:

['linux_x86_64_centos_6_7', 'linux_x86_64_centos_6', 'linux_x86_64', 'any']

Without:

['linux_x86_64_centos_6_7', 'linux_x86_64_centos_6', 'linux_x86_64', 'any']

CentOS 5

/etc/os-release

Does not exist

lsb-release -a

lsb_release is not installed as part of a base system, but is available in the redhat-lsb package.

Distributor ID:	CentOS
Description:	CentOS release 5.11 (Final)
Release:	5.11
Codename:	Final

/etc/lsb-release

Does not exist

Distro-specific files

/etc/redhat-release:

CentOS release 5.11 (Final)

get_platforms()

With lsb_release installed:

['linux_x86_64_centos_5_11', 'linux_x86_64_centos_5', 'linux_x86_64', 'any']

Without:

['linux_x86_64_centos_5_11', 'linux_x86_64_centos_5', 'linux_x86_64', 'any']

Debian

Debian stretch

/etc/os-release

Doesn't include a version or version_id, so this results in reading the distro name from /etc/os-release but version detection falls through to the "legacy" method of reading from /etc/debian_version.

PRETTY_NAME="Debian GNU/Linux stretch/sid"
NAME="Debian GNU/Linux"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support/"
BUG_REPORT_URL="https://bugs.debian.org/"

lsb-release -a

lsb_release is not installed as part of a base system, but is available in the lsb-release package.

Distributor ID:	Debian
Description:	Debian GNU/Linux testing (stretch)
Release:	testing
Codename:	stretch

/etc/lsb-release

Does not exist

Distro-specific files

/etc/debian_version:

stretch/sid

get_platforms()

['linux_x86_64_debian_stretch_sid', 'linux_x86_64', 'any']

Debian 8 (jessie)

/etc/os-release

PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support/"
BUG_REPORT_URL="https://bugs.debian.org/"

lsb-release -a

lsb_release is not installed as part of a base system, but is available in the lsb-release package.

Distributor ID:	Debian
Description:	Debian GNU/Linux 8.1 (jessie)
Release:	8.1
Codename:	jessie

/etc/lsb-release

Does not exist

Distro-specific files

/etc/debian_version:

8.1

get_platforms()

['linux_x86_64_debian_8', 'linux_x86_64', 'any']

Debian 7 (wheezy)

/etc/os-release

PRETTY_NAME="Debian GNU/Linux 7 (wheezy)"
NAME="Debian GNU/Linux"
VERSION_ID="7"
VERSION="7 (wheezy)"
ID=debian
ANSI_COLOR="1;31"
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support/"
BUG_REPORT_URL="http://bugs.debian.org/"

lsb-release -a

lsb_release is not installed as part of a base system, but is available in the lsb-release package.

Distributor ID:	Debian
Description:	Debian GNU/Linux 7.8 (wheezy)
Release:	7.8
Codename:	wheezy

/etc/lsb-release

Does not exist

Distro-specific files

/etc/debian_version:

7.8

get_platforms()

['linux_x86_64_debian_7', 'linux_x86_64', 'any']

Debian 6 (squeeze)

/etc/os-release

Does not exist

lsb-release -a

lsb_release is not installed as part of a base system, but is available in the lsb-release package.

Distributor ID:	Debian
Description:	Debian GNU/Linux 6.0.10 (squeeze)
Release:	6.0.10
Codename:	squeeze

/etc/lsb-release

Does not exist

Distro-specific files

/etc/debian_version:

6.0.10

get_platforms()

With lsb_release installed:

['linux_x86_64_debian_6_0_10', 'linux_x86_64_debian_6', 'linux_x86_64', 'any']

Without:

['linux_x86_64_debian_6_0_10', 'linux_x86_64_debian_6', 'linux_x86_64', 'any']

openSUSE

I have not verified this information on an openSUSE install, I gathered the information from the web.

openSUSE

/etc/os-release

Per the SLES 11 Release Notes, it was added in SLES 11, which I assume means it should also be in openSUSE 11+

Contents for 13.1 from openSUSE forums:

NAME=openSUSE
VERSION="13.1 (Bottle)"
VERSION_ID="13.1"
PRETTY_NAME="openSUSE 13.1 (Bottle) (x86_64)"
ID=opensuse
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:opensuse:opensuse:13.1"
BUG_REPORT_URL="https://bugs.opensuse.org"
HOME_URL="https://opensuse.org/"
ID_LIKE="suse"

lsb_release -a

I do not know if lsb_release is part of the base system. It is available from the lsb-release package.

Output on 12.1 from openSUSE forums:

Distributor ID: SUSE LINUX
Description:    openSUSE 12.1 (x86_64)
Release:        12.1
Codename:       Asparagus

/etc/lsb-release

???

Distro-specific files

/etc/SuSE-release:

From the thread on openSUSE forums about os-release:

openSUSE 13.1 (x86_64)
VERSION = 13.1
CODENAME = Bottle

get_platforms()

Untested, on 13.1 it should be:

['linux_x86_64_opensuse_13_1', 'linux_x86_64_opensuse_13', 'linux_x86_64', 'any']

SLES

I have not verified this information on a SLES install, I gathered the information from the web.

SLES

/etc/os-release

Per the SLES 11 Release Notes, it was added in SLES 11.

Contents for 12 from saltstack/salt#24019:

NAME="SLES"
VERSION="12"
VERSION_ID="12"
PRETTY_NAME="SUSE Linux Enterprise Server 12"
ID="sles"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:suse:sles:12"

lsb_release -a

I do not know if lsb_release is part of the base system. It is available from the lsb-release package.

Again from salt#24019:

Distributor ID:     SUSE LINUX
Description:        SUSE Linux Enterprise Server 12
Release:    12
Codename:   12

/etc/lsb-release

???

Distro-specific files

/etc/SuSE-release:

Again from salt#24019:

SUSE Linux Enterprise Server 12 (x86_64)
VERSION = 12
PATCHLEVEL = 0
# This file is deprecated and will be removed in a future service pack or release.
# Please check /etc/os-release for details about this release.

get_platforms()

Untested, on 12 it should be:

['linux_x86_64_sles_12', 'linux_x86_64', 'any']

Ubuntu

Ubuntu 14.04 (trusty)

/etc/os-release

NAME="Ubuntu"
VERSION="14.04, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

lsb-release -a

lsb_release is installed as part of a base system, via the lsb-release package.

Distributor ID:	Ubuntu
Description:	Ubuntu 14.04 LTS
Release:	14.04
Codename:	trusty

/etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS"

Distro-specific files

/etc/debian_version:

jessie/sid

get_platforms()

['linux_x86_64_ubuntu_14_04', 'linux_x86_64', 'any']

Ubuntu 12.04 (precise)

/etc/os-release

Does not exist

lsb-release -a

lsb_release is installed as part of a base system, via the lsb-release package.

Distributor ID:	Ubuntu
Description:	Ubuntu 12.04 LTS
Release:	12.04
Codename:	precise

/etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04 LTS"

Distro-specific files

/etc/debian_version:

wheezy/sid

get_platforms()

['linux_x86_64_ubuntu_12_04', 'linux_x86_64', 'any']
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment