Logo snap

Format Snap

Le format snap vise à permettre l'installation de nouvelles versions de logiciels dans les systèmes Linux, tout en apportant aux développeurs la facilité de distribution, la fiabilité et la sécurité.

Avec le format snap, pour recevoir des nouvelles versions de logiciels, les utilisateurs n'ont plus à mettre en jeu la stabilité de leur système par l'ajout de dépôt personnel (PPA). Ils peuvent récupérer un paquet .snap distribué par l'éditeur via le gestionnaire de paquets Snappy. L'application associée est alors exécutée de manière isolée, renforçant la stabilité et la sécurité du système. Le paquet .snap inclut l'application et peut contenir aussi ses dépendances ; en contrepartie d'un volume plus élevé, il permet de faire cohabiter plusieurs versions de mêmes dépendances au sein d'un même système Linux et en facilite la distribution en ligne et hors ligne.

Les paquets .snap ne remplacent pas les paquets .deb classiques : le cœur du système Ubuntu (noyau, environnements graphiques, logiciels de base) reste géré à partir des paquets issus de Debian. Les paquets .snap s'ajoutent à l'existant afin de fournir un mode de distribution sûr pour les logiciels tiers ou pour les versions non validées par le système (par exemple : pour la dernière version de votre logiciel préféré).

Un snap combine un système de fichiers compressés SquashFS contenant le code de l'application associée et un fichier spécifique de métadonnées snap.yaml. Il est en lecture seule. Une fois installé, il dispose d'une zone accessible en écriture.

Un snap est autonome :

  • il inclut la plupart des bibliothèques et des outils dont il a besoin ;
  • il peut être mis à jour ou restauré sans affecter le reste du système.

De plus un snap est séparé du reste du système d'exploitation et des autres applications grâce à des mécanismes de sécurité. Il peut néanmoins échanger du contenu et fonctionner avec d'autres snaps suivant des règles précises contrôlées par l'utilisateur et les paramétrages généraux du système d'exploitation.

Les applications installées au format snap occupent habituellement plus d'espace disque que celles qui émanent des dépôts officiels. La commande suivante donne une idée de l'espace utilisé :
snap info <nom-du-programme>

Snap est pré-installé dans Ubuntu depuis la version 16.04 LTS au sein de la configuration bureau (« Desktop »)1)2), mais non au sein de la configuration serveur.

Vous pouvez l'installer avec la commande suivante :

sudo apt install snapd
Si votre serveur est un VPS hébergé sur un serveur hôte avec OpenVZ, Snap ne fonctionnera pas ou fonctionnera de manière dégradée. La commande suivante permet de connaitre la technologie de virtualisation sous-jacente :
systemd-detect-virt
# au besoin, faire précéder la commande de : sudo
# retour attendu dans le cas de OpenVZ : openvz

Désormais vous pouvez directement installer des applications snap en passant par la logithèque Ubuntu comme pour les autres applications.

Pré-requis

Il faut commencer par installer le paquet snapd sur votre système (normalement, il est pré-installé sur Ubuntu).

Il faut aussi penser à définir le nombre de versions qui seront conservées pour chaque logiciel livré en technique snap sous peine d'en retrouver un nombre important et de constater que la RAM consommée est volumineuse. La valeur par défaut est 3. Une valeur de deux se révèle suffisante.

sudo snap set system refresh.retain=2

D'autres astuces pratiques peuvent être consultées dans ce post.

Utilisation

Le service d’intégration de Snap dans la Logithèque Ubuntu est inclus dans les distributions récentes d'Ubuntu. Pour gérer les paquets au format Snap depuis la logithèque, il suffit de vous rendre sur la page officielle du Snap Store et de cliquer sur le bouton [ install ].

Voici les lignes de commandes équivalentes :

sudo snap install snap-store
sudo apt-get update

En ligne de commande

Vous pouvez aussi passer par un terminal pour installer une application snap :

sudo snap install nom_du_snap

Plus d'informations, dont la liste des options de la commande snap, sont disponibles en consultant le manuel (man snap).
Il peut être notamment intéressant d'utiliser l'option --classic qui évite le confinement… et permet par exemple d'imprimer vers des imprimantes disponibles3):

sudo snap install --classic nom_du_snap

Cas général

Mise à jour des applications :

sudo snap refresh

Mise à jour du magasin d'application snap-store

Lorsque le magasin d’application Snap Store doit être mis à jour, l'opération snap refresh ne fonctionne pas.

L'utilisateur est généralement alerté par un message « mise à jour du snap "snap-store" en attente » à l’ouverture de sa session.

En effet, la commande snap refresh ne permet pas de mettre à jour le magasin d'application qui reste actif tout au long de l'opération. Il est donc nécessaire de désactiver le magasin avant de lancer la mise à jour. Cela peut se faire en ligne de commande comme suit :

snap-store --quit
snap refresh

