Dotfiles/setup/modules/optional-Modules/apps/qemu.sh

42 lines
1.8 KiB
Bash

#!/bin/bash
# Exit immediately on error, treat unset variables as errors, propagate pipe failures.
set -euo pipefail
# Load shared log/warn/skip helpers from the installer library.
source "$(dirname "${BASH_SOURCE[0]}")/../../lib/logging.sh"
log "Installing QEMU/KVM + libvirt stack + virt-manager..."
# qemu-full: full QEMU build with all emulation targets and utilities;
# libvirt: management daemon + API used by virt-manager; virt-manager: GUI front-end;
# virt-viewer: lightweight display client for VM consoles;
# dnsmasq: DHCP/DNS for the default NAT network; bridge-utils: bridge management;
# edk2-ovmf: UEFI firmware images for UEFI-boot VMs; swtpm: software TPM emulator;
# vde2: virtual distributed Ethernet for advanced networking topologies.
sudo pacman -S --noconfirm --needed \
qemu-full \
libvirt \
virt-manager \
virt-viewer \
dnsmasq \
bridge-utils \
edk2-ovmf \
swtpm \
vde2
log "Enabling libvirtd service..."
# libvirtd must run as root to manage KVM devices and network namespaces.
sudo systemctl enable --now libvirtd.service
log "Configuring default NAT network for autostart..."
# The 'default' NAT network is created by libvirt on first start; net-autostart
# makes it come up automatically after each libvirtd restart.
# 2>/dev/null || true: suppress the error if the network does not yet exist
# (it will be created on first libvirtd run), preventing set -e from aborting.
sudo virsh net-autostart default 2>/dev/null || true
log "Adding $USER to libvirt and kvm groups..."
# Membership in libvirt allows managing VMs without sudo; kvm grants direct
# access to /dev/kvm for hardware acceleration. Group changes only apply
# after the user logs out and back in.
sudo usermod -aG libvirt,kvm "$USER"
log "QEMU/KVM installed. Log out and back in for group membership to take effect."