用户可能无法在 Linux 系统上打开共享内存对象的原因

Reasons a user might not be able to open a shared memory object on Linux systems

本文关键字:内存 共享 对象 系统 Linux 用户      更新时间:2023-10-16

我在支持的应用程序上遇到了一些问题,出于各种烦人的原因,我分叉了工作进程来处理某些任务。这些进程使用共享内存空间传达状态,有时还传达结果。我正在使用提升进程间库来实现这一点(使用 shared_memory_object 和 mapped_region 类型)。

在部署到的其中一个系统上,我们的访问权限非常有限,这使得在该系统上进行调试变得困难。有一个完整的过程只是为了安装新版本的软件。但是在这个目标上,我们遇到了一个问题,即一个用户尝试启动应用程序,能够很好地做到这一点,而另一个具有看似相同的凭据、组隶属关系等的用户无法创建共享内存对象。提升错误是"权限被拒绝"。对于创建共享内存对象的任何尝试,即使该名称尚不存在,也会返回此值。

我只能通过以 root 身份启动应用程序来重现此问题,因此使用受限权限创建内存空间,然后以非 root 用户身份重新运行,这会产生相同的权限问题。我能够通过调用权限对象上的 set_unrestricted 例程来解决此问题,如此处所述。但是,这不是此远程系统上发生的情况,因为两个用户都不是root,并且一个用户无法创建任何命名的内存对象,即使是新的对象。

那么我的问题是,还有哪些其他原因可能会阻止一个用户打开共享内存对象?我只找到了对根/非根限制的提及,但我无法找到任何其他可能的解释。

这是使用 boost 1.55 进程间库在 Linux 系统上创建共享内存对象。

检查

    /
  • dev/shm 权限(在/dev/direntry 上也为 +x)
  • librt.so的可用性/可访问
  • 限制生效
  • 主要组和辅助组的id输出
  • SELinux configuration (getenforce, setenforcement 0)
  • AppArmor(不太可能是这种系统的罪魁祸首,但仍然如此)

此外,并非所有内核都编译了 SHM 支持,但这似乎不是这里的问题。