UNIX® 系统往往要长时间运行。桌面或便携系统可能连续运行几周甚至几个月,而服务器可能连续运行一年甚至更长时间。实际上,如果可以排除硬件故障和自然 力,UNIX 有可能永远运行下去。但是,硬件不是完美的,自然力无法控制,软件会受到 bug 的影响。有时候,需要更换硬件组件,雷雨等自然现象可能影响系统,系统需要应用补丁并重新启动。与死亡和税收一样,停机是不可能完全避免的。
但是,与死亡和税收不同,我们可以尽可能减少 停机时间。正如可靠的数据中心会配备备用电源和冗余的 Internet 连接,预防性的定期系统维护和热备用可以大大提高可用性。另外,可以使用 rpm、Aptitude 和 yum 等工具根据需要对大多数应用程序和库进行无缝更新。 但是,内核更新(为了解决核心系统软件中的漏洞和缺陷所做的更改)没这么方便。内核更新影响很大,需要安排停机时间,在停机期间会临时终止受影响的每个系统上的所有服务。尽管这些维护是必要的,而且很重要,但是内核更新会导致操作时断时续。图 1 中的时间线说明从 2009 年 1 月到 2010 年 2 月许多流行的操作系统的重要内核更新频率。每个圆圈图标表示必须重新启动(使用此图已经得到 Ksplice 公司许可)。
图 1. 操作系统的内核更新频率
但是现在,您可以在内核运行时应用补丁,这样就避免了重新启动导致的大规模服务中断。换句话说,不再需要专门安排更新时间。
Ksplice 是一套在原地 (即在运行时)对内核应用补丁的工具,它不需要重新引导。提供现有的内核、它的源代码和一个或多个统一差异文件(统一差异文件是内核补丁的规范形 式),Ksplice 就会把内核中现有的错误对象代码替换为新的对象代码。Ksplice 可以替换程序代码和数据结构。更棒的是,内核拼接 只会中断正常系统操作不到一毫秒,守护进程、进程和连接都保持不变。
我们先简要讨论一下 Ksplice 的工作方式,然后学习如何使用它的工具更新内核。使用
Ksplice 有三种方式:
图形用户界面 (GUI)
等效的高级命令行实用程序
原始 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 及其依赖项 $
$ 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
wget
http://www.ksplice.com/uptrack/dist/karmic/ksplice-uptrack.deb
进度条(见 图 3)显示安装的每个补丁。即使补丁非常多,对内核应用补丁也只需要很短时间,而且不需要重新引导。
图 3. 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 --all,uptrack-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 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_ 和 ARM 处理器。
to
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务