From 2f09fa927bfd5e930c5337c56b851272bd0d0622 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 2 Jun 2024 21:56:05 +0200 Subject: [PATCH] first steps --- .gitignore | 1 + README.md | 31 +++++++- create_bootable.sh | 178 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 209 insertions(+), 1 deletion(-) create mode 100644 create_bootable.sh diff --git a/.gitignore b/.gitignore index c674098..ccdb427 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ # .nfs files are created when an open file is removed but is still being accessed .nfs* +*.iso diff --git a/README.md b/README.md index 270d9e2..4195e53 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,32 @@ # reHDD-Bootable -Scripts and tools to create a bootable image with reHDD based on debian. \ No newline at end of file +Scripts and tools to create a bootable image with reHDD based on debian. + +## Requirements + +The scripts are used to run within a Debian-based machine as host. +Use a host os that is installed/started in UEFI mode. + +``` +apt-get install \ + debootstrap \ + squashfs-tools \ + xorriso \ + isolinux \ + syslinux-efi \ + grub-pc-bin \ + grub-efi-amd64-bin \ + grub-efi-ia32-bin \ + mtools \ + dosfstools \ + screenfetch \ + htop \ + git \ + curl + +``` + + +## Test + +`qemu-system-x86_64 -boot d -cdrom reHDD_Bootable.iso -m 1024 -smp 2` \ No newline at end of file diff --git a/create_bootable.sh b/create_bootable.sh new file mode 100644 index 0000000..02c0543 --- /dev/null +++ b/create_bootable.sh @@ -0,0 +1,178 @@ + +ROOT_PASSWORD="rehdd" + + +# Create a working directory +mkdir -p "${HOME}/LIVE_BOOT" + +# Create environment live directories +mkdir -p "${HOME}/LIVE_BOOT"/{staging/{EFI/BOOT,boot/grub/x86_64-efi,isolinux,live},tmp} + +# Download Debian environment +debootstrap \ + --arch=amd64 \ + --variant=minbase \ + stable \ + "${HOME}/LIVE_BOOT/chroot" \ + http://ftp.de.debian.org/debian/ + +# Set hostname +echo "reHDD" | sudo tee "${HOME}/LIVE_BOOT/chroot/etc/hostname" + +# Install Linux Kernel +chroot "${HOME}/LIVE_BOOT/chroot" << EOF +apt-get update && \ +apt-get install -y --no-install-recommends \ + linux-image-amd64 \ + live-boot \ + systemd-sysv +EOF + +# Install packages +chroot "${HOME}/LIVE_BOOT/chroot" << EOF +apt-get install -y --no-install-recommends \ + iwd \ + curl openssh-client \ + nano +EOF + +# Set root password +chroot "${HOME}/LIVE_BOOT/chroot" passwd root + +# Compress the chroot environment into a Squash filesystem +mksquashfs \ + "${HOME}/LIVE_BOOT/chroot" \ + "${HOME}/LIVE_BOOT/staging/live/filesystem.squashfs" \ + -e boot + +# Copy the kernel from inside the chroot to the live directory. +cp "${HOME}/LIVE_BOOT/chroot/boot"/vmlinuz-* \ + "${HOME}/LIVE_BOOT/staging/live/vmlinuz" + +# Copy initramfs from inside the chroot to the live directory. +cp "${HOME}/LIVE_BOOT/chroot/boot"/initrd.img-* \ + "${HOME}/LIVE_BOOT/staging/live/initrd" + + +# Create an ISOLINUX (Syslinux) boot menu +cat <<'EOF' > "${HOME}/LIVE_BOOT/staging/isolinux/isolinux.cfg" +UI vesamenu.c32 + +MENU TITLE Boot Menu +DEFAULT linux +TIMEOUT 600 +MENU RESOLUTION 640 480 +MENU COLOR border 30;44 #40ffffff #a0000000 std +MENU COLOR title 1;36;44 #9033ccff #a0000000 std +MENU COLOR sel 7;37;40 #e0ffffff #20ffffff all +MENU COLOR unsel 37;44 #50ffffff #a0000000 std +MENU COLOR help 37;40 #c0ffffff #a0000000 std +MENU COLOR timeout_msg 37;40 #80ffffff #00000000 std +MENU COLOR timeout 1;37;40 #c0ffffff #00000000 std +MENU COLOR msg07 37;40 #90ffffff #a0000000 std +MENU COLOR tabmsg 31;40 #30ffffff #00000000 std + +LABEL linux + MENU LABEL reHDD [BIOS] + MENU DEFAULT + KERNEL /live/vmlinuz + APPEND initrd=/live/initrd boot=live +EOF + +# Create an EFI/UEFI boot menu +cat <<'EOF' > "${HOME}/LIVE_BOOT/staging/boot/grub/grub.cfg" +insmod part_gpt +insmod part_msdos +insmod fat +insmod iso9660 + +insmod all_video +insmod font + +set default="0" +set timeout=30 + +# If X has issues finding screens, experiment with/without nomodeset. + +menuentry "reHDD [UEFI]" { + search --no-floppy --set=root --label DEBLIVE + linux ($root)/live/vmlinuz boot=live + initrd ($root)/live/initrd +} +EOF + +# Copy the grub.cfg file to the EFI BOOT directory +cp "${HOME}/LIVE_BOOT/staging/boot/grub/grub.cfg" "${HOME}/LIVE_BOOT/staging/EFI/BOOT/" + +# Create helper GRUB boot config +cat <<'EOF' > "${HOME}/LIVE_BOOT/tmp/grub-embed.cfg" +if ! [ -d "$cmdpath" ]; then + # On some firmware, GRUB has a wrong cmdpath when booted from an optical disc. + # https://gitlab.archlinux.org/archlinux/archiso/-/issues/183 + if regexp --set=1:isodevice '^(\([^)]+\))\/?[Ee][Ff][Ii]\/[Bb][Oo][Oo][Tt]\/?$' "$cmdpath"; then + cmdpath="${isodevice}/EFI/BOOT" + fi +fi +configfile "${cmdpath}/grub.cfg" +EOF + +# Copy BIOS/legacy boot required files to live environment +cp /usr/lib/ISOLINUX/isolinux.bin "${HOME}/LIVE_BOOT/staging/isolinux/" +cp /usr/lib/syslinux/modules/bios/* "${HOME}/LIVE_BOOT/staging/isolinux/" + +# Copy EFI/modern boot required files to live environment +cp -r /usr/lib/grub/x86_64-efi/* "${HOME}/LIVE_BOOT/staging/boot/grub/x86_64-efi/" + +# Generate an EFI bootable GRUB image. +grub-mkstandalone -O i386-efi \ + --modules="part_gpt part_msdos fat iso9660" \ + --locales="" \ + --themes="" \ + --fonts="" \ + --output="${HOME}/LIVE_BOOT/staging/EFI/BOOT/BOOTIA32.EFI" \ + "boot/grub/grub.cfg=${HOME}/LIVE_BOOT/tmp/grub-embed.cfg" + +grub-mkstandalone -O x86_64-efi \ + --modules="part_gpt part_msdos fat iso9660" \ + --locales="" \ + --themes="" \ + --fonts="" \ + --output="${HOME}/LIVE_BOOT/staging/EFI/BOOT/BOOTx64.EFI" \ + "boot/grub/grub.cfg=${HOME}/LIVE_BOOT/tmp/grub-embed.cfg" + +# Create a FAT16 UEFI boot disk image containing the EFI bootloaders. +(cd "${HOME}/LIVE_BOOT/staging" && \ + dd if=/dev/zero of=efiboot.img bs=1M count=20 && \ + mkfs.vfat efiboot.img && \ + mmd -i efiboot.img ::/EFI ::/EFI/BOOT && \ + mcopy -vi efiboot.img \ + "${HOME}/LIVE_BOOT/staging/EFI/BOOT/BOOTIA32.EFI" \ + "${HOME}/LIVE_BOOT/staging/EFI/BOOT/BOOTx64.EFI" \ + "${HOME}/LIVE_BOOT/staging/boot/grub/grub.cfg" \ + ::/EFI/BOOT/ +) + +# Generate ISO from live environment +xorriso \ + -as mkisofs \ + -iso-level 3 \ + -o "${HOME}/LIVE_BOOT/debian-custom.iso" \ + -full-iso9660-filenames \ + -volid "reHDD" \ + --mbr-force-bootable -partition_offset 16 \ + -joliet -joliet-long -rational-rock \ + -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \ + -eltorito-boot \ + isolinux/isolinux.bin \ + -no-emul-boot \ + -boot-load-size 4 \ + -boot-info-table \ + --eltorito-catalog isolinux/isolinux.cat \ + -eltorito-alt-boot \ + -e --interval:appended_partition_2:all:: \ + -no-emul-boot \ + -isohybrid-gpt-basdat \ + -append_partition 2 C12A7328-F81F-11D2-BA4B-00A0C93EC93B ${HOME}/LIVE_BOOT/staging/efiboot.img \ + "${HOME}/LIVE_BOOT/staging" + +cp "${HOME}/LIVE_BOOT/debian-custom.iso" reHDD_Bootable.iso \ No newline at end of file