Debian-minimal template for sys-audio

This thread has been incredibly helpful. I have successfully created a disposable sys-audio qube that works on my Librem 14.

However, in order for it to work, I need to make it startup, then shutdown, then startup, then shutdown, and then startup a third time. Otherwise, it does not recognize the audio device as being attached. And this only seems to work once per session. If, after doing this triple-startup and having a working sys-audio, I decide to shutdown sys-audio, then I will not be able to get sys-audio to startup again with audio device recognized until I reboot QubesOS itself.

When creating a non-disposable sys-audio qube, there appears to be an unpredictable number of startups and shutdowns needed before it recognizes the audio device as being attached. So the predictability of the disposable makes it the better option for a stable solution here on my Librem 14.

I am very curious why this procedure of startups and shutdowns is necessary at all. Is anyone familiar with this? Is there anyone else with a Librem 14 that has created a sys-audio qube?

Here are all of the steps that I followed for making a disposable sys-audio qube:

  • Clone debian-11-minimal template:

qvm-clone debian-11-minimal deb11-min-audio

  • Make the clone (deb11-min-audio) startup, install necessary packages, create snd.conf file for soundcard, and then shutdown:

qvm-run -u root --pass-io deb11-min-audio 'apt install alsa-firmware-loaders alsa-oss alsa-ucm-conf alsa-utils gnome-keyring qubes-input-proxy-sender qubes-usb-proxy -y && apt install --no-install-recommends blueman pavucontrol pulseaudio pulseaudio-qubes qubes-core-admin-client qubes-gui-daemon-pulseaudio -y && touch /etc/modprobe.d/snd.conf && echo -e "options snd_hda_intel power_save=0" > /etc/modprobe.d/snd.conf' && qvm-shutdown --wait deb11-min-audio

  • Create sys-audio qube:

sudo qubesctl state.sls qvm.sys-audio

  • Set the template to be the clone from earlier:

qvm-prefs sys-audio template deb11-min-audio

  • Disable autostart and memory balancing features:

qvm-prefs sys-audio autostart false && qvm-prefs sys-audio maxmem 0

  • Detach the audio device:

qvm-pci detach sys-audio dom0:00_1f.3

  • Clone the sys-audio qube:

qvm-clone sys-audio sys-audio-template

  • Set the clone to be a template for disposables, set it to be its own default disposable, and set the virt_mode to pvh:

qvm-prefs sys-audio-template template_for_dispvms true && qvm-prefs sys-audio-template default_dispvm sys-audio-template && qvm-prefs sys-audio-template virt_mode pvh

  • Set the color to gray, and set appmenu option to none:

qvm-prefs sys-audio-template label gray && qvm-features sys-audio-template appmenus-dispvm ''

  • Enable the audiovm service

qvm-service sys-audio-template audiovm true

  • Make the clone (sys-audio-template) startup, create an autostart directory in the ~/.config directory, and create two files in this new directory for autostarting necessary processes:

qvm-run --pass-io sys-audio-template "mkdir /home/user/.config/autostart/ && touch /home/user/.config/autostart/pulseaudio.desktop && echo -e '[Desktop Entry]\nName=Pulseaudio\nComment=Starts Pulseaudio\nIcon=qubes\nExec=pulseaudio\nTerminal=False\nType=Application\nNotShowIn=KDE;' > /home/user/.config/autostart/pulseaudio.desktop && touch /home/user/.config/autostart/qvm-start-daemon.desktop && echo -e '[Desktop Entry]\nName=Qubes Guid/Pacat\nComment=Starts GUI/AUDIO daemon for Qubes VMs\nIcon=qubes\nExec=qvm-start-daemon --all --watch\nTerminal=False\nType=Application\nNotShowIn=KDE;' > /home/user/.config/autostart/qvm-start-daemon.desktop"

  • Make the sys-audio qube run the command ‘sudo alsactl init’ on startup by adding it to the /rw/config/rc.local file in the sys-audio-template qube, and then shutdown sys-audio-template:

qvm-run -u root --pass-io sys-audio-template "sudo echo -e 'sudo alsactl init' >> /rw/config/rc.local" && qvm-shutdown --wait sys-audio-template

  • Remove the non-disposable sys-audio qube that was created earlier:

