【问题标题】:mkstemp and hard disk stressmkstemp 和硬盘压力
【发布时间】:2023-03-20 04:25:01
【问题描述】:

使用mkstemp 创建的临时文件是否已同步到磁盘?

这是我所拥有的:

  1. 程序使用mkstemp创建临时文件并将fd发送给另一个程序。

  2. 这个临时文件是mmap-ped 被两个程序使用并且被大量使用(高达 400 MB/秒的写入和 400 MB/秒的读取;高达每秒 60 次读取和写入)。

  3. 我无法使用 memfd_create(目标设备可能不支持)。

  4. 我们还假设(这几乎是真的)我无法在 tmpfs 上创建此文件(例如在 /tmp 中)。

我需要的是保证这样的文件不会对硬盘造成压力。即使每 5 秒只发生一次,我也不能允许它被写入磁盘。如果我不能得到这样的保证,我会另寻他法。

附加信息(不重要):

我正在为 Android 设备编写 Wayland 合成器。目前临时文件(实际上是路地表面)是在 tmpfs 上创建的。只要不启用 SELinux,一切都可以正常工作。但是如果我启用 SELinux,它会阻止 fd 从客户端传输到合成器。我目前知道的唯一解决方案是在应用程序的主目录中创建临时文件。但如果这样的方式很危险,我会另找一个。

【问题讨论】:

  • “将 fd 发送到另一个程序”是指将 文件名 发送到另一个程序吗?或者也许 forks 另一个继承 fd 的程序?因为 fd 的含义不在于数字本身,将其交给不相关的其他程序并不能为接收程序提供访问同一文件的方法。
  • fd 通过 unix 域套接字传输。在这种情况下,另一个程序可以使用相同的文件。
  • 为什么不使用共享内存?
  • sysv shm?它已被弃用。我的程序也是android的wayland compositor。我不能改变所有的 Wayland 客户来使用 shm。他们发送 fd。
  • POSIX shm。它适用于文件描述符和mmap()。

标签: c unix


【解决方案1】:

使用mkstemp 创建的临时文件是否已同步到磁盘?

mkstemp 函数不会将任何特殊属性赋予它打开的文件,以防止它们被同步到磁盘。创建它们的文件系统可能具有这样的属性,但这与文件创建无关。特别是,通过mkstemp() 创建的文件如果不删除,将无限期保留。

我需要的是保证这样的文件不会对硬盘造成压力。即使每 5 秒只发生一次,我也不能允许它被写入磁盘。如果我不能得到这样的保证,我会另寻他法。

据我所知,即使 tmpfs 文件系统也不保证它们的内容将保持锁定在内存中,而不是被分页。它们由虚拟内存支持。但是如果实际文件比较小,而且它的所有页面都很热,那么它们很可能只保留在内存中。

关于更大的问题,

只要不启用 SELinux,一切都可以正常工作。但如果我 启用 SELinux,它可以防止 fd 从客户端传输到 合成器。我目前知道的唯一解决方案是创建临时 应用主目录中的文件。

默认情况下,新创建的文件继承其父目录的 SELinux 类型。您的 Wayland 客户端可能没有足够的权限来修改他们创建的文件的 SELinux 标签,但是您应该能够在任何您喜欢的地方使用有利于您需要的标签以管理方式创建目录。例如,您可以为此目的(在每次启动时)创建/dev/shm 的子目录,并为chconned 设置适当的标签。如果客户端在那里创建他们的临时文件,那么他们应该继承您选择的 SELinux 类型。

【讨论】:

  • 好,谢谢。我还发现了这个:stackoverflow.com/questions/3146496/… 所以似乎没有办法确保数据不同步。打算用 SELinux 做实验。在 android 设备上管理 SELinux 更难,但 chcon 是可用的(至少对于 root 设备)。感谢您的提示。
  • 是的,它有效。我从我的 apk 的主目录中获取上下文并 chconned 其他目录(在 tmpfs 上)具有相同的上下文。现在客户端可以在这个目录中创建临时文件,SELinux 不会阻止 fd 传输到服务器。抱歉跑题了。
猜你喜欢
  • 2018-11-26
  • 2010-10-04
  • 1970-01-01
  • 2021-06-16
  • 2010-09-30
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多