我正在通过引导和 chroot 的组合来准备操作系统映像。某些操作(例如构建内核模块)依赖于uname
输出,即使在 chroot 内部,该输出也会报告主机配置。该配置与正在部署的配置不同。结果是找不到内核头并且其他步骤变得混乱。
人们可以发挥创意并uname
用伪造的 shell 脚本替换它,但更实用的方法是什么?
答案1
Linux 提供了一种有限的方法来更改 报告的值uname
,其中personality
可以通过以下方式调用系统调用setarch
实用程序(每个非嵌入式 Linux 上可用的 util-linux 软件包的一部分)。例如,您可以在 amd64 计算机上使用setarch i386 myprogram
或linux32 myprogram
使程序相信它正在 32 位 x86 系统上运行。
但是,无法将报告的版本更改uname
为任意数字。
还可以更改进程树的主机名,使用UTS 命名空间。
施鲁特可以根据chroot的配置来设置这些参数。
但对于编译软件,改变信息报告uname
是不够的。您还需要为目标处理器使用正确的编译器,链接正确的代码等。这称为交叉编译,并且交叉编译环境不使用有关主机的任何信息来决定构建什么以及如何构建它。所以忘记假装吧uname
,而是继续阅读,从交叉编译内核模块,并与kbuild 文档。