在 Beagleboard C4 上运行 Mono(使用 Yocto)。





5.00/5 (2投票s)
演示如何使用 Yocto Project 在 Beagleboard C4 开发板上运行一个包含 Mono 的定制 Linux 操作系统。
引言
本文是一篇教程,介绍如何在一个 Beagleboard (C4 版本) 开发板上运行一个定制的 Linux 基线和 Mono (一个跨平台的 .NET 运行时环境)。这是更长文章的一部分,该文章解释了如何使用 Yocto Project 为多种硬件配置建立定制的 Linux 基线。本教程的最终目标是使我们的 Beagleboard 开发板能够运行 C# 应用程序和库。这些应用程序和库可以使用高级集成开发环境 (IDE) 进行开发,例如 Visual Studio、SharpDevelop 或 Xamarin Studio。这使得对嵌入式环境经验有限的软件开发者能够为嵌入式物联网 (IoT) 设备编写软件。
安装
本文不包含 Beagleboard 的基本设置 (电源连接、跳线设置、串行输出等),因为我们假设希望使用本教程的开发板所有者已经从随附的快速入门指南或参考手册中对这些连接有了基本了解。本文的重点是使用 Yocto 为开发板构建所需的定制环境。
本教程使用以下软件和硬件组件:
- 您选择的Linux开发系统(教程使用Mint Linux 17 64位)
- Poky构建系统 v1.6.2 (Daisy)
- meta-ti 元数据层 (Daisy 分支)
- meta-mono元数据层 (Daisy分支)
- Beagleboard 开发板 (C4 版本)
我们将使用的主要 Yocto Project 工具是 Poky 构建系统。为了使用这个工具,我们需要一个 Linux 开发环境。大多数主流 Linux 发行版都受支持。我使用了 Mint 17 64 位版本。Yocto Project 网站还有一个“Build Appliance”,其中包含一个预先配置好的 Linux 系统 VMWare 虚拟机镜像,可以直接使用。如果要在自己的 Linux 环境中使用 Poky,请确保安装所需的依赖项 (有关更多信息,请参阅 Yocto Project 网站上的快速入门或参考手册 www.yoctoproject.org)。我需要安装的包如下:g++, texinfo, libsdl1.2-dev, texi2html, cvs, subversion, bison, flex, 以及 mono-complete (用于构建 mono)。
我还建议您阅读 Yocto Project 网站上的部分快速入门文档。本文将概述为 Beagleboard 创建引导镜像和文件的步骤,但要更深入地了解 Yocto 的功能和特性,请参阅 Yocto 的在线文档。
使用代码
在Linux开发系统端应在终端运行的命令以 $ 提示符显示
$
在开发板上应运行的命令以 # 提示符显示
#
文件修改将使用“...”表示所引用部分之前和之后的文件文本。这将允许我们显示文件中需要更改的部分,而无需显示整个文件内容。
...
Text in the file
...
教程
为 Beagleboard Poky 构建环境创建一个文件夹
$ mkdir ~/beagleboard
将git Yocto项目核心克隆到poky工作目录中
$ git clone -b daisy git://git.yoctoproject.org/poky.git ~/beagleboard
现在我们需要引入与我们的处理器或开发板相关的板级支持包。meta-ti 板级支持包将可用。此元数据层位于 Yocto 项目网站上。如果您在 Yocto 网站上找不到目标开发板的 BSP,可以尝试搜索“yocto <board or processor> bsp”,您可能会找到一个社区维护的版本。
将 meta-ti 板级支持包克隆到 Poky 工作目录中。注意:在引入板级支持包时,请务必阅读该包关联的 README 文件或在线的仓库“关于”部分。有时它们会包含必须采取的额外步骤才能使用 BSP。
$ git clone -b daisy git://git.yoctoproject.org/meta-ti ~/beagleboard/meta-ti
将meta-mono元数据层克隆到poky工作目录中
$ git clone -b daisy git://git.yoctoproject.org/meta-mono ~/beagleboard/meta-mono
来源构建环境脚本以创建配置文件
$ cd ~/beagleboard
$ source oe-init-build-env
将 meta-ti 板级支持包层和 mono 元数据层添加到构建环境中。通过打开 ~/beagleboard/build/conf/bblayers.conf 文件,并在 meta-yocto-bsp 之后将这些层添加到 BBLAYERS 变量中来实现。完成后,文件应类似如下:
...
/home/<username>/beagleboard/meta-yocto-bsp \
/home/<username>/beagleboard/meta-ti \
/home/<username>/beagleboard/meta-mono \
"
...
现在将 MACHINE 变量更改为 beagleboard。这会告诉构建环境在构建 Linux 环境时要针对哪个开发板。为此,请编辑 ~/beagleboard/build/conf/local.conf 文件。向下滚动文件,直到找到以下部分:
...
#MACHINE ?= "edgerouter"
#
# This sets the default machine to be qemux86 if no other machine is selected:
MACHINE ??= "qemux86"
...
将 beagleboard 参考添加到 MACHINE 变量中,放在默认值之上,这样文件将读取:
...
#MACHINE ?= "edgerouter"
MACHINE ?= "beagleboard"
#
# This sets the default machine to be qemux86 if no other machine is selected:
MACHINE ??= "qemux86"
...
这会将构建环境设置为以 Beagleboard 为目标。如果您不知道 machine 名称,可以查看 BSP 文件夹 (meta-ti) 下的子文件夹:conf/machine (~/beagleboard/meta-ti/conf/machine)。此文件夹中 .conf 文件的名称是板级支持包可以定位的所有 machine 名称。另外请注意,默认 machine 是 qemux86。QEMU 是一个开源机器模拟器。您可以使用此模拟器在定位特定开发板之前尝试自定义构建的 Linux 发行版。
此时,您可能希望构建一个最小镜像以确定您的构建环境是否设置正确。您可以通过运行“bitbake core-image-minimal”来完成此操作。我们将跳过此步骤,直接构建包含 Mono 的最小镜像。
有很多方法可以混合和匹配包和配方。mono 元数据层已经为我们提供了一些配方,可以将 mono 添加到我们想要创建的任何镜像中;但是,在这里我们将创建自己的镜像配方,该镜像包含最小 Linux 镜像以及 Mono 运行时。这意味着 mono 的 GUI 元素 (依赖于 libgdiplus 的类) 将无法工作,因为基础最小镜像不包含 GDI。由于许多 IoT 应用程序可能不包含图形界面,我们认为这是展示在开发板上运行 C# 的最小要求的最佳方法。
我们需要做的第一件事是创建一个包含文件,告诉构建环境我们需要包含什么。您可以通过运行以下命令来完成此操作:
$ (cat << EOF
> IMAGE_INSTALL += "mono mono-helloworld"
> EOF
> ) > ~/beagleboard/meta-mono/recipes-mono/images/core-image-minimal-mono.inc
此命令会在 meta-mono 层中生成文件。您也可以创建自己的层来实现。如果您将此 include 文件与 ~/beagleboard/meta-mono/recipes-mono/images/core-image-mono.inc 文件进行比较,您会注意到唯一的区别是省略了 libgdiplus 依赖项。
现在让我们创建实际的bitbake配方文件。您可以通过运行以下命令来完成:
$ (cat << EOF
> require recipes-core/images/core-image-minimal.bb
> require core-image-minimal-mono.inc
> EOF
> ) > ~/beagleboard/meta-mono/recipes-mono/images/core-image-minimal-mono.bb
此命令会生成 bitbake 配方文件。此配方相当简单。第一行告诉构建环境包含用于构建 core-image-minimal 镜像的配方。第二行告诉环境将 mono 文件添加到镜像中。
我们现在已经有了镜像配方,准备开始“烘焙”。输入以下命令来构建镜像(确保您在构建目录中):
$ bitbake core-image-minimal-mono
此过程可能需要很长时间,具体取决于您的环境和互联网连接。它将首先解析所有配方,并确定需要从各个存储库下载哪些源代码。请注意,即使我们在配方文件中只包含两个配方,这两个配方也代表着大量依赖配方的一个层级。解析会遍历依赖关系,确定所有需要下载的文件。它会下载源代码并将其本地缓存。优点是后续可能需要源代码的构建无需再次连接到互联网获取。缺点是,根据您要构建的配方,可能会下载并存储大量文件。在此构建过程之后,我们的 ~/beagleboard 文件夹增长到 22GB。这代表了即使是最小的构建也需要的存储量。
上图显示了创建自定义Linux镜像时终端上应显示内容的示例。
当过程成功完成后,您可以在 ~/beagleboard/build/tmp/deploy/images/beagleboard 目录中找到所需的引导文件。此文件夹中有比引导开发板所需的文件多得多的文件。我们将需要以下文件:
MLO
u-boot.img
uImage
core-image-minimal-mono-beagleboard.tar.gz
modules-beagleboard.tgz
MLO 文件可以看作是第一阶段的引导加载程序。它将 u-boot 加载到系统中并运行它。u-boot 是一个引导加载程序,它可以读取 Linux 内核映像 (uImage) 并使用特定参数引导 Linux 环境。映像文件 (tar.gz) 和模块文件包含 Linux 基本文件系统以及需要安装到其中的附加模块。
接下来,我们需要生成包含 u-boot 用于设置 Linux 环境的特定参数的文件。可以使用以下命令创建该文件:
$ (cat << 'EOF'
> autoload=no
> hostname=BBC4
> console=ttyO2,115200n8
> mpurate=auto
> buddy=none
> vram=12M
> dvimode=hd720 omapfb.vram=0:8M,1:4M,2:4M
> defaultdisplay=dvi
> loadaddr=0x80200000
> mmcroot=/dev/mmcblk0p2 rw
> mmcrootfstype=ext3 rootwait
> mmcargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${mmcroot} rootfstype=${mmcrootfstype}
> mmcboot=echo Booting from mmc (uEnv.txt configuration) ...; run mmcargs; bootm ${loadaddr}
> loaduimagefat=fatload mmc ${mmcdev} ${loadaddr} uImage
> uenvcmd=run loaduimagefat; run mmcboot
> EOF
> ) > ~/beagleboard/build/tmp/deploy/images/beagleboard/uEnv.txt
如果您熟悉 u-boot,其中一些参数可能看起来很熟悉。这个文件可以包含很多不同的内核参数。上面的参数是 Oscar Gomez Fuente 在 Oscar Gomez Fuente 发布的参数的一个子集。
现在我们有了引导系统所需的所有文件。让我们创建可引导的 SD 卡并将其放入系统中。Beagleboard 使用一个双分区 SD 卡来引导系统。第一个分区包含一个 FAT 文件系统,其中包含内核和一些引导文件。第二个分区是一个 ext3 分区,包含文件系统。我将不讨论 SD 卡分区,因为网上有很多关于此的教程,并且通常取决于您卡的大小和参数。
如果您已经有一个分区卡,我建议使用以下命令重新格式化这两个分区,以便从一个干净的文件系统开始 (FAT 部分需要)。请将 'mmcblk0p1' 和 'mmcblk0p2' 分区替换为您 SD 卡上的分区 (可能是 sda1 和 sda2 等)。小心确保获得正确的分区 (您不想格式化错误的驱动器)。注意,这些说明基于 Dora Yocto BSP 项目网站 Dora Yocto BSP 项目网站 中的 Beagleboard 说明。
$ umount /dev/mmcblk0p1
$ umount /dev/mmcblk0p2
$ sudo mkfs.vfat -F 16 -n "boot" /dev/mmcblk0p1
$ sudo mke2fs -j -L "root" /dev/mmcblk0p2
在我的 Mint 系统上,此时卡会以挂载在 /media/mint/boot 和 /media/mint/root 的引导和根分区出现 (mint 是我的用户名)。您可能需要根据您的 Linux 环境手动挂载分区。以下命令将使用我挂载的文件夹。请务必调整命令以符合您系统的挂载文件夹。
现在让我们将所需文件复制到 SD 卡。文件的复制顺序很重要,因为 MLO 文件必须位于第一个分区的 FAT 文件系统的第一个扇区中。这样芯片就知道在哪里可以找到第一阶段的引导加载程序。
$ cp ~/beagleboard/build/tmp/deploy/images/beagleboard/MLO /media/mint/boot/MLO
$ cp ~/beagleboard/build/tmp/deploy/images/beagleboard/u-boot.img /media/mint/boot/u-boot.img
$ cp ~/beagleboard/build/tmp/deploy/images/beagleboard/uImage /media/mint/boot/uImage
$ cp ~/beagleboard/build/tmp/deploy/images/beagleboard/uEnv.txt /media/mint/boot/uEnv.txt
现在覆盖了引导分区,让我们将自定义 Linux 文件系统复制到第二个分区。
$ sudo tar xf ~/beagleboard/build/tmp/deploy/images/beagleboard/core-image-minimal-mono-beagleboard.tar.gz -C /media/mint/root
$ sudo tar xf ~/beagleboard/build/tmp/deploy/images/beagleboard/modules-beagleboard.tgz -C /media/mint/root
我们现在已准备好从 SD 卡引导。弹出卡并将其插入 Beagleboard。如果 NAND 中已存储映像,则需要使用以下命令将其清除。按住 'USER' 按钮,然后按重置,您将看到 u-boot 提示符。键入以下命令,然后不按住 'USER' 按钮重置:
# nand unlock
# nand erase
# nand erase.chip
如果 SD 卡启动并显示类似以下的登录界面:
Poky (Yocto Project Reference Distro) 1.6.2 beagleboard /dev/ttyO2 beagleboard login:
使用 "root" 作为用户名登录,您应该可以访问 shell。现在键入以下命令以确定 mono 是否设置正确:
# mono --version
它应该显示类似以下内容:
Mono JIT compiler version 3.4.0 (tarball Sat Nov 8 10:52:14 MST 2014)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
TLS: __thread
SIGSEGV: normal
Notifications: epoll
Architecture: armel,vfp+hard
Disabled: none
Misc: softdebug
LLVM: supported, not enabled.
GC: sgen
由于我们在镜像中包含了mono-helloworld配方,您应该能够运行以下命令:
# mono /usr/lib/helloworld/helloworld.exe
如果控制台打印出“HelloWorld”,那么您就成功地在开发板上运行了一个.NET应用程序。
历史
2014 年 11 月 9 日 - 首次提交