qvm-remove -f sys-audio

  • Create a disposable sys-audio qube based on the sys-audio-template qube, disable autostart and memory balancing, set netvm and audiovm to none, set virt_mode to hvm, and set the color to gray:

qvm-create --class DispVM --template sys-audio-template --prop autostart=false --prop netvm="" --prop virt_mode=hvm --prop maxmem=0 --prop audiovm="" --label gray sys-audio

  • Attach the audio device in persistent mode with option ‘no-strict-reset’ enabled:

qvm-pci attach sys-audio dom0:00_1f.3 --persistent --option no-strict-reset=true

  • Enable the appmenu option and the audiovm service:

qvm-features sys-audio appmenus-dispvm 1 && qvm-service sys-audio audiovm true

  • Set the new disposable sys-audio qube to be the default audiovm for all qubes:

qubes-prefs default_audiovm sys-audio

  • Edit /etc/qubes/policy.d/50-sys-audio.policy in dom0 to have the following:

admin.Events * sys-audio sys-audio allow target=dom0
admin.Events * sys-audio @adminvm allow target=dom0
admin.Events * sys-audio @tag:audiovm-sys-audio allow target=dom0
admin.vm.CurrentState * sys-audio sys-audio allow target=dom0
admin.vm.CurrentState * sys-audio @adminvm allow target=dom0
admin.vm.CurrentState * sys-audio @tag:audiovm-sys-audio allow target=dom0
admin.vm.List * sys-audio sys-audio allow target=dom0
admin.vm.List * sys-audio @adminvm allow target=dom0
admin.vm.List * sys-audio @tag:audiovm-sys-audio allow target=dom0
admin.vm.property.Get +audiovm sys-audio @tag:audiovm-sys-audio allow target=dom0
admin.vm.property.Get +xid sys-audio @tag:audiovm-sys-audio allow target=dom0
admin.vm.property.Get +stubdom_xid sys-audio @tag:audiovm-sys-audio allow target=dom0
admin.vm.feature.CheckWithTemplate +audio sys-audio @tag:audiovm-sys-audio allow target=dom0
admin.vm.feature.CheckWithTemplate +audio-model sys-audio @tag:audiovm-sys-audio allow target=dom0
admin.vm.property.Get +keyboard_layout sys-audio @tag:audiovm-sys-audio allow target=dom0
admin.vm.property.GetAll * sys-audio sys-audio allow target=dom0
admin.vm.property.GetAll * sys-audio @tag:audiovm-sys-audio allow target=dom0
admin.vm.property.GetAll * sys-audio @adminvm allow target=dom0
admin.vm.property.Set +keyboard_layout sys-audio * allow target=dom0

  • Decide which qubes do not need audio and configure them:

qvm-prefs <qube-that-does-not-need-audio> audiovm ''

  • Make a script in dom0 for starting sys-audio with the triple-startup (I also have a command included so that sys-audio volume is set to zero by default):

mkdir ~/scripts && cd ~/scripts && touch sys-audio-start && echo -e 'qvm-start --quiet sys-audio && qvm-shutdown --wait sys-audio && qvm-start --quiet sys-audio && qvm-shutdown --wait sys-audio && qvm-start --quiet sys-audio && qvm-run --pass-io sys-audio "amixer sset Master 0%"' > sys-audio-start && sudo chmod +x sys-audio-start

  • Make a button on Panel to run the sys-audio-start script.
    Add a Launcher to Panel, add any item, edit item name and comment, choose icon, then change command to the following:

/home/<user>/scripts/sys-audio-start

I also set keyboard shortcuts in the dom0 Settings Manager.

  • Set keyboard shortcut F10 to toggle mute/unmute:

qvm-run --pass-io sys-audio "amixer sset Master toggle"

  • Set keyboard shortcut F11 to decrease volume by 2%:

qvm-run --pass-io sys-audio "amixer sset Master 2%-"

  • Set keyboard shortcut F12 to increase volume by 2%:

qvm-run --pass-io sys-audio "amixer sset Master 2%+"

12 Likes