When doing a copyup, /tmp can not be a shared mount point
MOVE_MOUNT will fail under certain situations. You are not allowed to MS_MOVE if the parent directory is shared. man mount ... The move operation Move a mounted tree to another place (atomically). The call is: mount --move olddir newdir This will cause the contents which previously appeared under olddir to now be accessible under newdir. The physical location of the files is not changed. Note that olddir has to be a mountpoint. Note also that moving a mount residing under a shared mount is invalid and unsupported. Use findmnt -o TARGET,PROPAGATION to see the current propagation flags. Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
parent
20aff4f048
commit
62a4763a7a
|
@ -152,6 +152,26 @@ func finalizeRootfs(config *configs.Config) (err error) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// /tmp has to be mounted as private to allow MS_MOVE to work in all situations
|
||||||
|
func prepareTmp(topTmpDir string) (string, error) {
|
||||||
|
tmpdir, err := ioutil.TempDir(topTmpDir, "runctop")
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
if err := unix.Mount(tmpdir, tmpdir, "bind", unix.MS_BIND, ""); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
if err := unix.Mount("", tmpdir, "", uintptr(unix.MS_PRIVATE), ""); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return tmpdir, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func cleanupTmp(tmpdir string) error {
|
||||||
|
unix.Unmount(tmpdir, 0)
|
||||||
|
return os.RemoveAll(tmpdir)
|
||||||
|
}
|
||||||
|
|
||||||
func mountCmd(cmd configs.Command) error {
|
func mountCmd(cmd configs.Command) error {
|
||||||
command := exec.Command(cmd.Path, cmd.Args[:]...)
|
command := exec.Command(cmd.Path, cmd.Args[:]...)
|
||||||
command.Env = cmd.Env
|
command.Env = cmd.Env
|
||||||
|
@ -199,7 +219,12 @@ func mountToRootfs(m *configs.Mount, rootfs, mountLabel string) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if copyUp {
|
if copyUp {
|
||||||
tmpDir, err = ioutil.TempDir("/tmp", "runctmpdir")
|
tmpdir, err := prepareTmp("/tmp")
|
||||||
|
if err != nil {
|
||||||
|
return newSystemErrorWithCause(err, "tmpcopyup: failed to setup tmpdir")
|
||||||
|
}
|
||||||
|
defer cleanupTmp(tmpdir)
|
||||||
|
tmpDir, err = ioutil.TempDir(tmpdir, "runctmpdir")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return newSystemErrorWithCause(err, "tmpcopyup: failed to create tmpdir")
|
return newSystemErrorWithCause(err, "tmpcopyup: failed to create tmpdir")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue