This package configures PipeWire, WirePlumber, and PipeWire-Pulse to run as a single system-wide daemon as the root user. This setup is optimized for headless media servers, HTPCs, or multi-user audio environments.
This project addresses several non-obvious hurdles required to make PipeWire stable in a root context.
We use the WirePlumber 0.5.x main-systemwide profile, but with critical modifications.
- Problem: WirePlumber's default
main-systemwideprofile (defined inwireplumber.conf) inherits frommixin.systemwide-session, which disablessupport.reserve-deviceandmonitor.alsa.reserve-device. - Solution: We explicitly re-enable these in our override:
wireplumber.profiles = { main-systemwide = { support.reserve-device = required ... } }
- Rationale: Without device reservation, the root PipeWire instance cannot "claim" ALSA hardware through D-Bus, leading to the "Dummy Output" issue.
- Reference: WirePlumber 0.5 Migration Guide
Root requires explicit permissions to own specific "well-known" names that are normally requested by session users.
org.pulseaudio.Server: Required forpipewire-pulseto be discoverable by PulseAudio clients.org.freedesktop.ReserveDevice1: Required for ALSA hardware claiming. Reference: Device Reservation Specification.org.pipewire.Telephony&org.bluez.Telephony1: Required for PipeWire'snativetelephony backend to expose its API.org.bluez.Profile1: Necessary for PipeWire to register A2DP and HFP/HSP profiles with BlueZ.
- Problem: Bluetooth Hands-Free Profile (HFP/HSP) requires a "backend" to handle voice data on the SCO socket. By default,
bluetoothd(BlueZ) may attempt to handle this internally via a plugin. - Solution: We use a systemd drop-in to start
bluetoothdwith--noplugin=hfp,sap. - Rationale: This prevents BlueZ from binding to the RFCOMM/SCO socket, allowing PipeWire's
nativebackend to take over. This resolves theAddress already in useandRegisterProfile failederrors. - Reference: PipeWire Bluetooth Backend Docs
- Rationale: In a root system-wide context, there is no "active user seat" tracked by
logind. By using themain-systemwideprofile and settingmonitor.bluez.seat-monitoring = false, we allow the Bluetooth monitor to activate even when no user is logged into a physical session.
XDG_RUNTIME_DIRRedirect: Redirected to/run/pipewirevia systemd units.- Permissions: Mode
0755is used for/run/pipewireand specifically the/pulsesubdirectory to allow non-root users (like GDM or your local user) to "traverse" the directory and connect to the socket.
-
Build:
makepkg -f -
Verify:
namcap PKGBUILDandnamcap *.pkg.tar.zst -
Generate Metadata:
makepkg --printsrcinfo > .SRCINFO -
Install Locally:
sudo pacman -U pipewire-system-*.pkg.tar.zst -
AUR Submission:
- Create a new repository on AUR.
- Add the AUR remote:
git remote add aur ssh://aur@aur.archlinux.org/pipewire-system.git - Push:
git push aur master
-
Permission Setup: Ensure your user is a member of the
audiogroup to access the sockets:sudo usermod -aG audio $USER -
Clean Restart:
sudo systemctl daemon-reload sudo systemctl reload dbus sudo systemctl restart bluetooth sudo systemctl restart wireplumber pipewire-pulse pipewire