使用 kexec 快速重启 Linux

即使您的工作不要求您每天多次重新启动您的 Linux 机器,等待系统启动也实在是一件枯燥的事情。因而有了 kexec。本质上讲,kexec 是一个让您可以重新启动到一个新 Linux 内核的快速重新引导功能部件 -- 不必通过引导装载程序。更快速的重新启动即使对于正常运行时间并不是至关重要时也是有益的 -- 对那些每天都要多次重新启动机器的内核和系统软件开发者来说更可谓是救生者。kexec 当前只能用在 x86 32 位平台上。


随着计算机系统变得更快更好,系统重新启动时间也需要跟上发展。实际上,随着系统的处理器速度、存储容量和资源性能变得更加先进和复杂,重新启动的时间竟变长了。虽然更长的重新启动时间对每个人来说只是一种刺激,但它对生产系统的影响是至关重要的,因为更长的重新启动时间意味着正常运行时间的减少。除了影响系统对其用户的可用性之外,更长的重新启动时间对内核和系统软件开发者来说是一个主要的瓶颈,因为他们每天都要多次重新启动他们的机器。


当系统有很多松散分布的 SCSI 总线或者 ECC 校验的物理内存时,重新启动时间特别长。测试结果显示,重新启动过程中大部分时间消耗在固件(firmware)阶段,在此阶段,连接到系统的设备被识别出来并被初始化(要深入了解,请查看本文的 参考资料部分)。自然,大部分试图减少重新启动时间的努力都瞄准重新启动过程的这个阶段。其中一项努力带来了 kexec 的发展,kexec 是一个可用于 x86 平台上 Linux 内核的功能部件。使用 kexec,您可以直接重新启动到另一个内核,不再必须通过固件和引导装载程序阶段。跳过序列中最长的部分大大减少了重新启动时间。


要理解 kexec,需要先具备 Linux 中引导过程的知识。Linux 中的引导过程有两个阶段:引导装载程序阶段和内核阶段。


引导装载程序阶段主要包括硬件阶段、固件阶段、第一级引导装载程序和第二级引导装载程序。引导过程从硬件加电启动开始。一些初始化工作完成后,控制转到固件。固件在一些体系结构中也称为“BIOS”,它去检测系统上的各种设备,包括内存控制器、存储设备、总线桥和其他硬件。固件基于设置将控制移交给一个最小化的引导装载程序,即大家所知的主引导记录(master boot record),这个主引导记录可能在磁盘驱动器上,或者在可移动媒体上,或者在网络上。将控制移交给操作系统的实际工作由第二阶段引导装载程序(通常被简单地认为是“引导装载器(boot loader)” )执行。这个引导装载程序让用户可以选择要装载的内核,将内核和相关参数装载到内存,初始化内核,设置需要的环境变量,并最终“运行”内核。


引导的下一个阶段是 内核阶段,此时内核已经获得控制权。它设置需要的数据结构,检测当前在系统上的设备,装载需要的设备驱动程序,并初始化设备。引导过程的最后阶段包括用户级初始化。在这个阶段,内核检查文件系统的完整性,挂载文件系统,设置交换分区(或者交换文件),启动系统服务,设置系统终端,并完成所有其他设置。
在系统重新启动时,引导装载阶段之前要先关闭先前正在运行的系统。这涉及到停止运行的进程,将高速缓冲存储器内容写回到磁盘,?载文件系统,然后执行硬件的重启。在本文的 参考资料部分,您可以找到对 Linux 中引导过程以及常见的引导相关概念的极好的描述。

kexec 是 Linux 内核的一个补丁,让您可以从当前正在运行的内核直接引导到一个新内核。在上面描述的引导序列中,kexec 跳过了整个引导装载程序阶段(第一部分)并直接跳转到我们希望引导到的内核。不再有硬件的重启,不再有固件操作,不再涉及引导装载程序。完全避开了引导序列中最弱的一环 -- 固件。这一功能部件带来的最大益处在于,系统现在可以极其快速地重新启动。对企业级系统而言,kexec 大大减少了重新启动引起的系统宕机时间。对内核和系统软件开发者而言,kexec 帮助您在开发和测试成果时可以迅速重新启动系统,而不必每次都要再经历耗时的固件阶段。


kexec 补丁是 Eric Biederman 的作品,这个项目仍处在积极的开发之中(查看 参考资料部分以深入了解此项目以及如何对它做出贡献)。

显然,由于这个功能部件涉及到操作系统如此多的敏感部分,需要特别细心以使其始终正确工作。对 kexec 来说,最大的挑战在于,在 Linux 中,要重新引导到的新内核需要位于内存中与当前正在运行的内核相同的位置。仍然在当前内核的上下文中运行时,用新内核去替换内存中现有的内核,这是件困难的工作。另一个大问题是,系统中设备的状态。固件总


阅读更多
个人分类: Linux内核开发
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