当前位置: 首页 > news >正文

嵌入式Linux开发常见问题解决:内核编译与NFS根文件系统启动卡住

在移植Linux系统到ARM开发板的过程中,编译内核和通过NFS启动根文件系统是两个常见环节,但也经常遇到各种“小坑”。本文结合两个实际案例,分析问题原因并给出解决方案。


一、编译内核时出现lzop: not found错误

问题现象

在执行make zImage编译内核时,终端输出类似如下错误:

/bin/sh: 1: lzop: not found arch/arm/boot/compressed/Makefile:180: recipe for target 'arch/arm/boot/compressed/piggy.lzo' failed make[2]: *** [arch/arm/boot/compressed/piggy.lzo] Error 1 make[1]: *** [arch/arm/boot/compressed/vmlinux] Error 2 make: *** [zImage] Error 2

原因分析

内核编译过程中,为了生成压缩的内核映像zImage,需要根据配置(如CONFIG_KERNEL_LZO)将内核映像压缩为 LZO 格式。Makefile 会调用系统命令lzop来完成压缩。 你的系统中没有安装lzop工具,导致 Shell 找不到该命令,从而编译失败。

解决方案

安装lzop即可:

Ubuntu / Debian 系统:

sudo apt-get update sudo apt-get install lzop

CentOS / RHEL / Fedora:

sudo yum install lzop # 或 sudo dnf install lzop

安装完成后,重新执行编译命令,问题解决。

💡 提示:如果希望使用其他压缩格式(如 gzip、xz),可以在内核配置中修改CONFIG_KERNEL_*选项,但安装lzop是最直接的方法。


二、内核启动卡在Sending DHCP requests ... timed out!

问题现象

开发板上电后,串口输出如下信息并卡住,不再继续启动:

fec 20b4000.ethernet eth0: Link is up - 100Mbps/Full - flow control rx/tx Sending DHCP requests ...... timed out! IP-Config: Retrying forever (NFS root)... fec 20b4000.ethernet eth0: Freescale FEC PHY driver [Generic PHY] ... Sending DHCP requests ...... ... (无限重试)

原因分析

从日志中的IP-Config: Retrying forever (NFS root)...可以看出,内核启动参数(bootargs)配置为使用 NFS 作为根文件系统(root=/dev/nfs),并且没有指定静态 IP,因此内核尝试通过 DHCP 自动获取 IP 地址。 但网络中并没有 DHCP 服务器(例如开发板直连 PC 主机,而主机未开启 DHCP 服务),导致 DHCP 请求超时,内核进入无限重试状态,从而“卡死”在启动阶段。

解决方案

有三种常用的解决方法,根据你的实际网络环境选择一种即可。

方案一:使用静态 IP 配置 NFS 根文件系统(推荐)

在 U-Boot 命令行中修改bootargs,添加静态 IP 参数,格式如下:

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=<服务器IP>:/path/to/nfs/root,rw nfsvers=3 ip=<板子IP>:<服务器IP>:<网关IP>:<子网掩码>::eth0:off' saveenv boot

示例:

  • 板子静态 IP:192.168.1.123

  • NFS 服务器 IP:192.168.1.3

  • 网关:192.168.1.1

  • 子网掩码:255.255.255.0

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.3:/home/linux/nfs/rootfs,rw nfsvers=3 ip=192.168.1.123:192.168.1.3:192.168.1.1:255.255.255.0::eth0:off' saveenv boot

📌 注意:nfsroot路径是 NFS 服务器上导出(export)的根文件系统目录,需要提前配置好/etc/exports并启动 NFS 服务。

方案二:搭建 DHCP 服务器(如果必须使用动态 IP)

若开发环境要求使用 DHCP,可以在 PC 主机(Ubuntu)上安装 DHCP 服务器:

sudo apt-get install isc-dhcp-server

配置/etc/dhcp/dhcpd.conf,例如:

subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.100 192.168.1.200; option routers 192.168.1.1; option domain-name-servers 8.8.8.8; }

并将网卡接口(如ens33)加入 DHCP 服务,然后启动服务:

sudo systemctl restart isc-dhcp-server

确保开发板与主机在同一网段,重启开发板,内核即可通过 DHCP 获取 IP 并挂载 NFS。

方案三:改为从本地存储启动(不使用 NFS)

如果开发板上已经烧写了根文件系统(例如在 SD 卡或 eMMC 中),可以直接从本地分区启动:

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw' saveenv boot

注意:/dev/mmcblk1p2要根据实际分区情况修改,例如有些板子的 SD 卡为/dev/mmcblk0p2


三、嵌入式Linux开发环境搭建要点(结合笔记)

根据提供的学习笔记,一个典型的嵌入式开发环境需要配置以下内容:

1. 网络配置(Ubuntu 宿主机)

  • 将虚拟机网络适配器改为桥接模式,并桥接到宿主机的有线网卡。

  • 编辑/etc/network/interfaces配置静态 IP:

auto ens33 iface ens33 inet static address 192.168.1.3 netmask 255.255.255.0 gateway 192.168.1.1
  • 重启网络服务或虚拟机。

