From 2594045cdd0bedc46d4d30693bd7cda4f94b8fda Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Thu, 30 Sep 2021 14:01:50 +0200 Subject: [qemu-src] Add module for QEMU source build --- .../multi-user.target.wants/qemu-kvm.service | 1 + .../data/lib/systemd/system/qemu-kvm.service | 16 ++++ .../data/usr/share/qemu/init/qemu-kvm-init | 89 ++++++++++++++++++++++ core/modules/qemu-src/module.build | 61 +++++++++++++++ core/modules/qemu-src/module.conf | 8 ++ core/modules/qemu-src/module.conf.ubuntu | 50 ++++++++++++ .../qemu/data/etc/systemd/system/qemu.service | 3 + core/modules/qemu/module.build | 3 - core/modules/qemu/module.conf | 1 + core/modules/qemu/module.conf.ubuntu | 8 -- core/targets/qemu/qemu-src | 1 + 11 files changed, 230 insertions(+), 11 deletions(-) create mode 120000 core/modules/qemu-src/data/lib/systemd/system/multi-user.target.wants/qemu-kvm.service create mode 100644 core/modules/qemu-src/data/lib/systemd/system/qemu-kvm.service create mode 100644 core/modules/qemu-src/data/usr/share/qemu/init/qemu-kvm-init create mode 100644 core/modules/qemu-src/module.build create mode 100644 core/modules/qemu-src/module.conf create mode 100644 core/modules/qemu-src/module.conf.ubuntu create mode 120000 core/targets/qemu/qemu-src diff --git a/core/modules/qemu-src/data/lib/systemd/system/multi-user.target.wants/qemu-kvm.service b/core/modules/qemu-src/data/lib/systemd/system/multi-user.target.wants/qemu-kvm.service new file mode 120000 index 00000000..cd3c10f2 --- /dev/null +++ b/core/modules/qemu-src/data/lib/systemd/system/multi-user.target.wants/qemu-kvm.service @@ -0,0 +1 @@ +../qemu-kvm.service \ No newline at end of file diff --git a/core/modules/qemu-src/data/lib/systemd/system/qemu-kvm.service b/core/modules/qemu-src/data/lib/systemd/system/qemu-kvm.service new file mode 100644 index 00000000..f35e3e98 --- /dev/null +++ b/core/modules/qemu-src/data/lib/systemd/system/qemu-kvm.service @@ -0,0 +1,16 @@ +[Unit] +Description=QEMU KVM preparation - module, ksm, hugepages +DefaultDependencies=no +After=local-fs.target +Before=shutdown.target +Conflicts=shutdown.target +RequiresMountsFor=/usr + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/share/qemu/init/qemu-kvm-init start +ExecReload=/usr/share/qemu/init/qemu-kvm-init start + +[Install] +WantedBy=multi-user.target diff --git a/core/modules/qemu-src/data/usr/share/qemu/init/qemu-kvm-init b/core/modules/qemu-src/data/usr/share/qemu/init/qemu-kvm-init new file mode 100644 index 00000000..af00b718 --- /dev/null +++ b/core/modules/qemu-src/data/usr/share/qemu/init/qemu-kvm-init @@ -0,0 +1,89 @@ +#!/bin/sh + +# Detect our host arch +arch=$(arch) +test -z "$arch" && exit 0 + +modlist="" +case "$arch" in + x86_64 | i686) + kvm=/usr/bin/qemu-system-x86_64 + if grep -qs "^flags.* vmx" /proc/cpuinfo; then + modlist="kvm_intel $KVM_NESTED" + elif grep -qs "^flags.* svm" /proc/cpuinfo; then + modlist="kvm_amd" + fi + ;; + ppc*) + SMT=$(/usr/sbin/ppc64_cpu --smt 2>&1 | grep "SMT=[248]") + if [ -n "$SMT" ] + then + if grep -q -e '^cpu\s*:\s*POWER8' /proc/cpuinfo; then + echo "Error: You must disable SMT if you want to run QEMU/KVM on Power8 based ppc64le architecture" + echo "In order to disable SMT, run: # ppc64_cpu --smt=off" + fi + fi + kvm=/usr/bin/qemu-system-ppc64 + if [ "$(uname -m)" != "ppc64le" ]; then + exit 0 + fi + if systemd-detect-virt --quiet --vm; then + echo "Info: second level virtualization not supported, kvm-hv load might fail" + fi + modlist="kvm-hv" + ;; +esac + +# Silently exit if the package isn't installed anymore +if [ -z "$kvm" -o ! -e "$kvm" ]; then + exit 0 +fi + +# shellcheck disable=SC1091 +[ -r /etc/default/qemu-kvm ] && . /etc/default/qemu-kvm + +start() { + if [ -n "$modlist" ]; then + modprobe -b $modlist || true + fi + + if systemd-detect-virt --quiet --container; then + mknod /dev/kvm c 10 232 || true + chown root:kvm /dev/kvm || true + chmod g+rw /dev/kvm || true + fi + + # Determine if we are running inside a VM + IS_VM=0 + if command -v systemd-detect-virt >/dev/null 2>&1; then + systemd-detect-virt -vq && IS_VM=1 + fi + + # Enable KSM, respecting the default configuration file. If 'AUTO' is + # set, enable only if we aren't running inside a VM. + if [ "$KSM_ENABLED" = "1" ] || [ "$KSM_ENABLED" = "AUTO" ] && [ "$IS_VM" = "0" ]; then + # shellcheck disable=SC2015 + [ -w /sys/kernel/mm/ksm/run ] && echo 1 > /sys/kernel/mm/ksm/run || true + if [ -w /sys/kernel/mm/ksm/sleep_millisecs ]; then + if [ -n "$SLEEP_MILLISECS" ]; then + echo "$SLEEP_MILLISECS" > /sys/kernel/mm/ksm/sleep_millisecs || true + fi + fi + else + # shellcheck disable=SC2015 + [ -w /sys/kernel/mm/ksm/run ] && echo 0 > /sys/kernel/mm/ksm/run || true + fi +} + +# See how we were called. +case "$1" in + start) + start + ;; + + *) + exit 0 + ;; +esac + +exit $? diff --git a/core/modules/qemu-src/module.build b/core/modules/qemu-src/module.build new file mode 100644 index 00000000..5f3fce34 --- /dev/null +++ b/core/modules/qemu-src/module.build @@ -0,0 +1,61 @@ +#!/bin/bash +fetch_source() { + autoclone + git -C "${MODULE_WORK_DIR}/src/qemu" submodule update --init || perror "Failed to init and update submodules!" + + # patch EDK2 version to retrieve EDK2 submodules + git -C "${MODULE_WORK_DIR}/src/qemu/roms/edk2" checkout edk2-stable202108 || perror "Failed to checkout new EDK2 version!" + git -C "${MODULE_WORK_DIR}/src/qemu" commit -a -m "Update EDK2 to 08.2021 release" || perror "Failed to update EDK2 version!" + + git -C "${MODULE_WORK_DIR}/src/qemu" submodule update --recursive || perror "Failed to update submodules recursivly!" +} + +build() { + local SRCDIR="${MODULE_WORK_DIR}/src/qemu" + local DSTDIR="${MODULE_BUILD_DIR}" + cde "${SRCDIR}" + + # install meson (>= 0.54.0) since packaged version is too old + pip3 install "meson>=0.54.0" + + ./configure \ + --prefix="/usr" \ + --sysconfdir="/etc" \ + --libexecdir="/usr/libexec" \ + --localstatedir="/var" \ + --target-list=x86_64-softmmu \ + --enable-kvm \ + --disable-xen \ + --enable-gnutls \ + --enable-gtk \ + --enable-vnc \ + --enable-spice \ + --enable-libusb \ + --enable-usb-redir \ + --enable-lzo \ + --enable-zstd \ + --enable-linux-aio \ + --enable-opengl \ + --enable-virglrenderer \ + --enable-vhost-net \ + --enable-vhost-user \ + --enable-libudev \ + --enable-brlapi \ + --audio-drv-list="pa alsa" \ + --enable-modules || perror "'configure' failed." + make || perror "'make' failed." + DESTDIR="${DSTDIR}" make install || perror "'make install' failed." + + # change permissions for the bridge helper + chmod u+s "${DSTDIR}/usr/libexec/qemu-bridge-helper" + + # change permission of setup script + chmod +x "${DSTDIR}/usr/share/qemu/init/qemu-kvm-init" + + # delete empty run folder to prevent mltk from stopping + rm -rf "${DSTDIR}/var/run" +} + +post_copy() { + : +} diff --git a/core/modules/qemu-src/module.conf b/core/modules/qemu-src/module.conf new file mode 100644 index 00000000..3de2a5ec --- /dev/null +++ b/core/modules/qemu-src/module.conf @@ -0,0 +1,8 @@ +#!/bin/bash + +REQUIRED_GIT=" + https://gitlab.com/qemu-project/qemu.git||v6.1.0 +" + +# copy everything since there is a clean installation done by 'make install' +REQUIRED_DIRECTORIES="/" diff --git a/core/modules/qemu-src/module.conf.ubuntu b/core/modules/qemu-src/module.conf.ubuntu new file mode 100644 index 00000000..9125813b --- /dev/null +++ b/core/modules/qemu-src/module.conf.ubuntu @@ -0,0 +1,50 @@ +#!/bin/bash +REQUIRED_INSTALLED_PACKAGES=" + gcc + debhelper + device-tree-compiler + python3 + python3-pip + ninja-build + libaio-dev + libpulse-dev + libasound2-dev + libbrlapi-dev + libcap-ng-dev + libcurl4-gnutls-dev + libfdt-dev + libgnutls28-dev + libgtk-3-dev + libvte-2.91-dev + libiscsi-dev + libncursesw5-dev + libvirglrenderer-dev + libepoxy-dev + libdrm-dev + libgbm-dev + libnuma-dev + libcacard-dev + libpixman-1-dev + librbd-dev + libsasl2-dev + libseccomp-dev + libslirp-dev + libspice-server-dev + librdmacm-dev + libibverbs-dev + libibumad-dev + libusb-1.0-0-dev + libusbredirparser-dev + libssh-dev + nettle-dev + uuid-dev + xfslibs-dev + zlib1g-dev + libudev-dev + libjpeg-dev + libpng-dev + libpmem-dev + libzstd-dev + libbz2-dev + libfuse3-dev +" diff --git a/core/modules/qemu/data/etc/systemd/system/qemu.service b/core/modules/qemu/data/etc/systemd/system/qemu.service index 4d0e7a19..1776d63c 100644 --- a/core/modules/qemu/data/etc/systemd/system/qemu.service +++ b/core/modules/qemu/data/etc/systemd/system/qemu.service @@ -11,3 +11,6 @@ After=qemu-kvm.service Type=oneshot RemainAfterExit=yes ExecStart=/opt/openslx/scripts/systemd-qemu_env start + +[Install] +WantedBy=graphical.target diff --git a/core/modules/qemu/module.build b/core/modules/qemu/module.build index 801d1d4b..cc7eaee0 100644 --- a/core/modules/qemu/module.build +++ b/core/modules/qemu/module.build @@ -25,7 +25,4 @@ post_copy() { # change access rights of the qemu bridge helper config chown root:kvm /etc/qemu/bridge.conf chmod 0664 /etc/qemu/bridge.conf - - # set UID to avoid operation not permitted errors - chmod u+s /usr/lib/qemu/qemu-bridge-helper } diff --git a/core/modules/qemu/module.conf b/core/modules/qemu/module.conf index 1e272eb4..d4169c39 100644 --- a/core/modules/qemu/module.conf +++ b/core/modules/qemu/module.conf @@ -1,6 +1,7 @@ #!/bin/bash REQUIRED_MODULES=" + qemu-src libvirt openjdk-8-jre-headless looking-glass-client diff --git a/core/modules/qemu/module.conf.ubuntu b/core/modules/qemu/module.conf.ubuntu index 8edc5df4..1853bdf8 100644 --- a/core/modules/qemu/module.conf.ubuntu +++ b/core/modules/qemu/module.conf.ubuntu @@ -6,13 +6,5 @@ REQUIRED_INSTALLED_PACKAGES=" " REQUIRED_CONTENT_PACKAGES=" - qemu - qemu-kvm - qemu-system-common - qemu-system-arm - qemu-system-x86 - qemu-utils - seabios - ovmf jq " diff --git a/core/targets/qemu/qemu-src b/core/targets/qemu/qemu-src new file mode 120000 index 00000000..d50a48b1 --- /dev/null +++ b/core/targets/qemu/qemu-src @@ -0,0 +1 @@ +../../modules/qemu-src \ No newline at end of file -- cgit v1.2.3-55-g7522