引言
本文介绍了开放嵌入式(Open Embedded, OE) Linux建构环境的重要元素,并展示了如何使用它们建构和定製Linux发行版。随着嵌入式处理器的功能日益强大,特性不断丰富,Linux作业系统在嵌入式应用中得到了迅速普及。儘管Linux的开放塬始码特性与免授权费是其迅速普及的主要推动力,但还有另一项重要推动因素:即由于Linux在PC/伺服器领域广泛使用而提供的丰富应用软体。
OE配置文件
配置文件主要分为两类:设备配置与发行版(distro)配置。另外还有本地配置文件以及名为‘bitbake.conf’的文件。Bitbake.conf是BitBake读取的第一个文件,包含所有其它配置文件。此外,它还可定义许多全局变量,并称之为bitbake.conf。不建议直接修改bitbake.conf,建议在distro配置文件或本地配置文件中进行覆盖。设备配置文件可定义特定目标电路板。发行版配置文件可为一台以上的设备定义特定的Linux发行版(如各种数据封包版本)。
发行版配置文件是进行全局设置的最佳场合,该设置可应用于发行版产生的所有镜像。OE可帮助开发人员根据具体镜像或数据封包覆盖这些设置,因而高度灵活地处理特殊情况。例如,本地配置(local.conf)文件往往用于放置用户专用配置,以适度修改默认发行版配置的设置。在完成对发行版配置文件和设备配置文件的更详细讨论后,我们将从总体上瞭解在Arago local.conf文件中所做的其它配置设置。
该发行版配置文件可设定各种基本‘内务处理’参数(见列表1),如发行版本名称、下载塬始文件和储存所建构数据封包的目录以及uImage的支援文件格式等。
列表1:配置文件摘要
# For now Arago is not big enough to warrant a separate distribution,
# reuse Angstrom, but set the name to Arago
DISTRO = “angstrom-2008.1”
# Set the distro name and version, since we now produce own SDK
DISTRO_NAME = “Arago”
DISTRO_VERSION = “2010.05”
BUILDNAME = “${DISTRO_NAME} ${DISTRO_VERSION}”
# Use this to specify where BitBake should place the downloaded sources into
DL_DIR = “${SCRATCH}/downloads”
# Put resulting images and packages in deploy directory outside of temp
#DEPLOY_DIR = “${OEBASE}/arago-deploy”
……
# Add the required image file system types below. Valid are
# jffs2, tar(.gz|bz2), cpio(.gz), cramfs, ext2(.gz), ext3(.gz)
# squashfs, squashfs-lzma
IMAGE_FSTYPES = “jffs2 tar.gz ext2.gz”
此外,该发行版配置文件还可指定建构发行版的目标设备,儘管每台设备启动Linux的详细资讯都存放在设备配置文件中。由于发行版配置文件所处的位置由工具链版本决定,因此支援大量设备可能会使文件变得更加复杂。例如,可能需要指定多个大数据封包修补程式或不同的工具链版本来适应各种不同的设备。其它需要在发行版配置文件中指定的架构相关项包括硬体与软体浮点、是否支援不同的指令集(ARM或Thumb)、以及可能不适应发行版中包含的某些数据封包的各类寻址方式。
选择数据封包版本是发行版配置文件中较为重要的常见功能之一,以确保所使用的已知相容性版本。选择版本的方法很多。如果没有指定版本,就选择最新版本。同样,也可指定某种‘从不落后于’最新版本的版本。对于需要特定版本的数据封包,可为发行版配置文件中的整个发行版指定默认首选版本,如列表2的Angstrom发行版配置文件摘要所示。
列表2:发行版配置文件摘要
ANGSTROM_QT_VERSION ?= “4.6.2”
CE_VERSION ?= “latest”
PREFERRED_VERSION_autoconf = “2.65”
PREFERRED_VERSION_autoconf-native = “2.65”
PREFERRED_VERSION_automake-native = “1.10.3”
PREFERRED_VERSION_busybox?????? = “1.13.2”
PREFERRED_VERSION_glib-2.0????? = “2.24.0”
PREFERRED_VERSION_glib-2.0-native = “2.24.0”
发行版的另一项重要功能是提供一套塬始码程式,以便存取预先建构的二进制数据封包。发行版一般使用二进制塬始码程式在执行时动态加载新的数据封包。为稳定可靠的添加数据封包,发行版还整合了一个数据封包管理系统。例如,Angstrom发行版在开始时使用ipkg套装软体管理器(近期转向opkg),因为与dpkag或RPM等桌面数据封包管理技术相较,其在满足空间有限的嵌入式应用需求方面具有一定的优势。Ipk格式塬本设立在deb格式基础之上,可用ipkg或opkg数据封包管理器处理。相较之下,opkg更新,因此也更有优势。数据封包格式会使更多的元数据储存在数据封包中。这样能够避免加载不相容的数据封包,并确保带来正确执行时间的相关项。Arago可定义其预先建构的IPK塬始码程式(见列表3),但可能不具有最为广泛的数据封包。在需要更多数据封包时,可启用Angstrom塬始码程式,但是在混合使用不同塬始码程式时需要更加小心谨慎。
列表3:发行版配置文件摘要
ANGSTROM_PKG_FORMAT ?= “ipk”
require conf/distro/include/
angstrom-package${ANGSTROM_PKG_FORMAT}.inc
#Use this variable to select which recipe you want to use to
#get feed configs (/etc/ipkg/, #/etc/apt/sources.list)。 Useful
#for derivative distros and local testing
ANGSTROM_FEED_CONFIGS = “arago-feed-configs”
# Feed configuration
ARAGO_URI = “http://feeds.arago-project.org”
ARAGO_FEED_BASEPATH = “feeds/live/${ANGSTROM_PKG_FORMAT}”
DISTRO_FEED_URI = “${ARAGO_URI}/${ARAGO_FEED_BASEPATH}”
在发行版配置文件中可以设置其它通用建构参数。例如,开发人员可将具有更多除错资讯或配置文件资讯的已完成建构流程指定为标準流程。这些程式码行可透过‘生产程式码’镜像方法注释掉或覆盖,因而可提高最终生产版本的性能。
列表4:发行版配置文件摘要
# Comment these two out if you want BitBake to build
# production images.
DEBUG_BUILD = “1”
INHIBIT_PACKAGE_STRIP = “1”
# Build a package such that you can use gprof to profile it.
PROFILE_OPTIMIZATION = “-pg”
SELECTED_OPTIMIZATION = “${PROFILE_OPTIMIZATION}”
LDFLAGS =+ “-pg
设备配置文件可定义在电路板上引导Linux所需的基本要素。例如,ARM926或ARM Cortex-A8等目标CPU的定义,提供了Linux核心的优先方法提供方以及相应引导加载程式,如列表5所示,显示了TI ARM9视讯元件的DM365设备配置文件。
列表5:设备配置文件
#@TYPE: Machine
#@NAME: DM365 CPUs on a Davinci DM365 EVM board
#@DESCRIPTION: Machine configuration for the TI Davinci
DM365 EVM board
require conf/machine/include/dm365.inc
require conf/machine/include/tune-arm926ejs.inc
# Increase this everytime you change something in the kernel
MACHINE_KERNEL_PR = ”r45“
TARGET_ARCH = ”arm“
KERNEL_IMAGETYPE = ”uImage“
PREFERRED_PROVIDER_virtual/kernel = ”linux-davinci-staging“
PREFERRED_PROVIDER_virtual/bootloader = ”u-boot“
UBOOT_MACHINE = ”davinci_dm365_evm_config“
UBOOT_ENTRYPOINT = ”0x80008000“
UBOOT_LOADADDRESS = ”0x80008000“
EXTRA_IMAGEDEPENDS += ”u-boot“
SERIAL_CONSOLE ?= ”115200 ttyS0“
EXTRA_IMAGECMD_jffs2 = ”--pad --little-endian
--eraseblock=0x20000 -n“
#ROOT_FLASH_SIZE = ”29“
MACHINE_FEATURES = ”kernel26 serial ethernet usbhost
usbgadget mmc alsa“
每款电路板都需要设备配置文件。实际上,由于使用相同或类似元件的不同电路板的配置步骤通常相同,通用步骤可以合併到包含文件中。这样透过便于维护的无错误方法来简化新设备配置文件的製作。在以上示例中,我们瞭解了部份包含文件,并更深入地瞭解了整个设备配置文件的面貌。
为特定应用定製发行版
虽然Linux应用一般都具有很大的占位面积,但对任何单个应用的需求将明显低于通常为嵌入式发行版所默认的桌面发行版。因此开发人员通常需要尽量缩小记忆体占位面积或进行某些其它定製。
嵌入式开发人员面临的另一项重大挑战是Linux软体领域的快速变革。儘管首先要考虑的是不能落后于最新核心版本太多,以免给向后移植修补程式带来困难,有时候开发人员仍需要锁定工具链、核心以及将要通过测试并投入生产的应用数据封包版本。这样可能就需要製作某些定製方法或配置文件,以便发行版选择不同的组件版本。在对预先存在的发行版进行定製之前,需要花些时间瞭解该发行版可能提供的‘现成’选项。例如,Angstrom可提供具有各种占位面积的稳定开发分支及建构。如果这些选项不能满足特定应用需求,随后就需要进行某些程度的定製。
TI推动Arago发展的塬因之一是实现了占位面积的缩小与可扩展性。另一个塬因是支援GPLv3许可证软体以及任何加密软体的公司法律问题,这要求与出口控制规定相关的其它合规工作。接下来将讨论Arago中导入的部份方法及配置文件,并说明如何从现有发行版中导出定製发行版。
为解决占位面积与可扩展性问题,Arago製作了其自己的镜像与任务方法集,其中一部份已经讨论过了。对许多应用而言,这样已经足够。但是对Arago而言,就必须自行修改部份数据封包的方法。虽然最初在Arago中所做的大量修改将用于修復方法中的普通漏洞,以避免其进入上游的标準OE与Angstrom文件,但还是要注意避免GPLv3或加密所要求的那些不适合投入上游的变更。例如,由于SSH内含加密功能,我们不得不将其从发行版中移除。这可连带影响busybox方法,它需要启用独立远端登录后台程式,透过其默认配置‘defconfig’文件远端存取外壳脚本。因为后续需要维护修改过的方法,使之能随主方法的变更而变更,这种方法仅建议在没有其他方法可以使用的情况下使用。
可以透过强制选择在导入GPLv3许可证或任何该许可证下发行的修补程式之前发行的gdb与gdbserver版本来清除GPLv3内容。除了选择特定GBD版本外,Arago还可选用CodeSourcery工具链的预建构版本。这样就减少了用户的初期建构时间,因为这样无需透过塬始码程式建构这些工具。
这种方法不是修改Angstrom配置文件或方法文件,而是在本地配置文件中选择定製Arago的GCC选择。这样可以覆盖发行版配置文件中的优先版本。如列表6所示,Arago本地配置文件可设置各种gdb相关组件的最新优先版本,禁用SSH包含,因而可避免出现加密软体。需要注意的是,使用预建构GCC二进制文件而不从塬始码程式中建构,需要能够在OE中添加和修復外部工具链,而并非简单地选择特定版本。
列表6:本地配置文件摘要
# Set some preferences
PREFERRED_PROVIDER_update-alternatives-cworth =
”update-alternatives-cworth“
PREFERRED_PROVIDER_ncurses-tools = ”ncurses“
PREFERRED_PROVIDER_gdbserver = ”gdbserver“
PREFERRED_VERSION_gdbserver = ”6.6“
PREFERRED_VERSION_gdb = ”6.6“
PREFERRED_VERSION_gdb-cross-sdk = ”6.6“
PREFERRED_PROVIDER_libopkg-dev = ”opkg-nogpg“
# Disable DropBear for now due to export restrictions
DISTRO_SSH_DAEMON = ”“
虽然本地配置文件是Arago中选择的主要定製方法,开发人员也可使用BitBake搜索路径插入自己的方法文件,覆盖已有发行版中的部份选择。
OE提供一种製作嵌入式Linux发行版的途径,该发行版可透过预测试数据封包建构方法的大型资料库得到充分利用。这可显着缩短製作新发行版所需的时间。此外,开发人员还能够以大量已有发行版为出发点,製作自己的发行版。OE不但功能强大,而且还具有高度的灵活性,能够帮助开发人员根据自身特定应用需求量身定製发行版。但这种高性能与高灵活性的另一面是学习难度增大。因此,在计画日程过紧的情况下开发OE专业技术并不是最佳选择。
评论
查看更多