]> code.delx.au - monosys/blob - multiboot-setup.sh
Fixed partition type
[monosys] / multiboot-setup.sh
1 #!/bin/bash
2
3 set -eu
4
5 ISO_MNT="/mnt/iso"
6 PARTITION_LABEL="multiboot"
7 MULTIBOOT_MNT="/mnt/multiboot"
8 GRUB_CFG="${MULTIBOOT_MNT}/grub/grub.cfg"
9
10 function cmd_format {
11 if [ -z "${1:-}" ]; then
12 echo "Usage: $0 format /dev/sdX"
13 exit 1
14 fi
15 set -x
16
17 sudo -k
18 DISK_DEVICE="$1"
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"
22 }
23
24 function cmd_bootloader {
25 DISK_DEVICE="$(mount|grep /mnt/multiboot|cut -d' ' -f1|sed 's/[0-9]*$//')"
26 set -x
27
28 sudo -k
29 install_grub_bios
30 install_grub_efi
31 install_grub_cfg
32 }
33
34 function install_grub_bios {
35 sudo grub-install \
36 --target=i386-pc \
37 --boot-directory="$MULTIBOOT_MNT" \
38 "$DISK_DEVICE"
39 }
40
41 function install_grub_efi {
42 sudo grub-install \
43 --target=x86_64-efi \
44 --no-nvram \
45 --removable \
46 --efi-directory="$MULTIBOOT_MNT" \
47 --boot-directory="$MULTIBOOT_MNT" \
48 "$DISK_DEVICE"
49 }
50
51 function install_grub_cfg {
52 mkdir -p "$(dirname "$GRUB_CFG")"
53 cat <<EOT >> "$GRUB_CFG"
54 insmod all_video
55 insmod part_msdos
56 search --set=root --label $PARTITION_LABEL
57
58 EOT
59 }
60
61 function cmd_mount {
62 if [ -z "${1:-}" ]; then
63 echo "Usage: $0 mount /dev/sdX1"
64 exit 1
65 fi
66 set -x
67
68 PARTITION_DEVICE="$1"
69 sudo mkdir -p "$MULTIBOOT_MNT"
70 while sudo umount "$PARTITION_DEVICE"; do true; done
71 sudo mount "$PARTITION_DEVICE" "$MULTIBOOT_MNT" -o "uid=$(whoami)"
72 }
73
74 function cmd_umount {
75 set -x
76
77 sudo umount "$MULTIBOOT_MNT"
78 sudo rmdir "$MULTIBOOT_MNT"
79 }
80
81 function cmd_add_iso {
82 if [ -z "${1:-}" ]; then
83 echo "Usage: $0 add_iso /path/to/ubuntu.iso"
84 exit 1
85 fi
86 set -x
87
88 ISO_FILE="$1"
89 mount_iso
90 setup_iso
91 umount_iso
92 }
93
94 function mount_iso {
95 umount_iso
96 sudo mkdir -p "$ISO_MNT"
97 sudo mount "$ISO_FILE" "$ISO_MNT"
98 }
99
100 function umount_iso {
101 sudo umount "$ISO_MNT" || true
102 sudo rmdir "$ISO_MNT" || true
103 }
104
105 function setup_iso {
106 if [[ "$ISO_FILE" == *ubuntu*.iso ]]; then
107 setup_ubuntu
108 elif [[ "$ISO_FILE" == *Fedora*.iso ]]; then
109 setup_fedora
110 elif [[ "$ISO_FILE" == *archlinux*.iso ]]; then
111 setup_archlinux
112 elif [[ "$ISO_FILE" == *FD12CD.iso ]]; then
113 setup_freedos
114 else
115 echo "Unsupported ISO! $ISO_FILE"
116 fi
117 }
118
119 function setup_ubuntu {
120 local version="$(basename "$ISO_FILE" | cut -d- -f2)"
121
122 copy_iso_data "$ISO_FILE" "${MULTIBOOT_MNT}/"
123
124 cat <<EOT >> "$GRUB_CFG"
125 menuentry 'Ubuntu $version' {
126 loopback loop /$(basename "$ISO_FILE")
127 linux (loop)/casper/vmlinuz.efi boot=casper quiet iso-scan/filename=/$(basename "$ISO_FILE")
128 initrd (loop)/casper/initrd.lz
129 }
130
131 EOT
132 }
133
134 function setup_fedora {
135 local version="$(basename "$ISO_FILE" .iso | sed 's/.*x86_64-\([0-9\.]*\)-.*/\1/')"
136
137 copy_iso_data "$ISO_FILE" "${MULTIBOOT_MNT}/"
138
139 cat <<EOT >> "$GRUB_CFG"
140 menuentry 'Fedora $version' {
141 loopback loop /$(basename "$ISO_FILE")
142 linux (loop)/isolinux/vmlinuz root=live:CDLABEL=$(blkid -s LABEL -o value "$ISO_FILE") rd.live.image quiet iso-scan/filename=/$(basename "$ISO_FILE")
143 initrd (loop)/isolinux/initrd.img
144 }
145
146 EOT
147 }
148
149 function setup_archlinux {
150 local version="$(basename "$ISO_FILE" .iso | sed -e 's/archlinux-//' -e 's/-dual//')"
151
152 copy_iso_data "$ISO_FILE" "${MULTIBOOT_MNT}/"
153
154 cat <<EOT >> "$GRUB_CFG"
155 menuentry 'Arch Linux $version' {
156 loopback loop /$(basename "$ISO_FILE")
157 linux (loop)/arch/boot/x86_64/vmlinuz img_label=${PARTITION_LABEL} img_loop=$(basename "$ISO_FILE") archisobasedir=arch earlymodules=loop
158 initrd (loop)/arch/boot/x86_64/archiso.img
159 }
160
161 EOT
162 }
163
164 function setup_freedos {
165 local freedos_dir="${MULTIBOOT_MNT}/freedos/"
166
167 mkdir -p "$freedos_dir"
168 copy_iso_data "${ISO_MNT}/" "$freedos_dir"
169
170 cat <<EOT >> "$GRUB_CFG"
171 menuentry 'FreeDOS' {
172 if [ \${grub_platform} = pc ]; then
173 linux16 /freedos/ISOLINUX/MEMDISK
174 initrd16 /freedos/ISOLINUX/FDBOOT.img
175 else
176 echo "FreeDOS only works with BIOS boot."
177 sleep 3
178 fi
179 }
180
181 EOT
182 }
183
184 function copy_iso_data {
185 local distro_data="$1"
186 local dest="$2"
187
188 rsync --recursive --size-only --progress "$distro_data" "$dest"
189 }
190
191 CMD="cmd_${1:-}"
192 shift || true
193
194 if [ "$(type -t -- "$CMD")" = "function" ]; then
195 "${CMD}" "$@"
196 else
197 echo "Usage: $0 [format|mount|bootloader|add_iso|umount]"
198 exit 1
199 fi