]>
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
{
45 for arch
in i386-efi x86_64-efi
; do
50 --efi-directory="$MULTIBOOT_MNT" \
51 --boot-directory="$MULTIBOOT_MNT" \
59 PARTITION_DEVICE
="$(readlink -f /dev/disk/by-label/multiboot)"
60 sudo mkdir
-p "$MULTIBOOT_MNT"
61 while sudo umount
"$PARTITION_DEVICE" &> /dev
/null
; do true
; done
62 sudo mount
"$PARTITION_DEVICE" "$MULTIBOOT_MNT" -o "uid=$(whoami)"
68 sudo umount
"$MULTIBOOT_MNT"
69 sudo
rmdir "$MULTIBOOT_MNT"
72 function cmd_add_iso
{
73 if [ ! -f "${MULTIBOOT_MNT}/$(basename "${1:-}")" ]; then
74 echo "Usage: $0 add_iso ${MULTIBOOT_MNT}/ubuntu.iso"
79 ISO_BASENAME
="$(basename "$1")"
80 GRUB_PART_CFG
="${MULTIBOOT_MNT}/grub/parts/${ISO_BASENAME}"
82 mkdir
-p "$(dirname "$GRUB_PART_CFG")"
84 if [[ "$ISO_BASENAME" == ubuntu-
*-desktop-*.iso
]]; then
86 elif [[ "$ISO_BASENAME" == debian-live-
*.iso
]]; then
88 elif [[ "$ISO_BASENAME" == Fedora-Workstation-Live-
*.iso
]]; then
90 elif [[ "$ISO_BASENAME" == archlinux-
*.iso
]]; then
92 elif [[ "$ISO_BASENAME" == FD12
*.
zip ]]; then
95 echo "Unsupported ISO! $ISO_BASENAME"
98 delete_stray_grub_parts
99 print_grub_cfg
> "${MULTIBOOT_MNT}/grub/grub.cfg"
102 function setup_ubuntu
{
103 cat <<EOT > "$GRUB_PART_CFG"
104 menuentry '$ISO_BASENAME' {
105 loopback loop /$ISO_BASENAME
106 linux (loop)/casper/vmlinuz.efi boot=casper quiet iso-scan/filename=/$ISO_BASENAME
107 initrd (loop)/casper/initrd.lz
113 function setup_debian
{
114 cat <<EOT > "$GRUB_PART_CFG"
115 menuentry '$ISO_BASENAME' {
116 loopback loop /$ISO_BASENAME
117 linux (loop)/live/vmlinuz boot=live components findiso=/$ISO_BASENAME
118 initrd (loop)/live/initrd.img
124 function setup_fedora
{
125 cat <<EOT > "$GRUB_PART_CFG"
126 menuentry '$ISO_BASENAME' {
127 loopback loop /$ISO_BASENAME
128 linux (loop)/isolinux/vmlinuz root=live:CDLABEL=$(blkid -s LABEL -o value "${MULTIBOOT_MNT}/$ISO_BASENAME") rd.live.image quiet iso-scan/filename=/$ISO_BASENAME
129 initrd (loop)/isolinux/initrd.img
135 function setup_archlinux
{
136 cat <<EOT > "$GRUB_PART_CFG"
137 menuentry '$ISO_BASENAME' {
138 loopback loop /$ISO_BASENAME
139 linux (loop)/arch/boot/x86_64/vmlinuz img_label=${PARTITION_LABEL} img_loop=$ISO_BASENAME archisobasedir=arch earlymodules=loop
140 initrd (loop)/arch/boot/x86_64/archiso.img
146 function setup_freedos
{
149 cat <<EOT > "$GRUB_PART_CFG"
150 menuentry '$ISO_BASENAME' {
151 if [ \${grub_platform} = pc ]; then
153 initrd16 /$ISO_BASENAME
155 echo "FreeDOS only works with BIOS boot."
163 function install_memdisk
{
164 local dest
="${MULTIBOOT_MNT}/memdisk"
166 if [ -f "$dest" ]; then
170 for maybe
in /usr
/lib
/syslinux
/bios
/memdisk
/usr
/lib
/syslinux
/memdisk
; do
171 if [ -f "$maybe" ]; then
177 curl
--fail "$SYSLINUX_URL" | \
178 tar xz
--strip-components=3 -C "$MULTIBOOT_MNT" \
179 "syslinux-${SYSLINUX_VERSION}/bios/memdisk/memdisk"
182 function delete_stray_grub_parts
{
183 pushd "${MULTIBOOT_MNT}/grub/parts" &> /dev
/null
185 <(find "${MULTIBOOT_MNT}/" -maxdepth 1 -type f
-printf '%f\n'|
sort) \
186 <(find "${MULTIBOOT_MNT}/grub/parts/" -type f
-printf '%f\n'|
sort) \
187 |
xargs -d '\n' -r rm
191 function print_grub_cfg
{
196 search --set=root --label $PARTITION_LABEL
200 cat "${MULTIBOOT_MNT}/grub/parts/"*
206 if [ "$(type -t -- "$CMD")" = "function" ]; then
209 echo "Usage: $0 [format|mount|bootloader|add_iso|umount]"