能够多次挂载相同的 tmpfs

能够多次挂载相同的 tmpfs

为什么下面的情况是可能的?

root@pkara-pc01:~# mkdir -p /tmp/shared
root@pkara-pc01:~# mount -t tmpfs -o size=1G mymount /tmp/shared/
root@pkara-pc01:~# mount -t tmpfs -o size=1G mymount /tmp/shared/
root@pkara-pc01:~# mount | grep -i shared
mymount on /tmp/shared type tmpfs (rw,relatime,size=1048576k)
mymount on /tmp/shared type tmpfs (rw,relatime,size=1048576k)

编辑:我问这个问题是因为通常情况下,尝试挂载已挂载的文件系统应该会失败(?)

$ mkdir -p mydir
/tmp
$ dd if=/dev/zero of=myfile bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.563994 s, 1.9 GB/s
/tmp
$ mkfs.ext4 myfile 
mke2fs 1.44.1 (24-Mar-2018)
Discarding device blocks: done                            
Creating filesystem with 256000 4k blocks and 64000 inodes
Filesystem UUID: 95fe153e-a575-4c9a-beef-b7a20a6ae342
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

/tmp
$ sudo mount -o loop myfile /tmp/mydir/
/tmp
$ sudo mount -o loop myfile /tmp/mydir/
mount: /tmp/mydir/: /tmp/myfile is already mounted.

答案1

请注意,这tmpfs 是一个虚拟文件系统,因为它没有也不需要后备存储来写入其元数据。

相反,它ext4fs是一个持久性文件系统,它需要一个后备存储(无论是图像文件还是真正的设备)来写入其元数据。

所以你mount 对这种情况的命令tmpfs就是重用挂载同一目录其他(尽管还是 tmpfs),完全原始的文件系统。这是允许的,即使该目录已经用作持久文件系统的挂载点,例如ext4:第二个文件系统mount只会覆盖以前的文件系统,该文件系统会像卸载第二个文件系统时一样重新出现文件系统。

相反,您mount对案例的命令ext4是尝试安装它相同的后备存储myfile文件)多次并连接到同一安装点,这就是您收到错误消息的原因。对于虚拟文件系统来说,这种情况永远不会发生,tmpfs因为它们根本没有(外部)后备存储。事实上,mymount您的命令片段只是 make语法内容的tmpfs占位符。mount您可以使用任何任意字符串作为tmpfs.相反,myfile您指挥的ext4 案件中的那部分必须系统上已经存在且可用的东西,它将用作持久文件系统的后备存储(即使您将该后备存储放在像 之类的实际易失性文件系统中tmpfsmkfs.ext4 命令和ext4fs驱动程序也不知道/关心那)。

然而,还要注意,由于古老的 v2.4 Linux 内核,也可以安全地挂载多次文件系统ext4只要它们被安装到不同的安装点(即与示例中不在同一目录上)。基本上,这样的多个安装的行为就像一个mount --bind.但值得注意的是,loop如果块设备是从不同编号上的同一支持文件创建的,则无法获得此行为,/dev/loopX而这种行为mount -o loop在其版本 2.28.x 之前一直存在。从 v2.29 开始,它会检测是否要重用相同的支持文件,并默默地将其转换为mount --bind等效文件。

为了安全起见,请勿在同一个备份文件上多次使用 2.28.x 或更低版本mount-o loop除非您在中间卸载它)。可能的结果包括内核崩溃,从而丢失任意数据。

相关内容