]> code.delx.au - monosys/blobdiff - multiboot-setup
multiboot: fixed old Ubuntu ISOs
[monosys] / multiboot-setup
index ab32b6e2377e7aeb190f6865cc657f2f62ee839c..3e36eb9a262238a903df790ac80305e869dc262e 100755 (executable)
@@ -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 <<EOT >> "$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 <<EOT >> "$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 <<EOT
+insmod all_video
+insmod part_msdos
+insmod progress
+insmod regexp
+search --set=root --label $PARTITION_LABEL
+
+function setup_arch {
+  menuentry "\$1" {
+    loopback loop \$1
+    linux (loop)/arch/boot/x86_64/vmlinuz img_label=${PARTITION_LABEL} img_loop=\$1 archisobasedir=arch earlymodules=loop
+    initrd (loop)/arch/boot/x86_64/archiso.img
+  }
 }
+for iso in /archlinux-*.iso; do
+  if [ -f "\$iso" ]; then
+    setup_arch \$iso
+  fi
+done
 
 function setup_debian {
-    copy_iso_data
-
-    cat <<EOT >> "$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 <<EOT >> "$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 <<EOT >> "$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 <<EOT >> "$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