如何让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"
当前问题
- 干净系统安装普通版Nginx时,未生成任何alternatives配置,仅写入二进制文件
- 执行
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
待解答问题
- 针对双版本共享链接的需求,
ALTERNATIVE_TARGET和ALTERNATIVE_LINK_NAME的配置是否正确? - 删除包时报错的原因是什么?配置哪里出了问题?
解答
问题1:TARGET与LINK_NAME配置是否正确?
核心思路正确,但存在两处关键错误:
- 无需在所有语句中指定
[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
相关产品推荐
相关产品推荐