2. U-Boot 环境变量常用命令

命令说明
printenv查看所有环境变量
setenv name value设置变量
setenv name删除变量
saveenv保存变量
ping <ip>测试网络连通性
tftp <addr> <file>通过 TFTP 下载文件到内存

3. 通过 TFTP 下载内核和设备树

tftp 0x80800000 zImage tftp 0x83000000 myboard.dtb bootz 0x80800000 - 0x83000000

4. NFS 挂载根文件系统(开发板端手动挂载)

如果内核启动后想挂载 NFS 共享目录(非根文件系统),可以在开发板 Linux 系统内执行:

mount -o nolock,nfsvers=3 192.168.1.3:/home/linux/nfs /mnt

5. U-Boot 完整 NFS 启动示例

setenv ipaddr 192.168.1.123 # 板子 IP setenv serverip 192.168.1.3 # TFTP/NFS 服务器 IP setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=${serverip}:/home/linux/nfs/rootfs,nfsvers=3 ip=${ipaddr}:${serverip}:192.168.1.1:255.255.255.0::eth0:off' tftp 0x80800000 zImage tftp 0x83000000 myboard.dtb bootz 0x80800000 - 0x83000000

四、其他注意事项

  • 日志中出现的wm8960: probe failedNo vqmmc regulator found等错误,通常不影响系统基本启动,可后续再调试驱动。

  • 确保 NFS 服务器已正确导出目录,并且防火墙允许 NFS 端口(111, 2049 等)。

  • 使用init=/linuxrc指定根文件系统挂载后启动的第一个进程(通常是 init 或 shell)。


总结

本文解决了两个嵌入式 Linux 开发中的常见问题:

  1. 编译内核时缺少lzop工具;

  2. 通过 NFS 启动时因 DHCP 超时而卡死。

同时整理了嵌入式开发环境的基本配置流程。希望这篇博客能帮助你顺利绕过这些“小坑”,更专注于业务驱动的开发。

遇到问题先看日志,大多数错误都有明确的提示信息,对症下药即可。祝你开发顺利!

http://www.jsqmd.com/news/615334/

相关文章:

  • 记一次综合型流量分析 | 添柴不加火酪
  • 2026年充电桩服务优质企业最新推荐:7kw交流充电桩、220V充电桩、30kw、60kw直流充电桩、江苏安科瑞电能以专业设备助力绿色出行 - 海棠依旧大
  • Pyfa:EVE Online舰船配置的离线解决方案
  • Spire实现Wod与Pdf相互转换
  • 将盾CDN:安全架构设计中的纵深防御理念
  • X.25是在公用数据网上以分组方式进行操作的DTE(数据终端设备)和DCE(数据通信设备)之间的接口规范
  • 加州大学洛杉矶分校、腾讯混元等推出Unify-Agent
  • 【毫米波混合波束成形】第9章 多用户MIMO与干扰抑制的深度学习
  • 2026年优质黑莓原浆产品及相关企业最新参考推荐:纳富山有机黑莓原浆、生态黑莓饮品、非浓缩黑莓原浆、天然黑莓原浆、有机莓果原浆、无添加黑莓汁、以天然品质守护健康饮食 - 海棠依旧大
  • 3、主从复制实现同步数据过滤
  • 基于电气距离与区域调节能力的分布式最优潮流控制技术
  • Agent能和企业现有 SaaS 工具打通吗?深度拆解2026年企业级智能体集成路径与实战指南
  • 将盾CDN:代码审计与安全测试的方法论
  • 面试题设计模式
  • 、SEATA分布式事务——XA模式泳
  • 无后门无恶意代码,精选安全可靠的企业级源码,经过严格测试,保障系统稳定运行
  • 超流体真空理论:光速本质、微观粒子结构与量子纠缠拓扑机制
  • 将盾CDN:身份与访问管理的最佳实践
  • 2026年哈尔滨婚纱摄影靠谱机构最新推荐:法式婚纱照、新中式婚纱照、生日写真、森系婚纱照、草坪婚纱照、韩式婚纱照、、哈尔滨禧禾婚纱摄影工作室,以匠心定格爱情,用镜头留存美好 - 海棠依旧大
  • 《零基础入门Spark》学习笔记 Day 13
  • 高效光伏电池建模技术分享:Boost Buck电路实现最大功率追踪
  • Java 线程、进程、CPU缓存、MESI
  • Untrunc视频修复工具:让损坏的MP4文件重获新生
  • 微软常用运行库 安装教程:一键修复VC++运行环境(AIO合集)
  • 将盾CDN:业务安全与反欺诈的实战策略
  • 用 AI Coding 工具生成 万字奇幻世界设定的实践记录滥
  • TrailBase 与 PocketBase 详细对比
  • 将盾CDN:移动应用安全合规的实践指南
  • ESP32/8266利用闪存文件系统创建 Web服务实现交互控制
  • GLM-. 全面支持与 Gemini CLI 集成:HagiCode 的多模型进化之路赂