Cours Ubuntu 26.04 / Gérer les installations, permissions et mises à jour Snap

Sur Ubuntu Server, gérez les applications Snap en vérifiant leur éditeur, leur canal, leur confinement, leurs interfaces et leurs mises à jour. Leur installation reste distincte des paquets Deb gérés par APT : un même nom de programme ne garantit ni le même exécutable ni les mêmes données.

Identifier le paquet, son éditeur et son exécutable

Un snap est un paquet applicatif pris en charge par le service snapd. Avant toute installation, disposez d’une machine Ubuntu de laboratoire, d’un accès réseau au Store et de sudo pour les opérations d’administration. Vérifiez d’abord l’outil et l’état réel :

snap version
snap list
snap changes
snap refresh --time

snap list indique notamment Name, Version, Rev et Tracking. Version est la version déclarée par l’application ; Rev est l’identifiant de sa révision Snap. snap changes présente les tâches récentes, et refresh --time le calendrier de rafraîchissement. Une mise à jour APT sans paquet proposé ne signifie pas que les snaps sont à jour.

Pour une application précise, consultez snap info avec son nom réellement observé. Comparez l’éditeur, les canaux et les informations installées. Pour une commande qui existe sous plusieurs formes, utilisez command -v puis type -a avec son nom : la priorité dans le PATH peut sélectionner une installation Deb, Snap ou locale différente. Le manuel snap d’Ubuntu 26.04 détaille les commandes de consultation.

Installer et exécuter une application de démonstration

hello-world est un exemple proposé par Canonical. Sa fiche dans le Snap Store affiche toutefois un avertissement de mise à jour ancienne : ce choix sert à observer le mécanisme dans un laboratoire isolé, pas à sélectionner un logiciel pour la production. Relisez l’état actuel du Store et n’installez pas un paquet si son origine ou sa maintenance ne vous convient pas.

snap list hello-world
snap info --verbose hello-world

Si la première commande signale qu’aucun snap correspondant n’est installé, distinguez ce résultat d’une impossibilité de joindre snapd. Si hello-world est déjà présent, conservez sa révision et son canal ; ne le retirez pas pour recommencer l’exercice. Sinon, après lecture de l’éditeur et du canal, installez-le :

sudo snap install hello-world
snap list hello-world
snap run hello-world

Le programme doit afficher son message de démonstration. snap run permet de désigner explicitement l’application Snap ; ce résultat ne prouve pas que la commande courte hello-world utilise le même chemin. Vérifiez command -v hello-world si vous employez cette forme. Si /snap/bin manque au PATH, contrôlez la configuration de session et reconnectez-vous si nécessaire, sans installer une seconde copie pour contourner le problème.

Choisir le canal et comprendre le confinement

Un canal Snap peut réunir une piste de version, un niveau de risque et une branche temporaire. Par exemple, latest/stable désigne une piste et un risque ; stable, candidate, beta et edge ne constituent pas une garantie de qualité identique. Suivez la recommandation de l’éditeur pour l’usage envisagé. Avant un changement de canal, relevez Tracking et les révisions, sauvegardez les données et vérifiez leur compatibilité avec la version visée.

Mode Portée et choix
strict Accès encadrés par le confinement et les interfaces déclarées ; examinez les ressources réellement autorisées.
classic Accès beaucoup plus large, comparable à un paquet traditionnel ; l’installation exige --classic et une justification adaptée au logiciel.
devmode Mode de développement qui relâche l’application des restrictions et produit des diagnostics ; il ne constitue pas une réparation de permissions pour un serveur.

La documentation du confinement Snap précise ces différences. N’ajoutez pas --classic ou --devmode à une commande uniquement pour faire disparaître une erreur. Un badge d’éditeur vérifié confirme une identité dans le Store, pas l’adéquation de tous les accès demandés à votre besoin.

Examiner les interfaces avant d’accorder un accès

Une interface décrit une catégorie d’accès. Une prise consommatrice, Plug, se connecte à un fournisseur, Slot. Pour un snap installé, snap connections suivi de son nom affiche aussi ses prises non connectées ; un tiret dans Slot indique l’absence de connexion. snap interface suivi du nom d’interface présente ses fournisseurs et consommateurs.

Relevez les noms exacts et confrontez-les aux besoins décrits par l’éditeur. Une difficulté à lire un support externe peut venir de l’interface, du montage ou des permissions des fichiers. Une connexion ne monte pas arbitrairement un disque et ne réécrit pas les permissions Unix. Accordez seulement l’accès nécessaire, puis testez une fonction précise. Les connexions d’interfaces dans la documentation Snap expliquent les commandes et les connexions automatiques.

Tester une nouvelle connexion et vérifier son retrait

Le script complet ci-dessous attend une prise déclarée et initialement non connectée, ainsi que le Slot exact relevé. Il préserve les prises déjà connectées et refuse une prise absente. Choisissez un accès nécessaire et documenté dans un laboratoire ; n’accordez pas une interface sensible sur un serveur de production pour faire un essai.

Enregistrez le bloc dans un nouveau fichier ~/test-snap-interface.sh avec votre éditeur, sans écraser un fichier existant. Exécutez bash ~/test-snap-interface.sh suivi de deux arguments : le SNAP:PLUG réel et le SLOT réel. Un slot système peut commencer par deux-points, comme l’affiche la commande de consultation. Aucun argument générique ne doit être repris littéralement.

