为什么下面的情况是可能的?
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
案件中的那部分必须系统上已经存在且可用的东西,它将用作持久文件系统的后备存储(即使您将该后备存储放在像 之类的实际易失性文件系统中tmpfs
,mkfs.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
除非您在中间卸载它)。可能的结果包括内核崩溃,从而丢失任意数据。