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

张开发
2026/4/9 23:48:52 15 分钟阅读

分享文章

嵌入式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 lzopCentOS / RHEL / Fedorasudo 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 consolettymxc0,115200 root/dev/nfs nfsroot服务器IP:/path/to/nfs/root,rw nfsvers3 ip板子IP:服务器IP:网关IP:子网掩码::eth0:off saveenv boot示例板子静态 IP192.168.1.123NFS 服务器 IP192.168.1.3网关192.168.1.1子网掩码255.255.255.0setenv bootargs consolettymxc0,115200 root/dev/nfs nfsroot192.168.1.3:/home/linux/nfs/rootfs,rw nfsvers3 ip192.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 consolettymxc0,115200 root/dev/mmcblk1p2 rootwait rw saveenv boot注意/dev/mmcblk1p2要根据实际分区情况修改例如有些板子的 SD 卡为/dev/mmcblk0p2。三、嵌入式Linux开发环境搭建要点结合笔记根据提供的学习笔记一个典型的嵌入式开发环境需要配置以下内容1. 网络配置Ubuntu 宿主机将虚拟机网络适配器改为桥接模式并桥接到宿主机的有线网卡。编辑/etc/network/interfaces配置静态 IPauto 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 - 0x830000004. NFS 挂载根文件系统开发板端手动挂载如果内核启动后想挂载 NFS 共享目录非根文件系统可以在开发板 Linux 系统内执行mount -o nolock,nfsvers3 192.168.1.3:/home/linux/nfs /mnt5. U-Boot 完整 NFS 启动示例setenv ipaddr 192.168.1.123 # 板子 IP setenv serverip 192.168.1.3 # TFTP/NFS 服务器 IP setenv bootargs consolettymxc0,115200 root/dev/nfs nfsroot${serverip}:/home/linux/nfs/rootfs,nfsvers3 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 failed、No vqmmc regulator found等错误通常不影响系统基本启动可后续再调试驱动。确保 NFS 服务器已正确导出目录并且防火墙允许 NFS 端口111, 2049 等。使用init/linuxrc指定根文件系统挂载后启动的第一个进程通常是 init 或 shell。总结本文解决了两个嵌入式 Linux 开发中的常见问题编译内核时缺少lzop工具通过 NFS 启动时因 DHCP 超时而卡死。同时整理了嵌入式开发环境的基本配置流程。希望这篇博客能帮助你顺利绕过这些“小坑”更专注于业务驱动的开发。遇到问题先看日志大多数错误都有明确的提示信息对症下药即可。祝你开发顺利

更多文章