、、
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。