]>
code.delx.au - monosys/blob - multiboot-setup
5 PARTITION_LABEL
="multiboot"
6 MULTIBOOT_MNT
="/mnt/multiboot"
7 SYSLINUX_VERSION
="6.03"
8 SYSLINUX_URL
="https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-${SYSLINUX_VERSION}.tar.gz"
11 if [ ! -b "${1:-}" ]; then
12 echo "Usage: $0 format /dev/sdX"
19 PARTITION_DEVICE
="${DISK_DEVICE}1"
20 echo -ne 'label: dos\ntype=c, bootable\n' | sudo sfdisk
"$DISK_DEVICE"
21 sudo mkfs.vfat
-n "$PARTITION_LABEL" "$PARTITION_DEVICE"
24 function cmd_bootloader
{
25 DISK_DEVICE
="$(mount|grep /mnt/multiboot|cut -d' ' -f1|sed 's/[0-9]*$//')"
26 if [ ! -b "$DISK_DEVICE" ]; then
27 echo "ERROR! Could not find disk to install bootloader. Try using mount."
37 function install_grub_bios
{
40 --boot-directory="$MULTIBOOT_MNT" \
44 function install_grub_efi
{
49 --efi-directory="$MULTIBOOT_MNT" \
50 --boot-directory="$MULTIBOOT_MNT" \
57 PARTITION_DEVICE
="$(readlink -f /dev/disk/by-label/multiboot)"
58 sudo mkdir
-p "$MULTIBOOT_MNT"
59 while sudo umount
"$PARTITION_DEVICE" &> /dev
/null
; do true
; done
60 sudo mount
"$PARTITION_DEVICE" "$MULTIBOOT_MNT" -o "uid=$(whoami)"
66 sudo umount
"$MULTIBOOT_MNT"
67 sudo
rmdir "$MULTIBOOT_MNT"
70 function cmd_add_iso
{
71 if [ ! -f "${1:-}" ]; then
72 echo "Usage: $0 add_iso /path/to/ubuntu.iso"
78 ISO_BASENAME
="$(basename "$ISO_FILENAME")"
79 GRUB_PART_CFG
="${MULTIBOOT_MNT}/grub/parts/${ISO_BASENAME}"
81 mkdir
-p "$(dirname "$GRUB_PART_CFG")"
83 if [[ "$ISO_BASENAME" == ubuntu-
*-desktop-*.iso
]]; then
85 elif [[ "$ISO_BASENAME" == debian-live-
*.iso
]]; then
87 elif [[ "$ISO_BASENAME" == Fedora-Workstation-Live-
*.iso
]]; then
89 elif [[ "$ISO_BASENAME" == archlinux-
*.iso
]]; then
91 elif [[ "$ISO_BASENAME" == FD12
*.
zip ]]; then
94 echo "Unsupported ISO! $ISO_BASENAME"
97 delete_stray_grub_parts
98 print_grub_cfg
> "${MULTIBOOT_MNT}/grub/grub.cfg"
101 function setup_ubuntu
{
104 cat <<EOT > "$GRUB_PART_CFG"
105 menuentry '$ISO_BASENAME' {
106 loopback loop /$ISO_BASENAME
107 linux (loop)/casper/vmlinuz.efi boot=casper quiet iso-scan/filename=/$ISO_BASENAME
108 initrd (loop)/casper/initrd.lz
114 function setup_debian
{
117 cat <<EOT > "$GRUB_PART_CFG"
118 menuentry '$ISO_BASENAME' {
119 loopback loop /$ISO_BASENAME
120 linux (loop)/live/vmlinuz boot=live components findiso=/$ISO_BASENAME
121 initrd (loop)/live/initrd.img
127 function setup_fedora
{
130 cat <<EOT > "$GRUB_PART_CFG"
131 menuentry '$ISO_BASENAME' {
132 loopback loop /$ISO_BASENAME
133 linux (loop)/isolinux/vmlinuz root=live:CDLABEL=$(blkid -s LABEL -o value "$ISO_FILENAME") rd.live.image quiet iso-scan/filename=/$ISO_BASENAME
134 initrd (loop)/isolinux/initrd.img
140 function setup_archlinux
{
143 cat <<EOT > "$GRUB_PART_CFG"
144 menuentry '$ISO_BASENAME' {
145 loopback loop /$ISO_BASENAME
146 linux (loop)/arch/boot/x86_64/vmlinuz img_label=${PARTITION_LABEL} img_loop=$ISO_BASENAME archisobasedir=arch earlymodules=loop
147 initrd (loop)/arch/boot/x86_64/archiso.img
153 function setup_freedos
{
157 cat <<EOT > "$GRUB_PART_CFG"
158 menuentry '$ISO_BASENAME' {
159 if [ \${grub_platform} = pc ]; then
161 initrd16 /$ISO_BASENAME
163 echo "FreeDOS only works with BIOS boot."
171 function copy_iso_data
{
172 rsync
--size-only --progress "$ISO_FILENAME" "${MULTIBOOT_MNT}/"
175 function install_memdisk
{
176 local dest
="${MULTIBOOT_MNT}/memdisk"
178 if [ -f "$dest" ]; then
182 for maybe
in /usr
/lib
/syslinux
/bios
/memdisk
/usr
/lib
/syslinux
/memdisk
; do
183 if [ -f "$maybe" ]; then
189 curl
--fail "$SYSLINUX_URL" | \
190 tar xz
--strip-components=3 -C "$MULTIBOOT_MNT" \
191 "syslinux-${SYSLINUX_VERSION}/bios/memdisk/memdisk"
194 function delete_stray_grub_parts
{
195 pushd "${MULTIBOOT_MNT}/grub/parts" &> /dev
/null
197 <(find "${MULTIBOOT_MNT}/" -maxdepth 1 -type f
-printf '%f\n'|
sort) \
198 <(find "${MULTIBOOT_MNT}/grub/parts/" -type f
-printf '%f\n'|
sort) \
199 |
xargs -d '\n' -r rm
203 function print_grub_cfg
{
208 search --set=root --label $PARTITION_LABEL
212 cat "${MULTIBOOT_MNT}/grub/parts/"*
218 if [ "$(type -t -- "$CMD")" = "function" ]; then
221 echo "Usage: $0 [format|mount|bootloader|add_iso|umount]"