mirror of
https://github.com/NVIDIA/nvidia-container-toolkit
synced 2025-06-26 18:18:24 +00:00
Merge commit from fork
Some checks failed
Some checks failed
Add `NVIDIA_CTK_DEBUG=false` to hook envs
This commit is contained in:
commit
450f73a046
@ -70,13 +70,15 @@ func main() {
|
|||||||
Aliases: []string{"d"},
|
Aliases: []string{"d"},
|
||||||
Usage: "Enable debug-level logging",
|
Usage: "Enable debug-level logging",
|
||||||
Destination: &opts.Debug,
|
Destination: &opts.Debug,
|
||||||
EnvVars: []string{"NVIDIA_CDI_DEBUG"},
|
// TODO: Support for NVIDIA_CDI_DEBUG is deprecated and NVIDIA_CTK_DEBUG should be used instead.
|
||||||
|
EnvVars: []string{"NVIDIA_CTK_DEBUG", "NVIDIA_CDI_DEBUG"},
|
||||||
},
|
},
|
||||||
&cli.BoolFlag{
|
&cli.BoolFlag{
|
||||||
Name: "quiet",
|
Name: "quiet",
|
||||||
Usage: "Suppress all output except for errors; overrides --debug",
|
Usage: "Suppress all output except for errors; overrides --debug",
|
||||||
Destination: &opts.Quiet,
|
Destination: &opts.Quiet,
|
||||||
EnvVars: []string{"NVIDIA_CDI_QUIET"},
|
// TODO: Support for NVIDIA_CDI_QUIET is deprecated and NVIDIA_CTK_QUIET should be used instead.
|
||||||
|
EnvVars: []string{"NVDIA_CTK_QUIET", "NVIDIA_CDI_QUIET"},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,6 +95,8 @@ containerEdits:
|
|||||||
- create-symlinks
|
- create-symlinks
|
||||||
- --link
|
- --link
|
||||||
- libcuda.so.1::/lib/x86_64-linux-gnu/libcuda.so
|
- libcuda.so.1::/lib/x86_64-linux-gnu/libcuda.so
|
||||||
|
env:
|
||||||
|
- NVIDIA_CTK_DEBUG=false
|
||||||
- hookName: createContainer
|
- hookName: createContainer
|
||||||
path: {{ .toolkitRoot }}/nvidia-cdi-hook
|
path: {{ .toolkitRoot }}/nvidia-cdi-hook
|
||||||
args:
|
args:
|
||||||
@ -102,6 +104,8 @@ containerEdits:
|
|||||||
- update-ldcache
|
- update-ldcache
|
||||||
- --folder
|
- --folder
|
||||||
- /lib/x86_64-linux-gnu
|
- /lib/x86_64-linux-gnu
|
||||||
|
env:
|
||||||
|
- NVIDIA_CTK_DEBUG=false
|
||||||
mounts:
|
mounts:
|
||||||
- hostPath: /host/driver/root/lib/x86_64-linux-gnu/libcuda.so.999.88.77
|
- hostPath: /host/driver/root/lib/x86_64-linux-gnu/libcuda.so.999.88.77
|
||||||
containerPath: /lib/x86_64-linux-gnu/libcuda.so.999.88.77
|
containerPath: /lib/x86_64-linux-gnu/libcuda.so.999.88.77
|
||||||
|
@ -91,12 +91,16 @@ containerEdits:
|
|||||||
- create-symlinks
|
- create-symlinks
|
||||||
- --link
|
- --link
|
||||||
- libcuda.so.1::/lib/x86_64-linux-gnu/libcuda.so
|
- libcuda.so.1::/lib/x86_64-linux-gnu/libcuda.so
|
||||||
|
env:
|
||||||
|
- NVIDIA_CTK_DEBUG=false
|
||||||
- hookName: createContainer
|
- hookName: createContainer
|
||||||
path: /usr/bin/nvidia-cdi-hook
|
path: /usr/bin/nvidia-cdi-hook
|
||||||
args:
|
args:
|
||||||
- nvidia-cdi-hook
|
- nvidia-cdi-hook
|
||||||
- enable-cuda-compat
|
- enable-cuda-compat
|
||||||
- --host-driver-version=999.88.77
|
- --host-driver-version=999.88.77
|
||||||
|
env:
|
||||||
|
- NVIDIA_CTK_DEBUG=false
|
||||||
- hookName: createContainer
|
- hookName: createContainer
|
||||||
path: /usr/bin/nvidia-cdi-hook
|
path: /usr/bin/nvidia-cdi-hook
|
||||||
args:
|
args:
|
||||||
@ -104,6 +108,8 @@ containerEdits:
|
|||||||
- update-ldcache
|
- update-ldcache
|
||||||
- --folder
|
- --folder
|
||||||
- /lib/x86_64-linux-gnu
|
- /lib/x86_64-linux-gnu
|
||||||
|
env:
|
||||||
|
- NVIDIA_CTK_DEBUG=false
|
||||||
mounts:
|
mounts:
|
||||||
- hostPath: {{ .driverRoot }}/lib/x86_64-linux-gnu/libcuda.so.999.88.77
|
- hostPath: {{ .driverRoot }}/lib/x86_64-linux-gnu/libcuda.so.999.88.77
|
||||||
containerPath: /lib/x86_64-linux-gnu/libcuda.so.999.88.77
|
containerPath: /lib/x86_64-linux-gnu/libcuda.so.999.88.77
|
||||||
|
@ -34,6 +34,7 @@ type Hook struct {
|
|||||||
Lifecycle string
|
Lifecycle string
|
||||||
Path string
|
Path string
|
||||||
Args []string
|
Args []string
|
||||||
|
Env []string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Discover defines an interface for discovering the devices, mounts, and hooks available on a system
|
// Discover defines an interface for discovering the devices, mounts, and hooks available on a system
|
||||||
|
@ -25,7 +25,7 @@ import (
|
|||||||
|
|
||||||
func TestGraphicsLibrariesDiscoverer(t *testing.T) {
|
func TestGraphicsLibrariesDiscoverer(t *testing.T) {
|
||||||
logger, _ := testlog.NewNullLogger()
|
logger, _ := testlog.NewNullLogger()
|
||||||
hookCreator := NewHookCreator("/usr/bin/nvidia-cdi-hook")
|
hookCreator := NewHookCreator("/usr/bin/nvidia-cdi-hook", false)
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
description string
|
description string
|
||||||
@ -71,6 +71,7 @@ func TestGraphicsLibrariesDiscoverer(t *testing.T) {
|
|||||||
Args: []string{"nvidia-cdi-hook", "create-symlinks",
|
Args: []string{"nvidia-cdi-hook", "create-symlinks",
|
||||||
"--link", "../libnvidia-allocator.so.1::/usr/lib64/gbm/nvidia-drm_gbm.so",
|
"--link", "../libnvidia-allocator.so.1::/usr/lib64/gbm/nvidia-drm_gbm.so",
|
||||||
},
|
},
|
||||||
|
Env: []string{"NVIDIA_CTK_DEBUG=false"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -98,6 +99,7 @@ func TestGraphicsLibrariesDiscoverer(t *testing.T) {
|
|||||||
Args: []string{"nvidia-cdi-hook", "create-symlinks",
|
Args: []string{"nvidia-cdi-hook", "create-symlinks",
|
||||||
"--link", "libnvidia-vulkan-producer.so.123.45.67::/usr/lib64/libnvidia-vulkan-producer.so",
|
"--link", "libnvidia-vulkan-producer.so.123.45.67::/usr/lib64/libnvidia-vulkan-producer.so",
|
||||||
},
|
},
|
||||||
|
Env: []string{"NVIDIA_CTK_DEBUG=false"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -129,6 +131,7 @@ func TestGraphicsLibrariesDiscoverer(t *testing.T) {
|
|||||||
"--link", "../libnvidia-allocator.so.1::/usr/lib64/gbm/nvidia-drm_gbm.so",
|
"--link", "../libnvidia-allocator.so.1::/usr/lib64/gbm/nvidia-drm_gbm.so",
|
||||||
"--link", "libnvidia-vulkan-producer.so.123.45.67::/usr/lib64/libnvidia-vulkan-producer.so",
|
"--link", "libnvidia-vulkan-producer.so.123.45.67::/usr/lib64/libnvidia-vulkan-producer.so",
|
||||||
},
|
},
|
||||||
|
Env: []string{"NVIDIA_CTK_DEBUG=false"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
package discover
|
package discover
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"tags.cncf.io/container-device-interface/pkg/cdi"
|
"tags.cncf.io/container-device-interface/pkg/cdi"
|
||||||
@ -49,15 +50,17 @@ type Option func(*CDIHook)
|
|||||||
|
|
||||||
type CDIHook struct {
|
type CDIHook struct {
|
||||||
nvidiaCDIHookPath string
|
nvidiaCDIHookPath string
|
||||||
|
debugLogging bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type HookCreator interface {
|
type HookCreator interface {
|
||||||
Create(string, ...string) *Hook
|
Create(string, ...string) *Hook
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHookCreator(nvidiaCDIHookPath string) HookCreator {
|
func NewHookCreator(nvidiaCDIHookPath string, debugLogging bool) HookCreator {
|
||||||
CDIHook := &CDIHook{
|
CDIHook := &CDIHook{
|
||||||
nvidiaCDIHookPath: nvidiaCDIHookPath,
|
nvidiaCDIHookPath: nvidiaCDIHookPath,
|
||||||
|
debugLogging: debugLogging,
|
||||||
}
|
}
|
||||||
|
|
||||||
return CDIHook
|
return CDIHook
|
||||||
@ -80,6 +83,7 @@ func (c CDIHook) Create(name string, args ...string) *Hook {
|
|||||||
Lifecycle: cdi.CreateContainerHook,
|
Lifecycle: cdi.CreateContainerHook,
|
||||||
Path: c.nvidiaCDIHookPath,
|
Path: c.nvidiaCDIHookPath,
|
||||||
Args: append(c.requiredArgs(name), args...),
|
Args: append(c.requiredArgs(name), args...),
|
||||||
|
Env: []string{fmt.Sprintf("NVIDIA_CTK_DEBUG=%v", c.debugLogging)},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ const (
|
|||||||
|
|
||||||
func TestLDCacheUpdateHook(t *testing.T) {
|
func TestLDCacheUpdateHook(t *testing.T) {
|
||||||
logger, _ := testlog.NewNullLogger()
|
logger, _ := testlog.NewNullLogger()
|
||||||
hookCreator := NewHookCreator(testNvidiaCDIHookPath)
|
hookCreator := NewHookCreator(testNvidiaCDIHookPath, false)
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
description string
|
description string
|
||||||
@ -96,6 +96,7 @@ func TestLDCacheUpdateHook(t *testing.T) {
|
|||||||
Path: testNvidiaCDIHookPath,
|
Path: testNvidiaCDIHookPath,
|
||||||
Args: tc.expectedArgs,
|
Args: tc.expectedArgs,
|
||||||
Lifecycle: "createContainer",
|
Lifecycle: "createContainer",
|
||||||
|
Env: []string{"NVIDIA_CTK_DEBUG=false"},
|
||||||
}
|
}
|
||||||
|
|
||||||
d, err := NewLDCacheUpdateHook(logger, mountMock, hookCreator, tc.ldconfigPath)
|
d, err := NewLDCacheUpdateHook(logger, mountMock, hookCreator, tc.ldconfigPath)
|
||||||
|
@ -115,6 +115,7 @@ func TestWithWithDriverDotSoSymlinks(t *testing.T) {
|
|||||||
Lifecycle: "createContainer",
|
Lifecycle: "createContainer",
|
||||||
Path: "/path/to/nvidia-cdi-hook",
|
Path: "/path/to/nvidia-cdi-hook",
|
||||||
Args: []string{"nvidia-cdi-hook", "create-symlinks", "--link", "libcuda.so.1::/usr/lib/libcuda.so"},
|
Args: []string{"nvidia-cdi-hook", "create-symlinks", "--link", "libcuda.so.1::/usr/lib/libcuda.so"},
|
||||||
|
Env: []string{"NVIDIA_CTK_DEBUG=false"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -147,6 +148,7 @@ func TestWithWithDriverDotSoSymlinks(t *testing.T) {
|
|||||||
Lifecycle: "createContainer",
|
Lifecycle: "createContainer",
|
||||||
Path: "/path/to/nvidia-cdi-hook",
|
Path: "/path/to/nvidia-cdi-hook",
|
||||||
Args: []string{"nvidia-cdi-hook", "create-symlinks", "--link", "libcuda.so.1::/usr/lib/libcuda.so"},
|
Args: []string{"nvidia-cdi-hook", "create-symlinks", "--link", "libcuda.so.1::/usr/lib/libcuda.so"},
|
||||||
|
Env: []string{"NVIDIA_CTK_DEBUG=false"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -178,6 +180,7 @@ func TestWithWithDriverDotSoSymlinks(t *testing.T) {
|
|||||||
Lifecycle: "createContainer",
|
Lifecycle: "createContainer",
|
||||||
Path: "/path/to/nvidia-cdi-hook",
|
Path: "/path/to/nvidia-cdi-hook",
|
||||||
Args: []string{"nvidia-cdi-hook", "create-symlinks", "--link", "libcuda.so.1::/usr/lib/libcuda.so"},
|
Args: []string{"nvidia-cdi-hook", "create-symlinks", "--link", "libcuda.so.1::/usr/lib/libcuda.so"},
|
||||||
|
Env: []string{"NVIDIA_CTK_DEBUG=false"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -247,6 +250,7 @@ func TestWithWithDriverDotSoSymlinks(t *testing.T) {
|
|||||||
Lifecycle: "createContainer",
|
Lifecycle: "createContainer",
|
||||||
Path: "/path/to/nvidia-cdi-hook",
|
Path: "/path/to/nvidia-cdi-hook",
|
||||||
Args: []string{"nvidia-cdi-hook", "create-symlinks", "--link", "libcuda.so.1::/usr/lib/libcuda.so"},
|
Args: []string{"nvidia-cdi-hook", "create-symlinks", "--link", "libcuda.so.1::/usr/lib/libcuda.so"},
|
||||||
|
Env: []string{"NVIDIA_CTK_DEBUG=false"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -301,12 +305,13 @@ func TestWithWithDriverDotSoSymlinks(t *testing.T) {
|
|||||||
"--link", "libGLX_nvidia.so.1.2.3::/usr/lib/libGLX_indirect.so.0",
|
"--link", "libGLX_nvidia.so.1.2.3::/usr/lib/libGLX_indirect.so.0",
|
||||||
"--link", "libnvidia-opticalflow.so.1::/usr/lib/libnvidia-opticalflow.so",
|
"--link", "libnvidia-opticalflow.so.1::/usr/lib/libnvidia-opticalflow.so",
|
||||||
},
|
},
|
||||||
|
Env: []string{"NVIDIA_CTK_DEBUG=false"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
hookCreator := NewHookCreator("/path/to/nvidia-cdi-hook")
|
hookCreator := NewHookCreator("/path/to/nvidia-cdi-hook", false)
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
t.Run(tc.description, func(t *testing.T) {
|
t.Run(tc.description, func(t *testing.T) {
|
||||||
d := WithDriverDotSoSymlinks(
|
d := WithDriverDotSoSymlinks(
|
||||||
|
@ -42,6 +42,7 @@ func (d hook) toSpec() *specs.Hook {
|
|||||||
HookName: d.Lifecycle,
|
HookName: d.Lifecycle,
|
||||||
Path: d.Path,
|
Path: d.Path,
|
||||||
Args: d.Args,
|
Args: d.Args,
|
||||||
|
Env: d.Env,
|
||||||
}
|
}
|
||||||
|
|
||||||
return &s
|
return &s
|
||||||
|
@ -97,6 +97,7 @@ func TestDiscovererFromCSVFiles(t *testing.T) {
|
|||||||
"--link",
|
"--link",
|
||||||
"/usr/lib/aarch64-linux-gnu/tegra/libv4l2_nvargus.so::/usr/lib/aarch64-linux-gnu/libv4l/plugins/nv/libv4l2_nvargus.so",
|
"/usr/lib/aarch64-linux-gnu/tegra/libv4l2_nvargus.so::/usr/lib/aarch64-linux-gnu/libv4l/plugins/nv/libv4l2_nvargus.so",
|
||||||
},
|
},
|
||||||
|
Env: []string{"NVIDIA_CTK_DEBUG=false"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -153,6 +154,7 @@ func TestDiscovererFromCSVFiles(t *testing.T) {
|
|||||||
"--link",
|
"--link",
|
||||||
"/usr/lib/aarch64-linux-gnu/tegra/libv4l2_nvargus.so::/usr/lib/aarch64-linux-gnu/libv4l/plugins/nv/libv4l2_nvargus.so",
|
"/usr/lib/aarch64-linux-gnu/tegra/libv4l2_nvargus.so::/usr/lib/aarch64-linux-gnu/libv4l/plugins/nv/libv4l2_nvargus.so",
|
||||||
},
|
},
|
||||||
|
Env: []string{"NVIDIA_CTK_DEBUG=false"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -181,7 +183,7 @@ func TestDiscovererFromCSVFiles(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
hookCreator := discover.NewHookCreator("/usr/bin/nvidia-cdi-hook")
|
hookCreator := discover.NewHookCreator("/usr/bin/nvidia-cdi-hook", false)
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
t.Run(tc.description, func(t *testing.T) {
|
t.Run(tc.description, func(t *testing.T) {
|
||||||
defer setGetTargetsFromCSVFiles(tc.moutSpecs)()
|
defer setGetTargetsFromCSVFiles(tc.moutSpecs)()
|
||||||
|
@ -18,6 +18,7 @@ package runtime
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/NVIDIA/nvidia-container-toolkit/internal/config"
|
"github.com/NVIDIA/nvidia-container-toolkit/internal/config"
|
||||||
"github.com/NVIDIA/nvidia-container-toolkit/internal/config/image"
|
"github.com/NVIDIA/nvidia-container-toolkit/internal/config/image"
|
||||||
@ -75,7 +76,10 @@ func newSpecModifier(logger logger.Interface, cfg *config.Config, ociSpec oci.Sp
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
hookCreator := discover.NewHookCreator(cfg.NVIDIACTKConfig.Path)
|
hookCreator := discover.NewHookCreator(
|
||||||
|
cfg.NVIDIACTKConfig.Path,
|
||||||
|
cfg.NVIDIAContainerRuntimeConfig.DebugFilePath == "" || cfg.NVIDIAContainerRuntimeConfig.DebugFilePath == os.DevNull,
|
||||||
|
)
|
||||||
|
|
||||||
mode := info.ResolveAutoMode(logger, cfg.NVIDIAContainerRuntimeConfig.Mode, image)
|
mode := info.ResolveAutoMode(logger, cfg.NVIDIAContainerRuntimeConfig.Mode, image)
|
||||||
// We update the mode here so that we can continue passing just the config to other functions.
|
// We update the mode here so that we can continue passing just the config to other functions.
|
||||||
|
@ -29,7 +29,7 @@ import (
|
|||||||
|
|
||||||
func TestNvidiaSMISymlinkHook(t *testing.T) {
|
func TestNvidiaSMISymlinkHook(t *testing.T) {
|
||||||
logger, _ := testlog.NewNullLogger()
|
logger, _ := testlog.NewNullLogger()
|
||||||
hookCreator := discover.NewHookCreator("nvidia-cdi-hook")
|
hookCreator := discover.NewHookCreator("nvidia-cdi-hook", false)
|
||||||
|
|
||||||
errMounts := errors.New("mounts error")
|
errMounts := errors.New("mounts error")
|
||||||
|
|
||||||
@ -96,6 +96,7 @@ func TestNvidiaSMISymlinkHook(t *testing.T) {
|
|||||||
Path: "nvidia-cdi-hook",
|
Path: "nvidia-cdi-hook",
|
||||||
Args: []string{"nvidia-cdi-hook", "create-symlinks",
|
Args: []string{"nvidia-cdi-hook", "create-symlinks",
|
||||||
"--link", "nvidia-smi::/usr/bin/nvidia-smi"},
|
"--link", "nvidia-smi::/usr/bin/nvidia-smi"},
|
||||||
|
Env: []string{"NVIDIA_CTK_DEBUG=false"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -116,6 +117,7 @@ func TestNvidiaSMISymlinkHook(t *testing.T) {
|
|||||||
Path: "nvidia-cdi-hook",
|
Path: "nvidia-cdi-hook",
|
||||||
Args: []string{"nvidia-cdi-hook", "create-symlinks",
|
Args: []string{"nvidia-cdi-hook", "create-symlinks",
|
||||||
"--link", "/some/path/nvidia-smi::/usr/bin/nvidia-smi"},
|
"--link", "/some/path/nvidia-smi::/usr/bin/nvidia-smi"},
|
||||||
|
Env: []string{"NVIDIA_CTK_DEBUG=false"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -136,6 +138,7 @@ func TestNvidiaSMISymlinkHook(t *testing.T) {
|
|||||||
Path: "nvidia-cdi-hook",
|
Path: "nvidia-cdi-hook",
|
||||||
Args: []string{"nvidia-cdi-hook", "create-symlinks",
|
Args: []string{"nvidia-cdi-hook", "create-symlinks",
|
||||||
"--link", "/some/path/nvidia-smi::/usr/bin/nvidia-smi"},
|
"--link", "/some/path/nvidia-smi::/usr/bin/nvidia-smi"},
|
||||||
|
Env: []string{"NVIDIA_CTK_DEBUG=false"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -85,7 +85,7 @@ func New(opts ...Option) (Interface, error) {
|
|||||||
l.nvidiaCDIHookPath = "/usr/bin/nvidia-cdi-hook"
|
l.nvidiaCDIHookPath = "/usr/bin/nvidia-cdi-hook"
|
||||||
}
|
}
|
||||||
// create hookCreator
|
// create hookCreator
|
||||||
l.hookCreator = discover.NewHookCreator(l.nvidiaCDIHookPath)
|
l.hookCreator = discover.NewHookCreator(l.nvidiaCDIHookPath, false)
|
||||||
|
|
||||||
if l.driverRoot == "" {
|
if l.driverRoot == "" {
|
||||||
l.driverRoot = "/"
|
l.driverRoot = "/"
|
||||||
|
Loading…
Reference in New Issue
Block a user