Ubuntu 22.04加载LKM后dmesg出现AppArmor DENIED报错求解决
问题描述
我编写了C程序与Makefile并生成.ko文件,执行sudo insmod filename.ko、sudo sysctl kernel.dmesg_restrict=0、dmesg | tail后,dmesg输出多条audit type=1400的AppArmor DENIED日志,涉及ptrace操作,关联profile为snap.python-ai-toolkit.jupyter。使用Ubuntu 22.04.2 LTS,期望dmesg能显示模块正常输出,该如何处理?
我的LKM代码
#include <linux/module.h> #include <linux/init.h> /* Meta Information */ MODULE_LICENSE("GPU"); MODULE_AUTHOR("Johannes 4 GNU/Linux"); MODULE_DESCRIPTION("A hello world LKM"); /** * @brief This function is called, when the module is loaded into the kernel **/ static int __init ModuleInit(void) { printk("Hello, Kernel!\n"); return 0; } /** * @brief This function is called, when the module is removed from the kernel * */ static void __exit ModuleExit(void) { printk("Goodbye, Kernel\n"); } module_init(ModuleInit); module_exit(ModuleExit);
Makefile内容
obj-m += mymodule.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
解决方案
1. 确认模块加载状态
先执行lsmod | grep mymodule,如果能查到模块名,说明模块已成功加载,printk内容已写入内核日志,只是被AppArmor日志淹没。
2. 过滤日志查看模块输出
无需查看全部dmesg内容,直接过滤模块相关输出:
dmesg | grep -E "Hello, Kernel|Goodbye, Kernel"
或按模块名精准过滤:
dmesg | grep mymodule
3. 消除AppArmor日志(可选)
这些日志与你的LKM无关,是snap.python-ai-toolkit.jupyter的AppArmor权限限制导致的,两种处理方式:
- 临时关闭该snap的AppArmor规则:
sudo aa-disable /var/lib/snapd/apparmor/profiles/snap.python-ai-toolkit.jupyter sudo systemctl restart snapd.apparmor - 永久调整profile权限:
编辑规则文件/var/lib/snapd/apparmor/profiles/snap.python-ai-toolkit.jupyter,添加允许ptrace的规则:
重新加载规则:ptrace (read,write) peer=snap.python-ai-toolkit.*,
注意:snap更新时可能会覆盖修改的规则,需重新调整。sudo apparmor_parser -r /var/lib/snapd/apparmor/profiles/snap.python-ai-toolkit.jupyter
4. 修正LKM许可证(潜在优化)
代码中MODULE_LICENSE("GPU");是无效的内核许可证,内核认可的合法许可证包括GPL、GPL v2等,改为MODULE_LICENSE("GPL");可避免内核加载时的潜在警告。
内容的提问来源于stack exchange,提问作者Shwarz
相关产品推荐
相关产品推荐

