Petalinux实战:从零开始为Zynq-7000定制Linux系统(附完整命令清单)
Petalinux实战:从零开始为Zynq-7000定制Linux系统(附完整命令清单)
对于刚踏入Zynq-7000世界的新手来说,面对Vivado、SDK和Linux这三座大山,常常会感到无从下手。尤其是从硬件描述到运行一个完整的定制化Linux系统,这个过程充满了各种“坑点”。Petalinux作为Xilinx官方提供的强力工具链,其价值就在于将复杂的交叉编译、内核配置、根文件系统构建等流程封装起来,提供一个相对友好的入口。但工具本身也有其学习曲线,环境变量设置、硬件描述文件导入、SD卡启动配置等环节,任何一个步骤出错都可能导致数小时的徒劳。本文旨在充当你的实战手册,我会结合自己多次从零搭建系统的经验,不仅提供清晰的命令清单,更会深入那些官方文档语焉不详的细节,比如如何与Vivado工程高效协同、如何避免SD卡分区格式化中的常见陷阱,让你能真正地“一次点亮”。
1. 环境准备与工具链部署
在动手创建第一个工程之前,一个稳定、合规的Petalinux工作环境是成功的基石。这远不止是安装一个软件那么简单,它涉及到操作系统版本、依赖库、用户权限以及环境变量等一系列前置条件的精确满足。
首先,Petalinux对宿主机的Linux发行版和版本有明确要求。以目前仍被广泛使用的2018.3版本为例,它官方支持的是Ubuntu 16.04 LTS。如果你使用更新的Ubuntu 20.04或22.04,可能会遇到各种诡异的库依赖错误。我的建议是,为嵌入式开发专门准备一个虚拟机或物理机,安装指定的Ubuntu LTS版本,这能为你省去大量排查兼容性问题的时间。安装好基础系统后,需要安装一系列必要的开发工具和库,这是一个必须完成的步骤。
sudo apt-get update
sudo apt-get install -y gcc git make net-tools libncurses5-dev tftpd-hpa \
flex bison libssl-dev libselinux1 gnupg wget diffstat chrpath socat \
xterm autoconf libtool tar unzip texinfo zlib1g-dev gcc-multilib \
build-essential libsdl1.2-dev libglib2.0-dev screen pax gawk
注意:上述命令中的包列表可能因Petalinux版本和Ubuntu版本略有差异,最稳妥的方式是查阅对应Petalinux安装指南的“Installation Requirements”章节,并逐一安装。
接下来是安装Petalinux工具本身。你需要从Xilinx官网下载对应的安装包,通常是一个巨大的.run文件。安装过程有几个关键点:
- 安装路径:不能包含任何空格或特殊字符,建议使用类似
/opt/pkg/petalinux/这样的纯英文路径。 - 用户权限:安装程序需要以普通用户(非root)身份运行,但该用户需要对安装目录有写入权限。通常需要先创建目录并修改权限。
- 磁盘空间:确保目标分区有至少50GB的可用空间,因为编译过程会产生大量中间文件。
安装完成后,最重要的步骤就是配置环境变量。每次打开新的终端进行Petalinux开发前,都必须执行以下命令:
source /opt/pkg/petalinux/2018.3/settings.sh
这条命令的作用是设置一系列必要的环境变量,如PETALINUX、PATH等,使得系统能够找到Petalinux的所有命令和工具。为了方便,大多数人会选择将这条命令添加到用户的~/.bashrc文件中,这样每次登录终端都会自动配置好环境。但这里有一个潜在的坑:如果你在同一台机器上开发多个不同版本的Petalinux项目,或者同时进行其他嵌入式开发(如使用Yocto),自动加载可能会造成环境冲突。因此,更专业的做法是不将其加入.bashrc,而是在进入项目目录后,手动执行source命令,确保环境的纯净和可控。
2. 从Vivado到Petalinux:硬件定义的桥梁
Petalinux工程的灵魂来自于硬件设计。你的Zynq-7000芯片上,PS(处理系统)和PL(可编程逻辑)是如何配置的?使用了哪些外设?这些信息都封装在Vivado导出的硬件描述文件中。这一步是软硬件协同开发的衔接点,也是最容易出错的环节之一。
在Vivado中完成Block Design设计、综合、实现并生成比特流(Bitstream)后,你需要导出硬件平台。关键操作在于“File” -> “Export” -> “Export Hardware”。在这个对话框中,务必勾选“Include bitstream”。如果不包含比特流,后续生成的启动文件将无法配置PL部分,你的自定义IP或外设将无法工作。导出后,你会得到一个.xsa文件(Vivado 2019.1及以后版本)或.hdf文件(旧版本)。这个文件就是Petalinux认识你硬件板的“身份证”。
现在,切换到你的Linux开发环境。首先创建一个Petalux工程框架:
petalinux-create --type project --template zynq --name my_zynq_linux
这条命令创建了一个基于Zynq-7000模板的工程目录my_zynq_linux。接下来,将Vivado导出的硬件描述文件(假设为design_1_wrapper.xsa)拷贝到该工程目录下,然后执行配置命令导入硬件信息:
cd my_zynq_linux
petalinux-config --get-hw-description ./
命令中的路径./表示当前目录,Petalinux会自动搜索并识别该目录下的.xsa或.hdf文件。执行此命令后,会首次进入Petalinux的顶层配置界面。这个过程实际上完成了以下几件重要工作:
- 解析硬件信息:读取PS配置(时钟、DDR、外设等)和PL的比特流信息。
- 自动生成基础设备树:根据硬件信息,生成一个包含基本节点(如CPU、内存、串口)的设备树源文件。
- 预配置内核:根据硬件中的外设(如以太网、USB、SDIO控制器),在Linux内核配置中预先使能对应的驱动。
提示:如果导入硬件描述文件后出现错误,常见原因有:文件路径错误、文件损坏、或Vivado工程中的Zynq IP配置存在Petalinux不支持的特性。请仔细核对错误信息,并回查Vivado中的硬件配置。
首次配置界面里,有几个需要关注的选项,我们可以用下表来对比其作用和推荐设置:
| 配置菜单项 | 默认设置 | 推荐操作与说明 |
|---|---|---|
| Subsystem AUTO Hardware Settings | 已使能 | 保持默认。这是最关键的部分,它允许Petalinux根据.hdf/.xsa文件自动配置FSBL、设备树和内核,极大简化了流程。 |
| Image Packaging Configuration -> Root filesystem type | INITRAMFS | 新手保持默认。INITRAMFS会将根文件系统打包进内核镜像,方便调试。量产时可根据需要改为从SD卡或NFS挂载。 |
| Image Packaging Configuration -> Copy final images to tftpboot | 未使能 | 如果后续计划通过网络(TFTP)加载内核进行调试,可以在此处使能,编译后镜像会自动复制到/tftpboot目录。 |
| Firmware Version Configuration | 与工程名相同 | 可以修改petalinux release version和product name,这会影响系统启动时的控制台提示信息。 |
完成基本检查后,保存并退出。至此,你的Petalinux工程已经与具体的硬件板卡绑定,具备了定制操作系统的基础。
3. 深度定制:内核、根文件系统与设备树
导入硬件只是搭好了舞台,真正的定制化工作现在才开始。Petalinux允许你对Linux系统的每一个核心组件进行精细调整。
内核配置是功能定制的核心。执行petalinux-config -c kernel会进入大家熟悉的Linux内核menuconfig界面。对于新手,庞大的选项令人望而生畏。我建议采取渐进式策略:
- 首次保持默认:Petalinux根据硬件已预配置了必要的驱动,直接编译通常就能得到一个可启动的最小系统。
- 按需添加驱动:当你需要连接摄像头、特定传感器或启用高级网络功能时,再来这里搜索并启用对应的驱动模块。例如,需要USB Wi-Fi适配器,可以导航到
Device Drivers -> Network device support -> Wireless LAN进行选择。 - 优化内核尺寸:对于资源紧张的Zynq-7000器件(如Z-7010),可以移除不需要的驱动和功能来减小内核体积,缩短启动时间。
根文件系统配置决定了系统启动后能运行哪些命令和应用程序。通过petalinux-config -c rootfs可以进入根文件系统的配置界面。这里分为多个类别:
Filesystem Packages:这是最常用的部分,你可以像在Ubuntu上用apt一样,选择需要安装的软件包,例如openssh(用于SSH登录)、iperf3(网络性能测试)、python3等。User Packages:如果你有自己编写的应用程序,可以在这里指定源码路径,Petalinux会将其编译并打包进根文件系统。Image Features:可以启用一些特性,如debug-tweaks会允许root用户空密码登录(仅限开发调试,生产环境务必禁用!)。
一个常见的需求是在根文件系统中预置自己的文件或脚本。这需要通过Petalinux的“recipes”机制来实现。例如,你想在系统启动时自动运行一个脚本my_startup.sh,并预置一个配置文件my_app.conf,你需要:
- 在
project-spec/meta-user/recipes-core/目录下创建或修改配方文件。 - 编写
.bbappend文件,在其中指定文件来源和安装到根文件系统的目标路径。 - 重新编译工程,你的文件就会被包含进去。
设备树定制是连接硬件与操作系统的关键。Petalinux自动生成的设备树(位于components/plnx_workspace/device-tree/device-tree/)已经包含了PS端的基础信息。但如果你在PL端自定义了IP核(如一个AXI GPIO、一个自定义的通信接口),就必须手动为这个IP核添加设备树节点。添加的位置在project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi。例如,为一个名为my_axi_gpio_0的IP添加节点:
/ {
amba_pl: amba_pl {
#address-cells = <1>;
#size-cells = <1>;
compatible = "simple-bus";
ranges ;
my_axi_gpio_0: gpio@a0000000 {
#gpio-cells = <2>;
compatible = "xlnx,xps-gpio-1.00.a";
gpio-controller ;
reg = <0xa0000000 0x10000>;
xlnx,all-inputs = <0x0>;
xlnx,all-outputs = <0x1>;
xlnx,dout-default = <0x00000000>;
xlnx,gpio-width = <0x8>;
xlnx,tri-default = <0xFFFFFFFF>;
};
};
};
修改后,Petalinux在编译时会自动将此文件的内容合并到最终的设备树(.dtb)中。内核启动时,相应的驱动程序就能根据这个节点找到并初始化你的硬件。
4. 编译、打包与SD卡启动全流程
所有配置完成后,就可以进入编译阶段。在工程根目录下执行petalinux-build。这是一个漫长的过程,Petalinux会依次编译U-Boot、设备树、Linux内核和根文件系统。首次编译可能需要30分钟到数小时,取决于你的电脑性能。编译过程中如果报错,需要仔细查看日志,常见问题包括网络问题导致软件包下载失败、宿主机的库版本不兼容等。
编译成功的关键标志是在images/linux/目录下生成一系列文件,其中最重要的有:
image.ub:这是一个FIT(Flattened Image Tree)镜像,它可能内嵌了内核(Image)、设备树(system.dtb)和根文件系统(rootfs.cpio.gz)。这是Petalinux默认的打包方式,方便单一文件启动。BOOT.BIN:Zynq的启动镜像,由FSBL(First Stage Bootloader)、FPGA比特流文件和U-Boot组合而成。- 单独的
Image、system.dtb、rootfs.cpio.gz或rootfs.ext4:如果你在配置中选择了不同的打包方式,这些文件会单独存在。
接下来是制作启动SD卡。这是另一个“坑”点密集的区域。你需要一张至少8GB的SD卡,并使用读卡器连接到开发主机。
第一步,正确识别SD卡设备。 使用lsblk或sudo fdisk -l命令,确认SD卡对应的设备节点,例如/dev/sdb。务必再三确认,误操作会格式化你的硬盘!
第二步,分区与格式化。 Zynq-7000从SD卡启动需要一个特定的分区结构:
- 第一个分区:FAT32格式,用于存放
BOOT.BIN和image.ub(或Image、system.dtb等)。容量通常100MB就足够。 - 第二个分区(可选):EXT4格式,用于存放额外的文件或作为根文件系统的挂载点。如果根文件系统较大或需要持久化存储,就需要这个分区。
可以使用图形化工具gparted,也可以使用命令行fdisk和mkfs。以下是一个命令行示例,假设SD卡是/dev/sdb:
sudo fdisk /dev/sdb
# 在fdisk交互界面中,依次输入:
# g (创建新的GPT分区表)
# n (新建分区,分区号1,起始扇区默认,大小+100M)
# t (更改分区类型,选择1,类型为“EFI System”或“W95 FAT32 (LBA)”)
# n (新建分区,分区号2,起始扇区默认,大小使用剩余所有空间)
# w (写入并退出)
# 格式化分区
sudo mkfs.vfat -F 32 -n boot /dev/sdb1
sudo mkfs.ext4 -L rootfs /dev/sdb2
第三步,拷贝文件。 挂载第一个FAT32分区,并将编译产物拷贝进去:
sudo mount /dev/sdb1 /mnt/boot
cp images/linux/BOOT.BIN /mnt/boot/
cp images/linux/image.ub /mnt/boot/ # 如果使用单一image.ub
# 或者,如果使用分离文件:
# cp images/linux/Image /mnt/boot/
# cp images/linux/system.dtb /mnt/boot/
# cp images/linux/rootfs.cpio.gz /mnt/boot/ # 或 rootfs.ext4
sync
sudo umount /mnt/boot
注意:
sync命令确保所有缓存数据写入SD卡,在拔卡前执行此命令或安全弹出设备非常重要,可以避免文件损坏。
最后,将SD卡插入开发板,设置启动模式为SD卡模式(通过调整板上的跳线帽),上电。如果一切顺利,你将在串口终端(如使用minicom或picocom,波特率通常为115200)看到U-Boot的启动日志,随后是Linux内核的解压、初始化信息,最终出现登录提示符petalinux login:。默认的用户名和密码都是root。看到这个提示符,恭喜你,一个为你的硬件量身定制的Linux系统已经成功运行起来了!
更多推荐



所有评论(0)