From patchwork Fri Mar 10 18:54:22 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?Q2zDqW1lbnQgUMOpcm9u?= X-Patchwork-Id: 20767 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id E90BCC6FD19 for ; Fri, 10 Mar 2023 18:54:40 +0000 (UTC) Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) by mx.groups.io with SMTP id smtpd.web11.28106.1678474473738041199 for ; Fri, 10 Mar 2023 10:54:34 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20210112 header.b=UxHDJGgs; spf=pass (domain: gmail.com, ip: 209.85.221.44, mailfrom: peron.clem@gmail.com) Received: by mail-wr1-f44.google.com with SMTP id bw19so5942692wrb.13 for ; Fri, 10 Mar 2023 10:54:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1678474472; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=Uni+Q+XMwI66x4ca1c8CXjJHPuIS7paY5pT28ntJ41E=; b=UxHDJGgsIbluTZm9nypibOP5NY6+vY1qZWqCekUdMCHFGY0JeXqcSeEVVI7IiNVjSv WUR2ndDXOIE5Vp1Gw+w8xPXJsTJUuLHuA7hhJmhr/z2RBiuA3muIh+XvPbKUCSehz4cs WupdITk160j1RhRLnHlXv72nF+q+pig9VjSj82fjB0mRf4ND3k/Qjlz/+b3g/jsqyKUa 8A/k5mRX/bWPjfWHQtoCYu100+EvrFvrzSGWZNJPPuU8NaVu7dG7s8fpIT55YPDQUBx/ xANgL+cEPCk9qX9OobeqIke2blaidam03/GAq5Z14HnGlDt6HFc/Y8+EfB3Gs/1qWKrx ysTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678474472; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Uni+Q+XMwI66x4ca1c8CXjJHPuIS7paY5pT28ntJ41E=; b=B/tI3wZ24twc2CAU8m4MTDXhu1aR+jVDAszCGofYZSJ4TVMQzJwziVEuWGUoLDLRFj IwgL2zKH1gJdUG3+lamYmAkJJ+R85dB5G5wZBPGjv48PeHNcLZpdBHdWFUt/65grcrKo 2pLgs1gqfW+PSjCLfxNyXIXFTQ5RsOnXkk2kwHc93BfLL7K9RLaavKuL4QpWjnLZqsrF qlft80mEa4CHmr6YEDF+DLME9DQW16VGKo6WyXlRWXKrpgOc6uD8Yr+HTYfmsJMKqUfD kLgATA+4i2NM8TV56vl9fG2+SD3kp4E4lwu2W69z7OjHb3PVDeHTNX/1neOdmHERR0uE GaGg== X-Gm-Message-State: AO0yUKW4rBJkATlmBzk22pveGootaWDYngLbEXqhvcab/fcDSOIBu2Lq tcmMkQ9t2V6u8JaUQDG6UVabQAVwgfc= X-Google-Smtp-Source: AK7set/1pm5iuQAnpu1d53G9SO1XLojtaZv7NbHgALdQW0ozP8KIY/uwRcDtcrNjZZGbDz4RRIUbjA== X-Received: by 2002:a5d:43d0:0:b0:2c7:1c4e:1d11 with SMTP id v16-20020a5d43d0000000b002c71c4e1d11mr16676685wrr.63.1678474471770; Fri, 10 Mar 2023 10:54:31 -0800 (PST) Received: from localhost.localdomain (2a01cb000c0d3d00488c42bf7f506bd5.ipv6.abo.wanadoo.fr. [2a01:cb00:c0d:3d00:488c:42bf:7f50:6bd5]) by smtp.gmail.com with ESMTPSA id p3-20020a1c7403000000b003dc42d48defsm701379wmc.6.2023.03.10.10.54.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Mar 2023 10:54:31 -0800 (PST) From: =?utf-8?b?Q2zDqW1lbnQgUMOpcm9u?= To: openembedded-core@lists.openembedded.org Cc: =?utf-8?b?Q2zDqW1lbnQgUMOpcm9u?= , Brenda Streiff Subject: [PATCH v5 1/2] qemu: split out qemu-guest-agent, add startup scripts Date: Fri, 10 Mar 2023 19:54:22 +0100 Message-Id: <20230310185423.171619-1-peron.clem@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 10 Mar 2023 18:54:40 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/178342 Split out the QEMU guest agent into a separate package. The agent is intended to be installed within a QEMU VM guest where a user is likely to not want to have the rest of the QEMU installation within it. Additionally, an initscript, udev rules file, and systemd unit file are added to the package so that the guest agent can start automatically; the former two come from Debian's packaging for qemu-guest-agent. Signed-off-by: Brenda Streiff Signed-off-by: Clément Péron --- Changes since v4: - remove debian comment - add note about debian origin + license Changes since v3: - fix missing comma in udev rule Changes since v2: - Add missing files - rebase on top of master Changes since v1: - Fix systemd-service using PN where it should not meta/recipes-devtools/qemu/qemu.inc | 35 ++++++++- .../qemu/qemu/qemu-guest-agent.init | 75 +++++++++++++++++++ .../qemu/qemu/qemu-guest-agent.udev | 2 + 3 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 meta/recipes-devtools/qemu/qemu/qemu-guest-agent.init create mode 100644 meta/recipes-devtools/qemu/qemu/qemu-guest-agent.udev diff --git a/meta/recipes-devtools/qemu/qemu.inc b/meta/recipes-devtools/qemu/qemu.inc index 1e768b560d..b41055fe5d 100644 --- a/meta/recipes-devtools/qemu/qemu.inc +++ b/meta/recipes-devtools/qemu/qemu.inc @@ -9,7 +9,7 @@ LICENSE = "GPL-2.0-only & LGPL-2.1-only" RDEPENDS:${PN}-ptest = "bash" require qemu-targets.inc -inherit pkgconfig ptest +inherit pkgconfig ptest update-rc.d systemd LIC_FILES_CHKSUM = "file://COPYING;md5=441c28d2cf86e15a37fa47e15a72fbac \ file://COPYING.LIB;endline=24;md5=8c5efda6cf1e1b03dcfd0e6c0d271c7f" @@ -32,6 +32,8 @@ SRC_URI = "https://download.qemu.org/${BPN}-${PV}.tar.xz \ file://0001-configure-Fix-check-tcg-not-executing-any-tests.patch \ file://0001-Revert-linux-user-add-more-compat-ioctl-definitions.patch \ file://0002-Revert-linux-user-fix-compat-with-glibc-2.36-sys-mou.patch \ + file://qemu-guest-agent.init \ + file://qemu-guest-agent.udev \ " UPSTREAM_CHECK_REGEX = "qemu-(?P\d+(\.\d+)+)\.tar" @@ -132,6 +134,20 @@ do_configure[cleandirs] += "${B}" do_install () { export STRIP="" oe_runmake 'DESTDIR=${D}' install + + # If we built the guest agent, also install startup/udev rules + if [ -e "${D}${bindir}/qemu-ga" ]; then + install -d ${D}${sysconfdir}/init.d/ + install -m 0755 ${WORKDIR}/qemu-guest-agent.init ${D}${sysconfdir}/init.d/qemu-guest-agent + sed -i 's:@bindir@:${bindir}:' ${D}${sysconfdir}/init.d/qemu-guest-agent + + install -d ${D}${sysconfdir}/udev/rules.d/ + install -m 0644 ${WORKDIR}/qemu-guest-agent.udev ${D}${sysconfdir}/udev/rules.d/60-qemu-guest-agent.rules + + install -d ${D}${systemd_unitdir}/system/ + install -m 0644 ${S}/contrib/systemd/qemu-guest-agent.service ${D}${systemd_unitdir}/system + sed -i -e 's,-/usr/bin/,-${bindir}/,g' ${D}${systemd_unitdir}/system/qemu-guest-agent.service + fi } # The following fragment will create a wrapper for qemu-mips user emulation @@ -210,3 +226,20 @@ PACKAGECONFIG[jack] = "--enable-jack,--disable-jack,jack," INSANE_SKIP:${PN} = "arch" FILES:${PN} += "${datadir}/icons" + +# Put the guest agent in a separate package +PACKAGES =+ "${PN}-guest-agent" +SUMMARY:${PN}-guest-agent = "QEMU guest agent" +FILES:${PN}-guest-agent += " \ + ${bindir}/qemu-ga \ + ${sysconfdir}/udev/rules.d/60-qemu-guest-agent.rules \ + ${sysconfdir}/init.d/qemu-guest-agent \ + ${systemd_unitdir}/system/qemu-guest-agent.service \ +" + +INITSCRIPT_PACKAGES = "${PN}-guest-agent" +INITSCRIPT_NAME:${PN}-guest-agent = "qemu-guest-agent" +INITSCRIPT_PARAMS:${PN}-guest-agent = "defaults" + +SYSTEMD_PACKAGES = "${PN}-guest-agent" +SYSTEMD_SERVICE:${PN}-guest-agent = "qemu-guest-agent.service" diff --git a/meta/recipes-devtools/qemu/qemu/qemu-guest-agent.init b/meta/recipes-devtools/qemu/qemu/qemu-guest-agent.init new file mode 100644 index 0000000000..5ebaaddeae --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/qemu-guest-agent.init @@ -0,0 +1,75 @@ +# SPDX-License-Identifier: GPL-2.0-only +# Initially written by: Michael Tokarev +# For QEMU Debian downstream package + +set -e + +. /etc/init.d/functions + +PATH=/sbin:/usr/sbin:/bin:/usr/bin +DESC="QEMU Guest Agent" +NAME=qemu-ga +DAEMON=@bindir@/$NAME +PIDFILE=/var/run/$NAME.pid + +# config +DAEMON_ARGS="" +# default transport +TRANSPORT=virtio-serial:/dev/virtio-ports/org.qemu.guest_agent.0 +NO_START=0 + +test ! -r /etc/default/qemu-guest-agent || . /etc/default/qemu-guest-agent +test "$NO_START" = "0" || exit 0 +test -x "$DAEMON" || exit 0 + +# +# Function that checks whenever system has necessary environment +# It also splits $TRANSPORT into $method and $path +# +do_check_transport() { + method=${TRANSPORT%%:*}; + path=${TRANSPORT#*:} + case "$method" in + virtio-serial | isa-serial) + if [ ! -e "$path" ]; then + echo "$NAME: transport endpoint not found, not starting" + return 1 + fi + ;; + esac +} + +case "$1" in + start) + do_check_transport || exit 0 + echo -n "Starting $DESC: " + start-stop-daemon -S -p $PIDFILE -x "$DAEMON" -- \ + $DAEMON_ARGS -d -m "$method" -p "$path" + echo "$NAME." + ;; + stop) + echo -n "Stopping $DESC: " + start-stop-daemon -K -x "$DAEMON" -p $PIDFILE + echo "$NAME." + ;; + status) + status "$DAEMON" + exit $? + ;; + restart|force-reload) + do_check_transport || exit 0 + echo -n "Restarting $DESC: " + start-stop-daemon -K -x "$DAEMON" -p $PIDFILE + sleep 1 + start-stop-daemon -S -p $PIDFILE -x "$DAEMON" -- \ + $DAEMON_ARGS -d -m "$method" -p "$path" + echo "$NAME." + ;; + *) + N=/etc/init.d/$NAME + echo "Usage: $N {start|stop|status|restart|force-reload}" >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/meta/recipes-devtools/qemu/qemu/qemu-guest-agent.udev b/meta/recipes-devtools/qemu/qemu/qemu-guest-agent.udev new file mode 100644 index 0000000000..47097057e3 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/qemu-guest-agent.udev @@ -0,0 +1,2 @@ +SUBSYSTEM=="virtio-ports", ATTR{name}=="org.qemu.guest_agent.0", \ + TAG+="systemd", ENV{SYSTEMD_WANTS}="qemu-guest-agent.service" From patchwork Fri Mar 10 18:54:23 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?Q2zDqW1lbnQgUMOpcm9u?= X-Patchwork-Id: 20766 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id EAD16C74A44 for ; Fri, 10 Mar 2023 18:54:40 +0000 (UTC) Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) by mx.groups.io with SMTP id smtpd.web11.28107.1678474474228981056 for ; Fri, 10 Mar 2023 10:54:34 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20210112 header.b=pOjfwZXA; spf=pass (domain: gmail.com, ip: 209.85.128.44, mailfrom: peron.clem@gmail.com) Received: by mail-wm1-f44.google.com with SMTP id r19-20020a05600c459300b003eb3e2a5e7bso4148369wmo.0 for ; Fri, 10 Mar 2023 10:54:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1678474472; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=28zyv0ihsOv101ecNIwYzST4i93yTIy0P79jyXITz+w=; b=pOjfwZXAp9s00xztay2ujdGsiVoTdJ9m6ZWcUt7CVkDRx9GIjPOWL9I21GZTX+ADvD vsV/swNi3C8L2iA8CXPvSPmBfEKqzazsqeKDE20SqYenpRKG8Fm5ncfCfX1UrjgK6J8y ReJBQ17pyMDrS/UsNN3QcaHBmPSty1qBAqUUuSqH33aiZfUBL4XY9ba4xF4xZStqlMO6 WuQxKvZXEijhtHr5Bai2rTrl9XnxilTHMaR96uruibxYzVWKvowIk+0eoBkt+o78ENke RrHjfGbyVN8LNwn7h2tdgP27yaKS3Jn9ONhLiZm2cUCgiKIaLOvJb8kXxoNcFPwEH5PS hzjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678474472; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=28zyv0ihsOv101ecNIwYzST4i93yTIy0P79jyXITz+w=; b=GyFEw+OgFn7KDPhW/EUK8dFejA3m5yc37411OfuWGoVhFp2aImtP0C4TzNoC9Ps9t4 0tsvLGZ8ydEXZIkvU3MqdKsUhHJsqjAiVZDNpVeRQQAt3iBUiBQeIu1P3hnzs+HGMB3A MayfWViSagypokWA6w5GvVwFr31vHN8fGgibVflf29mo7lUNR58ehQCA4cywXF3CxRYM ym7Kk1PJ9md1WuCAbYv8hZ+7DixUWkcRUbqAwGhaobAgoOzo7o/YqRz70TOnxsMP8lOx lzXyo9w2ailuZFhoSHMLBxVsLodgsxS09rbMLHPD+om5D720ut0oWLXDlw1SrR16J6gT FNBg== X-Gm-Message-State: AO0yUKVr/6MsrofztI7uGTSlWcxFb+BfEQvUIQmxeDcdSjzxgIuB7+Z0 HqR5cRjceeKHfgROSjkys6i+T7Pim1o= X-Google-Smtp-Source: AK7set/g+Dzil+6QJF66GRNnmaT0qFnQIIpvcS45tj/J3hE6ne8jyj3S7rz8ygd3NcDbrBqKJAM7Zw== X-Received: by 2002:a05:600c:310d:b0:3eb:3945:d405 with SMTP id g13-20020a05600c310d00b003eb3945d405mr3834675wmo.38.1678474472453; Fri, 10 Mar 2023 10:54:32 -0800 (PST) Received: from localhost.localdomain (2a01cb000c0d3d00488c42bf7f506bd5.ipv6.abo.wanadoo.fr. [2a01:cb00:c0d:3d00:488c:42bf:7f50:6bd5]) by smtp.gmail.com with ESMTPSA id p3-20020a1c7403000000b003dc42d48defsm701379wmc.6.2023.03.10.10.54.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Mar 2023 10:54:32 -0800 (PST) From: =?utf-8?b?Q2zDqW1lbnQgUMOpcm9u?= To: openembedded-core@lists.openembedded.org Cc: =?utf-8?b?Q2zDqW1lbnQgUMOpcm9u?= , Brenda Streiff Subject: [PATCH v5 2/2] runqemu: add an option to enable guest-agent virtio device Date: Fri, 10 Mar 2023 19:54:23 +0100 Message-Id: <20230310185423.171619-2-peron.clem@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230310185423.171619-1-peron.clem@gmail.com> References: <20230310185423.171619-1-peron.clem@gmail.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 10 Mar 2023 18:54:40 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/178343 Add support to the runqemu script for a new option, 'guestagent', that enables the virtio serial port for host-to-guest communication. Signed-off-by: Brenda Streiff Signed-off-by: Clément Péron --- scripts/runqemu | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/scripts/runqemu b/scripts/runqemu index 58b0c191e1..38aa35fdd4 100755 --- a/scripts/runqemu +++ b/scripts/runqemu @@ -82,6 +82,7 @@ of the following environment variables (in any order): kvm-vhost - enable KVM with vhost when running x86/x86_64 (VT-capable CPU required) publicvnc - enable a VNC server open to all hosts audio - enable audio + guestagent - enable guest agent communication [*/]ovmf* - OVMF firmware file or base name for booting with UEFI tcpserial= - specify tcp serial port number qemuparams= - specify custom parameters to QEMU @@ -216,6 +217,8 @@ class BaseConfig(object): self.cleaned = False # Files to cleanup after run self.cleanup_files = [] + self.guest_agent = False + self.guest_agent_sockpath = '/tmp/qga.sock' def acquire_taplock(self, error=True): logger.debug("Acquiring lockfile %s..." % self.taplock) @@ -526,6 +529,10 @@ class BaseConfig(object): elif arg == 'publicvnc': self.publicvnc = True self.qemu_opt_script += ' -vnc :0' + elif arg == 'guestagent': + self.guest_agent = True + elif arg.startswith('guestagent-sockpath='): + self.guest_agent_sockpath = '%s' % arg[len('guestagent-sockpath='):] elif arg.startswith('tcpserial='): self.tcpserial_portnum = '%s' % arg[len('tcpserial='):] elif arg.startswith('qemuparams='): @@ -1375,6 +1382,12 @@ class BaseConfig(object): except FileNotFoundError: raise RunQemuError("/dev/dri directory does not exist; no render nodes available on this machine. %s" %(render_hint)) + def setup_guest_agent(self): + if self.guest_agent == True: + self.qemu_opt += ' -chardev socket,path=' + self.guest_agent_sockpath + ',server,nowait,id=qga0 ' + self.qemu_opt += ' -device virtio-serial ' + self.qemu_opt += ' -device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0 ' + def setup_vga(self): if self.nographic == True: if self.sdl == True: @@ -1506,6 +1519,7 @@ class BaseConfig(object): if self.snapshot: self.qemu_opt += " -snapshot" + self.setup_guest_agent() self.setup_serial() self.setup_vga()