Linux 遇到 kernel panic 后可自动重启

现在的 Linux 比10年前要成熟的多,但有时候还是会出现莫名其妙、无法解释的 kernel panic 情况。对于大部分 Linux 用户来说出现 kernel panic 重启一下就可以了,但是对于系统管理员和那些做虚拟主机、共享主机、OpenVZ VPS 主机的 hosting 服务商来说出现未知的 kernel panic、导致系统挂掉可能就不太友好,如果没有 KVM over IP 的话,系统挂掉后 hosting 服务商需要自己先反馈到上一级的独立服务器提供商,比如提交 ticket 或者打电话,然后独立服务器供应商还要时间验证你的资料、处理你的 ticket,最后才到真正的数据中心,一般晚上(中国的白天)数据中心只有几个人值班,到最后处理完你的重启请求可能已经过了20多分钟了,这20分钟的 downtime 时间你还要给你自己的客户写信解释情况,问题是这20分钟还是理想情况,如果你碰到一个很烂的独立服务器提供商或数据中心,处理 ticket 要以小时或天为单位来计,或者如果你是 one man、晚上正在睡觉没有收到 kernel panic 报警,这样的话花的时间就会更多。那么有没有办法让 Linux 服务器遇到 kernel panic 情况自动重启呢?VPSee 在这里介绍一个简单有效的小技巧:

编辑 /etc/sysctl.conf 文件,并定义遇到 kernel panic 20秒后自动重启 Linux:

# vi /etc/sysctl.conf
kernel.panic = 20

Linux 这么神奇?遇到 kernel panic 自己都挂了还能自己重启?来看看 Linux 内核里面这部分代码是怎么工作的,最好最权威的资料永远来自内核源代码:

# vi linux-2.6.31.8/kernel/panic.c

...
 if (panic_timeout > 0) {
                /*
                 * Delay timeout seconds before rebooting the machine.
                 * We can't use the "normal" timers since we just panicked.
                 */
                printk(KERN_EMERG "Rebooting in %d seconds..", panic_timeout);

                for (i = 0; i < panic_timeout*1000; ) {
                        touch_nmi_watchdog();
                        i += panic_blink(i);
                        mdelay(1);
                        i++;
                }
                /*
                 * This will not be a clean reboot, with everything
                 * shutting down.  But if there is a chance of
                 * rebooting the system it will be rebooted.
                 */
                emergency_restart();
        }
...

评论 (5 Comments)

  1. Windows蓝屏了也能自己重启。和linux一样需要设置

  2. 不知道出现 kernel panic 显示器会有什么显示输出呢?或者有什么错误日志..? 没有遇见过啊..能具体说说嘛?

  3. 好像不能实现啊,我遇到了设置了kernel.panic = 20
    但是还是没自动重启

  4. 是不是需要再加一个kernel.panic_on_oops = 1呢

  5. 能不能自动重启和 kernel.panic_on_oops 这个参数无关,这个参数只是用来延迟响应的,这样可以给 klogd 一点时间写 log.

发表评论