不重啟不當機!Linux內核熱補丁的四種技術
供圖: Shutterstock
沒人喜歡重啟機器,尤其是涉及到一個內核問題的最新補丁程序。
為達到不重啟的目的,目前有3個項目在朝這方面努力,將為大家提供內核升級時打熱補丁的機制,這樣就可以做到完全不重啟機器。
Ksplice項目
首先要介紹的項目是Ksplice,它是熱補丁技術的創始者,並於2008年建立了與項目同名的公司。Ksplice在替換新內核時,不需要預先修改;只需要一個diff文件,列出內核即將接受的修改即可。Ksplice公司免費提供軟體,但技術支持是需要收費的,目前能夠支持大部分常用的Linux發行版本。
但在2011年Oracle收購了這家公司後,情況發生了變化。 這項功能被合入到Oracle自己的Linux發行版本中,只對Oralcle自己提供技術更新。 這就導致,其他內核hacker們開始尋找替代Ksplice的方法,以避免繳納Oracle稅。
Kgraft項目
2014年2月,Suse提供了一個很好的解決方案:Kgraft,該內核更新技術以GPLv2/GPLv3混合許可證發布,且Suse不會將其作為一個專有發明封閉起來。Kgraft被提交到Linux內核主線,很有可能被內核主線採用。目前Suse已經把此技術集成到Suse Linux Enterprise Server 12。
Kgraft和Ksplice在工作原理上很相似,都是使用一組diff文件來計算內核中需要修改的部分。但與Ksplice不同的是,Kgraft在做替換時,不需要完全停止內核。 在打補丁時,正在運行的函數可以先使用老版本或新內核中對應的部分,當補丁打完後就可以完全切換新的版本。
Kpatch項目
Red Hat也提出了他們的內核熱補丁技術。同樣是在2014年初 -- 與Suse在這方面的工作差不多 -- Kpatch的工作原理也和Kgraft相似。
主要的區別點在於,正如Red Hat的Josh Poimboeuf總結的那樣,Kpatch並不將內核調用重定向到老版本。相反,它會等待所有函數調用都停止時,再切換到新內核。Red Hat的工程師認為這種方法更為安全,且更容易維護,缺點就是在打補丁的過程中會帶來更大的延遲。
和Kgraft一樣,Kpatch不僅僅可以在Red Hat的發行版本上使用,同時也被提交到了內核主線,作為一個可能的候選。 壞消息是Red Hat還未將此技術集成到產品中。 它只是被合入到了Red Hat Enterprise Linux 7的技術預覽版中。
...也許 Kgraft + Kpatch更合適?
Red Hat的工程師Seth Jennings在2014年11月初,提出了第四種解決方案。將Kgraft和Kpatch結合起來, 補丁包用這兩種方式都可以。在新的方法中,Jennings提出,「熱補丁核心為其他內核模塊提供了一個熱補丁的註冊介面」, 通過這種方法,打補丁的過程 -- 更準確的說,如何處理運行時內核調用 --可以被更加有序的組織起來。
這項新建議也意味著兩個方案都還需要更長的時間,才能被linux內核正式採納。儘管Suse步子邁得更快,並把Kgraft應用到了最新的enterprise版本中。讓我們也關注一下Red Hat和Canonical近期是否會跟進。
作者:Serdar Yegulalp 譯者:coloka 校對:tinyeyeser
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive