Code change:
<ins> From 783ec26c0d83013baf04579a6a415d7f8776ac93 Mon Sep 17 00:00:00 2001 From: Someone Serge <sergei.kozlukov@aalto.fi> Date: Sun, 7 Jan 2024 11:48:24 +0000 Subject: [PATCH] ldCache(): patch for @driverLink@ --- internal/pkg/util/paths/resolve.go | 41 +++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/internal/pkg/util/paths/resolve.go b/internal/pkg/util/paths/resolve.go index db45d9db1..9d0110b6b 100644 --- a/internal/pkg/util/paths/resolve.go +++ b/internal/pkg/util/paths/resolve.go @@ -14,6 +14,7 @@ import ( "fmt" "os" "os/exec" +	"path" "path/filepath" "regexp" "strings" @@ -154,14 +155,49 @@ func Resolve(fileList []string) ([]string, []string, error) { // lists three variants of libEGL.so.1 that are in different locations, we only // report the first, highest priority, variant. func ldCache() (map[string]string, error) { +    driverDirs := strings.Split("@driverLink@/lib", ":") +    if machine, err := elfMachine(); err == nil && machine == elf.EM_386 { +        driverDirs = strings.Split("@driverLink@-32/lib", ":") +    } + +    soPattern, err := regexp.Compile(`[^s]+.so(.d+(.d+(.d+)?)?)?$`) +    if err != nil { +		return nil, fmt.Errorf("could not compile ldconfig regexp: %v", err) +    } + +	ldCache := make(map[string]string) +    for _, dirPath := range driverDirs { +        dir, err := os.Open(dirPath) +        if err != nil { +            /* Maybe we're not running under NixOS */ +            continue +        } +        files, err := dir.ReadDir(-1) +        if err != nil { +            continue +        } +        for _, f := range files { +            if !soPattern.MatchString(f.Name()) { +                continue +            } +            libName := f.Name() +            libPath := path.Join(dirPath, f.Name()) +			if _, ok := ldCache[libName]; !ok { +				ldCache[libName] = libPath +			} +        } +    } + // walk through the ldconfig output and add entries which contain the filenames // returned by nvidia-container-cli OR the nvliblist.conf file contents ldconfig, err := bin.FindBin("ldconfig") -	if err != nil { +	if err != nil && len(ldCache) == 0 { +        // Note that missing ldconfig is only an "error" as long +        // as there's no driverLink return nil, err } out, err := exec.Command(ldconfig, "-p").Output() -	if err != nil { +	if err != nil && len(ldCache) == 0 { return nil, fmt.Errorf("could not execute ldconfig: %v", err) } @@ -173,7 +209,6 @@ func ldCache() (map[string]string, error) { } // store library name with associated path -	ldCache := make(map[string]string) for _, match := range r.FindAllSubmatch(out, -1) { if match != nil { // libName is the "libnvidia-ml.so.1" (from the above example) -- 2.42.0 </ins>

Related discussion:
text: singularity cannot use nvidia gpu because it does not access 'nvidia-container-cli' Steps to reproduce the behavior: return result of ! This is because the path is not listed in , as also in a. It is caused by neither the option nor . I tried to handle it with override, but since it was called in , I think it is impossible to handle. Also, I created a conf file in as shown in the singularity docs, but it was not read. <!-- Please @ people who are in the list of the offending package or module. If in doubt, check for whoever last touched something. --Please run and paste the result.
Thank you for reporting and sorry for the trouble. I'll look at the SingularityCE documentation again. (Those configuration options has been deprecated by Apptainer.) Also, I created a conf file in /usr/local/etc/singularity/ as shown in the singularity docs, but it was not read.  shold be what you are looking for. The overriden package can be assigned to . (If you would like to bypass all the overriding done by the module and directly specify the package to install for some special reason, you can assign it to .)
Thanks for the reply. I followed your advice and tried the override and was able to use the GPU. Here is the code This is simply adding a process to append the nvidia-docker path to the I mentioned earlier that when conf was entered in , it was not reflected, and the same is true for '/etc/singularity'. I referred to .
At least we have confirmed that in works and the path is replaced by , but the product does not seem to be recognizable.
Does setting the to make ldconfig search in help? This is modified from the configuration proposed by (). There's also (probably) related to this topic.
Adding the path of to works well. This once removed from consideration. Next we have a patched version of ldconfig. This does not append the path of to the config. The result was an error that could not be found, and it could not be started.
Oh, I already forgot about this issue. Absolutely coincidentally, but maybe efforts such as might open up a way to implement this hack more reliably.