alternativesコマンドで複数バージョンを管理する方法|Java・Pythonの切り替えと--configオプションの実践

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxtips > alternativesコマンドで複数バージョンを管理する方法|Java・Pythonの切り替えと--configオプションの実践
「複数の Java バージョンが共存しているサーバーで、`java -version` を実行したら想定外の古いバージョンが返ってきた。」こんな経験はないだろうか。

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/ 配下のシンボリックリンクが実際の切り替え先として機能する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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.

`priority` は数値が高いほど `auto` モードで優先される。`auto` は最も priority が高いバイナリを自動選択するモードだ。

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

`java` と `javac` は別々の alternatives として登録されているため、両方を合わせて切り替えること。片方だけ古いバージョンになるというトラブルが実際の運用でよく起きる。

なお、体系的な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

また、`auto` モードで予期しないバージョンが選ばれる場合は、priority が意図した設定になっているか `alternatives --display ` で確認すること。最高 priority のバイナリが自動選択される仕様なので、priority を意図的に下げてから `alternatives --auto ` で望みのバージョンに切り替えるのも一つの方法だ。

本記事のまとめ

やりたいこと コマンド
登録済みの 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
`alternatives` コマンドは、同一のコマンド名が複数バージョンに対応するシンボリックリンクを管理することで、サービスを止めずにバージョン切り替えを実現する。Java や Python を複数バージョン共存させる実務環境では不可欠なコマンドなので、`--config`・`--set`・`--display` の 3 つをまず押さえておこう。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、RHEL10対応の少人数ハンズオン研修「Linux Master Pro Seminar」のご案内です。パッケージ管理から複数バージョン共存運用まで、実機演習で体系的に学べます。

>> Linux Master Pro Seminar の詳細・申込はこちら

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。