在 RHEL 7.2 机器上,如果我在控制台会话中创建 POSIX 共享内存,然后/dev/shm
从 SSH 会话查询其存在,它会在第一次显示共享内存文件,但之后它会被神秘地删除。
最后我将测试用例分解为以下步骤:
- 在 box1 上,执行
touch /dev/shm/sample
tailf /dev/shm/sample
在 box1 上。它将可供访问。在 box2 上,执行
ssh user@box1 "ls -l /dev/shm/"
-rw------- 1 user user 1 Aug 25 17:12 sample
- 再次执行步骤 3,这次我没有看到该文件。
在box1上,tailf显示文件已被删除。
tail: '/dev/shm/sample' has become inaccessible: No such file or directory
我观察到,与该特定用户相对应的所有文件都被删除了/dev/shm
,即使那是包含文件的目录树。
我尝试监视文件、在 sshd 上进行 strace 等。
我曾尝试使用以下规则进行审计,但没有成功:
## This file is automatically generated from /etc/audit/rules.d
-D
-b 1024
# monitor unlink() and rmdir() system calls.
-a exit,always -S unlink -S rmdir
有人能解释一下这里出了什么问题吗?
答案1
经过几个小时的搜索和阅读,我找到了罪魁祸首。这是一个设置
systemd
。包含/etc/systemd/logind.conf
默认配置选项,每个选项均被注释掉。 默认情况下,RemoveIPC
选项设置为。该选项指示清除未登录的“用户帐户”的进程间通信 (IPC)。这不会影响“系统帐户”yes
systemd
就我而言,文件和目录是为用户帐户而不是系统帐户创建的。
有两种可能的解决方案:
- 使用系统用户创建文件/为系统用户创建文件--使用系统选项创建的用户(
adduser -r
或adduser --system
)- 编辑
/etc/systemd/logind.conf
,取消注释该行RemoveIPC=yes
,将其更改为RemoveIPC=no
,保存并重新启动系统就我而言,我选择了选项#2,因为用户已经创建。
参考:
答案2
/dev/shm
提供类似于文件系统的共享内存视图。有系统调用来创建、使用和删除共享内存段。共享内存旨在供协作程序使用,以允许访问共享数据结构。根据创建共享内存段的模式,当没有进程使用它们时,可能会删除它们。这可以防止在使用它们的程序崩溃或以其他方式退出而未清理时丢失共享内存。
如果您有一个安装的内核/dev/shm
,那么它应该在中列出/etc/mtab
。权限应该是drwxrwxrwxt
,以防止 root 以外的其他用户删除文件。如果要从中删除特定用户的文件,则/dev/shm
删除它们的将是该用户或 root。检查:以用户身份运行的进程;以用户身份运行的 cronjobs;或登录/注销期间运行的脚本。
尝试多次登录而不注销并检查文件。如果文件仍然存在,则不太可能是以用户身份运行的进程或 crontab 条目。如果在第一次注销时删除了它,则很可能是在注销时运行的清理脚本。
如果您想在内存中创建文件系统,可以使用tmpfs
文件系统。这通常用于/tmp
,/var/run
以及其他在重新启动后应为空的文件系统。tmpfs
如果内存用于其他目的,则文件可能会被调出到交换文件。