RHEL 系 Linux(Rocky Linux・AlmaLinux・RHEL9)では、複数バージョンのソフトウェアを共存管理するために alternatives(Debian/Ubuntu 系では
update-alternatives)コマンドが用意されている。このコマンドを使いこなすと、Java や Python のバージョン切り替えが安全かつ確実にできる。この記事では、RHEL 9.4 / Rocky Linux 9.4 で動作確認した手順をもとに、alternatives コマンドの仕組みから実務での活用方法・トラブルシュートまで解説する。
この記事のポイント
・RHEL 系は alternatives、Debian 系は update-alternatives コマンドでバージョン管理する
・alternatives --config java で対話的にバージョンを切り替え、--set で非対話的に固定できる
・--install で自前のバイナリを alternatives データベースに登録できる
・/etc/alternatives/ 配下のシンボリックリンクが実際の切り替え先として機能する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
alternatives とは何か(複数バージョン管理の仕組み)
`alternatives` コマンドは、同一機能を提供する複数のプログラムを共存させ、現在使用するバージョンを切り替える仕組みだ。実体は /etc/alternatives/ 配下のシンボリックリンクの管理システムだ。仕組みは以下のとおりだ。
・/usr/bin/java → /etc/alternatives/java(第一リンク)
・/etc/alternatives/java → /usr/lib/jvm/java-17-openjdk-amd64/bin/java(第二リンク)
`alternatives --config java` を実行すると、第二リンクの向き先を書き換えるだけでバージョンが切り替わる。インストール済みのバイナリ本体はそのまま残るため、安全に切り替えできる。
RHEL 系では `alternatives` コマンドを使う。Debian/Ubuntu 系では同じ機能を `update-alternatives` コマンドが担う(オプション名は同じ)。
# シンボリックリンクの構造を確認する $ ls -la /usr/bin/java lrwxrwxrwx 1 root root 22 Jan 10 09:00 /usr/bin/java -> /etc/alternatives/java $ ls -la /etc/alternatives/java lrwxrwxrwx 1 root root 43 Jan 10 09:00 /etc/alternatives/java -> /usr/lib/jvm/java-17-openjdk-amd64/bin/java
alternatives コマンドの基本操作
1. --list で登録済みの alternatives を一覧表示する
`--list` オプション(または `--display`)で、登録されている alternatives の名前と現在の設定を確認できる。# 登録済みの alternatives を一覧表示(RHEL 系) $ alternatives --list java auto /usr/lib/jvm/java-17-openjdk-x86_64/bin/java javac auto /usr/lib/jvm/java-17-openjdk-x86_64/bin/javac python manual /usr/bin/python3.9 python3 auto /usr/bin/python3.11 # 特定の alternatives の詳細を確認 $ alternatives --display java java - status is auto. link currently points to /usr/lib/jvm/java-17-openjdk-x86_64/bin/java /usr/lib/jvm/java-11-openjdk-x86_64/bin/java - priority 11 /usr/lib/jvm/java-17-openjdk-x86_64/bin/java - priority 17 Current `best' version is /usr/lib/jvm/java-17-openjdk-x86_64/bin/java.
2. --config で対話的にバージョンを切り替える
`--config` オプションで番号を選ぶだけでバージョンを切り替えられる。作業の前後に `java -version` で正しく切り替わったことを確認するのが実務の鉄則だ。# alternatives コマンドで Java を対話的に切り替える(root または sudo が必要) $ sudo alternatives --config java There are 2 programs which provide 'java'. Selection Command ----------------------------------------------- *+ 1 java-17-openjdk.x86_64 (/usr/lib/jvm/java-17-openjdk-x86_64/bin/java) 2 java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-x86_64/bin/java) Enter to keep the current selection[+], or type selection number: 2 # 切り替え後にバージョンを確認 $ java -version openjdk version "11.0.22" 2024-01-16 LTS
3. --set で非対話的にバージョンを固定する
スクリプトや Ansible Playbook から自動化する場合は `--set` オプションを使う。# Java 11 に非対話的に切り替える(スクリプト・Ansible からも使える) $ sudo alternatives --set java /usr/lib/jvm/java-11-openjdk-x86_64/bin/java # auto モードに戻す(priority 最高のものに自動選択) $ sudo alternatives --auto java # 切り替え確認 $ java -version openjdk version "11.0.22"
Java の複数バージョンを alternatives で管理する実践例
現場でよくあるのが、「本番アプリは Java 11 だが新しいサービスは Java 17 を使いたい」というケースだ。dnf で複数バージョンをインストールしておけば、alternatives で安全に切り替えられる。# Java 11 と Java 17 の両方をインストール $ sudo dnf install java-11-openjdk java-17-openjdk # インストール後に java の alternatives が自動登録されているか確認 $ alternatives --display java # java コマンドだけでなく javac も切り替える(セットで変更するのが安全) $ sudo alternatives --config javac $ sudo alternatives --config java # 切り替え確認 $ java -version && javac -version
なお、体系的なLinuxサーバー管理を学びたい方にはLinux Master Pro Seminarのハンズオン研修がある。パッケージ管理から運用設計まで実機で習得できる。
Python の複数バージョンを管理する(RHEL9 / Rocky Linux 9)
RHEL9 / Rocky Linux 9 では Python 3.9(システムデフォルト)と Python 3.11(AppStream で追加可能)が共存できる。alternatives でデフォルト `python3` コマンドが指すバージョンを制御できる。# RHEL9 で python3.11 をインストール $ sudo dnf install python3.11 # python3 の alternatives に python3.11 を登録 # --install
$ sudo alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 20 # python3.9 も alternatives に登録 $ sudo alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 9 # 登録確認 $ alternatives --display python3 # 切り替え $ sudo alternatives --config python3 # 動作確認 $ python3 --version Python 3.11.9
--install で自前のバイナリを alternatives に登録する方法
システムのパッケージマネージャーとは別に `/usr/local/bin/` や `/opt/` にインストールしたバイナリも、`--install` オプションで alternatives に追加できる。# 書式: alternatives --install
# : /usr/bin/ 配下の最終的なリンクパス # : alternatives グループ名(--config で指定するもの) # : 実際のバイナリの絶対パス # : 数値(高いほど auto モードで優先) # 例: /opt/jdk-21/bin/java を alternatives に登録する $ sudo alternatives --install /usr/bin/java java /opt/jdk-21/bin/java 21 # 登録確認 $ alternatives --display java # 登録を削除する場合(path ごとに1行削除する) $ sudo alternatives --remove java /opt/jdk-21/bin/java
トラブルシュート:alternatives が壊れた時の対処法
運用していると、パッケージ更新や手動コピー後に alternatives の登録と実際のリンクがずれることがある。以下のチェック手順で原因を切り分けよう。・症状:`java -version` を実行すると「No such file or directory」または誤ったバージョンが返る
・確認 1:`alternatives --display java` で登録内容と link の向き先を確認する
・確認 2:`ls -la /etc/alternatives/java` でシンボリックリンクの向き先ファイルが実在するか確認する
・対処:実在しないパスへのリンクになっている場合は `alternatives --remove` で登録を削除してから再登録する
# alternatives リンクが壊れていないか確認 $ ls -la /etc/alternatives/java lrwxrwxrwx ... /etc/alternatives/java -> /usr/lib/jvm/java-17-openjdk-x86_64/bin/java # リンク先が存在するか確認 $ ls /usr/lib/jvm/java-17-openjdk-x86_64/bin/java ls: cannot access '/usr/lib/jvm/java-17-openjdk-x86_64/bin/java': No such file or directory # → パッケージが削除されたがリンクが残っている # 壊れたエントリを削除してから再設定する $ sudo alternatives --remove java /usr/lib/jvm/java-17-openjdk-x86_64/bin/java $ sudo alternatives --config java
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| 登録済みの alternatives を一覧表示 | alternatives --list |
| 特定の alternatives の詳細を確認 | alternatives --display java |
| 対話的にバージョンを切り替える | alternatives --config java |
| 非対話的にバージョンを固定する | alternatives --set java /usr/lib/jvm/.../bin/java |
| auto モードに戻す(最高 priority を自動選択) | alternatives --auto java |
| 自前のバイナリを登録する | alternatives --install /usr/bin/java java /opt/.../java 21 |
| 登録を削除する | alternatives --remove java /usr/lib/jvm/.../bin/java |
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、RHEL10対応の少人数ハンズオン研修「Linux Master Pro Seminar」のご案内です。パッケージ管理から複数バージョン共存運用まで、実機演習で体系的に学べます。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:AlmaLinuxのサポート期限一覧とEOL後の選択肢|8・9から10への移行判断
- この記事の属するカテゴリ:Linuxtipsへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます