我安装了 Debian 9,并带有 Debian 6 chroot 监狱。我正在使用一个专有的应用程序,直到最近它在监狱中运行良好。但是当我运行它的新版本时,它在 libc 中崩溃了。我厌倦了创建一个较新的 Debian 监狱 (Debian 8),但它仍然崩溃。如果我在本机 Debian 8 上运行它,它就可以工作。如果我在 Docker 中导入 Debian 6/8 监狱,它仍然可以工作。
有谁知道为什么应用程序会在 chroot 中崩溃,但在天真运行或在 Docker 中导入并运行 chroot 目录时不会崩溃?
答案1
虽然内核人员试图避免对用户空间 ABI 进行不兼容的更改,但有时他们无论如何都必须这样做(通常是出于安全原因),然后可能会出现此类问题。为了避免用户空间二进制文件突然损坏,最初旧的 ABI 仍将启用,但一段时间后它会默认禁用。此时,就会出现这样的问题。
为了让事情不会失败,你有两个选择:
- 使用旧内核在 VM(不是 chroot)中安装旧软件。这应该总是有效
- 如果您当前的内核仍然具有您需要的功能,但默认情况下未启用它,您也许可以启用它一段时间。但请注意,这样做可能会降低环境的安全性,因此不要在安全关键环境中这样做。
对于您的具体问题,最有可能的罪魁祸首是 vsyscall 模拟,它在最新的发行版中默认被禁用,但可以通过指定内核启动时参数来启用vsyscall=emulate
。