X-Git-Url: https://code.delx.au/monosys/blobdiff_plain/57f7199f4ba1e108fbb889c80d6dd7b2a17cd66a..599dd6680ce416306c0a0dec4c1d12d9839b25b5:/multiboot-setup diff --git a/multiboot-setup b/multiboot-setup index ab32b6e..3e36eb9 100755 --- a/multiboot-setup +++ b/multiboot-setup @@ -2,15 +2,11 @@ set -eu -ISO_MNT="/mnt/iso" PARTITION_LABEL="multiboot" MULTIBOOT_MNT="/mnt/multiboot" -GRUB_CFG="${MULTIBOOT_MNT}/grub/grub.cfg" -SYSLINUX_VERSION="6.03" -SYSLINUX_URL="https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-${SYSLINUX_VERSION}.tar.gz" function cmd_format { - if [ -z "${1:-}" ]; then + if [ ! -b "${1:-}" ]; then echo "Usage: $0 format /dev/sdX" exit 1 fi @@ -23,8 +19,12 @@ function cmd_format { sudo mkfs.vfat -n "$PARTITION_LABEL" "$PARTITION_DEVICE" } -function cmd_bootloader { - DISK_DEVICE="$(mount|grep /mnt/multiboot|cut -d' ' -f1|sed 's/[0-9]*$//')" +function cmd_grub { + DISK_DEVICE="$(findmnt -n -o source "$MULTIBOOT_MNT" | sed 's/[0-9]*$//')" + if [ ! -b "$DISK_DEVICE" ]; then + echo "ERROR! Could not find disk to install bootloader. Try using mount." + exit 1 + fi set -x sudo -k @@ -33,6 +33,11 @@ function cmd_bootloader { install_grub_cfg } +function cmd_grubcfg { + set -x + install_grub_cfg +} + function install_grub_bios { sudo grub-install \ --target=i386-pc \ @@ -41,30 +46,25 @@ function install_grub_bios { } function install_grub_efi { - sudo grub-install \ - --target=x86_64-efi \ - --no-nvram \ - --removable \ - --efi-directory="$MULTIBOOT_MNT" \ - --boot-directory="$MULTIBOOT_MNT" \ - "$DISK_DEVICE" + for arch in i386-efi x86_64-efi; do + sudo grub-install \ + --target="$arch" \ + --no-nvram \ + --removable \ + --efi-directory="$MULTIBOOT_MNT" \ + --boot-directory="$MULTIBOOT_MNT" \ + "$DISK_DEVICE" + done } function install_grub_cfg { - mkdir -p "$(dirname "$GRUB_CFG")" - cat <> "$GRUB_CFG" -insmod all_video -insmod part_msdos -insmod progress -search --set=root --label $PARTITION_LABEL - -EOT + print_grub_cfg | sudo tee "${MULTIBOOT_MNT}/grub/grub.cfg" > /dev/null } function cmd_mount { set -x - PARTITION_DEVICE="$(readlink -f /dev/disk/by-label/multiboot)" + PARTITION_DEVICE="$(readlink -f "/dev/disk/by-label/${PARTITION_LABEL}")" sudo mkdir -p "$MULTIBOOT_MNT" while sudo umount "$PARTITION_DEVICE" &> /dev/null; do true; done sudo mount "$PARTITION_DEVICE" "$MULTIBOOT_MNT" -o "uid=$(whoami)" @@ -77,131 +77,101 @@ function cmd_umount { sudo rmdir "$MULTIBOOT_MNT" } -function cmd_add_iso { - if [ -z "${1:-}" ]; then - echo "Usage: $0 add_iso /path/to/ubuntu.iso" - exit 1 - fi +function cmd_freedos { set -x - ISO_FILENAME="$1" - ISO_BASENAME="$(basename "$ISO_FILENAME")" - local f="$(basename "$ISO_FILENAME")" - - if [[ "$ISO_BASENAME" == ubuntu-*-desktop-*.iso ]]; then - setup_ubuntu - elif [[ "$ISO_BASENAME" == debian-live-*.iso ]]; then - setup_debian - elif [[ "$ISO_BASENAME" == Fedora-Workstation-Live-*.iso ]]; then - setup_fedora - elif [[ "$ISO_BASENAME" == archlinux-*.iso ]]; then - setup_archlinux - elif [[ "$ISO_BASENAME" == FD12*.zip ]]; then - setup_freedos - else - echo "Unsupported ISO! $ISO_BASENAME" - fi -} + local SYSLINUX_VERSION="6.03" + local SYSLINUX_URL="https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-${SYSLINUX_VERSION}.tar.gz" + local FREEDOS_URL="http://www.freedos.org/download/download/FD12LITE.zip" -function setup_ubuntu { - copy_iso_data + curl -fL "$SYSLINUX_URL" | \ + tar xz --no-same-owner --strip-components=3 -C "$MULTIBOOT_MNT" \ + "syslinux-${SYSLINUX_VERSION}/bios/memdisk/memdisk" - cat <> "$GRUB_CFG" -menuentry '$ISO_BASENAME' { - loopback loop /$ISO_BASENAME - linux (loop)/casper/vmlinuz.efi boot=casper quiet iso-scan/filename=/$ISO_BASENAME - initrd (loop)/casper/initrd.lz + curl -fL "$FREEDOS_URL" > "${MULTIBOOT_MNT}/FD12LITE.zip" } -EOT +function print_grub_cfg { + cat <> "$GRUB_CFG" -menuentry '$ISO_BASENAME' { - loopback loop /$ISO_BASENAME - linux (loop)/live/vmlinuz boot=live components findiso=/$ISO_BASENAME - initrd (loop)/live/initrd.img -} + menuentry "\$1" { + linux \$1/vmlinuz + initrd \$1/initrd.gz + } +} +for d in /debian-*-hd-media; do + if [ -d "\$d" ]; then + setup_debian \$d + fi +done -EOT -} +if [ -f /memdisk -a -f /FD12LITE.zip ]; then + menuentry /FD12LITE.zip { + if [ \${grub_platform} = pc ]; then + linux16 /memdisk raw + initrd16 /FD12LITE.zip + else + echo "FreeDOS only works with BIOS boot." + sleep 3 + fi + } +fi function setup_fedora { - copy_iso_data - - cat <> "$GRUB_CFG" -menuentry '$ISO_BASENAME' { - loopback loop /$ISO_BASENAME - linux (loop)/isolinux/vmlinuz root=live:CDLABEL=$(blkid -s LABEL -o value "$ISO_FILENAME") rd.live.image quiet iso-scan/filename=/$ISO_BASENAME - initrd (loop)/isolinux/initrd.img -} - -EOT -} - -function setup_archlinux { - copy_iso_data - - cat <> "$GRUB_CFG" -menuentry '$ISO_BASENAME' { - loopback loop /$ISO_BASENAME - linux (loop)/arch/boot/x86_64/vmlinuz img_label=${PARTITION_LABEL} img_loop=$ISO_BASENAME archisobasedir=arch earlymodules=loop - initrd (loop)/arch/boot/x86_64/archiso.img -} - -EOT -} + menuentry "\$1" { + loopback loop \$1 + probe -s iso_label -l (loop) + linux (loop)/isolinux/vmlinuz root=live:CDLABEL=\$iso_label rd.live.image quiet iso-scan/filename=\$1 + initrd (loop)/isolinux/initrd.img + } +} +for iso in /Fedora-Workstation-Live-*.iso; do + if [ -f "\$iso" ]; then + setup_fedora \$iso + fi +done -function setup_freedos { - install_memdisk - copy_iso_data - - cat <> "$GRUB_CFG" -menuentry '$ISO_BASENAME' { - if [ \${grub_platform} = pc ]; then - linux16 /memdisk raw - initrd16 /$ISO_BASENAME - else - echo "FreeDOS only works with BIOS boot." - sleep 3 +function setup_ubuntu { + menuentry "\$1" { + loopback loop \$1 + linux (loop)/casper/vmlinuz* boot=casper quiet iso-scan/filename=\$1 + initrd (loop)/casper/initrd* + } +} +for iso in /ubuntu-*-desktop-*.iso; do + if [ -f "\$iso" ]; then + setup_ubuntu \$iso fi -} +done EOT } -function copy_iso_data { - rsync --size-only --progress "$ISO_FILENAME" "${MULTIBOOT_MNT}/" -} - -function install_memdisk { - local dest="${MULTIBOOT_MNT}/memdisk" - - if [ -f "$dest" ]; then - return - fi - - for maybe in /usr/lib/syslinux/bios/memdisk /usr/lib/syslinux/memdisk; do - if [ -f "$maybe" ]; then - cp "$maybe" "$dest" - return - fi - done - - curl --fail "$SYSLINUX_URL" | \ - tar xz --strip-components=3 -C "$MULTIBOOT_MNT" \ - "syslinux-${SYSLINUX_VERSION}/bios/memdisk/memdisk" -} - CMD="cmd_${1:-}" shift || true if [ "$(type -t -- "$CMD")" = "function" ]; then "${CMD}" "$@" else - echo "Usage: $0 [format|mount|bootloader|add_iso|umount]" + echo "Usage: $0 [format|mount|grub|grubcfg|freedos|umount]" exit 1 fi