As you may or may not be aware, I work for Canonical on Snapcraft and Ubuntu. I use Ubuntu as my daily driver, and spend a lot of time maintaining snap packages, and listening to developers and users talk about software packaging, publishing, delivery and use.
Over time I’ve collected a bunch of virtual notes in my head. Much of it has been turned into documentation, but often the information is rather spread out. I wanted to “brain dump” a bunch of notes, for common things people ask me about snap, snapd and snapcraft. Here’s the first set, about snap
/ snapd
. A later post will focus on snapcraft
.
The source for this page is on GitHub, PRs and issues welcome, within reason.
The basics
Searching for snaps
Search for snaps which are published for the current architecture using the words specified.
Note: Results will vary because not all snaps are built and published for all architectures. That’s up to the publisher to decide based on compatibility, availability and supportability, usually.
$ snap find ohmygiraffe
Name Version Publisher Notes Summary
ohmygiraffe 1.1.0a popey - oh my giraffe
Sections
Sections are like categories. Publishers can choose which section to put their application in, to make it easier for users to find.
List sections
$ snap find --section
No section specified. Available sections:
* art-and-design
* books-and-reference
* development
* devices-and-iot
* education
* entertainment
* featured
* finance
* games
* health-and-fitness
* music-and-audio
* news-and-weather
* personalisation
* photo-and-video
* productivity
* science
* security
* server-and-cloud
* social
* utilities
Please try 'snap find --section=<selected section>'
Search in sections
$ snap find ohmygiraffe --section=games
Name Version Publisher Notes Summary
ohmygiraffe 1.1.0a popey - oh my giraffe
Show info about a snap
Includes application description, license and other, full metadata.
$ snap info ohmygiraffe
name: ohmygiraffe
summary: oh my giraffe
publisher: Alan Pope (popey)
store-url: https://snapcraft.io/ohmygiraffe
contact: [email protected]
license: Proprietary
description: |
A game about a giraffe eating fruit while being chased by lions.
oh my giraffe by Nico Prins (kneeko).
Find out more, and get oh my giraffe for other platforms at
https://www.ohmygiraffe.com/
snap-id: OZ7LxjGo2W76qWvpNpiklbRtCA4u84L3
channels:
latest/stable: 1.1.0a 2020-11-04 (7) 40MB -
latest/candidate: ↑
latest/beta: ↑
latest/edge: 1.1.0a 2020-11-04 (10) 40MB -
Show channels used by a snap
Only shows the channel map.
$ snap info ohmygiraffe | sed -n "/channels/,$ p"
channels:
latest/stable: 1.1.0a 2020-11-04 (7) 40MB -
latest/candidate: ^
latest/beta: ^
latest/edge: 1.1.0a 2020-11-04 (10) 40MB -
Installing & Removing Snaps
Install
Install a snap from the stable channel.
$ snap install ohmygiraffe
ohmygiraffe 1.1.0a from Alan Pope (popey) installed
Install from a specific channel
$ snap install emoj --edge
Switch to a different channel
$ snap switch ohmygiraffe --edge
"ohmygiraffe" switched to the "latest/edge" channel
$ snap refresh ohmygiraffe
ohmygiraffe (edge) 1.1.0a from Alan Pope (popey) refreshed
or
$ snap refresh ohmygiraffe --edge
ohmygiraffe (edge) 1.1.0a from Alan Pope (popey) refreshed
Installing a classic snap
Classic confined snaps have no confinement. If you try to install them without specifying --classic
you get some text describing the implication of installing it, and the choice to specify --classic
and install, or to stop at that point.
$ snap install snapcraft
error: This revision of snap "snapcraft" was published using classic
confinement and thus may perform arbitrary system changes outside of the
security sandbox that snaps are usually confined to, which may put your
system at risk.
If you understand and want to proceed, repeat the command including
--classic.
Note: In documentation, it’s generally not recommended to add the --classic
suffix even when needed, because users who copy-paste the command will never be empowered to make the choice of whether they want a classic snap installed or not, via the message above.
Note: Don’t try to install a non-classic snap using --classic
. It won’t work, and isn’t meant to.
$ snap install snapcraft --classic
snapcraft 4.4.4 from Canonical✓ installed
Note: The ‘✓’ means the publisher is a verified developer.
Removing
Removing a snap will automatically take a snapshot of the data created by the application in snap-related folders. Data created outside those places - such as on removable media, or in the user’s home directory - will not be snapshotted.
Only the data in $HOME/snap/(snapname)/
and/or /var/snap/(snapname)
(if used) are compressed as a zip into /var/lib/snapd/snapshots
. The snapshot is kept in the event of an accidental removal deleting essential data such as browser bookmarks, which might otherwise be lost.
$ snap remove ohmygiraffe
ohmygiraffe removed
Remove without snapshot
Some snaps generate huge datasets (e.g. crypto nonsense) and may be too large, or not required for backing up. Purging the snap is exactly the same as removal, but it omits the snapshot.
$ snap remove ohmygiraffe --purge
ohmygiraffe removed
Reverting updates
If a snap fails to install, or an update is undesireable after it’s been installed, the snap can be reverted with the following.
$ snap revert zoom-client
zoom-client reverted to 5.4.54779.1115
To further illustrate, here’s the channel map for that snap, showing I’m tracking latest/stable
but not running the version currently published there - revision 118 vs revision 125, at the time of writing.
tracking: latest/stable
refresh-date: today at 19:34 GMT
channels:
latest/stable: 5.4.57450.1220 2020-12-23 (125) 245MB -
latest/candidate: 5.4.53350.1027 2020-10-31 (108) 157MB -
latest/beta: 5.4.53350.1027 2020-10-31 (108) 157MB -
latest/edge: 5.4.57450.1220 2020-12-22 (125) 245MB -
installed: 5.4.54779.1115 (118) 244MB -
Reviewing changes
List of changes
To get a list of the most recent changes (installations, removals etc) of snaps, use this command.
$ snap changes
ID ID Status Spawn Ready Summary
Status Spawn Ready Summary
860 Done today at 18:02 GMT today at 18:02 GMT Switch "ohmygiraffe" snap to channel "edge"
861 Done today at 18:03 GMT today at 18:03 GMT Refresh "ohmygiraffe" snap
862 Done today at 18:10 GMT today at 18:10 GMT Remove "snapcraft" snap
863 Done today at 18:18 GMT today at 18:18 GMT Install "snapcraft" snap
864 Done today at 18:20 GMT today at 18:20 GMT Remove "ohmygiraffe" snap
Get change detail
To view all the steps performed during a task, use the following command, specifying the ID from the output above.
$ snap change 864
Status Spawn Ready Summary
Done today at 18:20 GMT today at 18:20 GMT Stop snap "ohmygiraffe" services
Done today at 18:20 GMT today at 18:20 GMT Run remove hook of "ohmygiraffe" snap if present
Done today at 18:20 GMT today at 18:20 GMT Disconnect interfaces of snap "ohmygiraffe"
Done today at 18:20 GMT today at 18:20 GMT Save data of snap "ohmygiraffe" in automatic snapshot set #23
Done today at 18:20 GMT today at 18:20 GMT Remove aliases for snap "ohmygiraffe"
Done today at 18:20 GMT today at 18:20 GMT Make snap "ohmygiraffe" unavailable to the system
Done today at 18:20 GMT today at 18:20 GMT Remove security profile for snap "ohmygiraffe" (10)
Done today at 18:20 GMT today at 18:20 GMT Remove data for snap "ohmygiraffe" (7)
Done today at 18:20 GMT today at 18:20 GMT Remove snap "ohmygiraffe" (7) from the system
Done today at 18:20 GMT today at 18:20 GMT Remove data for snap "ohmygiraffe" (10)
Done today at 18:20 GMT today at 18:20 GMT Remove snap "ohmygiraffe" (10) from the system
Done today at 18:20 GMT today at 18:20 GMT Disconnect ohmygiraffe:desktop-legacy from snapd:desktop-legacy
Done today at 18:20 GMT today at 18:20 GMT Disconnect ohmygiraffe:gnome-3-34-1804 from gnome-3-34-1804:gnome-3-34-1804
Done today at 18:20 GMT today at 18:20 GMT Disconnect ohmygiraffe:sound-themes from gtk-common-themes:sound-themes
Done today at 18:20 GMT today at 18:20 GMT Disconnect ohmygiraffe:desktop from snapd:desktop
Done today at 18:20 GMT today at 18:20 GMT Disconnect ohmygiraffe:gsettings from snapd:gsettings
Done today at 18:20 GMT today at 18:20 GMT Disconnect ohmygiraffe:opengl from snapd:opengl
Done today at 18:20 GMT today at 18:20 GMT Disconnect ohmygiraffe:unity7 from snapd:unity7
Done today at 18:20 GMT today at 18:20 GMT Disconnect ohmygiraffe:wayland from snapd:wayland
Done today at 18:20 GMT today at 18:20 GMT Disconnect ohmygiraffe:x11 from snapd:x11
Done today at 18:20 GMT today at 18:20 GMT Disconnect ohmygiraffe:gtk-3-themes from gtk-common-themes:gtk-3-themes
Done today at 18:20 GMT today at 18:20 GMT Disconnect ohmygiraffe:icon-themes from gtk-common-themes:icon-themes
Done today at 18:20 GMT today at 18:20 GMT Disconnect ohmygiraffe:audio-playback from snapd:audio-playback
Manage warnings
Display warnings
As snapd
updates in the background, warnings may not be seen by the user. So with the following command, it’s possible to query any warnings which may have occured recently.
$ snap warnings
last-occurrence: 23 days ago, at 00:42 GMT
warning: |
snap "standard-notes" is currently in use. Its refresh will be postponed for up to 7 days to wait
for the snap to no longer be in use.
---
last-occurrence: 23 days ago, at 00:42 GMT
warning: |
snap "slack" is currently in use. Its refresh will be postponed for up to 7 days to wait for the
snap to no longer be in use.
In this case the two snaps listed were currently open. The snapd
update was held back so as not to disrupt the application while running.
Acknowledge warnings
The warnings triggered by snapd
are kept until acknowledged. Acknowledge them with the following command:
$ snap okay
The command produces no output. However, subsequently running snap warnings
yields a new message:
No further warnings.
Managing snapshots
List snapshots
Each snapshot is simply a root-owned zip file stored in /var/lib/snapd/snapshots
.
$ snap saved
Set Snap Age Version Rev Size Notes
21 emoj 94.2m v2.0.0 53 124B auto
22 ohmygiraffe 92.2m 1.1.0a x1 4176B -
23 ohmygiraffe 2m60s 1.1.0a 10 122B auto
Take snapshot
As well as automatic snapshots, the user can manually take a snapshot.
$ snap save ohmygiraffe
Set Snap Age Version Rev Size Notes
24 ohmygiraffe 104ms 1.1.0a 7 123B -
Restore snapshot
Use snap saved
to list snapshots, then use the ID number with snap restore
to unpack the datafiles for the snap back to disk.
$ snap restore 24
Restored snapshot #24.
Delete snapshot forever
Any snapshot can be removed manually. In addition, they’re automatically removed after 30 days, to recover space.
$ snap forget 24
Snapshot #24 forgotten.
Tweaks
Revisions kept
By default, snapd
will retain 3 copies of every installed snap. This is to enable automatic and manual rollback via snap rollback
. It’s possible to override this, and keep more old versions of an application, or fewer, down to the minimum, 2.
$ sudo snap set system refresh.retain=2
The more revisions that are kept, the more disk space is consumed, so some users choose to reduce this setting. It also contributes to a cluttered df
and mount
output (see below) as both the currently active, and previous revision of all snaps are mounted.
df
The output of df
can be cluttered with the loopback mounts used by snaps. These can be suppressed by excluding all squashfs
filetypes from the output.
$ df -x squashfs
Filesystem 1K-blocks Used Available Use% Mounted on
tmpfs 3275932 3620 3272312 1% /run
/dev/mapper/vgubuntu-root 958123168 432890148 476493284 48% /
tmpfs 16379656 771360 15608296 5% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 4096 0 4096 0% /sys/fs/cgroup
/dev/sda2 721392 228528 440400 35% /boot
/dev/sda1 523248 7984 515264 2% /boot/efi
tmpfs 3275928 1908 3274020 1% /run/user/1000
Add this as an alias to your shell configuration.
alias df="df -x squashfs"
Use the following to override the alias.
$ /bin/df
mount
The output of mount
can be cluttered with the loopback mounts used by snaps. These can be supproessed by excluding all squashfs
and cgroup
mounts. I often extend the list with others I don’t really care about.
$ mount -t nosquashfs,nocgroup,nsfs,tmpfs,fuse
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,noexec,relatime,size=16330552k,nr_inodes=4082638,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
/dev/mapper/vgubuntu-root on / type ext4 (rw,relatime,errors=remount-ro)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
efivarfs on /sys/firmware/efi/efivars type efivarfs (rw,nosuid,nodev,noexec,relatime)
none on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=28,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=34070)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,nosuid,nodev,noexec,relatime)
tracefs on /sys/kernel/tracing type tracefs (rw,nosuid,nodev,noexec,relatime)
/dev/mapper/vgubuntu-root on /snap/chrony/x7 type ext4 (ro,nodev,relatime,errors=remount-ro,x-gdu.hide)
fusectl on /sys/fs/fuse/connections type fusectl (rw,nosuid,nodev,noexec,relatime)
configfs on /sys/kernel/config type configfs (rw,nosuid,nodev,noexec,relatime)
/dev/sda2 on /boot type ext4 (rw,relatime)
/dev/sda1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
portal on /run/user/1000/doc type fuse.portal (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
Add this as an alias to your shell configuration.
alias mount="mount -t nosquashfs,nocgroup,nsfs,tmpfs,fuse"
Use the following to override the alias.
$ /bin/mount
Updates
Snaps update automatically in the background. Some don’t like this, and would prefer more control. Here’s the options to observe and control snap update behaviour.
Review upcoming updates
$ snap refresh --list
All snaps up to date.
or (for example)
Name Version Rev Publisher Notes
dosbox-x 0.83.9 687 snapcrafters -
hugo 0.79.1 9698 hugo-authors -
lbry 0.49.1 162 popey -
mindustry 121.4 1173 popey -
simplenote 2.3.0 448 snapcrafters -
starship 0.47.0 917 matankushner -
wire 3.21.2936 205 snapcrafters -
yakyak 1.5.11 96 snapcrafters -
Review upcoming change time
By default snap checks the store for updates 4 times a day. So if a publisher pushes a snap to a channel you’re subscribed to, you’ll get it within ~6 hours, assuming your computer is on, network connected and not on a metered connection (more on that below).
$ snap refresh --time
timer: 00:00~24:00/4
last: today at 18:24 GMT
next: tomorrow at 04:48 GMT
Check if updates are held
By default they’re not likely to be held, but if you choose to (see below) then this command is useful for checking the status. This is a global setting for all snaps, not specific to any one snap.
$ sudo snap get system refresh.hold
error: snap "core" has no "refresh.hold" configuration option
or (for example)
2021-01-21T17:30:01+00:00
Hold updates
This command prevents snapd
from checking the Snap Store for any updates to the system until the date and time specified. This example effectively pushes back all updates by 30 minutes. It doesn’t print any output on success, so use the sudo snap get system refresh.hold
command or snap refresh --time
to see what the result was.
$ sudo snap set system refresh.hold=$(date --iso-8601=seconds -d "30 minutes")
In this example we programmatically get the date and just add a day to it. Deferring updates by one day.
$ sudo snap set system refresh.hold="$(date --iso-8601=seconds --date=tomorrow)"
This is fun. Setup a cron job as the root
user which runs every day, pushing back the update window by 30 days.
0 12 * * * /usr/bin/snap set system refresh.hold="$(/usr/bin/date --iso-8601=seconds -d '+30 days')"
Note: snapd
is hard-wired to ignore this, and update after 95 days.
Set refresh time
As well as holding updates, it’s possible to define a specific time when updates should occur. This command forces updates to only happen between 4am and 7am.
$ sudo snap set system refresh.timer=4:00-7:00
Set metered connection
You may wish to suppress updates if you’re on a metered connection such as a MiFi or tethered to a cellphone with limited data allowance. Indeed, in some regions it may be desirable to rate-limit snapd on the default domestic wireless connection too due to cost or imposed data limits.
Modern desktop environments have options to configure networks to be ‘metered’. Consult the documentation for your desktop to configure that setting. The snap system can be configured to respect the metered option or not.
Tell snapd
not to refresh on metered connections
$ sudo snap set system refresh.metered=hold
To switch off this feature, use the command:
$ sudo snap set system refresh.metered=null
Conclusion
I hope this braindump is useful. There’s a lot of kinda random commands in this page. All of it is covered in more detail in the snapcraft documentation.
The source for this page is on GitHub, PRs and issues welcome, within reason.