我正在尝试使用 QEMU 设置外部 chroot 环境,主要如以下所述https://www.hellion.org.uk/blog/posts/foreign-chroots-with-schroot-and-qemu/。
主机系统是Ubuntu x86_64(在Github Actions上),外部chroot运行Debian for arm。
现在我尝试通过 apt 安装来设置 OCaml opam
,然后运行opam init
.失败是因为/proc/sys/kernel/overflowuid
没有找到。
深入挖掘,我发现/proc
chroot 监狱内部完全是空的。我尝试sudo mount -B /proc $CROSS_ROOT/proc
在运行后立即添加到脚本中debootstrap
,但仍然无济于事 -/proc
仍然是空的。与 相同sudo mount -t proc /proc $CROSS_ROOT/proc
。
另外,当我跑出mount | grep proc
chroot 监狱时,我看到了/proc
但没有看到CROSS_ROOT/proc
。
我注意到的另一个奇怪之处是,当我mount
在 chroot 监狱内运行以列出安装时,我收到一条错误消息,指出mtab
未找到 – 这是正常现象,还是表明这里有其他问题?
为了排除小错误 – 我$CROSS_ROOT
在 CI 脚本中多次使用,也在对debootstrap
.如果该变量为空,我想我会遇到很多其他错误。
为什么我看不到/proc
chroot 监狱的内部情况?
答案1
debootstrap
分两个阶段运行:
sudo debootstrap --variant=buildd --include=fakeroot,build-essential,sudo --arch=armhf --foreign buster $CROSS_ROOT $CROSS_MIRROR
sudo chroot $CROSS_ROOT ./debootstrap/debootstrap --second-stage
安装/proc
必须在第二阶段之后完成,而不是在两个阶段之间完成 - 第二阶段将/proc
再次卸载。 (问题中提到的源qemu-arm-static
在 chroot 内部提供了一些额外的魔力,这确实必须在两个阶段之间发生。对文件系统的任何其他自定义,尤其是涉及中央系统组件的自定义,可能会破坏事物或被撤消到第二阶段。)
将挂载命令移到第二阶段之后debootstrap
,我的 chroot 监狱就看到了/proc
。