是否可以在磁盘上创建一个“虚拟”文件,其作用类似于两个或更多“真实”文件的组合内容的“视图”?

是否可以在磁盘上创建一个“虚拟”文件,其作用类似于两个或更多“真实”文件的组合内容的“视图”?

假设我有2个文本文件:

  • a.txt
  • b.txt

有没有办法创建第三个“虚拟”文件,当打开时,以连续的方式显示两个文件的内容ab就好像它们是一个文件一样,而不必复制源文件的整个内存内容?

例如,想象文件a有以下内容:

File a is awesome
Another line on file a

文件b内容如下:

File b is much better
Another line on file b
A third line on file b

我想创建一个文件,c.txt用作虚拟视图两个文件内容的合计。打开该文件将显示以下内容:

File a is awesome
Another line on file a
File b is much better
Another line on file b
A third line on file b

它的工作方式与 SQL 视图的工作方式类似:对其他表进行“虚拟”分组,这些表在查询时会“动态聚合”,并且表现得就像外部的另一个表一样。

如果有人随后附加或更改这两个文件中任何一个文件的内容,如果我刷新文件,c我应该会看到更新的连接内容。

实际上,这种虚拟文件的工作方式就好像它是“磁盘中数据的不同视图”,基本上将所使用的所有群集a与所使用的群集附加在一起b

在这种情况下,文件c.txt将是只读的。

这样的事(或者我不知道的类似事)可能吗?文件系统中的同一部分数据是否可以以这种方式“共享”,使其看起来好像是多个文件的一部分?换句话说,同一个磁盘上的多个文件描述符可以引用同一个磁盘数据吗?

我知道符号/硬链接,但它们总是与给定的现有文件 1 对 1,就像别名一样。就我而言,这就像链接实际上包含 2 个或更多文件的部分(或全部),实际上是将任意一组磁盘部分别名化并将它们呈现为另一个文件。

答案1

可以通过创建一个整体来实现这样的虚拟文件文件系统通过 FUSE。最终,文件系统驱动程序决定了从文件读取时将看到哪些数据,因此自定义文件系统可以“轻松”实现虚拟文件,该文件将根据读取的偏移量将读取传递到物理文件 A 或物理文件 B。(从概念上讲,这与通过 LVM 或设备映射器连接磁盘设备非常相似。)

FUSE 主要可在 Linux、macOS、一些 BSD 系统和 Windows(安装了 WinFsp 或 Dokan)之间移植。

文件系统中的同一部分数据是否可以以这种方式“共享”,使其看起来好像是多个文件的一部分?换句话说,同一个磁盘上的多个文件描述符是否可以引用同一个磁盘数据?

从技术上来说,是的,这是由一些文件系统,例如文件系统或者重新文件系统– 但实际上并非如您所述。通常,这种数据共享以“写入时复制”的方式进行,因此任何写入都会自动将链接拆分为两个单独的副本;写入的文件将更新以引用新的范围,而所有其他文件则保留以前的数据。(该功能是为轻量级“副本”和/或重复数据删除而设计的,而不是为 SQL 样式的视图而设计的。)

因此,尽管可以创建合并文件而不使用两倍的磁盘空间,但每次更新时都需要手动重新创建。

(另外,我思考范围需要位于集群边界上,因此文本文件通常不会很好地对齐 - 除非您不介意文件 A 的末尾和文件 B 的开头之间存在间隙。)

相关内容