0

背景:

在 CentOS 7 x86_64 上。我正在使用applydeltarpm,并且在从增量创建新 RPM 时磁盘空间不足。我在应用过程中观察到/磁盘空间使用率增加到 100%,但无法使用ls -l /tmp或找到卷上的工作/临时文件find /tmp -mmin -1 -type f

我将applydeltarpm源代码更改为使用/var/tmp而不是/tmp,并重建了 RPM。现在 apply 与 modified 一起工作applydeltarpm,因为/var/tmp有更多的磁盘空间。但我仍然找不到使用创建的临时文件mkstemp64

问题:

创建的临时文件mkstemp64似乎“不存在”,但仍然作为创建者的文件描述符存在,并且在applydeltarpm创建大型 RPM 时使用了相当大的磁盘空间(在慢速磁盘上应用 1 小时)。文档说创建了mkstemp64一个实际文件。并且源代码显示模板文件名为/tmp/deltarpmpageXXXXXX. 但是不存在具有该模板名称的文件。

这个临时文件如何能够在系统上创建而不用通常的目录列表找到ls,或者find. 我怎样才能在系统中找到这些“不存在”的文件?

(我很好奇,因为我也在监控系统安全)

参考:

https://github.com/rpm-software-management/deltarpm/blob/master/applydeltarpm.c

  # line 198

  if (pagefd < 0)
    {
      char tmpname[80];
      sprintf(tmpname, "/tmp/deltarpmpageXXXXXX");
#ifdef DELTARPM_64BIT
      pagefd = mkstemp64(tmpname);
#else
      pagefd = mkstemp(tmpname);
#endif
      if (pagefd < 0)
        {
          fprintf(stderr, "could not create page area\n");
          exit(1);
        }
      unlink(tmpname);
    }

https://www.mkssoftware.com/docs/man3/mkstemp.3.asp

mktemp() 函数根据模板参数返回一个唯一的文件名。在生成它时,当前目录中没有文件具有该名称。实际上没有创建文件,因此其他应用程序可能会创建具有此名称的文件。

mkstemp() 函数与 mktemp() 类似,它基于模板创建一个唯一的文件名;然而, mkstemp() 实际上创建文件并返回它的文件描述符。创建的文件的名称存储在模板中。

mkstemp64() 函数与 mkstemp() 函数相同,只是打开文件时设置了 O_LARGEFILE 标志。

4

1 回答 1

2

如果不再需要通过文件系统访问临时文件,则在创建后立即取消链接是一种常见的做法。如果进程崩溃或稍后忘记取消链接,这可以避免悬挂临时文件。

unlink()不会删除文件,它只会从文件系统中删除文件的链接。文件系统中文件的每个链接都会将文件的链接计数增加一(同一个文件可以有多个链接)。此外,每个调用open()mmap()打开文件的进程都会增加文件计数,直到它关闭描述符 - 然后链接计数会减少。只要至少有一个链接,文件就存在。当链接计数达到零时,文件实际上被删除。

mkstemp()open()还在幕后调用以打开临时文件并返回其描述符。

为了查看已打开但文件系统中不再存在的文件,您可以使用lsof并搜索文件名后面有“(已删除)”的行。

lsof | grep '(deleted)'

当它们附加到的进程完成或自行关闭文件描述符时,这些文件使用的(磁盘)空间将被释放。

于 2017-08-18T18:37:51.537 回答