From 554f1a965b294939131d899c7d9b3e2feb62a5bf Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Tue, 18 Nov 2025 07:23:00 +0100 Subject: [PATCH 01/35] feat(iso9660): complete refactor of filesystem The entire iso9660 filesystem folder was restructured to replace partially unreadable legacy code with modern, readable and modular structures. Hardcoded paths were replaced with variables, as much as possible, to make the code work with different setups. A mode "both" was added, producing Debian-style hybrid ISOs for both BIOS and EFI usage, while still allowing for flashing to USB and/or burning to CD/DVD-ROM. The configuration GUI (via "make menuconfig") was also refactored and adapted to the new changes. Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- fs/iso9660/Config.in | 117 ++++++++++--- fs/iso9660/efigrub.cfg | 3 + fs/iso9660/grub.cfg | 13 +- fs/iso9660/iso9660.mk | 371 +++++++++++++++++++++++++++++++++------- fs/iso9660/isolinux.cfg | 20 ++- 5 files changed, 431 insertions(+), 93 deletions(-) create mode 100644 fs/iso9660/efigrub.cfg diff --git a/fs/iso9660/Config.in b/fs/iso9660/Config.in index 8c4e7badf8..d32d86f42d 100644 --- a/fs/iso9660/Config.in +++ b/fs/iso9660/Config.in @@ -4,7 +4,7 @@ config BR2_TARGET_ROOTFS_ISO9660 depends on BR2_LINUX_KERNEL depends on BR2_TARGET_GRUB2 || BR2_TARGET_SYSLINUX_ISOLINUX select BR2_LINUX_KERNEL_INSTALL_TARGET \ - if (!BR2_TARGET_ROOTFS_ISO9660_INITRD && !BR2_TARGET_ROOTFS_INITRAMFS) + if (!BR2_TARGET_ROOTFS_ISO9660_INITRD && !BR2_TARGET_ROOTFS_INITRAMFS) help Build a bootable ISO9660 image. By default, the root filesystem is directly packed as the ISO9660 filesystem, @@ -26,24 +26,46 @@ choice config BR2_TARGET_ROOTFS_ISO9660_GRUB2 bool "grub2" - depends on BR2_TARGET_GRUB2 + depends on BR2_TARGET_GRUB2 \ + && (BR2_TARGET_GRUB2_I386_EFI || BR2_TARGET_GRUB2_X86_64_EFI) select BR2_TARGET_ROOTFS_ISO9660_BIOS_BOOTLOADER \ if BR2_TARGET_GRUB2_I386_PC select BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER \ if (BR2_TARGET_GRUB2_I386_EFI || BR2_TARGET_GRUB2_X86_64_EFI) help - Use Grub 2 as the bootloader for the ISO9660 image. Make - sure to enable the 'iso9660' module in - BR2_TARGET_GRUB2_BUILTIN_MODULES_PC or - BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI. Use 'cd' as the boot - partition in BR2_TARGET_GRUB2_BOOT_PARTITION= for GRUB on BIOS - or 'set root=(cd0)' in the configuration file passed to - BR2_TARGET_GRUB2_BUILTIN_CONFIG_EFI for GRUB on EFI. + Use Grub 2 as the bootloader for the ISO9660 image. + Make sure to enable the 'iso9660' module in + BR2_TARGET_GRUB2_BUILTIN_MODULES_PC and/or + BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI. For GRUB on BIOS, use 'cd' + as the boot partition in BR2_TARGET_GRUB2_BOOT_PARTITION setting. + For GRUB on EFI 'set root=(cd0)' in the configuration file passed + to BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU, although the + default configuration file contains a "search" directive using + BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE, which works too. config BR2_TARGET_ROOTFS_ISO9660_ISOLINUX bool "isolinux" depends on BR2_TARGET_SYSLINUX_ISOLINUX select BR2_TARGET_ROOTFS_ISO9660_BIOS_BOOTLOADER + help + Use ISOLINUX as the bootloader for the ISO9660 image. + ISOLINUX is a bootloader for BIOS systems that can boot + from CD-ROM or USB devices. + +config BR2_TARGET_ROOTFS_ISO9660_BOTH + bool "both" + depends on BR2_TARGET_SYSLINUX_ISOLINUX + depends on BR2_TARGET_GRUB2 \ + && (BR2_TARGET_GRUB2_I386_EFI || BR2_TARGET_GRUB2_X86_64_EFI) + select BR2_TARGET_ROOTFS_ISO9660_BIOS_BOOTLOADER + select BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER + help + Use both ISOLINUX (for BIOS boot) and GRUB2 (for UEFI boot). + This creates an ISO that can boot on both legacy BIOS + systems and modern UEFI systems, combined with the hybrid + image option this will produce a Debian-style hybrid ISO, + as it is commonly shipped alongside modern Linux distros, + which can both be flashed to USB and burned to CD/DVD-ROM. endchoice @@ -53,20 +75,72 @@ config BR2_TARGET_ROOTFS_ISO9660_BIOS_BOOTLOADER config BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER bool -config BR2_TARGET_ROOTFS_ISO9660_BOOT_MENU - string "Boot menu config file" - default "fs/iso9660/grub.cfg" if BR2_TARGET_ROOTFS_ISO9660_GRUB2 - default "fs/iso9660/isolinux.cfg" if BR2_TARGET_ROOTFS_ISO9660_ISOLINUX +config BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU + string "Isolinux configuration file" + depends on BR2_TARGET_ROOTFS_ISO9660_ISOLINUX || BR2_TARGET_ROOTFS_ISO9660_BOTH + default "fs/iso9660/isolinux.cfg" help - Use this option to provide a custom bootloader configuration - file (grub.cfg for Grub 2, isolinux.cfg for isolinux). + Use this option to provide a custom ISOLINUX configuration + file (isolinux.cfg). Note that the strings __KERNEL_PATH__ and __INITRD_PATH__ will automatically be replaced by the path to the kernel and - initrd images respectively. + initrd images respectively (or removed, if not applicable). + +config BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU + string "Grub2 configuration file" + depends on BR2_TARGET_ROOTFS_ISO9660_GRUB2 || BR2_TARGET_ROOTFS_ISO9660_BOTH + default "fs/iso9660/grub.cfg" + help + Use this option to provide a custom GRUB2 configuration + file (grub.cfg). + + Note that the strings __KERNEL_PATH__ and __INITRD_PATH__ + will automatically be replaced by the path to the kernel and + initrd images respectively (or removed, if not applicable). + +config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE + string "Grub2 identification file (EFI)" + depends on (BR2_TARGET_ROOTFS_ISO9660_GRUB2 || BR2_TARGET_ROOTFS_ISO9660_BOTH) \ + && BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER + default "buildroot" + help + Use this option to provide a custom name for the identification + file that is added to the ISO9660 filesystem, so the EFI bootloader + can better "search" it among possibly multiple attached boot devices. + +config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE + string "Grub2 partition size (EFI)" + depends on (BR2_TARGET_ROOTFS_ISO9660_GRUB2 || BR2_TARGET_ROOTFS_ISO9660_BOTH) \ + && BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER + default "3M" + help + Use this option to increase the size of the EFI partition. + Embedding more GRUB2 modules may require a larger EFI partition size. + +config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU + string "Grub2 embedded configuration (EFI)" + depends on (BR2_TARGET_ROOTFS_ISO9660_GRUB2 || BR2_TARGET_ROOTFS_ISO9660_BOTH) \ + && BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER + default "fs/iso9660/efigrub.cfg" + help + Use this option to provide a custom GRUB2 configuration + file (grub.cfg) that is embedded in the EFI paritition. + + It will usually just contain a "search" directive to find the + ISO9660 filesystem containing the actual GRUB2 configuration file. + Alternatively, 'set root=(cd0)' could be directly set here also... + + Note that the string __EFI_ID_FILE__ will automatically be + replaced with the BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE. + + Do not mistake this for the regular GRUB2 configuration that is + eventually loaded by the EFI bootloader, this is just for systems + which need some extra help to locate the actual ISO9660 filesystem. config BR2_TARGET_ROOTFS_ISO9660_INITRD bool "Use initrd" + depends on !BR2_TARGET_ROOTFS_INITRAMFS default y select BR2_TARGET_ROOTFS_CPIO help @@ -81,18 +155,17 @@ config BR2_TARGET_ROOTFS_ISO9660_TRANSPARENT_COMPRESSION depends on !BR2_TARGET_ROOTFS_ISO9660_INITRD depends on !BR2_TARGET_ROOTFS_INITRAMFS help - Say 'y' to enable use of transparent (de)compression. Files + Enables the use of transparent (de)compression. All files are stored compressed and will be decompressed on-the-fly upon access at runtime. config BR2_TARGET_ROOTFS_ISO9660_HYBRID bool "Build hybrid image" - depends on BR2_TARGET_ROOTFS_ISO9660_ISOLINUX + depends on BR2_TARGET_ROOTFS_ISO9660_ISOLINUX || BR2_TARGET_ROOTFS_ISO9660_BOTH help - Enable this option to build an hybrid image, i.e an image - which can either be booted from a CD-ROM or from a device - which BIOS considers a hard disk or ZIP disk, e.g. a USB key - or similar. + Enable this option to build a hybrid image, which is an image + that can either be burned to CD/DVD-ROM or flashed onto a device + which the BIOS considers as HDD/removable device (e.g. USB stick) endif diff --git a/fs/iso9660/efigrub.cfg b/fs/iso9660/efigrub.cfg new file mode 100644 index 0000000000..a8f2c567eb --- /dev/null +++ b/fs/iso9660/efigrub.cfg @@ -0,0 +1,3 @@ +search --file --set=root __EFI_ID_FILE__ +set prefix=($root)/boot/grub +source $prefix/grub.cfg diff --git a/fs/iso9660/grub.cfg b/fs/iso9660/grub.cfg index 5a74b2354a..137e3a0b08 100644 --- a/fs/iso9660/grub.cfg +++ b/fs/iso9660/grub.cfg @@ -1,7 +1,12 @@ set default="0" -set timeout="10" +set timeout="5" -menuentry "Buildroot" { - linux __KERNEL_PATH__ root=/dev/sr0 - initrd __INITRD_PATH__ +menuentry "ShredOS" { + linux __KERNEL_PATH__ console=tty3 loglevel=3 + initrd __INITRD_PATH__ +} + +menuentry "ShredOS (nomodeset)" { + linux __KERNEL_PATH__ console=tty3 loglevel=3 nomodeset + initrd __INITRD_PATH__ } diff --git a/fs/iso9660/iso9660.mk b/fs/iso9660/iso9660.mk index 0524f94c35..4a886b0273 100644 --- a/fs/iso9660/iso9660.mk +++ b/fs/iso9660/iso9660.mk @@ -1,6 +1,6 @@ ################################################################################ # -# Build the iso96600 root filesystem image +# Build the ISO9660 root filesystem image # ################################################################################ @@ -21,11 +21,38 @@ # built into the kernel image. This is when # BR2_TARGET_ROOTFS_INITRAMFS is enabled (regardless of the value # of BR2_TARGET_ROOTFS_ISO9660_INITRD). +# -ROOTFS_ISO9660_BOOT_MENU = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_BOOT_MENU)) +################################################################################ +# Configuration Variables +################################################################################ ROOTFS_ISO9660_DEPENDENCIES = host-xorriso linux +ROOTFS_ISO9660_GRUB2_BOOT_MENU = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU)) +ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU)) +ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE)) +ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE)) +ROOTFS_ISO9660_ISOLINUX_BOOT_MENU = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU)) + +################################################################################ +# Architecture-specific variables +################################################################################ + +ifeq ($(BR2_ARCH_IS_64),y) +ROOTFS_ISO9660_EFI_NAME = bootx64.efi +ROOTFS_ISO9660_EFI_NOTNAME = bootia32.efi +ROOTFS_ISO9660_GRUB2_EFI_PREFIX = $(call qstrip,$(GRUB2_PREFIX_x86_64-efi)) +else +ROOTFS_ISO9660_EFI_NAME = bootia32.efi +ROOTFS_ISO9660_EFI_NOTNAME = bootx64.efi +ROOTFS_ISO9660_GRUB2_EFI_PREFIX = $(call qstrip,$(GRUB2_PREFIX_i386-efi)) +endif + +################################################################################ +# Determine if we're using initrd +################################################################################ + ifeq ($(BR2_TARGET_ROOTFS_INITRAMFS),y) ROOTFS_ISO9660_USE_INITRD = YES endif @@ -34,17 +61,23 @@ ifeq ($(BR2_TARGET_ROOTFS_ISO9660_INITRD),y) ROOTFS_ISO9660_USE_INITRD = YES endif +################################################################################ +# Setup temporary target directory +################################################################################ + ifeq ($(ROOTFS_ISO9660_USE_INITRD),YES) +# Using initrd: create minimal temporary directory ROOTFS_ISO9660_TMP_TARGET_DIR = $(FS_DIR)/rootfs.iso9660.tmp define ROOTFS_ISO9660_CREATE_TEMPDIR $(RM) -rf $(ROOTFS_ISO9660_TMP_TARGET_DIR) mkdir -p $(ROOTFS_ISO9660_TMP_TARGET_DIR) endef ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_CREATE_TEMPDIR + else ifeq ($(BR2_TARGET_ROOTFS_ISO9660_TRANSPARENT_COMPRESSION),y) +# Using transparent compression: create compressed tree ROOTFS_ISO9660_DEPENDENCIES += host-zisofs-tools ROOTFS_ISO9660_TMP_TARGET_DIR = $(FS_DIR)/rootfs.iso9660.tmp -# This must be early, before we copy the bootloader files. define ROOTFS_ISO9660_MKZFTREE $(RM) -rf $(ROOTFS_ISO9660_TMP_TARGET_DIR) $(HOST_DIR)/bin/mkzftree -X -z 9 -p $(PARALLEL_JOBS) \ @@ -53,10 +86,16 @@ define ROOTFS_ISO9660_MKZFTREE endef ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_MKZFTREE ROOTFS_ISO9660_OPTS += -z + else +# Standard mode: use TARGET_DIR directly ROOTFS_ISO9660_TMP_TARGET_DIR = $(TARGET_DIR) endif +################################################################################ +# Reproducible build support +################################################################################ + ifeq ($(BR2_REPRODUCIBLE),y) ROOTFS_ISO9660_VFAT_OPTS = --invariant ROOTFS_ISO9660_FIX_TIME = touch -d @$(SOURCE_DATE_EPOCH) @@ -64,100 +103,278 @@ else ROOTFS_ISO9660_FIX_TIME = : endif +################################################################################ +# GRUB2 BIOS Bootloader Configuration +################################################################################ + ifeq ($(BR2_TARGET_ROOTFS_ISO9660_GRUB2)$(BR2_TARGET_ROOTFS_ISO9660_BIOS_BOOTLOADER),yy) ROOTFS_ISO9660_DEPENDENCIES += grub2 -ROOTFS_ISO9660_BOOTLOADER_CONFIG_PATH = \ - $(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/grub/grub.cfg +ROOTFS_ISO9660_GRUB2_CONFIG_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/grub/grub.cfg ROOTFS_ISO9660_BOOT_IMAGE = boot/grub/grub-eltorito.img -define ROOTFS_ISO9660_INSTALL_BOOTLOADER_BIOS + +define ROOTFS_ISO9660_INSTALL_GRUB2_BIOS $(INSTALL) -D -m 0644 $(BINARIES_DIR)/grub-eltorito.img \ $(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/grub/grub-eltorito.img endef -endif -ifeq ($(BR2_TARGET_ROOTFS_ISO9660_GRUB2)$(BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER),yy) -ROOTFS_ISO9660_DEPENDENCIES += grub2 host-dosfstools host-mtools -ROOTFS_ISO9660_EFI_PARTITION = boot/fat.efi -ROOTFS_ISO9660_EFI_PARTITION_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_EFI_PARTITION) -ROOTFS_ISO9660_EFI_PARTITION_CONTENT = $(BINARIES_DIR)/efi-part -ROOTFS_ISO9660_BOOTLOADER_CONFIG_PATH = \ - $(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/grub/grub.cfg -define ROOTFS_ISO9660_INSTALL_BOOTLOADER_EFI - rm -rf $(ROOTFS_ISO9660_EFI_PARTITION_PATH) - mkdir -p $(dir $(ROOTFS_ISO9660_EFI_PARTITION_PATH)) - dd if=/dev/zero of=$(ROOTFS_ISO9660_EFI_PARTITION_PATH) bs=1M count=1 - $(HOST_DIR)/sbin/mkfs.vfat $(ROOTFS_ISO9660_VFAT_OPTS) $(ROOTFS_ISO9660_EFI_PARTITION_PATH) - $(ROOTFS_ISO9660_FIX_TIME) $(ROOTFS_ISO9660_EFI_PARTITION_CONTENT)/* - $(HOST_DIR)/bin/mcopy -p -m -i $(ROOTFS_ISO9660_EFI_PARTITION_PATH) -s \ - $(ROOTFS_ISO9660_EFI_PARTITION_CONTENT)/* ::/ - $(ROOTFS_ISO9660_FIX_TIME) $(ROOTFS_ISO9660_EFI_PARTITION_PATH) +define ROOTFS_ISO9660_INSTALL_GRUB2_CONFIG + $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_GRUB2_BOOT_MENU) \ + $(ROOTFS_ISO9660_GRUB2_CONFIG_PATH) + $(SED) "s%__KERNEL_PATH__%/boot/$(LINUX_IMAGE_NAME)%" \ + $(ROOTFS_ISO9660_GRUB2_CONFIG_PATH) endef endif +################################################################################ +# GRUB2 EFI Bootloader Configuration +################################################################################ + +ifeq ($(BR2_TARGET_ROOTFS_ISO9660_GRUB2)$(BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER),yy) +ROOTFS_ISO9660_DEPENDENCIES += grub2 host-dosfstools host-mtools +ROOTFS_ISO9660_EFI_PARTITION = boot/efi.img +ROOTFS_ISO9660_EFI_PARTITION_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_EFI_PARTITION) +ROOTFS_ISO9660_EFI_PARTITION_CONTENT = $(BINARIES_DIR)/efi-part +ROOTFS_ISO9660_GRUB2_CONFIG_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/grub/grub.cfg +ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/grub/efigrub.cfg + +define ROOTFS_ISO9660_INSTALL_GRUB2_EFI + # Create identification file to better find ISO9660 filesystem + $(INSTALL) -D -m 0644 /dev/null \ + $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE) + # Copy grub.cfg to ISO9660 filesystem where GRUB will find it + $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_GRUB2_CONFIG_PATH) \ + $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/grub.cfg + $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_EFI_PARTITION_CONTENT)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NAME) \ + $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NAME) + # Create EFI FAT partition + rm -rf $(ROOTFS_ISO9660_EFI_PARTITION_PATH) + mkdir -p $(dir $(ROOTFS_ISO9660_EFI_PARTITION_PATH)) + dd if=/dev/zero of=$(ROOTFS_ISO9660_EFI_PARTITION_PATH) bs=$(ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE) count=1 + $(HOST_DIR)/sbin/mkfs.vfat $(ROOTFS_ISO9660_VFAT_OPTS) $(ROOTFS_ISO9660_EFI_PARTITION_PATH) + # Copy bootloader and modules to EFI partition + $(ROOTFS_ISO9660_FIX_TIME) $(ROOTFS_ISO9660_EFI_PARTITION_CONTENT)/* + $(HOST_DIR)/bin/mcopy -p -m -i $(ROOTFS_ISO9660_EFI_PARTITION_PATH) -s \ + $(ROOTFS_ISO9660_EFI_PARTITION_CONTENT)/* ::/ + # Delete the EFI bootloader that is NOT for the platform we're building for + $(HOST_DIR)/bin/mdel -i $(ROOTFS_ISO9660_EFI_PARTITION_PATH) \ + ::$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NOTNAME) || true + # Copy efigrub.cfg to EFI partition (may be used to find ISO9660 filesystem) + $(HOST_DIR)/bin/mcopy -n -o -p -m -i $(ROOTFS_ISO9660_EFI_PARTITION_PATH) \ + $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH) ::$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/grub.cfg + # Remove efigrub.cfg from ISO9660 filesystem, it was just there for SED-ing + rm -f $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH) + $(ROOTFS_ISO9660_FIX_TIME) $(ROOTFS_ISO9660_EFI_PARTITION_PATH) +endef + +define ROOTFS_ISO9660_INSTALL_GRUB2_CONFIG + $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_GRUB2_BOOT_MENU) \ + $(ROOTFS_ISO9660_GRUB2_CONFIG_PATH) + $(SED) "s%__KERNEL_PATH__%/boot/$(LINUX_IMAGE_NAME)%" \ + $(ROOTFS_ISO9660_GRUB2_CONFIG_PATH) + $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU) \ + $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH) + $(SED) "s%__KERNEL_PATH__%/boot/$(LINUX_IMAGE_NAME)%" \ + $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH) + $(SED) "s%__EFI_ID_FILE__%$(ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE)%" \ + $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH) +endef +endif + +################################################################################ +# ISOLINUX Bootloader Configuration (BIOS only) +################################################################################ + ifeq ($(BR2_TARGET_ROOTFS_ISO9660_ISOLINUX),y) ROOTFS_ISO9660_DEPENDENCIES += syslinux -ROOTFS_ISO9660_BOOTLOADER_CONFIG_PATH = \ - $(ROOTFS_ISO9660_TMP_TARGET_DIR)/isolinux/isolinux.cfg +ROOTFS_ISO9660_ISOLINUX_CONFIG_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/isolinux/isolinux.cfg ROOTFS_ISO9660_BOOT_IMAGE = isolinux/isolinux.bin -define ROOTFS_ISO9660_INSTALL_BOOTLOADER_BIOS + +define ROOTFS_ISO9660_INSTALL_ISOLINUX_BIOS $(INSTALL) -D -m 0644 $(BINARIES_DIR)/syslinux/* \ $(ROOTFS_ISO9660_TMP_TARGET_DIR)/isolinux/ $(INSTALL) -D -m 0644 $(HOST_DIR)/share/syslinux/ldlinux.c32 \ $(ROOTFS_ISO9660_TMP_TARGET_DIR)/isolinux/ldlinux.c32 + $(INSTALL) -D -m 0644 $(HOST_DIR)/share/syslinux/menu.c32 \ + $(ROOTFS_ISO9660_TMP_TARGET_DIR)/isolinux/menu.c32 + $(INSTALL) -D -m 0644 $(HOST_DIR)/share/syslinux/libutil.c32 \ + $(ROOTFS_ISO9660_TMP_TARGET_DIR)/isolinux/libutil.c32 + $(INSTALL) -D -m 0644 $(HOST_DIR)/share/syslinux/libcom32.c32 \ + $(ROOTFS_ISO9660_TMP_TARGET_DIR)/isolinux/libcom32.c32 +endef + +define ROOTFS_ISO9660_INSTALL_ISOLINUX_CONFIG + $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_ISOLINUX_BOOT_MENU) \ + $(ROOTFS_ISO9660_ISOLINUX_CONFIG_PATH) + $(SED) "s%__KERNEL_PATH__%/boot/$(LINUX_IMAGE_NAME)%" \ + $(ROOTFS_ISO9660_ISOLINUX_CONFIG_PATH) endef endif -define ROOTFS_ISO9660_PREPARATION - $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_BOOT_MENU) \ - $(ROOTFS_ISO9660_BOOTLOADER_CONFIG_PATH) +################################################################################ +# BOTH Mode: ISOLINUX (BIOS) + GRUB2 (EFI) +################################################################################ + +ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BOTH),y) +ROOTFS_ISO9660_DEPENDENCIES += syslinux grub2 host-dosfstools host-mtools + +# ISOLINUX configuration +ROOTFS_ISO9660_ISOLINUX_CONFIG_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/isolinux/isolinux.cfg +ROOTFS_ISO9660_BOOT_IMAGE = isolinux/isolinux.bin + +# GRUB2 EFI configuration +ROOTFS_ISO9660_GRUB2_CONFIG_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/grub/grub.cfg +ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/grub/efigrub.cfg +ROOTFS_ISO9660_EFI_PARTITION = boot/efi.img +ROOTFS_ISO9660_EFI_PARTITION_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_EFI_PARTITION) +ROOTFS_ISO9660_EFI_PARTITION_CONTENT = $(BINARIES_DIR)/efi-part + +define ROOTFS_ISO9660_INSTALL_ISOLINUX_BIOS + $(INSTALL) -D -m 0644 $(BINARIES_DIR)/syslinux/* \ + $(ROOTFS_ISO9660_TMP_TARGET_DIR)/isolinux/ + $(INSTALL) -D -m 0644 $(HOST_DIR)/share/syslinux/ldlinux.c32 \ + $(ROOTFS_ISO9660_TMP_TARGET_DIR)/isolinux/ldlinux.c32 + $(INSTALL) -D -m 0644 $(HOST_DIR)/share/syslinux/menu.c32 \ + $(ROOTFS_ISO9660_TMP_TARGET_DIR)/isolinux/menu.c32 + $(INSTALL) -D -m 0644 $(HOST_DIR)/share/syslinux/libutil.c32 \ + $(ROOTFS_ISO9660_TMP_TARGET_DIR)/isolinux/libutil.c32 + $(INSTALL) -D -m 0644 $(HOST_DIR)/share/syslinux/libcom32.c32 \ + $(ROOTFS_ISO9660_TMP_TARGET_DIR)/isolinux/libcom32.c32 +endef + +define ROOTFS_ISO9660_INSTALL_ISOLINUX_CONFIG + $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_ISOLINUX_BOOT_MENU) \ + $(ROOTFS_ISO9660_ISOLINUX_CONFIG_PATH) $(SED) "s%__KERNEL_PATH__%/boot/$(LINUX_IMAGE_NAME)%" \ - $(ROOTFS_ISO9660_BOOTLOADER_CONFIG_PATH) - $(ROOTFS_ISO9660_INSTALL_BOOTLOADER_BIOS) - $(ROOTFS_ISO9660_INSTALL_BOOTLOADER_EFI) + $(ROOTFS_ISO9660_ISOLINUX_CONFIG_PATH) endef -ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_PREPARATION - -define ROOTFS_ISO9660_DISABLE_EXTERNAL_INITRD - $(SED) '/__INITRD_PATH__/d' $(ROOTFS_ISO9660_BOOTLOADER_CONFIG_PATH) +define ROOTFS_ISO9660_INSTALL_GRUB2_EFI + # Create identification file to better find ISO9660 filesystem + $(INSTALL) -D -m 0644 /dev/null \ + $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE) + # Copy grub.cfg to ISO9660 filesystem where GRUB will find it + $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_GRUB2_CONFIG_PATH) \ + $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/grub.cfg + $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_EFI_PARTITION_CONTENT)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NAME) \ + $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NAME) + # Create EFI FAT partition + rm -rf $(ROOTFS_ISO9660_EFI_PARTITION_PATH) + mkdir -p $(dir $(ROOTFS_ISO9660_EFI_PARTITION_PATH)) + dd if=/dev/zero of=$(ROOTFS_ISO9660_EFI_PARTITION_PATH) bs=$(ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE) count=1 + $(HOST_DIR)/sbin/mkfs.vfat $(ROOTFS_ISO9660_VFAT_OPTS) $(ROOTFS_ISO9660_EFI_PARTITION_PATH) + # Copy bootloader and modules to EFI partition + $(ROOTFS_ISO9660_FIX_TIME) $(ROOTFS_ISO9660_EFI_PARTITION_CONTENT)/* + $(HOST_DIR)/bin/mcopy -p -m -i $(ROOTFS_ISO9660_EFI_PARTITION_PATH) -s \ + $(ROOTFS_ISO9660_EFI_PARTITION_CONTENT)/* ::/ + # Delete the EFI bootloader that is NOT for the platform we're building for + $(HOST_DIR)/bin/mdel -i $(ROOTFS_ISO9660_EFI_PARTITION_PATH) \ + ::$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NOTNAME) || true + # Copy efigrub.cfg to EFI partition (may be used to find ISO9660 filesystem) + $(HOST_DIR)/bin/mcopy -n -o -p -m -i $(ROOTFS_ISO9660_EFI_PARTITION_PATH) \ + $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH) ::$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/grub.cfg + # Remove efigrub.cfg from ISO9660 filesystem, it was just there for SED-ing + rm -f $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH) + $(ROOTFS_ISO9660_FIX_TIME) $(ROOTFS_ISO9660_EFI_PARTITION_PATH) endef -# Copy the kernel to temporary filesystem +define ROOTFS_ISO9660_INSTALL_GRUB2_CONFIG + $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_GRUB2_BOOT_MENU) \ + $(ROOTFS_ISO9660_GRUB2_CONFIG_PATH) + $(SED) "s%__KERNEL_PATH__%/boot/$(LINUX_IMAGE_NAME)%" \ + $(ROOTFS_ISO9660_GRUB2_CONFIG_PATH) + $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU) \ + $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH) + $(SED) "s%__KERNEL_PATH__%/boot/$(LINUX_IMAGE_NAME)%" \ + $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH) + $(SED) "s%__EFI_ID_FILE__%$(ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE)%" \ + $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH) +endef +endif + +################################################################################ +# Bootloader Configuration Installation +################################################################################ + +define ROOTFS_ISO9660_INSTALL_BOOTLOADER_CONFIGS + $(ROOTFS_ISO9660_INSTALL_GRUB2_CONFIG) + $(ROOTFS_ISO9660_INSTALL_ISOLINUX_CONFIG) +endef + +ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_INSTALL_BOOTLOADER_CONFIGS + +################################################################################ +# Initrd Handling +################################################################################ + define ROOTFS_ISO9660_COPY_KERNEL $(INSTALL) -D -m 0644 $(LINUX_IMAGE_PATH) \ $(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/$(LINUX_IMAGE_NAME) endef -ifeq ($(ROOTFS_ISO9660_USE_INITRD),YES) -ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_COPY_KERNEL - -# If initramfs is used, disable loading the initrd as the rootfs is -# already inside the kernel image. Otherwise, make sure a cpio is -# generated and use it as the initrd. -ifeq ($(BR2_TARGET_ROOTFS_INITRAMFS),y) -ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_DISABLE_EXTERNAL_INITRD -else -ROOTFS_ISO9660_DEPENDENCIES += rootfs-cpio -define ROOTFS_ISO9660_COPY_INITRD +define ROOTFS_ISO9660_ENABLE_EXTERNAL_INITRD $(INSTALL) -D -m 0644 $(BINARIES_DIR)/rootfs.cpio$(ROOTFS_CPIO_COMPRESS_EXT) \ $(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/initrd - $(SED) "s%__INITRD_PATH__%/boot/initrd%" \ - $(ROOTFS_ISO9660_BOOTLOADER_CONFIG_PATH) + $(if $(ROOTFS_ISO9660_GRUB2_CONFIG_PATH), \ + $(SED) "s%__INITRD_PATH__%/boot/initrd%" \ + $(ROOTFS_ISO9660_GRUB2_CONFIG_PATH)) + $(if $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH), \ + $(SED) "s%__INITRD_PATH__%/boot/initrd%" \ + $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH)) + $(if $(ROOTFS_ISO9660_ISOLINUX_CONFIG_PATH), \ + $(SED) "s%__INITRD_PATH__%/boot/initrd%" \ + $(ROOTFS_ISO9660_ISOLINUX_CONFIG_PATH)) endef -ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_COPY_INITRD + +define ROOTFS_ISO9660_DISABLE_EXTERNAL_INITRD + $(if $(ROOTFS_ISO9660_GRUB2_CONFIG_PATH), \ + $(SED) '/__INITRD_PATH__/d' $(ROOTFS_ISO9660_GRUB2_CONFIG_PATH)) + $(if $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH), \ + $(SED) '/__INITRD_PATH__/d' $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH)) + $(if $(ROOTFS_ISO9660_ISOLINUX_CONFIG_PATH), \ + $(SED) '/append[[:space:]]*initrd=__INITRD_PATH__[[:space:]]*$$/d' $(ROOTFS_ISO9660_ISOLINUX_CONFIG_PATH) && \ + $(SED) 's/initrd=__INITRD_PATH__[[:space:]]*//' $(ROOTFS_ISO9660_ISOLINUX_CONFIG_PATH)) +endef + +ifeq ($(ROOTFS_ISO9660_USE_INITRD),YES) +# Copy kernel when using initrd +ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_COPY_KERNEL + +ifeq ($(BR2_TARGET_ROOTFS_INITRAMFS),y) +# Initramfs is built into kernel - disable external initrd +ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_DISABLE_EXTERNAL_INITRD +else +# External initrd - copy it and update configs +ROOTFS_ISO9660_DEPENDENCIES += rootfs-cpio +ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_ENABLE_EXTERNAL_INITRD endif -else # ROOTFS_ISO9660_USE_INITRD +else # Not using initrd ifeq ($(BR2_TARGET_ROOTFS_ISO9660_TRANSPARENT_COMPRESSION),y) -# We must use the uncompressed kernel image +# Transparent compression requires uncompressed kernel ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_COPY_KERNEL endif ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_DISABLE_EXTERNAL_INITRD +endif -endif # ROOTFS_ISO9660_USE_INITRD +################################################################################ +# Bootloader Installation +# This must happen last after all config files are prepared +################################################################################ -ROOTFS_ISO9660_OPTS += -J -R +define ROOTFS_ISO9660_INSTALL_BOOTLOADERS + $(ROOTFS_ISO9660_INSTALL_GRUB2_BIOS) + $(ROOTFS_ISO9660_INSTALL_ISOLINUX_BIOS) + $(ROOTFS_ISO9660_INSTALL_GRUB2_EFI) +endef + +ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_INSTALL_BOOTLOADERS + +################################################################################ +# ISO9660 Generation Options +################################################################################ + +ROOTFS_ISO9660_OPTS += -r -J -joliet-long -cache-inodes -V 'ISO9660' ROOTFS_ISO9660_OPTS_BIOS = \ -b $(ROOTFS_ISO9660_BOOT_IMAGE) \ @@ -169,29 +386,59 @@ ROOTFS_ISO9660_OPTS_EFI = \ --efi-boot $(ROOTFS_ISO9660_EFI_PARTITION) \ -no-emul-boot +ifeq ($(BR2_TARGET_ROOTFS_ISO9660_ISOLINUX),y) +ROOTFS_ISO9660_OPTS += -c isolinux/boot.cat +else ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BOTH),y) +ROOTFS_ISO9660_OPTS += -c isolinux/boot.cat +endif + +# Determine which boot options to use ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BIOS_BOOTLOADER)$(BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER),yy) +# Both BIOS and EFI ROOTFS_ISO9660_OPTS += \ $(ROOTFS_ISO9660_OPTS_BIOS) \ -eltorito-alt-boot \ $(ROOTFS_ISO9660_OPTS_EFI) + else ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BIOS_BOOTLOADER),y) +# BIOS only ROOTFS_ISO9660_OPTS += $(ROOTFS_ISO9660_OPTS_BIOS) + else ifeq ($(BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER),y) +# EFI only ROOTFS_ISO9660_OPTS += $(ROOTFS_ISO9660_OPTS_EFI) + endif +################################################################################ +# Hybrid Image Support (USB bootable) +################################################################################ + +ifeq ($(BR2_TARGET_ROOTFS_ISO9660_HYBRID),y) +ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BOTH),y) +ROOTFS_ISO9660_OPTS += \ + -isohybrid-mbr $(HOST_DIR)/share/syslinux/isohdpfx.bin \ + -isohybrid-gpt-basdat -isohybrid-apm-hfsplus +else +define ROOTFS_ISO9660_GEN_HYBRID + $(HOST_DIR)/bin/isohybrid -t 0x96 $@ +endef +ROOTFS_ISO9660_POST_GEN_HOOKS += ROOTFS_ISO9660_GEN_HYBRID +endif +endif + +################################################################################ +# ISO9660 Image Generation +################################################################################ + define ROOTFS_ISO9660_CMD $(HOST_DIR)/bin/xorriso -as mkisofs \ $(ROOTFS_ISO9660_OPTS) \ -o $@ $(ROOTFS_ISO9660_TMP_TARGET_DIR) endef -ifeq ($(BR2_TARGET_ROOTFS_ISO9660_HYBRID),y) -define ROOTFS_ISO9660_GEN_HYBRID - $(HOST_DIR)/bin/isohybrid -t 0x96 $@ -endef - -ROOTFS_ISO9660_POST_GEN_HOOKS += ROOTFS_ISO9660_GEN_HYBRID -endif +################################################################################ +# Register filesystem +################################################################################ $(eval $(rootfs)) diff --git a/fs/iso9660/isolinux.cfg b/fs/iso9660/isolinux.cfg index 28be4fa05a..565647f0bf 100644 --- a/fs/iso9660/isolinux.cfg +++ b/fs/iso9660/isolinux.cfg @@ -1,5 +1,15 @@ -default 1 -label 1 - kernel __KERNEL_PATH__ - initrd __INITRD_PATH__ - append root=/dev/sr0 +default menu.c32 +prompt 0 +timeout 50 + +menu title ShredOS + +label shredos + menu label ShredOS + kernel __KERNEL_PATH__ + append initrd=__INITRD_PATH__ console=tty3 loglevel=3 + +label shredos-nomodeset + menu label ShredOS (nomodeset) + kernel __KERNEL_PATH__ + append initrd=__INITRD_PATH__ console=tty3 loglevel=3 nomodeset From 56333565cb496bcc9a354f247b02218a3fbdc98c Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Tue, 18 Nov 2025 07:24:48 +0100 Subject: [PATCH 02/35] chore(grub2): remove obsolete vanity patch As the board is now using a GRUB menu, replacing these messages no longer makes sense (most users will never see them), so the additional patch is better removed. Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- .../patches/grub2/001-remove-messages.patch | 32 ------------------- 1 file changed, 32 deletions(-) delete mode 100644 board/shredos/patches/grub2/001-remove-messages.patch diff --git a/board/shredos/patches/grub2/001-remove-messages.patch b/board/shredos/patches/grub2/001-remove-messages.patch deleted file mode 100644 index 040c0caeb2..0000000000 --- a/board/shredos/patches/grub2/001-remove-messages.patch +++ /dev/null @@ -1,32 +0,0 @@ -diff --git a/grub-core/kern/main.c b/grub-core/kern/main.c -index 3262444..3e37133 100644 ---- a/grub-core/kern/main.c -+++ b/grub-core/kern/main.c -@@ -211,8 +211,8 @@ grub_main (void) - grub_machine_init (); - - /* Hello. */ -- grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT); -- grub_printf ("Welcome to GRUB!\n\n"); -+ //grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT); -+ //grub_printf ("Welcome to GRUB!\n\n"); - grub_setcolorstate (GRUB_TERM_COLOR_STANDARD); - - /* Load pre-loaded modules and free the space. */ -diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c -index 7e0a158..255db71 100644 ---- a/grub-core/normal/menu.c -+++ b/grub-core/normal/menu.c -@@ -672,9 +672,9 @@ static void - notify_booting (grub_menu_entry_t entry, - void *userdata __attribute__((unused))) - { -- grub_printf (" "); -- grub_printf_ (N_("Booting `%s'"), entry->title); -- grub_printf ("\n\n"); -+ //grub_printf (" "); -+ //grub_printf_ (N_("Booting `%s'"), entry->title); -+ grub_printf ("\nShred OS - booting...\n"); - } - - /* Callback invoked when a default menu entry executed because of a timeout From af1654ee9fc96967a7990c2ec323f15f290752ba Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Tue, 18 Nov 2025 07:32:51 +0100 Subject: [PATCH 03/35] fix(shredos): refactor post-process scripts Post-processing used a static (outdated?) GRUB image for USB image generation, but it is better to use the GRUB image produced as part of the building process, which ensures that the actual compiled GRUB version is used as bootloader in our images and not an outdated one. Post-processing previously embedded the 64-bit EFI bootloader to 32-bit builds, as no architecture checks were in place. This was changed to check for architecture and embed the correct EFI bootloader for the respective target architecture instead. The GRUB configuration was changed to use a menu, to allow the user to choose between standard and nomodeset parameters, while also allowing the user to edit the command line to append other kernel parameters they may need for their systems. The vanity kernel image name was returned to bzImage to clearly mark the image for what it is, and to remain consistent with the ISO file generation where we have no direct control over the image now. Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- board/shredos/bootx64.efi | Bin 1097728 -> 0 bytes board/shredos/doimg.sh | 30 ------------------- board/shredos/genimage.cfg | 8 ++--- board/shredos/genimage_i586.cfg | 40 +++++++++++++++++++++++++ board/shredos/grub.cfg | 10 +++++-- board/shredos/make_img_file.sh | 50 ++++++++++++++++++++++++++++++++ board/shredos/make_iso_file.sh | 29 ++++++++++++++++++ 7 files changed, 130 insertions(+), 37 deletions(-) delete mode 100644 board/shredos/bootx64.efi delete mode 100755 board/shredos/doimg.sh create mode 100644 board/shredos/genimage_i586.cfg create mode 100755 board/shredos/make_img_file.sh create mode 100755 board/shredos/make_iso_file.sh diff --git a/board/shredos/bootx64.efi b/board/shredos/bootx64.efi deleted file mode 100644 index 2f95641783aeee11c4910eb1e233faa2fa337910..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1097728 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 z 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ɕxi|_hzc_y%~HqZ*_=U6e#?b zEDDRb(km7Mo6v$LaXS%&bMXPQA^A?$S}d*+5Hje4UY{l(g!sjgH&tpCA{C7!-sBAX z!I|l`6B?$isSM8~SuER)@98`>+D#uZTxyj`jX`hca6*VIzq{BR1jkhn+W<}{2M{8) z25cPZQT%S}^FnK_W};uF{fPWDW!S(-G6`9GD;+-nkIZfyc1wXW>FY@(u>Bk_)(FnEJZJ#B9J|TMsQV;!GKtI9IUb z80$66==q|p$jiw4d4cCr6Q!fke}I?(I63Te^Avz@C2m17gCsj|6l3(eZ7M=D8cj38 zAwaaEv4D~kmT1NOHcs~Po%yeW(^V0W|{G1yGj?f=I|4`H9>-%Uh{k zOJC@OS1=v+zzZ4cm*lo1Ui4Rg%7d_2;LwYC(a|rCh+Kgab`sC@_y;66kq^ zv~%2H|1{>)D{Z9yD)dN;z<{vB{-Ssw=J6<=&dNq;mANQL`2>)#9h&N!R#`4vHy#F} z=^;LLs_Zm%ZZnZ0G{7~?^ID0Fu(2ZjD%xYoIo9S!(F~t1PaHgygix$mu^wf~uR7(h zwLz)wv)-2K3urjzxa{eXW;V;Gmm!(Cpkv8L1)XuEpif*TNUNDdiCk?Wd{81dDV8efAxk){vck;&`=$@vpgnrNojJo9L6>5Lja zk*tNdLWK0!?}M7zLO#r4VHE^zUO_cPcso*GBr-FdAPRl;&ge!?voBF*1ncxv^0b)K zAS|(>9${EG`2%wtM5j$gPwo%4Q5*w6UaF8o7lGC&$X#L4TrNOi@^?e=!Zm?lP)s*= zfbaxCa8Q!A2pO?&j&lXtILJakUU~&0?#4u^BTqg^mE%Em(3V z?g)oD=nErUsWFM{(D>+oWCl^#qb=MO*uyr7E}(oof6R*OXG?p+S^*ymltZL8Q{Qrw z!@ywWkR`T!+XShV5}Z6R9F~zeKnPGVd>bP~{(uM)PaWX90N)62BMNN3Usn45&8McyzoL0+VWBN5%gP}UY%z!LU6;a$TA zCvcD^c`@PtpX>iQ_QLECnO>!gx^$_Tt4?TM&DPW{_Qsd?L#Wp`Rg6M8DEG z0t2E9<11x4aE`v%#NSz;I~~xO@Petj+BAG2Kn~GxU3cLdxau+S!2}!5aQ~9Y3{s8x z$;!xMEVc@%Wq9z5x;2XPX{(Sg27diV1U|xg;Di8R2#A-{sxcp!t`Ulg>A*UUk5=2K zc+QyuRi|BRCT9Sh%10Yq_v7|}O#+~nS%4g?kU)G`6mt3Cqt(dBED()p<4r3MSuJm* zjA49PptW8PA1l79(e3%_&j`xUvjA@jR{$#EaFH(wBLf(gZK6a#XW|=w1Vjltn~mzd2q}dw^0xA>Z1LLYHaq}d!fRC!Cke&W zx_C#z5+gd+@FC-8!p?w=9dn#Mp>1Fjnj_Ju*ND}t1Fwwkxte}2qMQczXld)1tawfz z9KD&P9u=F!h9v-G&yrvU2K>&MHT(leY@d3+uBGnw{HM0ITqg%!QY z$*v_k!0pn-;`0r17&uxHBFj1}rWl~2PADjGkX@XAAcX_egt;MTaJ65?hu^JEh3Pzl z53$%bLtlcCLB6|-6`jK2Ss31TK~8^S2om<{ISHCEzEY|^ybx#UmwJN-cs{bQf%L-XLg}YSX|{2R&Y&&8PN|<(7#X6dZ|aws z3kX}Y9lV7>fXd)wt;+y-5w^#zzFeoaWErXPV%l*It6K(uiRHJPPUh#_m-!<3GQJ3M zZ3JP@E{hP5C(n=W5gt?x1&Ki^axQAHvIREY8+#enqI_Hn2dNlufs@{ z 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
I=B8;s}5y`FuW|Y-NjpRzzS^m;42o%XKAnQ=v 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ÿ-1}pe zBXXnB`hIw(5xvvnTRNTIJD*h&V#yF!J~YcbZ07rj9dW7dW;Xig>@1_EIzrWd@L6a0 zsfk>zx2>L?^A2LCsh^~`-faSytMblxl z4;Lom@j)Bw{(LHkEWB%I{lr6;u_sS2q%+D@dg1XI)Pwti*^`v5#V`|xB|4ada~awH zMb^>QGTDVO`M*d;1X}{M(gQkJnxTmu9;Y)m7XcO@R5y1BS&#GpQYu>2Nwrw#G}c5j zI@=5sF#yQxA@iXgTnOtJ>YzMh#J2RZr!0^Q=zcq9atNZM& z1O}|437T!qP?1K<;c;Y&CJ(y%EwB)b-9M3qT(}_j307n&p72|3Me-rN+U&yoG%cSJ zvj$d$hr2u(g8a=}NsuEv(*GnSxkQBEnznBMP8qTEU0YlC1~%!01xBYKapbggME>Y+ zXT_})3?0uuasPv9^;~~<%V<)ZD}gu?j5yO zQWuQo*)m|XHu?1drh4Ei2`mU&TbYftgAfAa?6)4Rt4TsWgB67&L|B1$#T^O5UGmgm z=d>nVW7%69`G*dF=d?hrI;Zy1@x&gUcP+RLv;(DnJa_OEFfHi5I@ z?E}-Pttww>XTq;YHzYxLhFeydk@^De(}G3W~3wbw3M#{>;7l2DG$j!W!wSh)kKxo9Gn%js>ym zOYudqhizfZqOj5YB(vafw=_b@L<((O>T(9njpVFfJRXOh5PMRQC7r?(3LK}q^*MTi zdCQhhP;g+yPBxS(WJ+-_r9+(5W7QEY#NAFKDtSyP<~1Z2auGuujbEX045Tr97j)jgkATU!&=JaP z?I9f7NXFUskBh;=0D`;peHs}PSD8L=7IlP1MJnFn)WrI*0s zEb%zmv)X!LkDiampilUlD8Cnq{N9fT2t4ve`0B*P%oS!DR}@9qw4==dSCdo3jSDw2 z>L^&K525uRv9v9GOvIC_@QDOMTLeQQ0Cg2< zT~Md35^oHJsfhU_M6sE%%rSnL^z3AH5ViK8K3WVJ8d!Z8tO~}qUI^9r8tn`XtjKKW z*-T=vD-4=YsJ|lRsJmz>IIE+cp!!qQ7-@$p4Z8vxwD}Zv`Jbc|oScSyMX}+xxJ)eb zL(YrrM=e6FFh}GS)L89gfNe18FKH_V4(BDe`kzGRbR>uRpQMzBQtJVn9O3gZ0u?!p zHdVID@{klT=JoyU{^<50Fo~idTplvfNHrTh$;o7LLa20sD{@|_w9yker`&pkMlHb6 z4SJG%h9pUZG)ayWH@HR_u{|F{QF5`C{4C)ndPWD9ikio^`ryTDX(>PLZsl&d7Y}G9 zc;{w%paxoTs`Y*Q-sirr({DamKprC7_{t`kM;WIqDW_Kt=n>T!coad_dXk$H{nj%` z8V~53KLb<$8%IvgP(<9YVL2#a>7Sxb{*(K3J>YO=Wo6?S!2XFh$1b^JwtUCRi0=T>Yqu)wppp1zFP=(zFQj;1@XK}Xqj zW!S+3ceub7!!r#3h2OmRU!m{d`*ScIzRUt}$HcF3gTE2xX;?l_T&pJ|1E=>;2Qzm3 z_>CuVFkbNQ3I6oC9IO-kVZoP;<=`(Os5ansFnyjC=Kn1G>&1*E9o_gJ%slmm2jlO6 zlb*K-edgkxj?eH8dug}?60VE%LWFKN1iwkN^oNgJ`jx4KctiJO_Q zr}U*$d%uy4dzc8Z^XUVu;`-Kk|2AhHtmB)hg4EryaPEb|>47MsZi3EsK@raz z6zrrz$`6n*&>?b~`%oCFUL-#8`p?}=MM!7PNk!S-Dg$&&J1#!_D$@j_&mqeQic%51 ztX@1*#4(*ja%TK&g-;dNBuCvxVZOpoSIkpBql3 q67KiFDA38u#+3P`GOTF@>x0 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

2Pj=iO+$iF@O6f^v9^=mFgSn^~KUuA|r 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 HPr3gE+rrX> diff --git a/board/shredos/doimg.sh b/board/shredos/doimg.sh deleted file mode 100755 index afabed9ad0..0000000000 --- a/board/shredos/doimg.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -e - -version=`cat board/shredos/fsoverlay/etc/shredos/version.txt` - -cp "board/shredos/grub.cfg" "${BINARIES_DIR}/grub.cfg" || exit 1 -cp "board/shredos/bootx64.efi" "${BINARIES_DIR}/bootx64.efi" || exit 1 -#cp "${HOST_DIR}/lib/grub/i386-pc/boot.img" "${BINARIES_DIR}/boot.img" || exit 1 -cp "output/target/lib/grub/i386-pc/boot.img" "${BINARIES_DIR}/boot.img" || exit 1 - -# copy the ShredOS icon and Windows autorun.inf; if a USB stick is plugged into a Windows system -# it will be identified as 'ShredOS - Dangerous' as a warning to users unaware what ShredOS is. -cp "board/shredos/autorun.inf" "${BINARIES_DIR}/autorun.inf" || exit 1 -cp "board/shredos/README.txt" "${BINARIES_DIR}/README.txt" || exit 1 -cp "board/shredos/shredos.ico" "${BINARIES_DIR}/shredos.ico" || exit 1 - -# version.txt is used to help identify boot disc -cp "board/shredos/fsoverlay/etc/shredos/version.txt" "${BINARIES_DIR}/version.txt" || exit 1 - -rm -rf "${BUILD_DIR}/genimage.tmp" || exit 1 -genimage --rootpath="${TARGET_DIR}" --inputpath="${BINARIES_DIR}" --outputpath="${BINARIES_DIR}" --config="board/shredos/genimage.cfg" --tmppath="${BUILD_DIR}/genimage.tmp" || exit 1 - -# renaming -SUFFIXIMG="${version}_$(date +%Y%m%d)" -FINAL_IMAGE_PATH="${BINARIES_DIR}/shredos-${SUFFIXIMG}.img" -mv "${BINARIES_DIR}/shredos.img" "${FINAL_IMAGE_PATH}" || exit 1 -#mv "${BINARIES_DIR}/bzImage" "${FINAL_IMAGE_PATH}" || exit 1 - -echo "File ${FINAL_IMAGE_PATH} created successfully" - -exit 0 diff --git a/board/shredos/genimage.cfg b/board/shredos/genimage.cfg index 5557b2d39a..2d6e121872 100644 --- a/board/shredos/genimage.cfg +++ b/board/shredos/genimage.cfg @@ -1,14 +1,14 @@ image boot.vfat { vfat { extraargs = "-F 32 -n SHREDOS" + file boot/bzImage { image = 'bzImage' } file boot/grub/grub.cfg { image = 'grub.cfg' } - file boot/shredos { image = 'bzImage' } file boot/version.txt { image = 'version.txt' } file EFI/BOOT/bootx64.efi { image = 'bootx64.efi' } file EFI/BOOT/grub.cfg { image = 'grub.cfg' } - file shredos.ico { image = 'shredos.ico' } - file README.txt { image = 'README.txt' } - file autorun.inf { image = 'autorun.inf' } + file shredos.ico { image = 'shredos.ico' } + file README.txt { image = 'README.txt' } + file autorun.inf { image = 'autorun.inf' } } size = 310000000 diff --git a/board/shredos/genimage_i586.cfg b/board/shredos/genimage_i586.cfg new file mode 100644 index 0000000000..9f1cf73d15 --- /dev/null +++ b/board/shredos/genimage_i586.cfg @@ -0,0 +1,40 @@ +image boot.vfat { + vfat { + extraargs = "-F 32 -n SHREDOS" + file boot/bzImage { image = 'bzImage' } + file boot/grub/grub.cfg { image = 'grub.cfg' } + file boot/version.txt { image = 'version.txt' } + file EFI/BOOT/bootia32.efi { image = 'bootia32.efi' } + file EFI/BOOT/grub.cfg { image = 'grub.cfg' } + file shredos.ico { image = 'shredos.ico' } + file README.txt { image = 'README.txt' } + file autorun.inf { image = 'autorun.inf' } + } + + size = 310000000 +} + +image shredos.img { + hdimage { + } + + partition boot { + in-partition-table = "no" + image = "boot.img" + offset = 0 + size = 512 + holes = {"(440; 512)"} + } + + partition grub { + in-partition-table = "no" + image = "grub.img" + offset = 512 + } + + partition vfat { + partition-type = 0xC + image = "boot.vfat" + offset = 646656 + } +} diff --git a/board/shredos/grub.cfg b/board/shredos/grub.cfg index b4307b1df6..c96e7933bb 100644 --- a/board/shredos/grub.cfg +++ b/board/shredos/grub.cfg @@ -1,6 +1,10 @@ set default="0" -set timeout="0" +set timeout="5" -menuentry "shredos" { - linux /boot/shredos console=tty3 loglevel=3 +menuentry "ShredOS" { + linux /boot/bzImage console=tty3 loglevel=3 +} + +menuentry "ShredOS (nomodeset)" { + linux /boot/bzImage console=tty3 loglevel=3 nomodeset } diff --git a/board/shredos/make_img_file.sh b/board/shredos/make_img_file.sh new file mode 100755 index 0000000000..7f435d66c8 --- /dev/null +++ b/board/shredos/make_img_file.sh @@ -0,0 +1,50 @@ +#!/bin/bash -e + +if grep -Eq "^BR2_ARCH_IS_64=y$" "${BR2_CONFIG}"; then + MKIMAGE_ARCH=x86_64 + MKIMAGE_EFI=bootx64.efi + MKIMAGE_CFG=genimage.cfg +else + MKIMAGE_ARCH=i586 + MKIMAGE_EFI=bootia32.efi + MKIMAGE_CFG=genimage_i586.cfg +fi + +version=$(cat board/shredos/fsoverlay/etc/shredos/version.txt) + +cp "board/shredos/grub.cfg" "${BINARIES_DIR}/grub.cfg" || exit 1 +cp "output/target/lib/grub/i386-pc/boot.img" "${BINARIES_DIR}/boot.img" || exit 1 +cp "${BINARIES_DIR}/efi-part/EFI/BOOT/${MKIMAGE_EFI}" "${BINARIES_DIR}/${MKIMAGE_EFI}" || exit 1 + +cp "board/shredos/autorun.inf" "${BINARIES_DIR}/autorun.inf" || exit 1 +cp "board/shredos/README.txt" "${BINARIES_DIR}/README.txt" || exit 1 +cp "board/shredos/shredos.ico" "${BINARIES_DIR}/shredos.ico" || exit 1 + +# version.txt is used to help identify the (boot) USB disk +cp "board/shredos/fsoverlay/etc/shredos/version.txt" "${BINARIES_DIR}/version.txt" || exit 1 + +rm -rf "${BUILD_DIR}/genimage.tmp" || exit 1 +genimage --rootpath="${TARGET_DIR}" \ + --inputpath="${BINARIES_DIR}" \ + --outputpath="${BINARIES_DIR}" \ + --config="board/shredos/${MKIMAGE_CFG}" \ + --tmppath="${BUILD_DIR}/genimage.tmp" || exit 1 + +SUFFIXIMG="${version}_$(date +%Y%m%d)" +FINAL_IMAGE_PATH="${BINARIES_DIR}/shredos-${SUFFIXIMG}.img" +mv "${BINARIES_DIR}/shredos.img" "${FINAL_IMAGE_PATH}" || exit 1 + +GREEN="\033[0;32m" +RESET="\033[0m" + +printf "%b" "$GREEN" +echo +echo "===============================================" +echo " USB image '${FINAL_IMAGE_PATH}'" +echo " (for '${MKIMAGE_ARCH}' architecture)" +echo " CREATED SUCCESSFULLY!" +echo "===============================================" +echo +printf "%b\n" "$RESET" + +exit 0 diff --git a/board/shredos/make_iso_file.sh b/board/shredos/make_iso_file.sh new file mode 100755 index 0000000000..a9a12ab346 --- /dev/null +++ b/board/shredos/make_iso_file.sh @@ -0,0 +1,29 @@ +#!/bin/bash -e + +if grep -Eq "^BR2_ARCH_IS_64=y$" "${BR2_CONFIG}"; then + MKIMAGE_ARCH=x86_64 +else + MKIMAGE_ARCH=i386 +fi + +version=$(cat board/shredos/fsoverlay/etc/shredos/version.txt) + +SUFFIXISO="${version}_$(date +%Y%m%d)" +FINAL_ISO_PATH="${BINARIES_DIR}/shredos-${SUFFIXISO}.iso" + +mv "${BINARIES_DIR}/rootfs.iso9660" "${FINAL_ISO_PATH}" || exit 1 + +GREEN="\033[0;32m" +RESET="\033[0m" + +printf "%b" "$GREEN" +echo +echo "===============================================" +echo " ISO image '${FINAL_ISO_PATH}'" +echo " (for '${MKIMAGE_ARCH}' architecture)" +echo " CREATED SUCCESSFULLY!" +echo "===============================================" +echo +printf "%b" "$RESET" + +exit 0 From 29bf065cd8eea7a7c062d511a2b2e4d6ee66c5d8 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Tue, 18 Nov 2025 07:37:49 +0100 Subject: [PATCH 04/35] feat(configs): adapt configurations for new changes The default configuration "shredos_defconfig" was amended to produce both the existing USB image (which allows writing PDFs to the USB) and the new hybrid ISO (which now allows BIOS+UEFI booting, as well as flashing to USB and burning to CD/DVD-ROM) in one build. Additional configurations "shredos_img_defconfig" and "shredos_iso_defconfig" were added which only target either the existing USB image or the new hybrid ISO, for full flexibility. Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- configs/shredos_defconfig | 13 ++- configs/shredos_img_defconfig | 180 +++++++++++++++++++++++++++++++++ configs/shredos_iso_defconfig | 182 ++++++++++++++++++++++++++++++++++ 3 files changed, 371 insertions(+), 4 deletions(-) create mode 100644 configs/shredos_img_defconfig create mode 100644 configs/shredos_iso_defconfig diff --git a/configs/shredos_defconfig b/configs/shredos_defconfig index d76362015a..0e10f649ec 100644 --- a/configs/shredos_defconfig +++ b/configs/shredos_defconfig @@ -15,7 +15,7 @@ BR2_GENERATE_LOCALE="en_US.UTF-8" BR2_SYSTEM_ENABLE_NLS=y BR2_TARGET_TZ_INFO=y BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" -BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/doimg.sh" +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh board/shredos/make_img_file.sh" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/shredos/kernel-6.6.22-defconfig.config" @@ -164,15 +164,20 @@ BR2_PACKAGE_UTIL_LINUX_SETTERM=y BR2_PACKAGE_UTIL_LINUX_SU=y BR2_PACKAGE_UTIL_LINUX_SULOGIN=y BR2_TARGET_ROOTFS_CPIO_LZMA=y -BR2_TARGET_ROOTFS_EXT2=y -BR2_TARGET_ROOTFS_EXT2_SIZE="768M" BR2_TARGET_ROOTFS_INITRAMFS=y +BR2_TARGET_ROOTFS_ISO9660=y +BR2_TARGET_ROOTFS_ISO9660_BOTH=y +# BR2_TARGET_ROOTFS_ISO9660_INITRD is not set +BR2_TARGET_ROOTFS_ISO9660_HYBRID=y +# BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_I386_PC=y BR2_TARGET_GRUB2_X86_64_EFI=y BR2_TARGET_GRUB2_BUILTIN_MODULES_PC="boot linux ext2 fat squash4 part_msdos part_gpt normal progress biosdisk all_video video_cirrus video_bochs net tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard" -BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard" +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard iso9660" BR2_TARGET_GRUB2_INSTALL_TOOLS=y +BR2_TARGET_SYSLINUX=y +BR2_PACKAGE_HOST_E2FSPROGS=y BR2_PACKAGE_HOST_GENIMAGE=y BR2_PACKAGE_HOST_PYTHON3=y BR2_PACKAGE_HOST_PYTHON3_BZIP2=y diff --git a/configs/shredos_img_defconfig b/configs/shredos_img_defconfig new file mode 100644 index 0000000000..1dcccbd7d9 --- /dev/null +++ b/configs/shredos_img_defconfig @@ -0,0 +1,180 @@ +BR2_x86_64=y +BR2_x86_nocona=y +BR2_PACKAGE_GLIBC_UTILS=y +BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_TOOLCHAIN_GLIBC_GCONV_LIBS_COPY=y +BR2_CPAN_MIRROR="http://cpan.metacpan.org" +BR2_TARGET_GENERIC_HOSTNAME="shredos" +BR2_TARGET_GENERIC_ISSUE="Welcome to ShredOS https://github.com/PartialVolume/shredos.x86_64" +BR2_INIT_SYSV=y +BR2_ROOTFS_MERGED_USR=y +BR2_SYSTEM_BIN_SH_BASH=y +BR2_SYSTEM_DEFAULT_PATH="/bin:/sbin:/usr/bin:/usr/sbin" +# BR2_ENABLE_LOCALE_PURGE is not set +BR2_GENERATE_LOCALE="en_US.UTF-8" +BR2_SYSTEM_ENABLE_NLS=y +BR2_TARGET_TZ_INFO=y +BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_img_file.sh" +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/shredos/kernel-6.6.22-defconfig.config" +BR2_PACKAGE_LINUX_TOOLS_CPUPOWER=y +BR2_PACKAGE_LINUX_TOOLS_PERF=y +BR2_PACKAGE_LINUX_TOOLS_SELFTESTS=y +# BR2_PACKAGE_BUSYBOX_SELINUX is not set +BR2_PACKAGE_FFMPEG=y +BR2_PACKAGE_FFMPEG_GPL=y +BR2_PACKAGE_FFMPEG_NONFREE=y +BR2_PACKAGE_FFMPEG_SWSCALE=y +BR2_PACKAGE_BZIP2=y +BR2_PACKAGE_GZIP=y +BR2_PACKAGE_UNZIP=y +BR2_PACKAGE_XZ=y +BR2_PACKAGE_ZIP=y +BR2_PACKAGE_HEXEDIT=y +BR2_PACKAGE_BINUTILS=y +BR2_PACKAGE_GETTEXT=y +BR2_PACKAGE_GREP=y +BR2_PACKAGE_LIBTOOL=y +BR2_PACKAGE_SED=y +BR2_PACKAGE_DOSFSTOOLS=y +BR2_PACKAGE_DOSFSTOOLS_FATLABEL=y +BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y +BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT=y +BR2_PACKAGE_E2FSPROGS=y +BR2_PACKAGE_EXFATPROGS=y +BR2_PACKAGE_ASCII_INVADERS=y +BR2_PACKAGE_DIRECTFB=y +BR2_PACKAGE_DIRECTFB_ATI128=y +BR2_PACKAGE_DIRECTFB_MATROX=y +BR2_PACKAGE_DIRECTFB_I830=y +BR2_PACKAGE_FBDUMP=y +BR2_PACKAGE_FBGRAB=y +BR2_PACKAGE_FBSET=y +BR2_PACKAGE_FBTERM=y +BR2_PACKAGE_FBV=y +BR2_PACKAGE_MESA3D=y +BR2_PACKAGE_MESA3D_LLVM=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_CROCUS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_ETNAVIV=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_I915=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_IRIS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_LIMA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R300=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SVGA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_TEGRA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VIRGL=y +BR2_PACKAGE_MESA3D_VULKAN_DRIVER_INTEL=y +BR2_PACKAGE_MESA3D_OSMESA_GALLIUM=y +BR2_PACKAGE_MESA3D_OPENGL_ES=y +BR2_PACKAGE_LINUX_FIRMWARE=y +BR2_PACKAGE_LINUX_FIRMWARE_AMDGPU=y +BR2_PACKAGE_LINUX_FIRMWARE_I915=y +BR2_PACKAGE_LINUX_FIRMWARE_RADEON=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_VENUS=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_ADRENO=y +BR2_PACKAGE_LINUX_FIRMWARE_MFC_V8=y +BR2_PACKAGE_LINUX_FIRMWARE_QUALCOMM_6174=y +BR2_PACKAGE_LINUX_FIRMWARE_BROADCOM_TIGON3=y +BR2_PACKAGE_LINUX_FIRMWARE_BNX2X=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T4=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T5=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_E100=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_ICE=y +BR2_PACKAGE_LINUX_FIRMWARE_MICROCHIP_VSC85XX_PHY=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_4X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_815X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_8169=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_2XXX=y +BR2_PACKAGE_EDID_DECODE=y +BR2_PACKAGE_HDPARM=y +BR2_PACKAGE_KBD=y +BR2_PACKAGE_LM_SENSORS=y +BR2_PACKAGE_LSHW=y +BR2_PACKAGE_LSSCSI=y +BR2_PACKAGE_MINICOM=y +BR2_PACKAGE_NVME=y +BR2_PACKAGE_READ_EDID=y +BR2_PACKAGE_SG3_UTILS=y +BR2_PACKAGE_SG3_UTILS_PROGS=y +BR2_PACKAGE_SMARTMONTOOLS=y +BR2_PACKAGE_SYSSTAT=y +BR2_PACKAGE_TRIGGERHAPPY=y +BR2_PACKAGE_PERL=y +BR2_PACKAGE_PYTHON_PYASN1_MODULES=y +BR2_PACKAGE_PYTHON_PYBIND=y +BR2_PACKAGE_PYTHON_PYNDIFF=y +BR2_PACKAGE_PYTHON_SCAPY=y +BR2_PACKAGE_LZ4=y +BR2_PACKAGE_LIBGCRYPT=y +BR2_PACKAGE_LIBJPEG=y +BR2_PACKAGE_STB=y +BR2_PACKAGE_LIBHID=y +BR2_PACKAGE_JSON_GLIB=y +BR2_PACKAGE_LIBCURL=y +BR2_PACKAGE_LIBUPNP=y +BR2_PACKAGE_KERNEL_CMDLINE_EXTRACTOR=y +BR2_PACKAGE_LIBCAP=y +BR2_PACKAGE_LIBSECCOMP=y +BR2_PACKAGE_NWIPE=y +BR2_PACKAGE_LIBFRIBIDI=y +BR2_PACKAGE_NCURSES_WCHAR=y +BR2_PACKAGE_UTF8PROC=y +BR2_PACKAGE_HEIRLOOM_MAILX=y +BR2_PACKAGE_COLLECTD=y +BR2_PACKAGE_COLLECTD_NTPD=y +BR2_PACKAGE_XUTIL_UTIL_MACROS=y +BR2_PACKAGE_IPTABLES=y +BR2_PACKAGE_LFTP=y +BR2_PACKAGE_LFTP_PROTO_SFTP=y +BR2_PACKAGE_NMAP=y +BR2_PACKAGE_NTP=y +BR2_PACKAGE_NTP_NTPDATE=y +BR2_PACKAGE_NTP_NTPTIME=y +BR2_PACKAGE_OPENSSH=y +# BR2_PACKAGE_OPENSSH_SERVER is not set +BR2_PACKAGE_RPCBIND=y +BR2_PACKAGE_SNMPCLITOOLS=y +BR2_PACKAGE_TFTPD=y +BR2_PACKAGE_TRACEROUTE=y +BR2_PACKAGE_WIREGUARD_TOOLS=y +BR2_PACKAGE_RESTORECOND=y +BR2_PACKAGE_SELINUX_PYTHON=y +BR2_PACKAGE_SELINUX_PYTHON_AUDIT2ALLOW=y +BR2_PACKAGE_PARALLEL=y +BR2_PACKAGE_TMUX=y +BR2_PACKAGE_OPENSEACHEST=y +BR2_PACKAGE_PROCPS_NG=y +BR2_PACKAGE_RUNC=y +BR2_PACKAGE_UTIL_LINUX_BINARIES=y +BR2_PACKAGE_UTIL_LINUX_AGETTY=y +BR2_PACKAGE_UTIL_LINUX_FSCK=y +BR2_PACKAGE_UTIL_LINUX_LAST=y +BR2_PACKAGE_UTIL_LINUX_LOGIN=y +BR2_PACKAGE_UTIL_LINUX_MOUNT=y +BR2_PACKAGE_UTIL_LINUX_MOUNTPOINT=y +BR2_PACKAGE_UTIL_LINUX_PIVOT_ROOT=y +BR2_PACKAGE_UTIL_LINUX_RFKILL=y +BR2_PACKAGE_UTIL_LINUX_RUNUSER=y +BR2_PACKAGE_UTIL_LINUX_SETTERM=y +BR2_PACKAGE_UTIL_LINUX_SU=y +BR2_PACKAGE_UTIL_LINUX_SULOGIN=y +BR2_TARGET_ROOTFS_CPIO_LZMA=y +BR2_TARGET_ROOTFS_INITRAMFS=y +# BR2_TARGET_ROOTFS_ISO9660_INITRD is not set +# BR2_TARGET_ROOTFS_TAR is not set +BR2_TARGET_GRUB2=y +BR2_TARGET_GRUB2_I386_PC=y +BR2_TARGET_GRUB2_X86_64_EFI=y +BR2_TARGET_GRUB2_BUILTIN_MODULES_PC="boot linux ext2 fat squash4 part_msdos part_gpt normal progress biosdisk all_video video_cirrus video_bochs net tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard" +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard" +BR2_TARGET_GRUB2_INSTALL_TOOLS=y +BR2_PACKAGE_HOST_E2FSPROGS=y +BR2_PACKAGE_HOST_GENIMAGE=y +BR2_PACKAGE_HOST_PYTHON3=y +BR2_PACKAGE_HOST_PYTHON3_BZIP2=y +BR2_PACKAGE_HOST_PYTHON3_SSL=y diff --git a/configs/shredos_iso_defconfig b/configs/shredos_iso_defconfig new file mode 100644 index 0000000000..2770f24239 --- /dev/null +++ b/configs/shredos_iso_defconfig @@ -0,0 +1,182 @@ +BR2_x86_64=y +BR2_x86_nocona=y +BR2_PACKAGE_GLIBC_UTILS=y +BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_TOOLCHAIN_GLIBC_GCONV_LIBS_COPY=y +BR2_CPAN_MIRROR="http://cpan.metacpan.org" +BR2_TARGET_GENERIC_HOSTNAME="shredos" +BR2_TARGET_GENERIC_ISSUE="Welcome to ShredOS https://github.com/PartialVolume/shredos.x86_64" +BR2_INIT_SYSV=y +BR2_ROOTFS_MERGED_USR=y +BR2_SYSTEM_BIN_SH_BASH=y +BR2_SYSTEM_DEFAULT_PATH="/bin:/sbin:/usr/bin:/usr/sbin" +# BR2_ENABLE_LOCALE_PURGE is not set +BR2_GENERATE_LOCALE="en_US.UTF-8" +BR2_SYSTEM_ENABLE_NLS=y +BR2_TARGET_TZ_INFO=y +BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh" +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/shredos/kernel-6.6.22-defconfig.config" +BR2_PACKAGE_LINUX_TOOLS_CPUPOWER=y +BR2_PACKAGE_LINUX_TOOLS_PERF=y +BR2_PACKAGE_LINUX_TOOLS_SELFTESTS=y +# BR2_PACKAGE_BUSYBOX_SELINUX is not set +BR2_PACKAGE_FFMPEG=y +BR2_PACKAGE_FFMPEG_GPL=y +BR2_PACKAGE_FFMPEG_NONFREE=y +BR2_PACKAGE_FFMPEG_SWSCALE=y +BR2_PACKAGE_BZIP2=y +BR2_PACKAGE_GZIP=y +BR2_PACKAGE_UNZIP=y +BR2_PACKAGE_XZ=y +BR2_PACKAGE_ZIP=y +BR2_PACKAGE_HEXEDIT=y +BR2_PACKAGE_BINUTILS=y +BR2_PACKAGE_GETTEXT=y +BR2_PACKAGE_GREP=y +BR2_PACKAGE_LIBTOOL=y +BR2_PACKAGE_SED=y +BR2_PACKAGE_DOSFSTOOLS=y +BR2_PACKAGE_DOSFSTOOLS_FATLABEL=y +BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y +BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT=y +BR2_PACKAGE_E2FSPROGS=y +BR2_PACKAGE_EXFATPROGS=y +BR2_PACKAGE_ASCII_INVADERS=y +BR2_PACKAGE_DIRECTFB=y +BR2_PACKAGE_DIRECTFB_ATI128=y +BR2_PACKAGE_DIRECTFB_MATROX=y +BR2_PACKAGE_DIRECTFB_I830=y +BR2_PACKAGE_FBDUMP=y +BR2_PACKAGE_FBGRAB=y +BR2_PACKAGE_FBSET=y +BR2_PACKAGE_FBTERM=y +BR2_PACKAGE_FBV=y +BR2_PACKAGE_MESA3D=y +BR2_PACKAGE_MESA3D_LLVM=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_CROCUS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_ETNAVIV=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_I915=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_IRIS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_LIMA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R300=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SVGA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_TEGRA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VIRGL=y +BR2_PACKAGE_MESA3D_VULKAN_DRIVER_INTEL=y +BR2_PACKAGE_MESA3D_OSMESA_GALLIUM=y +BR2_PACKAGE_MESA3D_OPENGL_ES=y +BR2_PACKAGE_LINUX_FIRMWARE=y +BR2_PACKAGE_LINUX_FIRMWARE_AMDGPU=y +BR2_PACKAGE_LINUX_FIRMWARE_I915=y +BR2_PACKAGE_LINUX_FIRMWARE_RADEON=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_VENUS=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_ADRENO=y +BR2_PACKAGE_LINUX_FIRMWARE_MFC_V8=y +BR2_PACKAGE_LINUX_FIRMWARE_QUALCOMM_6174=y +BR2_PACKAGE_LINUX_FIRMWARE_BROADCOM_TIGON3=y +BR2_PACKAGE_LINUX_FIRMWARE_BNX2X=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T4=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T5=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_E100=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_ICE=y +BR2_PACKAGE_LINUX_FIRMWARE_MICROCHIP_VSC85XX_PHY=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_4X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_815X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_8169=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_2XXX=y +BR2_PACKAGE_EDID_DECODE=y +BR2_PACKAGE_HDPARM=y +BR2_PACKAGE_KBD=y +BR2_PACKAGE_LM_SENSORS=y +BR2_PACKAGE_LSHW=y +BR2_PACKAGE_LSSCSI=y +BR2_PACKAGE_MINICOM=y +BR2_PACKAGE_NVME=y +BR2_PACKAGE_READ_EDID=y +BR2_PACKAGE_SG3_UTILS=y +BR2_PACKAGE_SG3_UTILS_PROGS=y +BR2_PACKAGE_SMARTMONTOOLS=y +BR2_PACKAGE_SYSSTAT=y +BR2_PACKAGE_TRIGGERHAPPY=y +BR2_PACKAGE_PERL=y +BR2_PACKAGE_PYTHON_PYASN1_MODULES=y +BR2_PACKAGE_PYTHON_PYBIND=y +BR2_PACKAGE_PYTHON_PYNDIFF=y +BR2_PACKAGE_PYTHON_SCAPY=y +BR2_PACKAGE_LZ4=y +BR2_PACKAGE_LIBGCRYPT=y +BR2_PACKAGE_LIBJPEG=y +BR2_PACKAGE_STB=y +BR2_PACKAGE_LIBHID=y +BR2_PACKAGE_JSON_GLIB=y +BR2_PACKAGE_LIBCURL=y +BR2_PACKAGE_LIBUPNP=y +BR2_PACKAGE_KERNEL_CMDLINE_EXTRACTOR=y +BR2_PACKAGE_LIBCAP=y +BR2_PACKAGE_LIBSECCOMP=y +BR2_PACKAGE_NWIPE=y +BR2_PACKAGE_LIBFRIBIDI=y +BR2_PACKAGE_NCURSES_WCHAR=y +BR2_PACKAGE_UTF8PROC=y +BR2_PACKAGE_HEIRLOOM_MAILX=y +BR2_PACKAGE_COLLECTD=y +BR2_PACKAGE_COLLECTD_NTPD=y +BR2_PACKAGE_XUTIL_UTIL_MACROS=y +BR2_PACKAGE_IPTABLES=y +BR2_PACKAGE_LFTP=y +BR2_PACKAGE_LFTP_PROTO_SFTP=y +BR2_PACKAGE_NMAP=y +BR2_PACKAGE_NTP=y +BR2_PACKAGE_NTP_NTPDATE=y +BR2_PACKAGE_NTP_NTPTIME=y +BR2_PACKAGE_OPENSSH=y +# BR2_PACKAGE_OPENSSH_SERVER is not set +BR2_PACKAGE_RPCBIND=y +BR2_PACKAGE_SNMPCLITOOLS=y +BR2_PACKAGE_TFTPD=y +BR2_PACKAGE_TRACEROUTE=y +BR2_PACKAGE_WIREGUARD_TOOLS=y +BR2_PACKAGE_RESTORECOND=y +BR2_PACKAGE_SELINUX_PYTHON=y +BR2_PACKAGE_SELINUX_PYTHON_AUDIT2ALLOW=y +BR2_PACKAGE_PARALLEL=y +BR2_PACKAGE_TMUX=y +BR2_PACKAGE_OPENSEACHEST=y +BR2_PACKAGE_PROCPS_NG=y +BR2_PACKAGE_RUNC=y +BR2_PACKAGE_UTIL_LINUX_BINARIES=y +BR2_PACKAGE_UTIL_LINUX_AGETTY=y +BR2_PACKAGE_UTIL_LINUX_FSCK=y +BR2_PACKAGE_UTIL_LINUX_LAST=y +BR2_PACKAGE_UTIL_LINUX_LOGIN=y +BR2_PACKAGE_UTIL_LINUX_MOUNT=y +BR2_PACKAGE_UTIL_LINUX_MOUNTPOINT=y +BR2_PACKAGE_UTIL_LINUX_PIVOT_ROOT=y +BR2_PACKAGE_UTIL_LINUX_RFKILL=y +BR2_PACKAGE_UTIL_LINUX_RUNUSER=y +BR2_PACKAGE_UTIL_LINUX_SETTERM=y +BR2_PACKAGE_UTIL_LINUX_SU=y +BR2_PACKAGE_UTIL_LINUX_SULOGIN=y +BR2_TARGET_ROOTFS_CPIO_LZMA=y +BR2_TARGET_ROOTFS_INITRAMFS=y +BR2_TARGET_ROOTFS_ISO9660=y +BR2_TARGET_ROOTFS_ISO9660_BOTH=y +# BR2_TARGET_ROOTFS_ISO9660_INITRD is not set +BR2_TARGET_ROOTFS_ISO9660_HYBRID=y +# BR2_TARGET_ROOTFS_TAR is not set +BR2_TARGET_GRUB2=y +BR2_TARGET_GRUB2_X86_64_EFI=y +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard iso9660" +BR2_TARGET_GRUB2_INSTALL_TOOLS=y +BR2_TARGET_SYSLINUX=y +BR2_PACKAGE_HOST_E2FSPROGS=y +BR2_PACKAGE_HOST_GENIMAGE=y +BR2_PACKAGE_HOST_PYTHON3=y +BR2_PACKAGE_HOST_PYTHON3_BZIP2=y +BR2_PACKAGE_HOST_PYTHON3_SSL=y From e2eafb0f91b8a3ae8b30ebd21cd9dda99a2cc6be Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Tue, 18 Nov 2025 07:39:39 +0100 Subject: [PATCH 05/35] feat(configs): add i586-specific configurations Additional configurations for the i586 builds were added, so that new users can easily build those targets without needing to change things around via "make menuconfig" (potentially triggering unwanted other changes, e.g. reset of GRUB modules). Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- configs/shredos_i586_defconfig | 181 +++++++++++++++++++++++++++++ configs/shredos_img_i586_defconfig | 177 ++++++++++++++++++++++++++++ configs/shredos_iso_i586_defconfig | 179 ++++++++++++++++++++++++++++ 3 files changed, 537 insertions(+) create mode 100644 configs/shredos_i586_defconfig create mode 100644 configs/shredos_img_i586_defconfig create mode 100644 configs/shredos_iso_i586_defconfig diff --git a/configs/shredos_i586_defconfig b/configs/shredos_i586_defconfig new file mode 100644 index 0000000000..d9fc0e8081 --- /dev/null +++ b/configs/shredos_i586_defconfig @@ -0,0 +1,181 @@ +BR2_PACKAGE_GLIBC_UTILS=y +BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_TOOLCHAIN_GLIBC_GCONV_LIBS_COPY=y +BR2_CPAN_MIRROR="http://cpan.metacpan.org" +BR2_TARGET_GENERIC_HOSTNAME="shredos" +BR2_TARGET_GENERIC_ISSUE="Welcome to ShredOS https://github.com/PartialVolume/shredos.x86_64" +BR2_INIT_SYSV=y +BR2_ROOTFS_MERGED_USR=y +BR2_SYSTEM_BIN_SH_BASH=y +BR2_SYSTEM_DEFAULT_PATH="/bin:/sbin:/usr/bin:/usr/sbin" +# BR2_ENABLE_LOCALE_PURGE is not set +BR2_GENERATE_LOCALE="en_US.UTF-8" +BR2_SYSTEM_ENABLE_NLS=y +BR2_TARGET_TZ_INFO=y +BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh board/shredos/make_img_file.sh" +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/shredos/kernel-6.6.22-defconfig.config" +BR2_PACKAGE_LINUX_TOOLS_CPUPOWER=y +BR2_PACKAGE_LINUX_TOOLS_PERF=y +BR2_PACKAGE_LINUX_TOOLS_SELFTESTS=y +# BR2_PACKAGE_BUSYBOX_SELINUX is not set +BR2_PACKAGE_FFMPEG=y +BR2_PACKAGE_FFMPEG_GPL=y +BR2_PACKAGE_FFMPEG_NONFREE=y +BR2_PACKAGE_FFMPEG_SWSCALE=y +BR2_PACKAGE_BZIP2=y +BR2_PACKAGE_GZIP=y +BR2_PACKAGE_UNZIP=y +BR2_PACKAGE_XZ=y +BR2_PACKAGE_ZIP=y +BR2_PACKAGE_HEXEDIT=y +BR2_PACKAGE_BINUTILS=y +BR2_PACKAGE_GETTEXT=y +BR2_PACKAGE_GREP=y +BR2_PACKAGE_LIBTOOL=y +BR2_PACKAGE_SED=y +BR2_PACKAGE_DOSFSTOOLS=y +BR2_PACKAGE_DOSFSTOOLS_FATLABEL=y +BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y +BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT=y +BR2_PACKAGE_E2FSPROGS=y +BR2_PACKAGE_EXFATPROGS=y +BR2_PACKAGE_ASCII_INVADERS=y +BR2_PACKAGE_DIRECTFB=y +BR2_PACKAGE_DIRECTFB_ATI128=y +BR2_PACKAGE_DIRECTFB_MATROX=y +BR2_PACKAGE_DIRECTFB_I830=y +BR2_PACKAGE_FBDUMP=y +BR2_PACKAGE_FBGRAB=y +BR2_PACKAGE_FBSET=y +BR2_PACKAGE_FBTERM=y +BR2_PACKAGE_FBV=y +BR2_PACKAGE_MESA3D=y +BR2_PACKAGE_MESA3D_LLVM=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_CROCUS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_ETNAVIV=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_I915=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_IRIS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_LIMA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R300=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SVGA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_TEGRA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VIRGL=y +BR2_PACKAGE_MESA3D_VULKAN_DRIVER_INTEL=y +BR2_PACKAGE_MESA3D_OSMESA_GALLIUM=y +BR2_PACKAGE_MESA3D_OPENGL_ES=y +BR2_PACKAGE_LINUX_FIRMWARE=y +BR2_PACKAGE_LINUX_FIRMWARE_AMDGPU=y +BR2_PACKAGE_LINUX_FIRMWARE_I915=y +BR2_PACKAGE_LINUX_FIRMWARE_RADEON=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_VENUS=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_ADRENO=y +BR2_PACKAGE_LINUX_FIRMWARE_MFC_V8=y +BR2_PACKAGE_LINUX_FIRMWARE_QUALCOMM_6174=y +BR2_PACKAGE_LINUX_FIRMWARE_BROADCOM_TIGON3=y +BR2_PACKAGE_LINUX_FIRMWARE_BNX2X=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T4=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T5=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_E100=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_ICE=y +BR2_PACKAGE_LINUX_FIRMWARE_MICROCHIP_VSC85XX_PHY=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_4X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_815X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_8169=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_2XXX=y +BR2_PACKAGE_EDID_DECODE=y +BR2_PACKAGE_HDPARM=y +BR2_PACKAGE_KBD=y +BR2_PACKAGE_LM_SENSORS=y +BR2_PACKAGE_LSHW=y +BR2_PACKAGE_LSSCSI=y +BR2_PACKAGE_MINICOM=y +BR2_PACKAGE_NVME=y +BR2_PACKAGE_READ_EDID=y +BR2_PACKAGE_SG3_UTILS=y +BR2_PACKAGE_SG3_UTILS_PROGS=y +BR2_PACKAGE_SMARTMONTOOLS=y +BR2_PACKAGE_SYSSTAT=y +BR2_PACKAGE_TRIGGERHAPPY=y +BR2_PACKAGE_PERL=y +BR2_PACKAGE_PYTHON_PYASN1_MODULES=y +BR2_PACKAGE_PYTHON_PYBIND=y +BR2_PACKAGE_PYTHON_PYNDIFF=y +BR2_PACKAGE_PYTHON_SCAPY=y +BR2_PACKAGE_LZ4=y +BR2_PACKAGE_LIBGCRYPT=y +BR2_PACKAGE_STB=y +BR2_PACKAGE_LIBHID=y +BR2_PACKAGE_JSON_GLIB=y +BR2_PACKAGE_LIBCURL=y +BR2_PACKAGE_LIBUPNP=y +BR2_PACKAGE_KERNEL_CMDLINE_EXTRACTOR=y +BR2_PACKAGE_LIBCAP=y +BR2_PACKAGE_LIBSECCOMP=y +BR2_PACKAGE_NWIPE=y +BR2_PACKAGE_LIBFRIBIDI=y +BR2_PACKAGE_NCURSES_WCHAR=y +BR2_PACKAGE_UTF8PROC=y +BR2_PACKAGE_HEIRLOOM_MAILX=y +BR2_PACKAGE_COLLECTD=y +BR2_PACKAGE_COLLECTD_NTPD=y +BR2_PACKAGE_XUTIL_UTIL_MACROS=y +BR2_PACKAGE_IPTABLES=y +BR2_PACKAGE_LFTP=y +BR2_PACKAGE_LFTP_PROTO_SFTP=y +BR2_PACKAGE_NMAP=y +BR2_PACKAGE_NTP=y +BR2_PACKAGE_NTP_NTPDATE=y +BR2_PACKAGE_NTP_NTPTIME=y +BR2_PACKAGE_OPENSSH=y +# BR2_PACKAGE_OPENSSH_SERVER is not set +BR2_PACKAGE_RPCBIND=y +BR2_PACKAGE_SNMPCLITOOLS=y +BR2_PACKAGE_TFTPD=y +BR2_PACKAGE_TRACEROUTE=y +BR2_PACKAGE_WIREGUARD_TOOLS=y +BR2_PACKAGE_RESTORECOND=y +BR2_PACKAGE_SELINUX_PYTHON=y +BR2_PACKAGE_SELINUX_PYTHON_AUDIT2ALLOW=y +BR2_PACKAGE_PARALLEL=y +BR2_PACKAGE_TMUX=y +BR2_PACKAGE_OPENSEACHEST=y +BR2_PACKAGE_PROCPS_NG=y +BR2_PACKAGE_RUNC=y +BR2_PACKAGE_UTIL_LINUX_BINARIES=y +BR2_PACKAGE_UTIL_LINUX_AGETTY=y +BR2_PACKAGE_UTIL_LINUX_FSCK=y +BR2_PACKAGE_UTIL_LINUX_LAST=y +BR2_PACKAGE_UTIL_LINUX_LOGIN=y +BR2_PACKAGE_UTIL_LINUX_MOUNT=y +BR2_PACKAGE_UTIL_LINUX_MOUNTPOINT=y +BR2_PACKAGE_UTIL_LINUX_PIVOT_ROOT=y +BR2_PACKAGE_UTIL_LINUX_RFKILL=y +BR2_PACKAGE_UTIL_LINUX_RUNUSER=y +BR2_PACKAGE_UTIL_LINUX_SETTERM=y +BR2_PACKAGE_UTIL_LINUX_SU=y +BR2_PACKAGE_UTIL_LINUX_SULOGIN=y +BR2_TARGET_ROOTFS_CPIO_LZMA=y +BR2_TARGET_ROOTFS_INITRAMFS=y +BR2_TARGET_ROOTFS_ISO9660=y +BR2_TARGET_ROOTFS_ISO9660_BOTH=y +# BR2_TARGET_ROOTFS_ISO9660_INITRD is not set +BR2_TARGET_ROOTFS_ISO9660_HYBRID=y +# BR2_TARGET_ROOTFS_TAR is not set +BR2_TARGET_GRUB2=y +BR2_TARGET_GRUB2_I386_PC=y +BR2_TARGET_GRUB2_I386_EFI=y +BR2_TARGET_GRUB2_BUILTIN_MODULES_PC="boot linux ext2 fat squash4 part_msdos part_gpt normal progress biosdisk all_video video_cirrus video_bochs net tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard" +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard iso9660" +BR2_TARGET_GRUB2_INSTALL_TOOLS=y +BR2_TARGET_SYSLINUX=y +BR2_PACKAGE_HOST_E2FSPROGS=y +BR2_PACKAGE_HOST_GENIMAGE=y +BR2_PACKAGE_HOST_PYTHON3=y +BR2_PACKAGE_HOST_PYTHON3_BZIP2=y +BR2_PACKAGE_HOST_PYTHON3_SSL=y diff --git a/configs/shredos_img_i586_defconfig b/configs/shredos_img_i586_defconfig new file mode 100644 index 0000000000..2d2852cd33 --- /dev/null +++ b/configs/shredos_img_i586_defconfig @@ -0,0 +1,177 @@ +BR2_PACKAGE_GLIBC_UTILS=y +BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_TOOLCHAIN_GLIBC_GCONV_LIBS_COPY=y +BR2_CPAN_MIRROR="http://cpan.metacpan.org" +BR2_TARGET_GENERIC_HOSTNAME="shredos" +BR2_TARGET_GENERIC_ISSUE="Welcome to ShredOS https://github.com/PartialVolume/shredos.x86_64" +BR2_INIT_SYSV=y +BR2_ROOTFS_MERGED_USR=y +BR2_SYSTEM_BIN_SH_BASH=y +BR2_SYSTEM_DEFAULT_PATH="/bin:/sbin:/usr/bin:/usr/sbin" +# BR2_ENABLE_LOCALE_PURGE is not set +BR2_GENERATE_LOCALE="en_US.UTF-8" +BR2_SYSTEM_ENABLE_NLS=y +BR2_TARGET_TZ_INFO=y +BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_img_file.sh" +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/shredos/kernel-6.6.22-defconfig.config" +BR2_PACKAGE_LINUX_TOOLS_CPUPOWER=y +BR2_PACKAGE_LINUX_TOOLS_PERF=y +BR2_PACKAGE_LINUX_TOOLS_SELFTESTS=y +# BR2_PACKAGE_BUSYBOX_SELINUX is not set +BR2_PACKAGE_FFMPEG=y +BR2_PACKAGE_FFMPEG_GPL=y +BR2_PACKAGE_FFMPEG_NONFREE=y +BR2_PACKAGE_FFMPEG_SWSCALE=y +BR2_PACKAGE_BZIP2=y +BR2_PACKAGE_GZIP=y +BR2_PACKAGE_UNZIP=y +BR2_PACKAGE_XZ=y +BR2_PACKAGE_ZIP=y +BR2_PACKAGE_HEXEDIT=y +BR2_PACKAGE_BINUTILS=y +BR2_PACKAGE_GETTEXT=y +BR2_PACKAGE_GREP=y +BR2_PACKAGE_LIBTOOL=y +BR2_PACKAGE_SED=y +BR2_PACKAGE_DOSFSTOOLS=y +BR2_PACKAGE_DOSFSTOOLS_FATLABEL=y +BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y +BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT=y +BR2_PACKAGE_E2FSPROGS=y +BR2_PACKAGE_EXFATPROGS=y +BR2_PACKAGE_ASCII_INVADERS=y +BR2_PACKAGE_DIRECTFB=y +BR2_PACKAGE_DIRECTFB_ATI128=y +BR2_PACKAGE_DIRECTFB_MATROX=y +BR2_PACKAGE_DIRECTFB_I830=y +BR2_PACKAGE_FBDUMP=y +BR2_PACKAGE_FBGRAB=y +BR2_PACKAGE_FBSET=y +BR2_PACKAGE_FBTERM=y +BR2_PACKAGE_FBV=y +BR2_PACKAGE_MESA3D=y +BR2_PACKAGE_MESA3D_LLVM=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_CROCUS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_ETNAVIV=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_I915=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_IRIS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_LIMA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R300=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SVGA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_TEGRA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VIRGL=y +BR2_PACKAGE_MESA3D_VULKAN_DRIVER_INTEL=y +BR2_PACKAGE_MESA3D_OSMESA_GALLIUM=y +BR2_PACKAGE_MESA3D_OPENGL_ES=y +BR2_PACKAGE_LINUX_FIRMWARE=y +BR2_PACKAGE_LINUX_FIRMWARE_AMDGPU=y +BR2_PACKAGE_LINUX_FIRMWARE_I915=y +BR2_PACKAGE_LINUX_FIRMWARE_RADEON=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_VENUS=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_ADRENO=y +BR2_PACKAGE_LINUX_FIRMWARE_MFC_V8=y +BR2_PACKAGE_LINUX_FIRMWARE_QUALCOMM_6174=y +BR2_PACKAGE_LINUX_FIRMWARE_BROADCOM_TIGON3=y +BR2_PACKAGE_LINUX_FIRMWARE_BNX2X=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T4=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T5=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_E100=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_ICE=y +BR2_PACKAGE_LINUX_FIRMWARE_MICROCHIP_VSC85XX_PHY=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_4X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_815X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_8169=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_2XXX=y +BR2_PACKAGE_EDID_DECODE=y +BR2_PACKAGE_HDPARM=y +BR2_PACKAGE_KBD=y +BR2_PACKAGE_LM_SENSORS=y +BR2_PACKAGE_LSHW=y +BR2_PACKAGE_LSSCSI=y +BR2_PACKAGE_MINICOM=y +BR2_PACKAGE_NVME=y +BR2_PACKAGE_READ_EDID=y +BR2_PACKAGE_SG3_UTILS=y +BR2_PACKAGE_SG3_UTILS_PROGS=y +BR2_PACKAGE_SMARTMONTOOLS=y +BR2_PACKAGE_SYSSTAT=y +BR2_PACKAGE_TRIGGERHAPPY=y +BR2_PACKAGE_PERL=y +BR2_PACKAGE_PYTHON_PYASN1_MODULES=y +BR2_PACKAGE_PYTHON_PYBIND=y +BR2_PACKAGE_PYTHON_PYNDIFF=y +BR2_PACKAGE_PYTHON_SCAPY=y +BR2_PACKAGE_LZ4=y +BR2_PACKAGE_LIBGCRYPT=y +BR2_PACKAGE_STB=y +BR2_PACKAGE_LIBHID=y +BR2_PACKAGE_JSON_GLIB=y +BR2_PACKAGE_LIBCURL=y +BR2_PACKAGE_LIBUPNP=y +BR2_PACKAGE_KERNEL_CMDLINE_EXTRACTOR=y +BR2_PACKAGE_LIBCAP=y +BR2_PACKAGE_LIBSECCOMP=y +BR2_PACKAGE_NWIPE=y +BR2_PACKAGE_LIBFRIBIDI=y +BR2_PACKAGE_NCURSES_WCHAR=y +BR2_PACKAGE_UTF8PROC=y +BR2_PACKAGE_HEIRLOOM_MAILX=y +BR2_PACKAGE_COLLECTD=y +BR2_PACKAGE_COLLECTD_NTPD=y +BR2_PACKAGE_XUTIL_UTIL_MACROS=y +BR2_PACKAGE_IPTABLES=y +BR2_PACKAGE_LFTP=y +BR2_PACKAGE_LFTP_PROTO_SFTP=y +BR2_PACKAGE_NMAP=y +BR2_PACKAGE_NTP=y +BR2_PACKAGE_NTP_NTPDATE=y +BR2_PACKAGE_NTP_NTPTIME=y +BR2_PACKAGE_OPENSSH=y +# BR2_PACKAGE_OPENSSH_SERVER is not set +BR2_PACKAGE_RPCBIND=y +BR2_PACKAGE_SNMPCLITOOLS=y +BR2_PACKAGE_TFTPD=y +BR2_PACKAGE_TRACEROUTE=y +BR2_PACKAGE_WIREGUARD_TOOLS=y +BR2_PACKAGE_RESTORECOND=y +BR2_PACKAGE_SELINUX_PYTHON=y +BR2_PACKAGE_SELINUX_PYTHON_AUDIT2ALLOW=y +BR2_PACKAGE_PARALLEL=y +BR2_PACKAGE_TMUX=y +BR2_PACKAGE_OPENSEACHEST=y +BR2_PACKAGE_PROCPS_NG=y +BR2_PACKAGE_RUNC=y +BR2_PACKAGE_UTIL_LINUX_BINARIES=y +BR2_PACKAGE_UTIL_LINUX_AGETTY=y +BR2_PACKAGE_UTIL_LINUX_FSCK=y +BR2_PACKAGE_UTIL_LINUX_LAST=y +BR2_PACKAGE_UTIL_LINUX_LOGIN=y +BR2_PACKAGE_UTIL_LINUX_MOUNT=y +BR2_PACKAGE_UTIL_LINUX_MOUNTPOINT=y +BR2_PACKAGE_UTIL_LINUX_PIVOT_ROOT=y +BR2_PACKAGE_UTIL_LINUX_RFKILL=y +BR2_PACKAGE_UTIL_LINUX_RUNUSER=y +BR2_PACKAGE_UTIL_LINUX_SETTERM=y +BR2_PACKAGE_UTIL_LINUX_SU=y +BR2_PACKAGE_UTIL_LINUX_SULOGIN=y +BR2_TARGET_ROOTFS_CPIO_LZMA=y +BR2_TARGET_ROOTFS_INITRAMFS=y +# BR2_TARGET_ROOTFS_ISO9660_INITRD is not set +# BR2_TARGET_ROOTFS_TAR is not set +BR2_TARGET_GRUB2=y +BR2_TARGET_GRUB2_I386_PC=y +BR2_TARGET_GRUB2_I386_EFI=y +BR2_TARGET_GRUB2_BUILTIN_MODULES_PC="boot linux ext2 fat squash4 part_msdos part_gpt normal progress biosdisk all_video video_cirrus video_bochs net tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard" +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard" +BR2_TARGET_GRUB2_INSTALL_TOOLS=y +BR2_PACKAGE_HOST_E2FSPROGS=y +BR2_PACKAGE_HOST_GENIMAGE=y +BR2_PACKAGE_HOST_PYTHON3=y +BR2_PACKAGE_HOST_PYTHON3_BZIP2=y +BR2_PACKAGE_HOST_PYTHON3_SSL=y diff --git a/configs/shredos_iso_i586_defconfig b/configs/shredos_iso_i586_defconfig new file mode 100644 index 0000000000..dc9b1d1ff4 --- /dev/null +++ b/configs/shredos_iso_i586_defconfig @@ -0,0 +1,179 @@ +BR2_PACKAGE_GLIBC_UTILS=y +BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_TOOLCHAIN_GLIBC_GCONV_LIBS_COPY=y +BR2_CPAN_MIRROR="http://cpan.metacpan.org" +BR2_TARGET_GENERIC_HOSTNAME="shredos" +BR2_TARGET_GENERIC_ISSUE="Welcome to ShredOS https://github.com/PartialVolume/shredos.x86_64" +BR2_INIT_SYSV=y +BR2_ROOTFS_MERGED_USR=y +BR2_SYSTEM_BIN_SH_BASH=y +BR2_SYSTEM_DEFAULT_PATH="/bin:/sbin:/usr/bin:/usr/sbin" +# BR2_ENABLE_LOCALE_PURGE is not set +BR2_GENERATE_LOCALE="en_US.UTF-8" +BR2_SYSTEM_ENABLE_NLS=y +BR2_TARGET_TZ_INFO=y +BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh" +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/shredos/kernel-6.6.22-defconfig.config" +BR2_PACKAGE_LINUX_TOOLS_CPUPOWER=y +BR2_PACKAGE_LINUX_TOOLS_PERF=y +BR2_PACKAGE_LINUX_TOOLS_SELFTESTS=y +# BR2_PACKAGE_BUSYBOX_SELINUX is not set +BR2_PACKAGE_FFMPEG=y +BR2_PACKAGE_FFMPEG_GPL=y +BR2_PACKAGE_FFMPEG_NONFREE=y +BR2_PACKAGE_FFMPEG_SWSCALE=y +BR2_PACKAGE_BZIP2=y +BR2_PACKAGE_GZIP=y +BR2_PACKAGE_UNZIP=y +BR2_PACKAGE_XZ=y +BR2_PACKAGE_ZIP=y +BR2_PACKAGE_HEXEDIT=y +BR2_PACKAGE_BINUTILS=y +BR2_PACKAGE_GETTEXT=y +BR2_PACKAGE_GREP=y +BR2_PACKAGE_LIBTOOL=y +BR2_PACKAGE_SED=y +BR2_PACKAGE_DOSFSTOOLS=y +BR2_PACKAGE_DOSFSTOOLS_FATLABEL=y +BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y +BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT=y +BR2_PACKAGE_E2FSPROGS=y +BR2_PACKAGE_EXFATPROGS=y +BR2_PACKAGE_ASCII_INVADERS=y +BR2_PACKAGE_DIRECTFB=y +BR2_PACKAGE_DIRECTFB_ATI128=y +BR2_PACKAGE_DIRECTFB_MATROX=y +BR2_PACKAGE_DIRECTFB_I830=y +BR2_PACKAGE_FBDUMP=y +BR2_PACKAGE_FBGRAB=y +BR2_PACKAGE_FBSET=y +BR2_PACKAGE_FBTERM=y +BR2_PACKAGE_FBV=y +BR2_PACKAGE_MESA3D=y +BR2_PACKAGE_MESA3D_LLVM=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_CROCUS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_ETNAVIV=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_I915=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_IRIS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_LIMA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R300=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SVGA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_TEGRA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VIRGL=y +BR2_PACKAGE_MESA3D_VULKAN_DRIVER_INTEL=y +BR2_PACKAGE_MESA3D_OSMESA_GALLIUM=y +BR2_PACKAGE_MESA3D_OPENGL_ES=y +BR2_PACKAGE_LINUX_FIRMWARE=y +BR2_PACKAGE_LINUX_FIRMWARE_AMDGPU=y +BR2_PACKAGE_LINUX_FIRMWARE_I915=y +BR2_PACKAGE_LINUX_FIRMWARE_RADEON=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_VENUS=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_ADRENO=y +BR2_PACKAGE_LINUX_FIRMWARE_MFC_V8=y +BR2_PACKAGE_LINUX_FIRMWARE_QUALCOMM_6174=y +BR2_PACKAGE_LINUX_FIRMWARE_BROADCOM_TIGON3=y +BR2_PACKAGE_LINUX_FIRMWARE_BNX2X=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T4=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T5=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_E100=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_ICE=y +BR2_PACKAGE_LINUX_FIRMWARE_MICROCHIP_VSC85XX_PHY=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_4X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_815X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_8169=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_2XXX=y +BR2_PACKAGE_EDID_DECODE=y +BR2_PACKAGE_HDPARM=y +BR2_PACKAGE_KBD=y +BR2_PACKAGE_LM_SENSORS=y +BR2_PACKAGE_LSHW=y +BR2_PACKAGE_LSSCSI=y +BR2_PACKAGE_MINICOM=y +BR2_PACKAGE_NVME=y +BR2_PACKAGE_READ_EDID=y +BR2_PACKAGE_SG3_UTILS=y +BR2_PACKAGE_SG3_UTILS_PROGS=y +BR2_PACKAGE_SMARTMONTOOLS=y +BR2_PACKAGE_SYSSTAT=y +BR2_PACKAGE_TRIGGERHAPPY=y +BR2_PACKAGE_PERL=y +BR2_PACKAGE_PYTHON_PYASN1_MODULES=y +BR2_PACKAGE_PYTHON_PYBIND=y +BR2_PACKAGE_PYTHON_PYNDIFF=y +BR2_PACKAGE_PYTHON_SCAPY=y +BR2_PACKAGE_LZ4=y +BR2_PACKAGE_LIBGCRYPT=y +BR2_PACKAGE_STB=y +BR2_PACKAGE_LIBHID=y +BR2_PACKAGE_JSON_GLIB=y +BR2_PACKAGE_LIBCURL=y +BR2_PACKAGE_LIBUPNP=y +BR2_PACKAGE_KERNEL_CMDLINE_EXTRACTOR=y +BR2_PACKAGE_LIBCAP=y +BR2_PACKAGE_LIBSECCOMP=y +BR2_PACKAGE_NWIPE=y +BR2_PACKAGE_LIBFRIBIDI=y +BR2_PACKAGE_NCURSES_WCHAR=y +BR2_PACKAGE_UTF8PROC=y +BR2_PACKAGE_HEIRLOOM_MAILX=y +BR2_PACKAGE_COLLECTD=y +BR2_PACKAGE_COLLECTD_NTPD=y +BR2_PACKAGE_XUTIL_UTIL_MACROS=y +BR2_PACKAGE_IPTABLES=y +BR2_PACKAGE_LFTP=y +BR2_PACKAGE_LFTP_PROTO_SFTP=y +BR2_PACKAGE_NMAP=y +BR2_PACKAGE_NTP=y +BR2_PACKAGE_NTP_NTPDATE=y +BR2_PACKAGE_NTP_NTPTIME=y +BR2_PACKAGE_OPENSSH=y +# BR2_PACKAGE_OPENSSH_SERVER is not set +BR2_PACKAGE_RPCBIND=y +BR2_PACKAGE_SNMPCLITOOLS=y +BR2_PACKAGE_TFTPD=y +BR2_PACKAGE_TRACEROUTE=y +BR2_PACKAGE_WIREGUARD_TOOLS=y +BR2_PACKAGE_RESTORECOND=y +BR2_PACKAGE_SELINUX_PYTHON=y +BR2_PACKAGE_SELINUX_PYTHON_AUDIT2ALLOW=y +BR2_PACKAGE_PARALLEL=y +BR2_PACKAGE_TMUX=y +BR2_PACKAGE_OPENSEACHEST=y +BR2_PACKAGE_PROCPS_NG=y +BR2_PACKAGE_RUNC=y +BR2_PACKAGE_UTIL_LINUX_BINARIES=y +BR2_PACKAGE_UTIL_LINUX_AGETTY=y +BR2_PACKAGE_UTIL_LINUX_FSCK=y +BR2_PACKAGE_UTIL_LINUX_LAST=y +BR2_PACKAGE_UTIL_LINUX_LOGIN=y +BR2_PACKAGE_UTIL_LINUX_MOUNT=y +BR2_PACKAGE_UTIL_LINUX_MOUNTPOINT=y +BR2_PACKAGE_UTIL_LINUX_PIVOT_ROOT=y +BR2_PACKAGE_UTIL_LINUX_RFKILL=y +BR2_PACKAGE_UTIL_LINUX_RUNUSER=y +BR2_PACKAGE_UTIL_LINUX_SETTERM=y +BR2_PACKAGE_UTIL_LINUX_SU=y +BR2_PACKAGE_UTIL_LINUX_SULOGIN=y +BR2_TARGET_ROOTFS_CPIO_LZMA=y +BR2_TARGET_ROOTFS_INITRAMFS=y +BR2_TARGET_ROOTFS_ISO9660=y +BR2_TARGET_ROOTFS_ISO9660_BOTH=y +# BR2_TARGET_ROOTFS_ISO9660_INITRD is not set +BR2_TARGET_ROOTFS_ISO9660_HYBRID=y +# BR2_TARGET_ROOTFS_TAR is not set +BR2_TARGET_GRUB2=y +BR2_TARGET_GRUB2_I386_EFI=y +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard iso9660" +BR2_TARGET_GRUB2_INSTALL_TOOLS=y +BR2_TARGET_SYSLINUX=y +BR2_PACKAGE_HOST_E2FSPROGS=y +BR2_PACKAGE_HOST_GENIMAGE=y +BR2_PACKAGE_HOST_PYTHON3=y +BR2_PACKAGE_HOST_PYTHON3_BZIP2=y +BR2_PACKAGE_HOST_PYTHON3_SSL=y From e89f457accd30b3fa894e45e0bb18bf048e9d2b6 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Tue, 18 Nov 2025 08:24:13 +0100 Subject: [PATCH 06/35] chore: update readme for new changes Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- README.md | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1b7408fc46..52b3275be1 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ ## For PCs, Servers and Macs with Intel and AMD 64 & 32 bit processors -#### As well as a 64bit versions, also included are 32bit .img & .iso images of ShredOS that will run on both 32bit and 64bit processors, see [Release Assets](https://github.com/PartialVolume/shredos.x86_64/releases) and the table of download links below. For those that wish to build their own ShredOS from source, rather than just burn the .img/.iso images, instructions for modififing the x86_64 build to generate 32bit code as well as .iso images will be included below in the notes in due course. Please note the additional information provided to run ShredOS on Apple systems. +#### As well as a 64bit versions, also included are 32bit .img & .iso images of ShredOS that will run on both 32bit and 64bit processors, see [Release Assets](https://github.com/PartialVolume/shredos.x86_64/releases) and the table of download links below. For those that wish to build their own ShredOS from source, rather than just burn the .img/.iso images, follow the build instructions and make use of the supplied build configurations. Please note the additional information provided to run ShredOS on Apple systems. #### For those that just want to get on with using ShredOS, you can download the pre-built .img or .iso images and burn them straight to USB flash drive or CD/DVD. Boot from the USB flash drive or CD/DVD and nwipe will appear ready for you to select your preferred wipe options. [![GitHub all releases](https://img.shields.io/github/downloads/PartialVolume/shredos.x86_64/total?label=Total%20downloads%20x86_64%20all%20releases,%2064%20and%2032bit%20code,%20.iso%20and%20.img%20&style=plastic)](https://github.com/PartialVolume/shredos.x86_64/releases) @@ -41,7 +41,9 @@ NOTE! There may be pre-release versions that are newer than the latest versions ### For all releases including latest and more recent pre-releases [releases](https://github.com/PartialVolume/shredos.x86_64/releases) -Note: The .img files for burning to USB flash drives support both bios/UEFI booting. The .iso image currently supports legacy bios booting only and not UEFI, however, a bios/UEFI version of the .iso is in development and will be released shortly. +Note for versions **after** _v2024.11_27_x86-64_0.38_: The .img files for burning to USB flash drives support both BIOS/UEFI booting, as well as saving of generated PDF reports to the USB flash drive. The .iso image supports both BIOS/UEFI booting, as well as burning to USB flash drives and CD/DVD-ROM, but not saving of generated PDF reports to USB flash drive (if being written to one, due to filesystem constraints). + +Note for versions **until** _v2024.11_27_x86-64_0.38_: The .img files for burning to USB flash drives support both BIOS/UEFI booting. The .iso image supports legacy BIOS booting only and not UEFI, however, a BIOS/UEFI version of the .iso is available in newer ShredOS versions. You can also consider [VENTOY (Open Source tool to create bootable USB drive for ISO/WIM/IMG/VHD(x)/EFI files)](https://github.com/ventoy/Ventoy) as a workaround to avoid bios/UEFI issues. #### Demo video below: ShredOS automatically displays Nwipe's interactive GUI at boot. @@ -802,6 +804,18 @@ $ ls output/images/shredos*.img $ cd output/images $ dd if=shredos-20200412.img of=/dev/sdx (20200412 will be the day you compiled, sdx is the USB flash drive) ``` + +The following configurations are available to build different targets: + +- `make shredos_defconfig` - build USB image and hybrid ISO (64-bit) +- `make shredos_i586_defconfig` - build USB image and hybrid ISO (32-bit) +- `make shredos_img_defconfig` - build USB image only (64-bit) +- `make shredos_img_i586_defconfig` - build USB image only (32-bit) +- `make shredos_iso_defconfig` - build hybrid ISO only (64-bit) +- `make shredos_iso_i586_defconfig` - build hybrid ISO only (32-bit) + +Do note that loading a configuration should typically be the last step before `make`. + ### Issues that you may get when building ShredOS - **Error: "Internal Size Too Big"** If you are compiling the vanilla version of ShredOS and have made no alterations or additions but it fails to build the .img with the error "Internal error: size too big" then you may have a version of mtools that has a version of mcopy which has a bug whenever the -b option is used. This bug is known to exist in mcopy version 4.0.32 and maybe others but is fixed in v4.0.42. The solution is to upgrade your copy of mtools to a later version. However, if you have altered ShredOS by adding more packages you may need to update the size of the fat32 partition. You can do this by increasing the 'size' in ../board/shredos/genimage.cfg. Depending on how much extra software you have added increase the size by 10MB or more. Currently as of March 2023 the current size is `size = 130000000`, this is in bytes, so adding 10MB will mean you need to edit this value so that it reads `size = 140000000`. After the edit, just run `make` which will result in a quicker build. You don't need to run `make clean` first as that would result in a full rebuild which is not neccessary when all you are doing is increasing the final image size. If your repository does not supply a later version of mtools, then you can obtain mtools packages for various distros from [here](https://www.gnu.org/software/mtools/#downloads) @@ -833,8 +847,23 @@ make busybox-update-config # save the changes ``` ### Important ShredOS files and folders when building ShredOS from source -#### ../board/shredos/doimg.sh -doimg.sh is a bash script, the main purpose of which is to generate the .img file located in output/images/. However it is also used to copy the pre-compiled .efi file and other files such as the shredos.ico, autorun.inf for Windows, README.txt. The contents of board/shredos/version.txt is also used to rename the .img file with version info and the current date and time. +#### ../board/shredos/make_img_file.sh +make_img_file.sh is a bash script, the main purpose of which is to generate the .img file located in output/images/. However it is also used to copy the compiled .efi file and other files such as the shredos.ico, autorun.inf for Windows, README.txt. The contents of board/shredos/version.txt is also used to rename the .img file with version info and the current date and time. + +#### ../board/shredos/make_iso_file.sh +make_iso_file.sh is a bash script, the main purpose of which is to generate the .iso file located in output/images/. The contents of board/shredos/version.txt is used to rename the .iso file with version info and the current date and time. + +#### ../board/shredos/grub.cfg +The USB image's GRUB configuration, which both the BIOS and UEFI bootloader will use. + +#### ../fs/iso9660/isolinux.cfg +The ISO image's ISOLINUX configuration, which the BIOS bootloader will use. + +#### ../fs/iso9660/grub.cfg +The ISO image's GRUB configuration, which the UEFI bootloader will use. + +#### ../fs/iso9660/efigrub.cfg +The ISO image's EFI-embedded GRUB configuration, which the UEFI bootloader will use to search the ISO9660 filesystem. #### ../board/shredos/fsoverlay/etc/shredos/version.txt This file contains the version information as seen in the title on nwipe's title bar, i.e. '2021.08.2_22_x86-64_0.32.023'. This version ingformation is also used when naming the .img file in ../output/images/ ../board/shredos/fsoverlay/etc/shredos/version.txt is manually updated for each new release of ShredOS. From 02d0c2ef60f16a96597b5276433663ab92836a64 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Tue, 18 Nov 2025 10:34:38 +0100 Subject: [PATCH 07/35] fix(iso9660): improve xorriso argument order Improved the iso9660 argument order to better reflect modern best practices, inspired by the Debian distribution ISOs. Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- fs/iso9660/iso9660.mk | 52 ++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/fs/iso9660/iso9660.mk b/fs/iso9660/iso9660.mk index 4a886b0273..fa9b1e8ade 100644 --- a/fs/iso9660/iso9660.mk +++ b/fs/iso9660/iso9660.mk @@ -372,24 +372,48 @@ ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_INSTALL_BOOTLOADERS ################################################################################ # ISO9660 Generation Options +# +# Note: Argument order is crucial here, this command line was inspired by +# modern Debian distributions (see .disk/mkisofs inside one of their ISOs) ################################################################################ -ROOTFS_ISO9660_OPTS += -r -J -joliet-long -cache-inodes -V 'ISO9660' +ROOTFS_ISO9660_OPTS += -r -V 'ISO9660' -J -joliet-long -cache-inodes +ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BOTH)$(BR2_TARGET_ROOTFS_ISO9660_HYBRID),yy) +# Hybrid Image Support (Modern Variant, Debian-style) +ROOTFS_ISO9660_OPTS_BIOS = \ + -isohybrid-mbr $(HOST_DIR)/share/syslinux/isohdpfx.bin \ + -b $(ROOTFS_ISO9660_BOOT_IMAGE) \ + -c isolinux/boot.cat \ + -boot-load-size 4 \ + -boot-info-table \ + -no-emul-boot +else ifeq ($(BR2_TARGET_ROOTFS_ISO9660_ISOLINUX),y) ROOTFS_ISO9660_OPTS_BIOS = \ -b $(ROOTFS_ISO9660_BOOT_IMAGE) \ - -no-emul-boot \ + -c isolinux/boot.cat \ -boot-load-size 4 \ - -boot-info-table - -ROOTFS_ISO9660_OPTS_EFI = \ - --efi-boot $(ROOTFS_ISO9660_EFI_PARTITION) \ + -boot-info-table \ -no-emul-boot +else +ROOTFS_ISO9660_OPTS_BIOS = \ + -b $(ROOTFS_ISO9660_BOOT_IMAGE) \ + -boot-load-size 4 \ + -boot-info-table \ + -no-emul-boot +endif -ifeq ($(BR2_TARGET_ROOTFS_ISO9660_ISOLINUX),y) -ROOTFS_ISO9660_OPTS += -c isolinux/boot.cat -else ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BOTH),y) -ROOTFS_ISO9660_OPTS += -c isolinux/boot.cat +ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BOTH)$(BR2_TARGET_ROOTFS_ISO9660_HYBRID),yy) +# Hybrid Image Support (Modern Variant, Debian-style) +ROOTFS_ISO9660_OPTS_EFI = \ + -e $(ROOTFS_ISO9660_EFI_PARTITION) \ + -no-emul-boot \ + -isohybrid-gpt-basdat \ + -isohybrid-apm-hfsplus +else +ROOTFS_ISO9660_OPTS_EFI = \ + -e $(ROOTFS_ISO9660_EFI_PARTITION) \ + -no-emul-boot endif # Determine which boot options to use @@ -411,15 +435,11 @@ ROOTFS_ISO9660_OPTS += $(ROOTFS_ISO9660_OPTS_EFI) endif ################################################################################ -# Hybrid Image Support (USB bootable) +# Hybrid Image Support (Legacy Variant, No UEFI) ################################################################################ +ifneq ($(BR2_TARGET_ROOTFS_ISO9660_BOTH),y) ifeq ($(BR2_TARGET_ROOTFS_ISO9660_HYBRID),y) -ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BOTH),y) -ROOTFS_ISO9660_OPTS += \ - -isohybrid-mbr $(HOST_DIR)/share/syslinux/isohdpfx.bin \ - -isohybrid-gpt-basdat -isohybrid-apm-hfsplus -else define ROOTFS_ISO9660_GEN_HYBRID $(HOST_DIR)/bin/isohybrid -t 0x96 $@ endef From fe590092afe3cc8aaf824f40f47e606edf19600c Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Tue, 18 Nov 2025 11:18:27 +0100 Subject: [PATCH 08/35] fix(iso9660): default path adapted for clarity Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- fs/iso9660/Config.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/iso9660/Config.in b/fs/iso9660/Config.in index d32d86f42d..8bd5ba292f 100644 --- a/fs/iso9660/Config.in +++ b/fs/iso9660/Config.in @@ -103,7 +103,7 @@ config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE string "Grub2 identification file (EFI)" depends on (BR2_TARGET_ROOTFS_ISO9660_GRUB2 || BR2_TARGET_ROOTFS_ISO9660_BOTH) \ && BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER - default "buildroot" + default "/buildroot" help Use this option to provide a custom name for the identification file that is added to the ISO9660 filesystem, so the EFI bootloader From 82ead30f728c2eac1f0ae6e878185189ff9a5225 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Tue, 18 Nov 2025 11:56:03 +0100 Subject: [PATCH 09/35] fix(configs): add missing grub modules We now require configfile and search modules to locate the ISO9660 filesystem, add them for our targets. Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- configs/shredos_defconfig | 4 ++-- configs/shredos_i586_defconfig | 4 ++-- configs/shredos_img_defconfig | 4 ++-- configs/shredos_img_i586_defconfig | 4 ++-- configs/shredos_iso_defconfig | 2 +- configs/shredos_iso_i586_defconfig | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/configs/shredos_defconfig b/configs/shredos_defconfig index 0e10f649ec..4a8f868514 100644 --- a/configs/shredos_defconfig +++ b/configs/shredos_defconfig @@ -173,8 +173,8 @@ BR2_TARGET_ROOTFS_ISO9660_HYBRID=y BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_I386_PC=y BR2_TARGET_GRUB2_X86_64_EFI=y -BR2_TARGET_GRUB2_BUILTIN_MODULES_PC="boot linux ext2 fat squash4 part_msdos part_gpt normal progress biosdisk all_video video_cirrus video_bochs net tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard" -BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard iso9660" +BR2_TARGET_GRUB2_BUILTIN_MODULES_PC="boot linux ext2 fat squash4 part_msdos part_gpt normal progress biosdisk all_video video_cirrus video_bochs net tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile" +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile iso9660" BR2_TARGET_GRUB2_INSTALL_TOOLS=y BR2_TARGET_SYSLINUX=y BR2_PACKAGE_HOST_E2FSPROGS=y diff --git a/configs/shredos_i586_defconfig b/configs/shredos_i586_defconfig index d9fc0e8081..927f919e28 100644 --- a/configs/shredos_i586_defconfig +++ b/configs/shredos_i586_defconfig @@ -170,8 +170,8 @@ BR2_TARGET_ROOTFS_ISO9660_HYBRID=y BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_I386_PC=y BR2_TARGET_GRUB2_I386_EFI=y -BR2_TARGET_GRUB2_BUILTIN_MODULES_PC="boot linux ext2 fat squash4 part_msdos part_gpt normal progress biosdisk all_video video_cirrus video_bochs net tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard" -BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard iso9660" +BR2_TARGET_GRUB2_BUILTIN_MODULES_PC="boot linux ext2 fat squash4 part_msdos part_gpt normal progress biosdisk all_video video_cirrus video_bochs net tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile" +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile iso9660" BR2_TARGET_GRUB2_INSTALL_TOOLS=y BR2_TARGET_SYSLINUX=y BR2_PACKAGE_HOST_E2FSPROGS=y diff --git a/configs/shredos_img_defconfig b/configs/shredos_img_defconfig index 1dcccbd7d9..11bbe26be7 100644 --- a/configs/shredos_img_defconfig +++ b/configs/shredos_img_defconfig @@ -170,8 +170,8 @@ BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_I386_PC=y BR2_TARGET_GRUB2_X86_64_EFI=y -BR2_TARGET_GRUB2_BUILTIN_MODULES_PC="boot linux ext2 fat squash4 part_msdos part_gpt normal progress biosdisk all_video video_cirrus video_bochs net tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard" -BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard" +BR2_TARGET_GRUB2_BUILTIN_MODULES_PC="boot linux ext2 fat squash4 part_msdos part_gpt normal progress biosdisk all_video video_cirrus video_bochs net tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile" +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile" BR2_TARGET_GRUB2_INSTALL_TOOLS=y BR2_PACKAGE_HOST_E2FSPROGS=y BR2_PACKAGE_HOST_GENIMAGE=y diff --git a/configs/shredos_img_i586_defconfig b/configs/shredos_img_i586_defconfig index 2d2852cd33..c418514d36 100644 --- a/configs/shredos_img_i586_defconfig +++ b/configs/shredos_img_i586_defconfig @@ -167,8 +167,8 @@ BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_I386_PC=y BR2_TARGET_GRUB2_I386_EFI=y -BR2_TARGET_GRUB2_BUILTIN_MODULES_PC="boot linux ext2 fat squash4 part_msdos part_gpt normal progress biosdisk all_video video_cirrus video_bochs net tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard" -BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard" +BR2_TARGET_GRUB2_BUILTIN_MODULES_PC="boot linux ext2 fat squash4 part_msdos part_gpt normal progress biosdisk all_video video_cirrus video_bochs net tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile" +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile" BR2_TARGET_GRUB2_INSTALL_TOOLS=y BR2_PACKAGE_HOST_E2FSPROGS=y BR2_PACKAGE_HOST_GENIMAGE=y diff --git a/configs/shredos_iso_defconfig b/configs/shredos_iso_defconfig index 2770f24239..8c16310216 100644 --- a/configs/shredos_iso_defconfig +++ b/configs/shredos_iso_defconfig @@ -172,7 +172,7 @@ BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_X86_64_EFI=y -BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard iso9660" +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile iso9660" BR2_TARGET_GRUB2_INSTALL_TOOLS=y BR2_TARGET_SYSLINUX=y BR2_PACKAGE_HOST_E2FSPROGS=y diff --git a/configs/shredos_iso_i586_defconfig b/configs/shredos_iso_i586_defconfig index dc9b1d1ff4..d1cd8a7802 100644 --- a/configs/shredos_iso_i586_defconfig +++ b/configs/shredos_iso_i586_defconfig @@ -169,7 +169,7 @@ BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_I386_EFI=y -BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard iso9660" +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile iso9660" BR2_TARGET_GRUB2_INSTALL_TOOLS=y BR2_TARGET_SYSLINUX=y BR2_PACKAGE_HOST_E2FSPROGS=y From 79d4185d691729eeecdf71cc272435758cf28ac7 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Tue, 18 Nov 2025 12:15:13 +0100 Subject: [PATCH 10/35] fix(iso9660): copy actual efi config to efi structure To keep things consistent, copy the EFI configuration also to the EFI structure on the ISO9660 filesystem. Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- fs/iso9660/Config.in | 37 +++++++++++++++++-------------------- fs/iso9660/iso9660.mk | 24 ++++++++---------------- 2 files changed, 25 insertions(+), 36 deletions(-) diff --git a/fs/iso9660/Config.in b/fs/iso9660/Config.in index 8bd5ba292f..2cf950850d 100644 --- a/fs/iso9660/Config.in +++ b/fs/iso9660/Config.in @@ -99,6 +99,23 @@ config BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU will automatically be replaced by the path to the kernel and initrd images respectively (or removed, if not applicable). +config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU + string "Grub2 configuration file (EFI)" + depends on (BR2_TARGET_ROOTFS_ISO9660_GRUB2 || BR2_TARGET_ROOTFS_ISO9660_BOTH) \ + && BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER + default "fs/iso9660/efigrub.cfg" + help + Use this option to provide a custom GRUB2 configuration + file (grub.cfg), embedded both in the EFI partition and the + ISO9660 filesystem EFI-structure (for an EFI bootloader to find). + + It will usually contain a "search" and "source" directive to find + the ISO9660 filesystem containing a common (BIOS) GRUB2 configuration. + Alternatively, 'set root=(cd0)' and other such quirks are possible here. + + Note that any string __EFI_ID_FILE__ will automatically be + replaced with the BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE. + config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE string "Grub2 identification file (EFI)" depends on (BR2_TARGET_ROOTFS_ISO9660_GRUB2 || BR2_TARGET_ROOTFS_ISO9660_BOTH) \ @@ -118,26 +135,6 @@ config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE Use this option to increase the size of the EFI partition. Embedding more GRUB2 modules may require a larger EFI partition size. -config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU - string "Grub2 embedded configuration (EFI)" - depends on (BR2_TARGET_ROOTFS_ISO9660_GRUB2 || BR2_TARGET_ROOTFS_ISO9660_BOTH) \ - && BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER - default "fs/iso9660/efigrub.cfg" - help - Use this option to provide a custom GRUB2 configuration - file (grub.cfg) that is embedded in the EFI paritition. - - It will usually just contain a "search" directive to find the - ISO9660 filesystem containing the actual GRUB2 configuration file. - Alternatively, 'set root=(cd0)' could be directly set here also... - - Note that the string __EFI_ID_FILE__ will automatically be - replaced with the BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE. - - Do not mistake this for the regular GRUB2 configuration that is - eventually loaded by the EFI bootloader, this is just for systems - which need some extra help to locate the actual ISO9660 filesystem. - config BR2_TARGET_ROOTFS_ISO9660_INITRD bool "Use initrd" depends on !BR2_TARGET_ROOTFS_INITRAMFS diff --git a/fs/iso9660/iso9660.mk b/fs/iso9660/iso9660.mk index fa9b1e8ade..db31c50a8b 100644 --- a/fs/iso9660/iso9660.mk +++ b/fs/iso9660/iso9660.mk @@ -135,15 +135,13 @@ ROOTFS_ISO9660_EFI_PARTITION = boot/efi.img ROOTFS_ISO9660_EFI_PARTITION_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_EFI_PARTITION) ROOTFS_ISO9660_EFI_PARTITION_CONTENT = $(BINARIES_DIR)/efi-part ROOTFS_ISO9660_GRUB2_CONFIG_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/grub/grub.cfg -ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/grub/efigrub.cfg +ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/grub.cfg define ROOTFS_ISO9660_INSTALL_GRUB2_EFI - # Create identification file to better find ISO9660 filesystem + # Create file to better find ISO9660 filesystem $(INSTALL) -D -m 0644 /dev/null \ $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE) - # Copy grub.cfg to ISO9660 filesystem where GRUB will find it - $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_GRUB2_CONFIG_PATH) \ - $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/grub.cfg + # Copy EFI bootloader also to ISO9660 filesystem $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_EFI_PARTITION_CONTENT)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NAME) \ $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NAME) # Create EFI FAT partition @@ -158,11 +156,9 @@ define ROOTFS_ISO9660_INSTALL_GRUB2_EFI # Delete the EFI bootloader that is NOT for the platform we're building for $(HOST_DIR)/bin/mdel -i $(ROOTFS_ISO9660_EFI_PARTITION_PATH) \ ::$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NOTNAME) || true - # Copy efigrub.cfg to EFI partition (may be used to find ISO9660 filesystem) + # Copy EFI configuration to EFI partition $(HOST_DIR)/bin/mcopy -n -o -p -m -i $(ROOTFS_ISO9660_EFI_PARTITION_PATH) \ $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH) ::$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/grub.cfg - # Remove efigrub.cfg from ISO9660 filesystem, it was just there for SED-ing - rm -f $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH) $(ROOTFS_ISO9660_FIX_TIME) $(ROOTFS_ISO9660_EFI_PARTITION_PATH) endef @@ -223,7 +219,7 @@ ROOTFS_ISO9660_BOOT_IMAGE = isolinux/isolinux.bin # GRUB2 EFI configuration ROOTFS_ISO9660_GRUB2_CONFIG_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/grub/grub.cfg -ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/grub/efigrub.cfg +ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/grub.cfg ROOTFS_ISO9660_EFI_PARTITION = boot/efi.img ROOTFS_ISO9660_EFI_PARTITION_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_EFI_PARTITION) ROOTFS_ISO9660_EFI_PARTITION_CONTENT = $(BINARIES_DIR)/efi-part @@ -249,12 +245,10 @@ define ROOTFS_ISO9660_INSTALL_ISOLINUX_CONFIG endef define ROOTFS_ISO9660_INSTALL_GRUB2_EFI - # Create identification file to better find ISO9660 filesystem + # Create file to better find ISO9660 filesystem $(INSTALL) -D -m 0644 /dev/null \ $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE) - # Copy grub.cfg to ISO9660 filesystem where GRUB will find it - $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_GRUB2_CONFIG_PATH) \ - $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/grub.cfg + # Copy EFI bootloader also to ISO9660 filesystem $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_EFI_PARTITION_CONTENT)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NAME) \ $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NAME) # Create EFI FAT partition @@ -269,11 +263,9 @@ define ROOTFS_ISO9660_INSTALL_GRUB2_EFI # Delete the EFI bootloader that is NOT for the platform we're building for $(HOST_DIR)/bin/mdel -i $(ROOTFS_ISO9660_EFI_PARTITION_PATH) \ ::$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NOTNAME) || true - # Copy efigrub.cfg to EFI partition (may be used to find ISO9660 filesystem) + # Copy EFI configuration to EFI partition $(HOST_DIR)/bin/mcopy -n -o -p -m -i $(ROOTFS_ISO9660_EFI_PARTITION_PATH) \ $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH) ::$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/grub.cfg - # Remove efigrub.cfg from ISO9660 filesystem, it was just there for SED-ing - rm -f $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH) $(ROOTFS_ISO9660_FIX_TIME) $(ROOTFS_ISO9660_EFI_PARTITION_PATH) endef From 7959e04e1d31edd3f047e26e50d5f954ac70eb42 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Tue, 18 Nov 2025 12:44:29 +0100 Subject: [PATCH 11/35] chore: clarification in readme Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 52b3275be1..ae10ed29e1 100644 --- a/README.md +++ b/README.md @@ -863,7 +863,7 @@ The ISO image's ISOLINUX configuration, which the BIOS bootloader will use. The ISO image's GRUB configuration, which the UEFI bootloader will use. #### ../fs/iso9660/efigrub.cfg -The ISO image's EFI-embedded GRUB configuration, which the UEFI bootloader will use to search the ISO9660 filesystem. +The ISO image's GRUB configuration for UEFI, used to find the ISO9660 filesystem. #### ../board/shredos/fsoverlay/etc/shredos/version.txt This file contains the version information as seen in the title on nwipe's title bar, i.e. '2021.08.2_22_x86-64_0.32.023'. This version ingformation is also used when naming the .img file in ../output/images/ ../board/shredos/fsoverlay/etc/shredos/version.txt is manually updated for each new release of ShredOS. From c3ac56cba2a3f9f06cc8333db52373b0489d8b52 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Tue, 18 Nov 2025 18:24:54 +0100 Subject: [PATCH 12/35] feat(configs,shredos): add aio iso configuration This adds a configuration for a jack-of-all-trades ISO, which allows BIOS and UEFI booting, being written to CD/DVD-ROM and USB drives, as well as having a writeable partition when being used from an USB drive. It basically combines the functionality of all prior release versions into one single ISO (per architecture). Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- .../usr/bin/find_shredos_boot_disc.sh | 18 +- board/shredos/populate_efi_partition.sh | 24 +++ configs/shredos_iso_aio_defconfig | 183 ++++++++++++++++++ configs/shredos_iso_aio_i586_defconfig | 180 +++++++++++++++++ 4 files changed, 402 insertions(+), 3 deletions(-) create mode 100755 board/shredos/populate_efi_partition.sh create mode 100644 configs/shredos_iso_aio_defconfig create mode 100644 configs/shredos_iso_aio_i586_defconfig diff --git a/board/shredos/fsoverlay/usr/bin/find_shredos_boot_disc.sh b/board/shredos/fsoverlay/usr/bin/find_shredos_boot_disc.sh index 3aded1ce8a..1c0740ca35 100755 --- a/board/shredos/fsoverlay/usr/bin/find_shredos_boot_disc.sh +++ b/board/shredos/fsoverlay/usr/bin/find_shredos_boot_disc.sh @@ -3,7 +3,7 @@ # This program looks for any exfat, fat32 or fat16 filesystem, it then # examines the filesystem, looking for a kernel file or .img or .iso # file that has the same version number as the booted ShredOS. Once -# the boot USB has been found this script outputs the drive name in +# the boot USB has been found this script outputs the drive name in # the following form, example being /dev/sdc etc. # # If there is no FAT drive found the script fails silently @@ -46,11 +46,23 @@ fi # while read drive ; do - if [[ "$first_drive" == "" ]] + isEFI=$(fdisk -l | grep -i "$drive" | grep -i "EFI") + + # EFI partitions should not quality for "first drive" to avoid false + # positives; we only use it if confirmed as ours. The hybrid all-in-one ISO + # image's EFI partition can be written to, and we need to ensure that other + # EFI partitions remain untouched, so we don't take EFIs as "first drive". + # + # Note that our USB image's FAT partition is not marked specifically as EFI + # (0xEF) but regular FAT (0xC/0x0C), so it still qualifies as "first drive". + if [[ "$first_drive" == "" ]] && [[ -z "$isEFI" ]] then first_drive=$drive fi + # We can use the EFI partition if it passes the below checks and is + # confirmed to be ours (of the hybrid ISO images, when flashed on USB). + if [[ "$drive" != "" ]] then mount $drive $drive_dir 2>&1 | tee -a transfer.log @@ -120,7 +132,7 @@ do umount $drive_dir 2>&1 | tee -a transfer.log fi -done <<< $(fdisk -l | grep -i "exfat\|fat16\|fat32" | awk '{print $1}') +done <<< $(fdisk -l | grep -i "exfat\|fat16\|fat32\|EFI" | awk '{print $1}') # If no boot disc has been found that contains the version of ShredOS # that is running, then output the first FAT formatted drive we came across. diff --git a/board/shredos/populate_efi_partition.sh b/board/shredos/populate_efi_partition.sh new file mode 100755 index 0000000000..8aeaca9f8a --- /dev/null +++ b/board/shredos/populate_efi_partition.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# +# BR2_ROOTFS_POST_BUILD_SCRIPT for shredos_iso_aio configurations +# +# Our hybrid all-in-one ISO has an accessible EFI partition, which we +# can (ab)use to store our information also, so we move the usual data +# onto it before creating the images. This should not cause any issues +# for CD/DVD-ROM burned ISO images, as the EFI partition will be in RAM, +# but allow any USB burned ISO images to have that writeable data location. +# +# Keep in mind that the EFI partition size (in configuration) must be below +# the maximum of 65535 blocks of 512 bytes (= ~32 MB) or the ISO may not +# be bootable on legacy systems, xorriso would warn about this during the +# ISO building stage (but not consider it a failure - just so you know...) +# + +mkdir -p "${BINARIES_DIR}/efi-part/boot/" || exit 1 + +cp "board/shredos/autorun.inf" "${BINARIES_DIR}/efi-part/autorun.inf" || exit 1 +cp "board/shredos/README.txt" "${BINARIES_DIR}/efi-part/README.txt" || exit 1 +cp "board/shredos/shredos.ico" "${BINARIES_DIR}/efi-part/shredos.ico" || exit 1 +cp "board/shredos/fsoverlay/etc/shredos/version.txt" "${BINARIES_DIR}/efi-part/boot/version.txt" || exit 1 + +exit 0 diff --git a/configs/shredos_iso_aio_defconfig b/configs/shredos_iso_aio_defconfig new file mode 100644 index 0000000000..9c79632d01 --- /dev/null +++ b/configs/shredos_iso_aio_defconfig @@ -0,0 +1,183 @@ +BR2_x86_64=y +BR2_x86_nocona=y +BR2_PACKAGE_GLIBC_UTILS=y +BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_TOOLCHAIN_GLIBC_GCONV_LIBS_COPY=y +BR2_CPAN_MIRROR="http://cpan.metacpan.org" +BR2_TARGET_GENERIC_HOSTNAME="shredos" +BR2_TARGET_GENERIC_ISSUE="Welcome to ShredOS https://github.com/PartialVolume/shredos.x86_64" +BR2_INIT_SYSV=y +BR2_ROOTFS_MERGED_USR=y +BR2_SYSTEM_BIN_SH_BASH=y +BR2_SYSTEM_DEFAULT_PATH="/bin:/sbin:/usr/bin:/usr/sbin" +# BR2_ENABLE_LOCALE_PURGE is not set +BR2_GENERATE_LOCALE="en_US.UTF-8" +BR2_SYSTEM_ENABLE_NLS=y +BR2_TARGET_TZ_INFO=y +BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" +BR2_ROOTFS_POST_BUILD_SCRIPT="board/shredos/populate_efi_partition.sh" +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh" +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/shredos/kernel-6.6.22-defconfig.config" +BR2_PACKAGE_LINUX_TOOLS_CPUPOWER=y +BR2_PACKAGE_LINUX_TOOLS_PERF=y +BR2_PACKAGE_LINUX_TOOLS_SELFTESTS=y +# BR2_PACKAGE_BUSYBOX_SELINUX is not set +BR2_PACKAGE_FFMPEG=y +BR2_PACKAGE_FFMPEG_GPL=y +BR2_PACKAGE_FFMPEG_NONFREE=y +BR2_PACKAGE_FFMPEG_SWSCALE=y +BR2_PACKAGE_BZIP2=y +BR2_PACKAGE_GZIP=y +BR2_PACKAGE_UNZIP=y +BR2_PACKAGE_XZ=y +BR2_PACKAGE_ZIP=y +BR2_PACKAGE_HEXEDIT=y +BR2_PACKAGE_BINUTILS=y +BR2_PACKAGE_GETTEXT=y +BR2_PACKAGE_GREP=y +BR2_PACKAGE_LIBTOOL=y +BR2_PACKAGE_SED=y +BR2_PACKAGE_DOSFSTOOLS=y +BR2_PACKAGE_DOSFSTOOLS_FATLABEL=y +BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y +BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT=y +BR2_PACKAGE_E2FSPROGS=y +BR2_PACKAGE_EXFATPROGS=y +BR2_PACKAGE_ASCII_INVADERS=y +BR2_PACKAGE_DIRECTFB=y +BR2_PACKAGE_DIRECTFB_ATI128=y +BR2_PACKAGE_DIRECTFB_MATROX=y +BR2_PACKAGE_DIRECTFB_I830=y +BR2_PACKAGE_FBDUMP=y +BR2_PACKAGE_FBGRAB=y +BR2_PACKAGE_FBSET=y +BR2_PACKAGE_FBTERM=y +BR2_PACKAGE_FBV=y +BR2_PACKAGE_MESA3D=y +BR2_PACKAGE_MESA3D_LLVM=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_CROCUS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_ETNAVIV=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_I915=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_IRIS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_LIMA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R300=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SVGA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_TEGRA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VIRGL=y +BR2_PACKAGE_MESA3D_VULKAN_DRIVER_INTEL=y +BR2_PACKAGE_MESA3D_OSMESA_GALLIUM=y +BR2_PACKAGE_MESA3D_OPENGL_ES=y +BR2_PACKAGE_LINUX_FIRMWARE=y +BR2_PACKAGE_LINUX_FIRMWARE_AMDGPU=y +BR2_PACKAGE_LINUX_FIRMWARE_I915=y +BR2_PACKAGE_LINUX_FIRMWARE_RADEON=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_VENUS=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_ADRENO=y +BR2_PACKAGE_LINUX_FIRMWARE_MFC_V8=y +BR2_PACKAGE_LINUX_FIRMWARE_QUALCOMM_6174=y +BR2_PACKAGE_LINUX_FIRMWARE_BROADCOM_TIGON3=y +BR2_PACKAGE_LINUX_FIRMWARE_BNX2X=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T4=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T5=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_E100=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_ICE=y +BR2_PACKAGE_LINUX_FIRMWARE_MICROCHIP_VSC85XX_PHY=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_4X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_815X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_8169=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_2XXX=y +BR2_PACKAGE_EDID_DECODE=y +BR2_PACKAGE_HDPARM=y +BR2_PACKAGE_KBD=y +BR2_PACKAGE_LM_SENSORS=y +BR2_PACKAGE_LSHW=y +BR2_PACKAGE_LSSCSI=y +BR2_PACKAGE_MINICOM=y +BR2_PACKAGE_NVME=y +BR2_PACKAGE_READ_EDID=y +BR2_PACKAGE_SG3_UTILS=y +BR2_PACKAGE_SG3_UTILS_PROGS=y +BR2_PACKAGE_SMARTMONTOOLS=y +BR2_PACKAGE_SYSSTAT=y +BR2_PACKAGE_TRIGGERHAPPY=y +BR2_PACKAGE_PERL=y +BR2_PACKAGE_PYTHON_PYASN1_MODULES=y +BR2_PACKAGE_PYTHON_PYBIND=y +BR2_PACKAGE_PYTHON_PYNDIFF=y +BR2_PACKAGE_PYTHON_SCAPY=y +BR2_PACKAGE_LZ4=y +BR2_PACKAGE_LIBGCRYPT=y +BR2_PACKAGE_LIBJPEG=y +BR2_PACKAGE_STB=y +BR2_PACKAGE_LIBHID=y +BR2_PACKAGE_JSON_GLIB=y +BR2_PACKAGE_LIBCURL=y +BR2_PACKAGE_LIBUPNP=y +BR2_PACKAGE_KERNEL_CMDLINE_EXTRACTOR=y +BR2_PACKAGE_LIBCAP=y +BR2_PACKAGE_LIBSECCOMP=y +BR2_PACKAGE_NWIPE=y +BR2_PACKAGE_LIBFRIBIDI=y +BR2_PACKAGE_NCURSES_WCHAR=y +BR2_PACKAGE_UTF8PROC=y +BR2_PACKAGE_HEIRLOOM_MAILX=y +BR2_PACKAGE_COLLECTD=y +BR2_PACKAGE_COLLECTD_NTPD=y +BR2_PACKAGE_XUTIL_UTIL_MACROS=y +BR2_PACKAGE_IPTABLES=y +BR2_PACKAGE_LFTP=y +BR2_PACKAGE_LFTP_PROTO_SFTP=y +BR2_PACKAGE_NMAP=y +BR2_PACKAGE_NTP=y +BR2_PACKAGE_NTP_NTPDATE=y +BR2_PACKAGE_NTP_NTPTIME=y +BR2_PACKAGE_OPENSSH=y +# BR2_PACKAGE_OPENSSH_SERVER is not set +BR2_PACKAGE_RPCBIND=y +BR2_PACKAGE_SNMPCLITOOLS=y +BR2_PACKAGE_TFTPD=y +BR2_PACKAGE_TRACEROUTE=y +BR2_PACKAGE_WIREGUARD_TOOLS=y +BR2_PACKAGE_RESTORECOND=y +BR2_PACKAGE_SELINUX_PYTHON=y +BR2_PACKAGE_SELINUX_PYTHON_AUDIT2ALLOW=y +BR2_PACKAGE_PARALLEL=y +BR2_PACKAGE_TMUX=y +BR2_PACKAGE_OPENSEACHEST=y +BR2_PACKAGE_PROCPS_NG=y +BR2_PACKAGE_RUNC=y +BR2_PACKAGE_UTIL_LINUX_BINARIES=y +BR2_PACKAGE_UTIL_LINUX_AGETTY=y +BR2_PACKAGE_UTIL_LINUX_FSCK=y +BR2_PACKAGE_UTIL_LINUX_LAST=y +BR2_PACKAGE_UTIL_LINUX_LOGIN=y +BR2_PACKAGE_UTIL_LINUX_MOUNT=y +BR2_PACKAGE_UTIL_LINUX_MOUNTPOINT=y +BR2_PACKAGE_UTIL_LINUX_PIVOT_ROOT=y +BR2_PACKAGE_UTIL_LINUX_RFKILL=y +BR2_PACKAGE_UTIL_LINUX_RUNUSER=y +BR2_PACKAGE_UTIL_LINUX_SETTERM=y +BR2_PACKAGE_UTIL_LINUX_SU=y +BR2_PACKAGE_UTIL_LINUX_SULOGIN=y +BR2_TARGET_ROOTFS_CPIO_LZMA=y +BR2_TARGET_ROOTFS_INITRAMFS=y +BR2_TARGET_ROOTFS_ISO9660=y +BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE="28M" +BR2_TARGET_ROOTFS_ISO9660_HYBRID=y +# BR2_TARGET_ROOTFS_TAR is not set +BR2_TARGET_GRUB2=y +BR2_TARGET_GRUB2_X86_64_EFI=y +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile iso9660" +BR2_TARGET_GRUB2_INSTALL_TOOLS=y +BR2_TARGET_SYSLINUX=y +BR2_PACKAGE_HOST_E2FSPROGS=y +BR2_PACKAGE_HOST_GENIMAGE=y +BR2_PACKAGE_HOST_PYTHON3=y +BR2_PACKAGE_HOST_PYTHON3_BZIP2=y +BR2_PACKAGE_HOST_PYTHON3_SSL=y diff --git a/configs/shredos_iso_aio_i586_defconfig b/configs/shredos_iso_aio_i586_defconfig new file mode 100644 index 0000000000..c2a97f0012 --- /dev/null +++ b/configs/shredos_iso_aio_i586_defconfig @@ -0,0 +1,180 @@ +BR2_PACKAGE_GLIBC_UTILS=y +BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_TOOLCHAIN_GLIBC_GCONV_LIBS_COPY=y +BR2_CPAN_MIRROR="http://cpan.metacpan.org" +BR2_TARGET_GENERIC_HOSTNAME="shredos" +BR2_TARGET_GENERIC_ISSUE="Welcome to ShredOS https://github.com/PartialVolume/shredos.x86_64" +BR2_INIT_SYSV=y +BR2_ROOTFS_MERGED_USR=y +BR2_SYSTEM_BIN_SH_BASH=y +BR2_SYSTEM_DEFAULT_PATH="/bin:/sbin:/usr/bin:/usr/sbin" +# BR2_ENABLE_LOCALE_PURGE is not set +BR2_GENERATE_LOCALE="en_US.UTF-8" +BR2_SYSTEM_ENABLE_NLS=y +BR2_TARGET_TZ_INFO=y +BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" +BR2_ROOTFS_POST_BUILD_SCRIPT="board/shredos/populate_efi_partition.sh" +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh" +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/shredos/kernel-6.6.22-defconfig.config" +BR2_PACKAGE_LINUX_TOOLS_CPUPOWER=y +BR2_PACKAGE_LINUX_TOOLS_PERF=y +BR2_PACKAGE_LINUX_TOOLS_SELFTESTS=y +# BR2_PACKAGE_BUSYBOX_SELINUX is not set +BR2_PACKAGE_FFMPEG=y +BR2_PACKAGE_FFMPEG_GPL=y +BR2_PACKAGE_FFMPEG_NONFREE=y +BR2_PACKAGE_FFMPEG_SWSCALE=y +BR2_PACKAGE_BZIP2=y +BR2_PACKAGE_GZIP=y +BR2_PACKAGE_UNZIP=y +BR2_PACKAGE_XZ=y +BR2_PACKAGE_ZIP=y +BR2_PACKAGE_HEXEDIT=y +BR2_PACKAGE_BINUTILS=y +BR2_PACKAGE_GETTEXT=y +BR2_PACKAGE_GREP=y +BR2_PACKAGE_LIBTOOL=y +BR2_PACKAGE_SED=y +BR2_PACKAGE_DOSFSTOOLS=y +BR2_PACKAGE_DOSFSTOOLS_FATLABEL=y +BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y +BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT=y +BR2_PACKAGE_E2FSPROGS=y +BR2_PACKAGE_EXFATPROGS=y +BR2_PACKAGE_ASCII_INVADERS=y +BR2_PACKAGE_DIRECTFB=y +BR2_PACKAGE_DIRECTFB_ATI128=y +BR2_PACKAGE_DIRECTFB_MATROX=y +BR2_PACKAGE_DIRECTFB_I830=y +BR2_PACKAGE_FBDUMP=y +BR2_PACKAGE_FBGRAB=y +BR2_PACKAGE_FBSET=y +BR2_PACKAGE_FBTERM=y +BR2_PACKAGE_FBV=y +BR2_PACKAGE_MESA3D=y +BR2_PACKAGE_MESA3D_LLVM=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_CROCUS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_ETNAVIV=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_I915=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_IRIS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_LIMA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R300=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SVGA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_TEGRA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VIRGL=y +BR2_PACKAGE_MESA3D_VULKAN_DRIVER_INTEL=y +BR2_PACKAGE_MESA3D_OSMESA_GALLIUM=y +BR2_PACKAGE_MESA3D_OPENGL_ES=y +BR2_PACKAGE_LINUX_FIRMWARE=y +BR2_PACKAGE_LINUX_FIRMWARE_AMDGPU=y +BR2_PACKAGE_LINUX_FIRMWARE_I915=y +BR2_PACKAGE_LINUX_FIRMWARE_RADEON=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_VENUS=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_ADRENO=y +BR2_PACKAGE_LINUX_FIRMWARE_MFC_V8=y +BR2_PACKAGE_LINUX_FIRMWARE_QUALCOMM_6174=y +BR2_PACKAGE_LINUX_FIRMWARE_BROADCOM_TIGON3=y +BR2_PACKAGE_LINUX_FIRMWARE_BNX2X=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T4=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T5=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_E100=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_ICE=y +BR2_PACKAGE_LINUX_FIRMWARE_MICROCHIP_VSC85XX_PHY=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_4X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_815X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_8169=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_2XXX=y +BR2_PACKAGE_EDID_DECODE=y +BR2_PACKAGE_HDPARM=y +BR2_PACKAGE_KBD=y +BR2_PACKAGE_LM_SENSORS=y +BR2_PACKAGE_LSHW=y +BR2_PACKAGE_LSSCSI=y +BR2_PACKAGE_MINICOM=y +BR2_PACKAGE_NVME=y +BR2_PACKAGE_READ_EDID=y +BR2_PACKAGE_SG3_UTILS=y +BR2_PACKAGE_SG3_UTILS_PROGS=y +BR2_PACKAGE_SMARTMONTOOLS=y +BR2_PACKAGE_SYSSTAT=y +BR2_PACKAGE_TRIGGERHAPPY=y +BR2_PACKAGE_PERL=y +BR2_PACKAGE_PYTHON_PYASN1_MODULES=y +BR2_PACKAGE_PYTHON_PYBIND=y +BR2_PACKAGE_PYTHON_PYNDIFF=y +BR2_PACKAGE_PYTHON_SCAPY=y +BR2_PACKAGE_LZ4=y +BR2_PACKAGE_LIBGCRYPT=y +BR2_PACKAGE_STB=y +BR2_PACKAGE_LIBHID=y +BR2_PACKAGE_JSON_GLIB=y +BR2_PACKAGE_LIBCURL=y +BR2_PACKAGE_LIBUPNP=y +BR2_PACKAGE_KERNEL_CMDLINE_EXTRACTOR=y +BR2_PACKAGE_LIBCAP=y +BR2_PACKAGE_LIBSECCOMP=y +BR2_PACKAGE_NWIPE=y +BR2_PACKAGE_LIBFRIBIDI=y +BR2_PACKAGE_NCURSES_WCHAR=y +BR2_PACKAGE_UTF8PROC=y +BR2_PACKAGE_HEIRLOOM_MAILX=y +BR2_PACKAGE_COLLECTD=y +BR2_PACKAGE_COLLECTD_NTPD=y +BR2_PACKAGE_XUTIL_UTIL_MACROS=y +BR2_PACKAGE_IPTABLES=y +BR2_PACKAGE_LFTP=y +BR2_PACKAGE_LFTP_PROTO_SFTP=y +BR2_PACKAGE_NMAP=y +BR2_PACKAGE_NTP=y +BR2_PACKAGE_NTP_NTPDATE=y +BR2_PACKAGE_NTP_NTPTIME=y +BR2_PACKAGE_OPENSSH=y +# BR2_PACKAGE_OPENSSH_SERVER is not set +BR2_PACKAGE_RPCBIND=y +BR2_PACKAGE_SNMPCLITOOLS=y +BR2_PACKAGE_TFTPD=y +BR2_PACKAGE_TRACEROUTE=y +BR2_PACKAGE_WIREGUARD_TOOLS=y +BR2_PACKAGE_RESTORECOND=y +BR2_PACKAGE_SELINUX_PYTHON=y +BR2_PACKAGE_SELINUX_PYTHON_AUDIT2ALLOW=y +BR2_PACKAGE_PARALLEL=y +BR2_PACKAGE_TMUX=y +BR2_PACKAGE_OPENSEACHEST=y +BR2_PACKAGE_PROCPS_NG=y +BR2_PACKAGE_RUNC=y +BR2_PACKAGE_UTIL_LINUX_BINARIES=y +BR2_PACKAGE_UTIL_LINUX_AGETTY=y +BR2_PACKAGE_UTIL_LINUX_FSCK=y +BR2_PACKAGE_UTIL_LINUX_LAST=y +BR2_PACKAGE_UTIL_LINUX_LOGIN=y +BR2_PACKAGE_UTIL_LINUX_MOUNT=y +BR2_PACKAGE_UTIL_LINUX_MOUNTPOINT=y +BR2_PACKAGE_UTIL_LINUX_PIVOT_ROOT=y +BR2_PACKAGE_UTIL_LINUX_RFKILL=y +BR2_PACKAGE_UTIL_LINUX_RUNUSER=y +BR2_PACKAGE_UTIL_LINUX_SETTERM=y +BR2_PACKAGE_UTIL_LINUX_SU=y +BR2_PACKAGE_UTIL_LINUX_SULOGIN=y +BR2_TARGET_ROOTFS_CPIO_LZMA=y +BR2_TARGET_ROOTFS_INITRAMFS=y +BR2_TARGET_ROOTFS_ISO9660=y +BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE="28M" +BR2_TARGET_ROOTFS_ISO9660_HYBRID=y +# BR2_TARGET_ROOTFS_TAR is not set +BR2_TARGET_GRUB2=y +BR2_TARGET_GRUB2_I386_EFI=y +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile iso9660" +BR2_TARGET_GRUB2_INSTALL_TOOLS=y +BR2_TARGET_SYSLINUX=y +BR2_PACKAGE_HOST_E2FSPROGS=y +BR2_PACKAGE_HOST_GENIMAGE=y +BR2_PACKAGE_HOST_PYTHON3=y +BR2_PACKAGE_HOST_PYTHON3_BZIP2=y +BR2_PACKAGE_HOST_PYTHON3_SSL=y From efac0803898c8d05b7a811928136ba39324435f6 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Tue, 18 Nov 2025 18:39:14 +0100 Subject: [PATCH 13/35] chore: update readme for new changes Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- README.md | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ae10ed29e1..5e29550212 100644 --- a/README.md +++ b/README.md @@ -805,17 +805,27 @@ $ cd output/images $ dd if=shredos-20200412.img of=/dev/sdx (20200412 will be the day you compiled, sdx is the USB flash drive) ``` -The following configurations are available to build different targets: +#### The following configurations are available to build different targets: -- `make shredos_defconfig` - build USB image and hybrid ISO (64-bit) -- `make shredos_i586_defconfig` - build USB image and hybrid ISO (32-bit) +- `make shredos_defconfig` - build USB image and regular hybrid ISO (64-bit) +- `make shredos_i586_defconfig` - build USB image and regular hybrid ISO (32-bit) - `make shredos_img_defconfig` - build USB image only (64-bit) - `make shredos_img_i586_defconfig` - build USB image only (32-bit) -- `make shredos_iso_defconfig` - build hybrid ISO only (64-bit) -- `make shredos_iso_i586_defconfig` - build hybrid ISO only (32-bit) +- `make shredos_iso_defconfig` - build regular hybrid ISO only (64-bit) +- `make shredos_iso_i586_defconfig` - build regular hybrid ISO only (32-bit) +- `make shredos_iso_aio_defconfig` - build AIO hybrid ISO only (64-bit) +- `make shredos_iso_aio_i586_defconfig` - build AIO hybrid ISO only (32-bit) Do note that loading a configuration should typically be the last step before `make`. +> **The all-in-one ISOs unite the functionality of all other formats:** +> +>- are BIOS and UEFI bootable +>- can both be written to CD/DVD-ROM and USB flash drives +>- have a writeable partition (when written to a USB flash drive) +> +>The regular hybrid ISOs do not have that writeable partition (but are smaller in size). + ### Issues that you may get when building ShredOS - **Error: "Internal Size Too Big"** If you are compiling the vanilla version of ShredOS and have made no alterations or additions but it fails to build the .img with the error "Internal error: size too big" then you may have a version of mtools that has a version of mcopy which has a bug whenever the -b option is used. This bug is known to exist in mcopy version 4.0.32 and maybe others but is fixed in v4.0.42. The solution is to upgrade your copy of mtools to a later version. However, if you have altered ShredOS by adding more packages you may need to update the size of the fat32 partition. You can do this by increasing the 'size' in ../board/shredos/genimage.cfg. Depending on how much extra software you have added increase the size by 10MB or more. Currently as of March 2023 the current size is `size = 130000000`, this is in bytes, so adding 10MB will mean you need to edit this value so that it reads `size = 140000000`. After the edit, just run `make` which will result in a quicker build. You don't need to run `make clean` first as that would result in a full rebuild which is not neccessary when all you are doing is increasing the final image size. If your repository does not supply a later version of mtools, then you can obtain mtools packages for various distros from [here](https://www.gnu.org/software/mtools/#downloads) From f9182d05806d64dead33bffe1ab9eb8aa3887d36 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Tue, 18 Nov 2025 22:36:50 +0100 Subject: [PATCH 14/35] chore(iso9660): add partition size documentation Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- fs/iso9660/Config.in | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/iso9660/Config.in b/fs/iso9660/Config.in index 2cf950850d..b26735b02b 100644 --- a/fs/iso9660/Config.in +++ b/fs/iso9660/Config.in @@ -135,6 +135,10 @@ config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE Use this option to increase the size of the EFI partition. Embedding more GRUB2 modules may require a larger EFI partition size. + Beware that sizes above 32M may not be compatible with all systems. + xorriso will raise warnings, but not fail partitions larger than 32M. + If you exceed 32M, carefully examine your builds and partition layouts. + config BR2_TARGET_ROOTFS_ISO9660_INITRD bool "Use initrd" depends on !BR2_TARGET_ROOTFS_INITRAMFS From f0db7fc78ab39746e06b74516ff71fe2a198c957 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Wed, 19 Nov 2025 07:12:19 +0100 Subject: [PATCH 15/35] feat(configs): make default configs build USB image and AIO hybrid ISO The all-in-one ISO works well and is the jack-of-all-trades, covering all imaginable systems and scenarios, so include that in the default build configurations. Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- README.md | 12 +++++++----- configs/shredos_defconfig | 3 ++- configs/shredos_i586_defconfig | 3 ++- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 5e29550212..926066b416 100644 --- a/README.md +++ b/README.md @@ -807,12 +807,12 @@ $ dd if=shredos-20200412.img of=/dev/sdx (20200412 will be the day you compiled, #### The following configurations are available to build different targets: -- `make shredos_defconfig` - build USB image and regular hybrid ISO (64-bit) -- `make shredos_i586_defconfig` - build USB image and regular hybrid ISO (32-bit) +- `make shredos_defconfig` - build USB image and AIO hybrid ISO (64-bit) +- `make shredos_i586_defconfig` - build USB image and AIO hybrid ISO (32-bit) - `make shredos_img_defconfig` - build USB image only (64-bit) - `make shredos_img_i586_defconfig` - build USB image only (32-bit) -- `make shredos_iso_defconfig` - build regular hybrid ISO only (64-bit) -- `make shredos_iso_i586_defconfig` - build regular hybrid ISO only (32-bit) +- `make shredos_iso_defconfig` - build legacy hybrid ISO only (64-bit) +- `make shredos_iso_i586_defconfig` - build legacy hybrid ISO only (32-bit) - `make shredos_iso_aio_defconfig` - build AIO hybrid ISO only (64-bit) - `make shredos_iso_aio_i586_defconfig` - build AIO hybrid ISO only (32-bit) @@ -824,7 +824,9 @@ Do note that loading a configuration should typically be the last step before `m >- can both be written to CD/DVD-ROM and USB flash drives >- have a writeable partition (when written to a USB flash drive) > ->The regular hybrid ISOs do not have that writeable partition (but are smaller in size). +>The **legacy** hybrid ISOs, however, do not have that writeable partition (but +>are slightly smaller in size), which means that you cannot make modifications +>or have any PDFs written out (when using them burned to an USB flash drive). ### Issues that you may get when building ShredOS - **Error: "Internal Size Too Big"** If you are compiling the vanilla version of ShredOS and have made no alterations or additions but it fails to build the .img with the error "Internal error: size too big" then you may have a version of mtools that has a version of mcopy which has a bug whenever the -b option is used. This bug is known to exist in mcopy version 4.0.32 and maybe others but is fixed in v4.0.42. The solution is to upgrade your copy of mtools to a later version. However, if you have altered ShredOS by adding more packages you may need to update the size of the fat32 partition. You can do this by increasing the 'size' in ../board/shredos/genimage.cfg. Depending on how much extra software you have added increase the size by 10MB or more. Currently as of March 2023 the current size is `size = 130000000`, this is in bytes, so adding 10MB will mean you need to edit this value so that it reads `size = 140000000`. After the edit, just run `make` which will result in a quicker build. You don't need to run `make clean` first as that would result in a full rebuild which is not neccessary when all you are doing is increasing the final image size. If your repository does not supply a later version of mtools, then you can obtain mtools packages for various distros from [here](https://www.gnu.org/software/mtools/#downloads) diff --git a/configs/shredos_defconfig b/configs/shredos_defconfig index 4a8f868514..43459568da 100644 --- a/configs/shredos_defconfig +++ b/configs/shredos_defconfig @@ -15,6 +15,7 @@ BR2_GENERATE_LOCALE="en_US.UTF-8" BR2_SYSTEM_ENABLE_NLS=y BR2_TARGET_TZ_INFO=y BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" +BR2_ROOTFS_POST_BUILD_SCRIPT="board/shredos/populate_efi_partition.sh" BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh board/shredos/make_img_file.sh" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y @@ -167,7 +168,7 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y -# BR2_TARGET_ROOTFS_ISO9660_INITRD is not set +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE="28M" BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y diff --git a/configs/shredos_i586_defconfig b/configs/shredos_i586_defconfig index 927f919e28..f13fac1826 100644 --- a/configs/shredos_i586_defconfig +++ b/configs/shredos_i586_defconfig @@ -13,6 +13,7 @@ BR2_GENERATE_LOCALE="en_US.UTF-8" BR2_SYSTEM_ENABLE_NLS=y BR2_TARGET_TZ_INFO=y BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" +BR2_ROOTFS_POST_BUILD_SCRIPT="board/shredos/populate_efi_partition.sh" BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh board/shredos/make_img_file.sh" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y @@ -164,7 +165,7 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y -# BR2_TARGET_ROOTFS_ISO9660_INITRD is not set +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE="28M" BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y From 39cb0dd4f7972434ded824602514f23a7535df43 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Wed, 19 Nov 2025 07:55:40 +0100 Subject: [PATCH 16/35] feat: add basic multi-build script Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- .gitignore | 1 + build_all_shredos.sh | 274 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 275 insertions(+) create mode 100755 build_all_shredos.sh diff --git a/.gitignore b/.gitignore index 99af9bdeda..226c439357 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /output +/dist /dl /.auto.deps /.config.cmd diff --git a/build_all_shredos.sh b/build_all_shredos.sh new file mode 100755 index 0000000000..086e602a0b --- /dev/null +++ b/build_all_shredos.sh @@ -0,0 +1,274 @@ +#!/bin/bash + +################################################################################ +# Usage: +# FAIL_ON_ERROR=0|1 QUICK_BUILD=0|1 NEW_VERSION="STRING" ./build_all.sh +# +# Examples: +# ./build_all.sh +# FAIL_ON_ERROR=0 QUICK_BUILD=0 ./build_all.sh +# NEW_VERSION="2024.11_27_x86-64_0.38" ./build_all.sh +# +# Environment Variables: +# FAIL_ON_ERROR - 0=continue on failure, 1=exit on first failure (default: 1) +# QUICK_BUILD - 0=full clean between configs, 1=grub2-rebuild only (default: 1) +# NEW_VERSION - Version string (default: prompts user & keeps current on ENTER) +################################################################################ + +################################################################################ +# 0 = continue to the next configuration if one fails to build +# 1 = exit the entire script if one configuration fails to build +FAIL_ON_ERROR="${FAIL_ON_ERROR:-1}" +################################################################################ + +################################################################################ +# 0 = "make clean" between same architecture configs (much slower) +# 1 = "make grub2-rebuild" between same architecture configs (much faster) +QUICK_BUILD="${QUICK_BUILD:-1}" +################################################################################ + +################################################################################ +VERSION_FILE="board/shredos/fsoverlay/etc/shredos/version.txt" + +x64_configs=( + "shredos_defconfig" + "shredos_img_defconfig" + "shredos_iso_defconfig" + "shredos_iso_aio_defconfig" +) + +x32_configs=( + "shredos_i586_defconfig" + "shredos_img_i586_defconfig" + "shredos_iso_i586_defconfig" + "shredos_iso_aio_i586_defconfig" +) +################################################################################ + +set -e +trap 'exit 1' SIGINT +trap 'exit 1' SIGTERM + +x64_success=0 +x64_failed=0 +x32_success=0 +x32_failed=0 + +GREEN="\033[0;32m" +RED="\033[0;31m" +RESET="\033[0m" + +prompt_version() { + local CURRENT_VERSION="" + + if [ -f "$VERSION_FILE" ]; then + CURRENT_VERSION=$(cat "$VERSION_FILE") + else + printf "%b" "$RED" + echo + echo "===============================================" + echo "Version file not found: $VERSION_FILE" + echo "===============================================" + echo + printf "%b" "$RESET" + exit 1 + fi + + if [ -z "$NEW_VERSION" ]; then + echo + echo "x86-64 and i586 will be replaced/switched around during builds (depending on architecture)" + read -rp "Enter new version or press ENTER to keep existing [${CURRENT_VERSION}]: " NEW_VERSION + [ -z "$NEW_VERSION" ] && NEW_VERSION="$CURRENT_VERSION" + fi + + echo "$NEW_VERSION" > "$VERSION_FILE" + + printf "%b" "$GREEN" + echo + echo "===============================================" + echo "Version updated to: $NEW_VERSION" + echo "===============================================" + echo + printf "%b" "$RESET" +} + +display_build_plan() { + local total_configs=$((${#x64_configs[@]} + ${#x32_configs[@]})) + + printf "%b" "$GREEN" + echo + echo "===============================================" + echo "PLANNING TO BUILD:" + echo "===============================================" + echo "Version: $NEW_VERSION" + echo "Fail on Error: $FAIL_ON_ERROR" + echo "Quick Build: $QUICK_BUILD" + echo "Total Configs: $total_configs" + echo "===============================================" + echo + printf "%b" "$RESET" + + if [ ${#x64_configs[@]} -gt 0 ]; then + echo "64-bit targets (${#x64_configs[@]}):" + for config in "${x64_configs[@]}"; do + echo " - $config" + done + echo + fi + + if [ ${#x32_configs[@]} -gt 0 ]; then + echo "32-bit targets (${#x32_configs[@]}):" + for config in "${x32_configs[@]}"; do + echo " - $config" + done + echo + fi + + printf "%b" "$GREEN" + echo "===============================================" + echo "Configurations to build can be amended inside the script." + echo "===============================================" + echo + printf "%b" "$RESET" +} + +replace_version() { + local from=$1 + local to=$2 + if [ -f "$VERSION_FILE" ]; then + sed -i "s/$from/$to/g" "$VERSION_FILE" + fi +} + +build_config() { + local config=$1 + local arch=$2 + local log_file="dist/${config}.log" + + echo + echo "============================================" + echo "Building $config ($arch)" + echo "============================================" + echo + + if [ "$QUICK_BUILD" -eq 1 ]; then + make "$config" + make grub2-rebuild + else + make clean + make "$config" + fi + + [ ! "$FAIL_ON_ERROR" -eq 1 ] && set +e + make 2>&1 | tee "$log_file" + local make_status=${PIPESTATUS[0]} + [ ! "$FAIL_ON_ERROR" -eq 1 ] && set -e + + if [ "$make_status" -eq 0 ]; then + mv "$log_file" "dist/${config}-SUCCESS.log" + + mkdir -p "dist/$config" + mv output/images/shredos*.iso "dist/$config/" 2>/dev/null || true + mv output/images/shredos*.img "dist/$config/" 2>/dev/null || true + + printf "%b" "$GREEN" + echo + echo "===============================================" + echo "$config build ($arch) success" + echo "===============================================" + echo + printf "%b\n" "$RESET" + + if [ "$arch" = "x64" ]; then + ((x64_success++)) + else + ((x32_success++)) + fi + return 0 + else + mv "$log_file" "dist/${config}-FAILED.log" + + printf "%b" "$RED" + echo + echo "===============================================" + echo "$config build ($arch) failed" + echo "===============================================" + echo + printf "%b\n" "$RESET" + + if [ "$arch" = "x64" ]; then + ((x64_failed++)) + else + ((x32_failed++)) + fi + return 1 + fi +} + +################################################################################ + +prompt_version +display_build_plan + +echo "Starting these builds in 10 seconds... (press CTRL+C to cancel)" +sleep 10 + +echo "Running 'make clean' on the building environment..." +make clean + +echo "Removing and recreating 'dist/' folder (if it exists)..." +rm -r dist || true +mkdir -p dist + +echo "Starting to build..." + +if [ ${#x64_configs[@]} -gt 0 ]; then + echo + echo "===============================================" + echo "Starting 64-bit builds..." + echo "===============================================" + echo + replace_version "i586" "x86-64" + + for config in "${x64_configs[@]}"; do + build_config "$config" "x64" || true + done +fi + +make clean + +if [ ${#x32_configs[@]} -gt 0 ]; then + echo + echo "===============================================" + echo "Starting 32-bit builds..." + echo "===============================================" + echo + replace_version "x86-64" "i586" + + for config in "${x32_configs[@]}"; do + build_config "$config" "x32" || true + done +fi + +total_success=$((x64_success + x32_success)) +total_failed=$((x64_failed + x32_failed)) +total_builds=$((total_success + total_failed)) + +echo +echo "============================================" +echo "BUILD SUMMARY" +echo "============================================" +echo "64-bit builds: $x64_success succeeded, $x64_failed failed" +echo "32-bit builds: $x32_success succeeded, $x32_failed failed" +echo "--------------------------------------------" +echo "Total: $total_success succeeded, $total_failed failed (out of $total_builds)" +echo "--------------------------------------------" +echo "You will find all output files of the builds in the 'dist/' folder." +echo "============================================" +echo + +if [ $total_failed -gt 0 ]; then + exit 1 +else + exit 0 +fi From 66e7c16de39e7e596e7819d208cdd58bc968c393 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Wed, 19 Nov 2025 10:25:07 +0100 Subject: [PATCH 17/35] fix: embed grub finder configuration Helps GRUB find the ShredOS volume when it otherwise cannot (such as when the IMG is used with Ventoy in BIOS) Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- board/shredos/embed/README | 16 ++++++++++++++++ board/shredos/embed/grub.cfg | 3 +++ board/shredos/genimage.cfg | 1 + board/shredos/genimage_i586.cfg | 1 + configs/shredos_defconfig | 2 ++ configs/shredos_i586_defconfig | 2 ++ configs/shredos_img_defconfig | 3 ++- configs/shredos_img_i586_defconfig | 3 ++- configs/shredos_iso_aio_defconfig | 1 + configs/shredos_iso_aio_i586_defconfig | 1 + configs/shredos_iso_defconfig | 2 +- configs/shredos_iso_i586_defconfig | 2 +- fs/iso9660/Config.in | 2 +- 13 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 board/shredos/embed/README create mode 100644 board/shredos/embed/grub.cfg diff --git a/board/shredos/embed/README b/board/shredos/embed/README new file mode 100644 index 0000000000..13ef99752d --- /dev/null +++ b/board/shredos/embed/README @@ -0,0 +1,16 @@ +This file is embedded into the GRUB bootloaders at build-time +Helps GRUB find our ShredOS volume when it cannot (Ventoy BIOS) +There is no point to put it anywhere on the USB - so don't do that. + +Keep consistent with BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE +when building any configurations that build both an ISO and the IMG. + +Do not use the version file as identification file though, because +the ISO9660 filesystem does not have it (but has the needed grub.cfg), +so you should always use a unique file not otherwise used for anything. + +Also ensure it is in a location where users cannot delete it by accident. + +Note that contrary to the GNU manual the BIOS bootloader seems to need an +explicit "configfile" directive, otherwise the Buildroot static prefix takes +precedence over the actual found volume path (which may be entirely different). diff --git a/board/shredos/embed/grub.cfg b/board/shredos/embed/grub.cfg new file mode 100644 index 0000000000..c036fc5671 --- /dev/null +++ b/board/shredos/embed/grub.cfg @@ -0,0 +1,3 @@ +search --file --set=root /boot/buildroot +set prefix=($root)/boot/grub +configfile $prefix/grub.cfg diff --git a/board/shredos/genimage.cfg b/board/shredos/genimage.cfg index 2d6e121872..27e9a77ee2 100644 --- a/board/shredos/genimage.cfg +++ b/board/shredos/genimage.cfg @@ -4,6 +4,7 @@ image boot.vfat { file boot/bzImage { image = 'bzImage' } file boot/grub/grub.cfg { image = 'grub.cfg' } file boot/version.txt { image = 'version.txt' } + file boot/buildroot { image = '/dev/null' } file EFI/BOOT/bootx64.efi { image = 'bootx64.efi' } file EFI/BOOT/grub.cfg { image = 'grub.cfg' } file shredos.ico { image = 'shredos.ico' } diff --git a/board/shredos/genimage_i586.cfg b/board/shredos/genimage_i586.cfg index 9f1cf73d15..97182ed8e7 100644 --- a/board/shredos/genimage_i586.cfg +++ b/board/shredos/genimage_i586.cfg @@ -4,6 +4,7 @@ image boot.vfat { file boot/bzImage { image = 'bzImage' } file boot/grub/grub.cfg { image = 'grub.cfg' } file boot/version.txt { image = 'version.txt' } + file boot/buildroot { image = '/dev/null' } file EFI/BOOT/bootia32.efi { image = 'bootia32.efi' } file EFI/BOOT/grub.cfg { image = 'grub.cfg' } file shredos.ico { image = 'shredos.ico' } diff --git a/configs/shredos_defconfig b/configs/shredos_defconfig index 43459568da..400e03cbfa 100644 --- a/configs/shredos_defconfig +++ b/configs/shredos_defconfig @@ -175,7 +175,9 @@ BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_I386_PC=y BR2_TARGET_GRUB2_X86_64_EFI=y BR2_TARGET_GRUB2_BUILTIN_MODULES_PC="boot linux ext2 fat squash4 part_msdos part_gpt normal progress biosdisk all_video video_cirrus video_bochs net tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile" +BR2_TARGET_GRUB2_BUILTIN_CONFIG_PC="board/shredos/embed/grub.cfg" BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile iso9660" +BR2_TARGET_GRUB2_BUILTIN_CONFIG_EFI="board/shredos/embed/grub.cfg" BR2_TARGET_GRUB2_INSTALL_TOOLS=y BR2_TARGET_SYSLINUX=y BR2_PACKAGE_HOST_E2FSPROGS=y diff --git a/configs/shredos_i586_defconfig b/configs/shredos_i586_defconfig index f13fac1826..5aff8e35c9 100644 --- a/configs/shredos_i586_defconfig +++ b/configs/shredos_i586_defconfig @@ -172,7 +172,9 @@ BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_I386_PC=y BR2_TARGET_GRUB2_I386_EFI=y BR2_TARGET_GRUB2_BUILTIN_MODULES_PC="boot linux ext2 fat squash4 part_msdos part_gpt normal progress biosdisk all_video video_cirrus video_bochs net tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile" +BR2_TARGET_GRUB2_BUILTIN_CONFIG_PC="board/shredos/embed/grub.cfg" BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile iso9660" +BR2_TARGET_GRUB2_BUILTIN_CONFIG_EFI="board/shredos/embed/grub.cfg" BR2_TARGET_GRUB2_INSTALL_TOOLS=y BR2_TARGET_SYSLINUX=y BR2_PACKAGE_HOST_E2FSPROGS=y diff --git a/configs/shredos_img_defconfig b/configs/shredos_img_defconfig index 11bbe26be7..f175c3149d 100644 --- a/configs/shredos_img_defconfig +++ b/configs/shredos_img_defconfig @@ -165,13 +165,14 @@ BR2_PACKAGE_UTIL_LINUX_SU=y BR2_PACKAGE_UTIL_LINUX_SULOGIN=y BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y -# BR2_TARGET_ROOTFS_ISO9660_INITRD is not set # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_I386_PC=y BR2_TARGET_GRUB2_X86_64_EFI=y BR2_TARGET_GRUB2_BUILTIN_MODULES_PC="boot linux ext2 fat squash4 part_msdos part_gpt normal progress biosdisk all_video video_cirrus video_bochs net tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile" +BR2_TARGET_GRUB2_BUILTIN_CONFIG_PC="board/shredos/embed/grub.cfg" BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile" +BR2_TARGET_GRUB2_BUILTIN_CONFIG_EFI="board/shredos/embed/grub.cfg" BR2_TARGET_GRUB2_INSTALL_TOOLS=y BR2_PACKAGE_HOST_E2FSPROGS=y BR2_PACKAGE_HOST_GENIMAGE=y diff --git a/configs/shredos_img_i586_defconfig b/configs/shredos_img_i586_defconfig index c418514d36..079281d7cc 100644 --- a/configs/shredos_img_i586_defconfig +++ b/configs/shredos_img_i586_defconfig @@ -162,13 +162,14 @@ BR2_PACKAGE_UTIL_LINUX_SU=y BR2_PACKAGE_UTIL_LINUX_SULOGIN=y BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y -# BR2_TARGET_ROOTFS_ISO9660_INITRD is not set # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_I386_PC=y BR2_TARGET_GRUB2_I386_EFI=y BR2_TARGET_GRUB2_BUILTIN_MODULES_PC="boot linux ext2 fat squash4 part_msdos part_gpt normal progress biosdisk all_video video_cirrus video_bochs net tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile" +BR2_TARGET_GRUB2_BUILTIN_CONFIG_PC="board/shredos/embed/grub.cfg" BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile" +BR2_TARGET_GRUB2_BUILTIN_CONFIG_EFI="board/shredos/embed/grub.cfg" BR2_TARGET_GRUB2_INSTALL_TOOLS=y BR2_PACKAGE_HOST_E2FSPROGS=y BR2_PACKAGE_HOST_GENIMAGE=y diff --git a/configs/shredos_iso_aio_defconfig b/configs/shredos_iso_aio_defconfig index 9c79632d01..f89683d4bf 100644 --- a/configs/shredos_iso_aio_defconfig +++ b/configs/shredos_iso_aio_defconfig @@ -174,6 +174,7 @@ BR2_TARGET_ROOTFS_ISO9660_HYBRID=y BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_X86_64_EFI=y BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile iso9660" +BR2_TARGET_GRUB2_BUILTIN_CONFIG_EFI="board/shredos/embed/grub.cfg" BR2_TARGET_GRUB2_INSTALL_TOOLS=y BR2_TARGET_SYSLINUX=y BR2_PACKAGE_HOST_E2FSPROGS=y diff --git a/configs/shredos_iso_aio_i586_defconfig b/configs/shredos_iso_aio_i586_defconfig index c2a97f0012..ca49461e43 100644 --- a/configs/shredos_iso_aio_i586_defconfig +++ b/configs/shredos_iso_aio_i586_defconfig @@ -171,6 +171,7 @@ BR2_TARGET_ROOTFS_ISO9660_HYBRID=y BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_I386_EFI=y BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile iso9660" +BR2_TARGET_GRUB2_BUILTIN_CONFIG_EFI="board/shredos/embed/grub.cfg" BR2_TARGET_GRUB2_INSTALL_TOOLS=y BR2_TARGET_SYSLINUX=y BR2_PACKAGE_HOST_E2FSPROGS=y diff --git a/configs/shredos_iso_defconfig b/configs/shredos_iso_defconfig index 8c16310216..e65a954f22 100644 --- a/configs/shredos_iso_defconfig +++ b/configs/shredos_iso_defconfig @@ -167,12 +167,12 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y -# BR2_TARGET_ROOTFS_ISO9660_INITRD is not set BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_X86_64_EFI=y BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile iso9660" +BR2_TARGET_GRUB2_BUILTIN_CONFIG_EFI="board/shredos/embed/grub.cfg" BR2_TARGET_GRUB2_INSTALL_TOOLS=y BR2_TARGET_SYSLINUX=y BR2_PACKAGE_HOST_E2FSPROGS=y diff --git a/configs/shredos_iso_i586_defconfig b/configs/shredos_iso_i586_defconfig index d1cd8a7802..31679e715b 100644 --- a/configs/shredos_iso_i586_defconfig +++ b/configs/shredos_iso_i586_defconfig @@ -164,12 +164,12 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y -# BR2_TARGET_ROOTFS_ISO9660_INITRD is not set BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_I386_EFI=y BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile iso9660" +BR2_TARGET_GRUB2_BUILTIN_CONFIG_EFI="board/shredos/embed/grub.cfg" BR2_TARGET_GRUB2_INSTALL_TOOLS=y BR2_TARGET_SYSLINUX=y BR2_PACKAGE_HOST_E2FSPROGS=y diff --git a/fs/iso9660/Config.in b/fs/iso9660/Config.in index b26735b02b..1e2424db2b 100644 --- a/fs/iso9660/Config.in +++ b/fs/iso9660/Config.in @@ -120,7 +120,7 @@ config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE string "Grub2 identification file (EFI)" depends on (BR2_TARGET_ROOTFS_ISO9660_GRUB2 || BR2_TARGET_ROOTFS_ISO9660_BOTH) \ && BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER - default "/buildroot" + default "/boot/buildroot" help Use this option to provide a custom name for the identification file that is added to the ISO9660 filesystem, so the EFI bootloader From 2e90372692f5243caf2d196cd714d708f5fba5e3 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Wed, 19 Nov 2025 10:25:37 +0100 Subject: [PATCH 18/35] chore: update buildscript and documentation Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- board/shredos/embed/README | 8 +- build_all_shredos.sh | 490 ++++++++++++++++++++++++++++--------- fs/iso9660/Config.in | 6 +- 3 files changed, 378 insertions(+), 126 deletions(-) diff --git a/board/shredos/embed/README b/board/shredos/embed/README index 13ef99752d..e3370125c1 100644 --- a/board/shredos/embed/README +++ b/board/shredos/embed/README @@ -1,16 +1,16 @@ -This file is embedded into the GRUB bootloaders at build-time -Helps GRUB find our ShredOS volume when it cannot (Ventoy BIOS) +This file is embedded into the GRUB bootloaders at build-time. +Helps GRUB find our ShredOS volume when it cannot (Ventoy BIOS). There is no point to put it anywhere on the USB - so don't do that. Keep consistent with BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE when building any configurations that build both an ISO and the IMG. Do not use the version file as identification file though, because -the ISO9660 filesystem does not have it (but has the needed grub.cfg), +read-only ISO9660 filesystem doesn't have it (but has needed grub.cfg), so you should always use a unique file not otherwise used for anything. Also ensure it is in a location where users cannot delete it by accident. -Note that contrary to the GNU manual the BIOS bootloader seems to need an +Note that contrary to the GNU manual the BIOS bootloader seems to need the explicit "configfile" directive, otherwise the Buildroot static prefix takes precedence over the actual found volume path (which may be entirely different). diff --git a/build_all_shredos.sh b/build_all_shredos.sh index 086e602a0b..b7a398237d 100755 --- a/build_all_shredos.sh +++ b/build_all_shredos.sh @@ -1,68 +1,131 @@ #!/bin/bash +set -euo pipefail ################################################################################ -# Usage: -# FAIL_ON_ERROR=0|1 QUICK_BUILD=0|1 NEW_VERSION="STRING" ./build_all.sh +# Usage: ./build_all_shredos.sh [x64|x32|all] # -# Examples: -# ./build_all.sh -# FAIL_ON_ERROR=0 QUICK_BUILD=0 ./build_all.sh -# NEW_VERSION="2024.11_27_x86-64_0.38" ./build_all.sh +# Arguments: +# x64 - Build only x86-64 configurations +# x32 - Build only i586 (32-bit) configurations +# all - Build all configurations (64-bit first, then 32-bit) # # Environment Variables: -# FAIL_ON_ERROR - 0=continue on failure, 1=exit on first failure (default: 1) -# QUICK_BUILD - 0=full clean between configs, 1=grub2-rebuild only (default: 1) -# NEW_VERSION - Version string (default: prompts user & keeps current on ENTER) +# DRY_RUN=0|1 - Output all commands that would be executed (default: 0) +# PRE_CLEAN=0|1 - Do an initial 'make clean' before starting (default: 1) +# QUICK_BUILD=0|1 - Do not full rebuild for same architecture (default: 0) +# FAST_FAIL=0|1 - Exit on first configuration build failure (default: 1) +# NEW_VERSION=STR - Set version string (default: prompts user) +# +# Examples: +# ./build_all_shredos.sh x64 +# ./build_all_shredos.sh all +# QUICK_BUILD=1 ./build_all_shredos.sh x32 +# NEW_VERSION="2024.11_27_x86-64_0.38" ./build_all_shredos.sh x64 ################################################################################ -################################################################################ -# 0 = continue to the next configuration if one fails to build -# 1 = exit the entire script if one configuration fails to build -FAIL_ON_ERROR="${FAIL_ON_ERROR:-1}" -################################################################################ - -################################################################################ -# 0 = "make clean" between same architecture configs (much slower) -# 1 = "make grub2-rebuild" between same architecture configs (much faster) -QUICK_BUILD="${QUICK_BUILD:-1}" -################################################################################ - -################################################################################ +# Location of the version file: VERSION_FILE="board/shredos/fsoverlay/etc/shredos/version.txt" -x64_configs=( +# 64-bit configurations to build: +X64_CONFIGS=( "shredos_defconfig" "shredos_img_defconfig" "shredos_iso_defconfig" "shredos_iso_aio_defconfig" ) -x32_configs=( +# 32-bit configurations to build: +X32_CONFIGS=( "shredos_i586_defconfig" "shredos_img_i586_defconfig" "shredos_iso_i586_defconfig" "shredos_iso_aio_i586_defconfig" ) + +# Packages always needing rebuild between runs, even for the same architecture. +# This only applies when QUICK_BUILD is enabled, otherwise rebuilds everything. +ALWAYS_REBUILD_PKGS=( + "grub2" +) + ################################################################################ -set -e -trap 'exit 1' SIGINT -trap 'exit 1' SIGTERM +DRY_RUN="${DRY_RUN:-0}" +PRE_CLEAN="${PRE_CLEAN:-1}" +QUICK_BUILD="${QUICK_BUILD:-0}" +FAST_FAIL="${FAST_FAIL:-1}" +NEW_VERSION="${NEW_VERSION:-}" -x64_success=0 -x64_failed=0 -x32_success=0 -x32_failed=0 +X64_SUCCESS=0 +X64_FAILED=0 +X32_SUCCESS=0 +X32_FAILED=0 GREEN="\033[0;32m" +YELLOW="\033[0;33m" RED="\033[0;31m" RESET="\033[0m" +FORCE_CLEAN=0 + +print_usage() { + echo + echo "Usage: $0 [x64|x32|all]" + echo "" + echo "Arguments:" + echo " x64 - Build only x86-64 configurations" + echo " x32 - Build only i586 (32-bit) configurations" + echo " all - Build all configurations (64-bit first, then 32-bit)" + echo "" + echo "Environment Variables:" + echo " DRY_RUN=0|1 - Output all commands that would be executed (default: 0)" + echo " PRE_CLEAN=0|1 - Do an initial 'make clean' before starting (default: 1)" + echo " QUICK_BUILD=0|1 - Do not full rebuild for same architecture (default: 0)" + echo " FAST_FAIL=0|1 - Exit on first failure (default: 1)" + echo " NEW_VERSION=STR - Set version string (default: prompts user)" + echo "" + echo "Examples:" + echo " $0 x64" + echo " $0 all" + echo " QUICK_BUILD=1 PRE_CLEAN=0 $0 x32" + echo +} + +parse_arguments() { + if [ $# -eq 0 ]; then + printf "%b" "$RED" + echo "Error: Missing architecture argument" + printf "%b" "$RESET" + print_usage + exit 1 + fi + + BUILD_TARGET="$1" + case "$BUILD_TARGET" in + x64) + X32_CONFIGS=() + ;; + x32) + X64_CONFIGS=() + ;; + all) + ;; + *) + printf "%b" "$RED" + echo "Error: Invalid architecture '$BUILD_TARGET'" + echo "Must be one of: x64, x32, all" + printf "%b" "$RESET" + print_usage + exit 1 + ;; + esac +} + prompt_version() { - local CURRENT_VERSION="" + local current_version="" if [ -f "$VERSION_FILE" ]; then - CURRENT_VERSION=$(cat "$VERSION_FILE") + current_version=$(cat "$VERSION_FILE") else printf "%b" "$RED" echo @@ -77,8 +140,8 @@ prompt_version() { if [ -z "$NEW_VERSION" ]; then echo echo "x86-64 and i586 will be replaced/switched around during builds (depending on architecture)" - read -rp "Enter new version or press ENTER to keep existing [${CURRENT_VERSION}]: " NEW_VERSION - [ -z "$NEW_VERSION" ] && NEW_VERSION="$CURRENT_VERSION" + read -rp "Enter new version or press ENTER to keep existing [${current_version}]: " NEW_VERSION + [ -z "$NEW_VERSION" ] && NEW_VERSION="$current_version" fi echo "$NEW_VERSION" > "$VERSION_FILE" @@ -93,37 +156,48 @@ prompt_version() { } display_build_plan() { - local total_configs=$((${#x64_configs[@]} + ${#x32_configs[@]})) - + local total_configs=$((${#X64_CONFIGS[@]} + ${#X32_CONFIGS[@]})) + printf "%b" "$GREEN" echo echo "===============================================" echo "PLANNING TO BUILD:" echo "===============================================" - echo "Version: $NEW_VERSION" - echo "Fail on Error: $FAIL_ON_ERROR" - echo "Quick Build: $QUICK_BUILD" - echo "Total Configs: $total_configs" + echo "Version: $NEW_VERSION" + echo "Dry-Run: $DRY_RUN" + echo "Pre-Clean: $PRE_CLEAN" + echo "Quick Build: $QUICK_BUILD" + echo "Fast Failure: $FAST_FAIL" + echo "Total Configurations: $total_configs" + echo "Building Architectures: $BUILD_TARGET" echo "===============================================" echo printf "%b" "$RESET" - - if [ ${#x64_configs[@]} -gt 0 ]; then - echo "64-bit targets (${#x64_configs[@]}):" - for config in "${x64_configs[@]}"; do + + if [ ${#X64_CONFIGS[@]} -gt 0 ]; then + echo "64-bit configurations (${#X64_CONFIGS[@]}):" + for config in "${X64_CONFIGS[@]}"; do echo " - $config" done echo fi - - if [ ${#x32_configs[@]} -gt 0 ]; then - echo "32-bit targets (${#x32_configs[@]}):" - for config in "${x32_configs[@]}"; do + + if [ ${#X32_CONFIGS[@]} -gt 0 ]; then + echo "32-bit configurations (${#X32_CONFIGS[@]}):" + for config in "${X32_CONFIGS[@]}"; do echo " - $config" done echo fi - + + if [ ${#ALWAYS_REBUILD_PKGS[@]} -gt 0 ]; then + echo "Packages that will be re-built between same-architecture runs (${#ALWAYS_REBUILD_PKGS[@]}):" + for package in "${ALWAYS_REBUILD_PKGS[@]}"; do + echo " - $package" + done + echo + fi + printf "%b" "$GREEN" echo "===============================================" echo "Configurations to build can be amended inside the script." @@ -135,94 +209,277 @@ display_build_plan() { replace_version() { local from=$1 local to=$2 + if [ -f "$VERSION_FILE" ]; then - sed -i "s/$from/$to/g" "$VERSION_FILE" + sed -i "s@$from@$to@g" "$VERSION_FILE" fi } +run_cmd() { + if [ "$DRY_RUN" -eq 1 ]; then + echo "[DRY_RUN] $*" + else + "$@" + fi +} + build_config() { - local config=$1 - local arch=$2 + local index="$1" + local config="$2" + local arch="$3" local log_file="dist/${config}.log" + printf "%b" "$YELLOW" echo echo "============================================" - echo "Building $config ($arch)" + echo "Started: '$config' ($arch)" echo "============================================" echo + printf "%b" "$RESET" - if [ "$QUICK_BUILD" -eq 1 ]; then - make "$config" - make grub2-rebuild + # Build | QuickBuild=1, PreClean=1 | QuickBuild=0, PreClean=1 | QuickBuild=1, PreClean=0 | QuickBuild=0, PreClean=0 + # -------|---------------------------|---------------------------|---------------------------|--------------------------- + # x64 #0 | config -> make | config -> make | config -> rebuild -> make | config -> rebuild -> make + # x64 #1 | config -> rebuild -> make | clean -> config -> make | config -> rebuild -> make | clean -> config -> make + # x64 #2+| config -> rebuild -> make | clean -> config -> make | config -> rebuild -> make | clean -> config -> make + # x32 #0 | clean -> config -> make | clean -> config -> make | clean -> config -> make | clean -> config -> make + # x32 #1+| config -> rebuild -> make | clean -> config -> make | config -> rebuild -> make | clean -> config -> make + + if [ "$index" -ne 0 ] && [ "$QUICK_BUILD" -eq 1 ] && [ "$FORCE_CLEAN" -ne 1 ]; then + # If it's not the first configuration, and quick-build is enabled, + # and a clean is not otherwise forced, just rebuild necessary packages. + echo + echo "============================================" + echo "Loading configuration '$config' ($arch)..." + echo "============================================" + echo + if ! run_cmd make "$config"; then + build_config_failed "$config" "$arch" "$log_file" + return 1 + fi + echo + echo "============================================" + echo "Rebuilding packages for '$config' ($arch)..." + echo "============================================" + echo + for pkg in "${ALWAYS_REBUILD_PKGS[@]}"; do + if ! run_cmd make "${pkg}-rebuild"; then + build_config_failed "$config" "$arch" "$log_file" + return 1 + fi + done else - make clean - make "$config" + if [ "$index" -ne 0 ] || [ "$FORCE_CLEAN" -eq 1 ]; then + # If it's not the first configuration, or the clean was forced + # (due to architecture change), clean the building environment. + echo + echo "============================================" + echo "Running 'make clean' for '$config' ($arch)..." + echo "============================================" + echo + if ! run_cmd make clean; then + build_config_failed "$config" "$arch" "$log_file" + return 1 + fi + fi + echo + echo "============================================" + echo "Loading configuration '$config' ($arch)..." + echo "============================================" + echo + if ! run_cmd make "$config"; then + build_config_failed "$config" "$arch" "$log_file" + return 1 + fi + if [ "$index" -eq 0 ] && [ "$PRE_CLEAN" -eq 0 ] && [ "$FORCE_CLEAN" -ne 1 ]; then + # If it's the first configuration in a deliberately unclean environment, + # and clean was not otherwise forced, at least rebuild the necessary packages. + echo + echo "============================================" + echo "Rebuilding packages for '$config' ($arch)..." + echo "============================================" + echo + for pkg in "${ALWAYS_REBUILD_PKGS[@]}"; do + if ! run_cmd make "${pkg}-rebuild"; then + build_config_failed "$config" "$arch" "$log_file" + return 1 + fi + done + fi fi - [ ! "$FAIL_ON_ERROR" -eq 1 ] && set +e - make 2>&1 | tee "$log_file" - local make_status=${PIPESTATUS[0]} - [ ! "$FAIL_ON_ERROR" -eq 1 ] && set -e + FORCE_CLEAN=0 # Reset previous dirty state - if [ "$make_status" -eq 0 ]; then - mv "$log_file" "dist/${config}-SUCCESS.log" - - mkdir -p "dist/$config" - mv output/images/shredos*.iso "dist/$config/" 2>/dev/null || true - mv output/images/shredos*.img "dist/$config/" 2>/dev/null || true - - printf "%b" "$GREEN" + echo + echo "============================================" + echo "Building '$config' ($arch)..." + echo "============================================" + echo + if run_cmd make 2>&1 | tee "$log_file"; then echo - echo "===============================================" - echo "$config build ($arch) success" - echo "===============================================" + echo "============================================" + echo "Finishing '$config' ($arch)..." + echo "============================================" echo - printf "%b\n" "$RESET" - - if [ "$arch" = "x64" ]; then - ((x64_success++)) - else - ((x32_success++)) - fi + build_config_success "$config" "$arch" "$log_file" return 0 else - mv "$log_file" "dist/${config}-FAILED.log" + echo + echo "============================================" + echo "Finishing '$config' ($arch)..." + echo "============================================" + echo + build_config_failed "$config" "$arch" "$log_file" + return 1 + fi +} +print_summary() { + local total_success=$((X64_SUCCESS + X32_SUCCESS)) + local total_failed=$((X64_FAILED + X32_FAILED)) + local total_builds=$((total_success + total_failed)) + + echo + echo "============================================" + echo "BUILD SUMMARY" + echo "============================================" + echo "64-bit builds: $X64_SUCCESS succeeded, $X64_FAILED failed" + echo "32-bit builds: $X32_SUCCESS succeeded, $X32_FAILED failed" + echo "--------------------------------------------" + echo "Total: $total_success succeeded, $total_failed failed (out of $total_builds)" + echo "--------------------------------------------" + echo "You will find all output files of the builds in the 'dist/' folder." + echo "============================================" + echo +} + +build_config_success() { + local config="$1" + local arch="$2" + local log_file="$3" + + if [ -f "$log_file" ]; then + run_cmd mv "$log_file" "dist/${config}-SUCCESS.log" + fi + + run_cmd mkdir -p "dist/$config" + run_cmd mv output/images/shredos*.iso "dist/$config/" 2>/dev/null || true + run_cmd mv output/images/shredos*.img "dist/$config/" 2>/dev/null || true + + printf "%b" "$GREEN" + echo + echo "===============================================" + echo "SUCCESS: '$config' ($arch)" + echo "===============================================" + echo + printf "%b" "$RESET" + + if [ "$arch" = "x64" ]; then + ((X64_SUCCESS++)) + else + ((X32_SUCCESS++)) + fi +} + +build_config_failed() { + local config="$1" + local arch="$2" + local log_file="$3" + + if [ -f "$log_file" ]; then + run_cmd mv "$log_file" "dist/${config}-FAILED.log" + fi + + printf "%b" "$RED" + echo + echo "===============================================" + echo "FAILURE: '$config' ($arch)" + echo "===============================================" + echo + printf "%b" "$RESET" + + if [ "$arch" = "x64" ]; then + ((X64_FAILED++)) + else + ((X32_FAILED++)) + fi + + if [ "$FAST_FAIL" -eq 1 ]; then printf "%b" "$RED" echo echo "===============================================" - echo "$config build ($arch) failed" + echo "Fast Failure Mode is enabled - not proceeding..." echo "===============================================" echo - printf "%b\n" "$RESET" - - if [ "$arch" = "x64" ]; then - ((x64_failed++)) - else - ((x32_failed++)) - fi - return 1 + printf "%b" "$RESET" + exit 1 fi } ################################################################################ +parse_arguments "$@" prompt_version display_build_plan -echo "Starting these builds in 10 seconds... (press CTRL+C to cancel)" +if [ "$DRY_RUN" -eq 1 ]; then + printf "%b" "$YELLOW" + echo + echo "===============================================" + echo "DRY RUN - NO ACTUAL CHANGES WILL BE MADE" + echo "DISREGARD WARNINGS ABOUT 'MAKE CLEAN' ETC..." + echo "===============================================" + echo + printf "%b" "$RESET" +fi + +if [ "$PRE_CLEAN" -eq 1 ]; then + printf "%b" "$RED" + echo + echo "===============================================" + echo "Beware - WILL run a MAKE CLEAN before starting building!" + echo "Press ENTER in the next 10 seconds to skip this step..." + echo "or otherwise (if you want to MAKE CLEAN) - just wait..." + echo "===============================================" + echo + printf "%b" "$RESET" + + if read -rt 10; then + PRE_CLEAN=0 + echo "Skipped cleaning the building stage (no 'make clean')..." + fi +fi + +printf "%b" "$YELLOW" +echo +echo "===============================================" +echo "Starting build in 10 seconds... (press CTRL+C to cancel)" +if [ "$PRE_CLEAN" -eq 1 ]; then + printf "%b" "$RESET" + printf "%b" "$RED" + echo "Beware - WILL run a MAKE CLEAN before starting building!" + printf "%b" "$RESET" + printf "%b" "$YELLOW" +fi +echo "===============================================" +echo +printf "%b" "$RESET" + sleep 10 -echo "Running 'make clean' on the building environment..." -make clean +if [ "$PRE_CLEAN" -eq 1 ]; then + echo "Running 'make clean' on the building environment..." + run_cmd make clean +fi echo "Removing and recreating 'dist/' folder (if it exists)..." -rm -r dist || true -mkdir -p dist +run_cmd rm -r dist || true +run_cmd mkdir -p dist echo "Starting to build..." +trap 'print_summary' EXIT -if [ ${#x64_configs[@]} -gt 0 ]; then +if [ ${#X64_CONFIGS[@]} -gt 0 ]; then echo echo "===============================================" echo "Starting 64-bit builds..." @@ -230,14 +487,19 @@ if [ ${#x64_configs[@]} -gt 0 ]; then echo replace_version "i586" "x86-64" - for config in "${x64_configs[@]}"; do - build_config "$config" "x64" || true + CFG_INDEX=0 + for config in "${X64_CONFIGS[@]}"; do + build_config "$CFG_INDEX" "$config" "x64" || true + ((++CFG_INDEX)) done fi -make clean +if [ ${#X32_CONFIGS[@]} -gt 0 ]; then + if [ ${#X64_CONFIGS[@]} -gt 0 ]; then + run_cmd make clean + FORCE_CLEAN=1 # Need this for architecture change + fi -if [ ${#x32_configs[@]} -gt 0 ]; then echo echo "===============================================" echo "Starting 32-bit builds..." @@ -245,29 +507,15 @@ if [ ${#x32_configs[@]} -gt 0 ]; then echo replace_version "x86-64" "i586" - for config in "${x32_configs[@]}"; do - build_config "$config" "x32" || true + CFG_INDEX=0 + for config in "${X32_CONFIGS[@]}"; do + build_config "$CFG_INDEX" "$config" "x32" || true + ((++CFG_INDEX)) done fi -total_success=$((x64_success + x32_success)) -total_failed=$((x64_failed + x32_failed)) -total_builds=$((total_success + total_failed)) - -echo -echo "============================================" -echo "BUILD SUMMARY" -echo "============================================" -echo "64-bit builds: $x64_success succeeded, $x64_failed failed" -echo "32-bit builds: $x32_success succeeded, $x32_failed failed" -echo "--------------------------------------------" -echo "Total: $total_success succeeded, $total_failed failed (out of $total_builds)" -echo "--------------------------------------------" -echo "You will find all output files of the builds in the 'dist/' folder." -echo "============================================" -echo - -if [ $total_failed -gt 0 ]; then +TOTAL_FAILED=$((X64_FAILED + X32_FAILED)) +if [ "$TOTAL_FAILED" -gt 0 ]; then exit 1 else exit 0 diff --git a/fs/iso9660/Config.in b/fs/iso9660/Config.in index 1e2424db2b..690586de60 100644 --- a/fs/iso9660/Config.in +++ b/fs/iso9660/Config.in @@ -106,13 +106,17 @@ config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU default "fs/iso9660/efigrub.cfg" help Use this option to provide a custom GRUB2 configuration - file (grub.cfg), embedded both in the EFI partition and the + file (grub.cfg), copied both to the EFI partition and the ISO9660 filesystem EFI-structure (for an EFI bootloader to find). It will usually contain a "search" and "source" directive to find the ISO9660 filesystem containing a common (BIOS) GRUB2 configuration. Alternatively, 'set root=(cd0)' and other such quirks are possible here. + This is specifically for directives required for ISO9660 builds, for + baking an EFI search config into the common GRUB image (often better) + check out instead the GRUB2 setting: BR2_TARGET_GRUB2_BUILTIN_CONFIG_EFI + Note that any string __EFI_ID_FILE__ will automatically be replaced with the BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE. From 15b889ddf93ef93ba18343afd06644fe3e46f32b Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Thu, 20 Nov 2025 08:04:51 +0100 Subject: [PATCH 19/35] chore: add warning about customization to ISO Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- board/shredos/README-ISO.txt | 5 +++++ board/shredos/populate_efi_partition.sh | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 board/shredos/README-ISO.txt diff --git a/board/shredos/README-ISO.txt b/board/shredos/README-ISO.txt new file mode 100644 index 0000000000..23232b0f49 --- /dev/null +++ b/board/shredos/README-ISO.txt @@ -0,0 +1,5 @@ +Do not modify the grub.cfg file in this folder trying to customize ShredOS +behavior. The ISO file does not support such customizations, and you should use +the IMG release instead (where you can modify the actual GRUB configuration) + +Get it from: https://github.com/PartialVolume/shredos.x86_64 diff --git a/board/shredos/populate_efi_partition.sh b/board/shredos/populate_efi_partition.sh index 8aeaca9f8a..1694f658de 100755 --- a/board/shredos/populate_efi_partition.sh +++ b/board/shredos/populate_efi_partition.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash -e # # BR2_ROOTFS_POST_BUILD_SCRIPT for shredos_iso_aio configurations # @@ -18,6 +18,7 @@ mkdir -p "${BINARIES_DIR}/efi-part/boot/" cp "board/shredos/autorun.inf" "${BINARIES_DIR}/efi-part/autorun.inf" || exit 1 cp "board/shredos/README.txt" "${BINARIES_DIR}/efi-part/README.txt" || exit 1 +cp "board/shredos/README-ISO.txt" "${BINARIES_DIR}/efi-part/EFI/BOOT/README.txt" || exit 1 cp "board/shredos/shredos.ico" "${BINARIES_DIR}/efi-part/shredos.ico" || exit 1 cp "board/shredos/fsoverlay/etc/shredos/version.txt" "${BINARIES_DIR}/efi-part/boot/version.txt" || exit 1 From 2035670a8e593a6c610007019b0a27ca868eee65 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Thu, 20 Nov 2025 08:11:59 +0100 Subject: [PATCH 20/35] chore: update documentation Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- README.md | 76 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 926066b416..516a7a1021 100644 --- a/README.md +++ b/README.md @@ -41,10 +41,10 @@ NOTE! There may be pre-release versions that are newer than the latest versions ### For all releases including latest and more recent pre-releases [releases](https://github.com/PartialVolume/shredos.x86_64/releases) -Note for versions **after** _v2024.11_27_x86-64_0.38_: The .img files for burning to USB flash drives support both BIOS/UEFI booting, as well as saving of generated PDF reports to the USB flash drive. The .iso image supports both BIOS/UEFI booting, as well as burning to USB flash drives and CD/DVD-ROM, but not saving of generated PDF reports to USB flash drive (if being written to one, due to filesystem constraints). +Note for versions **after** _v2024.11_27_x86-64_0.38_: The .img files for burning to USB flash drives support both BIOS/UEFI booting, as well as saving of generated PDF reports to the USB flash drive. The .iso image also supports both BIOS/UEFI booting, burning to USB flash drives and CD/DVD-ROM, as well as saving of generated PDF reports to USB flash drive (if being written to one). But use the .img file whenever planning to customize ShredOS (`autonuke` setups, kernel parameters, ...), as it will allow direct permanent modification of the GRUB boot menu and appending of kernel parameters, which the .iso file does not support due to filesystem constraints. Note for versions **until** _v2024.11_27_x86-64_0.38_: The .img files for burning to USB flash drives support both BIOS/UEFI booting. The .iso image supports legacy BIOS booting only and not UEFI, however, a BIOS/UEFI version of the .iso is available in newer ShredOS versions. -You can also consider [VENTOY (Open Source tool to create bootable USB drive for ISO/WIM/IMG/VHD(x)/EFI files)](https://github.com/ventoy/Ventoy) as a workaround to avoid bios/UEFI issues. +You can also consider [VENTOY (Open Source tool to create bootable USB drive for ISO/WIM/IMG/VHD(x)/EFI files)](https://github.com/ventoy/Ventoy) as a workaround to avoid BIOS/UEFI issues. #### Demo video below: ShredOS automatically displays Nwipe's interactive GUI at boot. You can then select one or more drives to be erased, wipe method or pattern to be used, number of rounds, whether a zeros blanking pass is applied, verification options such as last pass, all passes or no verification. ShredOS and nwipe are highly configurable so if you prefer to run nwipe without a GUI then you can configure nwipe by applying nwipe options to the linux command line in grub.cfg on the USB flash drive. @@ -112,7 +112,7 @@ disks using the program [nwipe](https://github.com/martijnvanbrummelen/nwipe). I ShredOS supports either 32bit or 64bit processors. You will need to download the appropriate 64bit or 32bit .img or .iso file, depending upon your target processor and whether you want to burn ShredOS to a USB memory stick, in which case you would download the .img file. Alternatively, if you wanted to burn ShredOS to CD/DVD, then you would download the .iso file. -Because ShredOS boots and runs straight from a USB flash drive or DVD/CD, it doesn't matter what operating system already exists on the computer. It will remove all data/directories/operating systems, from the drive or drives you have selected for wiping, leaving a disk with no trace of what originally existed. It will wipe PCs & Intel-based Macs, such as MacBookPros. It doesn't care what operating system previosuly existed, be it Windows/Mac OSX/Linux/VXWorks. +Because ShredOS boots and runs straight from a USB flash drive or DVD/CD, it doesn't matter what operating system already exists on the computer. It will remove all data/directories/operating systems, from the drive or drives you have selected for wiping, leaving a disk with no trace of what originally existed. It will wipe PCs & Intel-based Macs, such as MacBookPros. It doesn't care what operating system previously existed, be it Windows/Mac OSX/Linux/VXWorks. ShredOS can be used as a software image and booted via the network using a client PC that supports Preboot execution environment (PXE) via a PXE enabled server. A procedure for creating a simple UEFI PXE server based on Debian/Ubuntu and serving up ShredOS can be found here [#148](https://github.com/PartialVolume/shredos.x86_64/discussions/148) @@ -130,8 +130,8 @@ This paragraph is for those that are not familiar with wiping disks. if you know ## Nwipe's erasure methods -* Fill With Zeros - Fills the device with zeros (0x00), one round only. -* Fill With Ones - Fills the device with ones (0xFF), one round only. +* Fill With Zeros - Fills the device with zeros (0x00). +* Fill With Ones - Fills the device with ones (0xFF). * RCMP TSSIT OPS-II - Royal Canadian Mounted Police Technical Security Standard, OPS-II * DoD Short - The American Department of Defense 5220.22-M short 3 pass wipe (passes 1, 2 & 7). * DoD 5220.22M - The American Department of Defense 5220.22-M full 7 pass wipe. @@ -784,16 +784,29 @@ The image (.img) file is approximately 260 MiB and can be written to a USB memor #### Install the following prerequisite software first. Without this software, the make command will fail ``` -$ sudo apt install git -$ sudo apt install build-essential pkg-config automake libncurses5-dev autotools-dev libparted-dev dmidecode coreutils smartmontools unzip -$ sudo apt-get install libssl-dev -$ sudo apt-get install libelf-dev -$ sudo apt-get install mtools +sudo apt update +sudo apt install \ + automake \ + autotools-dev \ + build-essential \ + cpio \ + coreutils \ + dmidecode \ + dosfstools \ + git \ + libelf-dev \ + libncurses5-dev \ + libparted-dev \ + libssl-dev \ + mtools \ + pkg-config \ + smartmontools \ + unzip ``` #### Download the ShredOS source using the git clone command, build ShredOS and write to a USB memory device. ``` -$ git clone https://github.com/PartialVolume/shredos.x86_64.git (or shredos.i686.git for 32bit) +$ git clone https://github.com/PartialVolume/shredos.x86_64.git $ cd shredos $ mkdir package/shredos $ touch package/shredos/Config.in @@ -818,15 +831,28 @@ $ dd if=shredos-20200412.img of=/dev/sdx (20200412 will be the day you compiled, Do note that loading a configuration should typically be the last step before `make`. -> **The all-in-one ISOs unite the functionality of all other formats:** +> **The all-in-one hybrid ISOs unite most functionality of all other formats:** > >- are BIOS and UEFI bootable >- can both be written to CD/DVD-ROM and USB flash drives >- have a writeable partition (when written to a USB flash drive) +>- **but** do not allow customization of GRUB (for `autonuke`, ...) > ->The **legacy** hybrid ISOs, however, do not have that writeable partition (but ->are slightly smaller in size), which means that you cannot make modifications ->or have any PDFs written out (when using them burned to an USB flash drive). +>The **legacy** hybrid ISOs do not have that writeable partition (but are +>slightly smaller in size), which means that you cannot add any files or have +>any PDFs written to them (even when using them burned to an USB flash drive). + +#### Building multiple configurations: + +Generally when building multiple of the above configurations on the **same +architecture**, you only need to ensure `make grub2-rebuild` is run between any +two configurations, unless you have made other changes to the project. For two +configurations of **different architectures**, a full `make clean` is always +required for the switch-over between two different architectures. + +For your convenience, look also into the `build_all_shredos.sh` script in the +project root. If you invoke it with no arguments, it will show a usage manual +and allow you to build multiple configuration targets with more ease. ### Issues that you may get when building ShredOS - **Error: "Internal Size Too Big"** If you are compiling the vanilla version of ShredOS and have made no alterations or additions but it fails to build the .img with the error "Internal error: size too big" then you may have a version of mtools that has a version of mcopy which has a bug whenever the -b option is used. This bug is known to exist in mcopy version 4.0.32 and maybe others but is fixed in v4.0.42. The solution is to upgrade your copy of mtools to a later version. However, if you have altered ShredOS by adding more packages you may need to update the size of the fat32 partition. You can do this by increasing the 'size' in ../board/shredos/genimage.cfg. Depending on how much extra software you have added increase the size by 10MB or more. Currently as of March 2023 the current size is `size = 130000000`, this is in bytes, so adding 10MB will mean you need to edit this value so that it reads `size = 140000000`. After the edit, just run `make` which will result in a quicker build. You don't need to run `make clean` first as that would result in a full rebuild which is not neccessary when all you are doing is increasing the final image size. If your repository does not supply a later version of mtools, then you can obtain mtools packages for various distros from [here](https://www.gnu.org/software/mtools/#downloads) @@ -858,24 +884,40 @@ make busybox-menuconfig make busybox-update-config # save the changes ``` ### Important ShredOS files and folders when building ShredOS from source - +#### ../build_all_shredos.sh +build_all_shredos.sh is a convenience script to build (multiple) ShredOS. +If launched without arguments, it will show a usage manual on the screen. + #### ../board/shredos/make_img_file.sh make_img_file.sh is a bash script, the main purpose of which is to generate the .img file located in output/images/. However it is also used to copy the compiled .efi file and other files such as the shredos.ico, autorun.inf for Windows, README.txt. The contents of board/shredos/version.txt is also used to rename the .img file with version info and the current date and time. #### ../board/shredos/make_iso_file.sh make_iso_file.sh is a bash script, the main purpose of which is to generate the .iso file located in output/images/. The contents of board/shredos/version.txt is used to rename the .iso file with version info and the current date and time. +#### ../board/shredos/populate_efi_partition.sh +populate_efi_partition.sh is a bash script that copies the ShredOS files +(similar ones as `make_img_file.sh`) to the UEFI partition of the ISO image. + #### ../board/shredos/grub.cfg The USB image's GRUB configuration, which both the BIOS and UEFI bootloader will use. +It contains the BIOS and UEFI boot menu for the USB image. + +#### ../board/shredos/embed/grub.cfg +The GRUB configuration that is embedded into the GRUB images at build-time. +It contains directions for GRUB to find the right volume and GRUB configuration. +This applies for both the USB images and ISO images, and both for BIOS and UEFI. #### ../fs/iso9660/isolinux.cfg The ISO image's ISOLINUX configuration, which the BIOS bootloader will use. +It contains the BIOS boot menu for the ISO image. #### ../fs/iso9660/grub.cfg The ISO image's GRUB configuration, which the UEFI bootloader will use. +It contains the UEFI boot menu for the ISO image. #### ../fs/iso9660/efigrub.cfg -The ISO image's GRUB configuration for UEFI, used to find the ISO9660 filesystem. +The GRUB configuration that is embedded into the ISO's UEFI partition. +It contains directions for GRUB to find the ISO9660 FS and GRUB configuration. #### ../board/shredos/fsoverlay/etc/shredos/version.txt This file contains the version information as seen in the title on nwipe's title bar, i.e. '2021.08.2_22_x86-64_0.32.023'. This version ingformation is also used when naming the .img file in ../output/images/ ../board/shredos/fsoverlay/etc/shredos/version.txt is manually updated for each new release of ShredOS. From 2134454147548b267acbf372d4b24e63a0eeacc5 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Thu, 20 Nov 2025 08:19:29 +0100 Subject: [PATCH 21/35] fix: amend buildscript Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- .gitignore | 1 + build_all_shredos.sh | 82 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 64 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 226c439357..808fddec95 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ /output /dist /dl +/build_all_shredos.log /.auto.deps /.config.cmd /.config.old diff --git a/build_all_shredos.sh b/build_all_shredos.sh index b7a398237d..4c4e5f4b4f 100755 --- a/build_all_shredos.sh +++ b/build_all_shredos.sh @@ -75,7 +75,7 @@ print_usage() { echo "Arguments:" echo " x64 - Build only x86-64 configurations" echo " x32 - Build only i586 (32-bit) configurations" - echo " all - Build all configurations (64-bit first, then 32-bit)" + echo " all - Build all configurations (64-bit first, then 32-bit)" echo "" echo "Environment Variables:" echo " DRY_RUN=0|1 - Output all commands that would be executed (default: 0)" @@ -144,7 +144,7 @@ prompt_version() { [ -z "$NEW_VERSION" ] && NEW_VERSION="$current_version" fi - echo "$NEW_VERSION" > "$VERSION_FILE" + run_cmd_change_version "$NEW_VERSION" printf "%b" "$GREEN" echo @@ -211,16 +211,53 @@ replace_version() { local to=$2 if [ -f "$VERSION_FILE" ]; then - sed -i "s@$from@$to@g" "$VERSION_FILE" + run_cmd sed -i "s@$from@$to@g" "$VERSION_FILE" fi } run_cmd() { - if [ "$DRY_RUN" -eq 1 ]; then - echo "[DRY_RUN] $*" - else - "$@" - fi + local timestamp + timestamp=$(date '+%d.%m.%Y %H:%M:%S') + + if [ "$DRY_RUN" -eq 1 ]; then + if [[ $* == make* ]]; then + printf "%b" "$YELLOW" + echo "[DRY_RUN] $*" + printf "%b" "$RESET" + else + echo "[DRY_RUN] $*" + fi + else + echo "[$timestamp] $*" >> "build_all_shredos.log" + "$@" + fi +} + +run_cmd_tee() { + local timestamp + timestamp=$(date '+%d.%m.%Y %H:%M:%S') + local log_file="$1" + + if [ "$DRY_RUN" -eq 1 ]; then + echo "[DRY_RUN] tee $log_file" + cat + else + echo "[$timestamp] tee $log_file" >> "build_all_shredos.log" + tee "$log_file" + fi +} + +run_cmd_change_version() { + local timestamp + timestamp=$(date '+%d.%m.%Y %H:%M:%S') + local new_version="$1" + + if [ "$DRY_RUN" -eq 1 ]; then + echo "[DRY_RUN] echo \"$new_version\" > \"$VERSION_FILE\"" + else + echo "[$timestamp] echo \"$new_version\" > \"$VERSION_FILE\"" >> "build_all_shredos.log" + echo "$new_version" > "$VERSION_FILE" + fi } build_config() { @@ -229,7 +266,7 @@ build_config() { local arch="$3" local log_file="dist/${config}.log" - printf "%b" "$YELLOW" + printf "%b" "$YELLOW" echo echo "============================================" echo "Started: '$config' ($arch)" @@ -315,7 +352,7 @@ build_config() { echo "Building '$config' ($arch)..." echo "============================================" echo - if run_cmd make 2>&1 | tee "$log_file"; then + if run_cmd make 2>&1 | run_cmd_tee "$log_file"; then echo echo "============================================" echo "Finishing '$config' ($arch)..." @@ -334,7 +371,8 @@ build_config() { fi } -print_summary() { +print_summary_and_exit() { + local return_code="$1" local total_success=$((X64_SUCCESS + X32_SUCCESS)) local total_failed=$((X64_FAILED + X32_FAILED)) local total_builds=$((total_success + total_failed)) @@ -349,8 +387,17 @@ print_summary() { echo "Total: $total_success succeeded, $total_failed failed (out of $total_builds)" echo "--------------------------------------------" echo "You will find all output files of the builds in the 'dist/' folder." + echo "Check 'build_all_shredos.log' for all the commands that were executed." echo "============================================" echo + + if [ "$return_code" -ne 0 ]; then + exit "$return_code" + elif [ "$total_failed" -gt 0 ]; then + exit 1 + else + exit 0 + fi } build_config_success() { @@ -418,6 +465,10 @@ build_config_failed() { ################################################################################ +if [ -f "build_all_shredos.log" ]; then + rm build_all_shredos.log +fi + parse_arguments "$@" prompt_version display_build_plan @@ -477,7 +528,7 @@ run_cmd rm -r dist || true run_cmd mkdir -p dist echo "Starting to build..." -trap 'print_summary' EXIT +trap 'print_summary_and_exit $?' EXIT if [ ${#X64_CONFIGS[@]} -gt 0 ]; then echo @@ -513,10 +564,3 @@ if [ ${#X32_CONFIGS[@]} -gt 0 ]; then ((++CFG_INDEX)) done fi - -TOTAL_FAILED=$((X64_FAILED + X32_FAILED)) -if [ "$TOTAL_FAILED" -gt 0 ]; then - exit 1 -else - exit 0 -fi From 589f08752abbac388c365c94b865d75281cb6d2b Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Thu, 20 Nov 2025 12:15:01 +0100 Subject: [PATCH 22/35] fix(buildscript): use reconfigure instead of rebuild Reconfigure starts one stage before rebuild, just to be safe. It is the earliest step after the source download and patching. Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- README.md | 14 +++++++++----- build_all_shredos.sh | 8 ++++++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 516a7a1021..8b39eeb9aa 100644 --- a/README.md +++ b/README.md @@ -844,11 +844,15 @@ Do note that loading a configuration should typically be the last step before `m #### Building multiple configurations: -Generally when building multiple of the above configurations on the **same -architecture**, you only need to ensure `make grub2-rebuild` is run between any -two configurations, unless you have made other changes to the project. For two -configurations of **different architectures**, a full `make clean` is always -required for the switch-over between two different architectures. +Generally, when building multiple configurations of the above on the same +architecture, you only need to ensure that `make` and `make grub2-reconfigure` +are run between any two configurations. The same applies to any other package +whose configuration has changed, adding corresponding `-reconfigure` +steps. A `make clean` step is not usually required unless you have made +significant changes to the project, which should save time with such builds. + +For two configurations targeting different architectures, a full `make clean` +is always required when switching between them, plan time for this (takes long). For your convenience, look also into the `build_all_shredos.sh` script in the project root. If you invoke it with no arguments, it will show a usage manual diff --git a/build_all_shredos.sh b/build_all_shredos.sh index 4c4e5f4b4f..5b65114589 100755 --- a/build_all_shredos.sh +++ b/build_all_shredos.sh @@ -300,7 +300,9 @@ build_config() { echo "============================================" echo for pkg in "${ALWAYS_REBUILD_PKGS[@]}"; do - if ! run_cmd make "${pkg}-rebuild"; then + # Reconfigure starts one stage before rebuild, just to be safe. + # It is the earliest step after the source download and patching. + if ! run_cmd make "${pkg}-reconfigure"; then build_config_failed "$config" "$arch" "$log_file" return 1 fi @@ -337,7 +339,9 @@ build_config() { echo "============================================" echo for pkg in "${ALWAYS_REBUILD_PKGS[@]}"; do - if ! run_cmd make "${pkg}-rebuild"; then + # Reconfigure starts one stage before rebuild, just to be safe. + # It is the earliest step after the source download and patching. + if ! run_cmd make "${pkg}-reconfigure"; then build_config_failed "$config" "$arch" "$log_file" return 1 fi From d417261a766f64d826624cbce906b7841dca49b1 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Thu, 20 Nov 2025 14:15:43 +0100 Subject: [PATCH 23/35] chore: reorganize all files into board/shredos It is more convenient to not have to search for configuration files in different directories, and also helpful to see the standard configuration files, so move all ShredOS configurations into board/shredos. Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- README.md | 6 +++--- board/shredos/embed/grub.cfg | 2 +- board/shredos/genimage.cfg | 2 +- board/shredos/genimage_i586.cfg | 2 +- board/shredos/iso/README | 8 ++++++++ board/shredos/iso/efigrub.cfg | 3 +++ board/shredos/iso/grub.cfg | 12 ++++++++++++ board/shredos/iso/isolinux.cfg | 15 +++++++++++++++ build_all_shredos.sh | 2 +- configs/shredos_defconfig | 4 ++++ configs/shredos_i586_defconfig | 4 ++++ configs/shredos_iso_aio_defconfig | 4 ++++ configs/shredos_iso_aio_i586_defconfig | 4 ++++ configs/shredos_iso_defconfig | 4 ++++ configs/shredos_iso_i586_defconfig | 4 ++++ fs/iso9660/README | 8 ++++++++ fs/iso9660/grub.cfg | 13 ++++--------- fs/iso9660/isolinux.cfg | 17 +++-------------- 18 files changed, 84 insertions(+), 30 deletions(-) create mode 100644 board/shredos/iso/README create mode 100644 board/shredos/iso/efigrub.cfg create mode 100644 board/shredos/iso/grub.cfg create mode 100644 board/shredos/iso/isolinux.cfg create mode 100644 fs/iso9660/README diff --git a/README.md b/README.md index 8b39eeb9aa..141b412e18 100644 --- a/README.md +++ b/README.md @@ -911,15 +911,15 @@ The GRUB configuration that is embedded into the GRUB images at build-time. It contains directions for GRUB to find the right volume and GRUB configuration. This applies for both the USB images and ISO images, and both for BIOS and UEFI. -#### ../fs/iso9660/isolinux.cfg +#### ../board/shredos/iso/isolinux.cfg The ISO image's ISOLINUX configuration, which the BIOS bootloader will use. It contains the BIOS boot menu for the ISO image. -#### ../fs/iso9660/grub.cfg +#### ../board/shredos/iso/grub.cfg The ISO image's GRUB configuration, which the UEFI bootloader will use. It contains the UEFI boot menu for the ISO image. -#### ../fs/iso9660/efigrub.cfg +#### ../board/shredos/iso/efigrub.cfg The GRUB configuration that is embedded into the ISO's UEFI partition. It contains directions for GRUB to find the ISO9660 FS and GRUB configuration. diff --git a/board/shredos/embed/grub.cfg b/board/shredos/embed/grub.cfg index c036fc5671..e41461a533 100644 --- a/board/shredos/embed/grub.cfg +++ b/board/shredos/embed/grub.cfg @@ -1,3 +1,3 @@ -search --file --set=root /boot/buildroot +search --file --set=root /boot/shredos.id set prefix=($root)/boot/grub configfile $prefix/grub.cfg diff --git a/board/shredos/genimage.cfg b/board/shredos/genimage.cfg index 27e9a77ee2..ef3b90872d 100644 --- a/board/shredos/genimage.cfg +++ b/board/shredos/genimage.cfg @@ -4,7 +4,7 @@ image boot.vfat { file boot/bzImage { image = 'bzImage' } file boot/grub/grub.cfg { image = 'grub.cfg' } file boot/version.txt { image = 'version.txt' } - file boot/buildroot { image = '/dev/null' } + file boot/shredos.id { image = '/dev/null' } file EFI/BOOT/bootx64.efi { image = 'bootx64.efi' } file EFI/BOOT/grub.cfg { image = 'grub.cfg' } file shredos.ico { image = 'shredos.ico' } diff --git a/board/shredos/genimage_i586.cfg b/board/shredos/genimage_i586.cfg index 97182ed8e7..770d4fe68b 100644 --- a/board/shredos/genimage_i586.cfg +++ b/board/shredos/genimage_i586.cfg @@ -4,7 +4,7 @@ image boot.vfat { file boot/bzImage { image = 'bzImage' } file boot/grub/grub.cfg { image = 'grub.cfg' } file boot/version.txt { image = 'version.txt' } - file boot/buildroot { image = '/dev/null' } + file boot/shredos.id { image = '/dev/null' } file EFI/BOOT/bootia32.efi { image = 'bootia32.efi' } file EFI/BOOT/grub.cfg { image = 'grub.cfg' } file shredos.ico { image = 'shredos.ico' } diff --git a/board/shredos/iso/README b/board/shredos/iso/README new file mode 100644 index 0000000000..bc465b7fa7 --- /dev/null +++ b/board/shredos/iso/README @@ -0,0 +1,8 @@ +ISO9660 filesystem was updated to modern standards as of 20/11/2025. +The changes have - at the time of this writing - not been upstreamed. +Do compare (and port 'fs/iso9660' over) when updating the Buildroot release. + +The following variables are filled in at build-time: + - __EFI_ID_FILE__ + - __KERNEL_PATH__ + - __INITRD_PATH__ (automatically removed if not used) diff --git a/board/shredos/iso/efigrub.cfg b/board/shredos/iso/efigrub.cfg new file mode 100644 index 0000000000..a8f2c567eb --- /dev/null +++ b/board/shredos/iso/efigrub.cfg @@ -0,0 +1,3 @@ +search --file --set=root __EFI_ID_FILE__ +set prefix=($root)/boot/grub +source $prefix/grub.cfg diff --git a/board/shredos/iso/grub.cfg b/board/shredos/iso/grub.cfg new file mode 100644 index 0000000000..137e3a0b08 --- /dev/null +++ b/board/shredos/iso/grub.cfg @@ -0,0 +1,12 @@ +set default="0" +set timeout="5" + +menuentry "ShredOS" { + linux __KERNEL_PATH__ console=tty3 loglevel=3 + initrd __INITRD_PATH__ +} + +menuentry "ShredOS (nomodeset)" { + linux __KERNEL_PATH__ console=tty3 loglevel=3 nomodeset + initrd __INITRD_PATH__ +} diff --git a/board/shredos/iso/isolinux.cfg b/board/shredos/iso/isolinux.cfg new file mode 100644 index 0000000000..565647f0bf --- /dev/null +++ b/board/shredos/iso/isolinux.cfg @@ -0,0 +1,15 @@ +default menu.c32 +prompt 0 +timeout 50 + +menu title ShredOS + +label shredos + menu label ShredOS + kernel __KERNEL_PATH__ + append initrd=__INITRD_PATH__ console=tty3 loglevel=3 + +label shredos-nomodeset + menu label ShredOS (nomodeset) + kernel __KERNEL_PATH__ + append initrd=__INITRD_PATH__ console=tty3 loglevel=3 nomodeset diff --git a/build_all_shredos.sh b/build_all_shredos.sh index 5b65114589..f939bf7a1f 100755 --- a/build_all_shredos.sh +++ b/build_all_shredos.sh @@ -532,7 +532,7 @@ run_cmd rm -r dist || true run_cmd mkdir -p dist echo "Starting to build..." -trap 'print_summary_and_exit $?' EXIT +trap 'print_summary_and_exit $?' EXIT INT TERM if [ ${#X64_CONFIGS[@]} -gt 0 ]; then echo diff --git a/configs/shredos_defconfig b/configs/shredos_defconfig index 400e03cbfa..9151237bf4 100644 --- a/configs/shredos_defconfig +++ b/configs/shredos_defconfig @@ -168,6 +168,10 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE="/boot/shredos.id" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE="28M" BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set diff --git a/configs/shredos_i586_defconfig b/configs/shredos_i586_defconfig index 5aff8e35c9..bc347cb06d 100644 --- a/configs/shredos_i586_defconfig +++ b/configs/shredos_i586_defconfig @@ -165,6 +165,10 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE="/boot/shredos.id" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE="28M" BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set diff --git a/configs/shredos_iso_aio_defconfig b/configs/shredos_iso_aio_defconfig index f89683d4bf..413374b354 100644 --- a/configs/shredos_iso_aio_defconfig +++ b/configs/shredos_iso_aio_defconfig @@ -168,6 +168,10 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE="/boot/shredos.id" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE="28M" BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set diff --git a/configs/shredos_iso_aio_i586_defconfig b/configs/shredos_iso_aio_i586_defconfig index ca49461e43..aceb560f25 100644 --- a/configs/shredos_iso_aio_i586_defconfig +++ b/configs/shredos_iso_aio_i586_defconfig @@ -165,6 +165,10 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE="/boot/shredos.id" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE="28M" BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set diff --git a/configs/shredos_iso_defconfig b/configs/shredos_iso_defconfig index e65a954f22..a7869850c1 100644 --- a/configs/shredos_iso_defconfig +++ b/configs/shredos_iso_defconfig @@ -167,6 +167,10 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE="/boot/shredos.id" BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y diff --git a/configs/shredos_iso_i586_defconfig b/configs/shredos_iso_i586_defconfig index 31679e715b..39793bcc14 100644 --- a/configs/shredos_iso_i586_defconfig +++ b/configs/shredos_iso_i586_defconfig @@ -164,6 +164,10 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE="/boot/shredos.id" BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y diff --git a/fs/iso9660/README b/fs/iso9660/README new file mode 100644 index 0000000000..bc465b7fa7 --- /dev/null +++ b/fs/iso9660/README @@ -0,0 +1,8 @@ +ISO9660 filesystem was updated to modern standards as of 20/11/2025. +The changes have - at the time of this writing - not been upstreamed. +Do compare (and port 'fs/iso9660' over) when updating the Buildroot release. + +The following variables are filled in at build-time: + - __EFI_ID_FILE__ + - __KERNEL_PATH__ + - __INITRD_PATH__ (automatically removed if not used) diff --git a/fs/iso9660/grub.cfg b/fs/iso9660/grub.cfg index 137e3a0b08..5a74b2354a 100644 --- a/fs/iso9660/grub.cfg +++ b/fs/iso9660/grub.cfg @@ -1,12 +1,7 @@ set default="0" -set timeout="5" +set timeout="10" -menuentry "ShredOS" { - linux __KERNEL_PATH__ console=tty3 loglevel=3 - initrd __INITRD_PATH__ -} - -menuentry "ShredOS (nomodeset)" { - linux __KERNEL_PATH__ console=tty3 loglevel=3 nomodeset - initrd __INITRD_PATH__ +menuentry "Buildroot" { + linux __KERNEL_PATH__ root=/dev/sr0 + initrd __INITRD_PATH__ } diff --git a/fs/iso9660/isolinux.cfg b/fs/iso9660/isolinux.cfg index 565647f0bf..b968d85206 100644 --- a/fs/iso9660/isolinux.cfg +++ b/fs/iso9660/isolinux.cfg @@ -1,15 +1,4 @@ -default menu.c32 -prompt 0 -timeout 50 - -menu title ShredOS - -label shredos - menu label ShredOS +default 1 +label 1 kernel __KERNEL_PATH__ - append initrd=__INITRD_PATH__ console=tty3 loglevel=3 - -label shredos-nomodeset - menu label ShredOS (nomodeset) - kernel __KERNEL_PATH__ - append initrd=__INITRD_PATH__ console=tty3 loglevel=3 nomodeset + append initrd=__INITRD_PATH__ root=/dev/sr0 From b7e304a29284c27c872c3707979042923fd43da2 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Fri, 21 Nov 2025 06:48:39 +0100 Subject: [PATCH 24/35] fix(iso9660): account for both mode without hybrid Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- fs/iso9660/iso9660.mk | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/fs/iso9660/iso9660.mk b/fs/iso9660/iso9660.mk index db31c50a8b..337c36fdb7 100644 --- a/fs/iso9660/iso9660.mk +++ b/fs/iso9660/iso9660.mk @@ -372,6 +372,7 @@ ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_INSTALL_BOOTLOADERS ROOTFS_ISO9660_OPTS += -r -V 'ISO9660' -J -joliet-long -cache-inodes ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BOTH)$(BR2_TARGET_ROOTFS_ISO9660_HYBRID),yy) +# BOTH + HYBRID (uses ISOLINUX) # Hybrid Image Support (Modern Variant, Debian-style) ROOTFS_ISO9660_OPTS_BIOS = \ -isohybrid-mbr $(HOST_DIR)/share/syslinux/isohdpfx.bin \ @@ -380,7 +381,16 @@ ROOTFS_ISO9660_OPTS_BIOS = \ -boot-load-size 4 \ -boot-info-table \ -no-emul-boot +else ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BOTH),y) +# BOTH (uses ISOLINUX) +ROOTFS_ISO9660_OPTS_BIOS = \ + -b $(ROOTFS_ISO9660_BOOT_IMAGE) \ + -c isolinux/boot.cat \ + -boot-load-size 4 \ + -boot-info-table \ + -no-emul-boot else ifeq ($(BR2_TARGET_ROOTFS_ISO9660_ISOLINUX),y) +# ISOLINUX ROOTFS_ISO9660_OPTS_BIOS = \ -b $(ROOTFS_ISO9660_BOOT_IMAGE) \ -c isolinux/boot.cat \ @@ -388,6 +398,7 @@ ROOTFS_ISO9660_OPTS_BIOS = \ -boot-info-table \ -no-emul-boot else +# GRUB2 ROOTFS_ISO9660_OPTS_BIOS = \ -b $(ROOTFS_ISO9660_BOOT_IMAGE) \ -boot-load-size 4 \ @@ -396,6 +407,7 @@ ROOTFS_ISO9660_OPTS_BIOS = \ endif ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BOTH)$(BR2_TARGET_ROOTFS_ISO9660_HYBRID),yy) +# BOTH (uses GRUB2 in EFI) # Hybrid Image Support (Modern Variant, Debian-style) ROOTFS_ISO9660_OPTS_EFI = \ -e $(ROOTFS_ISO9660_EFI_PARTITION) \ @@ -403,6 +415,7 @@ ROOTFS_ISO9660_OPTS_EFI = \ -isohybrid-gpt-basdat \ -isohybrid-apm-hfsplus else +# BOTH/GRUB2 (use GRUB2 in EFI) ROOTFS_ISO9660_OPTS_EFI = \ -e $(ROOTFS_ISO9660_EFI_PARTITION) \ -no-emul-boot @@ -410,18 +423,18 @@ endif # Determine which boot options to use ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BIOS_BOOTLOADER)$(BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER),yy) -# Both BIOS and EFI +# BIOS and EFI ROOTFS_ISO9660_OPTS += \ $(ROOTFS_ISO9660_OPTS_BIOS) \ -eltorito-alt-boot \ $(ROOTFS_ISO9660_OPTS_EFI) else ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BIOS_BOOTLOADER),y) -# BIOS only +# BIOS ROOTFS_ISO9660_OPTS += $(ROOTFS_ISO9660_OPTS_BIOS) else ifeq ($(BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER),y) -# EFI only +# EFI ROOTFS_ISO9660_OPTS += $(ROOTFS_ISO9660_OPTS_EFI) endif From 2291b2fdbc0be5a299821e8b636d4fb255024b75 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Fri, 21 Nov 2025 07:05:51 +0100 Subject: [PATCH 25/35] chore(configs): clean up configurations Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- README.md | 18 ++++++++---------- .../usr/bin/find_shredos_boot_disc.sh | 6 +++--- board/shredos/populate_efi_partition.sh | 12 ++++++------ build_all_shredos.sh | 4 ++-- configs/shredos_iso_defconfig | 2 ++ configs/shredos_iso_i586_defconfig | 2 ++ ..._defconfig => shredos_iso_legacy_defconfig} | 3 --- ...onfig => shredos_iso_legacy_i586_defconfig} | 3 --- fs/iso9660/iso9660.mk | 4 ++-- 9 files changed, 25 insertions(+), 29 deletions(-) rename configs/{shredos_iso_aio_defconfig => shredos_iso_legacy_defconfig} (97%) rename configs/{shredos_iso_aio_i586_defconfig => shredos_iso_legacy_i586_defconfig} (97%) diff --git a/README.md b/README.md index 141b412e18..69e154fe50 100644 --- a/README.md +++ b/README.md @@ -820,27 +820,25 @@ $ dd if=shredos-20200412.img of=/dev/sdx (20200412 will be the day you compiled, #### The following configurations are available to build different targets: -- `make shredos_defconfig` - build USB image and AIO hybrid ISO (64-bit) -- `make shredos_i586_defconfig` - build USB image and AIO hybrid ISO (32-bit) +- `make shredos_defconfig` - build USB image and hybrid ISO (64-bit) +- `make shredos_i586_defconfig` - build USB image and hybrid ISO (32-bit) - `make shredos_img_defconfig` - build USB image only (64-bit) - `make shredos_img_i586_defconfig` - build USB image only (32-bit) -- `make shredos_iso_defconfig` - build legacy hybrid ISO only (64-bit) -- `make shredos_iso_i586_defconfig` - build legacy hybrid ISO only (32-bit) -- `make shredos_iso_aio_defconfig` - build AIO hybrid ISO only (64-bit) -- `make shredos_iso_aio_i586_defconfig` - build AIO hybrid ISO only (32-bit) +- `make shredos_iso_defconfig` - build hybrid ISO only (64-bit) +- `make shredos_iso_i586_defconfig` - build hybrid ISO only (32-bit) +- `make shredos_iso_legacy_defconfig` - build legacy ISO only (64-bit) +- `make shredos_iso_legacy_i586_defconfig` - build legacy ISO only (32-bit) Do note that loading a configuration should typically be the last step before `make`. -> **The all-in-one hybrid ISOs unite most functionality of all other formats:** +> **The hybrid ISOs unite most functionality of all other formats:** > >- are BIOS and UEFI bootable >- can both be written to CD/DVD-ROM and USB flash drives >- have a writeable partition (when written to a USB flash drive) >- **but** do not allow customization of GRUB (for `autonuke`, ...) > ->The **legacy** hybrid ISOs do not have that writeable partition (but are ->slightly smaller in size), which means that you cannot add any files or have ->any PDFs written to them (even when using them burned to an USB flash drive). +>The **legacy** ISOs work in BIOS and UEFI, but only burned to CD/DVD-ROM. #### Building multiple configurations: diff --git a/board/shredos/fsoverlay/usr/bin/find_shredos_boot_disc.sh b/board/shredos/fsoverlay/usr/bin/find_shredos_boot_disc.sh index 1c0740ca35..bd219beb08 100755 --- a/board/shredos/fsoverlay/usr/bin/find_shredos_boot_disc.sh +++ b/board/shredos/fsoverlay/usr/bin/find_shredos_boot_disc.sh @@ -49,9 +49,9 @@ do isEFI=$(fdisk -l | grep -i "$drive" | grep -i "EFI") # EFI partitions should not quality for "first drive" to avoid false - # positives; we only use it if confirmed as ours. The hybrid all-in-one ISO - # image's EFI partition can be written to, and we need to ensure that other - # EFI partitions remain untouched, so we don't take EFIs as "first drive". + # positives; we only use it if confirmed as ours. The hybrid ISO image has + # an EFI partition that can be written to, and we need to ensure that other + # devices' EFI partitions remain untouched, disallowing EFI "first drive"s. # # Note that our USB image's FAT partition is not marked specifically as EFI # (0xEF) but regular FAT (0xC/0x0C), so it still qualifies as "first drive". diff --git a/board/shredos/populate_efi_partition.sh b/board/shredos/populate_efi_partition.sh index 1694f658de..4163ba5043 100755 --- a/board/shredos/populate_efi_partition.sh +++ b/board/shredos/populate_efi_partition.sh @@ -1,12 +1,12 @@ #!/bin/bash -e # -# BR2_ROOTFS_POST_BUILD_SCRIPT for shredos_iso_aio configurations +# BR2_ROOTFS_POST_BUILD_SCRIPT for hybrid ISO configurations # -# Our hybrid all-in-one ISO has an accessible EFI partition, which we -# can (ab)use to store our information also, so we move the usual data -# onto it before creating the images. This should not cause any issues -# for CD/DVD-ROM burned ISO images, as the EFI partition will be in RAM, -# but allow any USB burned ISO images to have that writeable data location. +# Our hybrid ISO has an accessible EFI partition, which we can (ab)use to store +# our information also, so we move the usual data onto it before creating the +# images. This should not cause any issues for CD/DVD-ROM burned ISO images, as +# the EFI partition will be in RAM, but allow any USB burned ISO images to have +# that writeable data location to put configuration files, logs and PDFs onto. # # Keep in mind that the EFI partition size (in configuration) must be below # the maximum of 65535 blocks of 512 bytes (= ~32 MB) or the ISO may not diff --git a/build_all_shredos.sh b/build_all_shredos.sh index f939bf7a1f..41f40a6d44 100755 --- a/build_all_shredos.sh +++ b/build_all_shredos.sh @@ -31,7 +31,7 @@ X64_CONFIGS=( "shredos_defconfig" "shredos_img_defconfig" "shredos_iso_defconfig" - "shredos_iso_aio_defconfig" + "shredos_iso_legacy_defconfig" ) # 32-bit configurations to build: @@ -39,7 +39,7 @@ X32_CONFIGS=( "shredos_i586_defconfig" "shredos_img_i586_defconfig" "shredos_iso_i586_defconfig" - "shredos_iso_aio_i586_defconfig" + "shredos_iso_legacy_i586_defconfig" ) # Packages always needing rebuild between runs, even for the same architecture. diff --git a/configs/shredos_iso_defconfig b/configs/shredos_iso_defconfig index a7869850c1..413374b354 100644 --- a/configs/shredos_iso_defconfig +++ b/configs/shredos_iso_defconfig @@ -15,6 +15,7 @@ BR2_GENERATE_LOCALE="en_US.UTF-8" BR2_SYSTEM_ENABLE_NLS=y BR2_TARGET_TZ_INFO=y BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" +BR2_ROOTFS_POST_BUILD_SCRIPT="board/shredos/populate_efi_partition.sh" BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y @@ -171,6 +172,7 @@ BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE="/boot/shredos.id" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE="28M" BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y diff --git a/configs/shredos_iso_i586_defconfig b/configs/shredos_iso_i586_defconfig index 39793bcc14..aceb560f25 100644 --- a/configs/shredos_iso_i586_defconfig +++ b/configs/shredos_iso_i586_defconfig @@ -13,6 +13,7 @@ BR2_GENERATE_LOCALE="en_US.UTF-8" BR2_SYSTEM_ENABLE_NLS=y BR2_TARGET_TZ_INFO=y BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" +BR2_ROOTFS_POST_BUILD_SCRIPT="board/shredos/populate_efi_partition.sh" BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y @@ -168,6 +169,7 @@ BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE="/boot/shredos.id" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE="28M" BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y diff --git a/configs/shredos_iso_aio_defconfig b/configs/shredos_iso_legacy_defconfig similarity index 97% rename from configs/shredos_iso_aio_defconfig rename to configs/shredos_iso_legacy_defconfig index 413374b354..78935de472 100644 --- a/configs/shredos_iso_aio_defconfig +++ b/configs/shredos_iso_legacy_defconfig @@ -15,7 +15,6 @@ BR2_GENERATE_LOCALE="en_US.UTF-8" BR2_SYSTEM_ENABLE_NLS=y BR2_TARGET_TZ_INFO=y BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" -BR2_ROOTFS_POST_BUILD_SCRIPT="board/shredos/populate_efi_partition.sh" BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y @@ -172,8 +171,6 @@ BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE="/boot/shredos.id" -BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE="28M" -BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_X86_64_EFI=y diff --git a/configs/shredos_iso_aio_i586_defconfig b/configs/shredos_iso_legacy_i586_defconfig similarity index 97% rename from configs/shredos_iso_aio_i586_defconfig rename to configs/shredos_iso_legacy_i586_defconfig index aceb560f25..addfb68bda 100644 --- a/configs/shredos_iso_aio_i586_defconfig +++ b/configs/shredos_iso_legacy_i586_defconfig @@ -13,7 +13,6 @@ BR2_GENERATE_LOCALE="en_US.UTF-8" BR2_SYSTEM_ENABLE_NLS=y BR2_TARGET_TZ_INFO=y BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" -BR2_ROOTFS_POST_BUILD_SCRIPT="board/shredos/populate_efi_partition.sh" BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y @@ -169,8 +168,6 @@ BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE="/boot/shredos.id" -BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE="28M" -BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y BR2_TARGET_GRUB2_I386_EFI=y diff --git a/fs/iso9660/iso9660.mk b/fs/iso9660/iso9660.mk index 337c36fdb7..14f13af88c 100644 --- a/fs/iso9660/iso9660.mk +++ b/fs/iso9660/iso9660.mk @@ -407,7 +407,7 @@ ROOTFS_ISO9660_OPTS_BIOS = \ endif ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BOTH)$(BR2_TARGET_ROOTFS_ISO9660_HYBRID),yy) -# BOTH (uses GRUB2 in EFI) +# BOTH + HYBRID (uses GRUB2 in EFI) # Hybrid Image Support (Modern Variant, Debian-style) ROOTFS_ISO9660_OPTS_EFI = \ -e $(ROOTFS_ISO9660_EFI_PARTITION) \ @@ -415,7 +415,7 @@ ROOTFS_ISO9660_OPTS_EFI = \ -isohybrid-gpt-basdat \ -isohybrid-apm-hfsplus else -# BOTH/GRUB2 (use GRUB2 in EFI) +# BOTH or GRUB2 (use GRUB2 in EFI) ROOTFS_ISO9660_OPTS_EFI = \ -e $(ROOTFS_ISO9660_EFI_PARTITION) \ -no-emul-boot From 1635894f8ee55f44d2caeca4c973b684adf75084 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Fri, 21 Nov 2025 10:36:33 +0100 Subject: [PATCH 26/35] fix(configs): revert partition size and post processing for EFI The EFI partition for hybrid ISOs does not reliably show on all Windows systems, so we cannot use our "hack" of writing the configurations/PDFs to it. Reverted instead to a sane-sized EFI partition which is used just for booting. Added a note to the README that some tools such as Rufus support an ISO-mode to add a writeable partition at burning-time. Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- README.md | 30 ++++++++++--------- board/shredos/README-ISO.txt | 5 ---- .../usr/bin/find_shredos_boot_disc.sh | 18 ++--------- board/shredos/populate_efi_partition.sh | 25 ---------------- configs/shredos_defconfig | 2 -- configs/shredos_i586_defconfig | 2 -- configs/shredos_iso_defconfig | 2 -- configs/shredos_iso_i586_defconfig | 2 -- fs/iso9660/Config.in | 12 +++++--- 9 files changed, 27 insertions(+), 71 deletions(-) delete mode 100644 board/shredos/README-ISO.txt delete mode 100755 board/shredos/populate_efi_partition.sh diff --git a/README.md b/README.md index 69e154fe50..d44942aefd 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ NOTE! There may be pre-release versions that are newer than the latest versions ### For all releases including latest and more recent pre-releases [releases](https://github.com/PartialVolume/shredos.x86_64/releases) -Note for versions **after** _v2024.11_27_x86-64_0.38_: The .img files for burning to USB flash drives support both BIOS/UEFI booting, as well as saving of generated PDF reports to the USB flash drive. The .iso image also supports both BIOS/UEFI booting, burning to USB flash drives and CD/DVD-ROM, as well as saving of generated PDF reports to USB flash drive (if being written to one). But use the .img file whenever planning to customize ShredOS (`autonuke` setups, kernel parameters, ...), as it will allow direct permanent modification of the GRUB boot menu and appending of kernel parameters, which the .iso file does not support due to filesystem constraints. +Note for versions **after** _v2024.11_27_x86-64_0.38_: The .img files for burning to USB flash drives support both BIOS/UEFI booting, as well as saving of generated PDF reports to the USB flash drive. The .iso image also supports both BIOS/UEFI booting, burning to USB flash drives and CD/DVD-ROM, but not saving of generated PDF reports to the own USB flash drive (unless being written in "ISO-Mode" with some tools, such as Rufus). Use the .img file whenever needing these generated PDF reports or planning to customize ShredOS (`autonuke` setups, kernel parameters, ...). The .img file allows direct interaction with the filesystem and modification of the GRUB boot menu, e.g. appending of kernel parameters, which the .iso file does not support due to filesystem constraints. Note for versions **until** _v2024.11_27_x86-64_0.38_: The .img files for burning to USB flash drives support both BIOS/UEFI booting. The .iso image supports legacy BIOS booting only and not UEFI, however, a BIOS/UEFI version of the .iso is available in newer ShredOS versions. You can also consider [VENTOY (Open Source tool to create bootable USB drive for ISO/WIM/IMG/VHD(x)/EFI files)](https://github.com/ventoy/Ventoy) as a workaround to avoid BIOS/UEFI issues. @@ -831,23 +831,29 @@ $ dd if=shredos-20200412.img of=/dev/sdx (20200412 will be the day you compiled, Do note that loading a configuration should typically be the last step before `make`. -> **The hybrid ISOs unite most functionality of all other formats:** +> **The hybrid ISOs offer the most flexibility over the other formats:** > >- are BIOS and UEFI bootable >- can both be written to CD/DVD-ROM and USB flash drives ->- have a writeable partition (when written to a USB flash drive) ->- **but** do not allow customization of GRUB (for `autonuke`, ...) +>- use ISOLINUX in BIOS for better compliance with very old systems +>- **but** do not have a writeable partition for PDFs/configurations +> +> Some tools such as Rufus offer an "ISO-Mode", which enable such a writeable +> partition (at burn-time). But this is not something that can be added to the +> ISO on the distribution side (at build-time), as it would break the hybrid +> functionality and standards that are needed for burning the ISO to CD/DVD-ROM. > >The **legacy** ISOs work in BIOS and UEFI, but only burned to CD/DVD-ROM. #### Building multiple configurations: Generally, when building multiple configurations of the above on the same -architecture, you only need to ensure that `make` and `make grub2-reconfigure` -are run between any two configurations. The same applies to any other package -whose configuration has changed, adding corresponding `-reconfigure` -steps. A `make clean` step is not usually required unless you have made -significant changes to the project, which should save time with such builds. +architecture, you only need to ensure that `make grub2-reconfigure` (and +eventually `make`) are run between any two configurations. The same applies to +any other package whose configuration has changed, adding corresponding +`-reconfigure` steps, before the eventual `make`. A `make clean` step is +not usually required unless you have made significant changes to the project, +which should save time for such builds between same-architecture configurations. For two configurations targeting different architectures, a full `make clean` is always required when switching between them, plan time for this (takes long). @@ -896,10 +902,6 @@ make_img_file.sh is a bash script, the main purpose of which is to generate the #### ../board/shredos/make_iso_file.sh make_iso_file.sh is a bash script, the main purpose of which is to generate the .iso file located in output/images/. The contents of board/shredos/version.txt is used to rename the .iso file with version info and the current date and time. -#### ../board/shredos/populate_efi_partition.sh -populate_efi_partition.sh is a bash script that copies the ShredOS files -(similar ones as `make_img_file.sh`) to the UEFI partition of the ISO image. - #### ../board/shredos/grub.cfg The USB image's GRUB configuration, which both the BIOS and UEFI bootloader will use. It contains the BIOS and UEFI boot menu for the USB image. @@ -919,7 +921,7 @@ It contains the UEFI boot menu for the ISO image. #### ../board/shredos/iso/efigrub.cfg The GRUB configuration that is embedded into the ISO's UEFI partition. -It contains directions for GRUB to find the ISO9660 FS and GRUB configuration. +It contains directions for GRUB to find the ISO9660's GRUB configuration. #### ../board/shredos/fsoverlay/etc/shredos/version.txt This file contains the version information as seen in the title on nwipe's title bar, i.e. '2021.08.2_22_x86-64_0.32.023'. This version ingformation is also used when naming the .img file in ../output/images/ ../board/shredos/fsoverlay/etc/shredos/version.txt is manually updated for each new release of ShredOS. diff --git a/board/shredos/README-ISO.txt b/board/shredos/README-ISO.txt deleted file mode 100644 index 23232b0f49..0000000000 --- a/board/shredos/README-ISO.txt +++ /dev/null @@ -1,5 +0,0 @@ -Do not modify the grub.cfg file in this folder trying to customize ShredOS -behavior. The ISO file does not support such customizations, and you should use -the IMG release instead (where you can modify the actual GRUB configuration) - -Get it from: https://github.com/PartialVolume/shredos.x86_64 diff --git a/board/shredos/fsoverlay/usr/bin/find_shredos_boot_disc.sh b/board/shredos/fsoverlay/usr/bin/find_shredos_boot_disc.sh index bd219beb08..3aded1ce8a 100755 --- a/board/shredos/fsoverlay/usr/bin/find_shredos_boot_disc.sh +++ b/board/shredos/fsoverlay/usr/bin/find_shredos_boot_disc.sh @@ -3,7 +3,7 @@ # This program looks for any exfat, fat32 or fat16 filesystem, it then # examines the filesystem, looking for a kernel file or .img or .iso # file that has the same version number as the booted ShredOS. Once -# the boot USB has been found this script outputs the drive name in +# the boot USB has been found this script outputs the drive name in # the following form, example being /dev/sdc etc. # # If there is no FAT drive found the script fails silently @@ -46,23 +46,11 @@ fi # while read drive ; do - isEFI=$(fdisk -l | grep -i "$drive" | grep -i "EFI") - - # EFI partitions should not quality for "first drive" to avoid false - # positives; we only use it if confirmed as ours. The hybrid ISO image has - # an EFI partition that can be written to, and we need to ensure that other - # devices' EFI partitions remain untouched, disallowing EFI "first drive"s. - # - # Note that our USB image's FAT partition is not marked specifically as EFI - # (0xEF) but regular FAT (0xC/0x0C), so it still qualifies as "first drive". - if [[ "$first_drive" == "" ]] && [[ -z "$isEFI" ]] + if [[ "$first_drive" == "" ]] then first_drive=$drive fi - # We can use the EFI partition if it passes the below checks and is - # confirmed to be ours (of the hybrid ISO images, when flashed on USB). - if [[ "$drive" != "" ]] then mount $drive $drive_dir 2>&1 | tee -a transfer.log @@ -132,7 +120,7 @@ do umount $drive_dir 2>&1 | tee -a transfer.log fi -done <<< $(fdisk -l | grep -i "exfat\|fat16\|fat32\|EFI" | awk '{print $1}') +done <<< $(fdisk -l | grep -i "exfat\|fat16\|fat32" | awk '{print $1}') # If no boot disc has been found that contains the version of ShredOS # that is running, then output the first FAT formatted drive we came across. diff --git a/board/shredos/populate_efi_partition.sh b/board/shredos/populate_efi_partition.sh deleted file mode 100755 index 4163ba5043..0000000000 --- a/board/shredos/populate_efi_partition.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -e -# -# BR2_ROOTFS_POST_BUILD_SCRIPT for hybrid ISO configurations -# -# Our hybrid ISO has an accessible EFI partition, which we can (ab)use to store -# our information also, so we move the usual data onto it before creating the -# images. This should not cause any issues for CD/DVD-ROM burned ISO images, as -# the EFI partition will be in RAM, but allow any USB burned ISO images to have -# that writeable data location to put configuration files, logs and PDFs onto. -# -# Keep in mind that the EFI partition size (in configuration) must be below -# the maximum of 65535 blocks of 512 bytes (= ~32 MB) or the ISO may not -# be bootable on legacy systems, xorriso would warn about this during the -# ISO building stage (but not consider it a failure - just so you know...) -# - -mkdir -p "${BINARIES_DIR}/efi-part/boot/" || exit 1 - -cp "board/shredos/autorun.inf" "${BINARIES_DIR}/efi-part/autorun.inf" || exit 1 -cp "board/shredos/README.txt" "${BINARIES_DIR}/efi-part/README.txt" || exit 1 -cp "board/shredos/README-ISO.txt" "${BINARIES_DIR}/efi-part/EFI/BOOT/README.txt" || exit 1 -cp "board/shredos/shredos.ico" "${BINARIES_DIR}/efi-part/shredos.ico" || exit 1 -cp "board/shredos/fsoverlay/etc/shredos/version.txt" "${BINARIES_DIR}/efi-part/boot/version.txt" || exit 1 - -exit 0 diff --git a/configs/shredos_defconfig b/configs/shredos_defconfig index 9151237bf4..a5a41bdd9c 100644 --- a/configs/shredos_defconfig +++ b/configs/shredos_defconfig @@ -15,7 +15,6 @@ BR2_GENERATE_LOCALE="en_US.UTF-8" BR2_SYSTEM_ENABLE_NLS=y BR2_TARGET_TZ_INFO=y BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" -BR2_ROOTFS_POST_BUILD_SCRIPT="board/shredos/populate_efi_partition.sh" BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh board/shredos/make_img_file.sh" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y @@ -172,7 +171,6 @@ BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE="/boot/shredos.id" -BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE="28M" BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y diff --git a/configs/shredos_i586_defconfig b/configs/shredos_i586_defconfig index bc347cb06d..0d478560a9 100644 --- a/configs/shredos_i586_defconfig +++ b/configs/shredos_i586_defconfig @@ -13,7 +13,6 @@ BR2_GENERATE_LOCALE="en_US.UTF-8" BR2_SYSTEM_ENABLE_NLS=y BR2_TARGET_TZ_INFO=y BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" -BR2_ROOTFS_POST_BUILD_SCRIPT="board/shredos/populate_efi_partition.sh" BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh board/shredos/make_img_file.sh" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y @@ -169,7 +168,6 @@ BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE="/boot/shredos.id" -BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE="28M" BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y diff --git a/configs/shredos_iso_defconfig b/configs/shredos_iso_defconfig index 413374b354..a7869850c1 100644 --- a/configs/shredos_iso_defconfig +++ b/configs/shredos_iso_defconfig @@ -15,7 +15,6 @@ BR2_GENERATE_LOCALE="en_US.UTF-8" BR2_SYSTEM_ENABLE_NLS=y BR2_TARGET_TZ_INFO=y BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" -BR2_ROOTFS_POST_BUILD_SCRIPT="board/shredos/populate_efi_partition.sh" BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y @@ -172,7 +171,6 @@ BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE="/boot/shredos.id" -BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE="28M" BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y diff --git a/configs/shredos_iso_i586_defconfig b/configs/shredos_iso_i586_defconfig index aceb560f25..39793bcc14 100644 --- a/configs/shredos_iso_i586_defconfig +++ b/configs/shredos_iso_i586_defconfig @@ -13,7 +13,6 @@ BR2_GENERATE_LOCALE="en_US.UTF-8" BR2_SYSTEM_ENABLE_NLS=y BR2_TARGET_TZ_INFO=y BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" -BR2_ROOTFS_POST_BUILD_SCRIPT="board/shredos/populate_efi_partition.sh" BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y @@ -169,7 +168,6 @@ BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE="/boot/shredos.id" -BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE="28M" BR2_TARGET_ROOTFS_ISO9660_HYBRID=y # BR2_TARGET_ROOTFS_TAR is not set BR2_TARGET_GRUB2=y diff --git a/fs/iso9660/Config.in b/fs/iso9660/Config.in index 690586de60..5f30f5c9a2 100644 --- a/fs/iso9660/Config.in +++ b/fs/iso9660/Config.in @@ -35,13 +35,13 @@ config BR2_TARGET_ROOTFS_ISO9660_GRUB2 help Use Grub 2 as the bootloader for the ISO9660 image. Make sure to enable the 'iso9660' module in - BR2_TARGET_GRUB2_BUILTIN_MODULES_PC and/or + (when used) BR2_TARGET_GRUB2_BUILTIN_MODULES_PC and (when used) BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI. For GRUB on BIOS, use 'cd' as the boot partition in BR2_TARGET_GRUB2_BOOT_PARTITION setting. For GRUB on EFI 'set root=(cd0)' in the configuration file passed - to BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU, although the - default configuration file contains a "search" directive using - BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE, which works too. + to BR2_TARGET_GRUB2_BUILTIN_CONFIG_EFI, although just an ISO9660 + BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU containing a "search" + using the BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE also works. config BR2_TARGET_ROOTFS_ISO9660_ISOLINUX bool "isolinux" @@ -117,6 +117,10 @@ config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU baking an EFI search config into the common GRUB image (often better) check out instead the GRUB2 setting: BR2_TARGET_GRUB2_BUILTIN_CONFIG_EFI + Note that the strings __KERNEL_PATH__ and __INITRD_PATH__ + will automatically be replaced by the path to the kernel and + initrd images respectively (or removed, if not applicable). + Note that any string __EFI_ID_FILE__ will automatically be replaced with the BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE. From 4fd5642d16e0982736c2944858b5acd150f7ea68 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Fri, 21 Nov 2025 16:24:14 +0100 Subject: [PATCH 27/35] feat(iso9660): appendable partition image for hybrid modes Allow to append a FAT16 partition image when building an ISO in hybrid mode. This allows to add an extra writeable partition for when the ISO is burned to USB. This feature is experimental and disabled by default. Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- README.md | 5 + board/shredos/make_extra_partition.sh | 18 +++ build_all_shredos.sh | 2 + configs/shredos_iso_extra_defconfig | 188 +++++++++++++++++++++++ configs/shredos_iso_extra_i586_defconfig | 185 ++++++++++++++++++++++ fs/iso9660/Config.in | 15 ++ fs/iso9660/iso9660.mk | 7 + 7 files changed, 420 insertions(+) create mode 100755 board/shredos/make_extra_partition.sh create mode 100644 configs/shredos_iso_extra_defconfig create mode 100644 configs/shredos_iso_extra_i586_defconfig diff --git a/README.md b/README.md index d44942aefd..18d71f489c 100644 --- a/README.md +++ b/README.md @@ -829,6 +829,11 @@ $ dd if=shredos-20200412.img of=/dev/sdx (20200412 will be the day you compiled, - `make shredos_iso_legacy_defconfig` - build legacy ISO only (64-bit) - `make shredos_iso_legacy_i586_defconfig` - build legacy ISO only (32-bit) +#### The following experimental configurations are available for testing: + +- `make shredos_iso_extra_defconfig` - build hybrid ISO with extra writeable partition (when burned to USB flash drive) (64-bit) +- `make shredos_iso_extra_i586_defconfig` - build hybrid ISO with extra writeable partition (when burned to USB flash drive) (32-bit) + Do note that loading a configuration should typically be the last step before `make`. > **The hybrid ISOs offer the most flexibility over the other formats:** diff --git a/board/shredos/make_extra_partition.sh b/board/shredos/make_extra_partition.sh new file mode 100755 index 0000000000..22a622b1a3 --- /dev/null +++ b/board/shredos/make_extra_partition.sh @@ -0,0 +1,18 @@ +#!/bin/bash -e + +# This file produces the extra FAT16 partition for the shredos_iso_extra_*_defconfig configurations. +# The partition is appended to the ISO, so that when written to USB a writeable partition is available. + +rm "${BINARIES_DIR}"/extra.vfat || true + +dd if=/dev/zero of="${BINARIES_DIR}/extra.vfat" bs=50M count=1 || exit 1 +"$HOST_DIR"/sbin/mkfs.vfat -F16 "${BINARIES_DIR}/extra.vfat" || exit 1 + +"$HOST_DIR"/bin/mmd -i "${BINARIES_DIR}/extra.vfat" ::/boot || exit 1 + +"$HOST_DIR"/bin/mcopy -p -m -i "${BINARIES_DIR}/extra.vfat" board/shredos/fsoverlay/etc/shredos/version.txt ::/boot/version.txt || exit 1 +"$HOST_DIR"/bin/mcopy -p -m -i "${BINARIES_DIR}/extra.vfat" board/shredos/README.txt ::/README.txt || exit 1 +"$HOST_DIR"/bin/mcopy -p -m -i "${BINARIES_DIR}/extra.vfat" board/shredos/autorun.inf ::/autorun.inf || exit 1 +"$HOST_DIR"/bin/mcopy -p -m -i "${BINARIES_DIR}/extra.vfat" board/shredos/shredos.ico ::/shredos.ico || exit 1 + +exit 0 diff --git a/build_all_shredos.sh b/build_all_shredos.sh index 41f40a6d44..950d27493a 100755 --- a/build_all_shredos.sh +++ b/build_all_shredos.sh @@ -32,6 +32,7 @@ X64_CONFIGS=( "shredos_img_defconfig" "shredos_iso_defconfig" "shredos_iso_legacy_defconfig" + "shredos_iso_extra_defconfig" # experimental ) # 32-bit configurations to build: @@ -40,6 +41,7 @@ X32_CONFIGS=( "shredos_img_i586_defconfig" "shredos_iso_i586_defconfig" "shredos_iso_legacy_i586_defconfig" + "shredos_iso_extra_i586_defconfig" # experimental ) # Packages always needing rebuild between runs, even for the same architecture. diff --git a/configs/shredos_iso_extra_defconfig b/configs/shredos_iso_extra_defconfig new file mode 100644 index 0000000000..aec7bbb618 --- /dev/null +++ b/configs/shredos_iso_extra_defconfig @@ -0,0 +1,188 @@ +BR2_x86_64=y +BR2_x86_nocona=y +BR2_PACKAGE_GLIBC_UTILS=y +BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_TOOLCHAIN_GLIBC_GCONV_LIBS_COPY=y +BR2_CPAN_MIRROR="http://cpan.metacpan.org" +BR2_TARGET_GENERIC_HOSTNAME="shredos" +BR2_TARGET_GENERIC_ISSUE="Welcome to ShredOS https://github.com/PartialVolume/shredos.x86_64" +BR2_INIT_SYSV=y +BR2_ROOTFS_MERGED_USR=y +BR2_SYSTEM_BIN_SH_BASH=y +BR2_SYSTEM_DEFAULT_PATH="/bin:/sbin:/usr/bin:/usr/sbin" +# BR2_ENABLE_LOCALE_PURGE is not set +BR2_GENERATE_LOCALE="en_US.UTF-8" +BR2_SYSTEM_ENABLE_NLS=y +BR2_TARGET_TZ_INFO=y +BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" +BR2_ROOTFS_POST_BUILD_SCRIPT="board/shredos/make_extra_partition.sh" +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh" +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/shredos/kernel-6.6.22-defconfig.config" +BR2_PACKAGE_LINUX_TOOLS_CPUPOWER=y +BR2_PACKAGE_LINUX_TOOLS_PERF=y +BR2_PACKAGE_LINUX_TOOLS_SELFTESTS=y +# BR2_PACKAGE_BUSYBOX_SELINUX is not set +BR2_PACKAGE_FFMPEG=y +BR2_PACKAGE_FFMPEG_GPL=y +BR2_PACKAGE_FFMPEG_NONFREE=y +BR2_PACKAGE_FFMPEG_SWSCALE=y +BR2_PACKAGE_BZIP2=y +BR2_PACKAGE_GZIP=y +BR2_PACKAGE_UNZIP=y +BR2_PACKAGE_XZ=y +BR2_PACKAGE_ZIP=y +BR2_PACKAGE_HEXEDIT=y +BR2_PACKAGE_BINUTILS=y +BR2_PACKAGE_GETTEXT=y +BR2_PACKAGE_GREP=y +BR2_PACKAGE_LIBTOOL=y +BR2_PACKAGE_SED=y +BR2_PACKAGE_DOSFSTOOLS=y +BR2_PACKAGE_DOSFSTOOLS_FATLABEL=y +BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y +BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT=y +BR2_PACKAGE_E2FSPROGS=y +BR2_PACKAGE_EXFATPROGS=y +BR2_PACKAGE_ASCII_INVADERS=y +BR2_PACKAGE_DIRECTFB=y +BR2_PACKAGE_DIRECTFB_ATI128=y +BR2_PACKAGE_DIRECTFB_MATROX=y +BR2_PACKAGE_DIRECTFB_I830=y +BR2_PACKAGE_FBDUMP=y +BR2_PACKAGE_FBGRAB=y +BR2_PACKAGE_FBSET=y +BR2_PACKAGE_FBTERM=y +BR2_PACKAGE_FBV=y +BR2_PACKAGE_MESA3D=y +BR2_PACKAGE_MESA3D_LLVM=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_CROCUS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_ETNAVIV=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_I915=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_IRIS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_LIMA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R300=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SVGA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_TEGRA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VIRGL=y +BR2_PACKAGE_MESA3D_VULKAN_DRIVER_INTEL=y +BR2_PACKAGE_MESA3D_OSMESA_GALLIUM=y +BR2_PACKAGE_MESA3D_OPENGL_ES=y +BR2_PACKAGE_LINUX_FIRMWARE=y +BR2_PACKAGE_LINUX_FIRMWARE_AMDGPU=y +BR2_PACKAGE_LINUX_FIRMWARE_I915=y +BR2_PACKAGE_LINUX_FIRMWARE_RADEON=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_VENUS=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_ADRENO=y +BR2_PACKAGE_LINUX_FIRMWARE_MFC_V8=y +BR2_PACKAGE_LINUX_FIRMWARE_QUALCOMM_6174=y +BR2_PACKAGE_LINUX_FIRMWARE_BROADCOM_TIGON3=y +BR2_PACKAGE_LINUX_FIRMWARE_BNX2X=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T4=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T5=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_E100=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_ICE=y +BR2_PACKAGE_LINUX_FIRMWARE_MICROCHIP_VSC85XX_PHY=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_4X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_815X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_8169=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_2XXX=y +BR2_PACKAGE_EDID_DECODE=y +BR2_PACKAGE_HDPARM=y +BR2_PACKAGE_KBD=y +BR2_PACKAGE_LM_SENSORS=y +BR2_PACKAGE_LSHW=y +BR2_PACKAGE_LSSCSI=y +BR2_PACKAGE_MINICOM=y +BR2_PACKAGE_NVME=y +BR2_PACKAGE_READ_EDID=y +BR2_PACKAGE_SG3_UTILS=y +BR2_PACKAGE_SG3_UTILS_PROGS=y +BR2_PACKAGE_SMARTMONTOOLS=y +BR2_PACKAGE_SYSSTAT=y +BR2_PACKAGE_TRIGGERHAPPY=y +BR2_PACKAGE_PERL=y +BR2_PACKAGE_PYTHON_PYASN1_MODULES=y +BR2_PACKAGE_PYTHON_PYBIND=y +BR2_PACKAGE_PYTHON_PYNDIFF=y +BR2_PACKAGE_PYTHON_SCAPY=y +BR2_PACKAGE_LZ4=y +BR2_PACKAGE_LIBGCRYPT=y +BR2_PACKAGE_LIBJPEG=y +BR2_PACKAGE_STB=y +BR2_PACKAGE_LIBHID=y +BR2_PACKAGE_JSON_GLIB=y +BR2_PACKAGE_LIBCURL=y +BR2_PACKAGE_LIBUPNP=y +BR2_PACKAGE_KERNEL_CMDLINE_EXTRACTOR=y +BR2_PACKAGE_LIBCAP=y +BR2_PACKAGE_LIBSECCOMP=y +BR2_PACKAGE_NWIPE=y +BR2_PACKAGE_LIBFRIBIDI=y +BR2_PACKAGE_NCURSES_WCHAR=y +BR2_PACKAGE_UTF8PROC=y +BR2_PACKAGE_HEIRLOOM_MAILX=y +BR2_PACKAGE_COLLECTD=y +BR2_PACKAGE_COLLECTD_NTPD=y +BR2_PACKAGE_XUTIL_UTIL_MACROS=y +BR2_PACKAGE_IPTABLES=y +BR2_PACKAGE_LFTP=y +BR2_PACKAGE_LFTP_PROTO_SFTP=y +BR2_PACKAGE_NMAP=y +BR2_PACKAGE_NTP=y +BR2_PACKAGE_NTP_NTPDATE=y +BR2_PACKAGE_NTP_NTPTIME=y +BR2_PACKAGE_OPENSSH=y +# BR2_PACKAGE_OPENSSH_SERVER is not set +BR2_PACKAGE_RPCBIND=y +BR2_PACKAGE_SNMPCLITOOLS=y +BR2_PACKAGE_TFTPD=y +BR2_PACKAGE_TRACEROUTE=y +BR2_PACKAGE_WIREGUARD_TOOLS=y +BR2_PACKAGE_RESTORECOND=y +BR2_PACKAGE_SELINUX_PYTHON=y +BR2_PACKAGE_SELINUX_PYTHON_AUDIT2ALLOW=y +BR2_PACKAGE_PARALLEL=y +BR2_PACKAGE_TMUX=y +BR2_PACKAGE_OPENSEACHEST=y +BR2_PACKAGE_PROCPS_NG=y +BR2_PACKAGE_RUNC=y +BR2_PACKAGE_UTIL_LINUX_BINARIES=y +BR2_PACKAGE_UTIL_LINUX_AGETTY=y +BR2_PACKAGE_UTIL_LINUX_FSCK=y +BR2_PACKAGE_UTIL_LINUX_LAST=y +BR2_PACKAGE_UTIL_LINUX_LOGIN=y +BR2_PACKAGE_UTIL_LINUX_MOUNT=y +BR2_PACKAGE_UTIL_LINUX_MOUNTPOINT=y +BR2_PACKAGE_UTIL_LINUX_PIVOT_ROOT=y +BR2_PACKAGE_UTIL_LINUX_RFKILL=y +BR2_PACKAGE_UTIL_LINUX_RUNUSER=y +BR2_PACKAGE_UTIL_LINUX_SETTERM=y +BR2_PACKAGE_UTIL_LINUX_SU=y +BR2_PACKAGE_UTIL_LINUX_SULOGIN=y +BR2_TARGET_ROOTFS_CPIO_LZMA=y +BR2_TARGET_ROOTFS_INITRAMFS=y +BR2_TARGET_ROOTFS_ISO9660=y +BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE="/boot/shredos.id" +BR2_TARGET_ROOTFS_ISO9660_HYBRID=y +BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION="extra.vfat" +# BR2_TARGET_ROOTFS_TAR is not set +BR2_TARGET_GRUB2=y +BR2_TARGET_GRUB2_X86_64_EFI=y +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile iso9660" +BR2_TARGET_GRUB2_BUILTIN_CONFIG_EFI="board/shredos/embed/grub.cfg" +BR2_TARGET_GRUB2_INSTALL_TOOLS=y +BR2_TARGET_SYSLINUX=y +BR2_PACKAGE_HOST_E2FSPROGS=y +BR2_PACKAGE_HOST_GENIMAGE=y +BR2_PACKAGE_HOST_PYTHON3=y +BR2_PACKAGE_HOST_PYTHON3_BZIP2=y +BR2_PACKAGE_HOST_PYTHON3_SSL=y diff --git a/configs/shredos_iso_extra_i586_defconfig b/configs/shredos_iso_extra_i586_defconfig new file mode 100644 index 0000000000..cabeef7d25 --- /dev/null +++ b/configs/shredos_iso_extra_i586_defconfig @@ -0,0 +1,185 @@ +BR2_PACKAGE_GLIBC_UTILS=y +BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_TOOLCHAIN_GLIBC_GCONV_LIBS_COPY=y +BR2_CPAN_MIRROR="http://cpan.metacpan.org" +BR2_TARGET_GENERIC_HOSTNAME="shredos" +BR2_TARGET_GENERIC_ISSUE="Welcome to ShredOS https://github.com/PartialVolume/shredos.x86_64" +BR2_INIT_SYSV=y +BR2_ROOTFS_MERGED_USR=y +BR2_SYSTEM_BIN_SH_BASH=y +BR2_SYSTEM_DEFAULT_PATH="/bin:/sbin:/usr/bin:/usr/sbin" +# BR2_ENABLE_LOCALE_PURGE is not set +BR2_GENERATE_LOCALE="en_US.UTF-8" +BR2_SYSTEM_ENABLE_NLS=y +BR2_TARGET_TZ_INFO=y +BR2_ROOTFS_OVERLAY="board/shredos/fsoverlay" +BR2_ROOTFS_POST_BUILD_SCRIPT="board/shredos/make_extra_partition.sh" +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/shredos/make_iso_file.sh" +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/shredos/kernel-6.6.22-defconfig.config" +BR2_PACKAGE_LINUX_TOOLS_CPUPOWER=y +BR2_PACKAGE_LINUX_TOOLS_PERF=y +BR2_PACKAGE_LINUX_TOOLS_SELFTESTS=y +# BR2_PACKAGE_BUSYBOX_SELINUX is not set +BR2_PACKAGE_FFMPEG=y +BR2_PACKAGE_FFMPEG_GPL=y +BR2_PACKAGE_FFMPEG_NONFREE=y +BR2_PACKAGE_FFMPEG_SWSCALE=y +BR2_PACKAGE_BZIP2=y +BR2_PACKAGE_GZIP=y +BR2_PACKAGE_UNZIP=y +BR2_PACKAGE_XZ=y +BR2_PACKAGE_ZIP=y +BR2_PACKAGE_HEXEDIT=y +BR2_PACKAGE_BINUTILS=y +BR2_PACKAGE_GETTEXT=y +BR2_PACKAGE_GREP=y +BR2_PACKAGE_LIBTOOL=y +BR2_PACKAGE_SED=y +BR2_PACKAGE_DOSFSTOOLS=y +BR2_PACKAGE_DOSFSTOOLS_FATLABEL=y +BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y +BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT=y +BR2_PACKAGE_E2FSPROGS=y +BR2_PACKAGE_EXFATPROGS=y +BR2_PACKAGE_ASCII_INVADERS=y +BR2_PACKAGE_DIRECTFB=y +BR2_PACKAGE_DIRECTFB_ATI128=y +BR2_PACKAGE_DIRECTFB_MATROX=y +BR2_PACKAGE_DIRECTFB_I830=y +BR2_PACKAGE_FBDUMP=y +BR2_PACKAGE_FBGRAB=y +BR2_PACKAGE_FBSET=y +BR2_PACKAGE_FBTERM=y +BR2_PACKAGE_FBV=y +BR2_PACKAGE_MESA3D=y +BR2_PACKAGE_MESA3D_LLVM=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_CROCUS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_ETNAVIV=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_I915=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_IRIS=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_LIMA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R300=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SVGA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_TEGRA=y +BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VIRGL=y +BR2_PACKAGE_MESA3D_VULKAN_DRIVER_INTEL=y +BR2_PACKAGE_MESA3D_OSMESA_GALLIUM=y +BR2_PACKAGE_MESA3D_OPENGL_ES=y +BR2_PACKAGE_LINUX_FIRMWARE=y +BR2_PACKAGE_LINUX_FIRMWARE_AMDGPU=y +BR2_PACKAGE_LINUX_FIRMWARE_I915=y +BR2_PACKAGE_LINUX_FIRMWARE_RADEON=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_VENUS=y +BR2_PACKAGE_LINUX_FIRMWARE_QCOM_ADRENO=y +BR2_PACKAGE_LINUX_FIRMWARE_MFC_V8=y +BR2_PACKAGE_LINUX_FIRMWARE_QUALCOMM_6174=y +BR2_PACKAGE_LINUX_FIRMWARE_BROADCOM_TIGON3=y +BR2_PACKAGE_LINUX_FIRMWARE_BNX2X=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T4=y +BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T5=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_E100=y +BR2_PACKAGE_LINUX_FIRMWARE_INTEL_ICE=y +BR2_PACKAGE_LINUX_FIRMWARE_MICROCHIP_VSC85XX_PHY=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_4X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_815X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_8169=y +BR2_PACKAGE_LINUX_FIRMWARE_QLOGIC_2XXX=y +BR2_PACKAGE_EDID_DECODE=y +BR2_PACKAGE_HDPARM=y +BR2_PACKAGE_KBD=y +BR2_PACKAGE_LM_SENSORS=y +BR2_PACKAGE_LSHW=y +BR2_PACKAGE_LSSCSI=y +BR2_PACKAGE_MINICOM=y +BR2_PACKAGE_NVME=y +BR2_PACKAGE_READ_EDID=y +BR2_PACKAGE_SG3_UTILS=y +BR2_PACKAGE_SG3_UTILS_PROGS=y +BR2_PACKAGE_SMARTMONTOOLS=y +BR2_PACKAGE_SYSSTAT=y +BR2_PACKAGE_TRIGGERHAPPY=y +BR2_PACKAGE_PERL=y +BR2_PACKAGE_PYTHON_PYASN1_MODULES=y +BR2_PACKAGE_PYTHON_PYBIND=y +BR2_PACKAGE_PYTHON_PYNDIFF=y +BR2_PACKAGE_PYTHON_SCAPY=y +BR2_PACKAGE_LZ4=y +BR2_PACKAGE_LIBGCRYPT=y +BR2_PACKAGE_STB=y +BR2_PACKAGE_LIBHID=y +BR2_PACKAGE_JSON_GLIB=y +BR2_PACKAGE_LIBCURL=y +BR2_PACKAGE_LIBUPNP=y +BR2_PACKAGE_KERNEL_CMDLINE_EXTRACTOR=y +BR2_PACKAGE_LIBCAP=y +BR2_PACKAGE_LIBSECCOMP=y +BR2_PACKAGE_NWIPE=y +BR2_PACKAGE_LIBFRIBIDI=y +BR2_PACKAGE_NCURSES_WCHAR=y +BR2_PACKAGE_UTF8PROC=y +BR2_PACKAGE_HEIRLOOM_MAILX=y +BR2_PACKAGE_COLLECTD=y +BR2_PACKAGE_COLLECTD_NTPD=y +BR2_PACKAGE_XUTIL_UTIL_MACROS=y +BR2_PACKAGE_IPTABLES=y +BR2_PACKAGE_LFTP=y +BR2_PACKAGE_LFTP_PROTO_SFTP=y +BR2_PACKAGE_NMAP=y +BR2_PACKAGE_NTP=y +BR2_PACKAGE_NTP_NTPDATE=y +BR2_PACKAGE_NTP_NTPTIME=y +BR2_PACKAGE_OPENSSH=y +# BR2_PACKAGE_OPENSSH_SERVER is not set +BR2_PACKAGE_RPCBIND=y +BR2_PACKAGE_SNMPCLITOOLS=y +BR2_PACKAGE_TFTPD=y +BR2_PACKAGE_TRACEROUTE=y +BR2_PACKAGE_WIREGUARD_TOOLS=y +BR2_PACKAGE_RESTORECOND=y +BR2_PACKAGE_SELINUX_PYTHON=y +BR2_PACKAGE_SELINUX_PYTHON_AUDIT2ALLOW=y +BR2_PACKAGE_PARALLEL=y +BR2_PACKAGE_TMUX=y +BR2_PACKAGE_OPENSEACHEST=y +BR2_PACKAGE_PROCPS_NG=y +BR2_PACKAGE_RUNC=y +BR2_PACKAGE_UTIL_LINUX_BINARIES=y +BR2_PACKAGE_UTIL_LINUX_AGETTY=y +BR2_PACKAGE_UTIL_LINUX_FSCK=y +BR2_PACKAGE_UTIL_LINUX_LAST=y +BR2_PACKAGE_UTIL_LINUX_LOGIN=y +BR2_PACKAGE_UTIL_LINUX_MOUNT=y +BR2_PACKAGE_UTIL_LINUX_MOUNTPOINT=y +BR2_PACKAGE_UTIL_LINUX_PIVOT_ROOT=y +BR2_PACKAGE_UTIL_LINUX_RFKILL=y +BR2_PACKAGE_UTIL_LINUX_RUNUSER=y +BR2_PACKAGE_UTIL_LINUX_SETTERM=y +BR2_PACKAGE_UTIL_LINUX_SU=y +BR2_PACKAGE_UTIL_LINUX_SULOGIN=y +BR2_TARGET_ROOTFS_CPIO_LZMA=y +BR2_TARGET_ROOTFS_INITRAMFS=y +BR2_TARGET_ROOTFS_ISO9660=y +BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" +BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE="/boot/shredos.id" +BR2_TARGET_ROOTFS_ISO9660_HYBRID=y +BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION="extra.vfat" +# BR2_TARGET_ROOTFS_TAR is not set +BR2_TARGET_GRUB2=y +BR2_TARGET_GRUB2_I386_EFI=y +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal progress efi_gop efi_uga all_video video_cirrus video_bochs net efinet tftp gzio test eval read true gfxterm gfxterm_menu gfxmenu gfxterm_background png usb usb_keyboard search configfile iso9660" +BR2_TARGET_GRUB2_BUILTIN_CONFIG_EFI="board/shredos/embed/grub.cfg" +BR2_TARGET_GRUB2_INSTALL_TOOLS=y +BR2_TARGET_SYSLINUX=y +BR2_PACKAGE_HOST_E2FSPROGS=y +BR2_PACKAGE_HOST_GENIMAGE=y +BR2_PACKAGE_HOST_PYTHON3=y +BR2_PACKAGE_HOST_PYTHON3_BZIP2=y +BR2_PACKAGE_HOST_PYTHON3_SSL=y diff --git a/fs/iso9660/Config.in b/fs/iso9660/Config.in index 5f30f5c9a2..c66367ce35 100644 --- a/fs/iso9660/Config.in +++ b/fs/iso9660/Config.in @@ -176,6 +176,21 @@ config BR2_TARGET_ROOTFS_ISO9660_HYBRID that can either be burned to CD/DVD-ROM or flashed onto a device which the BIOS considers as HDD/removable device (e.g. USB stick) +config BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION + string "Append hybrid partition image" + depends on BR2_TARGET_ROOTFS_ISO9660_BOTH \ + && BR2_TARGET_ROOTFS_ISO9660_HYBRID + default "" + help + Enable this option to append a prepared FAT16 filesystem + image to the hybrid image, useful when needing a writeable + data partition for USBs - should be considered EXPERIMENTAL. + + The path is expected to be relative to folder "output/images/". + + You can use e.g. a BR2_ROOTFS_POST_BUILD_SCRIPT for preparing + the respective filesystem image for your target configuration. + endif comment "iso image needs a Linux kernel and either grub2 or isolinux to be built" diff --git a/fs/iso9660/iso9660.mk b/fs/iso9660/iso9660.mk index 14f13af88c..5feea015a4 100644 --- a/fs/iso9660/iso9660.mk +++ b/fs/iso9660/iso9660.mk @@ -34,6 +34,7 @@ ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_G ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE)) ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE)) ROOTFS_ISO9660_ISOLINUX_BOOT_MENU = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU)) +ROOTFS_ISO9660_HYBRID_APPEND_PARTITION = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION)) ################################################################################ # Architecture-specific variables @@ -428,6 +429,12 @@ ROOTFS_ISO9660_OPTS += \ $(ROOTFS_ISO9660_OPTS_BIOS) \ -eltorito-alt-boot \ $(ROOTFS_ISO9660_OPTS_EFI) +# Append an extra FAT16 partition image (if one was provided, for hybrid mode) +ifneq ($(ROOTFS_ISO9660_HYBRID_APPEND_PARTITION),) +ROOTFS_ISO9660_OPTS += \ + -append_partition 3 0x0e $(BINARIES_DIR)/$(ROOTFS_ISO9660_HYBRID_APPEND_PARTITION) \ + -partition_cyl_align all +endif else ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BIOS_BOOTLOADER),y) # BIOS From 023c549337f5f4f16c32e24cc5ee91aa635b28f7 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Sat, 22 Nov 2025 07:55:46 +0100 Subject: [PATCH 28/35] feat(iso9660): add volume name and partition type as options Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- configs/shredos_i586_defconfig | 1 + configs/shredos_iso_defconfig | 1 + configs/shredos_iso_extra_defconfig | 1 + configs/shredos_iso_extra_i586_defconfig | 1 + configs/shredos_iso_i586_defconfig | 1 + configs/shredos_iso_legacy_defconfig | 1 + configs/shredos_iso_legacy_i586_defconfig | 1 + fs/iso9660/Config.in | 35 ++++++++++++++++++++--- fs/iso9660/iso9660.mk | 9 ++++-- 9 files changed, 44 insertions(+), 7 deletions(-) diff --git a/configs/shredos_i586_defconfig b/configs/shredos_i586_defconfig index 0d478560a9..240591da29 100644 --- a/configs/shredos_i586_defconfig +++ b/configs/shredos_i586_defconfig @@ -164,6 +164,7 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_VOLUME_NAME="SHREDOS" BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" diff --git a/configs/shredos_iso_defconfig b/configs/shredos_iso_defconfig index a7869850c1..db9f0a26a1 100644 --- a/configs/shredos_iso_defconfig +++ b/configs/shredos_iso_defconfig @@ -167,6 +167,7 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_VOLUME_NAME="SHREDOS" BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" diff --git a/configs/shredos_iso_extra_defconfig b/configs/shredos_iso_extra_defconfig index aec7bbb618..34c1412242 100644 --- a/configs/shredos_iso_extra_defconfig +++ b/configs/shredos_iso_extra_defconfig @@ -168,6 +168,7 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_VOLUME_NAME="SHREDOS" BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" diff --git a/configs/shredos_iso_extra_i586_defconfig b/configs/shredos_iso_extra_i586_defconfig index cabeef7d25..38eb6616d1 100644 --- a/configs/shredos_iso_extra_i586_defconfig +++ b/configs/shredos_iso_extra_i586_defconfig @@ -165,6 +165,7 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_VOLUME_NAME="SHREDOS" BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" diff --git a/configs/shredos_iso_i586_defconfig b/configs/shredos_iso_i586_defconfig index 39793bcc14..f25b247307 100644 --- a/configs/shredos_iso_i586_defconfig +++ b/configs/shredos_iso_i586_defconfig @@ -164,6 +164,7 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_VOLUME_NAME="SHREDOS" BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" diff --git a/configs/shredos_iso_legacy_defconfig b/configs/shredos_iso_legacy_defconfig index 78935de472..676ad43f59 100644 --- a/configs/shredos_iso_legacy_defconfig +++ b/configs/shredos_iso_legacy_defconfig @@ -167,6 +167,7 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_VOLUME_NAME="SHREDOS" BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" diff --git a/configs/shredos_iso_legacy_i586_defconfig b/configs/shredos_iso_legacy_i586_defconfig index addfb68bda..78976354dd 100644 --- a/configs/shredos_iso_legacy_i586_defconfig +++ b/configs/shredos_iso_legacy_i586_defconfig @@ -164,6 +164,7 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_VOLUME_NAME="SHREDOS" BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" diff --git a/fs/iso9660/Config.in b/fs/iso9660/Config.in index c66367ce35..8c80efda9a 100644 --- a/fs/iso9660/Config.in +++ b/fs/iso9660/Config.in @@ -75,6 +75,17 @@ config BR2_TARGET_ROOTFS_ISO9660_BIOS_BOOTLOADER config BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER bool +config BR2_TARGET_ROOTFS_ISO9660_VOLUME_NAME + string "iso volume name" + default "ISO9660" + help + Set the Volume ID of the ISO image. xorriso accepts any text up to 32 + characters, but according to rarely obeyed specs stricter rules apply: + Conformant are ASCII characters out of [A-Z0-9_], like: "IMAGE_23". Joliet + allows 16 UCS-2 characters, like: "Windows name". Be aware that the volume + ID might get used automatically as name of the mount point when the medium + is inserted into a playful computer system. + config BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU string "Isolinux configuration file" depends on BR2_TARGET_ROOTFS_ISO9660_ISOLINUX || BR2_TARGET_ROOTFS_ISO9660_BOTH @@ -177,20 +188,36 @@ config BR2_TARGET_ROOTFS_ISO9660_HYBRID which the BIOS considers as HDD/removable device (e.g. USB stick) config BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION - string "Append hybrid partition image" + string "Append partition to hybrid image" depends on BR2_TARGET_ROOTFS_ISO9660_BOTH \ && BR2_TARGET_ROOTFS_ISO9660_HYBRID default "" help - Enable this option to append a prepared FAT16 filesystem - image to the hybrid image, useful when needing a writeable - data partition for USBs - should be considered EXPERIMENTAL. + Enable this option to append a prepared filesystem image + to the hybrid image, useful when needing a writeable data + partition for USBs - should be considered as EXPERIMENTAL. The path is expected to be relative to folder "output/images/". You can use e.g. a BR2_ROOTFS_POST_BUILD_SCRIPT for preparing the respective filesystem image for your target configuration. +config BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION_TYPE + string "Append partition type" + depends on \ + BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION != "" + default "0x0e" + help + May be "FAT12", "FAT16", "Linux", or a hexadecimal number between 0x00 and + 0xff. Not all those numbers will yield usable results. For a list of codes + search the internet for "Partition Types". If the partition appears in GPT + then 0xef is mapped to the EFI System Partition Type GUID. All others get + mapped to Basic Data Type GUID. May also be a type GUID as plain hex + string like a2a0d0ebe5b9334487c068b6b72699c7 or as structured text like + EBD0A0A2-B9E5-4433-87C0-68B6B72699C7. It will be used if the partition is + mentioned in GPT. In MBR, C12A7328-F81F-11D2-BA4B-00A0C93EC93B will be + mapped to 0xef. Any other GUID will be mapped to 0x83. + endif comment "iso image needs a Linux kernel and either grub2 or isolinux to be built" diff --git a/fs/iso9660/iso9660.mk b/fs/iso9660/iso9660.mk index 5feea015a4..1f1ef00a59 100644 --- a/fs/iso9660/iso9660.mk +++ b/fs/iso9660/iso9660.mk @@ -29,12 +29,14 @@ ROOTFS_ISO9660_DEPENDENCIES = host-xorriso linux +ROOTFS_ISO9660_VOLUME_NAME = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_VOLUME_NAME)) ROOTFS_ISO9660_GRUB2_BOOT_MENU = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU)) ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU)) ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE)) ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE)) ROOTFS_ISO9660_ISOLINUX_BOOT_MENU = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU)) ROOTFS_ISO9660_HYBRID_APPEND_PARTITION = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION)) +ROOTFS_ISO9660_HYBRID_APPEND_PARTITION_TYPE = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION_TYPE)) ################################################################################ # Architecture-specific variables @@ -370,7 +372,7 @@ ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_INSTALL_BOOTLOADERS # modern Debian distributions (see .disk/mkisofs inside one of their ISOs) ################################################################################ -ROOTFS_ISO9660_OPTS += -r -V 'ISO9660' -J -joliet-long -cache-inodes +ROOTFS_ISO9660_OPTS += -r -V '$(ROOTFS_ISO9660_VOLUME_NAME)' -J -joliet-long -cache-inodes ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BOTH)$(BR2_TARGET_ROOTFS_ISO9660_HYBRID),yy) # BOTH + HYBRID (uses ISOLINUX) @@ -429,10 +431,11 @@ ROOTFS_ISO9660_OPTS += \ $(ROOTFS_ISO9660_OPTS_BIOS) \ -eltorito-alt-boot \ $(ROOTFS_ISO9660_OPTS_EFI) -# Append an extra FAT16 partition image (if one was provided, for hybrid mode) +# Append an extra partition image, if one was provided (for hybrid images) ifneq ($(ROOTFS_ISO9660_HYBRID_APPEND_PARTITION),) ROOTFS_ISO9660_OPTS += \ - -append_partition 3 0x0e $(BINARIES_DIR)/$(ROOTFS_ISO9660_HYBRID_APPEND_PARTITION) \ + -append_partition 3 $(ROOTFS_ISO9660_HYBRID_APPEND_PARTITION_TYPE) \ + $(BINARIES_DIR)/$(ROOTFS_ISO9660_HYBRID_APPEND_PARTITION) \ -partition_cyl_align all endif From 6c49c409228d71e1a2843da4f1071039700fe89e Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Sat, 22 Nov 2025 08:04:34 +0100 Subject: [PATCH 29/35] chore: adapt documentation for current state Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 18d71f489c..7c98547868 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ NOTE! There may be pre-release versions that are newer than the latest versions ### For all releases including latest and more recent pre-releases [releases](https://github.com/PartialVolume/shredos.x86_64/releases) -Note for versions **after** _v2024.11_27_x86-64_0.38_: The .img files for burning to USB flash drives support both BIOS/UEFI booting, as well as saving of generated PDF reports to the USB flash drive. The .iso image also supports both BIOS/UEFI booting, burning to USB flash drives and CD/DVD-ROM, but not saving of generated PDF reports to the own USB flash drive (unless being written in "ISO-Mode" with some tools, such as Rufus). Use the .img file whenever needing these generated PDF reports or planning to customize ShredOS (`autonuke` setups, kernel parameters, ...). The .img file allows direct interaction with the filesystem and modification of the GRUB boot menu, e.g. appending of kernel parameters, which the .iso file does not support due to filesystem constraints. +Note for versions **after** _v2024.11_27_x86-64_0.38_: The .img files for burning to USB flash drives support both BIOS/UEFI booting, as well as saving of generated PDF reports to the USB flash drive. The .iso image also supports both BIOS/UEFI booting, burning to USB flash drives and CD/DVD-ROM, but not (yet) saving of generated PDF reports to the USB flash drive (unless being written in "ISO-Mode" with some tools, such as Rufus). Use the .img file whenever needing these generated PDF reports or planning to customize ShredOS (`autonuke` setups, kernel parameters, ...). The .img file allows direct interaction with the filesystem and modification of the GRUB boot menu, e.g. appending of kernel parameters, which the .iso file does not support due to filesystem constraints. Note for versions **until** _v2024.11_27_x86-64_0.38_: The .img files for burning to USB flash drives support both BIOS/UEFI booting. The .iso image supports legacy BIOS booting only and not UEFI, however, a BIOS/UEFI version of the .iso is available in newer ShredOS versions. You can also consider [VENTOY (Open Source tool to create bootable USB drive for ISO/WIM/IMG/VHD(x)/EFI files)](https://github.com/ventoy/Ventoy) as a workaround to avoid BIOS/UEFI issues. @@ -844,11 +844,11 @@ Do note that loading a configuration should typically be the last step before `m >- **but** do not have a writeable partition for PDFs/configurations > > Some tools such as Rufus offer an "ISO-Mode", which enable such a writeable -> partition (at burn-time). But this is not something that can be added to the -> ISO on the distribution side (at build-time), as it would break the hybrid -> functionality and standards that are needed for burning the ISO to CD/DVD-ROM. +> partition at burn-time, which then also allows customization of the GRUB +> configuration. > ->The **legacy** ISOs work in BIOS and UEFI, but only burned to CD/DVD-ROM. +>The **extra** ISOs (experimental) have an "extra" write partition appended. +>The **legacy** ISOs work in BIOS and UEFI, but only as burned to CD/DVD-ROM. #### Building multiple configurations: From 2120a2d87a17adf7aab1b7975c3c79b58c49363e Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Sat, 22 Nov 2025 08:10:46 +0100 Subject: [PATCH 30/35] fix(configs): add missing argument Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- configs/shredos_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/shredos_defconfig b/configs/shredos_defconfig index a5a41bdd9c..e15d7ed364 100644 --- a/configs/shredos_defconfig +++ b/configs/shredos_defconfig @@ -167,6 +167,7 @@ BR2_TARGET_ROOTFS_CPIO_LZMA=y BR2_TARGET_ROOTFS_INITRAMFS=y BR2_TARGET_ROOTFS_ISO9660=y BR2_TARGET_ROOTFS_ISO9660_BOTH=y +BR2_TARGET_ROOTFS_ISO9660_VOLUME_NAME="SHREDOS" BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU="board/shredos/iso/isolinux.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU="board/shredos/iso/grub.cfg" BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU="board/shredos/iso/efigrub.cfg" From d5ae3d10f6ea67f90f1fde7ca3dce52af184a68f Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Sat, 22 Nov 2025 09:27:13 +0100 Subject: [PATCH 31/35] chore: adapt documentation for current state Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7c98547868..e04ad296ba 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ NOTE! There may be pre-release versions that are newer than the latest versions ### For all releases including latest and more recent pre-releases [releases](https://github.com/PartialVolume/shredos.x86_64/releases) -Note for versions **after** _v2024.11_27_x86-64_0.38_: The .img files for burning to USB flash drives support both BIOS/UEFI booting, as well as saving of generated PDF reports to the USB flash drive. The .iso image also supports both BIOS/UEFI booting, burning to USB flash drives and CD/DVD-ROM, but not (yet) saving of generated PDF reports to the USB flash drive (unless being written in "ISO-Mode" with some tools, such as Rufus). Use the .img file whenever needing these generated PDF reports or planning to customize ShredOS (`autonuke` setups, kernel parameters, ...). The .img file allows direct interaction with the filesystem and modification of the GRUB boot menu, e.g. appending of kernel parameters, which the .iso file does not support due to filesystem constraints. +Note for versions **after** _v2024.11_27_x86-64_0.38_: The .img files for burning to USB flash drives support both BIOS/UEFI booting, as well as saving of generated PDF reports to the USB flash drive. The .iso image also supports both BIOS/UEFI booting, burning to USB flash drives and CD/DVD-ROM, but not (yet) saving of generated PDF reports to the USB flash drive (unless being written in "ISO-Mode" with some tools, such as Rufus). Use the .img file whenever needing these generated PDF reports or planning to customize ShredOS (`autonuke` setups, kernel parameters, ...). The .img file also allows direct interaction with the filesystem and modification of the GRUB boot menu, e.g. appending of kernel parameters, which the .iso file does not support due to filesystem constraints. Note for versions **until** _v2024.11_27_x86-64_0.38_: The .img files for burning to USB flash drives support both BIOS/UEFI booting. The .iso image supports legacy BIOS booting only and not UEFI, however, a BIOS/UEFI version of the .iso is available in newer ShredOS versions. You can also consider [VENTOY (Open Source tool to create bootable USB drive for ISO/WIM/IMG/VHD(x)/EFI files)](https://github.com/ventoy/Ventoy) as a workaround to avoid BIOS/UEFI issues. @@ -905,7 +905,7 @@ If launched without arguments, it will show a usage manual on the screen. make_img_file.sh is a bash script, the main purpose of which is to generate the .img file located in output/images/. However it is also used to copy the compiled .efi file and other files such as the shredos.ico, autorun.inf for Windows, README.txt. The contents of board/shredos/version.txt is also used to rename the .img file with version info and the current date and time. #### ../board/shredos/make_iso_file.sh -make_iso_file.sh is a bash script, the main purpose of which is to generate the .iso file located in output/images/. The contents of board/shredos/version.txt is used to rename the .iso file with version info and the current date and time. +make_iso_file.sh is a bash script, the main purpose of which is to rename the .iso file located in output/images/. The contents of board/shredos/version.txt is used to rename the .iso file with version info and the current date and time. #### ../board/shredos/grub.cfg The USB image's GRUB configuration, which both the BIOS and UEFI bootloader will use. From fc80af2fb4bf027309710b0c83f8beedc0790715 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Sat, 22 Nov 2025 09:41:39 +0100 Subject: [PATCH 32/35] fix(iso9660): use buildroot rm, adapt comment Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- fs/iso9660/iso9660.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/iso9660/iso9660.mk b/fs/iso9660/iso9660.mk index 1f1ef00a59..1eb6abb1b6 100644 --- a/fs/iso9660/iso9660.mk +++ b/fs/iso9660/iso9660.mk @@ -148,7 +148,7 @@ define ROOTFS_ISO9660_INSTALL_GRUB2_EFI $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_EFI_PARTITION_CONTENT)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NAME) \ $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NAME) # Create EFI FAT partition - rm -rf $(ROOTFS_ISO9660_EFI_PARTITION_PATH) + $(RM) -rf $(ROOTFS_ISO9660_EFI_PARTITION_PATH) mkdir -p $(dir $(ROOTFS_ISO9660_EFI_PARTITION_PATH)) dd if=/dev/zero of=$(ROOTFS_ISO9660_EFI_PARTITION_PATH) bs=$(ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE) count=1 $(HOST_DIR)/sbin/mkfs.vfat $(ROOTFS_ISO9660_VFAT_OPTS) $(ROOTFS_ISO9660_EFI_PARTITION_PATH) @@ -159,7 +159,7 @@ define ROOTFS_ISO9660_INSTALL_GRUB2_EFI # Delete the EFI bootloader that is NOT for the platform we're building for $(HOST_DIR)/bin/mdel -i $(ROOTFS_ISO9660_EFI_PARTITION_PATH) \ ::$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NOTNAME) || true - # Copy EFI configuration to EFI partition + # Overwrite generic EFI configuration with our EFI configuration $(HOST_DIR)/bin/mcopy -n -o -p -m -i $(ROOTFS_ISO9660_EFI_PARTITION_PATH) \ $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH) ::$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/grub.cfg $(ROOTFS_ISO9660_FIX_TIME) $(ROOTFS_ISO9660_EFI_PARTITION_PATH) @@ -255,7 +255,7 @@ define ROOTFS_ISO9660_INSTALL_GRUB2_EFI $(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_EFI_PARTITION_CONTENT)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NAME) \ $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NAME) # Create EFI FAT partition - rm -rf $(ROOTFS_ISO9660_EFI_PARTITION_PATH) + $(RM) -rf $(ROOTFS_ISO9660_EFI_PARTITION_PATH) mkdir -p $(dir $(ROOTFS_ISO9660_EFI_PARTITION_PATH)) dd if=/dev/zero of=$(ROOTFS_ISO9660_EFI_PARTITION_PATH) bs=$(ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE) count=1 $(HOST_DIR)/sbin/mkfs.vfat $(ROOTFS_ISO9660_VFAT_OPTS) $(ROOTFS_ISO9660_EFI_PARTITION_PATH) @@ -266,7 +266,7 @@ define ROOTFS_ISO9660_INSTALL_GRUB2_EFI # Delete the EFI bootloader that is NOT for the platform we're building for $(HOST_DIR)/bin/mdel -i $(ROOTFS_ISO9660_EFI_PARTITION_PATH) \ ::$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/$(ROOTFS_ISO9660_EFI_NOTNAME) || true - # Copy EFI configuration to EFI partition + # Overwrite generic EFI configuration with our EFI configuration $(HOST_DIR)/bin/mcopy -n -o -p -m -i $(ROOTFS_ISO9660_EFI_PARTITION_PATH) \ $(ROOTFS_ISO9660_GRUB2_EFI_CONFIG_PATH) ::$(ROOTFS_ISO9660_GRUB2_EFI_PREFIX)/grub.cfg $(ROOTFS_ISO9660_FIX_TIME) $(ROOTFS_ISO9660_EFI_PARTITION_PATH) From ef681882070847593c64c9c5707d0ac1bb83a1c5 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Sat, 22 Nov 2025 09:51:07 +0100 Subject: [PATCH 33/35] fix(iso9660): menu ordering Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- fs/iso9660/Config.in | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/iso9660/Config.in b/fs/iso9660/Config.in index 8c80efda9a..3166b1a724 100644 --- a/fs/iso9660/Config.in +++ b/fs/iso9660/Config.in @@ -204,8 +204,9 @@ config BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION config BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION_TYPE string "Append partition type" - depends on \ - BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION != "" + depends on BR2_TARGET_ROOTFS_ISO9660_BOTH \ + && BR2_TARGET_ROOTFS_ISO9660_HYBRID \ + && BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION != "" default "0x0e" help May be "FAT12", "FAT16", "Linux", or a hexadecimal number between 0x00 and From 0f77cd2a7f5548bdfd9eea2044929352d693b3d5 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Sat, 22 Nov 2025 10:00:21 +0100 Subject: [PATCH 34/35] fix(iso9660): menu indentation Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- fs/iso9660/Config.in | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/fs/iso9660/Config.in b/fs/iso9660/Config.in index 3166b1a724..2dc0610d18 100644 --- a/fs/iso9660/Config.in +++ b/fs/iso9660/Config.in @@ -23,9 +23,11 @@ if BR2_TARGET_ROOTFS_ISO9660 choice prompt "Bootloader" + depends on BR2_TARGET_ROOTFS_ISO9660 config BR2_TARGET_ROOTFS_ISO9660_GRUB2 bool "grub2" + depends on BR2_TARGET_ROOTFS_ISO9660 depends on BR2_TARGET_GRUB2 \ && (BR2_TARGET_GRUB2_I386_EFI || BR2_TARGET_GRUB2_X86_64_EFI) select BR2_TARGET_ROOTFS_ISO9660_BIOS_BOOTLOADER \ @@ -45,6 +47,7 @@ config BR2_TARGET_ROOTFS_ISO9660_GRUB2 config BR2_TARGET_ROOTFS_ISO9660_ISOLINUX bool "isolinux" + depends on BR2_TARGET_ROOTFS_ISO9660 depends on BR2_TARGET_SYSLINUX_ISOLINUX select BR2_TARGET_ROOTFS_ISO9660_BIOS_BOOTLOADER help @@ -54,6 +57,7 @@ config BR2_TARGET_ROOTFS_ISO9660_ISOLINUX config BR2_TARGET_ROOTFS_ISO9660_BOTH bool "both" + depends on BR2_TARGET_ROOTFS_ISO9660 depends on BR2_TARGET_SYSLINUX_ISOLINUX depends on BR2_TARGET_GRUB2 \ && (BR2_TARGET_GRUB2_I386_EFI || BR2_TARGET_GRUB2_X86_64_EFI) @@ -77,6 +81,7 @@ config BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER config BR2_TARGET_ROOTFS_ISO9660_VOLUME_NAME string "iso volume name" + depends on BR2_TARGET_ROOTFS_ISO9660 default "ISO9660" help Set the Volume ID of the ISO image. xorriso accepts any text up to 32 @@ -88,6 +93,7 @@ config BR2_TARGET_ROOTFS_ISO9660_VOLUME_NAME config BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU string "Isolinux configuration file" + depends on BR2_TARGET_ROOTFS_ISO9660 depends on BR2_TARGET_ROOTFS_ISO9660_ISOLINUX || BR2_TARGET_ROOTFS_ISO9660_BOTH default "fs/iso9660/isolinux.cfg" help @@ -100,6 +106,7 @@ config BR2_TARGET_ROOTFS_ISO9660_ISOLINUX_BOOT_MENU config BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU string "Grub2 configuration file" + depends on BR2_TARGET_ROOTFS_ISO9660 depends on BR2_TARGET_ROOTFS_ISO9660_GRUB2 || BR2_TARGET_ROOTFS_ISO9660_BOTH default "fs/iso9660/grub.cfg" help @@ -112,6 +119,7 @@ config BR2_TARGET_ROOTFS_ISO9660_GRUB2_BOOT_MENU config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU string "Grub2 configuration file (EFI)" + depends on BR2_TARGET_ROOTFS_ISO9660 depends on (BR2_TARGET_ROOTFS_ISO9660_GRUB2 || BR2_TARGET_ROOTFS_ISO9660_BOTH) \ && BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER default "fs/iso9660/efigrub.cfg" @@ -137,6 +145,7 @@ config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_BOOT_MENU config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE string "Grub2 identification file (EFI)" + depends on BR2_TARGET_ROOTFS_ISO9660 depends on (BR2_TARGET_ROOTFS_ISO9660_GRUB2 || BR2_TARGET_ROOTFS_ISO9660_BOTH) \ && BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER default "/boot/buildroot" @@ -147,6 +156,7 @@ config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_IDENT_FILE config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE string "Grub2 partition size (EFI)" + depends on BR2_TARGET_ROOTFS_ISO9660 depends on (BR2_TARGET_ROOTFS_ISO9660_GRUB2 || BR2_TARGET_ROOTFS_ISO9660_BOTH) \ && BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER default "3M" @@ -160,6 +170,7 @@ config BR2_TARGET_ROOTFS_ISO9660_GRUB2_EFI_PARTITION_SIZE config BR2_TARGET_ROOTFS_ISO9660_INITRD bool "Use initrd" + depends on BR2_TARGET_ROOTFS_ISO9660 depends on !BR2_TARGET_ROOTFS_INITRAMFS default y select BR2_TARGET_ROOTFS_CPIO @@ -172,6 +183,7 @@ config BR2_TARGET_ROOTFS_ISO9660_INITRD config BR2_TARGET_ROOTFS_ISO9660_TRANSPARENT_COMPRESSION bool "transparent compression" + depends on BR2_TARGET_ROOTFS_ISO9660 depends on !BR2_TARGET_ROOTFS_ISO9660_INITRD depends on !BR2_TARGET_ROOTFS_INITRAMFS help @@ -181,6 +193,7 @@ config BR2_TARGET_ROOTFS_ISO9660_TRANSPARENT_COMPRESSION config BR2_TARGET_ROOTFS_ISO9660_HYBRID bool "Build hybrid image" + depends on BR2_TARGET_ROOTFS_ISO9660 depends on BR2_TARGET_ROOTFS_ISO9660_ISOLINUX || BR2_TARGET_ROOTFS_ISO9660_BOTH help Enable this option to build a hybrid image, which is an image @@ -189,8 +202,9 @@ config BR2_TARGET_ROOTFS_ISO9660_HYBRID config BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION string "Append partition to hybrid image" - depends on BR2_TARGET_ROOTFS_ISO9660_BOTH \ - && BR2_TARGET_ROOTFS_ISO9660_HYBRID + depends on BR2_TARGET_ROOTFS_ISO9660 + depends on BR2_TARGET_ROOTFS_ISO9660_BOTH + depends on BR2_TARGET_ROOTFS_ISO9660_HYBRID default "" help Enable this option to append a prepared filesystem image @@ -204,9 +218,10 @@ config BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION config BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION_TYPE string "Append partition type" - depends on BR2_TARGET_ROOTFS_ISO9660_BOTH \ - && BR2_TARGET_ROOTFS_ISO9660_HYBRID \ - && BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION != "" + depends on BR2_TARGET_ROOTFS_ISO9660 + depends on BR2_TARGET_ROOTFS_ISO9660_BOTH + depends on BR2_TARGET_ROOTFS_ISO9660_HYBRID + depends on BR2_TARGET_ROOTFS_ISO9660_HYBRID_APPEND_PARTITION != "" default "0x0e" help May be "FAT12", "FAT16", "Linux", or a hexadecimal number between 0x00 and From 046c1bd1c9bdd51f8f75321d73d5a70669ea0237 Mon Sep 17 00:00:00 2001 From: desertwitch <24509509+desertwitch@users.noreply.github.com> Date: Sat, 22 Nov 2025 10:15:50 +0100 Subject: [PATCH 35/35] chore: clarification in documentation Signed-off-by: desertwitch <24509509+desertwitch@users.noreply.github.com> --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e04ad296ba..fe96ddc7ae 100644 --- a/README.md +++ b/README.md @@ -831,8 +831,8 @@ $ dd if=shredos-20200412.img of=/dev/sdx (20200412 will be the day you compiled, #### The following experimental configurations are available for testing: -- `make shredos_iso_extra_defconfig` - build hybrid ISO with extra writeable partition (when burned to USB flash drive) (64-bit) -- `make shredos_iso_extra_i586_defconfig` - build hybrid ISO with extra writeable partition (when burned to USB flash drive) (32-bit) +- `make shredos_iso_extra_defconfig` - build hybrid ISO with appended writeable partition (64-bit) +- `make shredos_iso_extra_i586_defconfig` - build hybrid ISO with appended writeable partition (32-bit) Do note that loading a configuration should typically be the last step before `make`.