You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让dnf remove与update-alternatives协同?Nginx多版本配置问题

update-alternatives 配置问题(Nginx双版本切换场景)

需求说明

需要将自行编译的两个Nginx版本部署到同一镜像:

  • 普通版:无调试支持,默认安装
  • Debug版:带--with-debug编译,安装后通过ALTERNATIVE_PRIORITY抢占默认符号链接,删除后自动切回普通版
  • 核心目标:共享/usr/sbin/nginx主符号链接,无需修改systemd等其他配置

当前配方代码

nginx.bb(普通版)

# do_install中已将编译产物重命名为nginx.1
...
inherit update-alternatives
# 低优先级,让debug版可覆盖
ALTERNATIVE_PRIORITY = "10" 
ALTERNATIVE:${PN} = "nginx"

# 疑问:这里是否需要所有语句都指定[nginx]?
ALTERNATIVE_TARGET[nginx] = "${sbindir_native}/nginx.1"
ALTERNATIVE_LINK_NAME[nginx] = "${sbindir_native}/nginx"

FILES:${PN} += "/"
CONFFILES:${PN} = "${sysconfdir}/${BPN}"
INSANE_SKIP:${PN} = "libdir"

nginx-debug.bb(Debug版)

# do_install中已将编译产物重命名为nginx-debug
inherit update-alternatives

# 高优先级,安装后替代普通版
ALTERNATIVE_PRIORITY = "100"
ALTERNATIVE:${PN} = "nginx"
ALTERNATIVE_TARGET[nginx] = "${sbindir_native}/nginx-debug"
ALTERNATIVE_LINK_NAME[nginx] = "${sbindir_native}/nginx"

# 精简包配置
PACKAGES = "${PN}"
FILES:${PN} += "${sbindir_native}"
INHIBIT_PACKAGE_STRIP = "1"
INHIBIT_PACKAGE_DEBUG_SPLIT = "1"

当前问题

  1. 干净系统安装普通版Nginx时,未生成任何alternatives配置,仅写入二进制文件
  2. 执行dnf remove nginx-debug时报错:
+ set -e
+ update-alternatives --remove nginx /usr/sbin/nginx-debug
mv: '/usr/sbin/nginx-debug' and '/usr/sbin/nginx-debug' are the same file

待解答问题

  1. 针对双版本共享链接的需求,ALTERNATIVE_TARGET和ALTERNATIVE_LINK_NAME的配置是否正确?
  2. 删除包时报错的原因是什么?配置哪里出了问题?

解答

核心思路正确,但存在两处关键错误:

  • 无需在所有语句中指定[nginx]:当ALTERNATIVE:${PN}仅定义一个替代项(即nginx)时,可省略数组下标,直接使用ALTERNATIVE_TARGET和ALTERNATIVE_LINK_NAME
  • 错误使用${sbindir_native}:该变量指向构建主机的sbin目录,而非目标系统目录,应替换为${sbindir}

正确配置逻辑:

  • ALTERNATIVE_LINK_NAME:目标系统中要创建的主符号链接路径(${sbindir}/nginx)
  • ALTERNATIVE_TARGET:当前包提供的实际二进制文件路径(普通版为${sbindir}/nginx.1,debug版为${sbindir}/nginx-debug)

问题2:删除报错的原因及修复

报错根源是普通版的FILES配置错误:

  • 设置FILES:${PN} += "/"会将整个根目录打包,导致普通版也包含/usr/sbin/nginx-debug(debug版安装后),触发文件冲突,删除时出现mv异常
  • 同时该错误覆盖了默认路径,导致update-alternatives脚本无法生成正确配置,这也是普通版未生成alternatives的原因

修正后的配方

nginx.bb(普通版)

# do_install中已将编译产物重命名为nginx.1
...
inherit update-alternatives

ALTERNATIVE_PRIORITY = "10"
ALTERNATIVE:${PN} = "nginx"
ALTERNATIVE_TARGET = "${sbindir}/nginx.1"
ALTERNATIVE_LINK_NAME = "${sbindir}/nginx"

# 修正FILES,仅包含必要路径
FILES:${PN} += "${sbindir}/nginx.1"
CONFFILES:${PN} = "${sysconfdir}/${BPN}"
INSANE_SKIP:${PN} = "libdir"

nginx-debug.bb(Debug版)

# do_install中已将编译产物重命名为nginx-debug
inherit update-alternatives

ALTERNATIVE_PRIORITY = "100"
ALTERNATIVE:${PN} = "nginx"
ALTERNATIVE_TARGET = "${sbindir}/nginx-debug"
ALTERNATIVE_LINK_NAME = "${sbindir}/nginx"

PACKAGES = "${PN}"
FILES:${PN} = "${sbindir}/nginx-debug"
INHIBIT_PACKAGE_STRIP = "1"
INHIBIT_PACKAGE_DEBUG_SPLIT = "1"

内容的提问来源于stack exchange,提问作者Dima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:57:25