news 2026/5/25 23:30:43

Zynq 板卡 NFS 启动 eMMC rootfs 修复流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Zynq 板卡 NFS 启动 eMMC rootfs 修复流程

环境信息

角色IP 地址
NFS 服务器 (Linux VM)192.168.0.133
Zynq 板卡192.168.0.100
PC192.168.0.106
rootfsrootfs.tar.gz

源文件只需要板卡的rootfs.tar.gz

U-Boot 关键变量 (来自printenv)

设置IP地址

setenv ipaddr 192.168.0.100 # Zynq 板卡 IP setenv serverip 192.168.0.133 # NFS 服务器 IP
kernel_image=uImage devicetree_image=devicetree.dtb kernel_load_addr=0x2080000 devicetree_load_addr=0x2000000 image_path=/ ipaddr=192.168.0.100 serverip=192.168.0.133 rootfs_partition=/dev/mmcblk0p2 bitstream_image=fpga.bit loadbit_addr=0x1000000 bootargs=console=ttyPS1,115200 earlyprintk rootfstype=ext4 rootwait clk_ignore_unused uio_pdrv_genirq.of_id=generic-uio

一、准备工作 (PC 端)

1. 从 rootfs.tar.gz 生成 rootfs.img(eMMC 直接烧写用)

# 方法一:使用 mkfs.ext4 -d(推荐) mkdir rootfs_tmp sudo tar -xzf rootfs.tar.gz -C rootfs_tmp sudo chown -R root:root rootfs_tmp dd if=/dev/zero of=rootfs.img bs=1M count=2000 # count 根据实际 rootfs 大小调整,略大于解压后占用空间即可 sudo mkfs.ext4 -F -d rootfs_tmp rootfs.img sudo rm -rf rootfs_tmp # 方法二:loop 挂载法 dd if=/dev/zero of=rootfs.img bs=1M count=2000 sudo mkfs.ext4 -F rootfs.img sudo mkdir -p /mnt/rootfs sudo mount -o loop rootfs.img /mnt/rootfs sudo tar -xzf rootfs.tar.gz -C /mnt/rootfs sudo chown -R root:root /mnt/rootfs sudo umount /mnt/rootfs

生成后的rootfs.img可通过dd if=rootfs.img of=/dev/mmcblk0p2 bs=1M直接写入 eMMC。


二、NFS 服务端搭建 (192.168.0.133)

1. 安装 NFS 服务

sudo apt update sudo apt install nfs-kernel-server -y

2. 准备 rootfs(NFS 导出用)

# 创建 NFS 导出目录 sudo mkdir -p /home/admin/workspace/nfs_rootfs # 上传并解压 rootfs.tar.gz 到 NFS 目录 cd /home/admin/workspace/nfs_rootfs sudo tar -xzf rootfs.tar.gz sudo chown -R root:root . rm -f rootfs.tar.gz

3. 配置 NFS 导出

# 编辑 /etc/exports,添加: sudo tee -a /etc/exports <<'EOF' /home/admin/workspace/nfs_rootfs 192.168.0.0/24(rw,sync,no_root_squash,no_subtree_check,insecure) EOF # 应用导出 sudo exportfs -ra # 验证 sudo exportfs -v showmount -e 192.168.0.133

4. 防火墙

# 如果 ufw 开启,放行 NFS 相关端口 sudo ufw allow from 192.168.0.0/24 to any port nfs sudo ufw allow from 192.168.0.0/24 to any port 111 # 或直接关闭 sudo ufw disable

5. 自测

sudo mount -t nfs -o nfsvers=3 192.168.0.133:/home/admin/workspace/nfs_rootfs /mnt ls /mnt/ sudo umount /mnt

三、板卡 U-Boot NFS 启动

板卡上电,在倒计时内按任意键打断 autoboot,进入 U-Boot 命令行:

# 1. 加载 FPGA bitstream(必须,否则外设不工作) fatload mmc 0:1 ${loadbit_addr} ${image_path}/${bitstream_image} fpga loadb 0 ${loadbit_addr} ${filesize} echo FPGA load OK # 2. 从 eMMC FAT 分区加载内核 fatload mmc 0:1 ${kernel_load_addr} ${image_path}/${kernel_image} # 3. 从 eMMC FAT 分区加载设备树 fatload mmc 0:1 ${devicetree_load_addr} ${image_path}/${devicetree_image} # 4. 设置 bootargs 为 NFS root setenv bootargs 'console=ttyPS1,115200 root=/dev/nfs rw nfsroot=192.168.0.133:/home/admin/workspace/nfs_rootfs,nfsvers=3 ip=192.168.0.100:192.168.0.133:192.168.0.1:255.255.255.0::eth0:off' # 5. 启动内核 bootm ${kernel_load_addr} - ${devicetree_load_addr}

