web-dev-qa-db-fra.com

Comment fonctionne le processus de mise à niveau Ubuntu?

Comment Ubuntu effectue-t-il une mise à niveau transparente vers une distribution plus récente, alors que le système d'exploitation est toujours en cours d'exécution? J'effectue une mise à niveau de 10h10 à 11h04 et plusieurs fois auparavant. Il suffit simplement de lancer update-manager -d, de les télécharger et de les installer, puis de les redémarrer.

Comment cela fonctionne-t-il exactement? Comment le gestionnaire de mise à niveau peut-il mettre à jour le système d'exploitation pendant qu'il est encore utilisé?

10
bbosak

D'après mon expérience, je suppose que même si les packages et les modules fonctionnent, ils sont conservés en mémoire et ne renvoient pas beaucoup à leur copie sur le disque dur. Vous pouvez le voir si vous exécutez un programme dans Ubuntu, puis supprimez les packages associés lors de son exécution. Il continuera à fonctionner, mais si vous le fermez, vous ne pourrez plus le redémarrer.

Je suppose que la même chose se produit avec une mise à niveau de la distribution. Tous les packages liés à la version d'origine d'ubuntu sont toujours en cours d'exécution, même s'ils ont été supprimés et remplacés par de nouveaux. Ainsi, lorsqu'ils sont finalement arrêtés au redémarrage du système, les nouveaux packages prennent le relais.

3
Slipstream

Voici une description plus détaillée du processus. Désolé, le texte a si longtemps.

Mon expérience découle de Debian, pour laquelle l’ensemble du système de mise à niveau et de mise à niveau utilisé dans Ubuntu a été inventé. Les mises à niveau de sécurité quotidiennes d'Ubuntu correspondent à l'exécution de apt-get upgrade qui ne supprime normalement aucun logiciel. Les mises à niveau importantes correspondent à un apt-get dist-upgrade au cours duquel des packages logiciels peuvent être complètement échangés.

En réalité, les composants de très bas niveau ne sont normalement pas échangés lors d'une mise à niveau. Immédiatement après la mise à niveau, vous devriez trouver deux images de noyau et initrd dans votre répertoire/boot. En effet, contrairement aux programmes, les composants du noyau ne sont pas si interchangeables. S'il est nécessaire de charger de nouveaux pilotes de périphérique lors de la mise à niveau, ceux-ci doivent être compatibles avec le noyau en cours d'exécution. Une fois que le système a démarré avec le nouveau noyau, l’ancien peut être supprimé. La dernière fois que j'ai vérifié cela, il fallait que ce soit fait manuellement, je ne sais pas comment le programme de mise à jour actuel s'en occupe. C'est BTW. la raison principale pour laquelle l’image du noyau porte son numéro de version dans le nom du fichier - vous pouvez donc avoir différentes versions du noyau installées simultanément. Idem pour le chemin du module (/ lib/modules/...)

Les packages logiciels sont mis à niveau un par un, en commençant par les packages les plus bas de la hiérarchie des dépendances. Ce sont normalement des bibliothèques de programmes comme libc et d’autres. La séquence dans laquelle les packages sont mis à jour n'est cependant pas codée en dur, mais calculée dynamiquement à mesure que les dépendances des packages sont résolues. Dans la plupart des cas, les anciens programmes peuvent fonctionner avec de nouvelles bibliothèques, il n'est donc pas si problématique que ces bibliothèques soient remplacées en premier.

Vous devez comprendre ici que le système fait la distinction entre les packages installés manuellement (c'est-à-dire les packages que vous avez directement demandés, à savoir le chrome) et les packages installés automatiquement, lesquels n'étaient installés que pour remplir les dépendances des packages installés manuellement (et les dépendances de ces dépendances) ).

Pour chaque programme installé manuellement, le programme de mise à jour recherche simplement une version plus récente. Souvent, ces programmes ne sont que des méta-packages tels que "ubuntu-desktop", qui ne contient aucune donnée, et juste des dépendances. Les nouvelles versions des bibliothèques dépendantes seront intégrées, car elles sont demandées par des programmes directement mis à jour (demandés manuellement). Le programme de mise à jour essaiera toujours d'installer la version la plus récente utilisable de tout package dépendant (au cours de toute mise à niveau, pas uniquement des mises à niveau).

