ubuntuusers.de

snap

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

Snap ist ein Paketformat, das maßgeblich von Canonical entwickelt und konfliktfrei neben DEB-Paketen aus "normalen" Paketverwaltung installiert und genutzt werden kann. snap ist auch für viele andere Linux-Distributionen 🇬🇧 verfügbar.

Ursprünglich waren snaps vor allem für den Einsatz im Server- bzw. Cloud-Umfeld und auch für das Internet of Things gedacht. Inzwischen ist es aber auch in den Desktop-Versionen zu finden und über snaps lassen sich auch Programme mit grafischer Benutzeroberfläche, Anwendungen für die Kommanozeile, Umgebungen für Programmiersprachen etc. installieren. Der Vorteil von snaps ist, dass aktuelle Versionen von Anwendungssoftware installierbar sind, auch wenn die Linux-Distribution - wie Ubuntu und dessen offiziellen Derivate - eine "fixed release distribution" ist, d.h. bei bei Paket aus den offiziellen Paketquellen gibt es normalerweise keine Versionssprünge.

snaps können aus dem zentralen Snap-Server 🇬🇧 bezogen werden, welcher von Canonical betrieben wird. Alternative Server gibt es zur Zeit nicht. Die Installation von lokal heruntergeladenen snaps ist aber auch möglich.

Technik und Sicherheit

Die Grundlage, auf der alle snaps laufen, heißt einfach "core". Dies ist die Laufzeitumgebung für snaps, welche ebenfalls als snap installiert ist. Dadurch ist die Laufzeitumgebung für alle Ubuntu-Versionen gleich, da sie unabhängig vom darunter liegenden System und den Paketquellen ist.

Um die Verwaltung etc. der snaps kümmert sich der im Hintergrund laufende Dienst Namens "snapd". Die Installation und Verwaltung von snaps erfolgt über den Kommandozeilenbefehl snap. snaps können alternativ auch über Gnome-Software bzw. ab Ubuntu 20.04 über den "snap-store" installiert werden.

Aufbau, Ausführung, Speicherbedarf

Technisch gesehen sind snaps ein Image auf Basis des Dateisystems SquashFS. Gespeichert sind alle snaps unter /var/lib/snapd/snaps/NameDesSnaps_Versionsnummer.snap. Beim Systemstart wird die jeweils aktuelle Version des snaps eingehängt, der Einhängepunkt ist das snap-Verzeichnis 🇬🇧 mit der Struktur /snap/NameDesSnaps/Versionsnummer. Wird das im snap-Paket enthaltene Programm aufgerufen, werden transparent zur Laufzeit die Daten aus dem snap entpackt und ausgeführt. Dadurch kann es vorkommen, dass manche snaps langsamer starten als über die Paketverwaltung installierte Programme, welche unkomprimiert gespeichert sind.

Da alle snaps auf der minimalen Laufzeitumgebung core laufen, bringen snap-Pakete alle Abhängigkeiten (Dateien, Bibliotheken etc.), die sie benötigen, innerhalb des snap-Pakets mit. Eine Ausnahme sind Bibliotheken von Desktopumgebungen wie z.B. Gnome. Diese sind als separates snap verfügbar, welches von anderen snaps genutzt werden kann.

snap-Pakete können, müssen aber nicht größer sein als entsprechende DEB-Pakete. Hat man viele verschiedene snaps installiert oder von einem snap mehrere Versionen, so kann es vorkommen, dass mehrere Gigabyte Daten im Verzeichnis /var/lib/snapd/snaps zusammenkommen.

snaps sind immer komprimiert und werden nie dekomprimiert auf die Festplatte geschrieben oder entpackt im Speicher gehalten. Der Befehl

