0.1 PetaLinux 是什么
PetaLinux 是 Xilinx 推出的用于在其自家 SoC 上构建嵌入式 Linux 的一套工具集,集成了编译、调试、仿真等众多工具。
0.2 原有的搭建 PetaLinux 开发环境的方式有什么问题
实验室的项目基于 Xilinx 的 Zynq 系列 SoC 开发,需要使用 PetaLinux 构建嵌入式 Linux 系统,第一步就是搭建开发环境。团队成员平时的主力系统是 Windows,使用虚拟机的方式搭建 Linux 开发环境。搭建开发环境出现困难,或为节省时间的目的时会从其他成员那里复制搭建好环境的虚拟机。这些方式已产生或可能产生的问题可以总结如下:
1. 安装开发环境的依赖稍显复杂,且根据 *** 作系统不同而异,新手不易搞定。安装过程没有被很好的文档化,团队成员重复劳动明显。
2. 统一 *** 作系统版本困难。开发人员(现有成员、未来加入成员、项目其他团队的成员)可能使用着不同的 Linux 发行版和版本,因为他们可能有不同的喜好,版本上喜欢尝鲜或守旧,在既有系统上已经有顺手的开发工具和设置等等。而当大家希望统一开发环境或自行搭建失败时,往往选择复制整个虚拟机镜像。
3. 使用复制整个虚拟机的方式传递开发环境不够灵活。表现为:
使用了一段时间后的虚拟机大小可能动辄四五十个 GB,拷贝时间长,难以通过网络共享。
为保留可回退的环境,可能为虚拟机添加快照,但这会进一步显著增加虚拟机的体积。
传递虚拟机不仅传递了需要的开发环境,还传递了大量无用的软件和个人设置,难以兼顾不同开发者之间的习惯差异。
对于不同项目、用途可能存在多个虚拟机,资源冗余很大。
4. 使用虚拟机性能表现差。主机配置不高时,使用虚拟机(可能会再虚拟机内运行 IDE 等其他开发工具)会经常卡顿,降低了开发效率。
5. 使用为某一开发环境而复制来的虚拟机,迁就其环境不愿再安装合适的开发工具(如 IDE 等)。
0.3 基于 Docker 的解决方案
Docker 作为在很多场景下虚拟机的替代方案备受瞩目,其资源消耗小、为单一应用配置环境、易于通过网络共享等特点很好的解决了上面提到的诸多问题。通过 Docker 来构建 PetaLinux 开发环境,我们可以获得以下优势:
经过压缩的镜像体积只有 1GB 左右,方便网络传输。
很容易再团队中统一开发环境,包括 *** 作系统和各种库。Docker 镜像的只读特性保证了有一个可回退的一致环境。
开发环境中的依赖被 Dockerfile 清晰、明确的记录下来,具有很好的文档效应,方便团队长期共享和维护。
Docker 可以运行在之前的虚拟机的 *** 作系统上,也可以运行在一个“精简”的 *** 作系统上(如 Docker for Windows 的方式),还可以放到服务器上,运行多个容器供团队成员使用。这使得使用 Linux 环境的方式更加多样、灵活,且能减少虚拟机性能原因带来的影响
现在理想很丰满,但现实中还需要经过一番探究和试验,下面就让我们开始。
1. 构建 Docker 镜像Docker 的优势就在于我们可以使用“代码”来表示需要的环境,它既能描述环境,也能直接指导生成环境,这份“代码”就是 Dockerfile。下面详细的记述了这份 Dockerfile 的每一部分,过程中遇到的问题、解决办法、注意事项等。关于 Dockerfile,可以参考官方的 Dockerfile reference1,以及 Best pracTIces for wriTIng Dockerfiles2。
1.1 设置构建参数
Dockerfile 中允许使用 ARG 指令设置构建时参数,这些参数在 Dockerfile 中具有默认值,在构建时可以通过 --build-arg 参数指定新的值来覆盖默认值。这些参数可以在 Dockerfile 中被引用(引用方式与在 shell 中引用变量一样),但不会出现在最终的镜像里。注意一条 ARG 指令只能指定一个参数,这一点和 ENV 指令是不同的。这里我设置了两个参数如下:
ARG install_dir=/opt
ARG installer_url=172.17.0.1:8000
其中 install_dir 用来指定 PetaLinux 的安装路径,installer_url 用来指定 PetaLinux 安装包的网络地址。如果安装包在互联网上,则这里是一个访问链接,如果安装包在本地,则这里被指定为 Docker 的默认网桥,通过它联通本地网络服务器和构建时的临时容器。关于这一部分,我会在后面详述。
1.2 设置环境变量
通常情况下,PetaLinux 使用一个设置脚本来添加自身的各项工具到环境变量中,在使用相关工具前需要通过 source /setTIngs.sh 来执行脚本。但现在我要制作一个专属于 PetaLinux 的环境,完全可以把环境变量设置好来免去这个步骤。在 Dockerfile 中使用 ENV 指令来设置环境变量:
ENV PETALINUX_VER=2014.4 \
PETALINUX=${install_dir}/petalinux-v2014.4-final
ENV PATH="${PETALINUX}/tools/linux-i386/arm-xilinx-gnueabi/bin:\
${PETALINUX}/tools/linux-i386/arm-xilinx-linux-gnueabi/bin:\
${PETALINUX}/tools/linux-i386/microblaze-xilinx-elf/bin:\
${PETALINUX}/tools/linux-i386/microblazeel-xilinx-linux-gnu/bin:\
${PETALINUX}/tools/linux-i386/petalinux/bin:\
${PETALINUX}/tools/common/petalinux/bin:\
${PATH}"
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)