Les programmes qui ne peuvent pas fonctionner avec les nouvelles versions de la bibliothèque ne peuvent pas être démarrés après la mise à niveau de la bibliothèque et avant la mise à niveau du programme lui-même. Si ces programmes doivent déjà être en cours d'exécution avant la mise à niveau de la bibliothèque, ils continueront toutefois à s'exécuter, car l'ancienne version de la bibliothèque reste en mémoire aussi longtemps qu'elle est utilisée. Il en va de même pour les programmes qui ont été lancés avant leur mise à niveau. Ceux-ci ne fourniront pas de nouvelles fonctionnalités jusqu'à ce qu'ils soient terminés et redémarrés.

Après la mise à jour, certaines bibliothèques (ou dépendances en général) seront orphelines. Ce sont des bibliothèques qui étaient requises par les anciennes versions du programme, mais ne le sont plus par les nouvelles versions. Etant donné que ces paquets sont marqués comme installés automatiquement, et qu’aucun programme n’est installé manuellement, ils peuvent facilement être localisés et supprimés. Vous pouvez même observer ceci comme la dernière étape du processus de mise à jour (le programme de mise à jour dit "supprimer les paquets obsolètes" ou quelque chose de similaire).

Certains packages seront installés, qui n'étaient pas installés auparavant. Il s'agit simplement de nouvelles dépendances, marquées comme installées automatiquement et pouvant être supprimées si leur utilisation devait disparaître à l'avenir.

Ce mécanisme permet même l'échange de programmes utilisateur entiers. Comme par exemple passer de Gnome2 à Unity. Dans la mesure où ils ne sont que des dépendances automatiques d'ubuntu-desktop, l'un des rares packages pour lesquels de nouvelles versions sont réellement demandées.

Les programmes ne dépendent normalement pas d’une version spécifique du noyau du système d’exploitation. Ils fonctionnent donc normalement avec le noyau en cours d’exécution.

En dehors de tout cela, je soupçonne que le programme de mise à jour Ubuntu ajoute des corrections spécifiques et des solutions de contournement au mixage, afin de contourner les situations où cette théorie se brise.

Comme vous pouvez le constater lors de la mise à jour, il existe de très bonnes conditions dans lesquelles le système n’est utilisable que pour une partie limitée. En cas de problème lors de la mise à jour, vous resterez probablement avec un système défectueux. Souvent, même celui qui est difficile à réparer, car le programme de mise à niveau peut également être affecté. Rappelez-vous que les programmes avec des dépendances brisées peuvent continuer à fonctionner, mais ne peuvent pas être redémarrés, tant que les dépendances sont brisées, cela s'applique également au programme de mise à jour.

Vous pouvez utiliser le programme en ligne de commande apt-mark pour connaître les packages marqués comme installés manuellement et ceux installés automatiquement. Vous pouvez également changer ces marques en utilisant le même programme. Cela affectera directement le processus de mise à jour.

Dans une configuration logicielle plus complexe, le programme de mise à jour vous demande parfois de résoudre une dépendance manuellement. C'est à dire. lorsqu'un programme installé manuellement est mis à jour et demande une nouvelle version d'une bibliothèque alors qu'un autre programme installé manuellement dépend de l'ancienne version de la même bibliothèque et ne peut pas fonctionner avec la nouvelle. Vous devrez alors faire votre choix, soit de renoncer à l’un de ces programmes, soit de ne pas mettre à niveau les deux. Comme les dépendances sont souvent complexes, cela peut devenir très compliqué très rapidement (vous avez peut-être entendu parler du terme "enfer de dépendance").

