diff --git a/cmd/nvidia-ctk-installer/container/toolkit/toolkit_test.go b/cmd/nvidia-ctk-installer/container/toolkit/toolkit_test.go index ec9dc5bd..5f12a68b 100644 --- a/cmd/nvidia-ctk-installer/container/toolkit/toolkit_test.go +++ b/cmd/nvidia-ctk-installer/container/toolkit/toolkit_test.go @@ -86,6 +86,7 @@ devices: hostPath: /host/driver/root/dev/nvidia-caps-imex-channels/channel2047 containerEdits: env: + - LIBCUDA_SO_PARENT_DIRECTORY_CONTAINER_PATH=/lib/x86_64-linux-gnu - NVIDIA_VISIBLE_DEVICES=void hooks: - hookName: createContainer diff --git a/cmd/nvidia-ctk/cdi/generate/generate_test.go b/cmd/nvidia-ctk/cdi/generate/generate_test.go index 9e9a6a4e..7fa1fb92 100644 --- a/cmd/nvidia-ctk/cdi/generate/generate_test.go +++ b/cmd/nvidia-ctk/cdi/generate/generate_test.go @@ -79,6 +79,7 @@ devices: hostPath: {{ .driverRoot }}/dev/nvidia0 containerEdits: env: + - LIBCUDA_SO_PARENT_DIRECTORY_CONTAINER_PATH=/lib/x86_64-linux-gnu - NVIDIA_VISIBLE_DEVICES=void deviceNodes: - path: /dev/nvidiactl diff --git a/pkg/nvcdi/driver-nvml.go b/pkg/nvcdi/driver-nvml.go index f49f1129..47b67dd8 100644 --- a/pkg/nvcdi/driver-nvml.go +++ b/pkg/nvcdi/driver-nvml.go @@ -82,7 +82,7 @@ func (l *nvcdilib) newDriverVersionDiscoverer(version string) (discover.Discover // NewDriverLibraryDiscoverer creates a discoverer for the libraries associated with the specified driver version. func (l *nvcdilib) NewDriverLibraryDiscoverer(version string) (discover.Discover, error) { - libraryPaths, err := getVersionLibs(l.logger, l.driver, version) + libraryPaths, libCudaDirectoryPath, err := getVersionLibs(l.logger, l.driver, version) if err != nil { return nil, fmt.Errorf("failed to get libraries for driver version: %v", err) } @@ -115,6 +115,12 @@ func (l *nvcdilib) NewDriverLibraryDiscoverer(version string) (discover.Discover updateLDCache, _ := discover.NewLDCacheUpdateHook(l.logger, libraries, l.nvidiaCDIHookPath, l.ldconfigPath) discoverers = append(discoverers, updateLDCache) + environmentVariable := &discover.EnvVar{ + Name: "LIBCUDA_SO_PARENT_DIRECTORY_CONTAINER_PATH", + Value: libCudaDirectoryPath, + } + discoverers = append(discoverers, environmentVariable) + d := discover.Merge(discoverers...) return d, nil @@ -202,39 +208,41 @@ func NewDriverBinariesDiscoverer(logger logger.Interface, driverRoot string) dis // getVersionLibs checks the LDCache for libraries ending in the specified driver version. // Although the ldcache at the specified driverRoot is queried, the paths are returned relative to this driverRoot. // This allows the standard mount location logic to be used for resolving the mounts. -func getVersionLibs(logger logger.Interface, driver *root.Driver, version string) ([]string, error) { +func getVersionLibs(logger logger.Interface, driver *root.Driver, version string) ([]string, string, error) { logger.Infof("Using driver version %v", version) libCudaPaths, err := cuda.New( driver.Libraries(), ).Locate("." + version) if err != nil { - return nil, fmt.Errorf("failed to locate libcuda.so.%v: %v", version, err) + return nil, "", fmt.Errorf("failed to locate libcuda.so.%v: %v", version, err) } - libRoot := filepath.Dir(libCudaPaths[0]) + libCudaDirectoryPath := filepath.Dir(libCudaPaths[0]) libraries := lookup.NewFileLocator( lookup.WithLogger(logger), lookup.WithSearchPaths( - libRoot, - filepath.Join(libRoot, "vdpau"), + libCudaDirectoryPath, + filepath.Join(libCudaDirectoryPath, "vdpau"), ), lookup.WithOptional(true), ) libs, err := libraries.Locate("*.so." + version) if err != nil { - return nil, fmt.Errorf("failed to locate libraries for driver version %v: %v", version, err) + return nil, "", fmt.Errorf("failed to locate libraries for driver version %v: %v", version, err) } if driver.Root == "/" || driver.Root == "" { - return libs, nil + return libs, libCudaDirectoryPath, nil } + libCudaDirectoryPath = driver.RelativeToRoot(libCudaDirectoryPath) + var relative []string for _, l := range libs { relative = append(relative, strings.TrimPrefix(l, driver.Root)) } - return relative, nil + return relative, libCudaDirectoryPath, nil }