天天看點

遠端連接配接linux主機核心,如何更新遠端主機上的 Linux 核心

By Falcon of TinyLab.org

2008/06/27

注:最近在 linuxsir.org 看到有一篇《能否不重新起動而使用新遍譯好的內核》的文章,最近樓主自己發了一個解決辦法的文章,叫《用 kexec 迅速切換核心》,即參考資料,另外,也請參考一下資料。這種方法啟動更快,但是要求核心高于2.6.23。

問題背景

先來讨論這樣一個問題:

假設我們有一台伺服器放在網絡中心,網絡中心卻離我們呆的地方比較遠,如果想更新這台伺服器上的 Linux 核心,那該怎麼辦呢?類似的問題是:即使網絡中心就在我們隔壁,那裡頭嘈雜的環境确實不應該是人呆的地方,是以還是有必要試圖遠端更新這台主機上的核心。

也許答案很簡單:直接在伺服器上安裝一個遠端 Shell 服務,比如 ssh,在本地登入上去,通過發行版提供的方式或者是自己手動配置和編譯一個核心,然後在啟動引導管理器 grub 或者 lilo 中修改相關配置,啟動新核心就 ok。

如果新編譯的核心沒有問題,這肯定就是最簡單的方式了,但是:如果新編譯的核心無法啟動,比如 kernel panic,那該怎麼辦?系統挂在那裡,是以這個時候别指望那個 ssh 伺服器開着,等你連上解決問題,因為核心都沒有起來,這個 ssh 服務就沒有辦法起來了,這個時候你得給網絡中心的老大打個電話或者自己驅車過去跑一趟,而且還得忍受那嘈雜的機房環境,真是夠倒黴的 :-(

解決辦法

不要灰心,也許這個核心的啟動參數會有幫助:

panic=10

上述參數告訴核心,在它出現 panic 的10秒後,自動重新開機(請參考man bootparam)。

如果核心重新開機解決不了問題呢?你還得重複上面的工作,叫網絡中心老大……是以我們還得找其他的解決辦法,比如:

在那台伺服器之上安裝一個虛拟機(比如 Linux+xen, UML, qemu 等,更多請參考資料),在虛拟機之上再安裝提供服務的 Linux 作業系統,是以更新核心的操作可以通過虛拟機來完成了,就不存在重新開機硬體的問題了。

這個基本上是可以解決問題的,但是如果你嫌棄虛拟機可能帶來的效率問題,而不想這麼幹,那該怎麼辦呢?

還是有辦法,因為有專門的工具來引導 Linux 的啟動,是以如果啟動失敗,啟動管理器應該可以作一些力所能及的工作。

資料提到 grub 0.95 及以後的版本提供了這樣的功能:通過一定的配置,可以告訴 grub,如果它引導的核心啟動失敗,那麼可以讓它啟動其他的核心。

這裡頭存在兩個比較重要的問題,我們需要告訴 grub:你想啟動哪個核心

你想啟動的核心啟動失敗後應該啟動哪個核心

它們可以分别通過 default,fallback 在 grub 配置檔案(例如 Ubuntu 中 0.97 版的 Grub 的配置檔案為 /boot/grub/menu.lst)中指定:#

# Sample boot menu configuration file

#

# Boot automatically after 30 secs.

timeout 10

# By default, boot the first entry.

default 0

# Fallback to the second entry.

fallback 1

# For booting GNU (also known as GNU/Hurd)

title Ubuntu/Hardy

root (hd0,0)

kernel /boot/vmlinuz-2.6.24-16-generic root=/dev/sda1 ro quiet splash

initrd /boot/initrd.img-2.6.24-16-generic

boot

title Ubuntu/Hardy (recover mode)

root (hd0,0)

kernel /boot/vmlinuz-2.6.24-16-generic root=/dev/sda1 ro single

initrd /boot/initrd.img-2.6.24-16-generic

default 和 fallback 後面跟上核心入口“編号”,即它們的配置資訊在上述配置檔案中所處的位置,上面的配置檔案通過”default 0″把Ubuntu/Hardy 設定為你想啟動的核心,通過”fallback 1″把 Ubuntu/Hardy (recover mode) 設定為”你想啟動的核心”啟動失敗後 grub 自動進入的核心。是以,當無法正常進入 Ubuntu/Hardy 核心時,grub 會自動切換到 Ubuntu/Hardy (recover mode)。

這樣的話,隻要我們的伺服器上有一個能夠正常啟動的核心,并通過”fallback 該核心的入口編号”進行設定,那麼我們就可以非常友善地編譯新核心,通過”default 新核心的入口編号”設定為預設啟動的核心(也可以直接通過”grub-set-deafult 新核心入口編号”指令來配置),并嘗試遠端啟動進入新核心了。即使新核心啟動失敗,我們也不用擔心系統一直挂在那裡,因為 grub 會幫我們啟動到正常的核心。

關于重新開機遠端伺服器的更多辦法,建議閱讀一下資料;關于虛拟機的更多資訊,建議閱讀資料;關于 Grub 的詳細用法可以參考一下下面的 Grub 相關資料。

參考資料