From 7c674a11ca49df28f78f49a876660891ad7b4355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Sp=C3=B6hel?= Date: Thu, 24 Aug 2023 16:35:18 +0200 Subject: basic cnt build for vms (debconf only) --- share/build-scripts/debconf | 170 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 164 insertions(+), 6 deletions(-) (limited to 'share/build-scripts/debconf') diff --git a/share/build-scripts/debconf b/share/build-scripts/debconf index 900242d..8307695 100755 --- a/share/build-scripts/debconf +++ b/share/build-scripts/debconf @@ -31,11 +31,12 @@ CACHE="/var/cache/${PROGRAM}/build-$(basename ${SCRIPT})" CONFIG="/etc/${SOFTWARE}/config" HOOKS="/etc/${SOFTWARE}/hooks" MACHINES="/var/lib/machines" +VMS="/srv/container/vms" Parameters () { - GETOPT_LONGOPTIONS="bind:,bind-ro:,script:,name:,preseed-file:" - GETOPT_OPTIONS="b:,s:,n:,p:" + GETOPT_LONGOPTIONS="bind:,bind-ro:,boot-method:,script:,name:,preseed-file:,vm" + GETOPT_OPTIONS="b:,s:,n:,p:,v:" PARAMETERS="$(getopt --longoptions ${GETOPT_LONGOPTIONS} --name=${SCRIPT} --options ${GETOPT_OPTIONS} --shell sh -- ${@})" @@ -60,6 +61,11 @@ Parameters () shift 2 ;; + --boot-method) + BOOT_METHOD="${2}" + shift 2 + ;; + --cnt.auto) # ignore shift 2 @@ -85,6 +91,11 @@ Parameters () shift 2 ;; + --vm) + VM="TRUE" + shift 1 + ;; + --) shift 1 break @@ -100,7 +111,7 @@ Parameters () Usage () { - echo "Usage: container build -n|--name NAME -s|--script ${SCRIPT} -- [-p|--preseed-file FILE]" >&2 + echo "Usage: container build -n|--name NAME -s|--script ${SCRIPT} [--boot-method systemd-nswawn|qemu] -- [-p|--preseed-file FILE]" >&2 exit 1 } @@ -251,9 +262,20 @@ Umount () fi # Unmounting pseudo-filesystems + # FIXME this should not be necessary + umount -f "${DIRECTORY}/dev" > /dev/null 2>&1 || true umount -f "${DIRECTORY}/dev/pts" > /dev/null 2>&1 || true umount -f "${DIRECTORY}/proc" > /dev/null 2>&1 || true umount -f "${DIRECTORY}/sys" > /dev/null 2>&1 || true + + # Unmounting disk images + if [ "${BOOT_METHOD}" = "qemu" ] + then + umount -f "${DIRECTORY}/boot/efi" > /dev/null 2>&1 || true + umount -f "${DIRECTORY}" > /dev/null 2>&1 || true + rmdir "${MACHINES}/${NAME}" + kpartx -d "${VMS}/${NAME}/root.img" + fi } Chroot () @@ -368,7 +390,8 @@ Bootstrap () DIRECTORY="${1}" EXCLUDE="ifupdown" - INCLUDE="dbus" + #FIXME amd64 hardcoded + INCLUDE="dbus,linux-image-amd64,grub-efi-amd64" # apt repositories INCLUDE="${INCLUDE},gnupg" @@ -1101,6 +1124,60 @@ EOF done } +Configure_vm () +{ + DIRECTORY="${1}" + + # FIXME duplicate definition + EFI_PARTITION="p1" + SYSTEM_PARTITION="p2" + EFI_UUID="$(lsblk --output UUID --noheadings /dev/mapper/loop0${EFI_PARTITION})" + ROOT_UUID="$(lsblk --output UUID --noheadings /dev/mapper/loop0${SYSTEM_PARTITION})" + echo "UUID=${ROOT_UUID} / ext4 discard,noatime,errors=remount-ro 0 1" >> ${DIRECTORY}/etc/fstab + echo "UUID=${EFI_UUID} /boot/efi vfat umask=0077 0 1" >> ${DIRECTORY}/etc/fstab + + mkdir -p ${DIRECTORY}/boot/efi/EFI/progress-linux + cp ${DIRECTORY}/usr/lib/grub/x86_64-efi/monolithic/grubx64.efi ${DIRECTORY}/boot/efi/EFI/progress-linux/ + +cat > ${DIRECTORY}/boot/efi/EFI/progress-linux/grub.cfg << EOF +search.fs_uuid ${ROOT_UUID} root +set prefix=(\$root)'/boot/grub' +configfile \$prefix/grub.cfg +EOF + +cat >> ${DIRECTORY}/etc/initramfs-tools/modules << EOF + +# enable virtio +virtio_pci +virtio_blk +virtio_net +EOF + + Chroot ${DIRECTORY} update-initramfs -u + + mount -o bind /dev ${DIRECTORY}/dev + Chroot ${DIRECTORY} update-grub + + # FIXME workaround for grub not being installed as EFI/boot/bootx86.efi + mkdir "${DIRECTORY}/boot/efi/EFI/boot" + echo 'fs0:\EFI\progress-linux\grubx64.efi' > "${DIRECTORY}/boot/efi/EFI/boot/startup.nsh" + + sed -i \ + -e "s|@BOOT_METHOD@|${BOOT_METHOD}|g" \ + -e "s|@CPU@|${CPU}|g" \ + -e "s|@MEMORY@|${MEMORY}|g" \ + -e "s|@DISPLAY@|${DISPLAY}|g" \ + -e "s|@SERIAL@|${SERIAL}|g" \ + -e "s|@MONITOR@|${MONITOR}|g" \ + -e "s|@FIRMWARE@|${FIRMWARE}|g" \ + -e "s|@DRIVE@|${DRIVE}|g" \ + -e "s|@NETDEV@|${NETDEV}|g" \ + -e "s|@QEMU_RAW@|${QEMU_RAW}|g" \ + "${CONFIG}/${NAME}.conf" + +} + + Commands () { DIRECTORY="${1}" @@ -1117,6 +1194,7 @@ Commands () -e "s|^bind=.*|bind=${BIND}|g" \ -e "s|^bind-ro=.*|bind-ro=${BIND_RO}|g" \ -e "s|^network-veth-extra=.*|network-veth-extra=${HOST_INTERFACE_NAME}:eno1|g" \ + -e "s|@PRIMARY_TAP@|${HOST_INTERFACE_NAME}|g" \ "${CONFIG}/${NAME}.conf" if [ "${NETWORK_NUMBER}" -ge 2 ] @@ -1179,6 +1257,67 @@ Commands () esac } +Create_vm_disk () +{ + mkdir -p "${VMS}/${NAME}" + + # FIXME drive-image file size as arg or preseed + DRIVE_SIZE=12000 + + # FIXME image name + dd if=/dev/zero of="${VMS}/${NAME}/root.img" bs=1024k count=0 seek="${DRIVE_SIZE}" + parted "${VMS}/${NAME}/root.img" mklabel gpt + + + # FIXME only for root image + case "${FIRMWARE}" in + legacy) + # FIXME number partitions and size scrip and everything + parted -a optimal "${VMS}/${NAME}/root.img" mkpart BIOS-BOOT 1MB 2MB + parted "${VMS}/${NAME}/root.img" set 1 bios_grub on + parted -a optimal "${VMS}/${NAME}/root.img" mkpart SYSTEM 2MB 100% + SYSTEM_PARTITION="p2" + ;; + + efi) + parted -a optimal "${VMS}/${NAME}/root.img" mkpart EFI fat32 1M 1000M + parted "${VMS}/${NAME}/root.img" set 1 esp on + parted -a optimal "${VMS}/${NAME}/root.img" mkpart SYSTEM 1000MB 100% + EFI_PARTITION="p1" + SYSTEM_PARTITION="p2" + + # efi bios + cp /usr/share/qemu/OVMF.fd "${VMS}/${NAME}/firmware.fd" + ;; + + *) + echo "Error, unrecognized firware." >&2 + exit 1 + esac + + kpartx -av "${VMS}/${NAME}/root.img" + # FIXME loop number hardcoded + mkfs.ext4 "/dev/mapper/loop0${SYSTEM_PARTITION}" + + if [ ! -z "${EFI_PARTITION}" ] + then + mkfs.vfat -F 32 "/dev/mapper/loop0${EFI_PARTITION}" + fi + + # FIXME swap, more discs +} + +Mount_vm_disk () +{ + # FIXME probably not necessary + mkdir -p "${MACHINES}/${NAME}" + + # FIXME partition number hardcoded + mount "/dev/mapper/loop0${SYSTEM_PARTITION}" "${MACHINES}/${NAME}" + mkdir -p "${MACHINES}/${NAME}/boot/efi" + mount "/dev/mapper/loop0${EFI_PARTITION}" "${MACHINES}/${NAME}/boot/efi" +} + # Trap function trap 'Umount' EXIT HUP INT QUIT TERM @@ -1218,6 +1357,13 @@ else INSTALLER="image" fi +case "${BOOT_METHOD}" in + qemu) + Create_vm_disk + Mount_vm_disk + ;; +esac + case "${INSTALLER}" in bootstrap) ## Dependencies @@ -1246,8 +1392,11 @@ case "${INSTALLER}" in Cleanup_system "${CACHE}/${DISTRIBUTION}_${ARCHITECTURE}" ## Specific parts - mkdir -p "${MACHINES}" - cp -a "${CACHE}/${DISTRIBUTION}_${ARCHITECTURE}" "${MACHINES}/${NAME}" + + # FIXME is there a better way to do this? + mkdir -p "${MACHINES}/${NAME}" + cp -a "${CACHE}/${DISTRIBUTION}_${ARCHITECTURE}/"* "${MACHINES}/${NAME}/" + ;; image) @@ -1300,6 +1449,15 @@ Mount Configure_system "${MACHINES}/${NAME}" Configure_network "${MACHINES}/${NAME}" Configure_systemd_networkd "${MACHINES}/${NAME}" + +case "${BOOT_METHOD}" in + qemu) + echo DEBUG: Configure_vm start + Configure_vm "${MACHINES}/${NAME}" + echo DEBUG: Configure_vm end + ;; +esac + Cleanup_system "${MACHINES}/${NAME}" Commands "${MACHINES}/${NAME}" -- cgit v1.2.3