使用基于 Arm的 Graviton 实例、Yocto 项目和 SOAFEE 为边缘和云构建汽车嵌入式 Linux 镜像

Linux
Amazon CloudFormation
0
0
{"value":"作者:Luke Harvey, Marcio da Ros Gomes, Sebastian Goscik\n\n2022年6月16日\n\n汽车行业的嵌入式软件开发人员使用了传统的嵌入式开发方法,这种方法几十年来基本没有改变。编写软件的嵌入式目标系统本质上是资源受限的,内存、计算资源和输入/输出容量有限。此外,嵌入式开发系统通常价格昂贵,对于开发全新电子控制单元(ECU)和片上系统(SoC)架构的开发团队来说,这是一种稀缺商品。随着最近全球汽车行业芯片短缺,这种稀缺性变得更加明显。\n\n这意味着软件开发人员避免直接在嵌入式平台上开发软件,而是依赖于在功能强大的开发机器或主机上开发软件。在主机上创建用于开发和测试的可执行软件的编译器和工具链不能直接用于在嵌入式目标上的部署。很多时候,目标嵌入式操作系统(OS)本身不能在主机上使用。开发人员依赖于主机上繁琐的操作系统仿真工具和交叉编译过程,交叉编译过程使用特殊编译器为目标系统创建可执行代码。一旦代码在开发系统上,就可以执行最终的集成和验证测试,但扩展限于物理硬件平台的数量。目前,嵌入式系统的典型开发、集成和验证工作流如下所示:\n\n![image.png](1)\n\n本博客将介绍一种新的汽车软件开发概念,帮助开发人员使用云创建、测试和调试本机编译的软件,大大简化了此工作流程。这一概念通常被称为环境对等,您可以在Arm和亚马逊网络服务(Amazon)的白皮书([https://armkeil.blob.core.windows.net/developer/Files/pdf/white-paper/arm-aws-edge-environmental-parity-wp.pdf](https://armkeil.blob.core.windows.net/developer/Files/pdf/white-paper/arm-aws-edge-environmental-parity-wp.pdf))以及 Kevin Hoffman 的《超越十二要素应用程序》([https://www.oreilly.com/library/view/beyond-the-twelve-factor/9781492042631/](https://www.oreilly.com/library/view/beyond-the-twelve-factor/9781492042631/))一书中了解更多。\n\n“环境对等的目的是让您的团队和整个组织相信应用程序将在任何地方都能工作。”- Kevin Hoffman\n\n\n环境对等是实现云原生软件定义车辆目标的一个主要因素。\n\n#### **Arm、Amazon 和 SOAFEE**\n\nArm 技术正在定义计算的未来。Arm 的节能处理器设计和软件平台已在超过2250亿个芯片中实现了高级计算,我们的技术安全地为从传感器到智能手机和超级计算机的产品赋能。我们与1000多家技术合作伙伴一起,使人工智能能够在任何地方工作,在网络安全方面,我们正在为数字世界——从芯片到云——提供信任基础。Arm 架构在现代车辆中最为广泛,从信息娱乐单元到车身控制,以及更多,包括非常精细的功能安全相关计算负载。\n\n2021,Arm、Amazon 和其他创始成员宣布了可扩展的嵌入式边缘开放架构(SOAFEE)特别利益小组([https://soafee.io/](https://soafee.io/)),该小组将汽车制造商、半导体和云技术领导者聚集在一起,定义一种新的基于开放标准的架构,以实现软件定义的车辆堆栈的底层架构。它提供了一个参考实现,使云原生技术(如微服务、容器和编排系统)首次与汽车功能安全相结合,保持环境对等。\n\n #### **利用 SOAFEE 实现云到嵌入式边缘的 ISA 对等**\n\nAmazon 和 Arm 有着悠久的历史。这包括在 Amazon 定制 SOC 中使用64位处理器,这些 SOC 用于 Amazon Graviton 处理器,为云工作负载提供最佳性价比。通过在越来越多的实例类型上提供这些处理器选项,汽车开发人员可以使用同样的Arm知识产权(IP)和工具开发和运行云原生应用程序和工具链,这些工具也用于嵌入式汽车平台,如 Amazon 合作伙伴 ADLINK 的 AVA 开发者平台。\n\n通过在云和边缘中使用此 IP,开发人员可以在指令集架构(ISA)级别实现第一级环境对等。然而,为了实现更高级别的对等,我们需要一个操作系统、抽象层和编排层,这些层都是自动级别的,SOAFEE 正在努力支持这些层。下图显示了与这些方法相关的不同级别的环境对等和开发人员角色。\n\n![image.png](2)\n\n正如我们将在下一节中解释的那样,实现这样的对等级别将促进嵌入式软件开发和验证的全新工作流。\n\n#### **使用 ISA 对等促进操作系统级对等**\n\n作为演示本博文中解释的概念的参考操作系统,我们将使用 Yocto 项目创建一个自定义 Linux 发行版,这是一个开源协作项目,帮助开发人员创建基于 Linux 的自定义系统,而不考虑硬件。它被许多嵌入式项目使用,包括作为Linux基金会一部分的汽车级 Linux 计划以及 SOAFEE 参考实现。\n\n为了实现操作系统级的对等,Arm 和 Amazon 合作基于 Yocto 项目为 Graviton 实例创建了一个亚马逊机器映像(AMI)。AMI 是包含软件配置的模板,包括操作系统和应用软件。这可以用来启动一个 AmazonEC2 实例,它是在云中作为虚拟服务器运行的 AMI 的副本。开发的 AMI 还包括 Arm 的边缘工作负载抽象和编排层(EWAOL),这是 SOAFEE 体系结构的开源参考实现,有助于进一步实现应用程序、容器和操作系统环境对等。\n\neWal 提供了一个基于标准的框架,使用容器部署和编排嵌入式应用程序。这种方法可以帮助开发人员开始在云中编写和测试代码,从而显著改进和扩展工作流。更具体地说,SOAFEE 促进了:\n . 整个嵌入式软件栈的云实现,从嵌入式操作系统开始,而不仅仅是开发中的软件单元;\n . 从云到嵌入式边缘的无缝移植不再需要交叉编译或仿真(以及编译错误或性能下降等相关问题)。\n\n访问 Arm GitLab([https://git.gitlab.arm.com/ewaol/meta-ewaol](https://git.gitlab.arm.com/ewaol/meta-ewaol))以获取有关 EWAOL 的更多信息。\n\n既然我们已经引入了操作系统级和 ISA 级对等的概念,我们现在可以修改嵌入式开发人员的工作流程,以减少许多现在不再需要的步骤,如下图所示:\n\n![image.png](3)\n\n在本博客的其余部分,我们将提供一个教程,详细介绍如何使用 Yocto 项目为基于 Amazon Graviton 的实例创建自己的自定义基于 Linux 的 AMI。本教程的目的不仅仅是教如何在 Amazon 上部署已经创建的 AMI,而是为开发人员提供一种方法,让他们将自己用于嵌入式系统的 Linux 镜像带到云中。\n\n#### **如何使用 Yocto 项目为 Amazon Graviton 处理器创建自定义 Linux AMI**\n\n本指南将描述如何创建可用于启动 Amazon EC2 实例的自定义Linux AMI。您应该已经有权访问具有创建所需资源的适当权限的 Amazon 帐户。如果没有,请创建/激活一个帐户([https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/))。\n\n在开始之前,请查看 GitHub 上的详细说明。此存储库包含有关如何创建自定义 Linux AMI(包括 eWal)的最新信息和说明。\n\n使用 Yocto 创建自定义 AMI 有五个主要步骤。我们将一步一步地介绍它们,并构建如下所示的体系结构:\n\n根据本博客中的说明部署的系统架构图。\n\n![image.png](4)\n\n#### **1.配置 Amazon 资源**\n\n首先,我们需要使用 Amazon CloudFormation 进行一些 Amazon 帐户设置和配置,通过将基础设施视为代码,您可以对 Amazon 和第三方资源进行建模、配置和管理。Amazon CloudFormation 在这里用于使用配置文件配置 Amazon 资源,以节省您的时间。\n\n 1. 将此 Amazon CloudFormation从GitHub repo 下载到您的本地计算机。\n 2.转到 Amazon CloudFormation 仪表板。\n 3.点击“创建堆栈” \n\n 4.选择“上载模板文件”,选择在步骤1中下载的模板文件,然后单击“下一步”继续。\n 5.输入“yocto build”作为堆栈名称。将 creates3bucket 切换为“yes”,并输入任何唯一的 bucket 名称。选择“下一步”继续。\n 6.将此页面保留为默认页面,然后选择“下一步”\n 7.最后,检查设置,确认身份和访问管理(资源创建),并选择“创建堆栈”\n8.这应该需要几分钟来创建。当您在堆栈状态中看到“CREATE_COMPLETE”时,您可以进入下一步。\n\n#### **2.创建一个 Yocto 构建 Amazon EC2 实例**\n\n现在,我们将创建一个 AmazonEC2 实例并将其保护到该实例中,该实例将用作我们的开发环境,用于使用 Yocto 项目编译和构建我们的自定义 Linux 镜像。\n\n 1.转到 Amazon EC2 仪表板。\n 2.单击侧栏菜单中的“实例”。\n 3.单击橙色的“启动实例”按钮。\n 4.选择带有“64位(Arm)”的“Ubuntu 服务器20.04 LTS”\n 5.选择“c6g.4xlarge”实例类型。c6g。选择 4xlarge 实例类型是因为它是一个 CPU 优化的实例,将用于编译,但也可以根据您的需求使用其他实例类型。\n 6.创建并下载新的密钥对。稍后,您将使用此密钥加密SSH会话。\n 7.在“创建安全组”下,选择“允许 SSH 通信”。在下拉菜单中,选择“我的 IP”\n 8.在“配置存储”下,将根卷调整为 100GiB的gp2(通用 SSD)。\n 9.在“高级详细信息”下,我们需要选择在 cloudformation 步骤中创建的“IAM 实例配置文件”,为我们的实例提供以下步骤所需的 Amazon 权限。它应该以“yocto-build-VMBuilderEC2Role-”开头,然后是随机字符。\n 10.将所有剩余设置保留为默认设置,然后选择“启动实例”。\n 11.最后,您可以选择“查看实例”按钮,等待实例进入“运行状态”\n\n#### **3.使用 Yocto 项目构建自定义 Linux 映像**\n\n接下来,您应该使用 SSH 连接到步骤2中创建的构建实例中。您可以使用任何希望连接到此实例的 SSH 客户端。\n\n 1.通过选择列表中的实例并单击“连接”按钮来查找SSH命令。\n 1.使用 SSH 客户端,使用所示命令连接到服务器。例如:ssh-I“keypair.pem”ubuntu@ec2-[ip-address].compute-1.amazonaws.com。\n\n\n2.按照 GitHub 存储库中的说明安装构建依赖项。[https://github.com/aws4embeddedlinux/meta-aws-ewaol/blob/main/cfn/vmimport-cfn.yml](https://github.com/aws4embeddedlinux/meta-aws-ewaol/blob/main/cfn/vmimport-cfn.yml)\n3.从同一存储库中完成“构建 eWal”部分。该存储库配置了一个基本的Yocto Project Linux发行版,其中包括用于支持我们的 AMI 的 cloud init、meta eWal、meta Amazon 和 SSH。\n\n注意:花时间检查 YAML 配置文件,并针对您的项目进行必要的修改。\n\n4.在完成上述“kas构建”步骤后,完成新 Linux 发行版的构建大约需要50分钟。\n5.至此,我们可以选择深入研究本项目中使用的 YAML 文件和内核配置。\n \n(可选 Deep Dive)kas、YAML 和内核配置说明\n\n这个 YAML 文件([https://github.com/aws4embeddedlinux/meta-aws-ewaol/blob/main/kas/machines/ewaol-graviton2-ami.yaml](https://github.com/aws4embeddedlinux/meta-aws-ewaol/blob/main/kas/machines/ewaol-graviton2-ami.yaml))向 kas 描述了 Yocto 项目应该如何构建我们的 Linux 镜像。\n\n++Header++\n\n```\n\nheader:\naversion: 10\nincludes:\n– repo: meta-ewaol\nfile: meta-ewaol-config/kas/ewaol-base.yml\n– repo: meta-ewaol\nfile: meta-ewaol-config/kas/arm-machines.yml\n```\n本节将告诉 kas 我们使用的文件模式的版本,以及其他一些要从 eWal repo 中包含的 YAML 文件(稍后解释)。其中包括加载在 eWal 基本配置中的文件和一些标准 Arm 机器定义。\n\n++Repositories++\n```\n\nrepos:\n\nmeta-ewaol:\n\nurl: “https://git.gitlab.arm.com/ewaol/meta-ewaol.git”\npath: layers/meta-ewaol\nrefspec: v0.2.4\n\nmeta-aws:\n\nurl: https://github.com/aws/meta-aws.git\npath: layers/meta-aws\nrefspec: hardknott\nmeta-virtualization:\nrefspec: hardknott\n\nmeta-ewaol-ext:\n\npath: meta-ewaol-ext\nrefspec: hardknott\n\nmeta-openembedded:\n\nrefspec: hardknott\n\npoky:\n\nrefspec: hardknott\n```\n本节告诉 kas 我们要使用哪些 Yocto 层,在哪里下载它们,使用哪些版本,以及在哪里存储它们。在本例中,我们使用了 meta-ewaol(参考 SOAFEE 实现层)和 Amazon 元,后者提供了 Amazon 边缘软件功能的配方。在标题中包含了“eWal base.yml”,它包含了更多的存储库。该文件还加载“poky”和“meta openembedded”,这是标准的 Yocto 层。此外, meta-ewaol-ext\n层通过使用补丁和 bbappend 文件向 cloud init 和 OpenSSH recipes\n添加定制。\n++Machine++\n\n```\n\nmachine: generic-arm64\n```\n\n这行命令告诉 Yocto 我们要将图像定位在哪台机器上。在本例中,使用了“generic-arm64”。它创建了一个映像,可以在大多数支持通用启动机制的 Arm 设备上启动(本例中为 UEFI。您将在稍后的 AMI 映像中看到此集合)。\n++Custom config++\n\n```\n\nCustom config\n\nlocal_conf_header:\n\nmeta-custom: |\nFILESEXTRAPATHS_prepend_pn-linux-yocto = “${TOPDIR}/../kernelconfig/:”\nSRC_URI_append_pn-linux-yocto = ” file://gravitonKernelConfigs.cfg “\n\nINHERIT += “extrausers”\n# Hardening: Locking the root password. Creating the ewaol without password for ssh key-based login only\nEXTRA_USERS_PARAMS = “usermod -L root; useradd -p ‘*’ ewaol”\n\nEXTRA_IMAGE_FEATURES_append = “ssh-server-openssh”\n# Forcing removal of debug-tweakes as ewaol includes it in all targets by default and that leads to reversing some sshd_config hardening done in our bbappend when do_rootfs runs\nEXTRA_IMAGE_FEATURES_remove = “debug-tweaks”\nIMAGE_INSTALL_append = ” rng-tools awscli cloud-init cloud-init-systemd e2fsprogs e2fsprogs-resize2fs e2fsprogs-tune2fs e2fsprogs-e2fsck e2fsprogs-mke2fs parted sudo sudo-sudo openssh-sftp-server”\nIMAGE_FSTYPES += ” wic wic.vhdx”\n```\n\n本节配置特定于此示例的自定义配置设置:\n\n . 添加 cloud init,用于在启动时将 AMI 配置到特定的 Amazon EC2实例\n . 添加一些额外的内核配置\n .添加了一些额外功能,如 SSH 服务器和 Amazon 命令行界面(Amazon CLI),这是一个管理 Amazon 服务的统一工具\n\n++Target++\n\n```\n\n\nTarget:\n\n– ewaol-image-docker\n```\n这告诉 Yocto 要构建哪些目标图像。在这种情况下,我们只希望它构建docker 映像(而不是 podman 映像)\n\n++Kernel configuration fragment++\n\n要将 Yocto 配置为在 Amazon Graviton2 处理器上工作,必须激活一些额外的内核配置。它们包含在 gravitonKernelConfigs.cfg中。\n. 要使 NVME 存储工作,需要 CONFIG_BLK_DEV_NVME。\n. ENA_ ETHERNET 是网络工作所必需的。\n. 串行端口需要 CONFIG_SERIAL_8250_PCI。\n\n#### **4.从图像文件创建 AMI**\n\n1.既然已经构建了映像,我们需要创建 AMI 本身。\n2.按照 GitHub 存储库中的说明运行创建 ami。sh 脚本。\n3.这将在您的 Amazon 帐户中自动生成新的 AMI。\n4.最后,您不再需要这个构建 Amazon EC2 实例,因此可以关闭它:\n\n```\n\n$ sudo poweroff\n```\n#### **5.使用新的 AMI 启动 EC2 实例**\n\n使用新创建的AMI启动实例就像本指南前面设置EC2实例一样。\n\n 1.转到 Amazon EC2 仪表板。\n2.通过单击左侧菜单中的 AMI 打开 AMI 窗格。\n 3.选择先前创建的AMI。\n 4.单击“从图像启动实例”按钮。从本指南的第一部分开始,应熟悉以下屏幕。\n5.在先前创建的下拉菜单中选择相同的密钥对。\n 6.在“创建安全组”下,选择“允许 SSH 通信”,并在下拉列表中选择“我的 IP”\n 7.您可以保留其他实例设置的默认设置,然后单击“启动实例”\n8.现在,我们将使用SSH实用程序连接到我们的自定义 Linux 实例。通过选择列表中的实例并单击“连接”按钮来查找SSH命令。但是,您必须自己将用户名修改为“ewaol”,如下所示:\n例如:ssh -I “keypair.pem” ewaol@ec2-[ip-address].compute-1.amazonaws.com\n\n9.让我们用以下命令确认该实例是我们使用 Yocto 项目构建的:\n```\n\n$ uname –r\n10.107-yocto-standard\n```\n最后,当您不再需要堆栈和本教程中创建的所有资源时,请务必删除它们,以避免将来产生成本。\n\n恭喜!现在,您已经能够使用 Yocto 项目构建和启动自己的自定义Linux 映像,该项目现在可以在云中用于开发以及验证和验证。\n\n如果自定义映像遇到任何问题,可以访问实例串行控制台进行调试。这在默认情况下不被激活。详情可在此处找到:[https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-serial-console.html](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-serial-console.html)\n\n#### **汽车的未来是软件定义的**\n\n在本博客中,我们介绍了环境平等的高级概念以及 Arm、Amazon 和其他合作伙伴正在努力实现的目标:构建软件定义的系统并加速汽车软件开发。我们还提供了一个教程,介绍了如何使用基于 Arm 的 Amazon Graviton 处理器为自己的开发工作流使用 Yocto 项目创建自定义 AMI。\n\n如果您想更深入地了解这个概念,请访问这个实践研讨会,详细介绍如何使用本博客中创建的 AMI 为汽车开发创建自动化软件开发管道,并演示环境对等。\n\n有关嵌入式边缘可扩展开放体系结构(SOAFEE)项目的更多信息,请访问 SOAFEE.io([http://soafee.io/](http://soafee.io/))。\n\n\n\n\n\n\n","render":"<p>作者:Luke Harvey, Marcio da Ros Gomes, Sebastian Goscik</p>\n<p>2022年6月16日</p>\n<p>汽车行业的嵌入式软件开发人员使用了传统的嵌入式开发方法,这种方法几十年来基本没有改变。编写软件的嵌入式目标系统本质上是资源受限的,内存、计算资源和输入/输出容量有限。此外,嵌入式开发系统通常价格昂贵,对于开发全新电子控制单元(ECU)和片上系统(SoC)架构的开发团队来说,这是一种稀缺商品。随着最近全球汽车行业芯片短缺,这种稀缺性变得更加明显。</p>\n<p>这意味着软件开发人员避免直接在嵌入式平台上开发软件,而是依赖于在功能强大的开发机器或主机上开发软件。在主机上创建用于开发和测试的可执行软件的编译器和工具链不能直接用于在嵌入式目标上的部署。很多时候,目标嵌入式操作系统(OS)本身不能在主机上使用。开发人员依赖于主机上繁琐的操作系统仿真工具和交叉编译过程,交叉编译过程使用特殊编译器为目标系统创建可执行代码。一旦代码在开发系统上,就可以执行最终的集成和验证测试,但扩展限于物理硬件平台的数量。目前,嵌入式系统的典型开发、集成和验证工作流如下所示:</p>\n<p><img src=\"1\" alt=\"image.png\" /></p>\n<p>本博客将介绍一种新的汽车软件开发概念,帮助开发人员使用云创建、测试和调试本机编译的软件,大大简化了此工作流程。这一概念通常被称为环境对等,您可以在Arm和亚马逊网络服务(Amazon)的白皮书(<a href=\"https://armkeil.blob.core.windows.net/developer/Files/pdf/white-paper/arm-aws-edge-environmental-parity-wp.pdf\" target=\"_blank\">https://armkeil.blob.core.windows.net/developer/Files/pdf/white-paper/arm-aws-edge-environmental-parity-wp.pdf</a>)以及 Kevin Hoffman 的《超越十二要素应用程序》(<a href=\"https://www.oreilly.com/library/view/beyond-the-twelve-factor/9781492042631/\" target=\"_blank\">https://www.oreilly.com/library/view/beyond-the-twelve-factor/9781492042631/</a>)一书中了解更多。</p>\n<p>“环境对等的目的是让您的团队和整个组织相信应用程序将在任何地方都能工作。”- Kevin Hoffman</p>\n<p>环境对等是实现云原生软件定义车辆目标的一个主要因素。</p>\n<h4><a id=\"ArmAmazon__SOAFEE_17\"></a><strong>Arm、Amazon 和 SOAFEE</strong></h4>\n<p>Arm 技术正在定义计算的未来。Arm 的节能处理器设计和软件平台已在超过2250亿个芯片中实现了高级计算,我们的技术安全地为从传感器到智能手机和超级计算机的产品赋能。我们与1000多家技术合作伙伴一起,使人工智能能够在任何地方工作,在网络安全方面,我们正在为数字世界——从芯片到云——提供信任基础。Arm 架构在现代车辆中最为广泛,从信息娱乐单元到车身控制,以及更多,包括非常精细的功能安全相关计算负载。</p>\n<p>2021,Arm、Amazon 和其他创始成员宣布了可扩展的嵌入式边缘开放架构(SOAFEE)特别利益小组(<a href=\"https://soafee.io/\" target=\"_blank\">https://soafee.io/</a>),该小组将汽车制造商、半导体和云技术领导者聚集在一起,定义一种新的基于开放标准的架构,以实现软件定义的车辆堆栈的底层架构。它提供了一个参考实现,使云原生技术(如微服务、容器和编排系统)首次与汽车功能安全相结合,保持环境对等。</p>\n<h4><a id=\"_SOAFEE__ISA__23\"></a><strong>利用 SOAFEE 实现云到嵌入式边缘的 ISA 对等</strong></h4>\n<p>Amazon 和 Arm 有着悠久的历史。这包括在 Amazon 定制 SOC 中使用64位处理器,这些 SOC 用于 Amazon Graviton 处理器,为云工作负载提供最佳性价比。通过在越来越多的实例类型上提供这些处理器选项,汽车开发人员可以使用同样的Arm知识产权(IP)和工具开发和运行云原生应用程序和工具链,这些工具也用于嵌入式汽车平台,如 Amazon 合作伙伴 ADLINK 的 AVA 开发者平台。</p>\n<p>通过在云和边缘中使用此 IP,开发人员可以在指令集架构(ISA)级别实现第一级环境对等。然而,为了实现更高级别的对等,我们需要一个操作系统、抽象层和编排层,这些层都是自动级别的,SOAFEE 正在努力支持这些层。下图显示了与这些方法相关的不同级别的环境对等和开发人员角色。</p>\n<p><img src=\"2\" alt=\"image.png\" /></p>\n<p>正如我们将在下一节中解释的那样,实现这样的对等级别将促进嵌入式软件开发和验证的全新工作流。</p>\n<h4><a id=\"_ISA__33\"></a><strong>使用 ISA 对等促进操作系统级对等</strong></h4>\n<p>作为演示本博文中解释的概念的参考操作系统,我们将使用 Yocto 项目创建一个自定义 Linux 发行版,这是一个开源协作项目,帮助开发人员创建基于 Linux 的自定义系统,而不考虑硬件。它被许多嵌入式项目使用,包括作为Linux基金会一部分的汽车级 Linux 计划以及 SOAFEE 参考实现。</p>\n<p>为了实现操作系统级的对等,Arm 和 Amazon 合作基于 Yocto 项目为 Graviton 实例创建了一个亚马逊机器映像(AMI)。AMI 是包含软件配置的模板,包括操作系统和应用软件。这可以用来启动一个 AmazonEC2 实例,它是在云中作为虚拟服务器运行的 AMI 的副本。开发的 AMI 还包括 Arm 的边缘工作负载抽象和编排层(EWAOL),这是 SOAFEE 体系结构的开源参考实现,有助于进一步实现应用程序、容器和操作系统环境对等。</p>\n<p>eWal 提供了一个基于标准的框架,使用容器部署和编排嵌入式应用程序。这种方法可以帮助开发人员开始在云中编写和测试代码,从而显著改进和扩展工作流。更具体地说,SOAFEE 促进了:<br />\n. 整个嵌入式软件栈的云实现,从嵌入式操作系统开始,而不仅仅是开发中的软件单元;<br />\n. 从云到嵌入式边缘的无缝移植不再需要交叉编译或仿真(以及编译错误或性能下降等相关问题)。</p>\n<p>访问 Arm GitLab(<a href=\"https://git.gitlab.arm.com/ewaol/meta-ewaol\" target=\"_blank\">https://git.gitlab.arm.com/ewaol/meta-ewaol</a>)以获取有关 EWAOL 的更多信息。</p>\n<p>既然我们已经引入了操作系统级和 ISA 级对等的概念,我们现在可以修改嵌入式开发人员的工作流程,以减少许多现在不再需要的步骤,如下图所示:</p>\n<p><img src=\"3\" alt=\"image.png\" /></p>\n<p>在本博客的其余部分,我们将提供一个教程,详细介绍如何使用 Yocto 项目为基于 Amazon Graviton 的实例创建自己的自定义基于 Linux 的 AMI。本教程的目的不仅仅是教如何在 Amazon 上部署已经创建的 AMI,而是为开发人员提供一种方法,让他们将自己用于嵌入式系统的 Linux 镜像带到云中。</p>\n<h4><a id=\"_Yocto__Amazon_Graviton__Linux_AMI_51\"></a><strong>如何使用 Yocto 项目为 Amazon Graviton 处理器创建自定义 Linux AMI</strong></h4>\n<p>本指南将描述如何创建可用于启动 Amazon EC2 实例的自定义Linux AMI。您应该已经有权访问具有创建所需资源的适当权限的 Amazon 帐户。如果没有,请创建/激活一个帐户(<a href=\"https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/\" target=\"_blank\">https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/</a>)。</p>\n<p>在开始之前,请查看 GitHub 上的详细说明。此存储库包含有关如何创建自定义 Linux AMI(包括 eWal)的最新信息和说明。</p>\n<p>使用 Yocto 创建自定义 AMI 有五个主要步骤。我们将一步一步地介绍它们,并构建如下所示的体系结构:</p>\n<p>根据本博客中的说明部署的系统架构图。</p>\n<p><img src=\"4\" alt=\"image.png\" /></p>\n<h4><a id=\"1_Amazon__63\"></a><strong>1.配置 Amazon 资源</strong></h4>\n<p>首先,我们需要使用 Amazon CloudFormation 进行一些 Amazon 帐户设置和配置,通过将基础设施视为代码,您可以对 Amazon 和第三方资源进行建模、配置和管理。Amazon CloudFormation 在这里用于使用配置文件配置 Amazon 资源,以节省您的时间。</p>\n<ol>\n<li>将此 Amazon CloudFormation从GitHub repo 下载到您的本地计算机。<br />\n2.转到 Amazon CloudFormation 仪表板。<br />\n3.点击“创建堆栈”</li>\n</ol>\n<p>4.选择“上载模板文件”,选择在步骤1中下载的模板文件,然后单击“下一步”继续。<br />\n5.输入“yocto build”作为堆栈名称。将 creates3bucket 切换为“yes”,并输入任何唯一的 bucket 名称。选择“下一步”继续。<br />\n6.将此页面保留为默认页面,然后选择“下一步”<br />\n7.最后,检查设置,确认身份和访问管理(资源创建),并选择“创建堆栈”<br />\n8.这应该需要几分钟来创建。当您在堆栈状态中看到“CREATE_COMPLETE”时,您可以进入下一步。</p>\n<h4><a id=\"2_Yocto__Amazon_EC2__77\"></a><strong>2.创建一个 Yocto 构建 Amazon EC2 实例</strong></h4>\n<p>现在,我们将创建一个 AmazonEC2 实例并将其保护到该实例中,该实例将用作我们的开发环境,用于使用 Yocto 项目编译和构建我们的自定义 Linux 镜像。</p>\n<p>1.转到 Amazon EC2 仪表板。<br />\n2.单击侧栏菜单中的“实例”。<br />\n3.单击橙色的“启动实例”按钮。<br />\n4.选择带有“64位(Arm)”的“Ubuntu 服务器20.04 LTS”<br />\n5.选择“c6g.4xlarge”实例类型。c6g。选择 4xlarge 实例类型是因为它是一个 CPU 优化的实例,将用于编译,但也可以根据您的需求使用其他实例类型。<br />\n6.创建并下载新的密钥对。稍后,您将使用此密钥加密SSH会话。<br />\n7.在“创建安全组”下,选择“允许 SSH 通信”。在下拉菜单中,选择“我的 IP”<br />\n8.在“配置存储”下,将根卷调整为 100GiB的gp2(通用 SSD)。<br />\n9.在“高级详细信息”下,我们需要选择在 cloudformation 步骤中创建的“IAM 实例配置文件”,为我们的实例提供以下步骤所需的 Amazon 权限。它应该以“yocto-build-VMBuilderEC2Role-”开头,然后是随机字符。<br />\n10.将所有剩余设置保留为默认设置,然后选择“启动实例”。<br />\n11.最后,您可以选择“查看实例”按钮,等待实例进入“运行状态”</p>\n<h4><a id=\"3_Yocto__Linux__93\"></a><strong>3.使用 Yocto 项目构建自定义 Linux 映像</strong></h4>\n<p>接下来,您应该使用 SSH 连接到步骤2中创建的构建实例中。您可以使用任何希望连接到此实例的 SSH 客户端。</p>\n<p>1.通过选择列表中的实例并单击“连接”按钮来查找SSH命令。<br />\n1.使用 SSH 客户端,使用所示命令连接到服务器。例如:ssh-I“keypair.pem”ubuntu@ec2-[ip-address].compute-1.amazonaws.com。</p>\n<p>2.按照 GitHub 存储库中的说明安装构建依赖项。<a href=\"https://github.com/aws4embeddedlinux/meta-aws-ewaol/blob/main/cfn/vmimport-cfn.yml\" target=\"_blank\">https://github.com/aws4embeddedlinux/meta-aws-ewaol/blob/main/cfn/vmimport-cfn.yml</a><br />\n3.从同一存储库中完成“构建 eWal”部分。该存储库配置了一个基本的Yocto Project Linux发行版,其中包括用于支持我们的 AMI 的 cloud init、meta eWal、meta Amazon 和 SSH。</p>\n<p>注意:花时间检查 YAML 配置文件,并针对您的项目进行必要的修改。</p>\n<p>4.在完成上述“kas构建”步骤后,完成新 Linux 发行版的构建大约需要50分钟。<br />\n5.至此,我们可以选择深入研究本项目中使用的 YAML 文件和内核配置。</p>\n<p>(可选 Deep Dive)kas、YAML 和内核配置说明</p>\n<p>这个 YAML 文件(<a href=\"https://github.com/aws4embeddedlinux/meta-aws-ewaol/blob/main/kas/machines/ewaol-graviton2-ami.yaml\" target=\"_blank\">https://github.com/aws4embeddedlinux/meta-aws-ewaol/blob/main/kas/machines/ewaol-graviton2-ami.yaml</a>)向 kas 描述了 Yocto 项目应该如何构建我们的 Linux 镜像。</p>\n<p><ins>Header</ins></p>\n<pre><code class=\"lang-\">\nheader:\naversion: 10\nincludes:\n– repo: meta-ewaol\nfile: meta-ewaol-config/kas/ewaol-base.yml\n– repo: meta-ewaol\nfile: meta-ewaol-config/kas/arm-machines.yml\n</code></pre>\n<p>本节将告诉 kas 我们使用的文件模式的版本,以及其他一些要从 eWal repo 中包含的 YAML 文件(稍后解释)。其中包括加载在 eWal 基本配置中的文件和一些标准 Arm 机器定义。</p>\n<p><ins>Repositories</ins></p>\n<pre><code class=\"lang-\">\nrepos:\n\nmeta-ewaol:\n\nurl: “https://git.gitlab.arm.com/ewaol/meta-ewaol.git”\npath: layers/meta-ewaol\nrefspec: v0.2.4\n\nmeta-aws:\n\nurl: https://github.com/aws/meta-aws.git\npath: layers/meta-aws\nrefspec: hardknott\nmeta-virtualization:\nrefspec: hardknott\n\nmeta-ewaol-ext:\n\npath: meta-ewaol-ext\nrefspec: hardknott\n\nmeta-openembedded:\n\nrefspec: hardknott\n\npoky:\n\nrefspec: hardknott\n</code></pre>\n<p>本节告诉 kas 我们要使用哪些 Yocto 层,在哪里下载它们,使用哪些版本,以及在哪里存储它们。在本例中,我们使用了 meta-ewaol(参考 SOAFEE 实现层)和 Amazon 元,后者提供了 Amazon 边缘软件功能的配方。在标题中包含了“eWal base.yml”,它包含了更多的存储库。该文件还加载“poky”和“meta openembedded”,这是标准的 Yocto 层。此外, meta-ewaol-ext<br />\n层通过使用补丁和 bbappend 文件向 cloud init 和 OpenSSH recipes<br />\n添加定制。<br />\n<ins>Machine</ins></p>\n<pre><code class=\"lang-\">\nmachine: generic-arm64\n</code></pre>\n<p>这行命令告诉 Yocto 我们要将图像定位在哪台机器上。在本例中,使用了“generic-arm64”。它创建了一个映像,可以在大多数支持通用启动机制的 Arm 设备上启动(本例中为 UEFI。您将在稍后的 AMI 映像中看到此集合)。<br />\n<ins>Custom config</ins></p>\n<pre><code class=\"lang-\">\nCustom config\n\nlocal_conf_header:\n\nmeta-custom: |\nFILESEXTRAPATHS_prepend_pn-linux-yocto = “${TOPDIR}/../kernelconfig/:”\nSRC_URI_append_pn-linux-yocto = ” file://gravitonKernelConfigs.cfg “\n\nINHERIT += “extrausers”\n# Hardening: Locking the root password. Creating the ewaol without password for ssh key-based login only\nEXTRA_USERS_PARAMS = “usermod -L root; useradd -p ‘*’ ewaol”\n\nEXTRA_IMAGE_FEATURES_append = “ssh-server-openssh”\n# Forcing removal of debug-tweakes as ewaol includes it in all targets by default and that leads to reversing some sshd_config hardening done in our bbappend when do_rootfs runs\nEXTRA_IMAGE_FEATURES_remove = “debug-tweaks”\nIMAGE_INSTALL_append = ” rng-tools awscli cloud-init cloud-init-systemd e2fsprogs e2fsprogs-resize2fs e2fsprogs-tune2fs e2fsprogs-e2fsck e2fsprogs-mke2fs parted sudo sudo-sudo openssh-sftp-server”\nIMAGE_FSTYPES += ” wic wic.vhdx”\n</code></pre>\n<p>本节配置特定于此示例的自定义配置设置:</p>\n<p>. 添加 cloud init,用于在启动时将 AMI 配置到特定的 Amazon EC2实例<br />\n. 添加一些额外的内核配置<br />\n.添加了一些额外功能,如 SSH 服务器和 Amazon 命令行界面(Amazon CLI),这是一个管理 Amazon 服务的统一工具</p>\n<p><ins>Target</ins></p>\n<pre><code class=\"lang-\">\n\nTarget:\n\n– ewaol-image-docker\n</code></pre>\n<p>这告诉 Yocto 要构建哪些目标图像。在这种情况下,我们只希望它构建docker 映像(而不是 podman 映像)</p>\n<p><ins>Kernel configuration fragment</ins></p>\n<p>要将 Yocto 配置为在 Amazon Graviton2 处理器上工作,必须激活一些额外的内核配置。它们包含在 gravitonKernelConfigs.cfg中。<br />\n. 要使 NVME 存储工作,需要 CONFIG_BLK_DEV_NVME。<br />\n. ENA_ ETHERNET 是网络工作所必需的。<br />\n. 串行端口需要 CONFIG_SERIAL_8250_PCI。</p>\n<h4><a id=\"4_AMI_217\"></a><strong>4.从图像文件创建 AMI</strong></h4>\n<p>1.既然已经构建了映像,我们需要创建 AMI 本身。<br />\n2.按照 GitHub 存储库中的说明运行创建 ami。sh 脚本。<br />\n3.这将在您的 Amazon 帐户中自动生成新的 AMI。<br />\n4.最后,您不再需要这个构建 Amazon EC2 实例,因此可以关闭它:</p>\n<pre><code class=\"lang-\">\n$ sudo poweroff\n</code></pre>\n<h4><a id=\"5_AMI__EC2__228\"></a><strong>5.使用新的 AMI 启动 EC2 实例</strong></h4>\n<p>使用新创建的AMI启动实例就像本指南前面设置EC2实例一样。</p>\n<p>1.转到 Amazon EC2 仪表板。<br />\n2.通过单击左侧菜单中的 AMI 打开 AMI 窗格。<br />\n3.选择先前创建的AMI。<br />\n4.单击“从图像启动实例”按钮。从本指南的第一部分开始,应熟悉以下屏幕。<br />\n5.在先前创建的下拉菜单中选择相同的密钥对。<br />\n6.在“创建安全组”下,选择“允许 SSH 通信”,并在下拉列表中选择“我的 IP”<br />\n7.您可以保留其他实例设置的默认设置,然后单击“启动实例”<br />\n8.现在,我们将使用SSH实用程序连接到我们的自定义 Linux 实例。通过选择列表中的实例并单击“连接”按钮来查找SSH命令。但是,您必须自己将用户名修改为“ewaol”,如下所示:<br />\n例如:ssh -I “keypair.pem” ewaol@ec2-[ip-address].compute-1.amazonaws.com</p>\n<p>9.让我们用以下命令确认该实例是我们使用 Yocto 项目构建的:</p>\n<pre><code class=\"lang-\">\n$ uname –r\n10.107-yocto-standard\n</code></pre>\n<p>最后,当您不再需要堆栈和本教程中创建的所有资源时,请务必删除它们,以避免将来产生成本。</p>\n<p>恭喜!现在,您已经能够使用 Yocto 项目构建和启动自己的自定义Linux 映像,该项目现在可以在云中用于开发以及验证和验证。</p>\n<p>如果自定义映像遇到任何问题,可以访问实例串行控制台进行调试。这在默认情况下不被激活。详情可在此处找到:<a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-serial-console.html\" target=\"_blank\">https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-serial-console.html</a></p>\n<h4><a id=\"_254\"></a><strong>汽车的未来是软件定义的</strong></h4>\n<p>在本博客中,我们介绍了环境平等的高级概念以及 Arm、Amazon 和其他合作伙伴正在努力实现的目标:构建软件定义的系统并加速汽车软件开发。我们还提供了一个教程,介绍了如何使用基于 Arm 的 Amazon Graviton 处理器为自己的开发工作流使用 Yocto 项目创建自定义 AMI。</p>\n<p>如果您想更深入地了解这个概念,请访问这个实践研讨会,详细介绍如何使用本博客中创建的 AMI 为汽车开发创建自动化软件开发管道,并演示环境对等。</p>\n<p>有关嵌入式边缘可扩展开放体系结构(SOAFEE)项目的更多信息,请访问 SOAFEE.io(<a href=\"http://soafee.io/\" target=\"_blank\">http://soafee.io/</a>)。</p>\n"}
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