From 4204813d9befa6be1bb96abf25239f292703d4dc Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Wed, 2 Nov 2022 00:57:13 +0100 Subject: [PATCH] Add cdrom mounting live environment. --- Makefile | 59 +++++++++++++++++++++++++++++++++++++++ build-aux/iso-grub-cfg.sh | 49 ++++++++++++++++++++++++-------- sysinstall/fileops.c | 16 ++++++++++- sysinstall/fileops.h | 5 +++- 4 files changed, 116 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index 370e308a..e957312b 100644 --- a/Makefile +++ b/Makefile @@ -72,10 +72,13 @@ else SORTIX_INCLUDE_SOURCE?=yes endif +ISO_MOUNT?=no + include build-aux/dirs.mak BUILD_NAME:=sortix-$(RELEASE)-$(MACHINE) +CHAIN_INITRD:=$(SORTIX_BUILDS_DIR)/$(BUILD_NAME).chain.initrd LIVE_INITRD:=$(SORTIX_BUILDS_DIR)/$(BUILD_NAME).live.initrd OVERLAY_INITRD:=$(SORTIX_BUILDS_DIR)/$(BUILD_NAME).overlay.initrd SRC_INITRD:=$(SORTIX_BUILDS_DIR)/$(BUILD_NAME).src.initrd @@ -450,6 +453,24 @@ release-all-archs: # Initial ramdisk +$(CHAIN_INITRD).uuid: + mkdir -p `dirname $@` + uuidgen > $@ + +$(CHAIN_INITRD): $(CHAIN_INITRD).uuid sysroot + mkdir -p `dirname $(CHAIN_INITRD)` + rm -rf $(CHAIN_INITRD).d + mkdir -p $(CHAIN_INITRD).d + mkdir -p $(CHAIN_INITRD).d/etc + echo "UUID=`cat $(CHAIN_INITRD).uuid` / iso9660 ro 0 1" > $(CHAIN_INITRD).d/etc/fstab + mkdir -p $(CHAIN_INITRD).d/etc/init + echo require chain exit-code > $(CHAIN_INITRD).d/etc/init/default + mkdir -p $(CHAIN_INITRD).d/sbin + cp "$(SYSROOT)/sbin/init" $(CHAIN_INITRD).d/sbin + cp "$(SYSROOT)/sbin/iso9660fs" $(CHAIN_INITRD).d/sbin + mkinitrd --format=sortix-initrd-2 $(CHAIN_INITRD).d -o $(CHAIN_INITRD) + rm -rf $(CHAIN_INITRD).d + $(LIVE_INITRD): sysroot mkdir -p `dirname $(LIVE_INITRD)` rm -rf $(LIVE_INITRD).d @@ -496,6 +517,42 @@ $(SORTIX_BUILDS_DIR): # Bootable images +ifeq ($(ISO_MOUNT),yes) + +$(SORTIX_BUILDS_DIR)/$(BUILD_NAME).iso: sysroot $(CHAIN_INITRD) $(CHAIN_INITRD).uuid $(SORTIX_BUILDS_DIR) + rm -rf $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso + mkdir -p $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso + mkdir -p $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot + cp "$(SYSROOT)/boot/sortix.bin" $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/sortix.bin + cp $(CHAIN_INITRD) $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/sortix.initrd + mkdir -p $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/etc + echo "UUID=`cat $(CHAIN_INITRD).uuid` / iso9660 ro 0 1" > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/etc/fstab + mkdir -p $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/etc/init + echo require single-user exit-code > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/etc/init/default + echo "root::0:0:root:/root:sh" > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/etc/passwd + echo "include /etc/default/passwd.d/*" >> $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/etc/passwd + echo "root::0:root" > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/etc/group + echo "include /etc/default/group.d/*" >> $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/etc/group + (echo 'channel = $(CHANNEL)' && \ + echo 'release_key = $(RELEASE_KEY)' && \ + echo 'release_sig_url = $(RELEASE_SIG_URL)') > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/etc/upgrade.conf + mkdir -p $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/home + mkdir -p $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/root -m 700 + cp -RT "$(SYSROOT)/etc/skel" $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/root + (echo "You can view the documentation for new users by typing:" && \ + echo && \ + echo " man user-guide" && \ + echo && \ + echo "You can view the installation instructions by typing:" && \ + echo && \ + echo " man installation") > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/root/welcome + mkdir -p $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/grub + build-aux/iso-grub-cfg.sh --platform $(HOST) --version $(VERSION) --mount $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso + grub-mkrescue -o $(SORTIX_BUILDS_DIR)/$(BUILD_NAME).iso sysroot $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso -- -volid Sortix -volset_id `cat $(CHAIN_INITRD).uuid` + rm -rf $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso + +else + $(SORTIX_BUILDS_DIR)/$(BUILD_NAME).iso: sysroot $(LIVE_INITRD) $(OVERLAY_INITRD) $(SRC_INITRD) $(SYSTEM_INITRD) $(SORTIX_BUILDS_DIR) rm -rf $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso mkdir -p $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso @@ -536,6 +593,8 @@ else # none endif rm -rf $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso +endif + .PHONY: iso iso: $(SORTIX_BUILDS_DIR)/$(BUILD_NAME).iso diff --git a/build-aux/iso-grub-cfg.sh b/build-aux/iso-grub-cfg.sh index eca134fb..ba09e37d 100755 --- a/build-aux/iso-grub-cfg.sh +++ b/build-aux/iso-grub-cfg.sh @@ -23,8 +23,9 @@ set -e this=$(which -- "$0") thisdir=$(dirname -- "$this") -platform= directory= +mount=false +platform= version= dashdash= @@ -44,8 +45,9 @@ for argument do case $dashdash$argument in --) dashdash=yes ;; - --platform=*) platform=$parameter ;; --platform) previous_option=platform ;; + --platform=*) platform=$parameter ;; + --mount) mount=true ;; --version=*) version=$parameter ;; --version) previous_option=version ;; -*) echo "$0: unrecognized option $argument" >&2 @@ -111,13 +113,23 @@ isinset() { cd "$directory" kernel=$(maybe_compressed boot/sortix.bin) -live_initrd=$(maybe_compressed boot/live.initrd) -overlay_initrd=$(maybe_compressed boot/overlay.initrd) -src_initrd=$(maybe_compressed boot/src.initrd) -system_initrd=$(maybe_compressed boot/system.initrd) -ports=$(ls repository | - grep -E '\.tix\.tar\.xz$' | - sed -E 's/\.tix\.tar\.xz$//') +if $mount; then + initrd=$(maybe_compressed boot/sortix.initrd) + initrds=$initrd +else + live_initrd=$(maybe_compressed boot/live.initrd) + overlay_initrd=$(maybe_compressed boot/overlay.initrd) + src_initrd=$(maybe_compressed boot/src.initrd) + system_initrd=$(maybe_compressed boot/system.initrd) + initrds="$system_initrd $src_initrd $live_initrd $overlay_initrd" +fi +if $mount; then + ports= +else + ports=$(ls repository | + grep -E '\.tix\.tar\.xz$' | + sed -E 's/\.tix\.tar\.xz$//') +fi mkdir -p boot/grub mkdir -p boot/grub/init @@ -183,6 +195,12 @@ fi set version="$version" set machine="$machine" +set mount=$mount +if \$mount; then + chain='-- /sbin/init --target=chain' +else + chain= +fi set base_menu_title="Sortix \$version for \$machine" set menu_title="\$base_menu_title" set timeout=10 @@ -201,6 +219,8 @@ set enable_sshd=false export version export machine +export mount +export chain export base_menu_title export menu_title export timeout @@ -298,9 +318,10 @@ esac cat << EOF hook_kernel_pre echo -n "Loading /$kernel ($(human_size $kernel)) ... " - multiboot /$kernel \$no_random_seed \$enable_network_drivers "\$@" + multiboot /$kernel \$no_random_seed \$enable_network_drivers \$chain "\$@" echo done hook_kernel_post + # TODO: Injecting configuration doesn't work for mounted cdroms. if ! \$enable_dhclient; then echo -n "Disabling dhclient ... " module /boot/grub/init/furthermore --create-to /etc/init/network @@ -325,7 +346,7 @@ cat << EOF echo done fi EOF -for initrd in $system_initrd $src_initrd $live_initrd $overlay_initrd; do +for initrd in $initrds; do if [ "$initrd" = "$src_initrd" ]; then cat << EOF if \$enable_src; then @@ -421,9 +442,11 @@ menuentry "upgrade existing installation" '-- /sbin/init --target=sysupgrade' cat << EOF +if ! $mount; then menuentry "Select ports..." { configfile /boot/grub/ports.cfg } +fi menuentry "Advanced..." { configfile /boot/grub/advanced.cfg @@ -455,6 +478,7 @@ else } fi +if ! $mount; then if "\$enable_src"; then menuentry "Disable loading source code" { enable_src=false @@ -466,6 +490,7 @@ else configfile /boot/grub/advanced.cfg } fi +fi if [ "\$enable_network_drivers" = --disable-network-drivers ]; then menuentry "Enable networking drivers" { @@ -479,6 +504,7 @@ else } fi +if ! $mount; then if \$enable_dhclient; then menuentry "Disable DHCP client" { enable_dhclient=false @@ -518,6 +544,7 @@ fi menuentry "Select binary packages..." { configfile /boot/grub/tix.cfg } +fi hook_advanced_menu_post EOF diff --git a/sysinstall/fileops.c b/sysinstall/fileops.c index 718b057e..0b38c4cd 100644 --- a/sysinstall/fileops.c +++ b/sysinstall/fileops.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, 2017, 2020, 2021 Jonas 'Sortie' Termansen. + * Copyright (c) 2015, 2016, 2017, 2020, 2021, 2022 Jonas 'Sortie' Termansen. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -221,3 +221,17 @@ char** read_lines_file(const char* path, size_t* out_count) *out_count = count; return lines; } + +// TODO: Hack to support installing from a read-only root filesystem. +#undef mkdtemp +char* mkdtemp_hack(char* templ) +{ + if ( mkdtemp(templ) ) + return templ; + if ( errno != EROFS ) + return NULL; + memcpy(templ + 1, "dev", 3); + mkdir("/dev/tmp", 01777); + setenv("TMPDIR", "/dev/tmp", 1); + return mkdtemp(templ); +} diff --git a/sysinstall/fileops.h b/sysinstall/fileops.h index 15d00e7a..15ec9948 100644 --- a/sysinstall/fileops.h +++ b/sysinstall/fileops.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, 2020 Jonas 'Sortie' Termansen. + * Copyright (c) 2015, 2016, 2020, 2022 Jonas 'Sortie' Termansen. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -28,4 +28,7 @@ void write_random_seed(const char* path); char* read_string_file(const char* path); char** read_lines_file(const char* path, size_t* out_count); +char* mkdtemp_hack(char* templ); +#define mkdtemp mkdtemp_hack + #endif