为什么在 Linux 中操作系统和内核是分开处理的?

为什么在 Linux 中操作系统和内核是分开处理的?

当谈到任何 Linux 操作系统(包括 Ubuntu)时,人们倾向于区分术语核心操作系统。这对于 Windows 和 OS X 系列来说是正确的,但为什么它在 Linux 社区中如此普遍?有没有办法更新操作系统内核,而无需更新操作系统本身?或者反之亦然?如果是这样,那有什么用呢?

答案1

整个 GNU/Linux 系统采用模块化方法构建。您可以大部分升级(代替一个模块可以是一个单独的模块,而不会影响其他模块。这个模块可以是引导加载程序、内核、shell、命令、桌面环境、GUI 应用程序等等……

当然,只要你能够正确管理依赖项,这是真的。在 Ubuntu 周围的发行版中,易于用于自动解决依赖关系。

您可以使用以下命令安装另一个内核版本:

sudo apt install linux-image-<version>

只要 APT 允许,你应该能够重新启动并使用所选版本的内核,无论是通用版本、低延迟版本等。或者你自己构建一个内核版本,例如实时Linux,并将其与您当前的系统一起使用。

答案2

众所周知,内核是操作系统的重要组成部分,在 GNU/Linux 发行版中,您可以轻松更新内核,而无需触及操作系统的其他部分。然而,我们只是更新操作系统的一部分。

操作系统由两部分组成,内核空间和用户空间。

因此,是的,如果新版本与您当前的用户空间兼容,您就可以更新内核空间而无需触及用户空间。

关于更新用户空间工具,答案也是肯定的。

当你运行时:

sudo apt-get upgrade

如果有可用的内核更新,您将获得:

The following packages have been kept back:
  linux-generic linux-headers-generic linux-image-generic

所以你只更新你的用户空间,当你运行类似

sudo apt-get dist-upgrade

您正在更新所有内容,包括内核。

要仅将内核升级到较新的版本,请使用以下命令:

$ apt-cache search "linux-image-[0-9]+.*-generic" | awk '{print $1}' | head -4
linux-image-4.4.0-21-generic
linux-image-4.10.0-14-generic
linux-image-4.10.0-19-generic
linux-image-4.10.0-20-generic

查找较新内核的列表,然后将其作为新包安装,例如:

sudo apt install linux-image-4.10.0-14-generic

答案3

首先,我要澄清几点,因为我感觉你不了解 GNU/Linux 系统是如何诞生的。如果这对你来说不是什么新鲜事,请耐心听我说:

“内核”不仅仅是另一个运行的程序,它还是操作系统的一部分,提供基本功能:如果您要启动一个程序(例如,在命令行中键入“ls”),则必须从磁盘加载二进制文件(包括一些文件系统操作来定位它,以及一些文件处理来读取它),然后创建一个“进程环境”:分配内存,发出进程号,等等。所有前者的活动(FS、从文件读取等)都由系统库处理,但后者是内核功能。从某种意义上说,内核“就是操作系统”,其他一切都只是围绕它的装饰。

“Linux”实际上(仅仅!)是一个内核,没有其他操作系统的部分。Linus Torvalds 开始编写它,他采用了 Andrew Tanenbaums 的 MINIX 模板操作系统内核,并将其完善,使其成为一个成熟且真正可行的内核。直到今天,Linus(以及许多其他贡献者/曾经贡献者)仍在开发这个内核。这个内核仍然与 UNIX 非常相似,但不是 UNIX 内核。

“GNU” 最初是一项旨在“改进”许多常见 UNIX 命令的计划。我不会讨论他们是否成功,但他们确实编写了大量软件,并且一度拥有一系列实用程序。他们甚至开始开发自己的操作系统内核 (HURD),该内核主要基于 UNIX,但绝对与众不同。但到目前为止,HURD 仍处于早期开发阶段,几乎不是一个可行的解决方案。顺便说一句,“GNU”是“GNU (is) Not UNIX”的缩写 - 他们试图克服 UNIX 的一些(感知或实际)限制,旨在创建 UNIX 的继任者(再次说明:我不想参与讨论他们是否成功 - 我不在乎它是“更好”还是“更差”,但它绝对不同!)。

因此,由于一组工具缺少内核,而内核缺少工具集,将这两者结合在一起是一个自然而然的发展:GNU/Linux 诞生了。

不过,要想拥有可以运行(并且可用)的操作系统,您需要的不仅仅是一个内核和一套工具:您需要一个包管理系统,您需要安装程序,您需要模板配置,您需要......

几个不同的人(或团体)得出了这个结论,并使用 GNU/Linux 组合创建了他们喜欢的 GNU/Linux 系统,通过添加我上面提到的内容:他们创建了一个包管理器、一个打包系统、安装程序等等。这些不同的团体(分别是他们努力的结果)就是不同的发行版。今天有三种不同的包管理器(适用于 Debian 和派生系统,如 *ubuntu,rpm 适用于 RedHat 和派生系统,如 Fedora、CentOS 等,pacman 适用于 ArchLinux),但所有这些仅管理(本质上)相同的软件包:在 Debian 系统或 RHEL 系统上发出“ls”或“df”等时调用的内容来自不同的包,但本质上它是“ls”(“df”)程序的 GNU 版本,只是包装不同。

因此,“原则上”您可以单独更新内核,就像我上面提到的从所有软件的各个版本创建发行版的人所做的那样。

但是,这是一个很大的但是:因为不仅有内核和一些附加软件,还有很多其他的事情需要记住,比如系统配置工具(systemd,有些发行版使用,有些则不使用),网络管理工具,如 NetworkManager,而它又依赖于某些版本的 GNOME 库等等——“发行版”是一个相当复杂的东西,如果你尝试更新内核,很有可能你最终会因为许多相互依赖的关系而更新很多其他东西。

不过,与上述情况一样,“原则上”也是如此:您也可以通过下载所有源代码、编译它们、找到一组可用的版本组合、安装一些打包系统(或使用现有系统之一)等方式来创建自己的发行版,直到您拥有一个可分发、可安装和可配置的系统。这就是 Ubuntu 等发行版的创建者所做的,这不是奇迹,只是需要大量复杂的工作,因此实际上大多数用户都回避这一点,而是使用他们可以随时使用的东西。

我希望这回答了你的问题。

答案4

我猜它们之所以分开是因为内核是关键部分。一个有回归的内核,或者仅仅是一次失败的更新,都可能造成相当大的损害。你可能想减少更新频率;或者等一段时间再更新,以确保没有人报告令人担忧的错误。

一些高级或专业用户也会重新编译内核以修改其行为,使其更好地满足他们的需求。在这种情况下,您显然不希望每次升级时都自动将其替换为出厂版本。

相关内容