Contents

通过命令行查找Linux发行版

1. 概述

在本教程中,我们将了解我们的计算机上运行的是哪个 Linux 发行版。它已经在两个最流行的 Linux 系列上进行了测试:Debian 和 Red Hat Enterprise Linux (RHEL)。但是,它旨在为整个 Linux 生态系统工作。

2. /etc/os-release文件

首先,我们将描述*/etc/os-release*文件。

让我们看看它在装有 Ubuntu 的计算机上的样子:

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.6 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

输出遵循VARIABLE=value结构:

  • ID:发行版名称(ubuntu
  • VERSION_ID:发行版主要版本(18.04
  • ID_LIKE:发行版系列(debian
  • PRETTY_NAME:将发行版名称 ( Ubuntu ) 和完整版 ( 18.04.6 LTS ) 组合成一个变量
  • VERSION_CODENAME : 代号 ( bionic ),即基于 Debian 的发行版中版本号的别名

让我们看看它在 RHEL 家族的发行版中的外观:

$ cat /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"

它提供了与来自 Ubuntu 机器的输出非常相似的输出。请注意,PRETTY_NAMECentOS Linux 7 (Core) 与基于 Debian 的系统略有不同。

此外,我们可以利用这种VARIABLE=value结构来获取*/etc/os-release*文件。它将使变量可用于 shell 环境:

$ . /etc/os-release 
$ echo $ID
ubuntu
$ echo $VERSION_ID
20.04

在此示例中,我们在获取*/etc/os-release*之后访问操作系统版本的值。

3. 其他/etc/*-release文件

除了os-release之外,*/etc目录中可能还有其他带有*-release*后缀的文件。

在 CentOS 中,我们发现以下内容:

$ ls -l /etc/*-release
-rw-r--r--. 1 root root 37 nov 23  2020 /etc/centos-release
lrwxrwxrwx. 1 root root 21 feb 26  2021 /etc/os-release -> ../usr/lib/os-release
lrwxrwxrwx. 1 root root 14 feb 26  2021 /etc/redhat-release -> centos-release
lrwxrwxrwx. 1 root root 14 feb 26  2021 /etc/system-release -> centos-release

事实上,/etc/centos-release/etc/redhat-release和*/etc/system-release*包含相同的信息,因为它们都指向同一个文件:

$ cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)

通过这种方式,我们可以获得系统的基本信息。上面的命令显示了发行版 ( CentOS Linux )、主要 ( 7 ) 和次要版本 ( 9 ) 以及次要版本的日期代码 ( 2009 )。

4. lsb_release命令

lsb_release 命令还提供了有关 Linux 发行版的一些信息。但是,它通常不会默认安装。因此,我们必须手动安装它。

在基于 Debian 的发行版中:

$ sudo apt install -y lsb_release

在 RHEL/CentOS 中:

$ yum -y install redhat-lsb-core

让我们使用*-a*选项显示 Ubuntu 机器上的所有可用信息:

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.6 LTS
Release:	18.04
Codename:	bionic

现在让我们通过*-r*选项仅选择发行版:

$ lsb_release -r
Release:	18.04

如果我们执行一些 shell 脚本,我们将添加*-s*以独占原始数字:

$ release=$(lsb_release -rs)
$ echo $release 
18.04

此命令仅提取版本号并将其分配给名为release的变量。 实际上,lsb_release 会格式化并打印*/etc/lsb_release*文件的内容。让我们在 Ubuntu 电脑上看一下:

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.6 LTS"

我们再次看到类似于*/etc/os-release文件的VARIABLE=value*结构。同样,我们可以获取此文件以使变量在 shell 环境中可用。

5. hostnamectl命令

hostnamectl 命令是systemd 的一部分。它基本上允许用户查询和更改系统主机名和其他相关信息。

例如,它在我们的 Ubuntu 机器上显示以下内容:

$ hostnamectl 
   Static hostname: ubuntu
         Icon name: computer-laptop
           Chassis: laptop
        Machine ID: 0fb7ce66968341cc97b76d1b24426881
           Boot ID: 5d39cbf8fa4f470db74aada29a2ef6b4
  Operating System: Ubuntu 18.04.6 LTS
            Kernel: Linux 5.4.0-109-generic
      Architecture: x86-64

它的输出是lsb_release和*uname -a*命令的混合。后者提供内核名称、节点名称(主机名)、内核版本和版本以及系统架构等:

$ uname -a
Linux ubuntu 5.13.0-41-generic #46~20.04.1-Ubuntu SMP Wed Apr 20 13:16:21 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

我们可以看到uname的输出与来自hostnamectl的信息之间的相似之处,例如主机名 ( ubuntu )、内核版本 ( 5.13.0-41-generic ) 和内核架构 ( x86_64 )。

让我们检查一下我们的 CentOS 机器中的输出:

$ hostnamectl 
   Static hostname: centos
         Icon name: computer-server
           Chassis: server
        Machine ID: 9ceb2494f7844e90b51e436b38872021
           Boot ID: 20d3d7b05e024420b46aa799db5e239a
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1160.15.2.el7.x86_64
      Architecture: x86-64

我们可以看到基于 Debian 和基于 RHEL 的发行版的输出非常相似。

6. rpm命令

最后,我们将在 RHEL 系列的发行版上使用rpm 命令。它是一个包管理器,但也可用于查询一些系统数据。

如果我们不知道发行版,我们会找出 RHEL 主要版本:

$ rpm --eval '%{rhel}'
7

前面的命令检查rpm配置文件中定义的宏的值。在这种情况下,宏 ( %rhel ) 存储在*/etc/rpm/macros.dist*文件中。我们可以在宏语法 手册中了解更多关于宏的信息。

而如果我们确实知道我们拥有的发行版,我们可以使用*-q*选项:

$ rpm -q centos-release
centos-release-7-9.2009.1.el7.centos.x86_64

它查询 ( -q ) 软件包centos-release是否已安装。结果,我们得到了主要和次要版本,以及同步的版本号和架构。在 Red Hat 中,我们将改为查询软件包redhat-release

此外,我们可以使用*-i*选项获得有关操作系统的更多信息:

$ rpm -q centos-release -i
Name        : centos-release
Version     : 7
Release     : 9.2009.1.el7.centos
Architecture: x86_64
Install Date: Fri 26 Feb 2021 17:11:33 CET
Group       : System Environment/Base
Size        : 44787
License     : GPLv2
Signature   : RSA/SHA256, Wed 02 Dic 2020 17:35:28 CET, Key ID 24c6a8a7f4a80eb5
Source RPM  : centos-release-7-9.2009.1.el7.centos.src.rpm
Build Date  : Mon 23 Nov 2020 16:08:41 PM CET
Build Host  : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
Summary     : CentOS Linux release file
Description :
CentOS Linux release files

hostnamectl输出一样,我们可以看到非常全面的描述,包括名称、版本、发布、架构以及安装和构建日期。