set -eu
if [ "$#" -ne 2 ]; then
    printf 'Usage: bash test-snap-interface.sh SNAP:PLUG SLOT\n' >&2; exit 2
fi
plug=$1
slot=$2
app=${plug%%:*}
case "$plug" in *:*) ;; *) printf 'Use the exact Plug from snap connections.\n' >&2; exit 2 ;; esac
case "$slot" in *:*) ;; *) printf 'Use the exact Slot from snap connections.\n' >&2; exit 2 ;; esac
snap list "$app"
connections=$(LC_ALL=C snap connections "$app")
printf '%s\n' "$connections"
previous_slot=$(printf '%s\n' "$connections" | awk -v p="$plug" '$2 == p {print $3}')
case "$previous_slot" in
    -) ;;
    '') printf 'Declared plug not found; stop.\n' >&2; exit 1 ;;
    *) printf 'Already connected to %s; preserve it.\n' "$previous_slot"; exit 0 ;;
esac
restore() {
    original_status=$?
    trap - EXIT HUP INT TERM
    if ! connections=$(LC_ALL=C snap connections "$app"); then
        printf 'Cannot inspect the connection; verify restoration manually.\n' >&2; exit 1
    fi
    current_slot=$(printf '%s\n' "$connections" | awk -v p="$plug" '$2 == p {print $3}')
    case "$current_slot" in
        "$previous_slot") ;;
        "$slot")
            if ! sudo snap disconnect "$plug" "$slot"; then
                printf 'Restoration failed; inspect the connection.\n' >&2; exit 1
            fi
            ;;
        *) printf 'Unexpected connection state; inspect before disconnecting.\n' >&2; exit 1 ;;
    esac
    if ! connections=$(LC_ALL=C snap connections "$app"); then
        printf 'Cannot verify restoration; inspect the connection.\n' >&2; exit 1
    fi
    printf '%s\n' "$connections"
    restored_slot=$(printf '%s\n' "$connections" | awk -v p="$plug" '$2 == p {print $3}')
    if [ "$restored_slot" != "$previous_slot" ]; then
        printf 'Original connection state was not restored.\n' >&2; exit 1
    fi
    exit "$original_status"
}
trap restore EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
sudo snap connect "$plug" "$slot"
snap connections "$app"
read -r -p 'Run your documented app test in another terminal; press Enter to restore: ' answer

Dans un autre terminal, testez la fonction décrite par l’éditeur, puis revenez appuyer sur Entrée. Le script déconnecte uniquement le Slot demandé et relit l’état ; la prise doit retrouver le tiret initial. Une erreur de lecture, de déconnexion ou de vérification donne un code d’échec. Si l’essai a échoué avant le nettoyage et que ce dernier réussit, le code initial est conservé.

Il tente aussi le nettoyage après Ctrl+C ou un signal de terminaison, sans couvrir une coupure de courant ou un arrêt forcé. Notez les arguments et la commande de déconnexion exacte avant de commencer. Si l’état observé diffère de l’état attendu, examinez-le manuellement avant toute nouvelle action ; n’utilisez pas une déconnexion globale.

Cette vérification porte sur la connexion visible, pas sur une restitution de toute la politique interne de snapd. Une déconnexion manuelle peut être mémorisée et influencer une reconnexion automatique ultérieure. Réservez donc cet exercice à une connexion manuelle que vous souhaitez retirer, et ne réinitialisez pas une politique existante avec --forget pour obtenir artificiellement un résultat.

Suivre les mises à jour et distinguer révision et données

Les snaps du Store sont généralement rafraîchis automatiquement. Consultez le calendrier et les changements avant une intervention ; un snap local ou en devmode ne suit pas nécessairement cette politique. Pour demander une mise à jour ciblée de l’application de démonstration encore installée :

sudo snap refresh hello-world
snap list --all hello-world
snap changes

Prévoyez l’effet sur les applications ouvertes et les services. Un maintien configuré pour un snap peut différer ses mises à jour automatiques, mais une demande ciblée de refresh peut passer outre. Ne suspendez pas durablement les correctifs sans un suivi et une date de réexamen.

snap revert, suivi du nom du snap, peut revenir à une révision antérieure disponible et à des données propres à cette révision. Les données communes, par exemple une base stockée dans un répertoire common, ne sont pas nécessairement remises à leur ancien état. Vérifiez les sauvegardes et la compatibilité du format avant un retour ; une ancienne version du programme peut ne plus lire les données migrées. La documentation sur la gestion des mises à jour et des retours Snap décrit ces limites.

Retirer uniquement l’installation créée et contrôler les sauvegardes

Si hello-world a été installé pour cet exercice et qu’aucun autre usage n’en dépend, retirez cette installation. Préservez une installation antérieure :

sudo snap remove hello-world
snap saved

Sur Ubuntu Server, une suppression normale peut créer un instantané automatique des données Snap, à moins que cette fonction ait été désactivée. Le comportement documenté de conservation par défaut est de 31 jours ; vérifiez la politique réelle et la colonne Notes. --purge omet cet instantané : ne l’ajoutez pas simplement pour accélérer le nettoyage.

Les instantanés de données Snap ne remplacent pas une sauvegarde de tous les fichiers externes utilisés par l’application. snap saved inventorie ces archives ; leur présence ne valide pas une restauration applicative. Distinguez retrait du paquet, conservation de ses archives et fichiers créés ailleurs dans votre dossier personnel.