We deploy and run applications via the snap ecosystem on a number of Raspberry Pis. The underlying OS on these is Raspbian/Debian rather than Ubuntu Core, and this will probably not change in the near future.
For the snaps to run, we’ve found that both the coreandcore18 base snaps need to be installed. This is because:
core18 is set as the base in our snapcraft.yaml, since the code requires Python 3.6 (rather than 3.5, which is what core provides).
The core snap needs to be installed, since this provides all the actual interfaces (core18 does not). Without a core snap, interfaces like network-bind don’t exist on the system at all - and any attempt by the application snap to bind to a port correspondingly fails.
I feel like issue #2 was discussed elsewhere some time ago, though I can’t find it right now. In any case, the symptoms look like this:
$ sudo snap connect <snap-name>:network-bind
error: cannot resolve connection, slot snap name is empty
And running snap interfaces only shows plugs on the snap side, and no slots on the system side.
My question is as follows: is there any way to avoid installing both the core and core18 snaps?
Perhaps there is another snap (besides core) that can provide the interfaces/slots? It just seems somewhat inelegant and duplicative to require both base snaps. And on a practical level, it means that updates for both base snaps are being downloaded during refresh, which ends up eating up bandwidth in a constrained environment.
Yes, tried this (again) today, thinking that things may have evolved since last time. The bug - specifically, lack of interfaces on core18 - still appears to be there
Yes there is, using the snapd snap. However, in order to use the snapd snap (and only the snapd snap), on a classic distro your OS needs to meet these 3 conditions:
the version of snapd packaged by your distro needs to be new enough to support switching to use the snapd snap, I can confirm that 2.40 is at least new enough, I don’t know what version you may have in the Raspbian archive
your distro needs to support re-exec (and thus using the version of snapd from a snap rather than from a traditional package like a deb or rpm) - Debian derivatives are good here
You need to never have installed any snaps before. This is because today, as soon as the core snap is installed, it is forever unremovable. If you have installed snaps, you could reset snapd state by removing all snaps, and then purging the package from your machine, then reinstall the snapd distro package and install the snapd snap first before anything else.
So if you meet all those requirements, just install the snapd snap with snap install snapd and then you should see you only have the snapd snap installed:
ubuntu@busy-collie:~$ snap version # version from xenial archives
snap 2.40
snapd 2.40
series 16
ubuntu 16.04
kernel 4.4.0-173-generic
ubuntu@busy-collie:~$ sudo snap install snapd # install the snapd snap
2020-02-09T19:34:32-06:00 INFO Waiting for restart...
snapd 2.42.5 from Canonical✓ installed
ubuntu@busy-collie:~$ snap list # only the snapd snap installed
Name Version Rev Tracking Publisher Notes
snapd 2.42.5 5754 stable canonical✓ snapd
ubuntu@busy-collie:~$ snap version # now using snapd from the snapd snap
snap 2.42.5
snapd 2.42.5
series 16
ubuntu 16.04
kernel 4.4.0-173-generic
ubuntu@busy-collie:~$ dpkg -s snapd | grep Version # still old version of snapd in debian pkg
Version: 2.40
ubuntu@busy-collie:~$ sudo snap install test-snapd-sh-core18 # install a core18 snap
test-snapd-sh-core18 1.0 from Sergio Cazzolato (cachio) installed
ubuntu@busy-collie:~$ snap list # now we have only snapd, core18, & test-snapd-sh-core18 snaps
Name Version Rev Tracking Publisher Notes
core18 20200124 1668 stable canonical✓ base
snapd 2.42.5 5754 stable canonical✓ snapd
test-snapd-sh-core18 1.0 7 stable cachio -
Also note that if you ever end up installing a snap with base: core, you will be unable to remove the core snap, even if you remove the snap that has base: core, I think this is a bug however, since if we’re using the snapd snap and you don’t have any snaps with base: core I think you should be able to remove the core snap.
@kyrofa that’s an interesting suggestion. I’m a little concerned about ending up in dependency hell (with respect to the other libraries), but will keep it mind.
@ijohnson thanks for the detailed instructions. I did wonder if the version of snapd I was using was the culprit here - Raspbian Buster (stable) comes with 2.37.4, which I’m conscious is a bit out of date. So as part of my testing I did install a more recent version of snapd via dpkg, which did not solve the interface issue. But I did not think to try installing the snapd snap through that. I’ll give what you’re suggesting a spin later today and report back.
This allows you to install snapd 2.42.1 via sudo apt update && sudo apt install -y snapd/testing. [Aside: getting a recent version of snapd is probably also doable manually through dpkg, though there’s at least one dependency from Bullseye that snapd 2.42.1 requires, so the apt sources method seems cleaner]
Install any snap that has base: core18. This will also trigger an install of the snapd and core18 snaps. The core18-based snap will work normally, with all interfaces connected as expected - and without the core snap being installed.
Thanks again for the help in getting this running!
So…I came across a situation with the wifi-ap snap, which does not define a base one way or another - but still triggers an install of the core snap. Any ideas why that is? My understanding was that not specifying a base does not imply base: core - and that’s also what I understand from your comment.
For reference, the snap.yaml from the wifi-ap snap’s meta directory is below. As a workaround I’m currently trying to roughly clone that snap with base: core18 specified, to avoid this situation.
snap.yaml
name: wifi-ap
version: 30
summary: WiFi Access Point based on hostapd
description: |
This snap is implementing a WiFi access point based on hostapd and allows
easily to share a internet connection or just create a network others can
easily connect to.
Please find the source of this snap at:
https://code.launchpad.net/~snappy-hwe-team/snappy-hwe-snaps/+git/wifi-ap
architectures:
- armhf
confinement: strict
grade: stable
slots:
control:
content: socket-directory
interface: content
write:
- $SNAP_DATA/sockets
apps:
automatic-setup:
command: command-automatic-setup.wrapper
daemon: simple
plugs:
- network
config:
command: command-config.wrapper
plugs:
- network
management-service:
command: command-management-service.wrapper
daemon: simple
plugs:
- network-bind
- network-control
- firewall-control
- network-manager
setup-wizard:
command: command-setup-wizard.wrapper
plugs:
- network
status:
command: command-status.wrapper
plugs:
- network
Ah ok got it. I think I was also thrown off by some of what I read at https://snapcraft.io/docs/base-snaps, e.g. “Snaps that don’t use bases can often migrate to one without too much difficulty.” - which made me think that there is such a thing as a snap without a base.