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