| Title: Snap integration in Qubes OS templates | |
| Author: Solène | |
| Date: 16 October 2024 | |
| Tags: snap qubesos linux | |
| Description: In this guide, you will learn how to setup your Qubes OS | |
| templates to integrate snap programs | |
| # Introduction | |
| Snap package format is interesting, while it used to have a bad | |
| reputation, I wanted to make my opinion about it. After reading its | |
| design and usage documentation, I find it quite good, and I have a good | |
| experience using some programs installed with snap. | |
| Snapcraft official website (store / documentation) | |
| Snap programs can be either packaged as "strict" or "classic"; when it | |
| is strict there is some confinement at work which can be inspected on | |
| an installed snap using `snap connections $appname`, while a "classic" | |
| snap has no sandboxing at all. Snap programs are completely | |
| decorrelated from the host operating system where snap is running, so | |
| you can have old or new versions of a snap packaged program without | |
| having to handle shared library versions. | |
| The following setup explains how to install snap programs in a template | |
| to run them from AppVMs, and not how to install snap programs in AppVMs | |
| as a user, if you need this, please us the Qubes OS guide linked below. | |
| Qubes OS documentation explains how to setup snap in a template, but | |
| with a helper to allow AppVMs to install snap programs in the user | |
| directory. | |
| Qubes OS official documentation: install snap packages in AppVMs | |
| In a previous blog post, I explained how to configure a Qubes OS | |
| template to install flatpak programs in it, and how to integrate it to | |
| the template. | |
| Previous blog post: Installing flatpak programs in a Qubes OS template | |
| # Setup on Fedora | |
| All commands are meant to be run as root. | |
| ## Snap installation | |
| Snapcraft official documentation: Installing snap on Fedora | |
| Installing snap is easy, run the following command: | |
| ``` | |
| dnf install snapd | |
| ``` | |
| To allow "classic" snaps to work, you need to run the following | |
| command: | |
| ``` | |
| sudo ln -s /var/lib/snapd/snap /snap | |
| ``` | |
| ## Proxy configuration | |
| Now, you have to configure snap to use the http proxy in the template, | |
| this command can take some time because snap will time out as it tries | |
| to use the network when invoked... | |
| ``` | |
| snap set system proxy.http="http://127.0.0.1:8082/" | |
| snap set system proxy.https="http://127.0.0.1:8082/" | |
| ``` | |
| ## Run updates on template update | |
| You need to prevent snap from searching for updates on its own as you | |
| will run updates when the template is updated: | |
| ``` | |
| snap refresh --hold | |
| ``` | |
| To automatically update snap programs when the template is updating (or | |
| doing any dnf operation), create the file | |
| `/etc/qubes/post-install.d/05-snap-update.sh` with the following | |
| content and make it executable: | |
| ``` | |
| #!/bin/sh | |
| if [ "$(qubesdb-read /type)" = "TemplateVM" ] | |
| then | |
| snap refresh | |
| fi | |
| ``` | |
| ## Qube settings menu integration | |
| To add the menu entry of each snap program in the qube settings when | |
| you install/remove snaps, create the file | |
| `/usr/local/sbin/sync-snap.sh` with the following content and make it | |
| executable: | |
| ``` | |
| #!/bin/sh | |
| # when a desktop file is created/removed | |
| # - links snap .desktop in /usr/share/applications | |
| # - remove outdated entries of programs that were removed | |
| # - sync the menu with dom0 | |
| inotifywait -m -r \ | |
| -e create,delete,close_write \ | |
| /var/lib/snapd/desktop/applications/ | | |
| while IFS=':' read event | |
| do | |
| find /var/lib/snapd/desktop/applications/ -type l -name "*.desktop" | while… | |
| do | |
| ln -s "$line" /usr/share/applications/ | |
| done | |
| find /usr/share/applications/ -xtype l -delete | |
| /etc/qubes/post-install.d/10-qubes-core-agent-appmenus.sh | |
| done | |
| ``` | |
| Install the package `inotify-tools` to make the script above working, | |
| and add this to `/rw/config/rc.local` to run it at boot: | |
| ``` | |
| /usr/local/bin/sync-snap.sh & | |
| ``` | |
| You can run the script now with `/usr/local/bin/sync-snap.sh &` if you | |
| plan to install snap programs. | |
| ## Snap store GUI | |
| If you want to browse and install snap programs using a nice interface, | |
| you can install the snap store. | |
| ``` | |
| snap install snap-store | |
| ``` | |
| You can run the store with `snap run snap-store` or configure your | |
| template settings to add the snap store into the applications list, and | |
| run it from your Qubes OS menu. | |
| # Debian | |
| The setup on Debian is pretty similar, you can reuse the Fedora guide | |
| except you need to replace `dnf` by `apt`. | |
| Snapcraft official documentation: Installing snap on Debian | |
| # Conclusion | |
| More options to install programs is always good, especially when it | |
| comes with features like quota or sandboxing. Qubes OS gives you the | |
| flexibility to use multiple templates in parallel, a new source of | |
| packages can be useful for some users. |