Passons maintenant aux questions spécifiques:

  1. Quand une infrastructure de bas niveau est modifiée (bas niveau comme dans le noyau, les pilotes, les bibliothèques, etc., avec laquelle aucun utilisateur n'interagit directement), qu'advient-il des fichiers binaires obsolètes?
    • OK ... j'ai déjà couvert celui-ci
  2. Qu'advient-il d'une application complètement obsolète? Par exemple, Unity 2D (ou tout autre logiciel abandonné/sans mainteneurs dont le package n’est pas dans le nouveau référentiel).
    • Si l'application a déjà été installée manuellement, elle restera dans le système, provoquant souvent l'enfer de la dépendance que j'ai décrit.
  3. ubuntu-desktop est un métapaquet qui extrait les applications Ubuntu par défaut en tant que dépendances. Si j'ai supprimé Firefox et installé Chrome, Firefox sera-t-il toujours intégré aux mises à niveau?
    • Tant que c'est le navigateur standard de la nouvelle version, oui. Le chrome sera également mis à niveau. Je ne sais pas si vous pouvez supprimer Firefox sans supprimer ubuntu-desktop. Notez que, mis à part les dépendances strictes, le système de paquetage connaît également le concept de recommandations, dans lequel un logiciel est normalement installé comme une dépendance, mais peut être désinstallé ultérieurement sans affecter autre chose que ses propres dépendances.
  4. De plus, qu’arrivera-t-il si une seule application dépendait auparavant de package-x et ne le faisait plus dans la nouvelle version; Le paquet-x sera-t-il mis à jour avec le reste des paquets en dépit d'être orphelin?
    • Nan.

Demandez-moi si vous avez encore d'autres questions.

13
Paul Hänsch

Au niveau du système de fichiers, contrairement à Windows, sur un système Unix, vous pouvez supprimer les fichiers ouverts. La suppression supprime simplement le nom du fichier, pas son contenu. Ainsi, tout programme dont le fichier est toujours ouvert peut toujours y accéder jusqu'à ce qu'il ferme le fichier. Les données ne sont ensuite libérées.

Le processus de mise à niveau supprime donc simplement les anciens fichiers, les remplace par les nouveaux et, pour certains services système, les redémarre pour que la nouvelle version soit en cours d'exécution.

Il existe un ou deux composants qui ne peuvent pas être redémarrés sans avoir à redémarrer tout l'ordinateur. Ainsi, après leur mise à niveau, vous êtes invité à redémarrer l'ordinateur pour que vous utilisiez la nouvelle version.

3
psusi

Comment Linux peut-il se mettre à jour tant qu'il est encore utilisé?

Principalement parce que Linux (et avec lui la plupart des distributions) est simplement conçu de cette façon. Pouvoir mettre à niveau un paquet sur un système en cours d'exécution est un objectif de la plupart des distributions basées sur Linux.

Avec Linux, rien n'empêcherait le processus du gestionnaire de paquets d'écrire dans un fichier sur disque, même si ce fichier est actuellement ouvert par une application ou s'il s'agit d'un exécutable ou d'une bibliothèque de code partagée en cours d'exécution . À un niveau très bas, des verrous protègent l'accès à un fichier lors d'une seule opération d'écriture/lecture, mais ils ne sont jamais conçus pour être conservés plus de quelques millisecondes et toute autre application essayant d'écrire dans le même fichier. attendra simplement ces millisecondes.

Vous pouvez remplacer un fichier exécutable pendant son exécution sans que le processus en cours ne soit traité, car le processus n'a plus besoin du fichier sur le disque - tout son code a déjà été chargé en mémoire.

C’est pourquoi, sous Linux, même si vous pouvez mettre à niveau une application en cours d’exécution, celle-ci ne prendra effet qu’au redémarrage de l’application mise à niveau. Dans le cas de la mise à niveau d'un processus en arrière-plan tel qu'un service système, ce service devra être redémarré. Dans le cas où vous avez mis à niveau le noyau, cela signifie un redémarrage.

Ne remplacera pas les fichiers d'un programme pendant son exécution, casser certains programmes?

Certains paquets d'une distribution Linux contiennent des instructions d'installation demandant au gestionnaire de paquets d'arrêter certains services système pendant la mise à jour du paquet, et de redémarrer ces services une fois la mise à jour terminée. Cela évite les situations où, par exemple, les fichiers de configuration d'un service particulier sont mis à jour et que la version en cours d'exécution du service peut ne pas être en mesure de prendre en charge la version plus récente des fichiers de configuration.

En général, les applications utilisateur standard ne nécessitent aucun fichier de configuration, à l'exception des fichiers générés par l'utilisateur et placés à des emplacements tels que les répertoires de départ des utilisateurs. Ainsi, le gestionnaire de paquets ne les touchera pas lors de la mise à jour.

2
thomasrutter