为什么重复的绑定挂载会为源目录创建条目?

为什么重复的绑定挂载会为源目录创建条目?

为什么重复的绑定挂载会在 中创建多个条目/proc/mounts

# md -p /mnt/test-mount/{source,target}
# mount --bind /mnt/test-mount/{source,target}
# grep test-mount /proc/mounts 
/dev/sda3 /mnt/test-mount/target ext4 rw,relatime 0 0
# mount --bind /mnt/test-mount/{source,target}
# grep test-mount /proc/mounts 
/dev/sda3 /mnt/test-mount/target ext4 rw,relatime 0 0
/dev/sda3 /mnt/test-mount/target ext4 rw,relatime 0 0
/dev/sda3 /mnt/test-mount/source ext4 rw,relatime 0 0

第一次绑定安装后,有一个条目将源卷映射到安装点。第二次调用后,我们有一个额外的挂载点条目和一个源前缀条目。

同样地,发现报告源已绑定安装到自身:

# findmnt |grep test-mount
├─/mnt/test-mount/target                       /dev/sda3[/mnt/test-mount/source]                ext4            rw,relatime
│ └─/mnt/test-mount/target                     /dev/sda3[/mnt/test-mount/source]                ext4            rw,relatime
└─/mnt/test-mount/source                       /dev/sda3[/mnt/test-mount/source]                ext4            rw,relatime

经过另一次重复之后,我最终得到源条目,目标条目四个:

# mount --bind /mnt/test-mount/{source,target
# findmnt |grep test-mount
├─/mnt/test-mount/target                       /dev/sda3[/mnt/test-mount/source]                ext4            rw,relatime
│ └─/mnt/test-mount/target                     /dev/sda3[/mnt/test-mount/source]                ext4            rw,relatime
│   └─/mnt/test-mount/target                   /dev/sda3[/mnt/test-mount/source]                ext4            rw,relatime
│     └─/mnt/test-mount/target                 /dev/sda3[/mnt/test-mount/source]                ext4            rw,relatime
└─/mnt/test-mount/source                       /dev/sda3[/mnt/test-mount/source]                ext4            rw,relatime
  └─/mnt/test-mount/source                     /dev/sda3[/mnt/test-mount/source]                ext4            rw,relatime
    └─/mnt/test-mount/source                   /dev/sda3[/mnt/test-mount/source]                ext4            rw,relatime

进展是1、3、7、15……, IEn = 1 + 2^(n-1),导致每次安装操作时附加条目的数量加倍。

这是什么原因呢?

答案1

安装传播。

这是“挂载点爆炸问题”的一个具体情况,在“MS_UNBINDABLE 示例”中对此进行了解释挂载命名空间(7)

systemd 默认有效地启用挂载传播。例如,这使得在被阻止的子命名空间中运行服务成为可能/home,根据系统执行程序选项ProtectHome=yes。通过允许安装并卸载传播到子命名空间中,它可以eject继续在主命名空间中正常工作,依此类推。

相关内容