通过命令行查找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_NAME值CentOS 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输出一样,我们可以看到非常全面的描述,包括名称、版本、发布、架构以及安装和构建日期。