]>
code.delx.au - monosys/blob - multiboot-setup
6 PARTITION_LABEL
="multiboot"
7 MULTIBOOT_MNT
="/mnt/multiboot"
8 GRUB_CFG
="${MULTIBOOT_MNT}/grub/grub.cfg"
9 SYSLINUX_VERSION
="6.03"
10 SYSLINUX_URL
="https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-${SYSLINUX_VERSION}.tar.gz"
13 if [ ! -b "${1:-}" ]; then
14 echo "Usage: $0 format /dev/sdX"
21 PARTITION_DEVICE
="${DISK_DEVICE}1"
22 echo -ne 'label: dos\ntype=c, bootable\n' | sudo sfdisk
"$DISK_DEVICE"
23 sudo mkfs.vfat
-n "$PARTITION_LABEL" "$PARTITION_DEVICE"
26 function cmd_bootloader
{
27 DISK_DEVICE
="$(mount|grep /mnt/multiboot|cut -d' ' -f1|sed 's/[0-9]*$//')"
28 if [ ! -b "$DISK_DEVICE" ]; then
29 echo "ERROR! Could not find disk to install bootloader. Try using mount."
40 function install_grub_bios
{
43 --boot-directory="$MULTIBOOT_MNT" \
47 function install_grub_efi
{
52 --efi-directory="$MULTIBOOT_MNT" \
53 --boot-directory="$MULTIBOOT_MNT" \
57 function install_grub_cfg
{
58 mkdir
-p "$(dirname "$GRUB_CFG")"
59 cat <<EOT >> "$GRUB_CFG"
63 search --set=root --label $PARTITION_LABEL
71 PARTITION_DEVICE
="$(readlink -f /dev/disk/by-label/multiboot)"
72 sudo mkdir
-p "$MULTIBOOT_MNT"
73 while sudo umount
"$PARTITION_DEVICE" &> /dev
/null
; do true
; done
74 sudo mount
"$PARTITION_DEVICE" "$MULTIBOOT_MNT" -o "uid=$(whoami)"
80 sudo umount
"$MULTIBOOT_MNT"
81 sudo
rmdir "$MULTIBOOT_MNT"
84 function cmd_add_iso
{
85 if [ ! -f "${1:-}" ]; then
86 echo "Usage: $0 add_iso /path/to/ubuntu.iso"
92 ISO_BASENAME
="$(basename "$ISO_FILENAME")"
93 local f
="$(basename "$ISO_FILENAME")"
95 if [[ "$ISO_BASENAME" == ubuntu-
*-desktop-*.iso
]]; then
97 elif [[ "$ISO_BASENAME" == debian-live-
*.iso
]]; then
99 elif [[ "$ISO_BASENAME" == Fedora-Workstation-Live-
*.iso
]]; then
101 elif [[ "$ISO_BASENAME" == archlinux-
*.iso
]]; then
103 elif [[ "$ISO_BASENAME" == FD12
*.
zip ]]; then
106 echo "Unsupported ISO! $ISO_BASENAME"
110 function setup_ubuntu
{
113 cat <<EOT >> "$GRUB_CFG"
114 menuentry '$ISO_BASENAME' {
115 loopback loop /$ISO_BASENAME
116 linux (loop)/casper/vmlinuz.efi boot=casper quiet iso-scan/filename=/$ISO_BASENAME
117 initrd (loop)/casper/initrd.lz
123 function setup_debian
{
126 cat <<EOT >> "$GRUB_CFG"
127 menuentry '$ISO_BASENAME' {
128 loopback loop /$ISO_BASENAME
129 linux (loop)/live/vmlinuz boot=live components findiso=/$ISO_BASENAME
130 initrd (loop)/live/initrd.img
136 function setup_fedora
{
139 cat <<EOT >> "$GRUB_CFG"
140 menuentry '$ISO_BASENAME' {
141 loopback loop /$ISO_BASENAME
142 linux (loop)/isolinux/vmlinuz root=live:CDLABEL=$(blkid -s LABEL -o value "$ISO_FILENAME") rd.live.image quiet iso-scan/filename=/$ISO_BASENAME
143 initrd (loop)/isolinux/initrd.img
149 function setup_archlinux
{
152 cat <<EOT >> "$GRUB_CFG"
153 menuentry '$ISO_BASENAME' {
154 loopback loop /$ISO_BASENAME
155 linux (loop)/arch/boot/x86_64/vmlinuz img_label=${PARTITION_LABEL} img_loop=$ISO_BASENAME archisobasedir=arch earlymodules=loop
156 initrd (loop)/arch/boot/x86_64/archiso.img
162 function setup_freedos
{
166 cat <<EOT >> "$GRUB_CFG"
167 menuentry '$ISO_BASENAME' {
168 if [ \${grub_platform} = pc ]; then
170 initrd16 /$ISO_BASENAME
172 echo "FreeDOS only works with BIOS boot."
180 function copy_iso_data
{
181 rsync
--size-only --progress "$ISO_FILENAME" "${MULTIBOOT_MNT}/"
184 function install_memdisk
{
185 local dest
="${MULTIBOOT_MNT}/memdisk"
187 if [ -f "$dest" ]; then
191 for maybe
in /usr
/lib
/syslinux
/bios
/memdisk
/usr
/lib
/syslinux
/memdisk
; do
192 if [ -f "$maybe" ]; then
198 curl
--fail "$SYSLINUX_URL" | \
199 tar xz
--strip-components=3 -C "$MULTIBOOT_MNT" \
200 "syslinux-${SYSLINUX_VERSION}/bios/memdisk/memdisk"
206 if [ "$(type -t -- "$CMD")" = "function" ]; then
209 echo "Usage: $0 [format|mount|bootloader|add_iso|umount]"