内核kmemleak无法启动,执行echo scan提示Operation not permitted求助
问题与解决方案
问题概述
硬件部署Yocto镜像后出现内核内存泄漏,计划启用kmemleak排查,但遇到以下问题:
- 执行
cat /sys/kernel/debug/kmemleak无输出,dmesg显示kmemleak: Kernel memory leak detector disabled - 执行
echo scan > /sys/kernel/debug/kmemleak提示-sh: echo: write error: Operation not permitted - 内核编译时已开启kmemleak相关配置,debugfs正常挂载,启动参数无
kmemleak=off
已验证的配置与操作
内核配置(zcat /proc/config.gz | grep CONFIG_DEBUG_KMEMLEAK)
CONFIG_DEBUG_KMEMLEAK=y CONFIG_DEBUG_KMEMLEAK_MEM_POOL_SIZE=2048 CONFIG_DEBUG_KMEMLEAK_TEST=m CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y CONFIG_DEBUG_KMEMLEAK_AUTO_SCAN=y
系统状态检查输出
$ dmesg | grep kmemleak kmemleak: Kernel memory leak detector disabled $ mount -t debugfs nodev /sys/kernel/debug/ mount: /sys/kernel/debug: nodev already mounted or mount point busy. $ cat /proc/mounts | grep debugfs debugfs /sys/kernel/debug debugfs rw,nosuid,nodev,noexec,relatime 0 0 $ ls -l /sys/kernel/debug/kmemleak -rw-r--r-- 1 root root 0 Jan 4 04:30 /sys/kernel/debug/kmemleak $ mount | grep debug cgroup on /sys/fs/cgroup/debug type cgroup (rw,nosuid,nodev,noexec,relatime,debug) debugfs on /sys/kernel/debug type debugfs (rw,nosuid,nodev,noexec,relatime)
启动参数(cat /proc/cmdline)
BOOT_IMAGE=/boot/bzImage root=/dev/sda2 console=tty0,115200n8 console=ttyS0,115200n8 console=ttyO0,115200n8 console=ttyAMA0,115200n8 rootwait
解决步骤
修改内核默认启用配置
当前CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y会让kmemleak默认禁用,将其改为CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=n,重新编译内核并更新Yocto镜像,kmemleak会在系统启动时自动启用。临时启用kmemleak(无需重新编译场景)
尝试先写入start命令启用kmemleak,再执行扫描:echo start > /sys/kernel/debug/kmemleak echo scan > /sys/kernel/debug/kmemleak若仍提示权限问题,检查安全模块状态:
- 查看SELinux状态:
getenforce,若为Enforcing,临时关闭:setenforce 0后重试 - 若启用AppArmor,检查是否有规则限制debugfs写入权限
- 查看SELinux状态:
排查隐性启动参数
检查U-Boot环境变量中的bootargs,确认是否存在kmemleak=off或其他抑制kmemleak的隐性参数。优化内存池配置
针对架构调整CONFIG_DEBUG_KMEMLEAK_MEM_POOL_SIZE:32位系统建议不超过4096,64位系统可调高至8192,确保内核编译无警告。
内容的提问来源于stack exchange,提问作者Alexander Tony
相关产品推荐
相关产品推荐

