# Snap (gestionnaire de paquets)

Snap est un système d'empaquetage et de déploiement de logiciels développé par Canonical pour les systèmes d'exploitation utilisant le noyau Linux. Les paquets, appelés snaps, et l'outil pour les utiliser, snapd, fonctionnent sur une gamme de distributions Linux et permettent aux développeurs de logiciels de distribuer leurs applications directement aux utilisateurs. Les snaps sont des applications autonomes qui s'exécutent dans un bac à sable avec un accès modéré au système hôte. Snap a été initialement publié pour les applications cloud, mais a ensuite été porté afin de fonctionner pour les périphériques Internet des objets ainsi que les applications de bureau$^,$$^,$$^,$$^,$.

## Fonctionnalités
### Snap Store

Le Snap Store permet aux développeurs de publier leurs applications directement auprès des utilisateurs. Avec les approches traditionnelles de gestion des packages Linux comme APT ou YUM, les applications sont empaquetées et distribuées dans le cadre du système d'exploitation. Cela crée un délai entre le développement de l'application et son déploiement pour les utilisateurs finaux$^,$. En revanche, les développeurs d'applications peuvent publier leurs applications dans le Snap Store et les transmettre directement aux utilisateurs sans aucune intervention des responsables de la distribution.
Toutes les applications téléchargées sur le Snap Store subissent des tests automatiques, y compris une analyse des logiciels malveillants. Cependant, les applications Snap ne reçoivent pas le même niveau de vérification que les logiciels dans les archives Ubuntu normales. Dans un cas, en mai 2018, deux applications du même développeur se sont avérées contenir un mineur de cryptomonnaie qui s'exécutait en arrière-plan pendant l'exécution de l'application. Lorsque ce problème a été détecté, Canonical a supprimé les applications du Snap Store et transféré la propriété des Snaps à un tiers de confiance qui a republié les Snaps sans la présence du mineur$^,$$^,$. Bien que le bac à sable Snap réduise l'impact d'une application malveillante, Canonical recommande aux utilisateurs d'installer uniquement des Snaps provenant d'éditeurs approuvés par l'utilisateur$^,$.
Étant donné que les packages du Snap Store sont gérés par les développeurs eux-mêmes, les responsables de la distribution ne peuvent pas garantir que les packages répondent aux normes de qualité et sont mis à jour en temps opportun. Dans un cas, Microsoft a laissé une version obsolète de Skype dans le magasin Snapcraft pendant plus d'un an.
Bien que le Snap Store de Canonical soit actuellement le seul magasin existant pour les snaps, Snap lui-même peut être utilisé sans magasin. Les packages Snap peuvent être obtenus à partir de n'importe quelle source, y compris le site Web d'un développeur. L'employé de Red Hat, Adam Williamson, et le chef de projet Linux Mint, Clément Lefebre, ont critiqué Canonical pour avoir gardé fermées certaines parties côté serveur du Snap Store, créant ainsi un conflit d'intérêts qui nuit à la neutralité de Snap, étant donné que Canonical développe Ubuntu.

### Paquets Linux universels

Les Snaps sont des paquets autonomes qui fonctionnent sur une gamme de distributions Linux . Ceci est différent des approches traditionnelles de gestion de packages Linux, qui nécessitent des packages spécifiquement adaptés pour chaque distribution Linux$^,$.
Le format de fichier snap est un système de fichiers compressé unique utilisant le format SquashFS avec l'extension .snap . Ce système de fichiers contient l'application, les bibliothèques dont elle dépend et les métadonnées déclaratives. Ces métadonnées sont interprétées par snapd pour configurer un bac à sable sécurisé adapté au fonctionnement de l'application. Après l'installation, le snap est monté par le système d'exploitation hôte et décompressé à la volée lorsque les fichiers sont utilisés$^,$. Bien que cela présente l'avantage que les snaps utilisent moins d'espace disque, cela signifie également que certaines applications volumineuses démarrent plus lentement.
Une différence significative entre Snap et d'autres formats d'empaquetage Linux universels, tels que Flatpak, est que Snap prend en charge toutes les classes d'applications Linux telles que les applications de bureau, les outils serveur, les applications IoT et même les services système tels que la pile de pilotes d'imprimante$^,$$^,$. Pour s'en assurer, Snap s'appuie sur systemd pour des fonctionnalités telles que l'exécution de services système activés par socket dans un Snap. Cela fait que Snap ne fonctionne bien que sur les distributions qui peuvent adopter ce système d'initialisation.

