多版本切换是什么
alternatives(RHEL 系)与 update-alternatives(Debian 系)解决同一个问题:让一个通用命令名对应多个版本的实现。它维护两级符号链接——/usr/bin/java 指向 /etc/alternatives/java,再由后者指向真实文件(如 /opt/jdk17/bin/java),同时记录候选清单与优先级。切换默认版本只需改中间链接,所有依赖通用命令名的程序自动跟随。
基本信息
| 适用平台 | RHEL 系命令名 alternatives(chkconfig 包);Debian 系为 update-alternatives(dpkg 包) |
|---|---|
| 命令语法 | alternatives --config <名称> / update-alternatives --config <名称> |
| 优先级 | --install 的最后一个数字,越大越优先;自动模式下选最大者 |
| 两种模式 | 自动模式按优先级决定;--config 手工选择后进入手动模式,自动切换停止 |
| 链接结构 | /usr/bin/通用名 指向 /etc/alternatives/通用名,再指向真实程序 |
典型使用场景
- 同机多 JDK:应用要 Java 8、新服务要 Java 17,按需切换默认 java
- 多版本 Python 或 gcc:开发与编译环境要求不同
- 编辑器替换:把默认 editor 从 vi 换成 vim 或 nano
- 集群统一:批量把节点上的默认运行时对齐到同一版本
- 回滚:切换出问题时用 --config 或 --set 快速退回旧版本
RHEL 系用法
RHEL 系用法
alternatives --display java # 看候选、优先级与当前模式
alternatives --config java # 交互选择版本
alternatives --install /usr/bin/java java /opt/jdk17/bin/java 1700 # 注册新候选
alternatives --set java /opt/jdk17/bin/java # 非交互指定,适合脚本
java -version # 验证实际生效版本Debian 系用法
Debian 系用法
update-alternatives --display java
update-alternatives --config java
update-alternatives --install /usr/bin/java java /opt/jdk17/bin/java 1700
update-alternatives --set java /opt/jdk17/bin/java
update-alternatives --list java # 列出全部候选路径常用操作与状态读法
| 操作 | 作用 | 注意 |
|---|---|---|
| --config | 交互式选择候选 | 进入手动模式,自动切换停止 |
| --display | 显示候选、优先级与当前链接 | 排查「切了没变」的第一条命令 |
| --install | 注册新的候选路径 | 优先级要与版本新旧一致,避免误判 |
| --set | 非交互指定候选 | 适合放到部署脚本里 |
| --auto | 恢复自动模式 | 恢复后按优先级重新决定 |
| --remove | 删除某个候选 | 注册的路径被删前先移除,避免悬空 |
理解两级链接就不容易迷路:/usr/bin/java 是「通用名」,/etc/alternatives/java 是「记录当前选择的中间层」,真实程序在最后一跳。ls -l 顺着这两跳看,就能确认到底在跑哪个版本。
优先级数字只是自动模式下的排序依据,相同优先级时选择结果不确定,所以注册时给每个候选一个明确且不重复的数字;一旦用 --config 手工选过,模式就变为手动,之后新装更高优先级的版本也不会自动生效。
排查「版本不对」的三步:which java 看命令实际解析到的路径,ls -l 顺着 /usr/bin 与 /etc/alternatives 两级链接看最终目标,java -version 确认运行时版本。三者对不上时问题就在候选清单或手动模式上,而不是应用的配置。