Zynq Linux环境下Docker容器无法访问/dev/mem的权限问题求助
问题背景
在Linux Zynq平台上通过Python读取内存映射寄存器时,宿主机可正常打开/dev/mem并完成mmap映射,但docker-compose部署的容器始终触发权限拒绝。已尝试的操作包括:
- 将容器用户加入kmem组
- 以root身份运行容器
- 开启/关闭
privileged: true配置 - 通过volumes和devices两种方式挂载
/dev/mem - 调用
O_RDONLY|O_SYNC打开/dev/mem,使用MAP_SHARED、PROT_READ参数执行mmap - 执行
dd if=/dev/mem skip=0x80100000 count=16命令也触发权限问题 - containerd以root身份运行
遗漏的权限配置检查点
检查宿主机SELinux/AppArmor规则
若宿主机开启了SELinux,可临时执行setenforce 0关闭测试,或为容器添加对应SELinux上下文;若启用AppArmor,需检查是否有profile限制了/dev/mem的访问权限。添加
SYS_RAWIO权限
在docker-compose.yml中显式添加内存操作相关的capability,比privileged更精细:cap_add: - SYS_RAWIO调整内核
allowed_mmap_min_addr参数
查看宿主机内核限制的最低可映射地址:cat /proc/sys/kernel/mm/allowed_mmap_min_addr若值大于目标寄存器地址(如0x80100000),临时修改为0:
echo 0 > /proc/sys/kernel/mm/allowed_mmap_min_addr永久生效需在
/etc/sysctl.conf添加kernel.mmap_min_addr = 0,执行sysctl -p加载。验证设备挂载格式
使用devices方式挂载时需明确权限:devices: - "/dev/mem:/dev/mem:r"同时检查宿主机与容器内
/dev/mem的主/次设备号是否一致(通过ls -l /dev/mem查看,格式如crw-r----- 1 root kmem 1, 1)。配置
security_opt解除安全限制
若宿主机启用AppArmor,添加以下配置关闭容器的AppArmor限制:security_opt: ["apparmor:unconfined"]若为SELinux,可添加:
security_opt: ["label:disable"]检查内核
CONFIG_STRICT_DEVMEM配置
查看内核是否启用了物理内存访问限制:zcat /proc/config.gz | grep CONFIG_STRICT_DEVMEM若结果为
y,需重新编译内核关闭该选项,或通过内核启动参数devmem=1允许访问。
内容的提问来源于stack exchange,提问作者Trevor

