、、
1概述
故障是高可用组最常接触的场景,其中包含了进程故障,网络故障、系统故障,硬件故障。掉电、关机和重启作为其中最常见的系统故障,具体的细节还是有些许差异的。本文将从操作系统与主板的行为讲解三者之间的联系与区别。
2掉电
作为实际运维侧最常见的异常场景,掉电的流程相对不那么复杂。当主板检测到AC(电源)失联时,会触发ACPI的掉电事件。此时主板会通知CPU将当前的计算尽可能完成,如果在一个时间窗口内无法完成的则直接抛弃,并置CPU状态为S5,并按照存储速度由快到慢的顺序(CPU——内存——硬盘,但实际上基本上会直接切掉前两个的电,因为很少有任务能够在这个窗口期内完成)切断电源。
接着主板会进入G3状态:即主板仅通过板载电池供电,该电池仅用作保证响应开关机按钮事件、记录时钟信息(这个时钟就是时间,操作系统的时间也是通过这个读的)等操作。待下次启动时,根据BIOS存储的信息,决定进行“完整检查”或者“快速检查”,通常对于家用机而言,大部分执行的是快速检查;但对于服务器而言,进行的一般都是完整检查。因此对于服务器而言之所以掉电后启动速度极慢,实际上是因为掉电后执行了一遍完整自检。根据个人经验,一次完整自检可能需要耗时10分钟以上。
这里比较特殊的是,尽管是按照这个顺序去切断电源,硬盘很可能因为存电不足而无法正常被断电,对于相对古老的机械硬盘而言最大的灾难莫过于写入时突然断电导致磁头没有及时归位,这会导致下次启动时磁头不能检查自己是否处在正常状态而对磁盘造成不可逆的损伤。尽管当前现在的机械磁盘也做了短时存电的操作,但这个功能尽量不要用,尤其是对于数据要求比较高的场景下。
3关机
关机的种类有很多,可以根据不同的形式进行划分。
3.1保存进程关机
保存进程关机是我们日常生活中最常用的一种关机手段,执行该关机时系统会向当前正在执行的进程通知系统即将关闭,当除了系统进程以外其他所有进程都完成了各自任务,系统会逐步结束自身进程,并向主板通知。
该类关机执行通常是通过操作系统界面的关机按钮提供相关功能,对于Linux而言其可以与shutdown命令或者init 0简单对应。
3.2保存系统关机
不保存进程关机通常是当系统上大部分进程挂起,无法正常执行保存进程关机的操作时才使用的一种关机手段。该关机相比起不保存进程关机,除了不通知执行的进程以外,其他的区别不大。系统在执行该关机时,会直接结束其他进程,然后逐步结束自身进程,并向主板通知。
该类关机执行通常没有对应的图形界面接口,对于Linux而言其可以与halt命令简单对应。
3.3硬关机
硬关机通常是当系统进程挂起,整个系统卡死无响应,无法正常执行保存系统状态关机的操作时才使用的一种关机手段。该关机相比保存系统关机更加的粗暴:在执行该关机时,会直接通知主板掉电,不保留任何操作系统或者用户进程相关的内容。
该类关机执行通常没有对应的图形界面接口,但一般的长按关机键会触发该类关机,对于Linux而言其可以与poweroff命令简单对应。
3.4关机之后
对于以上三类关机,主板收到通知后此时会进入G2状态:即主板此时由AC供电,但不再拉起操作系统的状态。需要说明的是:硬关机的表现是最接近G3关机的,从操作系统层面而言表现是一致的,都是系统进程被强制终结。但两者由于唤醒时BIOS的状态不同,因此不排除在这个过程中出现掉电导致的硬件损坏,因此两者的实际表现可能仍有不同之处(尤其是硬盘)。
4重启
重启是我们常用的一种操作,其具体的行为取决于相关的关机实现,但重启与关机最大的不同在于,重启不会通知主板关闭,主板仍旧会通过引导拉起操作系统。
通常重启应用于不需要重新初始化硬件的场景下(比如部分硬件固件无法加载等,因为关机后再开机会重新初始化并加载相关的固件,但重启不会重新初始化设备)。对于大多数带有图形界面的操作系统,其图形界面下的重启一般是保留进程重启,但对于Linux的reboot命令一般是保留系统重启。
5.题外话
实际上,对于当前的Linux,其shutdown、halt、poweroff、reboot命令已经合并成一个工具包了,内部执行时逻辑也有了杂糅。因此实际上真正执行时,可能并不会按照文中的预期去严格区分,如果测试时需要测试硬关机,可以考虑在poweroff的前提下加上参数-f。