"pelzflorian (Florian Pelz)" <pelzflor...@pelzflorian.de> skribis:
> Ludovic Courtès <l...@gnu.org> writes: >> Do you see hints as to whether uvesafb gets loaded? >> >> You can do that by adding “console=ttyS0” to the kernel arguments and by >> passing ‘-serial stdio’ to QEMU. > > This serial output shows nothing about uvesafb, but dmesg contains about > uvesafb exactly the same modprobe failure as initially without > LINUX_MODULE_DIRECTORY. Oooh. ‘invoke’ uses ‘system*’, and in shepherd 0.9.3, ‘system*’ is implemented in terms of ‘fork+exec-command’, which only passes the environment variables listed in ‘default-environment-variables’ by default. Thus, (setenv "LINUX_MODULE_DIRECTORY" …) had no effect on the child process; it just wouldn’t see LINUX_MODULE_DIRECTORY. I think the patch below will be good… or very close to it. Lemme know! Thanks, Ludo’.
diff --git a/gnu/system/install.scm b/gnu/system/install.scm index f6f1923121..e524729baf 100644 --- a/gnu/system/install.scm +++ b/gnu/system/install.scm @@ -289,11 +289,21 @@ (define (uvesafb-shepherd-service _) (provision '(maybe-uvesafb)) (requirement '(file-systems)) (start #~(lambda () - (or (file-exists? "/dev/fb0") + (unless (file-exists? "/dev/fb0") + ;; In shepherd 0.9.3, 'system*' is implemented in terms + ;; of 'fork+exec-command'. Thus, set + ;; 'default-environment-variables' to pass an extra + ;; variable to the child process. + (parameterize ((default-environment-variables + `("LINUX_MODULE_DIRECTORY=/run/booted-system/kernel/lib/modules" + ,(environ)))) + ;; TODO: Use 'load-linux-modules-from-directory' + ;; instead. (invoke #+(file-append kmod "/bin/modprobe") "uvesafb" (string-append "v86d=" #$v86d "/sbin/v86d") - "mode_option=1024x768")))) + "mode_option=1024x768")) + #t))) (respawn? #f) (one-shot? #t))))