kde/qemu: system D-Bus — mata el spam udisks2 y completa el escritorio

plasmashell/solid spameaba "kf.solid.backends.udisks2: Not connected to D-Bus
server" en cada poll: sólo había bus de sesión, no de sistema. Ahora plasma-start
levanta dbus-daemon --system (socket estándar /run/dbus/system_bus_socket).

- qemu-desktop-image.sh: siembra el usuario messagebus:81 en passwd/group
  (system.conf hace setuid a él; el passwd base no lo traía). Rompe el hardlink
  read-only con `mv` de un temp, como el patch del seed.
- plasma-start-qemu.sh: arranca el system bus antes del de sesión + copia
  machine-id a /var/lib/dbus.

No hay udisksd/upowerd reales en el rootfs ⇒ sin discos/batería, pero el bus
existe y solid deja de errorear. Verificado: "Not connected" pasó de spam
continuo a 0; system bus ON; kwin+plasmashell+KSplash+kioworker vivos; 139=0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-20 11:43:34 -04:00
co-authored by Claude Opus 4.8
parent b53a822b42
commit 6e5bc48c58
2 changed files with 31 additions and 0 deletions
+15
View File
@@ -88,6 +88,21 @@ EOF
say "GPU DRM: $(ls /dev/dri/ 2>/dev/null | tr '\n' ' ')"
[ -e /dev/dri/card0 ] || say "!! no hay /dev/dri/card0 — ¿virtio-gpu no cargó? (dmesg | grep -i drm)"
# D-Bus de SISTEMA: sin él, kf.solid/udisks2 spamea "Not connected to D-Bus server" y powerdevil + los
# applets de dispositivos/energía no inician. Escucha en el path estándar /run/dbus/system_bus_socket
# (los clientes lo hallan por DBUS_SYSTEM_BUS_ADDRESS por defecto ⇒ no exportamos nada). Corre como root
# y hace setuid a messagebus (uid 81, sembrado en el passwd de la imagen). No hay udisksd/upowerd reales
# en el rootfs ⇒ no habrá discos/batería, pero el bus existe y solid deja de errorear en cada poll.
mkdir -p /run/dbus /var/lib/dbus
cp -f /etc/machine-id /var/lib/dbus/machine-id 2>/dev/null || true
if [ ! -S /run/dbus/system_bus_socket ]; then
if dbus-daemon --system --fork 2>/tmp/dbus-system.log; then
say "system bus ON (/run/dbus/system_bus_socket)"
else
say "!! system bus NO arrancó:"; dump /tmp/dbus-system.log
fi
fi
# D-Bus de sesión
if [ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ]; then
DBUS_SESSION_BUS_ADDRESS=$(dbus-daemon --session --fork --print-address 2>/dev/null)
+16
View File
@@ -71,6 +71,22 @@ ln -sf /usr/lib/musl/lib/libc.so "$MERGED/lib/ld-musl-x86_64.so.1" # intérpre
ln -sf /usr/lib/musl/lib/libc.so "$MERGED/usr/lib/libc.so" # NEEDED soname en el search path
echo " ✓ musl inyectado ($(du -h "$MERGED/usr/lib/musl/lib/libc.so" | cut -f1))"
echo "==> usuario messagebus (el system bus de dbus hace setuid a él; falta en el passwd base)"
# dbus-daemon --system lee system.conf que hace <user>messagebus</user> ⇒ sin ese uid, arrancado como
# root, falla el setuid. Lo agregamos rompiendo el hardlink read-only del passwd/group base con `mv`
# (rename reemplaza la entrada de directorio sin tocar el inode fuente). uid/gid 81 = convención Alpine.
if ! grep -q '^messagebus:' "$MERGED/etc/passwd"; then
tmp="$MERGED/etc/passwd.new"
{ cat "$MERGED/etc/passwd"; echo 'messagebus:x:81:81:messagebus:/dev/null:/sbin/nologin'; } > "$tmp"
chmod 644 "$tmp"; mv "$tmp" "$MERGED/etc/passwd"
fi
if ! grep -q '^messagebus:' "$MERGED/etc/group"; then
tmp="$MERGED/etc/group.new"
{ cat "$MERGED/etc/group"; echo 'messagebus:x:81:'; } > "$tmp"
chmod 644 "$tmp"; mv "$tmp" "$MERGED/etc/group"
fi
echo " ✓ messagebus:81 en passwd/group"
echo "==> instalando /usr/bin/plasma-start (variante QEMU software-GL)"
install -Dm755 scripts/kde/plasma-start-qemu.sh "$MERGED/usr/bin/plasma-start"