From 1acf6afd66c2d7e9a8a5bff42fd1484187d58426 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Sp=C3=B6hel?= Date: Wed, 23 Aug 2023 15:39:17 +0200 Subject: Basic unifid start. --- libexec/container/build | 1 - libexec/container/start | 105 +++++++++++++++++++++++++++++++++++++++++--- share/build-scripts/debconf | 6 +++ share/systemd/qemu@.service | 13 ++++++ 4 files changed, 118 insertions(+), 7 deletions(-) create mode 100644 share/systemd/qemu@.service diff --git a/libexec/container/build b/libexec/container/build index efb42f3..5927308 100755 --- a/libexec/container/build +++ b/libexec/container/build @@ -267,7 +267,6 @@ sed -e "s|@CNT_AUTO@|${CNT_AUTO}|g" \ -e "s|@BIND_RO@|${BIND_RO}|g" \ -e "s|@BOOT@|yes|g" \ -e "s|@CAPABILITY@|${CAPABILITY}|g" \ - -e "s|@DIRECTORY@|${MACHINES}/${NAME}|g" \ -e "s|@DROP_CAPABILITY@|${DROP_CAPABILITY}|g" \ -e "s|@LINK_JOURNAL@|no|g" \ -e "s|@MACHINE@|${NAME}|g" \ diff --git a/libexec/container/start b/libexec/container/start index 1f22325..2287bd1 100755 --- a/libexec/container/start +++ b/libexec/container/start @@ -27,6 +27,7 @@ COMMAND="$(basename ${0})" CONFIG="/etc/${SOFTWARE}/config" HOOKS="/etc/${SOFTWARE}/hooks" MACHINES="/var/lib/machines" +VMS="/srv/container/vms" START="false" SYSTEMCTL="true" @@ -128,9 +129,9 @@ case "${NAME}" in ;; esac -if [ ! -e "${MACHINES}/${NAME}" ] +if [ ! -e "${MACHINES}/${NAME}" ] && [ ! -e "${VMS}/${NAME}" ] then - echo "'${NAME}': no such container" >&2 + echo "'${NAME}': no such vm or container" >&2 exit 1 fi @@ -175,7 +176,13 @@ then fi HOST_ARCHITECTURE="$(dpkg --print-architecture)" -MACHINE_ARCHITECTURE="$(chroot ${MACHINES}/${NAME} dpkg --print-architecture)" +# FIXME: MACHINE_ARCHITECTURE in config? +case "BOOT_METHOD" in + systemd-nspawn) + MACHINE_ARCHITECTURE="$(chroot ${MACHINES}/${NAME} dpkg --print-architecture)" + ;; +esac + case "${HOST_ARCHITECTURE}" in amd64) @@ -377,6 +384,57 @@ then ;; esac + BOOT_METHOD="$(awk -Fboot-method= '/^boot-method=/ { print $2 }' ${CONFIG}/${NAME}.conf)" + MEMORY="-m $(awk -Fvm.memory= '/^vm.memory=/ { print $2 }' ${CONFIG}/${NAME}.conf)" + FIRMWARE="$(awk -Fvm.firmware= '/^vm.firmware=/ { print $2 }' ${CONFIG}/${NAME}.conf)" + CPU="-cpu $(awk -Fvm.cpu= '/^vm.cpu=/ { print $2 }' ${CONFIG}/${NAME}.conf)" + DISPLAY="-display $(awk -Fvm.display= '/^vm.display=/ { print $2 }' ${CONFIG}/${NAME}.conf)" + SERIAL="-serial $(awk -Fvm.serial= '/^vm.serial=/ { print $2 }' ${CONFIG}/${NAME}.conf)" + MONITOR="-mon $(awk -Fvm.monitor= '/^vm.monitor=/ { print $2 }' ${CONFIG}/${NAME}.conf)" + + DRIVES="$(awk -Fvm.drive= '/^vm.drive=/ { print $2 }' ${CONFIG}/${NAME}.conf)" + case "${DRIVES}" in + "") + ;; + + *) + OLDIFS="${IFS}" + IFS=' +' + for DRIVE_ITEM in ${DRIVES} + do + DRIVE="${DRIVE} -drive ${DRIVE_ITEM}" + done + IFS="${OLDIFS}" + ;; + esac + + NETDEVS="$(awk -Fvm.netdev= '/^vm.netdev=/ { print $2 }' ${CONFIG}/${NAME}.conf)" + case "${NETDEVS}" in + "") + ;; + + *) + OLDIFS="${IFS}" + IFS=' +' + for NETDEV_ITEM in ${NETDEVS} + do + NETDEV="${NETDEV} -netdev ${NETDEV_ITEM}" + done + IFS="${OLDIFS}" + ;; + esac + + DIRECTORY="$(awk -Fdirectory= '/^directory=/ { print $2 }' ${CONFIG}/${NAME}.conf || echo ${MACHINES}/${NAMES})" + DIRECTORY="--directory ${DIRECTORY}" + + RAW_OPTIONS="$(awk -Fraw-options= '/^raw-options=/ { print $2 }' ${CONFIG}/${NAME}.conf)" + # FIXME empty + + MACHINE="-name ${NAME}" + + NETWORK_BRIDGES="$(awk -Fcnt.network-bridge= '/^cnt.network-bridge=/ { print $2 }' ${CONFIG}/${NAME}.conf)" case "${NETWORK_BRIDGES}" in @@ -519,11 +577,21 @@ EOF TASKS_MAX="TasksMax=${TASKS_MAX}" SET_PROPERTY="true" fi + + DIRECTORY="$(awk -Fdirectory= '/^directory=/ { print $2 }' ${CONFIG}/${NAME}.conf || echo ${MACHINES}/${NAMES})" fi case "${SYSTEMCTL}" in true) - systemctl start ${PROGRAM}@${NAME}.service + case "${BOOT_METHOD}" in + qemu) + systemctl start qemu@${NAME}.service + ;; + + systemd-nspawn) + systemctl start ${PROGRAM}@${NAME}.service + ;; + esac # Post hooks for FILE in "${HOOKS}/post-${COMMAND}".* "${HOOKS}/${NAME}.post-${COMMAND}" @@ -540,6 +608,7 @@ esac case "${START}" in true) + case "${SET_PROPERTY}" in true) systemctl --runtime set-property ${NAME} ${BLOCK_IO_DEVICE_WEIGHT} ${BLOCK_IO_READ_BANDWIDTH} ${BLOCK_IO_WEIGHT} ${BLOCK_IO_WRITE_BANDWIDTH} ${CPU_QUOTA} ${CPU_SHARES} ${MEMORY_LIMIT} ${TASKS_MAX} @@ -552,14 +621,38 @@ case "${START}" in case "${VERBOSE}" in true) - echo -n "Starting container ${NAME}..." + echo -n "Starting ${NAME} with ${BOOT_METHOD}..." ;; esac mkdir -p "/var/lib/${SOFTWARE}/state" echo "start" > "/var/lib/${SOFTWARE}/state/${NAME}.run" - ${SETARCH} systemd-nspawn --keep-unit ${BIND} ${BIND_RO} ${BOOT} ${CAPABILITY} ${DIRECTORY} ${DROP_CAPABILITY} ${MACHINE} ${NETWORK_VETH_EXTRA} ${LINK_JOURNAL} ${REGISTER} + case "${BOOT_METHOD}" in + qemu) + case "${FIRMWARE}" in + efi) + BIOS="-bios ${DIRECTORY}/firmware.fd" + ;; + esac + + qemu-system-x86_64 \ + -machine accel=kvm \ + ${CPU} \ + ${DISPLAY} \ + ${MEMORY} \ + ${MACHINE} \ + ${BIOS} \ + ${SERIAL} \ + ${DRIVE} \ + ${NETDEV} \ + ${RAW_OPTIONS} + ;; + + systemd-nspawn) + ${SETARCH} systemd-nspawn --keep-unit ${BIND} ${BIND_RO} ${BOOT} ${CAPABILITY} ${DIRECTORY} ${DROP_CAPABILITY} ${MACHINE} ${NETWORK_VETH_EXTRA} ${LINK_JOURNAL} ${REGISTER} + ;; + esac case "${VERBOSE}" in true) diff --git a/share/build-scripts/debconf b/share/build-scripts/debconf index 8307695..a20212f 100755 --- a/share/build-scripts/debconf +++ b/share/build-scripts/debconf @@ -1163,6 +1163,7 @@ EOF echo 'fs0:\EFI\progress-linux\grubx64.efi' > "${DIRECTORY}/boot/efi/EFI/boot/startup.nsh" sed -i \ + -e "s|@DIRECTORY@|${SYSTEM_BASE_DIR}/${NAME}|g" \ -e "s|@BOOT_METHOD@|${BOOT_METHOD}|g" \ -e "s|@CPU@|${CPU}|g" \ -e "s|@MEMORY@|${MEMORY}|g" \ @@ -1359,9 +1360,14 @@ fi case "${BOOT_METHOD}" in qemu) + SYSTEM_BASE_DIR="${VMS}" Create_vm_disk Mount_vm_disk ;; + + systemd-nspawn) + SYSTEM_BASE_DIR="${MACHINES}" + ;; esac case "${INSTALLER}" in diff --git a/share/systemd/qemu@.service b/share/systemd/qemu@.service new file mode 100644 index 0000000..8c36df4 --- /dev/null +++ b/share/systemd/qemu@.service @@ -0,0 +1,13 @@ +[Unit] +Description="Container: %i" +Documentation=man:compute-tools + +[Service] +Type=simple +ExecStart=/usr/bin/container start -n %i --nspawn +ExecStartPost=/usr/bin/container start -n %i --start +#ExecStopPost=/usr/bin/container stop -n %i --clean --no-notification +KillMode=mixed + +[Install] +WantedBy=multi-user.target -- cgit v1.2.3