From e933eb5a1c0da69881fcb9b56820bbd94e6a6dcb Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Sat, 8 Jul 2023 00:25:16 +0200 Subject: [PATCH] Replace mkinitrd(1) with tar(1). The custom initrd format was originally useful when it was mounted, however it has been extracted into the ramfs for a very long time and has no advantages over the standard tar format which can be readily created and modified using standard tools. The kernel initrd(7) support already supports tar, so this change simply switches the format. --- Makefile | 61 +++++++++++++------------ build-aux/iso-grub-cfg.sh | 10 ++-- kernel/.gitignore | 1 - share/man/man7/initrd.7 | 13 ++---- share/man/man7/release-iso-bootconfig.7 | 8 ++-- update-initrd/update-initrd | 8 ++-- update-initrd/update-initrd.8 | 3 +- 7 files changed, 51 insertions(+), 53 deletions(-) diff --git a/Makefile b/Makefile index dc0ec390..f50c24a9 100644 --- a/Makefile +++ b/Makefile @@ -73,10 +73,10 @@ include build-aux/dirs.mak BUILD_NAME:=sortix-$(RELEASE)-$(MACHINE) -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 -SYSTEM_INITRD:=$(SORTIX_BUILDS_DIR)/$(BUILD_NAME).system.initrd +LIVE_INITRD:=$(SORTIX_BUILDS_DIR)/$(BUILD_NAME).live.tar +OVERLAY_INITRD:=$(SORTIX_BUILDS_DIR)/$(BUILD_NAME).overlay.tar +SRC_INITRD:=$(SORTIX_BUILDS_DIR)/$(BUILD_NAME).src.tar +SYSTEM_INITRD:=$(SORTIX_BUILDS_DIR)/$(BUILD_NAME).system.tar .PHONY: all all: sysroot @@ -455,7 +455,6 @@ $(LIVE_INITRD): sysroot echo "include /etc/default/passwd.d/*" >> $(LIVE_INITRD).d/etc/passwd echo "root::0:root" > $(LIVE_INITRD).d/etc/group echo "include /etc/default/group.d/*" >> $(LIVE_INITRD).d/etc/group - mkdir -p $(LIVE_INITRD).d/home mkdir -p $(LIVE_INITRD).d/root -m 700 cp -RT "$(SYSROOT)/etc/skel" $(LIVE_INITRD).d/root (echo "You can view the documentation for new users by typing:" && \ @@ -466,19 +465,23 @@ $(LIVE_INITRD): sysroot echo && \ echo " man installation") > $(LIVE_INITRD).d/root/welcome tix-collection $(LIVE_INITRD).d create --platform=$(HOST) --prefix= --generation=2 - mkinitrd --format=sortix-initrd-2 $(LIVE_INITRD).d -o $(LIVE_INITRD) + LC_ALL=C ls -A $(LIVE_INITRD).d | \ + tar -cf $(LIVE_INITRD) -C $(LIVE_INITRD).d --numeric-owner --owner=0 --group=0 -T - rm -rf $(LIVE_INITRD).d .PHONY: $(OVERLAY_INITRD) $(OVERLAY_INITRD): sysroot test ! -d "$(SYSROOT_OVERLAY)" || \ - mkinitrd --format=sortix-initrd-2 "$(SYSROOT_OVERLAY)" -o $(OVERLAY_INITRD) + LC_ALL=C ls -A "$(SYSROOT_OVERLAY)" | \ + tar -cf $(OVERLAY_INITRD) -C "$(SYSROOT_OVERLAY)" --numeric-owner --owner=0 --group=0 -T - $(SRC_INITRD): sysroot - mkinitrd --format=sortix-initrd-2 --manifest="$(SYSROOT)/tix/manifest/src" "$(SYSROOT)" -o $(SRC_INITRD) + sed -E 's,^/,,' "$(SYSROOT)/tix/manifest/src" | \ + tar -cf $(SRC_INITRD) -C "$(SYSROOT)" --numeric-owner --owner=0 --group=0 --no-recursion -T - tix/manifest/src $(SYSTEM_INITRD): sysroot - mkinitrd --format=sortix-initrd-2 --manifest="$(SYSROOT)/tix/manifest/system" "$(SYSROOT)" -o $(SYSTEM_INITRD) + sed -E 's,^/,,' "$(SYSROOT)/tix/manifest/system" | \ + tar -cf $(SYSTEM_INITRD) -C "$(SYSROOT)" --numeric-owner --owner=0 --group=0 --no-recursion -T - tix/manifest/system # Packaging @@ -499,29 +502,29 @@ $(SORTIX_BUILDS_DIR)/$(BUILD_NAME).iso: sysroot $(LIVE_INITRD) $(OVERLAY_INITRD) build-aux/iso-repository.sh $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/repository ifeq ($(SORTIX_ISO_COMPRESSION),xz) xz -c "$(SYSROOT)/boot/sortix.bin" > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/sortix.bin.xz - xz -c $(LIVE_INITRD) > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/live.initrd.xz + xz -c $(LIVE_INITRD) > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/live.tar.xz test ! -e "$(OVERLAY_INITRD)" || \ - xz -c $(OVERLAY_INITRD) > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/overlay.initrd.xz - xz -c $(SRC_INITRD) > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/src.initrd.xz - xz -c $(SYSTEM_INITRD) > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/system.initrd.xz + xz -c $(OVERLAY_INITRD) > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/overlay.tar.xz + xz -c $(SRC_INITRD) > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/src.tar.xz + xz -c $(SYSTEM_INITRD) > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/system.tar.xz build-aux/iso-grub-cfg.sh --platform $(HOST) --version $(VERSION) $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso grub-mkrescue --compress=xz -o $(SORTIX_BUILDS_DIR)/$(BUILD_NAME).iso $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso else ifeq ($(SORTIX_ISO_COMPRESSION),gzip) gzip -c "$(SYSROOT)/boot/sortix.bin" > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/sortix.bin.gz - gzip -c $(LIVE_INITRD) > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/live.initrd.gz + gzip -c $(LIVE_INITRD) > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/live.tar.gz test ! -e "$(OVERLAY_INITRD)" || \ - gzip -c $(OVERLAY_INITRD) > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/overlay.initrd.gz - gzip -c $(SRC_INITRD) > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/src.initrd.gz - gzip -c $(SYSTEM_INITRD) > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/system.initrd.gz + gzip -c $(OVERLAY_INITRD) > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/overlay.tar.gz + gzip -c $(SRC_INITRD) > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/src.tar.gz + gzip -c $(SYSTEM_INITRD) > $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/system.tar.gz build-aux/iso-grub-cfg.sh --platform $(HOST) --version $(VERSION) $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso grub-mkrescue --compress=gz -o $(SORTIX_BUILDS_DIR)/$(BUILD_NAME).iso $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso else # none cp "$(SYSROOT)/boot/sortix.bin" $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/sortix.bin - cp $(LIVE_INITRD) $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/live.initrd + cp $(LIVE_INITRD) $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/live.tar test ! -e "$(OVERLAY_INITRD)" || \ - cp $(OVERLAY_INITRD) $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/overlay.initrd - cp $(SRC_INITRD) $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/src.initrd - cp $(SYSTEM_INITRD) $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/system.initrd + cp $(OVERLAY_INITRD) $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/overlay.tar + cp $(SRC_INITRD) $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/src.tar + cp $(SYSTEM_INITRD) $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso/boot/system.tar build-aux/iso-grub-cfg.sh --platform $(HOST) --version $(VERSION) $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso grub-mkrescue -o $(SORTIX_BUILDS_DIR)/$(BUILD_NAME).iso $(SORTIX_BUILDS_DIR)/$(BUILD_NAME)-iso endif @@ -555,25 +558,25 @@ $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot: $(SORTIX_RELEASE_DIR)/$(RELEAS $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/sortix.bin.xz: sysroot $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot xz -c "$(SYSROOT)/boot/sortix.bin" > $@ -$(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/live.initrd.xz: $(LIVE_INITRD) $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot +$(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/live.tar.xz: $(LIVE_INITRD) $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot xz -c $< > $@ -$(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/overlay.initrd.xz: $(OVERLAY_INITRD) $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot +$(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/overlay.tar.xz: $(OVERLAY_INITRD) $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot test ! -e $< || xz -c $< > $@ -$(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/src.initrd.xz: $(SRC_INITRD) $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot +$(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/src.tar.xz: $(SRC_INITRD) $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot xz -c $< > $@ -$(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/system.initrd.xz: $(SYSTEM_INITRD) $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot +$(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/system.tar.xz: $(SYSTEM_INITRD) $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot xz -c $< > $@ .PHONY: release-boot release-boot: \ $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/sortix.bin.xz \ - $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/live.initrd.xz \ - $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/overlay.initrd.xz \ - $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/src.initrd.xz \ - $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/system.initrd.xz \ + $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/live.tar.xz \ + $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/overlay.tar.xz \ + $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/src.tar.xz \ + $(SORTIX_RELEASE_DIR)/$(RELEASE)/$(MACHINE)/boot/system.tar.xz \ .PHONY: release-iso release-iso: $(SORTIX_RELEASE_DIR)/$(RELEASE)/builds/$(BUILD_NAME).iso diff --git a/build-aux/iso-grub-cfg.sh b/build-aux/iso-grub-cfg.sh index 66637e3e..03c0b59c 100755 --- a/build-aux/iso-grub-cfg.sh +++ b/build-aux/iso-grub-cfg.sh @@ -1,5 +1,5 @@ #!/bin/sh -# Copyright (c) 2018, 2022 Jonas 'Sortie' Termansen. +# Copyright (c) 2018, 2022, 2023 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 @@ -111,10 +111,10 @@ 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) +live_initrd=$(maybe_compressed boot/live.tar) +overlay_initrd=$(maybe_compressed boot/overlay.tar) +src_initrd=$(maybe_compressed boot/src.tar) +system_initrd=$(maybe_compressed boot/system.tar) ports=$(ls repository | grep -E '\.tix\.tar\.xz$' | sed -E 's/\.tix\.tar\.xz$//') diff --git a/kernel/.gitignore b/kernel/.gitignore index d0c005ae..502f4eaf 100644 --- a/kernel/.gitignore +++ b/kernel/.gitignore @@ -4,7 +4,6 @@ *.iso *.so *.a -*.initrd *.out kb/default-kblayout kb/default-kblayout.h diff --git a/share/man/man7/initrd.7 b/share/man/man7/initrd.7 index df919e74..477f6d5d 100644 --- a/share/man/man7/initrd.7 +++ b/share/man/man7/initrd.7 @@ -8,7 +8,9 @@ .Pa /boot/sortix.initrd .Sh DESCRIPTION .Pa /boot/sortix.initrd -is an archive of a minimal userland loaded by the bootloader and passed to the +is a +.Xr tar 1 +archive of a minimal userland loaded by the bootloader and passed to the .Xr kernel 7 that extracts it into the initial kernel memory root filesystem. The kernel invokes the @@ -16,20 +18,13 @@ The kernel invokes the extracted from the initrd as .Pa /sbin/init . .Pp -The initrd is in the custom format made by -.Xr mkinitrd 8 -and can be viewed with -.Xr initrdfs 8 . -.Pp The .Xr update-initrd 8 program creates a minimal initrd that locates the root filesystem and chain boots it as described in .Xr init 8 . .Sh SEE ALSO -.Xr initrd 7 , +.Xr tar 1 , .Xr kernel 7 , .Xr init 8 , -.Xr initrdfs 8 , -.Xr mkinitrd 8 , .Xr update-initrd 8 diff --git a/share/man/man7/release-iso-bootconfig.7 b/share/man/man7/release-iso-bootconfig.7 index 2900236b..eeea2baf 100644 --- a/share/man/man7/release-iso-bootconfig.7 +++ b/share/man/man7/release-iso-bootconfig.7 @@ -384,13 +384,13 @@ as a multiboot module with the command line. .Pp Load -.Pa /boot/system.initrd.xz , -.Pa /boot/src.initrd.xz +.Pa /boot/system.tar.xz , +.Pa /boot/src.tar.xz (if .Sy $enable_src ) , -.Pa /boot/live.initrd.xz , +.Pa /boot/live.tar.xz , and -.Pa /boot/overlay.initrd.xz +.Pa /boot/overlay.tar.xz (only if a .Pa sysroot-overlay directory existed when making the release .iso) diff --git a/update-initrd/update-initrd b/update-initrd/update-initrd index 9823b884..0d767eec 100755 --- a/update-initrd/update-initrd +++ b/update-initrd/update-initrd @@ -1,5 +1,5 @@ #!/bin/sh -# Copyright (c) 2015, 2016, 2017 Jonas 'Sortie' Termansen. +# Copyright (c) 2015, 2016, 2017, 2023 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 @@ -14,7 +14,7 @@ # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # # update-initrd -# Generate a mkinitrd that locates and chain boots the real root filesystem. +# Generate an initrd(7) that locates and chain boots the real root filesystem. set -e @@ -86,4 +86,6 @@ require chain exit-code EOF fi mkdir -p "$sysroot/boot" -mkinitrd --format=sortix-initrd-2 "$tmp" -o "$sysroot/boot/sortix.initrd" > /dev/null +LC_AL=C ls -A "$tmp" | +tar -C "$tmp" -cf "$sysroot/boot/sortix.initrd" \ + --numeric-owner --owner=0 --group=0 -T - diff --git a/update-initrd/update-initrd.8 b/update-initrd/update-initrd.8 index 1900e58b..bc954ef0 100644 --- a/update-initrd/update-initrd.8 +++ b/update-initrd/update-initrd.8 @@ -63,12 +63,11 @@ directory instead and store the result as .Nm will exit 0 on success and non-zero otherwise. .Sh SEE ALSO +.Xr tar 1 , .Xr fstab 5 , .Xr initrd 7 , .Xr disked 8 , .Xr extfs 8 , .Xr init 8 , -.Xr initrdfs 8 , -.Xr mkinitrd 8 , .Xr sysmerge 8 , .Xr update-grub 8