0

我阅读了这个关于计算机如何重启的非常有趣的问答,虽然我对操作系统开发一无所知,但我想知道你是否可以部分关闭系统,然后从那时起重新启动。

例如,在 Linux 上,如果我在关机期间正确读取输出,它有点像这样:

  1. 向所有进程发送 Terminate / KILL。
  2. 关闭服务/守护进程
  3. 断电。

启动顺序有点像:

  1. BIOS,引导加载程序
  2. 加载内核和模块
  3. 启动服务/守护进程
  4. 启动进程

那么我们可以在 2 点之后关闭,然后从 3 点开始备份吗?本质上,我认为这应该重置进程和守护进程,同时将内核保留在内存中,从而在正常(重新)启动时节省内核加载时间。

4

2 回答 2

3

这里专注于Linux:

“重新启动”用户空间(和一些硬件部分)

就这些服务、守护程序和程序的启动方式而言,您的启动序列中缺少一些东西。

init在 Linux 上输入。的目的(/sbin/init可能是 system V init、upstart 或 systemd)正是启动所有这些其他进程。所有这些 init 实用程序都具有管理它们在其下运行的服务的功能。

现在,一个linux系统也有runlevels的概念,即:

0 = shutdown
1 = single user recovery mode, no networking
2 = ?
3 = multi user networking no X
4 = ?
5 = multi user networking X

这 ?那些没有严格定义。无论如何,如果您init 3现在 su 到 root 并键入,假设您在 Linux 上,X 和每个 x 客户端都将被终止。当然,如果在给定的运行级别上允许某些内容,它不会被杀死,但是如果您只想重新启动某个进程,那么这可以很好地实现。重新启动系统守护进程的用例是响应更新,如今大多数包管理器实际上会通过您选择的 initscript 工具为您执行此操作。

所以我们可以重新启动整个 GUI,我们可以重新启动任何守护进程。我们也可以杀死任何其他进程。重新加载硬件驱动程序?我已经可以通过 即时执行此操作modprobe,所以如果我想更新我的图形驱动程序,我可以init 3删除旧驱动程序,插入新驱动程序并继续。

您的包管理器知道如何重新启动系统守护程序,您可以随时按照它的建议注销并重新登录;因此,Linux 在避免更新时重新启动方面已经相当有效。

“重启”内核

所以基本上,我喜欢认为大多数 Linux 都可以“重新启动”而无需实际重新启动。那么现在还剩下什么?

  1. 我无法重新加载内核。
  2. 我无法轻松卸载根文件系统。我依靠它来处理新加载的用户空间。免责声明:您可以在内核“重新加载”期间重新加载 initramfs,因此我们在这里依赖 1。

现在,问题是如何重新加载内核?好吧,内核实际上并没有什么特别的魔法,它只是另一个复制到内存中的计算机程序,所以我们可以在某个地方编写一个程序来覆盖我们的内核并将执行传递给它......

这存在,信不信由你,被称为kexec。我将离开维基百科页面来总结它的问题:

虽然可行,但实施诸如 kexec 之类的机制会带来两个主要挑战:

  1. 新内核将覆盖当前运行的内存,而它仍在执行
  2. 新内核通常会期望所有物理设备都处于明确定义的状态(就像它们在系统重新启动后一样,当 BIOS(或固件)将它们重置为“正常”状态时)。绕过真正的重启可能会使设备处于未知状态,新内核将不得不从中恢复。

与系统关闭不同,kexec 不会为您自动停止文件系统或进程;你对此负责。

所以你有它。根据您需要重新加载的部分,在 Linux 上,大部分都是可能的。

于 2011-06-09T01:06:59.747 回答
0

大多数处理器/计算机制造商都有计算机可以处于的几种不同的电源状态。英特尔的可能最适用于您的问题,这听起来像是关于通用计算机的。看看这个链接:

所有关于系统电源状态 (S0-S5)

要了解更多有关英特尔电源状态如何工作的信息,每种状态下保留哪些系统上下文等。一般而言,您输入的 S 状态越高,需要保留的系统上下文越少,因此系统越长将退出该状态并返回 S0(完全可操作)。

于 2011-06-09T00:37:02.083 回答