不同的 Linux/Unix 内核可以互换吗?

不同的 Linux/Unix 内核可以互换吗?

我可以使用 Linux 内核并将其与 FreeBSD 等一起使用,反之亦然(例如 Debian 中的 FreeBSD 内核)吗?有没有一个通用的答案?有什么限制?有哪些障碍?

答案1

不,来自不同 Unix 风格操作系统实现的内核是不可互换的,特别是因为它们都向系统的其余部分(用户空间)提供不同的接口——它们的系统调用(包括ioctl细节)、它们使用的各种虚拟文件系统。 ..

在某种程度上,在源代码级别上,可以互换的是内核和 C 库的组合,或者更确切地说,是内核和库公开的用户级 API(本质上是 POSIX 描述的层的视图,而不需要考虑是否实际上是 POSIX)。这方面的例子包括Debian GNU/kFreeBSD,它在 FreeBSD 内核之上构建了 Debian 系统,以及Debian GNU/Hurd,它在 Hurd 之上构建了 Debian 系统。

这并不完全达到内核可互换性的水平,但已经尝试标准化通用应用程序二进制接口,以允许二进制文件无需重新编译即可在各种系统上使用。一个例子是英特尔二进制兼容性标准,它允许符合它的二进制文件在任何实现它的 Unix 系统上运行,包括具有 iBCS 2 层的旧版 Linux。我在 90 年代末使用它在 Linux 上运行 WordPerfect。

也可以看看如何在 Linux 中构建 FreeBSD chroot

答案2

一些内核具有二进制兼容性,允许您将用户空间程序与不同的 ABI 混合(例如,freebsd 可以在一定程度上与 linux 二进制文件一起工作) - 然而,核心二进制文件(例如 init 程序、模块加载器、设备驱动程序设置工具、C 库) ,设置文件系统所需的工具...)实际上需要了解太多关于内核级接口才能成功引导具有外部内核的系统。

此外,文件系统需要兼容。此外,二进制兼容性选项需要“硬”编译到内核中 - 任何作为内核模块实现的东西都会失败,因为您无法运行模块加载器。

如前所述,如果您愿意重新编译,例如基于 freebsd 的 debian 系统,或者在 Linux 上设置 netbsd pkgsrc 系统(绝对不简单,但受支持且可能!),则用户环境往往是可移植的。

相关内容