Référence : Pending Update of Snap Store. Question publiée le 06/06/2022 sur le forum Ask Ubuntu et résolue.

Voici une liste non exhaustive de logiciels disponibles sous Snap :

La commande suivante affiche une liste de logiciels disponibles et suggérés au format Snap :

snap find

La commande suivante affiche la liste des logiciels installés au format Snap dans le système :

snap list

Supprimer un paquet

La suppression d’un paquet snap est commandée par :

snap remove mon_logiciel

Cela conserve le profil utilisateur (instantané ou « snapshot ») pendant 30 jours.

La suppression d’un paquet snap et de tous les profils utilisateur associés est commandée par :

snap remove --purge mon_logiciel

La suppression d’une version d’un paquet snap, identifiée par son numéro de révision, est commandée par :

snap remove --purge mon_logiciel --revision=numéro_révision
La version et le numéro de révision peuvent être retrouvés par la commande snap list ou snap info mon_logiciel.

Les instantanés – les derniers profils conservés quand on supprime un snap – sont affichés par :

snap saved

Ils peuvent être supprimés individuellement en indiquant le numéro d’instantané (ou numéro de « snapshot ») visé :

snap forget numéro_snapshot

Faire du ménage de manière radicale

Référence : How to remove old version of installed snaps. Question publiée le 04/04/2018 sur le forum SuperUser et résolue.

Attention : la commande indiquée supprime immédiatement tous les paquets snap désactivés.

Évaluer la place occupée par les snap

Espace disque occupé par chaque paquet snap installé :

