[Lxc-users] Container start unmounts shared bind mounts

Serge Hallyn serge.hallyn at canonical.com
Fri Feb 10 15:05:19 UTC 2012


Quoting Ivan Vilata i Balaguer (ivan at selidor.net):
> Serge Hallyn (2012-02-09 19:30:29 +0100) wrote:
> 
> > Quoting Ivan Vilata i Balaguer (ivan at selidor.net):
> >> Hi all.  I'm running Debian's LXC 0.7.5 under Linux 3.2.0.  I've set up
> >> a shared mountpoint to dynamically export some host directories into one
> >> container, like this::
> >> 
> >>   # mkdir -p /lxc-shared
> >>   # mount --bind /lxc-shared /lxc-shared
> >>   # mount --make-unbindable /lxc-shared
> >>   # mount --make-shared /lxc-shared
> >
> > (I should think more before answering, but ...)
> >
> > What if you do 'mount --make-rslave /lxc-shared' here?  That should
> > prevent the container's mount actions from being forwarded to the
> > host.
> 
> Thanks for the suggestion!  That does prevent a starting container from
> unmounting bind mounts under /lxc-shared in the host, *however* it also
> renders (un)mounts performed after the --make-rslave invisible to any
> container which had access to the directory.  E.g. imagine myvm has a

Right, this was a quick test.  What you actually want to do is leave the
mount shared on the host, and have the container startup turn it into a
slave mount.  I'm not sure offhand what would be the best time to do this,
but one thing you could do is use a wrapper around lxc-start like:

mv /usr/bin/lxc-start /usr/bin/lxc-start.real

cat > /usr/bin/lxc-start.mid << EOF
mount --make-unbindable /lxc-shared
mount --make-shared /lxc-shared
exec /usr/bin/lxc-start.real $*
EOF

cat > /usr/bin/lxc-start << EOF
lxc-unshare -s MOUNT -- /usr/bin/lxc-start.mid $*
EOF

chmod ugo+x /usr/bin/lxc-start{,.mid}

You can probably do this through /var/lib/lxc/<container>/fstab entries,
but it would take some tweaking.  We could also add support for this
in the lxc config files.  I think it's a common enough request that it'd
be worth doing.

> /shared directory and this config line::
> 
>   lxc.mount.entry = /lxc-shared/myvm/ /var/lib/lxc/debtest/rootfs/shared/ none defaults,bind 0 0
> 
> Then::
> 
>   host# mkdir -p /lxc-shared
>   host# mount --bind /lxc-shared /lxc-shared
>   host# mount --make-shared /lxc-shared
>   host# lxc-start -n myvm -d
>   # myvm sees /lxc-shared/myvm at /shared
>   host# mkdir -p /lxc-shared/myvm/foo
>   host# mount --bind /tmp /lxc-shared/myvm/foo
>   # myvm sees mounted /shared/foo
>   host# mount --make-rslave /lxc-shared
>   # myvm still sees mounted /shared/foo
>   host# lxc-start -n myothervm -d
>   # myvm still sees mounted /shared/foo
>   host# mkdir -p /lxc-shared/myvm/bar
>   host# mount --bind /tmp /lxc-shared/myvm/bar
>   # myvm sees /shared/bar but nothing mounted on it!
> 
> A workaround I found is bind mounting the desired directory *in the
> container* (which requires not dropping the sys_admin capability)::
> 
>   host# mkdir -p /lxc-shared
>   host# mount --bind /lxc-shared /lxc-shared
>   host# mount --make-shared /lxc-shared
>   host# lxc-start -n myvm -d
>   # myvm sees /lxc-shared/myvm at /shared
>   host# mkdir -p /lxc-shared/myvm/foo
>   host# mount --bind /tmp /lxc-shared/myvm/foo
>   # myvm sees mounted /shared/foo
>   myvm# mount --bind /shared/foo /mnt/foo
>   host# lxc-start -n myothervm -d
>   # host's /lxc-shared/myvm/foo gets unmounted
>   # myvm sees /shared/foo but nothing mounted on it
>   # myvm still sees mounted /mnt/foo
>   host# mkdir -p /lxc-shared/myvm/bar
>   host# mount --bind /tmp /lxc-shared/myvm/bar
>   # myvm sees mounted /shared/bar
>   myvm# mount --bind /shared/bar /mnt/bar
>   # and so on...
> 
> However, the question still remains: *Why on Earth does starting a
> container unmount all bind mounts under a shared mount???*
> 
> Doesn't it look like a bug to you?

No, when a container starts up, it mounts its new root under, say,
/usr/lib/lxc/, and mounts other directories under there.  Then it
does pivot_root (see man 8 pivot_root), so now /usr/lib/lxc is its
'/', and the old '/' and all its submounts are now mounted on '/old'.
Then the container startup recursively unmounts /old, including
/old/lxc-shared.

That umount of /old/lxc-shared is what is getting propagated to
the host mount.

-serge

> Thanks & cheers!
> 
> >> Now I bind mount the host directory under the shared directory::
> >> 
> >>   # mkdir -p /lxc-shared/myvm/foo
> >>   # mount --bind /tmp /lxc-shared/myvm/foo
> >> The problem is that whenever I start any container, /lxc-shared/myvm/foo
> >> gets unmounted (even if it has processes working under it!).  This
> >> affects bind mounts only if they are under shared mountpoints, e.g. if I
> >> also do this mount on the host::
> >> 
> >>   # mount --bind /tmp /mnt
> >> 
> >> It survives after starting the container.
> >> 
> >> Does anyone know why does this happen?  Should I file a bug report?
> >> Thanks a lot!
> -- 
> Ivan Vilata i Balaguer -- https://elvil.net/
> 
> 
> ------------------------------------------------------------------------------
> Virtualization & Cloud Management Using Capacity Planning
> Cloud computing makes use of virtualization - but cloud computing 
> also focuses on allowing computing to be delivered as a service.
> http://www.accelacomm.com/jaw/sfnl/114/51521223/
> _______________________________________________
> Lxc-users mailing list
> Lxc-users at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-users




More information about the lxc-users mailing list