什么时候需要重启?


27

除了升级内核之外,是否需要对Linux系统进行任何更改才能重启?我知道在某些情况下,重新启动会使事情变得更容易,但是除了重新启动之外,是否还有其他无法完成的事情?

需要澄清的是:我正在考虑的典型台式机或服务器系统不会出现硬件故障。


3
无需重启即可完成所有操作。使用ksplice甚至可以更改内核,因此您可以热交换内核。您需要考虑的唯一一件事就是使所有内容都无需重新启动就变得非常复杂
Kiwy 2014年

4
您的问题非常广泛,因为“ Linux系统”可能意味着很多不同的事物。
Zrin 2014年

同样,“任何变化”可能意味着很多不同的情况。从作为MD镜像一部分的故障硬盘中进行恢复是否会发生这种变化?如果是,那么-不幸的是-有时有时需要重新启动,因为例如某些HDD故障(在某些HDD控制器上)会使系统无响应。但是您可能没有在问这样的“变化”……
Zrin 2014年

3
@Kiwy从技术上讲ksplice不会更改内核。Ksplice允许在运行的内核运行时对其进行修补。您可能会想到kexec,它允许在内存中正在运行的内核上“加载”新的内核映像。
Thomas Nyman 2014年

这使我想起,Windows XP(我从未超越过)从来没有关闭过重启的机会,即使它只是更新了IE8(或任何编号),而自从安装Windows以来,这已经有4年没有打开了,因此需要下载Windows XP。浏览器。
Shahbaz 2014年

Answers:


44

我想到了几件事:

  • 内核崩溃中恢复

    根据定义,如果不重新启动内核,则无法从内核恐慌中恢复。

  • 从挂起中恢复,使您无法访问终端

    如果系统无响应,并且您束手无策,无法发出恢复命令,那么您唯一能做的就是重启。通常,您要避免手动重启电源。对于此类情况,Linux内核具有Magic SysRq支持,可用于在紧急情况下重启计算机。

    只要CONFIG_MAGIC_SYSRQ在内核配置中启用了该kernel.sysrq sysctl选项,并且启用了该选项,就可以使用魔术SysRq组合键直接向内核发出命令:

    请注意,下面的Alt+ SysRq表示按住 Alt,然后按住 SysRq(通常是PrintScrn键)。

    1. Alt+ SysRq+ r:重新获得控制键盘
    2. Alt+ SysRq+ e:发送SIGTERM给所有进程,除了init,使它们有机会优雅地终止
    3. Alt+ SysRq+ i:发送SIGKILL给所有进程,但init强制终止
    4. Alt+ SysRq+ s:尝试同步所有已挂载的文件系统
    5. Alt+ SysRq+ u:重新挂载所有文件系统为只读
    6. Alt+ SysRq+ b:重新启动,或者

      Alt+ SysRq+ o:关机

    神奇的SysRq组合键尝试正常重启的助记符是:

    - [R EBOOT é VEN ˚F 小号ystem ù tterly 洛克

    对于无头服务器,甚至还有一个iptables目标,可通过网络启用远程SysRq序列。

  • 从无法启动的状态中恢复

    如果系统已经进入无法进行常规引导的状态(例如,由于系统升级失败,文件系统损坏等),则访问系统上故障恢复控制台的唯一方法可能是重新引导使用适当的启动时间选项。

  • 更改启动时内核参数

    某些内核参数(例如audit,启用/禁用内核审核)只能在引导时加载内核时设置。


3
“即使系统完全崩溃,也要重新启动”,我倾向于这个问题,以防万一,但是我认为我永远不会忘记这一点。
Embedded.kyle

1
可能值得注意的是,您可以使用kexec摆脱恐慌并避免完全重启。这同样适用于退出不可引导状态点。(至少在x86系统上,它们在任何方面都不是同一件事)。但是此答案的其余部分为+1。

@Vality感谢您的评论。如果kexec需要重新启动,则可能在某种程度上取决于一种观点。例如,kdump文档将kexec-on-panic描述为重新引导,该重新引导保留了系统内核的内存映像。至于不可引导状态的问题,我还考虑了引导加载程序配置错误(例如,首先无法加载内核),而kexec却无济于事。考虑到问题的性质,我认为关于语义的观点分歧是不可避免的。
Thomas Nyman 2014年

@ThomasNyman感谢您的详细答复,我认为您的问题是正确的。我认为谈论kexec可能只会使目标受众或这个问题不必要地复杂化。而且,您也很了解引导加载程序错误。

我从来没有注意到在打印屏幕下写的那个小SysRq!这太棒了。我希望我在学习内核模块编程时就知道这一点!
Shahbaz 2014年

2

我可以想到两次要重新启动的位置:

  1. 当我需要确保系统可以以正确的状态启动时。

    我曾经在一个运行了某些守护程序的系统上工作。它运行了几年后,电源故障导致它重新启动,但是该守护进程不是启动过程的一部分,没有人知道几年前如何配置它。当我们弄清楚如何重新配置​​系统时,该系统停机了几天。

    实际上,重新启动是唯一可确定断电后系统将正确重新启动的方法。

  2. 系统库已更新时。

    假设在与系统上许多应用程序/服务器共享的库中发现了一个主要的安全漏洞。您可以在不重新引导的情况下更新库,但是在加载了不安全的库后仍在运行多少个进程?您可以使用旧库来尝试重新启动任何内容(如果可以解决的话),但这很容易出错,并且比重新启动要花更长的时间。

    重新启动是确保所有正在运行的进程仍未使用旧的故障排除库的最佳方法。


如果您使用好的软件包管理器,则有更好的方法来查找取决于特定库的所有二进制文件。我想到了Gentoo的revdep-rebuild。
Spidey 2014年

1
@Spidey:重建这些二进制文件后,如何确保没有旧的进程在越野车库中运行?
加布2014年

1
您如何知道哪些后台驻留程序已装入有问题的库?
加布2014年

1
@Gabe例如,您可以lsof在升级库之前检查哪些进程已将库映射到其内存空间。
Thomas Nyman 2014年

1
@Gabe当然,虽然我同意这是重新启动的一个很好的理由,但OP显然没有询问在哪种情况下重新启动更为方便,而是绝对需要重新启动
Thomas Nyman 2014年

0

如果您是指计划中的软件配置更改,并且假设硬件运行正常(我还没有看到)和无错误的软件(您知道...),那么仅内核或驱动程序中的错误会迫使您重启。:)

除此之外...我不确定是否可以在init不切换到单用户模式和做一些魔术的情况下进行替换,这本质上与重启没有太大区别。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.