### Bac à sable configurable

Les applications dans un Snap s'exécutent dans un conteneur avec un accès limité au système hôte. À l'aide d'interfaces, les utilisateurs peuvent donner à une application un accès modéré à des fonctionnalités supplémentaires de l'hôte, telles que l'enregistrement audio, l'accès aux périphériques USB et l'enregistrement vidéo$^,$$^,$. Ces interfaces servent de médiateur pour les API Linux habituelles afin que les applications puissent fonctionner dans le bac à sable sans avoir besoin d'être réécrites. Les applications de bureau peuvent également utiliser les portails de bureau XDG, une API standardisée créée à l'origine par le projet Flatpak pour permettre aux applications de bureau en bac à sable d'accéder aux ressources de l'hôte$^,$. Ces portails offrent souvent une meilleure expérience utilisateur par rapport aux API Linux natives, car ils demandent à l'utilisateur l'autorisation d'accéder à des ressources telles qu'une webcam au moment où l'application les utilise. L'inconvénient est que les applications et les boîtes à outils doivent être réécrites afin d'utiliser ces nouvelles API.
Le bac à sable Snap prend également en charge le partage de données et de sockets Unix entre Snaps. Ceci est souvent utilisé pour partager des bibliothèques communes et des frameworks d'applications entre Snaps afin de réduire la taille des Snaps en évitant la duplication$^,$.
Le bac à sable Snap s'appuie fortement sur le module de sécurité AppArmor du noyau Linux. Étant donné qu'un seul module de sécurité Linux (LSM) « majeur » peut être actif en même temps, le bac à sable Snap est beaucoup moins sécurisé lorsqu'un autre LSM majeur est activé. Par conséquent, sur des distributions telles que Fedora qui activent SELinux par défaut, le bac à sable Snap est fortement dégradé. Bien que Canonical travaille avec de nombreux autres développeurs et entreprises pour permettre l'exécution simultanée de plusieurs LSM, cette solution n'est pas encore opérationnelle$^,$$^,$.
Le bac à sable Snap empêche les applications de bureau d'accéder aux thèmes du système d'exploitation hôte pour éviter les problèmes de compatibilité. Pour que les Snaps utilisent un thème, ils doivent également être emballés dans un Snap séparé. De nombreux thèmes populaires sont emballés par les développeurs de Snap mais certains thèmes ne sont pas encore pris en charge et les thèmes peu communs doivent être installés manuellement. Si un thème n'est pas disponible en tant que package Snap, les utilisateurs doivent choisir le meilleur thème correspondant disponible. Des travaux sont en cours pour permettre à des tiers de regrouper plus facilement des thèmes dans un Snap et d'installer automatiquement des thèmes système inhabituels.

### Mises à jour automatiques et atomiques

Plusieurs fois par jour, snapd vérifie les mises à jour disponibles de tous les Snaps et les installe en arrière-plan à l'aide d'une opération atomique. Les mises à jour peuvent être annulées$^,$ et utilisent l'encodage delta pour réduire leur taille de téléchargement$^,$$^,$.
Les éditeurs peuvent publier et mettre à jour plusieurs versions de leur logiciel en parallèle à l'aide de canaux (channels). Chaque canal a une piste (track) et un risque (risk) spécifiques, qui indiquent la version et la stabilité du logiciel publié sur ce canal. Lors de l'installation d'une application, Snap utilise par défaut le canal latest/stable, qui se mettra automatiquement à jour vers les nouvelles versions majeures du logiciel lorsqu'elles seront disponibles. Les éditeurs peuvent créer des canaux supplémentaires pour donner aux utilisateurs la possibilité de se fixer sur des versions majeures spécifiques de leur logiciel. Par exemple, un 2.0/stable permettrait aux utilisateurs de s'en tenir à la version 2.0 du logiciel et d'obtenir uniquement des mises à jour mineures sans risque de modifications rétrocompatibles. Lorsque l'éditeur publie une nouvelle version majeure dans un nouveau canal, les utilisateurs peuvent passer manuellement à la version suivante lorsqu'ils le souhaitent$^,$$^,$$^,$.
Bien que les mises à jour automatiques ne puissent pas être désactivées, il existe de nombreuses façons de configurer les mises à jour pour répondre à des besoins particuliers. L'utilisateur peut choisir de rester sur une version majeure spécifique du logiciel en spécifiant le canal, il peut configurer l'intervalle de mise à jour pour avoir le temps de vérifier manuellement les mises à jour, et il peut suspendre les mises à jour jusqu'à 60 jours. De plus, les mises à jour sont également automatiquement désactivées sur les connexions limitées$^,$. Même avec ces contrôles, un certain nombre d'utilisateurs se sont plaints de l'absence d'option permettant de désactiver complètement les mises à jour automatiques.

