我正在尝试在 32 位系统上用 64 位内核替换 32 位内核,这样我就可以为需要它的应用程序提供对 64 位的完整支持(前提是它们具有必要的库或静态地链接),但为所有其他人保留 32 位用户空间。问题是许多 32 位用户空间应用程序都希望uname -m
报告i686
,因此我需要setarch i386
在运行任何内容之前执行此操作,最好是在init
.
我想我可以做一些类似传递init=/sbin/myinit
给内核的事情,其中myinit
有这样的事情:
#!/bin/sh
exec setarch i386 /sbin/init
但我希望有一种方法将默认个性编码到内核本身中。是否有任何现有的内核选项可以做到这一点?
答案1
据我所知,没有这样的内核选项。如果需要,您可以自己查看内核源代码;要搜索的相关内容是set_personality
和current->personality
。您想要的标志是PER_LINUX32
.
除了修补内核之外,覆盖 init 的解决方案可能是最简单的一种。这其实并不奇怪。它与使用 initramfs 非常相似。如果您已经在使用 initramfs,则可以将其放入setarch
其中。