我有以下情况:
- 用户运行安装在 /path/to/software 中的软件
- 我创建了一个文件支持的 FS 映像,其内容与 /path/to/software 中的内容完全相同
- 我使用回送以只读模式将图像挂载在 /path/to/software
在步骤 3 之后,目录中的旧内容将被具有完全相同内容的新安装映像“遮蔽”。
这是否会对在挂载之前启动了原始软件的用户产生任何影响?我进行了一些测试,似乎启动的程序没有意识到任何变化,即它们继续运行而没有任何错误。这有点令人惊讶,因为程序之前打开了旧文件系统中的一些文件(库),而旧文件系统在第 3 步之后就消失了。我预计文件描述符会在挂载后发生变化。
那么为什么没有错误呢?尽管目录内容已被隐藏,但旧文件是否仍以某种方式对正在运行的程序可见?
答案1
在符合 POSIX 标准的文件系统中,打开的文件不会被删除,除非没有人再打开它们。标准库也使用相同的行为,即打开一个临时文件然后将其删除。打开的文件句柄仍可由拥有文件句柄(或其子句柄)的进程使用,但由于不再有文件名,因此其他进程无法打开该文件。似乎可以合理地预期,在某些目录上执行tmpfile
此操作也会有效。mount