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
在此之后,可以安装新包。但它仍然会覆盖现有的库。如何采取进一步的步骤来解决隔离命名空间中的此问题?
还有哪些更清洁的解决方案?
更简单的答案是使用匹配ld-linux.so
运行相应的应用程序并相应地指向PATH
和LD_LIBRARY_PATH
。ld-linux.so
通常指向一个可靠的动态加载程序 .so 文件。
例如,继续使用我上面问题中的命名空间来说明这将如何工作:
当在命名空间中看到时,我们将旧系统的二进制文件保留在目录中/opt
并将 FC30 系统的所有新内容安装到普通根目录。
将上面的复制命令cp -a /bin /sbin /lib /usr ./
更改为:
mkdir opt
cp -a /bin /sbin /lib /usr ./opt/
在命名空间中,所有旧版本的二进制文件仍然可用,方法是在修改后的PATH
和LD_LIBRARY_PATH
前面加上前缀,并ld-*.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
下的旧版本。