0

busybox 系统在 glibc-2.24 上带有 rpm 命令。Fedora Core (FC) 和/或更高版本的程序如何在这个系统上运行?

我发现 FC25 带有相同的 glibc 版本。如果我下载 FC25 rpm 软件包并安装它们,有时它们会运行。其他一些会失败。我也想运行 FC30 或其他版本。

问题在于 FC 包会覆盖同一目录中的现有库。我已经想出运行一个bash,你只需要安装bash, glibc, glibc-common, ncurses-base, ncurses-libs, libgcc. 安装这些软件包后,Bash 将运行。由于这些是少数库,因此使用 FC 版本安装它们应该会带来不影响 bash 的细微差异。但是微小的差异可能会影响其他程序,或者安装更多的包可能会带来更多的差异,从而影响更多的程序。

如何解决?

我已经阅读了有关 linux 命名空间的信息。因此,一个开始的路径是创建一个命名空间,从而隔离主机文件系统。我试过这个来创建一个命名空间文件系统:

cd /root
mkdir root-fc30
cd root-fc30
mkdir dev proc tmp var
cp -a /bin /sbin /lib /usr ./
mount -o bind /proc proc
mount -o bind /dev dev
mkdir root-old

然后进入命名空间:

unshare -m --propagation slave
pivot_root . root-old

在此之后,可以安装新的软件包。但它仍然会覆盖现有的库。在隔离的命名空间中可以采取哪些进一步的步骤来解决这个问题?

还有哪些更清洁的解决方案?

4

1 回答 1

1

更简单的答案是使用匹配ld-linux.so来运行相应的应用程序并相应地PATH指向LD_LIBRARY_PATHld-linux.so通常指向一个可靠的动态加载器 .so 文件。


例如,继续使用我上面问题中的命名空间来说明这将如何工作:

当在命名空间中看到时,我们会将旧系统的二进制文件保存在/opt目录中,并将 FC30 系统的所有新文件安装到普通根目录。

将上面的复制命令cp -a /bin /sbin /lib /usr ./改成:

mkdir opt
cp -a /bin /sbin /lib /usr ./opt/

在命名空间内,所有旧版本的二进制文件仍然可以通过添加修改后的PATHandLD_LIBRARY_PATHld-*.so.

第一步是使用命名空间中的旧版本启动一个 shell:

LD_LIBRARY_PATH=/opt/lib:/opt/usr/lib PATH=/opt/bin:/opt/sbin:/opt/usr/bin:/opt/usr/sbin \
/opt/lib/ld-2.24.so /opt/bin/sh

在这个可用的 shell 中,为 bash 安装包以运行 FC25 版本:

/opt/lib/ld-2.24.so /opt/bin/rpm -i bash-4.3.43-4.fc25.armv7hl.rpm
/opt/lib/ld-2.24.so /opt/bin/rpm -i file-5.28-4.fc25.armv7hl.rpm
/opt/lib/ld-2.24.so /opt/bin/rpm -i file-libs-5.28-4.fc25.armv7hl.rpm
/opt/lib/ld-2.24.so /opt/bin/rpm -i glibc-2.24-10.fc25.armv7hl.rpm
/opt/lib/ld-2.24.so /opt/bin/rpm -i glibc-common-2.24-10.fc25.armv7hl.rpm
/opt/lib/ld-2.24.so /opt/bin/rpm -i ncurses-base-6.0-6.20160709.fc25.noarch.rpm
/opt/lib/ld-2.24.so /opt/bin/rpm -i ncurses-libs-6.0-6.20160709.fc25.armv7hl.rpm
/opt/lib/ld-2.24.so /opt/bin/rpm -i libgcc-6.4.1-1.fc25.armv7hl.rpm

安装完这些包后,执行以下命令即可正常使用FC25版本的bash:

LD_LIBRARY_PATH=/lib:/usr/lib PATH=/bin:/sbin:/usr/bin:/usr/sbin /usr/bin/bash

安装 FC30 二进制文件和其他软件包的过程是相同的。一旦安装了足够多的工具包,就可以使用 FC 版本的工具来安装更多的包。/opt可以删除命名空间下的旧版本。

于 2020-01-30T06:19:21.323 回答