gnu: hurd: Support second boot.

This avoids hanging upon second boot and ensures a declarative /hurd and /dev.

* gnu/packages/patches/hurd-startup.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/hurd.scm (hurd): Use it.
[arguments]: In stage create-runsystem remove /dev/urandom.

Change-Id: Ifcca5562c297204735c35132820a32ca0f273677
This commit is contained in:
Janneke Nieuwenhuizen 2023-05-30 18:02:38 +02:00 committed by Jan (janneke) Nieuwenhuizen
parent a16c94446e
commit b25d2ad5c7
No known key found for this signature in database
GPG key ID: F3C1A0D9C1D65273
3 changed files with 88 additions and 1 deletions

View file

@ -1545,6 +1545,7 @@ dist_patch_DATA = \
%D%/packages/patches/hubbub-sort-entities.patch \
%D%/packages/patches/hueplusplus-mbedtls.patch \
%D%/packages/patches/hurd-rumpdisk-no-hd.patch \
%D%/packages/patches/hurd-startup.patch \
%D%/packages/patches/hwloc-1-test-btrfs.patch \
%D%/packages/patches/i7z-gcc-10.patch \
%D%/packages/patches/icecat-makeicecat.patch \

View file

@ -317,7 +317,8 @@ (define-public hurd
(name "hurd")
(source (origin
(inherit (package-source hurd-headers))
(patches (search-patches "hurd-rumpdisk-no-hd.patch"))))
(patches (search-patches "hurd-rumpdisk-no-hd.patch"
"hurd-startup.patch"))))
(version (package-version hurd-headers))
(arguments
`(#:tests? #f ;no "check" target
@ -388,6 +389,9 @@ (define-public hurd
# Note: this /hurd/ gets substituted
settrans --create /servers/socket/1 /hurd/pflocal
# Upon second boot, (file-exists? /dev/null) in hurd-boot-system hangs unless:
rm -f /dev/urandom
# parse multiboot arguments
for i in \"$@\"; do
case $i in

View file

@ -0,0 +1,82 @@
This avoids hanging upon second boot and ensures a declarative /dev.
Upstream status: Not presented upstream.
From a15d281ea012ee360c45376e964d35f6292ac549 Mon Sep 17 00:00:00 2001
From: Janneke Nieuwenhuizen <janneke@gnu.org>
Date: Sat, 27 May 2023 17:28:22 +0200
Subject: [PATCH] startup: Remove /hurd, /dev, create /servers.
This avoids hanging upon second boot and ensures a declarative /hurd
and /dev.
* startup/startup.c (rm_r, create_servers): New functions.
(main): Use them to remove /dev and create /servers. Remove /hurd
symlink.
---
startup/startup.c | 42 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/startup/startup.c b/startup/startup.c
index feb7d265..5f380194 100644
--- a/startup/startup.c
+++ b/startup/startup.c
@@ -732,6 +732,42 @@ parse_opt (int key, char *arg, struct argp_state *state)
return 0;
}
+#include <ftw.h>
+static int
+rm_r (char const *file_name)
+{
+ int callback (char const *file_name, struct stat64 const *stat_buffer,
+ int type_flag, struct FTW *ftw_buffer)
+ {
+ fprintf (stderr, "startup: removing: %s\n", file_name);
+ return remove (file_name);
+ }
+
+ return nftw64 (file_name, callback, 0, FTW_DEPTH | FTW_MOUNT | FTW_PHYS);
+}
+
+void
+create_servers (void)
+{
+ char const *servers[] = {
+ "/servers/startup",
+ "/servers/exec",
+ "/servers/proc",
+ "/servers/password",
+ "/servers/default-pager",
+ "/servers/crash-dump-core",
+ "/servers/kill",
+ "/servers/suspend",
+ 0,
+ };
+ mkdir ("/servers", 0755);
+ for (char const **p = servers; *p; p++)
+ open (*p, O_WRONLY | O_APPEND | O_CREAT, 0444);
+ mkdir ("/servers/socket", 0755);
+ mkdir ("/servers/bus", 0755);
+ mkdir ("/servers/bus/pci", 0755);
+}
+
int
main (int argc, char **argv, char **envp)
{
@@ -741,6 +777,12 @@ main (int argc, char **argv, char **envp)
mach_port_t consdev;
struct argp argp = { options, parse_opt, 0, doc };
+ /* GNU Guix creates fresh ones in boot-hurd-system. */
+ unlink ("/hurd");
+ rm_r ("/dev");
+ mkdir ("/dev", 0755);
+ create_servers ();
+
/* Parse the arguments. We don't want the vector reordered, we
should pass on to our child the exact arguments we got and just
ignore any arguments that aren't flags for us. ARGP_NO_ERRS
--
2.40.1