无法在目录中创建文件

无法在目录中创建文件

关于超级用户有很多此类问题,因此,我会尝试快速告诉您它们不是什么:

  • 这里不涉及任何应用程序。只有用户和文件系统。
  • 我可以以 root 身份登录,并且我的非 root 用户拥有完全 sudo 访问权限。
  • 据我所知,这个问题仅存在于一个目录中(尽管如果有足够的时间,我认为我可以在任何目录中重现这种行为 - 更多信息见下文)。
  • 没有奇怪的文件系统定制、umask 或奇怪的用户或目录权限方案 —— 我拥有这个系统,并且没有其他人与它交互。

此目录是用 bash 编写的备份脚本的目标路径。这些脚本并不花哨。将文件从其他地方 Rsync 到工作目录。将工作目录中的所有文件打包成 tar,并将生成的存档存储在此目标路径中。非常简单。

假设这是一次全新安装,例如。脚本运行一段时间后,任何用户使用任何方法都无法在目标路径中创建文件。我尝试过 touch、tar、zip 等。都不起作用。tar 和 zip 会因 I/O 错误而失败,touch 运行正常但没有创建文件。在该目标路径中,并且只在该路径中。在文件系统的其他地方,文件创建/修改/删除都运行正常(如果在其他地方发生,则无症状)。

目录上的权限如下所示ls -al

drwxrwxr-x.

由我的非 root 用户及其组拥有。

最后,如果我在出现这种情况后重新启动系统,我可以在短时间内再次在该路径中创建文件。但最终,问题再次出现。

当我说我可能在另一个目录中重新创建它时,这是因为我已将目标路径更改为其他路径,并尝试多次修复此问题,并且它最终发生在我尝试过的每个位置。

系统详细信息:

  • CentOS 2.6.32-431.3.1.el6.x86_64
  • 文件系统是 ext4
  • / (lvm) 上有 400GB 可用空间

如果您有任何想法或建议,我将不胜感激。如果需要,我很乐意更详细地讲解,但我想先简短地讲一下。


编辑于 2014 年 10 月 8 日:根据评论的要求添加信息:

$ ls -l
total 0

$ sudo vgs
  VG        #PV #LV #SN Attr   VSize   VFree
  vg_omega1   1   2   0 wz--n- 464.24g    0

编辑于 2014 年 10 月 7 日:根据评论的要求添加信息:安装结果:

/dev/mapper/vg_omega1-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)

/proc/sys/fs/binfmt_misc type binfmt_misc (rw)

小路:

/home/[username]/savegames/sync

编辑于 2014 年 10 月 6 日:进一步的测试表明,我似乎可以很好地创建子目录和符号链接。此问题似乎仅限于常规文件。

答案1

但是从mount输出来看,您似乎正在运行 SELinux。根据经验,除非您熟悉 SELinux,否则很难追踪这种“奇怪”的东西。5 年以上的处理经验教会了我一两招。

tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")

您还提到您正在使用 rsync,而这个问题“消失了,又回来了”。您的 SELinux 选项是否设置为默认强制执行?(重新启动后再次应用),并且您(有时)在重新启动后将 SELinux 置于宽容模式(5 分钟或 10 天等时间)?

sudo getenforce

如果结果是enforcing,并且如果您确实将 SELinux 设置为默认强制执行,则很有可能您遇到 SELinux 策略拒绝。

如果你运行:

ls -lZ /home/[username]/savegames/sync 

上下文标签是什么?应该是类似public_content_t 可能是 的意思user_home_t,这意味着许多 SELinux 受限进程将被拒绝访问。 中将出现拒绝消息/var/log/audit/audit.log

如果 SELinux 确实是罪魁祸首,请参阅CentOS SELinux 故障排除指南找到解决此问题的方法。您可以:

  • 将 SELinux 置于宽容模式,看看问题是否消失。将其重新置于强制模式,问题又会再次出现。这不是一个长期的解决方案,所以...
  • 重新标记 /home/[用户名]/savegames/sync 文件夹的上下文(为 public_content_t 或类似名称)或
  • 创建策略以允许您的脚本/流程与您的文件夹一起工作(audit2allow)。这看起来令人生畏,但并非不可能。

请不要关闭 SELinux。

好吧,话虽如此,如果您是唯一使用该系统的人,并且您不提供网站或 FTP 或任何东西,那么也许可以将其保留在宽容模式,但是好的做法建议您修改您的策略以便为您提供门的钥匙,而不仅仅是将门从铰链上取下并放在一边。

相关内容