为什么重复绑定挂载会在中创建多个条目/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报告源绑定安装到自身:
# 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, ...,即n = 1 + 2^(n-1),导致每次挂载操作的附加条目数加倍。
这是什么原因?
安装传播。
这是“挂载点爆炸问题”的一个具体案例,在mount_namespaces(7)中的“MS_UNBINDABLE 示例”中有说明
systemd 默认情况下有效地启用挂载传播。例如,这使得根据systemd.exec选项在
/home
被阻止的子命名空间中运行服务成为可能。通过允许挂载和卸载传播到子命名空间,它可以继续在主命名空间中正常工作,依此类推。ProtectHome=yes
eject