对话 UNIX:了解 Ksplice

远离重新引导

Ksplice 可以在不到一秒时间里动态地应用内核补丁,不需要重新引导。本文讲解如何执行简便的系统更新。

Martin Streicher, 软件开发人员, Pixel, Byte, and Comma

作者照片 - martin streicherMartin Streicher 是一位 Ruby on Rails 的自由开发人员和 Linux Magazine 的前任主编。Martin 毕业于 Purdue University 并获得计算机科学学位,从 1986 年起他一直从事 UNIX 类系统的编程工作。他喜欢收集艺术品和玩具。



2010 年 11 月 08 日

UNIX® 系统往往要长时间运行。桌面或便携系统可能连续运行几周甚至几个月,而服务器可能连续运行一年甚至更长时间。实际上,如果可以排除硬件故障和自然力,UNIX 有可能永远运行下去。但是,硬件不是完美的,自然力无法控制,软件会受到 bug 的影响。有时候,需要更换硬件组件,雷雨等自然现象可能影响系统,系统需要应用补丁并重新启动。与死亡和税收一样,停机是不可能完全避免的。

但是,与死亡和税收不同,我们可以尽可能减少 停机时间。正如可靠的数据中心会配备备用电源和冗余的 Internet 连接,预防性的定期系统维护和热备用可以大大提高可用性。另外,可以使用 rpm、Aptitude 和 yum 等工具根据需要对大多数应用程序和库进行无缝更新。

但是,内核更新(为了解决核心系统软件中的漏洞和缺陷所做的更改)没这么方便。内核更新影响很大,需要安排停机时间,在停机期间会临时终止受影响的每个系统上的所有服务。尽管这些维护是必要的,而且很重要,但是内核更新会导致操作时断时续。图 1 中的时间线说明从 2009 年 1 月到 2010 年 2 月许多流行的操作系统的重要内核更新频率。每个圆圈图标表示必须重新启动(使用此图已经得到 Ksplice 公司许可)。

图 1. 操作系统的内核更新频率
操作系统的内核更新频率

但是现在,您可以在内核运行时应用补丁,这样就避免了重新启动导致的大规模服务中断。换句话说,不再需要专门安排更新时间。

Ksplice 是一套在原地 (即在运行时)对内核应用补丁的工具,它不需要重新引导。提供现有的内核、它的源代码和一个或多个统一差异文件(统一差异文件是内核补丁的规范形式),Ksplice 就会把内核中现有的错误对象代码替换为新的对象代码。Ksplice 可以替换程序代码和数据结构。更棒的是,内核拼接 只会中断正常系统操作不到一毫秒,守护进程、进程和连接都保持不变。

我们先简要讨论一下 Ksplice 的工作方式,然后学习如何使用它的工具更新内核。使用 Ksplice 有三种方式:

  1. 图形用户界面 (GUI)
  2. 等效的高级命令行实用程序
  3. 原始 Ksplice 工具(如果有内核源代码的话)

例如,Ubuntu 9.04 或 9.10 用户可以下载并安装一个点击(point-and-click )应用程序,用它选择并应用内核更新。后面会介绍这三种 Ksplice 变体。

对正在运行的内核应用补丁

简单地说,Ksplice 把一个或多个有漏洞或错误的函数替换为新的正确的实现,从而对正在运行的内核应用补丁。为了让替换生效,工具在正在运行的内核映像中添加新的函数对象代码,然后在每个现有函数的开头注入一个跳转,从而调用函数的新实现。实际上,整个内核没有变,只是增加了新的对象代码和几个函数调用重定向指令。

另外,Ksplice 可以影响数据结构,只是需要多做一点儿编程工作。Ksplice 可以在更新期间运行代码来帮助执行这种更改。Ksplice 还提供一对 hooks,可以在更新内核之前和之后运行设置和清理代码。还可以在内核中添加新函数;新函数在原来的内核中没有对等的实现。

实际上,可以对任何内核应用 Ksplice,甚至是那些在 Ksplice 开发出来之前就存在的内核。要想拼接内核,必须有内核的源代码、希望应用的补丁以及编译器,编译器必须能够在对象代码中把内核中的每个函数和数据结构隔离在它们各自的部分中。例如,GNU Compiler Collection (GCC) 提供的标志 -ffunction-sections-fdata-sections 分别提供这些功能(Intel® C 编译器等其他编译器有相似的功能)。Ksplice 更容易处理这种 “模块化” 对象代码。要应用补丁的运行中的内核不需要用这些特殊选项编译。

Ksplice 把从原来的源代码编译生成的内核称为 内核。从应用补丁后的源代码构建的新内核称为 内核。正在运行的内核称为运行 内核。如果 内核与运行内核不同(即源代码与正在运行的内核不匹配),Ksplice 就会失败。除了检查这个特殊条件之外,Ksplice 还对比 内核和 内核,把每个差异变成一个拼接。所有拼接打包成一个对象文件,准备注入内核。

