diff --git a/runtime.go b/runtime.go index ac510e4d3b..7fb673f433 100644 --- a/runtime.go +++ b/runtime.go @@ -582,7 +582,7 @@ func NewRuntimeFromDirectory(config *DaemonConfig) (*Runtime, error) { return nil, err } - if err := copyLxcStart(config.Root); err != nil { + if err := linkLxcStart(config.Root); err != nil { return nil, err } g, err := NewGraph(path.Join(config.Root, "graph")) @@ -647,25 +647,21 @@ func (runtime *Runtime) Close() error { return runtime.containerGraph.Close() } -func copyLxcStart(root string) error { +func linkLxcStart(root string) error { sourcePath, err := exec.LookPath("lxc-start") if err != nil { return err } targetPath := path.Join(root, "lxc-start-unconfined") - sourceFile, err := os.Open(sourcePath) - if err != nil { + + if _, err := os.Stat(targetPath); err != nil && !os.IsNotExist(err) { return err + } else if err == nil { + if err := os.Remove(targetPath); err != nil { + return err + } } - defer sourceFile.Close() - targetFile, err := os.Create(targetPath) - if err != nil { - return err - } - defer targetFile.Close() - os.Chmod(targetPath, 0755) - _, err = io.Copy(targetFile, sourceFile) - return err + return os.Symlink(sourcePath, targetPath) } // History is a convenience type for storing a list of containers,