欢迎光临
我们一直在努力

保姆级教程十三:突破内存极限!ZYNQ PetaLinux 根文件系统挂载 SD 卡 EXT4 分区(生产环境必备)

保姆级教程十三:突破内存极限!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 操作):

  • 把你的 SD 卡通过读卡器插到电脑上。
  • 下载并打开免费软件 DiskGenius。
  • 找到你的 SD 卡,右键选择 “删除所有分区”(⚠️ 警告:提前备份好里面的重要资料!),点击左上角“保存更改”。
  • 右键 SD 卡的空闲区域 -> 建立新分区:
    • 文件系统类型选:FAT32
    • 新分区大小填:1024 MB (1GB)
    • 卷标写:BOOT
  • 再次右键剩下的空闲区域 -> 建立新分区:
    • 文件系统类型选:EXT4(注意:Windows 本身不认 EXT4,但 DiskGenius 能分)
    • 大小选:默认全包(剩下的所有空间)
    • 卷标写:rootfs
  • 点击左上角 “保存更改”,等待格式化完成。拔下 SD 卡,准备去 Ubuntu 虚拟机里干活。 在这里插入图片描述

  • 🛠️ 第二步:PetaLinux 重新配置“户口本”

    SD 卡准备好了,接下来要告诉 PetaLinux:“以后开机,不要把系统解压到内存了,去 SD 卡的第二个分区里找系统!”

    回到 Ubuntu 虚拟机里的 PetaLinux 工程目录,输入:

    petalinux-config

    在弹出的蓝色菜单中,依次进入:

  • Image Packaging Configuration —>
  • 找到 Root filesystem type,按回车。
  • 将默认的 (X) INITRAMFS 改为 (X) EXT4 (SD/eMMC),按回车确认。
  • 此时下方会出现一个 Device node of SD device,默认是 /dev/mmcblk0p2。这正是代表 SD 卡的第二个分区!保持默认即可。
  • 按 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 开机绝对死机!

    正确做法:

  • 把分好区的 SD 卡插到电脑上,并挂载连接到你的 Ubuntu 虚拟机中。
  • Ubuntu 会自动识别到 BOOT 和 rootfs 两个盘。
  • 打开 Ubuntu 终端,找到 rootfs 这个 EXT4 分区的挂载路径(通常在 /media/你的用户名/rootfs)。
  • 将 PetaLinux 编译出来的 rootfs.tar.gz 解压到这个分区。必须加上 sudo!!
  • # 假设你的 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)!

    终极测试:断电不丢失!

  • 在终端输入 touch /home/root/never_lose_my_data.txt 创建一个文件。
  • 暴力拔掉开发板电源!
  • 重新上电开机。
  • 输入 ls /home/root/。 文件依然安静地躺在那里!你终于拥有了一个真正意义上的持久化嵌入式操作系统!

  • ❓ 常见问题排雷 (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 服务器!

    赞(0)
    未经允许不得转载:171主机测评 » 保姆级教程十三:突破内存极限!ZYNQ PetaLinux 根文件系统挂载 SD 卡 EXT4 分区(生产环境必备)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址