Ksplice 使用 stop_machine 特性(根据 UNIX 风格,也可能是等效的其他特性)准备拼接新代码。stop_machine 是一个通信信号;它让一个 CPU 继续运行,而让所有其他 CPU 空闲。执行 stop_machine 之后,Ksplice 分析每个有替换标志的函数,判断它是否是活跃的。如果线程的指令指针引用内存中的函数代码,或者线程的内核堆栈引用函数中的返回地址,就认为这个函数是活跃的,无法替换。否则,函数是不活跃的,可以替换。Ksplice 会反复尝试执行替换,但是最终可能放弃。如果是这种情况,它会报告错误并停止运行。


应用内核补丁从未如此容易

如果您运行比较流行的 UNIX 发行版,就可以非常容易地使用 Ksplice。Ksplice 的作者提供针对您的发行版定制的客户端应用程序。只需每个月每个系统花费不到 5 美元的象征性费用,即可及时更新内核。在 Ksplice 网站上可以找到支持的操作系统的列表(见 参考资料)。对于 Ubuntu 9.04 (Jaunty Jackalope) 和 Ubuntu 9.10,Ksplice 软件是免费的。

为了演示,本文使用 Ubuntu 9.10 并拼接它的内核。要想在 Ubuntu 上使用 Ksplice,必须下载并安装 Ksplice Uptrack 客户端(见 参考资料 中的链接)。Uptrack 管理您系统可用的无需重新引导的内核更新。您可以查看和安装 Ksplice 更新,当有新的内核更新可用时可以检查警告。这个软件是一个 Debian 包。还可以使用 wget 或 cURL 等工具通过命令行下载此软件。

接下来,使用 gdebi 安装软件包。如果您还没有 gdebi,可以用以下命令安装它:

sudo apt-get install gdebi

如果喜欢使用图形客户端,可以用以下命令安装 Ksplice:

sudo gdebi-gtk ksplice-uptrack.deb

gdebi 安装 Uptrack 及其依赖项,包括 kerneloops、YAML 库、Python 和 cURL 库(见 清单 1)。

清单 1. 安装 Uptrack 及其依赖项
$ wget http://www.ksplice.com/uptrack/dist/karmic/ksplice-uptrack.deb
$ sudo gdebi ksplice-uptrack.deb
Reading package lists: Done
Reading state information: Done
Reading state information: Done
Reading state information: Done
Reading state information: Done

Requires the installation of the following packages:
kerneloops  curl  libcurl3  python-yaml  libyaml-0-1
Client for the Ksplice Uptrack service
The Ksplice Uptrack service enables you to keep your system
up to date and secure without rebooting it.
This package contains the command-line and graphical Uptrack clients.
Do you want to install the software package? [y/N]:y
...

接受服务条款并完成安装之后,Uptrack 自动启动。安装程序还在任务栏上放一个 Ksplice 图标(大写字母 K)以便于访问。图 2 显示 Uptrack Manager 在一个干净的 Ubuntu 9.10 系统上首次启动的情况。单击 Install all updates 即可对内核应用补丁。

图 2. 启动 Uptrack Manager
启动 Uptrack Manager

进度条(见 图 3)显示安装的每个补丁。即使补丁非常多,对内核应用补丁也只需要很短时间,而且不需要重新引导。

图 3. Ksplice 进度条
Ksplice 进度条

完成之后,Uptrack Manager 刷新,显示系统的新状态,见 图 4。绿色的对勾表示补丁已经成功地应用,已经在运行中的内核中生效了。单击 Check 寻找系统可用的其他内核补丁。单击 Close 关闭此窗口。不需要以根用户身份运行 uptrack-manager;在应用任何更改之前,软件会提示输入管理员密码。

图 4. Uptrack Manager 中的当前系统状态
当前系统状态

任何时候都可以使用 uptrack-manager 命令或单击任务栏上的 K 图标来打开 Uptrack Manager。启动之后,Ksplice 一直运行。如果愿意,可以把 Ksplice 配置为当有更新可用时自动地对正在运行的内核应用补丁,或者只是发出警告。例如,要想选用前一种配置,应该编辑 /etc/uptrack/uptrack.conf 文件并把 autoinstall 行改为:

autoinstall = yes

除了 update-manager 之外,Uptrack Manager 还包含另外三个方便的命令行实用程序。(这些实用程序不同于下一节中讨论的直接处理内核源代码的工具。)uptrack-upgrade 安装最新的可用内核更新,uptrack-remove id 删除 ID 为 id 的内核更新。如果输入 uptrack-remove --alluptrack-remove 会删除安装的所有更新。uptrack-show 显示当前已经安装的更新的清单。

