1.3 定制Linux发行版——为什么困难
我们来面对它——构建和维护操作系统不是简单的任务。需要考虑操作系统的很多不同方面以创建完全功能性的计算机系统。
❑ 引导加载程序(Bootloader):引导加载程序是第一个软件,它负责初始化硬件、加载操作系统内核到内存中然后启动内核。引导加载程序通常是多级的,其第一级存储在非易失性内存中。第一级然后从挂载的存储(如闪存、硬盘)中加载第二级。以此类推。
❑ 内核:内核,如其名所示,是操作系统的核心。它管理系统的硬件资源,并且通过它的应用程序编程接口向其他软件提供硬件的抽象。内核的主要功能是内存管理、设备管理和响应来自应用软件的系统调用。这些功能如何实现依赖于处理器架构和外围设备以及其他硬件配置。
❑ 设备驱动:设备驱动是内核的一部分。它们通过内核系统调用以结构化的形式向应用软件提供对硬件设备的访问。通过设备驱动,应用软件可以配置硬件、从硬件读取数据或者向硬件写入数据。
❑ 生命周期管理(Life Cycle Management):从通电到关机,计算机系统呈现多个状态,在这些状态中,它向应用软件提供不同集合的服务。生命周期管理决定什么服务运行在什么状态以及它们需要以什么顺序启动从而维持一致性的操作环境。生命周期管理的一个重要内容也是电源管理,当不需要全部功能时把系统设置成节能模式,而当被请求时又能恢复完全操作模式。
❑ 应用软件管理:应用软件和库组成了在典型系统上安装的软件的大部分,为最终用户提供功能。对一个完整的可操作系统来说,它通常需要数百到数千个软件包。
Linux和大量的开源软件包都如同构造工具包的组成部分。不幸的是,它更像一个谜而不是乐高。搞清楚不同包之间的依赖、不兼容性和冲突是一个艰巨的任务。一些包甚至提供相同或者相似的功能。选择哪一个?最终,你将必须绘制自己的蓝图从而为嵌入式项目构建Linux发行版。原则上,你有两种方法。
❑ 自顶向下:关于这种方法,你一开始在众多可用的Linux发行版中选择一个,并根据需求,通过增加或移除软件包来定制它。多年前本书作者选择了这种方法(通过运行在x86服务器硬件上的高速图像处理系统)。这是一种可行的方法,并具有吸引力,因为使用经过测试和维护的发行版减轻了一些更繁琐的构建和维护自己发行版的任务。而且你可能会为此获得支持。然而,它可能会限制你对硬件的选择,因为大部分现成的Linux发行版是为x86硬件所构建的。而且,选择正确的发行版来开始以及为了目标设备而裁剪它也不是简单的事情。
❑ 自底向上:自底向上的方法需要从源代码构建你自己定制的Linux发行版,先从引导加载程序和内核开始,然后为目标设备增加软件包来支持应用程序。这种方法可以给你最大的控制权(一般来说你可以学习到很多关于Linux和操作系统的内容),但是它也是具有挑战性的任务。你将不得不在一路上做出许多选择,从选择合适的工具链到设置内核配置选项,再到选择合适的软件包。其中一些选择是互相依赖的,例如工具链和目标库的选择,并且错误的选择会使你很快进入死胡同。在成功地构建和部署了发行版以后,你将面临维护它的重担——为内核和发行版中已经集成的所有其他软件包寻找补丁和安全更新。
这就是Yocto项目的优势所在。通过提供给你完整的工具集和蓝图来帮助你从零开始创建你自己的Linux发行版(以从上游项目来的源代码下载开始),它集合了两种方法的优点。随Yocto项目工具而带的、针对各种系统的蓝图使你可以在几个小时内构建完整的操作系统栈。你可以从下面这些蓝图中选择:针对带有命令行登录的基本系统而构建目标系统镜像的蓝图、针对移动设备而构建带有图像界面的系统的蓝图、构建Linux标准基础兼容的系统的蓝图以及更多蓝图。
你可以使用这些蓝图作为你自己的发行版的起点并且通过增加或删除软件包来修改它们。本书的剩余章节将带你走完使用Yocto项目工具来构建和定制Linux发行版以及创建你自己的蓝图的整个流程,每次在你构建系统的时候,这都会给你可重复的结果。