• Tycho Andersen's avatar
    restore: correctly restore cgroup mounts inside a container · 84a89b46
    Tycho Andersen authored
    Before the nsroot= mount option, we were just getting lucky because the
    cgroup superblocks "matched" when inspecting them from userspace, so we
    were actually getting a bind mount from the host when migrating from within
    cgroup namespaces.
    
    Instead, let's actually do a new (i.e. not a bind mount) for cgroup
    namespaces. For this, we need two things:
    
    1. to prepare the cgroup namespace (and thus the cgroups) before the mount
       ns, so when the mount() occurrs it is relative to the right cgroup path.
    
    2. not reject cgroup filesystems with no root. A cgroup ns mount looks
       like:
    
    	 223 222 0:22 /lxc/unpriv /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd,nsroot=/lxc/unpriv
    
       i.e. it has /lxc/unpriv as its root, and thus doesn't look rooted to CRIU.
       We use the fstype->parse hook to rewrite this root to /, since it
       is handled by the cgroup ns infrastructure.
    
    v2: add new fstype->munge hook, allowing fstypes to munge their parsed
        mountinfo entries if they want to. this allows us to get rid of the
        ugly hacks with FSTYPE__CGROUP everywhere in teh patch.
    v3: s/fstype->munge/fstype->parse for FSTYPE__CGROUP
    Signed-off-by: 's avatarTycho Andersen <tycho.andersen@canonical.com>
    Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
    84a89b46
mount.c 79.2 KB