一定要记住,Uptrack Manager 并不替代发行版的标准包管理器。Ksplice 所做的所有更改都应用于正在运行的内核,只在内存中存在。因此,当关机时,所有 Ksplice 补丁都会丢失。更新磁盘上的内核仍然要使用传统的软件维护过程,比如运行:

apt-get update; apt-get upgrade

定期或者当发行版通知您有新的系统更新时,以根用户身份运行这个命令。应该及时更新磁盘上的内核,确保当系统最终需要重新启动时引导的是最新的内核。


更新定制的内核

对于基于桌面和服务器计算机、由厂商或社区项目构建并发布的内核来说,Uptrack Manager 是非常方便的工具。但是,如果内核是经过定制、在本地构建的,它就无效了,因为 Uptrack Manager 无法针对公开发布的操作系统检查内核并生成拼接。但是,可以使用 Ksplice 的 “原始” 实用程序分析公共补丁并创建自己的拼接。

讨论如何构建内核超出了本文的范围。如果您不熟悉这个过程,可以在网上找到许多精彩的说明和教程。这里只关注 Ksplice 提供的工具以及在您能够构建内核之后如何继续处理。

Ksplice 提供一个名为 ksplice-create 的实用程序,它用来创建内核拼接。这个命令需要两个输入:一个补丁文件和正在运行的内核的完整源代码树,其中包含已经应用的所有补丁。提供当前源代码和补丁,Ksplice 就会生成两个内核并对比修订版和原来的版本。ksplice-create 的输出是一个拼接,可以用 ksplice-apply 命令应用它。可以用 ksplice-remove 从内核中删除拼接。

下面的示例(摘自作者的学术论文,已得到使用授权)使用补丁文件 prctl 和内核源代码目录 ~/src 为 "prctl vulnerability" CVE-2006-2451 创建更新:

$ ksplice-create --patch=prctl ~/src
Ksplice update tarball written to ksplice-8c4o6u.tar.gz
$ sudo ksplice-apply ./ksplice-8c4o6u.tar.gz
Done!

前一个命令生成 tarball 文件 ksplice-8c4o6u.tar.gz,其中包含要应用于内核的补丁对象代码。第二个命令读取这个 tarball、计算所需的更改并应用拼接。


保障系统全天候不间断运行

Ksplice 是一项已经验证的技术。作者的文章和技术研究指出,Ksplice 能够动态地对 Linux® 内核应用从 2006 年到 2008 年发布的所有安全和功能性补丁。其中超过三分之二的补丁不需要为更新内核编写特殊代码。对于其他补丁,平均每个补丁只需编写 17 行代码。

作者选用 Linux 来证明 Ksplice 是有效的。在 Linux 源代码中经常会发现很多缺陷,常常迅速地发布补丁以解决缺陷。但是,对于有源代码可用的任何内核,都可以方便地使用 Ksplice,包括 BSD 和 Sun Solaris。Ksplice 也支持 x86、x86_64 和 ARM 处理器。

参考资料

学习

  • 对话 UNIX:阅读本系列其他文章。
  • Ksplice:通过 Ksplice 的站点了解此工具的更多信息。
  • Ksplice 技术文件:通过阅读技术文件进一步了解 Ksplice 的工作方式。
  • kernel.org:查找 Linux 内核的相关信息和内核源代码存档。
  • Common Vulnerabilities and Exposures:可以从 CVE 站点获得全面的计算机漏洞列表。这个数据库中的每个条目包含对安全漏洞的简要说明和相关的参考资料。
  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
  • AIX and UNIX 下载中心:在这里你可以下载到可以运行在 AIX 或者是 UNIX 系统上的 IBM 服务器软件以及工具,让您可以提前免费试用他们的强大功能。
  • IBM Systems Magazine for AIX 中文版:本杂志的内容更加关注于趋势和企业级架构应用方面的内容,同时对于新兴的技术、产品、应用方式等也有很深入的探讨。IBM Systems Magazine 的内容都是由十分资深的业内人士撰写的,包括 IBM 的合作伙伴、IBM 的主机工程师以及高级管理人员。所以,从这些内容中,您可以了解到更高层次的应用理念,让您在选择和应用 IBM 系统时有一个更好的认识。
  • 技术书店:阅读关于这些和其他技术主题的图书。

获得产品和技术

  • Ksplice Uptrack:下载适合您系统的 Uptrack 软件。
  • Github:Github 包含数千个 Git 存储库,包括许多专家用户的个人 dot 文件。请通过搜索 "dot files" 寻找示例。(可以在网上和通过 Github Guides 进一步了解 Git。)

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX, Linux
ArticleID=576880
ArticleTitle=对话 UNIX:了解 Ksplice
publish-date=11082010