Add LXD VM Guest Agent Support (#2145)

* Add LXD VM Guest Agent Support

* Add systemd patch, remove udev rules, change to kernel modules, fix linter

* Remove systemd patch, add conditionals to qemu-guest and lxd-agent

* Update buildroot-external/package/qemu-guest-agent/qemu-guest.service

Co-authored-by: Stefan Agner <stefan@agner.ch>
This commit is contained in:
Bryan York 2022-10-02 01:06:56 -07:00 committed by GitHub
parent e53196d176
commit 2ac9dc1c75
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 97 additions and 0 deletions

View File

@ -8,6 +8,7 @@ source "$BR2_EXTERNAL_HASSOS_PATH/package/khadas-boot/Config.in"
source "$BR2_EXTERNAL_HASSOS_PATH/package/os-agent/Config.in" source "$BR2_EXTERNAL_HASSOS_PATH/package/os-agent/Config.in"
source "$BR2_EXTERNAL_HASSOS_PATH/package/pi-bluetooth/Config.in" source "$BR2_EXTERNAL_HASSOS_PATH/package/pi-bluetooth/Config.in"
source "$BR2_EXTERNAL_HASSOS_PATH/package/qemu-guest-agent/Config.in" source "$BR2_EXTERNAL_HASSOS_PATH/package/qemu-guest-agent/Config.in"
source "$BR2_EXTERNAL_HASSOS_PATH/package/lxd-guest-agent/Config.in"
source "$BR2_EXTERNAL_HASSOS_PATH/package/rpi-eeprom/Config.in" source "$BR2_EXTERNAL_HASSOS_PATH/package/rpi-eeprom/Config.in"
source "$BR2_EXTERNAL_HASSOS_PATH/package/rpi-rf-mod/Config.in" source "$BR2_EXTERNAL_HASSOS_PATH/package/rpi-rf-mod/Config.in"
source "$BR2_EXTERNAL_HASSOS_PATH/package/rtl88x2bu/Config.in" source "$BR2_EXTERNAL_HASSOS_PATH/package/rtl88x2bu/Config.in"

View File

@ -16,6 +16,16 @@ CONFIG_VMWARE_VMCI=y
CONFIG_VMWARE_BALLOON=y CONFIG_VMWARE_BALLOON=y
CONFIG_VMWARE_PVSCSI=y CONFIG_VMWARE_PVSCSI=y
# These options are for LXD Guest Support
CONFIG_NET_9P=m
CONFIG_NET_9P_VIRTIO=m
CONFIG_9P_FS=m
CONFIG_9P_FS_POSIX_ACL=m
CONFIG_PCI=y
CONFIG_VSOCKETS=m
CONFIG_VIRTIO_VSOCKETS_COMMON=m
CONFIG_VHOST_VSOCK=m
# VirtualBox # VirtualBox
CONFIG_VBOXGUEST=m CONFIG_VBOXGUEST=m

View File

@ -124,6 +124,7 @@ BR2_PACKAGE_HASSIO_MACHINE="qemux86-64"
BR2_PACKAGE_OS_AGENT=y BR2_PACKAGE_OS_AGENT=y
BR2_PACKAGE_OS_AGENT_BOARD="Ova" BR2_PACKAGE_OS_AGENT_BOARD="Ova"
BR2_PACKAGE_QEMU_GUEST_AGENT=y BR2_PACKAGE_QEMU_GUEST_AGENT=y
BR2_PACKAGE_LXD_GUEST_AGENT=y
BR2_PACKAGE_RPI_RF_MOD=y BR2_PACKAGE_RPI_RF_MOD=y
BR2_PACKAGE_RTL88X2BU=y BR2_PACKAGE_RTL88X2BU=y
BR2_PACKAGE_RTL8821CU=y BR2_PACKAGE_RTL8821CU=y

View File

@ -0,0 +1,9 @@
config BR2_PACKAGE_LXD_GUEST_AGENT
bool "LXD Guest Agent"
depends on BR2_USE_MMU # libglib2
depends on BR2_USE_WCHAR # libglib2
depends on BR2_TOOLCHAIN_HAS_THREADS # libglib2
select BR2_PACKAGE_LIBGLIB2
select BR2_PACKAGE_ZLIB
help
LXD guest agent for LXD based virtualisations

View File

@ -0,0 +1,39 @@
#!/bin/sh
set -eu
PREFIX="/run/lxd_agent"
# Functions.
mount_virtiofs() {
mount -t virtiofs config "${PREFIX}/.mnt" >/dev/null 2>&1
}
mount_9p() {
/sbin/modprobe 9pnet_virtio >/dev/null 2>&1 || true
/bin/mount -t 9p config "${PREFIX}/.mnt" -o access=0,trans=virtio >/dev/null 2>&1
}
fail() {
umount -l "${PREFIX}" >/dev/null 2>&1 || true
rmdir "${PREFIX}" >/dev/null 2>&1 || true
echo "${1}"
exit 1
}
# Setup the mount target.
umount -l "${PREFIX}" >/dev/null 2>&1 || true
mkdir -p "${PREFIX}"
mount -t tmpfs tmpfs "${PREFIX}" -o mode=0700,size=50M
mkdir -p "${PREFIX}/.mnt"
# Try virtiofs first.
mount_virtiofs || mount_9p || fail "Couldn't mount virtiofs or 9p, failing."
# Copy the data.
cp -Ra "${PREFIX}/.mnt/"* "${PREFIX}"
# Unmount the temporary mount.
umount "${PREFIX}/.mnt"
rmdir "${PREFIX}/.mnt"
# Fix up permissions.
chown -R root:root "${PREFIX}"

View File

@ -0,0 +1,17 @@
[Unit]
Description=LXD - agent
After=syslog.target network.target
ConditionPathExists=/dev/virtio-ports/org.linuxcontainers.lxd
[Service]
Type=notify
WorkingDirectory=-/run/lxd_agent
ExecStartPre=/usr/lib/systemd/lxd-agent-setup
ExecStart=/run/lxd_agent/lxd-agent
Restart=on-failure
RestartSec=5s
StartLimitInterval=60
StartLimitBurst=10
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,19 @@
################################################################################
#
# lxd-guest-agent
#
################################################################################
LXD_GUEST_AGENT_DEPENDENCIES = host-pkgconf
define LXD_GUEST_AGENT_INSTALL_INIT_SYSTEMD
$(INSTALL) -D -m 644 $(LXD_GUEST_AGENT_PKGDIR)/lxd-agent.service \
$(TARGET_DIR)/usr/lib/systemd/system/lxd-agent.service
$(INSTALL) -D -m 755 $(LXD_GUEST_AGENT_PKGDIR)/lxd-agent-setup \
$(TARGET_DIR)/usr/lib/systemd/lxd-agent-setup
$(INSTALL) -d $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants
ln -fs /usr/lib/systemd/system/lxd-agent.service \
$(TARGET_DIR)/etc/systemd/system/multi-user.target.wants/lxd-agent.service
endef
$(eval $(generic-package))

View File

@ -3,6 +3,7 @@ Description=QEMU Guest Agent
After=syslog.target network.target After=syslog.target network.target
ConditionVirtualization=|kvm ConditionVirtualization=|kvm
ConditionVirtualization=|qemu ConditionVirtualization=|qemu
ConditionPathExists=!/dev/virtio-ports/org.linuxcontainers.lxd
[Service] [Service]
ExecStart=/usr/libexec/qemu-ga -m virtio-serial -p /dev/virtio-ports/org.qemu.guest_agent.0 ExecStart=/usr/libexec/qemu-ga -m virtio-serial -p /dev/virtio-ports/org.qemu.guest_agent.0