Yocto自定义系统中swap分区在/proc/swaps显示`(deleted)`的原因?
排查Yocto系统Swap显示
(deleted)且未被使用的问题 我之前在Yocto构建的自定义Linux系统上碰到过几乎一模一样的swap异常问题,给你梳理下排查思路和常见原因:
首先得明确:启动时第二次swapon报错“Device or resource busy”是正常现象——因为分区已经被第一次命令激活了,问题的核心是为啥启动完成后swap会变成(deleted)状态,而且无法被系统使用。
1. /etc/fstab配置错误或冲突
Yocto生成的系统很容易出现“多方式激活swap”的冲突,或者fstab本身配置有误:
- 先检查
/etc/fstab里的swap条目,我当时就是在这里踩了坑:把swap分区的UUID写错了,或者用了临时文件路径(比如/swapfile)但这个文件在启动后期被清理了,内核找不到原设备,就会标记swap为(deleted)。
执行命令查看fstab:cat /etc/fstab - 另外,如果fstab里的swap条目设置了
noauto,但你又在启动脚本里手动执行了swapon,后续systemd可能会因为无法重新挂载这个swap,把它标记为失效状态。
2. 自定义启动脚本误操作了swap
很多Yocto项目会添加自定义的初始化脚本(比如rc.local或者recipe里的启动脚本),如果脚本里有不当操作,会触发swap的失效标记:
- 比如有没有脚本执行了
swapoff但没重新激活?或者对存储设备做了分区扫描、remount操作,导致内核丢失了swap分区的关联?
可以通过系统日志定位:
如果日志里出现“swap partition has been deleted”之类的提示,就能找到是哪个脚本触发的问题。dmesg | grep -i swap journalctl -u swap.target
3. Systemd配置异常
Yocto默认用systemd管理服务,要是swap.target的配置或依赖出问题,也会导致swap异常:
- 先检查swap相关的systemd服务状态:
systemctl status dev-<your-swap-partition>.swap # 比如dev-mmcblk0p3.swap - 有些自定义的Yocto recipe可能会禁用
swap.target,或者修改了它的启动顺序,导致swap虽然被手动激活,但后续被systemd判定为无效。 - 另外,要是系统启用了
tmp.mount这类临时文件系统服务,会不会和swap分区的挂载逻辑冲突?
4. 存储设备硬件/IO问题
如果swap分区所在的存储设备(比如eMMC、SD卡)有读写错误,内核会自动失效swap分区,标记为(deleted):
- 查看存储相关的dmesg日志:
要是有分区表异常、IO错误的信息,就得检查存储设备的健康状态,或者重新格式化swap分区。dmesg | grep -i mmc # 根据你的存储设备类型调整,比如sata、nvme等
快速验证方法
可以手动重新激活swap,判断是配置问题还是硬件问题:
swapoff /dev/your-swap-partition # 先关闭(如果还能识别的话) mkswap /dev/your-swap-partition # 重新格式化(swap分区无数据,放心操作) swapon /dev/your-swap-partition
之后用swapon --show和cat /proc/swaps查看状态,如果这次能正常显示且系统开始使用swap,说明是启动过程中的配置问题,而非硬件故障。
内容的提问来源于stack exchange,提问作者gromain
相关产品推荐
相关产品推荐

