2.4 嵌入式Linux发行版
到底什么是Linux发行版? Linux内核完成系统引导后,它会找到并挂载一个根文件系统。一旦合适的根文件系统被成功挂载,启动脚本会启动很多系统需要的程序和实用工具。这些程序一般会调用其他程序来完成具体的任务,例如生成一个登录shell、初始化网络设备接口和运行用户的应用程序。每一个程序都有一些必须由系统中其他成员来满足的具体需求(一般称为依赖关系)。大多数的Linux应用程序都依赖一个或多个系统程序库。还有一些程序需要配置文件和日志文件,诸如此类。总的来说,即使一个小型的嵌入式Linux系统也需要很多文件,这些文件分布在根文件系统的合适的目录中。
完整的桌面Linux系统的根文件系统中包含数千个文件。这些文件来自软件包(package),而软件包通常按照功能来组合文件。软件包由一个包管理器负责安装和管理。红帽公司(Red Hat)的rpm就是一个流行的包管理器,它广泛用于Linux系统中安装、删除和更新软件包。如果你的工作站采用了红帽公司的Linux操作系统,包括Fedora系列,你可以使用命令rpm –qa来列出系统中已安装的所有软件包。如果你使用的是基于Debian的发行版,例如Ubuntu,使用命令dpkg –l即可获得同样的效果。
一个软件包可以包含很多文件,事实上,有的软件包中包含了数百个文件。一个完整的Linux发行版会包含几百个甚至几千个软件包。下面列出一些嵌入式Linux发行版中可能存在的软件包,并说明它们的功能。
- initscripts包含了基本的系统启动和关闭脚本。
- apache实现了流行的Apache web服务器。
- telnet-server包含了实现远程登录服务器(telnet server)功能的必要文件,允许你远程登录到嵌入式目标上。
- glibc实现了标准C程序库。
- busybox包含了很多命令行工具的精简版本,这些工具都是UNIX/Linux系统中的常用工具。
这就是Linux发行版的作用。一个典型的Linux发行版包含好几张光盘的内容,其中装满了有用的应用程序、程序库、实用工具和文档等。当Linux发行版安装好之后,用户就可以使用功能完备的系统了,这个系统基于一组默认的配置合理的选项,这些选项也可以根据具体需要进行调整。你可能熟悉某个流行的桌面Linux发行版,比如Red Hat或Ubuntu。
针对嵌入式目标的Linux发行版与一般的桌面发行版之间有很多不同之处。首先,嵌入式发行版中的二进制可执行程序是不能在PC上运行的,它们是针对嵌入式系统所使用的硬件架构和处理器而开发的。(当然,如果你的嵌入式系统使用和PC一样的x86架构,情况可能会有所不同。)桌面Linux发行版通常包含很多面向普通桌面用户的图形用户界面(GUI)工具,例如花哨的图形时钟、计算器、个人时间管理工具和电子邮件客户端等。嵌入式Linux发行版往往会省略这类应用程序,而是更多地提供面向开发者的专用工具,如内存分析工具和远程调试工具等。
另外,嵌入式发行版中一般会包含交叉开发工具,而不是本地开发工具。例如gcc工具链,它运行于采用x86架构的桌面PC,但是会生成可以运行于目标系统的二进制代码,而这个目标系统的架构一般不是x86。这个工具链中的很多其他工具也都是按照类似的方式进行配置的:它们运行于开发主机(通常是一台x86架构的PC),但生成针对其他架构(例如ARM或Power)的目标文件。
2.4.1 商业Linux发行版
有好几个厂商提供商业嵌入式Linux发行版。嵌入式Linux的领导厂商已经在此行业经营多年了。获得关于这些厂商的信息还是相对容易些的。在互联网上快速搜索 “嵌入式Linux发行版”(embedded Linux distributions),就会获得不少这方面的信息。
2.4.2 打造自己的Linux发行版
你可以自己组装嵌入式项目所需的所有元件。但要知道这样做的风险,以及是否值得为此付出。如果你纯粹出于兴趣而专注于嵌入式Linux,比如参与一个兴趣小组或大学里的项目,自己做是个不错的选择。然而,如果是做项目你就需要斟酌了,将项目所需的所有工具和实用程序组装在一起,并保证它们之间能够兼容是需要花费大量时间的。
新手需要一个工具链。gcc和binutils都可以从www.fsf.org及遍布世界的镜像网站获得。在一个项目中,这两个工具都是编译内核和用户空间应用程序所必需的。这些工具主要是以源码的方式发布的,所以你必须自行编译,以适合特定的交叉开发环境。在获得这些实用程序的最新 “稳定版”源码后,你通常还需要对这些源码打补丁,特别是当这些程序用于非x86/IA32架构的系统时。这些补丁程序一般都和基本的软件包存放在同一位置。你所面对的挑战就是找到那些合适的补丁程序,以满足特定问题或架构的需要。
准备好工具链以后,你还需要下载和编译很多应用程序软件包,以及它们所依赖的软件包。这是一个不小的挑战,因为很多软件包即使发展到今天也不便于交叉编译。很多软件包都是在x86环境下开发的,如果转换到其他环境下,仍然会出现编译等类似问题。
挑战并未到此结束,你也许想搭建一个全能的开发环境,包含很多工具,比如图形化调试器、内存分析工具、系统跟踪和性能分析工具等。从这里的讨论你可以看到,搭建你自己的嵌入式Linux发行版是一项相当艰巨的任务。