#!/bin/bash OS_CODENAME=focal DEV=/dev/nbd0 #sudo apt -yq install syslinux syslinux-common syslinux-efi extlinux mkdir -p build mnt out echo "Downloading" #wget -O build/initrd.img https://cloud-images.ubuntu.com/$OS_CODENAME/current/unpacked/${OS_CODENAME}-server-cloudimg-amd64-initrd-generic #wget -O build/vmlinuz https://cloud-images.ubuntu.com/${OS_CODENAME}/current/unpacked/${OS_CODENAME}-server-cloudimg-amd64-vmlinuz-generic #wget -O build/rootfs.tar.xz https://cloud-images.ubuntu.com/${OS_CODENAME}/current/${OS_CODENAME}-server-cloudimg-amd64-root.tar.xz KERNEL_VERSION="$(file build/vmlinuz |cut -d, -f2|cut -d\ -f3)" echo "Detected kernel ${KERNEL_VERSION}" echo "Creating empty image" qemu-img create -f qcow2 build/ubuntu-${OS_CODENAME}.qcow2 2G || exit 1 echo "attaching image" sudo modprobe nbd sudo qemu-nbd -c "${DEV}" build/ubuntu-${OS_CODENAME}.qcow2 || exit 1 echo "partitioning" sudo parted -s "${DEV}" -- \ mklabel gpt \ unit MiB \ mkpart '"Ubuntu"' btrfs 1 100% \ set 1 legacy_boot on until [ -b "${DEV}1" ] || [ -b "${DEV}p1" ]; do sleep 1 done echo "installing hybrid bootloader" sudo dd bs=440 count=1 conv=notrunc \ if=/usr/lib/syslinux/mbr/gptmbr.bin of="$DEV" 2> /dev/null sync echo "mkfs.btrfs" sudo mkfs.btrfs -L cloudimg-rootfs "${DEV}p1" || exit 1 sync echo "mounting root" sudo mount -t btrfs "${DEV}p1" mnt || exit 1 echo "unpacking root fs" sudo tar xJf build/rootfs.tar.xz -C mnt || exit 1 echo "installing kernel and inintd" sudo mkdir -p mnt/boot sudo cp -ar build/initrd.img "mnt/boot/initrd.img-${KERNEL_VERSION}" sudo cp -ar build/vmlinuz "mnt/boot/vmlinuz-${KERNEL_VERSION}" sudo ln -s "vmlinuz-${KERNEL_VERSION}" mnt/boot/vmlinuz sudo ln -s "initrd.img-${KERNEL_VERSION}" mnt/boot/initrd.img echo "installing legacy syslinux files" sudo mkdir -p mnt/boot/syslinux sudo cp /usr/lib/syslinux/modules/bios/*.c32 mnt/boot/syslinux/ sudo cp syslinux/{mainmenu,syslinux}.cfg mnt/boot/syslinux if [ -n "$1" ]; then echo "Patching UUID $1" sudo sed -i -e "s/?/?uuid=$1\&/g" mnt/boot/syslinux/mainmenu.cfg cat mnt/boot/syslinux/mainmenu.cfg fi echo "here is the fstab" echo "LABEL=cloudimg-rootfs / btrfs defaults 0 1" | sudo tee mnt/etc/fstab echo "installing syslinux bootloader" sudo extlinux -i mnt/boot/syslinux echo "umounting" sync sudo umount mnt echo "detaching" sudo qemu-nbd -d "${DEV}" echo "compressing" qemu-img convert -cpO qcow2 build/ubuntu-${OS_CODENAME}.qcow2 out/ubuntu-${OS_CODENAME}.qcow2 # rm -f out/ubuntu-${OS_CODENAME}.qcow2 echo "done"