From 97c94fc2c210341edc5099856c5c0e83cfc0bd86 Mon Sep 17 00:00:00 2001 From: "Jan (janneke) Nieuwenhuizen" Date: Wed, 6 May 2020 08:22:41 +0200 Subject: gnu: hurd: Create minimal "runsystem" script to invoke "rc". This moves towards a regular Guix startup, loading SYSTEM/boot to activate the system and start the shepherd. * gnu/packages/hurd.scm (hurd-rc-script): Update to handle "runsystem" tasks. Load system/boot to activate the system and start the shepherd. Create /hurd symlink. (hurd)[arguments]: Add 'create-runsystem' phase. Do not substitute now unused init.c, runsystem.hurd. Substitute "/hurd/" for the fixed 'out + "/hurd/"' in boot.c, console-run.c and startup.c. Also substitute _HURD_STARTUP ("/hurd/startup") to the fixed 'out + "/hurd/startup"' in libdiskfs/boot-start.c and libdiskfs/opts-std-startup.c. --- gnu/packages/hurd.scm | 152 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 115 insertions(+), 37 deletions(-) diff --git a/gnu/packages/hurd.scm b/gnu/packages/hurd.scm index 278568b583..b341683afe 100644 --- a/gnu/packages/hurd.scm +++ b/gnu/packages/hurd.scm @@ -329,10 +329,26 @@ (define rc (with-imported-modules '((guix build utils)) #~(begin (use-modules (guix build utils) - (ice-9 match)) - - ;; "@HURD@" is a placeholder. - (setenv "PATH" "@HURD@/bin") + (ice-9 match) + (system repl repl) + (srfi srfi-1) + (srfi srfi-26)) + + (display "Welcome, this is GNU's early boot Guile.\n") + (display "Use '--repl' for an initrd REPL.\n\n") + + ;; "@HURD@" and "@COREUTILS@" are a placeholders. + (setenv "PATH" "@HURD@/bin:@HURD@/sbin:@COREUTILS@/bin") + + ;; XXX FIXME c&p from linux-boot.scm + (define (find-long-option option arguments) + "Find OPTION among ARGUMENTS, where OPTION is something like \"--load\". +Return the value associated with OPTION, or #f on failure." + (let ((opt (string-append option "="))) + (and=> (find (cut string-prefix? opt <>) + arguments) + (lambda (arg) + (substring arg (+ 1 (string-index arg #\=))))))) (define (translated? node) ;; Return true if a translator is installed on NODE. @@ -349,10 +365,54 @@ (define (translated? node) (apply invoke "settrans" "-c" node command)))) '#$translators) - ;; Start the oh-so-fancy console client. - (mkdir-p "/var/run") ;for the PID file - (invoke "console" "--daemonize" "-c" "/dev/vcs" - "-d" "vga" "-d" "pc_kbd" "-d" "generic_speaker")))) + (format #t "Creating essential device nodes...\n") + (with-directory-excursion "/dev" + (invoke "MAKEDEV" "--devdir=/dev" "std") + (invoke "MAKEDEV" "--devdir=/dev" "vcs") + (invoke "MAKEDEV" "--devdir=/dev" "tty1""tty2" "tty3" "tty4" "tty5" "tty6") + (invoke "MAKEDEV" "--devdir=/dev" "ptyp0" "ptyp1" "ptyp2") + (invoke "MAKEDEV" "--devdir=/dev" "console")) + + (let* ((args (command-line)) + (system (find-long-option "--system" args)) + (to-load (find-long-option "--load" args))) + + (false-if-exception (delete-file "/hurd")) + (let ((hurd/hurd (string-append system "/profile/hurd"))) + (symlink hurd/hurd "/hurd")) + + (format #t "Starting pager...\n") + (unless (zero? (system* "/hurd/mach-defpager")) + (format #t "FAILED...Good luck!\n")) + + (cond ((member "--repl" args) + (format #t "Starting repl...\n") + (start-repl)) + (to-load + (format #t "loading '~a'...\n" to-load) + (primitive-load to-load) + (format (current-error-port) + "boot program '~a' terminated, rebooting~%" + to-load) + (let ((shepherd.conf + (if (file-exists? "/etc/shepherd.conf") + "/etc/shepherd.conf" + (let ((files (find-files "/gnu/store" ".*-shepherd.conf"))) + (and (pair? files) (car files)))))) + (unless shepherd.conf + (format #t "No shepherd.conf found, dropping to a shell...\n") + (invoke "/run/current-system/profile/bin/bash") + (reboot)) + (false-if-exception (delete-file "/var/run/shepherd/socket")) + (format #t "Starting the Shepherd... ~a\n" shepherd.conf) + (execl "/run/current-system/profile/bin/shepherd" "shepherd" + "--config" shepherd.conf)) + (sleep 2) + (reboot)) + (else + (display "no boot file passed via '--load'\n") + (display "entering a warm and cozy REPL\n") + (start-repl))))))) ;; FIXME: We want the program to use the cross-compiled Guile when ;; cross-compiling. But why do we need to be explicit here? @@ -425,6 +485,28 @@ (define-public hurd (substitute* '("daemons/Makefile" "utils/Makefile") (("-o root -m 4755") "")) #t)) + (add-after 'unpack 'create-runsystem + (lambda _ + ;; XXX Work towards having startup.c invoke the Guile rc + (delete-file "daemons/runsystem.sh") + (with-output-to-file "daemons/runsystem.sh" + (lambda _ + (display "#! /bin/bash + +# XXX Guile needs pipe support for its finalizer thread, to start. +# Remove this script when Linux and the Hurd have xattr patches. +PATH=@PATH@ + +fsck --yes --force / +fsysopts / --writable + +# Note: this /hurd/ gets substituted +settrans --create /servers/socket/1 /hurd/pflocal +echo Starting /libexec/rc ... +exec /libexec/rc \"$@\" +"))) + )) + (add-before 'build 'set-file-names (lambda* (#:key inputs outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) @@ -437,45 +519,39 @@ (define-public hurd (("/bin/login") (string-append out "/bin/login")) (("/bin/bash") (string-append bash "/bin/bash"))) - (substitute* '("startup/startup.c" "init/init.c" "config/ttys") + (substitute* '("startup/startup.c" "config/ttys") (("/libexec/") (string-append out "/libexec/"))) (substitute* '("utils/uptime.sh") (("/bin/w") (string-append out "/bin/w"))) - (substitute* "daemons/console-run.c" + ;; Upon first boot the /hurd symlink does not exist; it is + ;; created during activation: Hard-code the .../hurd store file + ;; name. + (substitute* '("boot/boot.c" + "daemons/console-run.c" + "startup/startup.c") (("/hurd/") (string-append out "/hurd/"))) - + (substitute* '("libdiskfs/boot-start.c" + "libdiskfs/opts-std-startup.c") + (("_HURD_STARTUP") + (string-append "\"" out "/hurd/startup\""))) (substitute* '("daemons/runsystem.sh" - "daemons/runsystem.hurd.sh" - "sutils/MAKEDEV.sh") + "utils/fakeroot.sh" + "utils/remap.sh" + "sutils/MAKEDEV.sh" + "sutils/losetup.sh") (("^PATH=.*") - (string-append "PATH=" out "/bin:" out "/sbin:" - coreutils "/bin:" - sed "/bin:" grep "/bin:" - util-linux "/bin\n")) - (("^SHELL=.*") - (string-append "SHELL=" bash "/bin/bash\n")) + (string-append "PATH=" out "/bin" + ":" out "/sbin" + ":" coreutils "/bin" + ":" grep "/bin" + ":" sed "/bin" + ":" util-linux "/sbin\n")) (("/sbin/") (string-append out "/sbin/")) (("/libexec/") (string-append out "/libexec/")) (("/hurd/") (string-append out "/hurd/"))) - - (substitute* "daemons/runsystem.sh" - (("export PATH") - (string-append "export PATH\n" - "\ -fsysopts / --writable - -# MAKEDEV relies on pipes so this needs to be set up. -settrans -c /servers/socket/1 /hurd/pflocal - -(cd /dev; MAKEDEV -D /dev std vcs tty{1,2,3,4,5,6})\n"))) - - (substitute* "daemons/runsystem.hurd.sh" - (("export PATH") - "export PATH -fsysopts / --writable\n")) #t))) (add-after 'patch-shebangs 'patch-libexec-shebangs (lambda* (#:key inputs outputs #:allow-other-keys) @@ -511,11 +587,13 @@ (define-public hurd (lambda* (#:key inputs outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (file (string-append out "/libexec/rc")) - (rc (assoc-ref inputs "hurd-rc"))) + (rc (assoc-ref inputs "hurd-rc")) + (coreutils (assoc-ref inputs "coreutils"))) (delete-file file) (copy-file rc file) (substitute* file - (("@HURD@") out)) + (("@HURD@") out) + (("@COREUTILS@") coreutils)) #t)))) #:configure-flags (list (string-append "LDFLAGS=-Wl,-rpath=" %output "/lib") -- cgit v1.2.3