[lxc-devel] [PATCH 1/1] setup_rootfs: always mount / slave
Serge Hallyn
serge.hallyn at ubuntu.com
Fri Feb 28 05:52:35 UTC 2014
Quoting Serge Hallyn (serge.hallyn at ubuntu.com):
> Quoting Serge Hallyn (serge.hallyn at ubuntu.com):
> > When the host root is rshared, this appears to fix both the extra mounts
> > in the container's /proc/self/mounts, and the lxc-attach ending up in
> > the host rootfs.
> >
> > chroot_into_slave is careful to turn mounts into slave mounts
> > as quickly as possible, but for reasons I haven't wrapped my
> > head around, not quickly enough. Mounting / ms_slave first
> > appears to do the trick.
> >
> > It's possible that in cases (like android) where / is a chroot
> > and not a bind mount, this will fail, in which case we'll need
> > to first do a bind mount of / onto itself. Let's not do that
> > until we're sure we need it.
> >
> > Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
> > ---
> > src/lxc/conf.c | 5 +++++
> > 1 file changed, 5 insertions(+)
> >
> > diff --git a/src/lxc/conf.c b/src/lxc/conf.c
> > index fc39897..2b1ba20 100644
> > --- a/src/lxc/conf.c
> > +++ b/src/lxc/conf.c
> > @@ -1500,6 +1500,11 @@ static int setup_rootfs(struct lxc_conf *conf)
> > return 0;
> > }
> >
> > + if (mount("", "/", NULL, MS_SLAVE, 0)) {
>
> Ok, so thanks Stéphane for testing this on arch. Where it fails.
> Here are some datapoints:
>
> 1. On Ubuntu, mount("", "/", NULL, MS_SLAVE|MS_REC) fails with -EPERM.
> I don't understand why. However mount("", "/", NULL, MS_SLAVE)
> works, and makes lxc work with / mount-rshared.
>
> 2. On Arch, using mount("", "/", NULL, MS_SLAVE|MS_REC) instead of
> the above line fixes lxc-start and lxc-attach. The reason why not
> having MS_REC failed is that chroot_into_slave() is now being
> skipped altogether, but all mounts UNDER / are still shared. So
> things like cgroups are getting unmounted on the host while the
> container does its mount cleanup after pivot_root().
>
> So,
>
> 1. we need to understand why MS_SLAVE|MS_REC sometimes fails. (doesn't
> seem to be apparmor)
>
> 2. if we go with MS_SLAVE|MS_REC (perhaps ignoring return value), we'll
> still want the chroot_into_slave to catch the case where / on the host
> is a directory on ramfs. We will then need a better test for when we
> need to call it (in setup_rootfs()).
oh I forgot to mention another route. The above paths try to also solve
the problem of having extra entries polluting /proc/$$/mounts (which do
not show up in /proc/self/mountinfo). However I had also tried adding
a chroot(/proc/init_pid/root) to attach. This worked in the case of a
MS_SHARED / on the host, but strangely failed otherwise.
If anyone else is looking into these things, hopefully my findings are
helpful... personally my next step when I have time will be to take a
step back and figure out why we're getting the extra mounts in the
first place.
-serge
More information about the lxc-devel
mailing list