From ea8fb96c3e93697fbd50379d07273bcf03e9f992 Mon Sep 17 00:00:00 2001 From: Julio Montes Date: Fri, 31 Jan 2020 19:32:01 +0000 Subject: [PATCH] virtcontainers/persist: introduce rootless fs driver Rootless fs driver inherits from FS and may overwrite its methods. All files and directories created by this driver are under a path accessible for the current user, typically this path is defined by the environment variable `XDG_RUNTIME_DIR`, if this variable is not defined, the default path `/run/user/$UID` is used instead, where $UID is the current user ID. fixes #2416 Signed-off-by: Julio Montes --- virtcontainers/persist/fs/rootlessfs.go | 48 +++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 virtcontainers/persist/fs/rootlessfs.go diff --git a/virtcontainers/persist/fs/rootlessfs.go b/virtcontainers/persist/fs/rootlessfs.go new file mode 100644 index 0000000000..19fec2b9bc --- /dev/null +++ b/virtcontainers/persist/fs/rootlessfs.go @@ -0,0 +1,48 @@ +// Copyright (c) 2020 Intel Corporation +// +// SPDX-License-Identifier: Apache-2.0 +// + +package fs + +import ( + "fmt" + "os" + "path/filepath" + + persistapi "github.com/kata-containers/runtime/virtcontainers/persist/api" +) + +// default xdg runtime directory just in case XDG_RUNTIME_DIR is not set +var defaultXdgRuntimeDir = fmt.Sprintf("/run/user/%d", os.Getuid()) + +type RootlessFS struct { + // inherit from FS. Overwrite if needed. + *FS +} + +func RootlessInit() (persistapi.PersistDriver, error) { + driver, err := Init() + if err != nil { + return nil, fmt.Errorf("Could not create Rootless FS driver: %v", err) + } + + fsDriver, ok := driver.(*FS) + if !ok { + return nil, fmt.Errorf("Could not create Rootless FS driver") + } + + // XDG_RUNTIME_DIR defines the base directory relative to + // which user-specific non-essential runtime files are stored. + rootlessDir := os.Getenv("XDG_RUNTIME_DIR") + if rootlessDir == "" { + rootlessDir = defaultXdgRuntimeDir + fsLog.WithField("default-runtime-dir", defaultXdgRuntimeDir). + Warnf("XDG_RUNTIME_DIR variable is not set. Using default runtime directory") + } + + fsDriver.storageRootPath = filepath.Join(rootlessDir, fsDriver.storageRootPath) + fsDriver.driverName = "rootlessfs" + + return &RootlessFS{fsDriver}, nil +}