![mmap 可以用来创建一个引用另一个文件的内存子集的文件吗?](https://linux22.com/image/226675/mmap%20%E5%8F%AF%E4%BB%A5%E7%94%A8%E6%9D%A5%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%BC%95%E7%94%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E5%86%85%E5%AD%98%E5%AD%90%E9%9B%86%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%97%EF%BC%9F.png)
我有兴趣编写一个可以创建两个文件的程序,第二个文件将是第一个文件的“视图”,如果修改,第一个文件也会被修改。这可以用 mmap 来做吗?
我知道使用 mmap 我可以在 RAM 中拥有共享内存,但我需要非易失性内存(又称硬盘驱动器)中的共享内存。我无法复制第一个文件或将其完全加载到 RAM 中,因为我假设该文件可能非常大(GB)。
在我找到如何让第二个文件显示第一个文件的内存子集后,我计划制作 3 个文件,第一个作为容器,第二个和第三个显示第一个文件的不同子集。第二个和第三个文件将使用文件系统进行格式化,以便第一个文件容器在其内存中保存两个可通过第二个和第三个文件访问的文件系统。我计划通过将第二个和第三个文件作为环回设备附加并安装它们来完成。
这是可行的吗?我没有看到什么吗?
答案1
您不能使用 来执行此操作mmap
,但您可以直接转到计划的末尾并使用环回设备:losetup
有一个--offset
选项用于指定环回在包含文件中开始的位置,以及一个--sizelimit
用于指定环回结束位置的选项(相对于开始)。
因此,使用 10GiB 容器,您可以从一开始就“映射”2GiB 文件系统 1GiB losetup --offset 1G --sizelimit 2G /path/to/container
。