ククログ

株式会社クリアコード > ククログ > Red Hat Enterprise Linux系OSの種類やバージョンを見分ける方法

Red Hat Enterprise Linux系OSの種類やバージョンを見分ける方法

最近GNU/Linux系のパッケージング周りの仕組みに初めてチャレンジしている福田です。

複数のプラットフォームを想定する場合、動作しているプラットフォームを見分けることが必要になります。

今回は、Red Hat Enterprise Linux系OSの種類とバージョンの見分け方をご紹介します。

Red Hat Enterprise Linux系のOSであることを見分ける

2つの方法があります。

  • /etc/redhat-releaseというファイルが存在することを確認する
  • /etc/os-releaseというファイルに記載されているID_LIKEの値に、rhelが含まれていることを確認する

私のケースでは、前者の方法で十分でした。

バージョンを見分ける

前章でも登場した/etc/os-releaseファイルには、プラットフォームの情報が詳細に記載されています。

この中のVERSION_IDの値がOSのバージョンを表しており、ここを見ることでバージョンを見分けることができます。

テクニック: /etc/os-releaseファイルから値を取り出す

ビルドの設定ファイル等で、/etc/os-releaseファイルからバージョンを読ませたい場合、カッコイイ方法があります。

このファイルは、CentOS 7では次のようになっています。

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

よく見ると、これはシェルスクリプトとしてそのまま実行可能な形式で書かれていますよね! よって、このファイルを実行すると各左辺の変数に各値が代入されて、それらを利用できるのです!

例えば次のようにすることで、VERSION_IDの値を確認できます。

$ . /etc/os-release && echo $VERSION_ID

しかしこの方法だと、現在のシェルにどのような影響を与えるか分かりません。 そのため、実際には次のようにサブシェルの中で実行し、必要な値だけを取り出します。

$ echo $(. /etc/os-release && echo $VERSION_ID)

()で囲うことにより、サブシェル、つまり現在のシェルの中でさらにシェルを立ち上げてコマンドを実行しています。 これにより現在のシェルへの意図しない影響を防ぐことができます。 さらに$を付けることで、サブシェル内の標準出力の内容を取得しています。

以上を踏まえると、次のように/etc/os-releaseからVERSION_IDの値を変数に取得できます。

$ VERSION_ID=$(. /etc/os-release && echo $VERSION_ID)

サブシェルの中のVERSION_ID変数を、現在のシェルのVERSION_ID変数に代入したわけです!

テクニック: メジャーバージョンだけ取り出す

前章で取り出したVERSION_IDですが、OSによってはマイナーバージョンが付いていることがあります。

例えばAlmaLinux 9では、次のように"9.0"という値になっています。

$ cat /etc/os-release 
NAME="AlmaLinux"
VERSION="9.0 (Emerald Puma)"
ID="almalinux"
ID_LIKE="rhel centos fedora"
VERSION_ID="9.0"
PLATFORM_ID="platform:el9"
PRETTY_NAME="AlmaLinux 9.0 (Emerald Puma)"
ANSI_COLOR="0;34"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:almalinux:almalinux:9::baseos"
HOME_URL="https://almalinux.org/"
DOCUMENTATION_URL="https://wiki.almalinux.org/"
BUG_REPORT_URL="https://bugs.almalinux.org/"

ALMALINUX_MANTISBT_PROJECT="AlmaLinux-9"
ALMALINUX_MANTISBT_PROJECT_VERSION="9.0"
REDHAT_SUPPORT_PRODUCT="AlmaLinux"
REDHAT_SUPPORT_PRODUCT_VERSION="9.0"

前章のテクニックと合わせて、次のようにメジャーバージョンだけを取り出すことができます。

$ VERSION_ID=$(. /etc/os-release && echo $VERSION_ID | grep -oE '^[0-9]+')

前章のコマンドのサブシェル内の末尾に、grepコマンドをパイプで繋げています。 このgrepコマンドにより、メジャーバージョンのみを取り出すことができます。

AlmaLinux 9における例

$ VERSION_ID=$(. /etc/os-release && echo $VERSION_ID | grep -oE '^[0-9]+')
$ echo $VERSION_ID
9

CentOS 7のようにメジャーバージョンだけ記載されている場合にも、これを共通して利用できます。

仕組みを説明します。 '^[0-9]+'は、先頭から0から9の数字で始まる部分だけにマッチする正規表現になっています。 ^は先頭を表し、[0-9]は0から9の数字のどれかであることを表し、+は1文字以上続くことを表しています。 また、grepマッチするものがあった行 をデフォルトで抽出するので、oオプションを付けることで マッチした部分のみ を取り出しています。 さらにEオプションを付けることで、先ほどの+の正規表現を利用できるようにしています。 マイナーバージョンの前に.があるため、これによりメジャーバージョンのみ抽出できています。

まとめ

本記事では、Red Hat Enterprise Linux系OSの種類とバージョンの見分け方を紹介しました。

クリアコードではこのように業務の成果を公開することを重視しています。業務の成果を公開する職場で働きたい人はクリアコードの採用情報をぜひご覧ください。