Linux

為什麼重複綁定掛載會為源目錄創建條目?

  • August 24, 2018

為什麼重複綁定掛載會在中創建多個條目/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

引用自:https://unix.stackexchange.com/questions/464605