ip 参数格式:ip=<板卡IP>:<服务器IP>:<网关>:<掩码>::<网卡>:off


四、修复 eMMC rootfs 分区

NFS 启动进入系统后执行:

# 1. 格式化 mmcblk0p2 umount /dev/mmcblk0p2 2>/dev/null mkfs.ext4 -F /dev/mmcblk0p2 # 2. 挂载 eMMC rootfs mount /dev/mmcblk0p2 /mnt # 3. 从当前 NFS 根文件系统复制全部内容 tar cf - \ --exclude=/proc \ --exclude=/sys \ --exclude=/dev \ --exclude=/run \ --exclude=/tmp \ --exclude=/mnt \ --exclude=/lost+found \ / | tar xf - -C /mnt # 4. 创建必要的空目录 mkdir -p /mnt/proc /mnt/sys /mnt/dev /mnt/run /mnt/tmp /mnt/mnt chmod 1777 /mnt/tmp # 5. 卸载并重启 sync umount /mnt reboot

重启后板卡将以 eMMC ext4 rootfs 正常启动,无需再依赖 NFS。


五、故障排查

板卡无法 ping 通 NFS 服务器

# 在 U-Boot 中测试 ping 192.168.0.133

NFS mount 失败 (access denied)

  • 检查/etc/exports中 IP 网段是否正确 (192.168.0.0/24)
  • 检查 NFS 服务是否运行:sudo systemctl status nfs-kernel-server
  • 检查是否有防火墙:sudo ufw status

内核不支持 NFS root

如果启动时报 "VFS: Unable to mount root fs",说明内核未编译 NFS 客户端支持,需要重新编译内核开启CONFIG_ROOT_NFSCONFIG_NFS_FS

mountd 端口随机变化

NFS mountd 默认使用随机端口,如果中间有防火墙可能需要固定端口:

# 编辑 /etc/default/nfs-kernel-server sudo sed -i 's/^RPCMOUNTDOPTS=.*/RPCMOUNTDOPTS="--port 40000"/' /etc/default/nfs-kernel-server sudo systemctl restart nfs-kernel-server
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 23:28:46

AI学习 - 大模型基础入门

AI学习 - 大模型基础入门 从零开始&#xff1a;Ollama 安装 → 本地模型运行 → Python 代码接入 → 理解核心概念 摘要 本文记录了在 Windows 上使用 Ollama 部署本地大模型、并通过 Python 代码接入调用的完整过程。内容涵盖&#xff1a;Ollama 安装与模型拉取、大模型基础概…

作者头像 李华
网站建设 2026/5/25 23:27:13

skills CANN开源社区贡献技能包开发指南

前言 开源社区的健康运转&#xff0c;不仅依赖核心代码的贡献&#xff0c;还需要降低贡献门槛、提供清晰的指南和自动化工具。skills仓库是CANN开源社区的"贡献技能包"&#xff0c;提供了一系列辅助脚本、代码模板、CI检查和文档生成工具&#xff0c;帮助新手快速上…

作者头像 李华
网站建设 2026/5/25 23:26:35

特斯拉与SpaceX软件开发体系

特斯拉与SpaceX软件开发体系 摘要 特斯拉与SpaceX作为埃隆马斯克领导下的两家标志性科技企业&#xff0c;在地面交通电动化和太空探索两个领域分别建立了独特的软件开发体系。本文基于公开的技术演讲、招聘信息、工程师访谈及行业分析资料&#xff0c;从软件开发模式、团队人…

作者头像 李华
网站建设 2026/5/25 23:21:05

Android 高频面试题汇总,26 道经典考题轻松应对面试

前言 面试时总被面试官挖的Android基础题掉坑里&#xff1f;整理了26道面试题 &#xff0c;牢固你的基础&#xff01;&#xff08;附《Android开发面试题以及答案整理》&#xff01;&#xff09; 1.如何对 Android 应用进行性能分析 2.什么情况下会导致内存泄露 3.如何避免 …

作者头像 李华