HURD notes
Table of Contents
1. build gnumach and mig
Please, follow non-debian system to test lastest version.
https://www.gnu.org/software/hurd/microkernel/mach/mig/gnu_mig/building.html
https://www.gnu.org/software/hurd/microkernel/mach/gnumach/building.html
2. experiments with gnumach
2.1. generate ISO
Install necessary packages to generate iso:
# apt-get install mtools # apt-get install grub-pc-bin //if you are using grub EFI boot in host OS
create grub.cfg
menuentry "Hurd" { multiboot /boot/gnumach }
$ cd gnumach/build/ $ mkdir -p hurdiso/boot/grub $ cp gnumach hurdiso/boot/ $ cp grub.cfg hurdiso/boot/grub/grub.cfg $ grub-mkrescue -o hurdiso.iso hurdiso
$ qemu-system-i386 -cdrom hurdiso.iso
2.2. run kernel directly
You can run kernel direcly using -kernel option:
$ qemu-system-i386 -kernel gnumach
3. serial port output
boot gnumach with parameter "console=com0 or com1"
$ qemu-system-i386 -kernel gnumach -nographic -append "console=com0"
exit from qemu
ctrl+a x
4. debugging
$ qemu-system-i386 -s -S -kernel gnumach
In another shell
$ gdb ./gnumach (gdb) target remote :1234 Press c to continue booting
5. grub note for HURD
https://www.gnu.org/software/grub/manual/grub/html_node/GNU_002fHurd.html
grub> multiboot /boot/gnumach.gz root=device:hd0s1 grub> module /hurd/ext2fs.static ext2fs --readonly \ --multiboot-command-line='${kernel-command-line}' \ --host-priv-port='${host-port}' \ --device-master-port='${device-port}' \ --exec-server-task='${exec-task}' -T typed '${root}' \ '$(task-create)' '$(task-resume)' grub> module /lib/ld.so.1 exec /hurd/exec '$(exec-task=task-create)'
Install necessary packages to generate iso:
# apt-get install mtools # apt-get install grub-pc-bin //if you are using grub EFI boot in host OS
6. HURD SMP testing guide
download: https://www.gnu.org/software/hurd/hurd/running/qemu.html
unzip debian-hurd-*.img and run
$ kvm -m 2G -drive cache=writeback,file=debian-hurd-VERSION.img -device rtl8139,netdev=net0 -netdev user,id=net0,hostfwd=tcp::2223-:22
Set your password and username. You can ssh using username@127.0.0.1 -p 2223
Install git, necessary tools to build gnumach
$ git clone git://git.savannah.gnu.org/hurd/gnumach.git $ cd gnumach $ autoreconf -i $ mkdir build $ cd build $ ../configure --enable-ncpus=4 --enable-apic --enable-kdb --disable-linux-groups $ make gnumach.gz $ su # mv /boot/gnumach-1.8-486.gz /boot/gnumach-1.8-486.gz.bak # cp gnumach.gz /boot/gnumach-1.8-486.gz
update /boot/grub/grub.cfg change hd0 to wd0 and add console=com0 (optional).
/boot/gnumach-1.8-486.gz root=part:2:device:wd0 console=com0
update /etc/fstab and update wd0 instead of hd0.
... /dev/wd0s2 / ext2 defaults 0 1 /dev/wd0s1 none swap sw 0 0
You can shutdown /sbin/poweroff
start qemu with -smp 4. add -nographic if you want to use com0
$ qemu-system-i386 -M q35,accel=kvm -smp 4 -m 2G -net user,hostfwd=tcp::2223-:22 -net nic -hda debian-hurd-VERSION.img -nographic
To test smp:
$ sudo /path/to/smp /bin/bash $ stress -c 7
source: https://lists.gnu.org/archive/html/bug-hurd/2024-02/msg00088.html
/* Run a task on slave_pset Copyright (C) 2024 Free Software Foundation, Inc. This file is part of the GNU Hurd. The GNU Hurd is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. The GNU Hurd is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <error.h> #include <hurd.h> #include <version.h> #include <mach/mach_types.h> #include <mach/mach_host.h> static void smp(char * const argv[]) { int err; unsigned int pset_count; mach_port_t hostpriv; processor_set_name_array_t psets = {0}; processor_set_t slave_pset = {0}; if (get_privileged_ports (&hostpriv, NULL)) error (1, 0, "Must be run as root for privileged cpu control"); err = host_processor_sets (hostpriv, &psets, &pset_count); if (err) error (1, 0, "Cannot get list of host processor sets"); if (pset_count < 2) error (1, 0, "gnumach does not have the expected processor sets, are you running smp kernel?"); err = host_processor_set_priv (hostpriv, psets[1], &slave_pset); if (err) error (1, 0, "Cannot get access to slave processor set"); err = task_assign(mach_task_self(), slave_pset, FALSE); if (err) error (1, 0, "Cannot assign task self to slave processor set"); execve(argv[1], &argv[1], NULL); /* NOT REACHED */ } int main (int argc, char **argv) { smp(argv); return 0; }
7. useful links
Scripts for cross-compiling and creating an Hurd system - https://github.com/flavioc/cross-hurd
https://wiki.osdev.org/Bare_Bones
https://darnassus.sceen.net/~hurd-web/microkernel/mach/gnumach/debugging/
https://www.gnu.org/software/hurd/microkernel/mach/gnumach/debugging.html