qemu / system-nspawn 的 PLATFORM 变量

qemu / system-nspawn 的 PLATFORM 变量

我正在使用 自定义 Raspbian 安装qemu,即:

systemd-nspawn -q --bind /usr/bin/qemu-arm-static -D $MOUNTPATH /bin/bash << EOF
DEBIAN_FRONTEND=noninteractive
export DEBIAN_FRONTEND
apt-get install -y samba
EOF

我的主机运行 Debian 9.9,目标是 Raspbian Buster。当我运行这样的命令时,我收到很多这些错误:

错误:ld.so:无法预加载 /etc/ld.so.preload 中的对象“/usr/lib/arm-linux-gnueabihf/libarmmem-${PLATFORM}.so”(无法打开共享对象文件):忽略。

看来它无法扩展${PLATFORM}变量。我不确定这个错误是来自主机还是模拟目标。无论如何,我尝试:

export PLATFORM=v7l

在主机终端和nspawn脚本中,但没有任何改变。我还阅读了输出,system-nspawn --help但没有找到与平台相关的任何内容。

我需要做什么?

答案1

伪变量${PLATFORM}实际上是一个链接器标记,嵌入到二进制文件和库中以引用其他库,以便允许它们在存在多种可能性时找到适合其平台的正确库。

曼ld.so有关更多详细信息,请更具体地参阅“Rpath 令牌扩展”部分。

在 的具体情况下${PLATFORM},它取自 auxv 向量。您可以通过运行命令(基本上是任何命令)并LD_SHOW_AUXV=1导出环境变量来让 ld.so 转储该向量。您还可以检查该/proc/$pid/auxv文件以查找正在运行的进程的 auxv。

这可能与 的输出匹配uname -m,但也可能是输出uname -p中的其他字段之一uname

我不认为你可以从 nspawn 控制它,因为它只是真正执行 Linux 命名空间,也许你需要实际的虚拟化来改变平台的外观。如果您可以在 QEMU(针对您的 Raspbian 架构)而不是 nspawn 中运行它,我敢打赌这应该可以解决问题。由于 QEMU 将启动 Linux 内核正确的平台,您应该获得正确的设置以使这一切正常工作。

相关内容