Deixe-me tentar explicar o contexto:
No bash principal:
Nós usamos
mount --bind /tmp/source /tmp/target
mount --make-shared /tmp/target
para criar este ponto de montagem compartilhado target
E então usamos
unshare -m /bin/bash
para iniciar uma festa infantil. Até agora tudo parece normal.
E então no bash principal, nós desmontamos o target
com sucesso.
umount /tmp/target
De acordo com o documento do kernel: sharedsubtree . O filho bash também deve ver que o target
já tem umount, embora o thread filho tenha sido iniciado por CLONE_NEWNS
(unshare -m). Mas o problema agora é aprovado:
No bash infantil, nós cat /proc/self/mountinfo
e encontrado target
ainda existe!
78 48 8:3 /tmp/source /tmp/target rw,relatime shared:1 - ext4 /dev/disk/by-uuid/98708f21-a59d-4b80-a85c-27b78c22e316 rw,errors=remount-ro,data=ordered
Este é um comportamento inigualável no documento acima. No bash principal, nós cat /proc/self/mountinfo
e encontrado taregt
já desmontou. Agora não conseguimos rmdir target
folder porque o filho bash ainda mantém este ponto de montagem compartilhado.
rm -rf /tmp/target
rm: cannot remove ‘/tmp/target’: Device or resource busy
Testamos isso no Ubuntu 14.04 e no CentOS 6.6. Isso é um bug do kernel? Ou eu entendi mal a montagem compartilhada do Linux.
Tags mount linux linux-kernel bind-mount