]>
code.delx.au - monosys/blob - multiboot-setup.sh
6 PARTITION_LABEL
="multiboot"
7 MULTIBOOT_MNT
="/mnt/multiboot"
8 GRUB_CFG
="${MULTIBOOT_MNT}/grub/grub.cfg"
11 if [ -z "${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]*$//')"
34 function install_grub_bios
{
37 --boot-directory="$MULTIBOOT_MNT" \
41 function install_grub_efi
{
46 --efi-directory="$MULTIBOOT_MNT" \
47 --boot-directory="$MULTIBOOT_MNT" \
51 function install_grub_cfg
{
52 mkdir
-p "$(dirname "$GRUB_CFG")"
53 cat <<EOT >> "$GRUB_CFG"
56 search --set=root --label $PARTITION_LABEL
62 if [ -z "${1:-}" ]; then
63 echo "Usage: $0 mount /dev/sdX1"
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)"
77 sudo umount
"$MULTIBOOT_MNT"
78 sudo
rmdir "$MULTIBOOT_MNT"
81 function cmd_add_iso
{
82 if [ -z "${1:-}" ]; then
83 echo "Usage: $0 add_iso /path/to/ubuntu.iso"
96 sudo mkdir
-p "$ISO_MNT"
97 sudo mount
"$ISO_FILE" "$ISO_MNT"
100 function umount_iso
{
101 sudo umount
"$ISO_MNT" || true
102 sudo
rmdir "$ISO_MNT" || true
106 if [[ "$ISO_FILE" == *ubuntu
*.iso
]]; then
108 elif [[ "$ISO_FILE" == *Fedora
*.iso
]]; then
110 elif [[ "$ISO_FILE" == *archlinux
*.iso
]]; then
112 elif [[ "$ISO_FILE" == *FD12CD.iso
]]; then
115 echo "Unsupported ISO! $ISO_FILE"
119 function setup_ubuntu
{
120 local version
="$(basename "$ISO_FILE" | cut -d- -f2)"
122 copy_iso_data
"$ISO_FILE" "${MULTIBOOT_MNT}/"
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
134 function setup_fedora
{
135 local version
="$(basename "$ISO_FILE" .iso | sed 's/.*x86_64-\([0-9\.]*\)-.*/\1/')"
137 copy_iso_data
"$ISO_FILE" "${MULTIBOOT_MNT}/"
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
149 function setup_archlinux
{
150 local version
="$(basename "$ISO_FILE" .iso | sed -e 's/archlinux-//' -e 's/-dual//')"
152 copy_iso_data
"$ISO_FILE" "${MULTIBOOT_MNT}/"
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
164 function setup_freedos
{
165 local freedos_dir
="${MULTIBOOT_MNT}/freedos/"
167 mkdir
-p "$freedos_dir"
168 copy_iso_data
"${ISO_MNT}/" "$freedos_dir"
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
176 echo "FreeDOS only works with BIOS boot."
184 function copy_iso_data
{
185 local distro_data
="$1"
188 rsync
--recursive --size-only --progress "$distro_data" "$dest"
194 if [ "$(type -t -- "$CMD")" = "function" ]; then
197 echo "Usage: $0 [format|mount|bootloader|add_iso|umount]"