3.3. 提供 syspaths Subpackages
要使用 Software Collection 的软件包,用户需要执行与使用传统 RPM 软件包时不同的某些任务。例如,它们需要使用 scl enable 调用,它更改环境变量,如
PATH
或 LD_LIBRARY_PATH
,以便可以找到在其他位置安装的二进制文件。用户还需要将替代名称用于 systemd 服务。有些脚本也可以使用完整路径调用二进制文件,如 /usr/bin/mysql,因此这些脚本可能无法用于 Software Collection。
解决上述问题的建议解决方案是使用 syspaths 子软件包。基本的概念是允许用户在不影响基本系统安装的情况下消耗同一软件包的不同版本,但可选择使用 Software Collection 软件包,就像它们是传统 RPM 软件包一样,使软件集合更易于使用。
可选的 syspaths 子软件包(如 rh-mariadb102-syspaths)提供安装到标准路径中的 shell 打包程序和符号链接(通常为
/usr/bin/
)。这意味着,通过选择安装 syspaths 子软件包,用户会意外地更改基本系统安装,从而使 syspaths 子软件包通常适合不需要安装和运行同一软件包的多个版本。这在使用数据库时尤其如此。
使用 syspaths 子软件包可避免调整 Software Collection 软件包中脚本的需求,以便这些脚本更易于使用。请记住,syspaths 子软件包与基本系统安装中的软件包有冲突,因此无法与 syspaths 子软件包一起安装传统的软件包。如果这是问题,请考虑使用基于容器的技术将 syspaths 子软件包与基本系统安装隔离。
3.3.1. 命名 syspaths Subpackages
对于使用 syspaths 子软件包概念的每个软件集合,通常会提供多个 syspaths 子软件包。每个软件包都提供 syspaths 子软件包,该文件可以通过打包程序或符号链接提供。
在这里,有一个名为 software_collection_1-syspaths 的 Software Collection metapackage 子软件包的子软件包,其中 software_collection_1 是 Software Collection 的名称。software_collection_1-syspaths 子软件包需要其他 syspaths 子软件包包含 Software Collection。安装 software_collection_1-syspaths 子软件包会导致安装所有其他 syspaths 软件包。
例如,如果要为 software_collection_1-package_1 软件包中包含的二进制文件
binary_1
包含,以及一个包含在 software_collection_1-package_2 软件包中的二进制文件 binary_2
,然后在 software_collection_1 Software Collection 中创建以下三个 syspaths 子软件包:
software_collection_1-syspaths software_collection_1-package_1-syspaths software_collection_1-package_2-syspaths
3.3.2. syspaths Subpackages 中包含的文件
适用于 syspaths 子软件包中的文件是用户与之交互的二进制文件的可执行 shell 打包程序。
以下是 software_collection_1 中包含的二进制文件
binary_1
的示例,位于 /opt/rh/software_collection_1/root/usr/bin/binary_1
中:
#!/bin/bash source scl_source enable software_collection_1 exec "/opt/rh/software_collection_1/root/usr/bin/binary_1" "$@"
当您在
/usr/bin/binary_1
中安装此打包程序并使它可执行时,用户只需运行 binary_1 命令,而无需将其前缀为 scl enable software_collection_1。安装在 /usr/bin/
中的打包程序设置正确的环境,并执行位于 /opt/provider/%{scl}
文件系统层次结构的目标二进制文件。
3.3.3. syspaths Wrappers 的限制
syspaths 包装程序是 shell 脚本,意味着用户无法像目标二进制文件一样使用打包程序执行每个可能的任务。例如,当使用 gdb 调试二进制文件时,指向
/opt/provider/%{scl}
文件系统层次结构的完整路径,因为 gdb 无法使用打包程序 shell 脚本。
3.3.4. syspaths 子软件包中的符号链接
除了二进制文件的打包程序外,还有一些适合在
/opt
、/etc/opt/
或 /var/opt/
目录之外安装的文件,因此可由 syspaths 子软件包提供。例如,您可以使数据库文件的路径(通常位于 /var/opt/provider/%{scl}
下)更轻松地发现位于 /var/lib/
中的符号链接。但是,对于某些符号链接,最好不要在其原始名称下将其安装到 /var/lib/
中,因为它们可能与基础系统安装的传统 RPM 软件包的名称冲突。
最好将符号链接
/var/lib/software_collection_1-original_name
命名为类似。对于日志文件,建议名称为 /var/log/software_collection_1-original_name
或类似。请记住,名称本身并不重要,此处的设计目标是使这些文件在 /var/lib/
或 /var/log/
目录下轻松找到。
同样适用于配置文件,目标是使符号链接在
/etc
目录下轻松发现。
3.3.5. 没有前缀的服务
systemd 和 SysV init 服务是用户与守护进程服务交互的示例。通常,用户在启动服务时不需要在命令中包含 scl enable,因为服务是由设计在干净的环境中启动的。但是,用户仍需要使用正确的服务名称,通常以 Software Collection 名称作为前缀(如
rh-mariadb102-mariadb
)。
syspaths 子软件包允许用户使用服务的传统名称,如
mariadb
、mongod
或 postgresql
,如果安装了适当的 syspaths 子软件包。为达到此目的,请创建一个符号链接,而不在符号链接名称中包含软件集合名称,指向传统服务文件。
例如,由
/etc/rc.d/init.d/software_collection_1- service_1
文件提供的 software_collection_1
Software Collection 中的服务 service_1
可以作为 service_1 访问:
/etc/rc.d/init.d/service_1 -> /etc/rc.d/init.d/software_collection_1-service_1
或者,在使用 systemd 单元文件时:
/usr/lib/systemd/system/service_1 -> /usr/lib/systemd/system/software_collection_1-service_1