du -hs /snap/NameDesSnaps   #für ein bestimmtes snap
#bzw.
du -hs /snap/*              #für alle snaps 

ist von daher irreführend, da so angezeigt wird, wie viel Speicherplatz das snap NameDesSnaps unkomprimiert belegen würde - aber die Daten liegen nirgends unkomprimiert. Den tatsächlichen Platz, der auf der Festplatte pro snap belegt ist, kann man mittels

df -h /snap/NameDesSnaps/Versionsnummer    #für ein bestimmtes snap
#bzw.
df -h /dev/loop*                           #für alle snaps 

anzeigen lassen.

Im Gegensatz zu Programmen, die aus der normalen Paketverwaltung installiert werden, können bei snaps mehrere Versionen des selben Programms installiert sein. So ist es auch möglich, ältere Versionen eines Programms oder auch Beta- oder Entwicklerversionen zu nutzen. Letztere aber nur, wenn die Entwickler die Beta- oder Entwicklerversion auf https://snapcraft.io 🇬🇧 zur Verfügung stellen. snaps aktualisieren sich im Hintergrund automatisch, dabei wird bei Ubuntu Desktop und Server die ältere Version nach der Aktualisierung behalten.

Confinements: Abschottung von snaps

snaps sind untereinander und gegen das System grundsätzlich abgeschottet. Die snaps laufen in einem "Confinement" (deutsch: Einsperrung, Haft; sinngemäß übersetzt: eingeschränkter Raum). Zur Abschottung der snaps wird primär auf AppArmor gesetzt. Der Zugriff von einem snap auf das andere (z.B. damit snap A eine Bibliothek von snap B nutzt) ist ebenfalls grundsätzlich unterbunden - kann aber bei Notwendigkeit gegebenenfalls manuell hergestellt werden.

snaps kennen drei verschiedene Confinements:

  • strict: Der strikte Modus ist die Voreinstellung für alle snaps. Es gelten alle oben genannten Einschränkungen. Dem snap können aber über die vorhandenen Schnittstellen gezielt Rechte eingeräumt werden.

  • classic: Im klassischen Modus verhält sich das snap wie ein aus den Paketquellen installiertes Programm, d.h. das via snap ausgeführte Programm darf alles, was die Rechte des Nutzers, der das snap ausführt, zulassen. Wenn ein snap im classic-Modus installiert werden muss, muss der Entwickler dies explizit deklarieren, wenn er das snap nach snapcraft.io hoch lädt. snaps, die den classic-Modus benötigten, bekommen einen zusätzlich, manuellen Review-Prozess, bevor diese bei snapcraft.io veröffentlicht werden.

  • devmode: Der devmod (devmod: Kurzform für "developer mode", deutsch "Entwickler-Modus") ist primär für Entwickler zum Testen und Debuggen von snaps gedacht. Normale snaps aus dem stable-Kanal lassen sich sowieso nicht im devmod installieren. Der Devmod ist nur für snaps aus dem Beta oder Development Kanal möglich.

Detailliertere Erklärungen findet man im Blogartikel Demystifying snap Confinement 🇬🇧.

Schnittstellen: Interfaces, Slots und Plugs

snaps können über "Interfaces" (auf Deutsch: Schnittstellen) mit Hilfe von "slots" (auf Deutsch: Steckplätze) und "plugs" (deutsch: Stecker) gezielt mit Rechten (wie z.B. dem Zugriff auf das /home Verzeichnis) ausgestattet werden.

Es gibt eine ganze Reihe von Standardschnittstellen 🇬🇧, welche snaps zur Verfügung stehen. Normalerweise legt der Ersteller eines snap-Pakets fest, welche Schnittstellen benötigt und vom snap genutzt werden. Die Berechtigungen können aber auch manuell abgefragt und geändert werden - was aber in der Regel nicht nötig ist.

#der Anker wird weiter oben im Artikel benötigt! Des Weiteren können snaps ihrerseits Slots bereit stellen, mit denen sich Plugs anderer snaps verbinden können. Beispiele dafür sind z.B. das snap gnome-3-28-1804 oder auch gtk-3-themes. Diese snaps stellen Schnittstellen bereit, die Programmen für den Gnome-Desktop Zugriff auf die notwendigen Bibliotheken und Themes geben, so dass nicht jedes snap die komplette Desktop Umgebung mitbringen muss. Es gibt auch ein kde-frameworks snap, welches die Schnittstellen für KDE-basierte Programme bereit stellt.

snap Tracks und Channels

snaps kennen weiterhin das Konzept von "Tracks" und "Channels. Ein Track ist dabei eine Art Zweig des Programms. Der Standardtrack ist dabei immer "latest" (deutsch: neuste), diesen gibt es für jedes snap. Ob es noch weitere Tracks gibt, hängt vom Entwickler ab, der die snaps packt. Beim Firefox snap von Mozilla gibt es beispielsweise noch den "esr" Track des Browsers, mit dem der Extended Support Release 🇬🇧 statt der aktuellen Version installiert wird.

Innerhalb eines Tracks gibt es noch verschiedene Channels (auf deutsch: Kanäle). Diese sind:

  • stable: enthält die aktuelle, stabile Version des Programms

  • candidate: enthält den Release Candidate, der die nächste, stabile Version des Programms werden soll

  • beta: enthält die Beta-Version des Programms

  • edge: enthält die neueste, ggf. instabile Entwicklungsversion des Programms.

Den stable-Channel gibt es für jedes snap. Ob in einem oder mehreren der anderen Kanäle eine andere Version des Programms bereit steht, hängt vom Entwickler bzw. dem Bereitsteller des snaps an.

Per Voreinstellung wird bei der Installation eines snaps immer die "latest/stable" Version eines snaps installiert, also die aktuelle, stabile Version.

snapcraft.io

snapcraft.io ist der zentrale, von Canonical betriebene Server, von dem snaps installiert werden. Grundsätzlich kann jeder snaps bauen und, nach einer Registrierung bei snapcraft.io, dort hochladen und zur Verfügung stellen. Vor der Veröffentlichung eines snaps erfolgt eine automatisierte Prüfung des snaps, Details dazu sind jedoch nicht bekannt. D.h. wenn man ein snap installiert, vertraut man auch darauf, dass der Bereitsteller des snaps keine Schadsoftware u.ä. eingebaut hat. Vom Prinzip her ist es also dasselbe Vertrauen, dass man auch beim Installieren von Fremdpaketen, Fremdsoftware in Form von Binaries, Installation von Software aus anderen Quelle (wie z.B. PyPi 🇬🇧, NPM 🇬🇧), Einbinden von Fremdquellen etc. hat. Durch die Sicherheitsmechanismen von snaps ist es allerdings schwieriger bis unmöglich, dass snaps das System korrumpieren oder unbrauchbar machen - zumindest dann, wenn sie im strict-Confinement installiert werden.

Bei snapcraft.io sind einige snaps als besonders vertrauenswürdig gekennzeichnet. Nämlich dann, wenn die snaps direkt von einem verifizierten Upstreamentwickler selber bereitgestellt werden. Dazu gehören z.B. Mozilla mit dem Firefox, snaps von Microsoft, das VLC snap, das Inkscape snap, snaps und die von Canonical bereitgestellt werden (wie z.B. Chromium). Verifizierte Upstreamentwickler erkennt man daran, dass bei der Ausgabe von snap info NameDesSnaps in der Zeile "Publisher" ein grünes Häkchen am Ende der Zeile ist. Dieses grüne Häkchen ist auch rechts neben dem Entwicklernamen zu sehen, wenn man die Seite des snaps auf https://snapcraft.io/NameDesSnaps aufruft.

Installation

Seit Ubuntu 16.04 sind die für snap benötigten Pakete bereits vorinstalliert. Ansonsten können diese aber auch nachträglich installiert werden[1]:

  • snapd

Paketliste zum Kopieren:

sudo apt-get install snapd 

Oder mit apturl installieren, Link: apt://snapd

Benutzung

Der zentrale Kommandozeilenbefehl[2] ist snap, die allgemeine Syntax lautet[3]:

snap BEFEHL [OPTIONEN] 

Je nach Befehl werden zusätzlich Root-Rechte[3] benötigt (z.B. zur Installation und Deinstallation von snaps).

snaps suchen

Mit dem Befehl

snap find SUCHBEGRIFF 

werden alle auf snapcraft.io enthaltenen snaps, auf die der Suchbegriff SUCHBEGRIFF passt, angezeigt. Der Suchbegriff muss aus mindestens einem Buchstaben bestehen, dass Suchen z.B. mit nur * ist nicht möglich.

Mit dem Befehl snap find ist es leider nicht möglich, sich alle verfügbaren snaps anzeigen zu lassen. Dies ist aber z.B. online über die Webseite snapcraft.io 🇬🇧 möglich.

Informationen zu einem snap anzeigen

Mit dem Befehl

snap info NamesDesSnaps 

werden detaillierte Information zum snap NameDesSnaps angezeigt. Hier ist auch auflistet, welche Versionen des Programms in den Tracks und Channels des snaps verfügbar sind.

snaps installieren

Das Installieren von snaps erfolgt mit einem Befehl:

sudo snap install NamesDesSnaps 

So würde NameDesSnaps installiert, per Voreinstellung die Version aus latest/stable

snaps aus anderen Tracks und Channels installieren

Um eine andere Programmversion zu installieren - sofern der Entwickler diese per snap zur Verfügung stellt - muss bei der Installation zusätzlich der Channel und ggf. der Track angegeben werden.

Die allgemeine Syntax lautet:

sudo snap install NameDesSnaps --track/channel 

Erfolgt keine Angabe des Tracks, wird automatisch latest benutzt.

Beispiele:

sudo snap install vlc --beta 

würde die Beta-Version von VLC aus dem latest-Track installieren.

Der Befehl

sudo snap install firefox --channel=esr/candidate 

würde den Release Candidate der ESR-Version des Firefox installieren.

snaps manuell installieren

Die Installation von lokal heruntergeladenen snaps funktioniert genauso, allerdings ist hier zwingend die Option --dangerous erforderlich sofern vorher keine passende Signatur installiert wurde. Selbstverständlich sollte man dies nur tun, wenn man dem Ursprung der .snap-Datei vertraut. Um ein manuell heruntergeladenes snap zu installieren, wechselt man ins Verzeichnis, in dem die Datei liegt, und führt den Befehl

sudo snap install NAME_DER_SNAPDATEI.snap --dangerous 

aus.

snaps aktualisieren

Der Befehl refresh aktualisiert alle snaps:

sudo snap refresh 

Man kann auch gezielt einzelne snaps aktualisieren. So würde

sudo snap refresh NameDesSnaps 

nur den snap NameDesSnaps aktualisieren. Dies funktioniert allerdings nur mit snaps, die von snapcraft.io installiert wurden. Eine regelmäßige Prüfung auf Aktualisierungen erfolgt auch regelmäßig im Hintergrund. Der Aufruf von

snap refresh --time 

gibt aus, wann zuletzt automatisch nach Aktualisierungen gesucht wurde und für wann die nächste Suche terminiert ist. Zeitpunkt und Häufigkeit für die Suche können eingestellt werden, siehe offizielle Dokumentation 🇬🇧.

Installierte snaps anzeigen

Der Befehl

snap list 

listet die installierten snaps auf. Dabei werden standardmäßig Name, Version, Revision, Track/Channel, Entwickler, und Notizen des snaps angezeigt.

Anzahl der installierten Versionen begrenzen

Bei der Installation einer neueren Version eines snap-Pakets werden, wie oben erwähnt, nicht alle alten Versionen automatisch entfernt. Standardmäßig wird bei den Desktop Versionen von Ubuntu und Ubuntu Server die vorherige aktuelle Version behalten. Dies lässt sich auch nicht reduzieren, d.h. es ist nicht möglich, nur die aktuelle Version des snaps zu haben. Bei Ubuntu Core 🇬🇧 werden drei Versionen des snaps behalten.

Man kann aber die Anzahl der älteren Versionen, die behalten werden sollen, aber erhöhen.

Die aktuelle Einstellung kann über den Befehl

sudo snap get system refresh.retain 

abgefragt werden. Gibt dieser Befehl einen Fehler aus, so wurde der Wert noch nicht angelegt und der Default von 2 (eine nicht verwendete Version) wird verwendet.

Eine Änderung des Werts erfolgt über folgenden Befehl

sudo snap set system refresh.retain=3 

Damit würde die Anzahl der Versionen auf 3 geändert (aktuelle und zwei nicht verwendete). Ändert man den Wert von einem höheren auf einen niedrigeren, also z.B. wieder von 3 auf 2, wird dann die beiden ältesten Version nicht direkt automatisch entfernt. Dies geschieht erst bei der nächsten automatischen Aktualisierung.

snaps deinstallieren

Zur Deinstallation dient der Befehl remove. mit

sudo snap remove NameDesSnaps 

würde der snap NameDesSnaps entfernt.

Um gezielt ältere installierte Versionen eines snaps zu deinstallieren muss dessen Revision mit angegeben werden. Der Befehl snap list zeigt nur die neueste (aktuell genutzte) Revision an, alle installierten Revisionen bekommt man über den Befehl:

snap list --all 

Eine Beispielausgabe kann so aussehen:

snap list --all
Name                  Version    Rev   Tracking  Developer  Notes
core                  16-2.32.5  4486  stable    canonical  core,disabled
core                  16-2.32.8  4650  stable    canonical  core
gnome-calculator      3.26.0     154   stable/…  canonical  disabled
gnome-calculator      3.28.1     167   stable/…  canonical  -

Hier sind zwei Revisionen von core und zwei Revisionen des gnome-calculator installiert. Die ältere gnome-calculator Revision würde über den Befehl

snap remove --revision 154 gnome-calculator 

entfernt.

Zu älterer Version zurückkehren

Funktioniert eine neuere Version eines snaps nicht wie gewünscht oder hat Fehler, kann man zu einer älteren Version zurückkehren. Das funktioniert aber nur, wenn diese noch lokal installiert ist. Es ist nicht möglich, eine ältere Version von snapcraft.io zu installieren.

Der Befehl

snap revert NameDesSnaps 

würde das snap SNAPNAME auf die vorherige Version zurücksetzen. Als Ausgabe erhält man dann z.B.

NameDesSnaps reverted to 1.9.4

Verlauf anzeigen

Der Befehl

snap changes 

zeigt den Verlauf der Installationen, Deinstallationen etc. von snaps ein. Im Folgenden ist eine Beispielausgabe gezeigt:

ID   Status  Spawn                 Ready                 Summary
103  Done    2018-03-17T17:53:47Z  2018-03-17T17:53:47Z  Refresh all snaps: no updates
104  Done    2018-03-18T09:49:58Z  2018-03-18T09:49:58Z  Refresh all snaps: no updates
105  Done    2018-03-18T10:35:08Z  2018-03-18T10:35:08Z  Revert "go" snap
106  Done    2018-03-18T10:36:29Z  2018-03-18T10:36:29Z  Revert "go" snap
107  Done    2018-03-18T10:37:01Z  2018-03-18T10:37:02Z  Refresh "go" snap
108  Done    2018-03-18T10:56:17Z  2018-03-18T10:56:18Z  Remove "go" snap
109  Done    2018-03-18T10:57:46Z  2018-03-18T10:57:47Z  Remove "core" snap
110  Done    2018-03-18T11:01:07Z  2018-03-18T11:01:07Z  Refresh all snaps: no updates

Automatisches Starten von snaps verhindern / aktivieren

Hat man via snap eine Serveranwendung installiert (wie z.B. einen Datenbankserver), dann startet dieser beim Systemstart automatisch, sofern der Entwickler des snaps dies so konfiguiert hat. Der Start erfolgt über eine systemd Unit. Eine Übersicht über die laufenden Units von snaps liefert der Befehl

systemctl list-units snap.* 

Den automatischen Start eines solchen snaps kann man mit dem Befehl

sudo snap disable NamesDesSnaps 

deaktivieren. Zum Aktivieren nutzt man den Befehl mit enable.

Berechtigungen veralten

Achtung!

Fehlende Berechtigungen können die Funktionsweise eines snaps einschränken oder es gänzlich unbrauchbar machen. Bei der Installation erteilte Rechte sollten deshalb nicht entzogen werden.

Wie im Abschnitt Technik und Sicherheit bereits erwähnt, kennt snap das Konzept von Slots und Plugs. Um sich alle verfügbaren Schnittstellen anzeigen zu lassen, nutzt man den Befehl:

snap interfaces 

Um zu sehen, welche Plugs welches snaps bereits mit welchem Slot verbunden sind, dient der Befehl

sudo snap connections 

Ist dem Namen des Slots ein Doppelpunkt : vorangestellt, ist dies ein Slot, der von core, also der Laufzeitumgebung für snaps, bereitgestellt wird. Ansonsten ist die Namesnstruktur NameDesSnaps:NameDesSlots, also z.B. gtk-common-themes:icon-themes.

Normalerweise werden die notwendigen Verbindungen von Slots und Plugs automatisch hergestellt. Sollte dies nicht der Fall sein, kann man dies manuell erledigen:

sudo snap connect MAME_DES_SNAP slot:plug 

Zu beachten ist, dass man nicht die Plugs beliebiger snaps mit jedem Slot verbinden kann, diese muss in der Konfigurationsdatei des snaps explizit erlaubt sein. Die Konfigurationsdatei findet man unter /snap/NAME_DES_SNAPS/current/meta/snap.yaml, die erlaubten Plugs findet man im Abschnitt apps:plugs:

Um die Verbindung wieder zu lösen, dient der Befehl:

sudo snap disconnect NAME_DES_SNAP slot:plug 

Eine ausführlichere Einführung und Erklärung ist in der Dokumentation in der Sektion Interface Management 🇬🇧 zu finden.

Weitere Befehle

snap kennt eine ganze Reihe weiterer Befehl. Eine Übersicht über alle Befehl bekommt man mit

snap --help 

Hilfe zu einem Befehl bekommt man mit

snap BEFEHL --help 

Programme starten

Programme, die via snap installiert wurden, lassen sich normalerweise wie alle anderen Programme auch starten. Unter Ubuntu sind Anwendungsprogramme auch in der Anwendnungsansicht enthalten.

Sollte dies nicht der Fall sein - was z.B. bei snaps passieren kann, die manuell lokal und nicht über den zentralen Snap-Store installiert wurden - dann kann man auch ins Verzeichnis /snap/bin/ wechseln und das Programm dann von dort manuell starten.

Eigene snaps erstellen

Es ist auch möglich, eigene snaps zu erstellen. Dazu dient das Programm snapcraft 🇬🇧.

snapd deaktivieren

Möchte man den snapd-Dienst nicht ganz deinstallieren sondern nur deaktivieren, müssen folgende systemd/Units mit dem Werkzeug systemctl abgestellt werden:

sudo systemctl disable snapd.service
sudo systemctl disable snapd.socket
sudo systemctl disable snapd.seeded.service 

Nach einem Neustart werden die Änderungen übernommen und bei Bedarf kann man den Dienst dann immer noch manuell starten:

sudo systemctl start snapd.service 

Um das Deaktivieren rückgängig zu machen, muss in den oben genannten drei Befehlen das disable durch enable ersetzt werden.

snapd deinstallieren inklusive aller installierten snaps

Möchte man snap inkl. aller installierten snaps deinstallieren, nutzt man den Befehl:

sudo apt purge snapd 

Im Gegensatz zu sudo apt remove snapd werden mit obigem Befehl auch alle installierten snaps inkl. aller Revisionen deinstalliert. Zusätzlich muss man noch die Dateien löschen, die im Homeverzeichnis gespeichert sind. Dazu muss man im eigenen Homeverzeichnis den Ordner snap inkl. aller darin befindlichen Unterverzeichnisse löschen.

Probleme und Lösung

Konfigurationsdaten zwischen Programmen aus den Quellen und snaps übernehmen

Hat man ein Programm zuerst aus den Paketquellen installiert und wechselt dann auf eine Version des Programms als snap (oder umgekehrt), dann werden Konfigurationseinstellungen des Programms (wie z.B. Profile von Firefox oder Thunderbird) nicht übernommen. Dies liegt daran, dass snaps und Paketverwaltung und darüber installierte Dateien unabhängig voneinander sind. Die benutzerspezifischen Konfigurationsdateien von snaps liegen unterhalb des Verzeichnisses /home/BENUTZERNAME/snap, die von via Paketverwaltung installierten Programmen normalerweise unterhalb von /home/BENUTZERNAME/.local.

Diese Revision wurde am 16. September 2020 16:40 von noisefloor erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: System, Paketverwaltung, Ubuntu