保姆级教程十三:突破内存极限!ZYNQ PetaLinux 根文件系统挂载 SD 卡 EXT4 分区(生产环境必备)
文章目录
- 保姆级教程十三:突破内存极限!ZYNQ PetaLinux 根文件系统挂载 SD 卡 EXT4 分区(生产环境必备)
-
- 💾 第一步:给 SD 卡进行“物理分家”(极其关键)
- 🛠️ 第二步:PetaLinux 重新配置“户口本”
- 🚀 第三步:编译并见证 `image.ub` 的瘦身
- 📦 第四步:烧录系统(地狱级大坑预警 ⚠️)
-
- 1. 烧录 BOOT 分区 (在 Windows 或 Ubuntu 下皆可)
- 2. 烧录 EXT4 根文件系统分区 (⚠️ 必须在 Ubuntu 下进行!)
- 🎉 第五步:开机,享受无限容量的快感!
-
- 终极测试:断电不丢失!
- ❓ 常见问题排雷 (FAQ)
很多 ZYNQ 玩家在加入 Python、OpenCV、QT 等大型库后,都会遇到系统跑着跑着就 Out of Memory (OOM) 死机崩溃的情况。同时,每次重启后写好的代码和保存的图片全部丢失,让人极其崩溃。
这是因为 PetaLinux 默认使用的是 INITRAMFS(内存虚拟盘) 机制。
今天,我们将彻底抛弃这种“玩具级”的玩法,带你实操企业里最标准的做法:给 SD 卡分两个区,将根文件系统(Rootfs)永远固化在 SD 卡的高速 EXT4 分区中! 容量多大,你的 Linux 系统盘就有多大!断电再也不丢数据! 
💾 第一步:给 SD 卡进行“物理分家”(极其关键)
在这之前,我们的 SD 卡只有一个 FAT32 分区。现在,我们需要把它分成两个区:
- 分区 1(BOOT):格式为 FAT32,大小 1GB 足够。专门用来放引导文件(BOOT.BIN, image.ub, boot.scr)。因为 ZYNQ 底层的芯片只认识 FAT32,开机必须从这里启动。
- 分区 2(RootFS):格式为 EXT4(Linux专属格式),占用剩余所有空间。专门用来放庞大的 Linux 操作系统文件。
操作步骤(推荐在 Windows 下用 DiskGenius 操作):
- 文件系统类型选:FAT32
- 新分区大小填:1024 MB (1GB)
- 卷标写:BOOT
- 文件系统类型选:EXT4(注意:Windows 本身不认 EXT4,但 DiskGenius 能分)
- 大小选:默认全包(剩下的所有空间)
- 卷标写:rootfs

