这里专注于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 都可以“重新启动”而无需实际重新启动。那么现在还剩下什么?
- 我无法重新加载内核。
- 我无法轻松卸载根文件系统。我依靠它来处理新加载的用户空间。免责声明:您可以在内核“重新加载”期间重新加载 initramfs,因此我们在这里依赖 1。
现在,问题是如何重新加载内核?好吧,内核实际上并没有什么特别的魔法,它只是另一个复制到内存中的计算机程序,所以我们可以在某个地方编写一个程序来覆盖我们的内核并将执行传递给它......
这存在,信不信由你,被称为kexec
。我将离开维基百科页面来总结它的问题:
虽然可行,但实施诸如 kexec 之类的机制会带来两个主要挑战:
- 新内核将覆盖当前运行的内存,而它仍在执行
- 新内核通常会期望所有物理设备都处于明确定义的状态(就像它们在系统重新启动后一样,当 BIOS(或固件)将它们重置为“正常”状态时)。绕过真正的重启可能会使设备处于未知状态,新内核将不得不从中恢复。
与系统关闭不同,kexec 不会为您自动停止文件系统或进程;你对此负责。
所以你有它。根据您需要重新加载的部分,在 Linux 上,大部分都是可能的。