Hi, On Fri, May 19, 2023 at 9:43 AM Flávio Cruz <flavioc...@gmail.com> wrote: > I have made changes so that it does daily builds and I'm able to boot small > programs. However, I haven't had the time to boot programs built against > Glibc. How do you package and boot the static binaries using a ramdisk? I've > been reading the other threads about the Guix/rumpkernel so I might be able > to piece something together and try it this weekend.
You just put the entirety of the root filesystem (containing /usr, /bin, /lib, /hurd, and so on) as an ext2 image into a *file* that you place onto the actual drive (a CD disk in my case), and then you ask GRUB to load the file from the drive into memory, tell gnumach to make a ramdisk device out of it (you'll need to apply [0]), and tell ext2fs to use that device. Here's the relevant piece of my grub config script: [0]: https://salsa.debian.org/hurd-team/gnumach/-/blob/master/debian/patches/50_initrd.patch multiboot /boot/gnumach console=com0 module /boot/initrd.ext2 initrd.ext2 '$(ramdisk-create)' module /sbin/ext2fs.static ext2fs --multiboot-command-line='${kernel-command-line}' --readonly --host-priv-port='${host-port}' --device-master-port='${device-port}' --exec-server-task='${exec-task}' --kernel-task='${kernel-task}' -T device rd0 '$(fs-task=task-create)' '$(prompt-task-resume)' module /lib/ld.so.1 ld.so.1 /hurd/exec --device-master-port='${device-port}' '$(exec-task=task-create)' boot (I should probably change it to not hardcode 'rd0', but whatever). Note that /boot/gnumach, /boot/initrd.ext2, /sbin/ext2fs.static, and /lib/ld.so.1 are all paths inside the CD image (those are going to be loaded by GRUB), and /boot/initrd.ext2 is the ext2 filesystem image containing the actual Hurd root. /hurd/exec however is already a path inside the fs image -- this is where ld.so (not grub) is going to load the exec server from. The only static binary here is ext2fs.static, the rest are all dynamically linked. Then in /libexec/console-run (inside the filesystem image), I have written the following: #! /bin/sh settrans -ac /dev/mach-console /hurd/streamio console exec <>/dev/mach-console >&0 2>&0 echo Hello from /bin/sh! exec /bin/sh -i (If you're going to do the same, don't forget to create the /dev/mach-console node beforehand, since the fs is read-only.) I also had to patch streamio a little to do the \r -> \n conversion like glibc already does in devstream: diff --git a/trans/streamio.c b/trans/streamio.c index 272a002c..0af1aea3 100644 --- a/trans/streamio.c +++ b/trans/streamio.c @@ -500,6 +500,9 @@ trivfs_S_io_read (struct trivfs_protid *cred, cred->po->openmodes & O_NONBLOCK); pthread_mutex_unlock (&global_lock); *data_len = data_size; + for (size_t i = 0; i < data_size; i++) + if ((*data)[i] == '\r') + (*data)[i] = '\n'; return err; } (maybe I should also add echoing of input characters in the same way, which is also what glibc's devstream does -- otherwise currently I don't see what I'm typing on the console). Make sure to use the very latest glibc (Samuel has already pushed all of my patches upstream!) + the BRK_START hack. Sergey