### Snapcraft

Snapcraft est un outil permettant aux développeurs d'empaqueter leurs programmes au format Snap. Il fonctionne sur n'importe quelle distribution Linux prise en charge par Snap, macOS et Microsoft Windows. Snapcraft construit les packages dans une machine virtuelle en utilisant Multipass, afin de s'assurer que le résultat d'une construction est le même, quel que soit la distribution ou le système d'exploitation sur lequel il est construit. Snapcraft prend en charge un grand nombre d'outils de construction et de langages de programmation tels que Go, Java, JavaScript, Python, C / C++ et Rust . Il permet également d'importer des métadonnées d'application à partir de plusieurs sources telles qu'AppStream, git, des scripts shell et des fichiers setup.py$^,$.

## Adoption

Au départ, Snap ne prenait en charge que la distribution all-Snap Ubuntu Core, mais en juin 2016, il a été porté sur un large éventail de distributions Linux pour devenir un format pour les packages Linux universels. Snap nécessite une fonctionnalité (systemd), disponible sous Linux, certains autres systèmes de type Unix n'en ont pas, donc par exemple FreeBSD n'a pas Snap. Chrome OS ne prend pas en charge Snap directement, uniquement via les distributions Linux installées qui prennent en charge Snap, telles que Gallium OS.
Un certain nombre de sociétés de développement de logiciels de bureau publient leurs logiciels dans le Snap Store, notamment Google, JetBrains, KDE, Microsoft (pour les versions Linux de par exemple .NET Core 3.1, Visual Studio Code, Skype, et PowerShell), Mozilla et Spotify. Les Snaps sont également utilisés dans les environnements Internet des objets, allant des produits destinés aux consommateurs aux passerelles de gestion des appareils d'entreprise et aux réseaux de communication par satellite$^,$. Enfin, Snap est également utilisé par les développeurs d'applications serveur telles que InfluxDB, Kata Containers, Nextcloud et Travis CI.
En 2019, Canonical a décidé de faire passer le navigateur web Chromium dans les futures versions d'Ubuntu d'un package APT à un Snap. Ils ont expliqué que Snap rendait beaucoup plus facile la prise en charge de Chromium sur toutes les versions d'Ubuntu prises en charge. Cela leur a permis de concentrer les ressources d'ingénierie sur d'autres parties d'Ubuntu$^,$. À la suite de cette décision, les dérivés d'Ubuntu tels que Linux Mint ont dû choisir entre conserver leur propre version du package Chromium ou passer à la version « snappée » de Chromium maintenue par Canonical. Clement Lefebre, fondateur et chef de projet de Linux Mint a mentionné cela comme la raison pour laquelle Linux Mint 20 empêche les utilisateurs d'installer Snap. Étant donné que Snap est toujours disponible dans les référentiels Linux Mint, les utilisateurs peuvent toujours l'installer après avoir supprimé manuellement les restrictions.

## Disponibilités
### Distributions avec Snap pré-installé

* Ubuntu (et les dérivées)
* KDE Neon
* Manjaro
* Zorin OS
* Solus

### Distribution sans Snap pré-installé

* Arch Linux
* CentOS
* Debian
* Elementary OS
* Fedora
* GalliumOS
* Kali Linux
* Linux Mint
* OpenSUSE
* Parrot Security OS
* Pop! OS
* Raspberry PI OS
* Red Hat Enterprise Linux
* Rocky Linux