星期二, 2月 19, 2008

設定 GRUB 單次重新開機到特定作業系統

這兩日為了2.6 裡面的幾個核心的安全問題 (DSA-1494-2),包含 Multiple Memory Access Vulnerabilities 與影響 VServer 的 『/proc' Local Memory Access Vulnerability 等,於是開始著手升級手上的一些伺服器。

由於許多伺服器都在機房中,大部分機器都沒有裝 HP Integrated Lights-OutIBM RSAIntelligent Platform Management Interface 之類的工具,遠端管理不易,萬一出了甚麼狀況只能去電請求機房人員協助處理。

最麻煩的是若是新核心開機失敗,還要拜託值班人員協助查看 console 錯誤訊息後,才能決定是否要換回原本的核心重新開機。比較簡單的作法是如果重新開機失敗,就請人按一下重開機鍵,自動載入舊版的核心即可。

新核心開機出錯的有兩種可能性,

  • 一個是 kernel image/ram disk image (initrd) 格式錯誤
  • 另一個則是 kernel modules, kernel 參數設定錯誤,以至於系統無法載入特定驅動程式或掛載檔案系統

為了排除這兩種可能發生的錯誤,在 GRUB (大部份新版的套件系統 都已經停止使用 LILO 而改用 GRUB) 中可以參考 How to make your system robust 中的設定修改 menu.lst。

首先,為了防止核心格式錯誤、核心參數或 menu.list 中的路徑設定問題造成 GRUB 根本無法載入新核心,可以使用 fallback 參數設定若預設開機設定失敗時,應採用那一組設定。

另外,若是核心載入後,才發生的驅動程式、核心模組錯誤,導致系統重新 開機,就必須改採另外一個設定,因為系統重新開機後, GRUB 還是會使用預設的開機設定,因此系統就會陷入不停重新開機的無窮迴圈。因此,我們必須使系統只嘗試載入新核心一次,第二次重新開機則改為舊版核心,因此萬 一出了意外,只要重新開機就可以透過舊版核心先行開機。

grub shell 中下達以下指令,就可以使系統使用新版核心重新開機一次

grub> savedefault --once --default=1
grub> quit

新的 GRUB 套件中亦提供了一個指令叫做 grub-reboot (8), 可以協助你完成以上的設定。這個指令只吃一個參數,就是 GRUB 開機設定序號。如上述設定,就是 grub-reboot 1,該指令執行後,會詢問你是否重新開機,如果重新開機後沒有問題,即可更改 menu.list 或利用 grub-set-default (1) 將新核心開機設定為永久預設開機設定。(你也可以透過修改 menu.list 的方式達到同一目的,唯手續較為繁複)