sudo du -csh /snap/* | sort -rh
# affichage trié ici par ordre décroissant sur le volume d’espace disque occupé

Espace disque occupé par chaque version installée d’un paquet snap donné :

sudo du -csh /snap/nom_du_snap/* | sort -rh

Vérifier la liste des snap qui seront supprimés

Afficher les paquets snap installés, actifs ou non :

snap list --all

Repérer les lignes avec la note désactivé (ou, sur un système en anglais : disabled). Par la suite, adapter les commandes par le terme approprié.

Veillez à conserver au moins une version de paquet snap à l’état non désactivé. En effet la commande proposée par la suite supprimera sans distinction tous les paquets snap indiqués en argument.

Afficher la liste des paquets qui seront supprimés :

LANG=C snap list --all | awk '/disabled/{print}'
# la spécification ici de la variable LANG permet un filtre sur le terme anglais "disabled"

Suppression proprement dite

Si la liste vous convient, vous pouvez saisir la commande suivante :

LANG=C snap list --all | awk '/disabled/{print $1, $3}' | while read snapname revision ; do echo $snapname $revision ; sudo snap remove --purge "$snapname" --revision="$revision" ; done

ou, en version sur plusieurs lignes :

LANG=C snap list --all |\
  awk '/disabled/{print $1, $3}' |\
  while read snapname revision
  do
    echo $snapname $revision
    sudo snap remove --purge "$snapname" --revision="$revision"
  done

Vous pourrez constater le gain de place avec les commandes suivantes :

# espace disque global :
df -h
# espace disque par paquet snap :
sudo du -csh /snap/* | sort -rh

Supprimer et bloquer les paquets snap

Vous ne souhaitez plus utiliser les paquets snap pour diverses raisons ? C'est possible.

Rappel : évaluez l’existence d’une version en paquet Debian pour les applications dont vous voudriez une alternative.

Références :

Les commandes et le script shell mentionnés dans cette section sont identiques à ceux de la section Suppression supra.

L'application ne fait pas nécessairement un ménage parfait. Il faut s'assurer que des paquets désactivés n'ont pas été conservés :

LANG=C snap list --all | grep "disabled"

Pour chaque ligne trouvée, il faut supprimer le paquet devenu inutile avec la commande :

snap remove nom_logiciel --revision=9999

en renseignant le numéro de révision (exemple ici : 9999) par la bonne valeur qui a été obtenue.
Il est possible d'automatiser ce travail via ce petit script4) :

bin/supprime-snap-désactivé.sh
#!/bin/sh

LANG=C snap list --all | awk '/disabled/{print $1, $3}' |
    while read snapname revision ; do
        snap remove "$snapname" --revision="$revision"
    done

Comme indiqué ci-dessus, la commande flatpak équivalente est la suivante :

   flatpak list

Un système d’exploitation présente une arborescence de dossiers et fichiers organisés par défaut. En l’occurrence les fichiers de configuration sont habituellement trouvés dans le dossier /etc, les journaux (« log files ») dans le dossier /var/log.

Les emplacements de ces dossiers et fichiers de référence pour une application installée via Snap sont différents de l’usage du système hôte.

Comme David Clinton l’explique dans son article (en anglais) sur FreeCodeCamp.org5), les répertoires suivants sont à considérer lors du déploiement de logiciel à partir de paquet snap :

  • /snap/ : dossiers virtuels, en lecture seule, des applications snap en exécution (fichiers snap « montés ») ;
  • /var/snap/ : données et fichiers de configuration associés aux applications snap en exécution ;
  • /var/lib/snapd/ : base du démon Snap et entrepôt des fichiers snap récupérés ;
  • /home/$USER/snap/ : données et fichiers de configuration de la session utilisateur $USER.

Scénario : je souhaite modifier les modèles de Gimp.

  • La documentation indique que le fichier concerné, templaterc, est normalement situé dans le répertoire /etc/gimp/2.10/ ou /home/$USER/gimp/….
  • Dans le cas d’une installation de Gimp par Snap, le fichier associé à ma session utilisateur $USER sera disponible dans /home/$USER/snap/gimp/105/.config/GIMP/2.10 (ici, 105 correspond au numéro de révision de la version active de Gimp dans le système utilisé).

Dans le cas de l’installation standard d'une application snap, l'accès est restreint aux répertoires et fichiers de l'utilisateur, stockés dans le dossier de ce dernier. L'accès par les liens symboliques qui pointent à l'extérieur des répertoires de l'utilisateur est refusé. Cela correspond à la notion de confinement.

Approches en mode avancé

  • Technique en mode « bind »6) : elle repose sur le montage des dossiers ciblés par lien physique (option –bind de la commande mount). Dans le cas particulier des dossiers racine des utilisateurs, une montée de version de Snapd est préconisée, avec une configuration spécifique du chemin des dossiers utilisateur à l’issue de la mise à niveau :
# mise à jour de Snapd
snap refresh --channel=latest/edge snapd
# déclaration pour Snap d’un chemin personnalisé des dossiers racine utilisateur (ici : /local/home à la place de /home)
snap set system homedirs=/local/home/
  • Technique en mode « développement »7) : elle consiste en l’installation d’un paquet snap avec l’option spécifique –devmode. Cette option est normalement réservée à une étape de développement (avant mise en production). Elle réduit le confinement et étend l’accès du programme snap aux ressources du système :
snap install --devmode mon_logiciel
  • Montage des partitions sur des points accessibles à un logiciel en snap : $HOME/, /media/, /mnt/ ou /run/media/. La documentation officielle de Snapcraft peut aussi être consultée en matière de gestion des interfaces8).

Extension du confinement

Les applications snap permettent malgré tout d'utiliser normalement deux autres répertoires : /mnt et /media. Les sous-répertoires peuvent être quelconques. Ils doivent être accessibles par les applications standard de l'utilisateur.

Cette utilisation est laissée à la discrétion de chaque application. Elle est valable pour l’ensemble des utilisateurs définis et futurs. Les règles de base sont les suivantes :

  • accès non prévu par l'application ;
  • accès prévu systématiquement par l'application ;
  • accès demandé au moment de l'installation de l'application ;
  • accès à activer après l'installation.

Pour savoir si une application « mon_application » peut utiliser ces répertoires, saisir la commande suivante :

snap connections mon_application | grep removable

La ligne de retour affichera l'état :

removable-media           mon_application:removable-media  :removable-media                  -

Ce retour indique que la fonctionnalité est prévue mais qu'elle n'est pas activée.

Pour activer la fonctionnalité, il est nécessaire de connaitre un mot de passe administrateur. L’appartenance au groupe sudo n’est pas requise. Voici la commande à saisir :

snap connect mon_application:removable-media :removable-media

Une nouvelle extraction de l'état (cf. commande supra) rapportera une réponse sans équivoque :

removable-media           mon_application:removable-media  :removable-media                  manual
Le connecteur cups-control permet de gérer l'imprimante.

1)
Ubuntu Desktop To Eventually Switch To Snap Packages By Default. Article publié le 03/04/2015 sur Web Upd8.
2)
Why is Ubuntu moving to Snap packages? Sujet publié le 05/05/2015 sur le forum AskUbuntu. Évocations de l’intérêt de l’approche Snap en coexistence avec les paquets Debian.
3)
Pas d'imprimante dans Gimp. Question publiée le 05/09/2018 sur le forum Kubuntu francophone et résolue.
4)
How to remove disabled (unused) snap packages with a single line of command? Question publiée le 15/05/2018 sur le forum AskUbuntu et résolue.
5)
How to manage Ubuntu Snaps: the stuff no one tells you. Article de David Clinton publié le 19/08/2019 sur FreeCodeCamp.org (archive).
6)
How to use Snap Packages when $HOME is not /home/$USER? Question posée le 25/05/2018 sur le forum AskUbuntu et résolue.
7)
Snap confinement. Documentation officielle de Canonical Snapcraft. Dernière mise à jour : juillet 2023.
8)
Interface management. Documentation officielle de Canonical Snapcraft. Dernière mise à jour : janvier 2024.
  • snap.txt
  • Dernière modification: Le 26/02/2024, 18:19
  • par lyondif02