Por que uma montagem de ligação repetida cria várias entradas em /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
Após a primeira montagem de ligação, havia uma entrada mapeando o volume de origem para o ponto de montagem. Após a segunda invocação, temos uma entrada adicional para o ponto de montagem mais uma para o prefixo de origem.
Da mesma forma, findmnt relata que a fonte é montada em bind para si mesma:
# 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
Após outra repetição, acabo com três entradas para a fonte, quatro para o destino:
# 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
A progressão é 1, 3, 7, 15, … , ou seja, n = 1 + 2^(n-1) , fazendo com que o número de entradas adicionais dobre a cada operação de montagem.
Qual é o motivo disso?
Propagação de montagem.
Este é um caso específico do "problema de explosão do ponto de montagem", que é explicado no "exemplo MS_UNBINDABLE" em mount_namespaces(7)
systemd efetivamente habilita a propagação de montagem por padrão. Por exemplo, isso torna viável a execução de um serviço em um namespace filho onde
/home
está bloqueado, conforme a opção systemd.execProtectHome=yes
. Ao permitir que montagens e desmontagens se propaguem no namespace filho, ele permiteeject
continuar funcionando corretamente no namespace principal e assim por diante.