如何 chroot 为应用程序提供新的 glibc 版本?

如何 chroot 为应用程序提供新的 glibc 版本?

我正在尝试运行一个程序,但是当我执行它时出现以下错误:

./app: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by ./app)

起初我读到手动升级glibc,但对于像我这样的非高级用户来说似乎风险太大。我的一个朋友告诉我,chroot但我不确定我必须遵循的步骤。谁能帮我 ?

我的系统信息:

uname -a:Linux hostName 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
Distro: Crunchbang 11 (Waldorf)
ldd --version: ldd (Debian EGLIBC 2.13-38+deb7u8) 2.13

ldd ./app:
  linux-vdso.so.1 =>  (0x00007ffdd593d000)
  libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007febe6450000)
  libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007febe623a000)
  libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007febe5eae000)
  libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007febe5c2c000)
   /lib64/ld-linux-x86-64.so.2 (0x00007febe677a000)

答案1

首先,您需要意识到,如果您收到这样的消息,则您尝试运行的应用程序不适用于该平台/发行版。所以,它很可能会以最痛苦的方式崩溃,带走你所有的文件、金钱和房子:)

特别是,这与 (g)libc 有关,因为它与内核 ABI 紧密相连,并且运行为不同版本的 ABI 编译的 glibc 是有风险的。这就是库版本控制背后的原因。

如果在所有这些警告之后您仍然想尝试一下,您可以按复杂程度顺序使用以下内容:

  1. 将适当的库解压到您的应用程序所在的同一目录(或任何其他杰出的目录)中,然后运行以下app命令:

    LD_LIBRARY_PATH=. ./app
    

您可以通过测试来检查是否选择了正确的库LD_LIBRARY_PATH=. ldd ./app。请注意,这不适用于rootuser 和 suid 应用程序。

  1. 您实际上可以尝试为应用程序创建 chroot 环境。请记住,该chroot调用会重置根 (/) 目录下运行的应用程序的位置。实际上,这意味着您不仅需要提供替换glibc库,还需要提供全部您的应用程序使用的库以及这些库使用的库等等,直到您拥有创建自给自足环境的一切。这还意味着至少存在/dev/null/dev/stdin/dev/stdout/dev/log设备以及/etc/passwd/etc/group文件。 Debian 上此类环境的一个很好的例子是postfix安装(检查/var/spool/postfix/)。启动命令本身很简单:

    chroot /home/of/chrooted/app ./app
    
  2. 最好和最简单的方法是使用docker适合您的应用程序的适当图像。安装docker本身就是一个很大的话题,你可以从Docker安装指南。 Linux 内核大于 3.8+ 是它的一个先决条件。除了这个限制之外,这是运行需要不同发行版/库集的应用程序的最佳方式。

另外,检查如何在不更新GLIBC的情况下运行新软件?

答案2

安装具有目标版本的发行版的 chroot 环境是最省力的解决方案。它可能会花费你几 GB 的磁盘空间,但它相当轻松,特别是在 Debian 及其衍生版本上施鲁特完成设置可用 chroot 环境的工作反引导程序可以在该 chroot 环境中安装较旧或较新版本的 Debian 或 Ubuntu。看如何在 64 位 Debian/Ubuntu 上运行 32 位程序?了解 schroot+debootstrap 指南。对于 GLIBC 2.14,您可以选择jessie(Debian) 或precise( trustyUbuntu) 作为使用 debootstrap 安装的版本。

使用默认的 schroot 设置,您可以运行类似的命令

schroot -c jessie ./app

您的主目录将自动位于 chroot 中的同一路径中。只要应用程序安装在您的主目录下,并且只需要访问您的主目录下的其他文件或 chroot 中存在的软件,就可以了。

相关内容