🛠️ 第二步:PetaLinux 重新配置“户口本”
SD 卡准备好了,接下来要告诉 PetaLinux:“以后开机,不要把系统解压到内存了,去 SD 卡的第二个分区里找系统!”
回到 Ubuntu 虚拟机里的 PetaLinux 工程目录,输入:
petalinux-config
在弹出的蓝色菜单中,依次进入:
按 Esc 退出并选择 <Yes> 保存。 
🚀 第三步:编译并见证 image.ub 的瘦身
执行全量编译:
petalinux-build
🔍 编译完后,你会发现一个极其震撼的现象: 去 images/linux/ 目录下看一眼 image.ub 的大小。以前装了 OpenCV 可能有 80MB,现在竟然瘦身到了只有区区 5MB 左右!
为什么?因为现在 image.ub 里只剩下 Linux 内核和设备树了,那个庞大臃肿的文件系统被单独剥离出来了!
剥离出来的文件在哪? 就在同一个目录下,你会发现多了一个叫 rootfs.tar.gz 的压缩包。这就是我们整个 Linux 系统的肉体!
📦 第四步:烧录系统(地狱级大坑预警 ⚠️)
这一步是全网 90% 新手栽跟头的地方,请严格逐字阅读!
1. 烧录 BOOT 分区 (在 Windows 或 Ubuntu 下皆可)
这一步没变化。把打包好的引导文件拷进 SD 卡的第一个 FAT32 分区(BOOT):
# 还是先打包 BOOT.BIN
petalinux-package –boot –fsbl images/linux/zynq_fsbl.elf –fpga images/linux/system.bit –u-boot –force
把 BOOT.BIN、瘦身后的 image.ub、以及 boot.scr(极其重要,它是启动脚本) 这三个文件,复制到 SD 卡的 FAT32 分区中。
2. 烧录 EXT4 根文件系统分区 (⚠️ 必须在 Ubuntu 下进行!)
绝对、千万、一定不要把 rootfs.tar.gz 拿到 Windows 下解压后再拷进 SD 卡! Windows 不支持 Linux 的权限机制(比如 root 权限、软链接),如果你在 Windows 下解压,Linux 开机绝对死机!
正确做法:
# 假设你的 PetaLinux 工程在 ~/my_linux_prj
# 假设 SD 卡 EXT4 分区挂载在 /media/ubuntu/rootfs
cd /media/ubuntu/rootfs
sudo tar -xzf ~/my_linux_prj/images/linux/rootfs.tar.gz
解压完成后,输入 sync 命令确保数据写入 SD 卡。 现在,打开 rootfs 分区,你会看到里面躺着熟悉的 bin, etc, home, usr, var 等经典的 Linux 系统目录!
🎉 第五步:开机,享受无限容量的快感!
把 SD 卡插回 ZYNQ-7030 开发板,打开电源!
盯着串口终端,你会看到内核启动日志中闪过这样一行字:
Waiting for root device /dev/mmcblk0p2…
EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode.
VFS: Mounted root (ext4 filesystem) on device 179:2.
这意味着 Linux 内核成功找到了 SD 卡的第二个分区,并从中启动了系统!
登录 root 账户后,输入终极验收命令:
df -h
你会震撼地看到挂载在 / (根目录) 上的设备是 /dev/root,而它的可用容量,竟然是你 SD 卡的总容量(比如 14GB、28GB)!
终极测试:断电不丢失!
❓ 常见问题排雷 (FAQ)
Q1:开机卡死在 Waiting for root device /dev/mmcblk0p2… 无限循环?
- 原因 1:你把 SD 卡的第二个分区格式化成 FAT32 或 NTFS 了,内核不认。必须是 EXT4。
- 原因 2:你在 Windows 下解压了文件。
- 原因 3:你解压 rootfs.tar.gz 的时候忘记加 sudo 了,导致系统关键文件没有 root 权限,内核拒绝加载。回去 Ubuntu 重新 sudo tar 一遍。
Q2:启动时提示 Kernel panic – not syncing: No working init found?
- 原因:同上,权限全丢了,或者你解压的时候多嵌套了一层文件夹(比如解压成 /rootfs/rootfs/bin),Linux 要求 /bin, /etc 必须在 EXT4 分区的最顶层根目录下!
Q3:我换了这种方式后,以后每次改完 C/Python 代码,还要重新烧整张 SD 卡吗?
- 绝对不需要! 这就是挂载 EXT4 的最大魅力!如果你写了新的 Python 脚本或 C 语言程序,只需通过局域网 SSH(比如 MobaXterm)把文件拖进板子里即可。由于它是持久化保存的,重启依然有效。你只在修改底层 FPGA 硬件 (XSA) 时,才需要更新 BOOT.BIN。
结语: 兄弟们,完成这一步,你的 ZYNQ-7030 已经彻底从一个“评估板”蜕变成了一台“微型工业电脑”。你现在有无限的 SD 卡空间去跑 OpenCV,去保存摄像头抓拍的图像,去建立 SQLite 数据库,甚至去装一个 Node.js 跑 Web 服务器!

