kboot
kboot本质上是个小型Linux操作系统,但功能却是个boot loader,何解?kboot本身提供简单的系统工具,支持档案与网络操作,可自外界取得kernel image或其它档案,进而kboot利用了kexec的机制,让Linux kernel可快速重新启动,于是具备boot loader的功能。
kexec是一组新的系统呼叫,包含在2.6 kernel中 (视支持架构而定),搭配其user-space的工具kexec-tools,则可在既有的Linux kernel (支持kexec系统呼叫) 中加载其它的kernel (不需要有kexec支持),并给予必要之参数或档案,如kernel command line与initrd等。
目前,kexec的硬件支持不限定x86,包含ARM与PPC都已有patch现身。那么,如此的机制到底有什么价值呢?以往的boot程序是很单纯,清一色就是boot loader加载kernel,然后跳到user-mode或者是特定的工作,但现在的系统设计往往不是单一硬件、单一架构就可胜任的,诸如RAID或高负载的备援系统设计,都需要相当繁复的规划,很显然就非普通的boot loader可以应付,也很难修改Etherboot去圆满符合需求,这时候,我们联想到Linux,搭配到上述的kexec,不就是最美妙的boot loader吗?在加载新的kernel之前,我们可作任何Linux能做的事情,像是加载firmware并进行设定、挂载NFS、挂载NTFS (透过Linux-NTFS)、... 等等,只要能提供新kernel给kexec-tools工具作加载,最后再透过kexec系统呼叫,就可完成这个「功能强大的boot loader」的终极任务。
kboot就是这样的概念验证实做品,使用的情境相当多元。举例来说,kboot想进行远程开机 (Diskless),但只有Wireless LAN或3G network可用,这时候就挂载对应的kernel module (包附在kboot中),然后透过user-space的应用程序进行设定,等待联机建立并确保档案撷取成功,接着就在装置上执行自远程取得核心。另一种情境也很有趣,以往Linux distribution都得作通用性与最佳化的妥协,前者往往得将系统划分诸多核心模块与大量的设定程序,后者往往得针对硬件作多次尝试,那么,透过kboot可先启动generic kernel,然后进行硬件侦测,参考所需的硬件与最佳化组态,重新编译核心,最后将该核心加载,而这个过程可透过一些设计得当的效能评估工具,一次又一次的重复自动微调,有别于以往的boot loader。
后者给予我们极大的想象空间,当我们在新的硬件进行核心与外围移植时,的确可先把能运作的最低限度核心置入kboot,然后再从不同的开发分支取得新核心并启动,而这些过程都是透明的,而且不需要烧录到传统储存装置中,只要资源允许,可在RAM中做到繁琐的事情。