【发布时间】:2017-08-18 16:14:20
【问题描述】:
背景:
在 CentOS 7 x86_64 上。我正在使用applydeltarpm,并且在从增量创建新 RPM 时磁盘空间不足。我在应用过程中看到/ 磁盘空间使用率增加到 100%,但使用ls -l /tmp 或find /tmp -mmin -1 -type f 在卷上找不到工作/临时文件。
我将applydeltarpm 源代码更改为使用/var/tmp 而不是/tmp,并重建了RPM。现在 apply 可以使用修改后的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 标志的情况下打开的。
【问题讨论】:
-
它在创建后立即
unlinks 文件。