在运行时覆盖现有目录内容

在运行时覆盖现有目录内容

我有以下情况:

  1. 用户运行安装在 /path/to/software 中的软件
  2. 我创建了一个文件支持的 FS 映像,其内容与 /path/to/software 中的内容完全相同
  3. 我使用回送以只读模式将图像挂载在 /path/to/software

在步骤 3 之后,目录中的旧内容将被具有完全相同内容的新安装映像“遮蔽”。

这是否会对在挂载之前启动了原始软件的用户产生任何影响?我进行了一些测试,似乎启动的程序没有意识到任何变化,即它们继续运行而没有任何错误。这有点令人惊讶,因为程序之前打开了旧文件系统中的一些文件(库),而旧文件系统在第 3 步之后就消失了。我预计文件描述符会在挂载后发生变化。

那么为什么没有错误呢?尽管目录内容已被隐藏,但旧文件是否仍以某种方式对正在运行的程序可见?

答案1

在符合 POSIX 标准的文件系统中,打开的文件不会被删除,除非没有人再打开它们。标准库也使用相同的行为,即打开一个临时文件然后将其删除。打开的文件句柄仍可由拥有文件句柄(或其子句柄)的进程使用,但由于不再有文件名,因此其他进程无法打开该文件。似乎可以合理地预期,在某些目录上执行tmpfile此操作也会有效。mount

相关内容