Comment fonctionne le processus de mise à niveau d'Ubuntu?

11

Comment Ubuntu passe-t-il de manière transparente à une distribution plus récente, alors que le système d'exploitation est toujours en cours d'exécution? Je passe de 10.10 à 11.04, et j'ai déjà mis à niveau plusieurs fois auparavant, et c'est aussi simple que d'exécuter update-manager -d, de les télécharger et de les installer, puis de redémarrer.

Comment cela fonctionne-t-il exactement? Comment le gestionnaire de mise à niveau est-il capable de mettre à jour le système d'exploitation alors qu'il est encore en cours d'utilisation?

bbosak
la source
D'accord, ajouter ma question dans le commentaire de prime n'était pas une bonne idée. Il ne semble pas non plus que je puisse le modifier.
Oxwivi

Réponses:

3

D'après mon expérience, je suppose que pendant que les packages et les modules fonctionnent, ils sont conservés en mémoire et ne se réfèrent 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 de fonctionner, mais si vous le fermez, vous ne pourrez pas le redémarrer.

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

Slipstream
la source
Cela expliquerait également pourquoi je remarque que de nouvelles fonctionnalités sont ajoutées à certains menus à mesure que la mise à niveau progresse.
bbosak
15

Voici une description plus détaillée du processus. Désolé, le texte est devenu si long.

Mon expérience découle de Debian, pour laquelle l'intégralité du système de mise en package et de mise à niveau utilisé dans Ubuntu a été inventé à l'origine. Les mises à jour de sécurité Ubuntu quotidiennes correspondent à une exécution apt-get upgradequi normalement ne supprime aucun logiciel. Les mises à niveau de grandes versions correspondent à une apt-get dist-upgradepériode pendant laquelle les progiciels peuvent être complètement échangés.

En fait, les composants de très bas niveau ne sont normalement pas échangés lors d'une mise à niveau de version. 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 aussi bien interchangeables. Si le besoin se fait sentir de charger de nouveaux pilotes de périphériques pendant la mise à niveau, ceux-ci doivent être compatibles avec le noyau en cours d'exécution. Après le démarrage du système avec le nouveau noyau, l'ancien peut être supprimé. La dernière fois que j'ai vérifié que cette seule chose devait être effectuée manuellement, je ne sais pas comment le programme de mise à jour actuel gère cela. 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 installer différentes versions du noyau en même temps. 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 lorsque les dépendances des packages sont résolues. Dans la plupart des cas, les anciens programmes peuvent fonctionner avec de nouvelles bibliothèques, donc ce n'est pas si problématique si ces bibliothèques sont remplacées en premier.

Vous devez comprendre ici que le système fait la différence entre les packages installés manuellement (c'est-à-dire les packages dont vous avez directement demandé l'installation, par exemple chrome) et les packages installés automatiquement, qui n'étaient installés que pour répondre aux dépendances des packages installés manuellement (et aux 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 comme "ubuntu-desktop", qui ne contient aucune donnée, et seulement des dépendances. De 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 dernière version utilisable de tout package dépendant (lors de toute mise à niveau, pas seulement des mises à niveau de versions).

Les programmes qui ne peuvent pas fonctionner avec les nouvelles versions de bibliothèque ne peuvent pas être démarrés pendant le temps après la mise à niveau de la bibliothèque et avant que le programme lui-même ne soit également mis à niveau. Si ces programmes doivent déjà être en cours d'exécution avant la mise à niveau de la bibliothèque, ils continueront cependant à s'exécuter, car l'ancienne version de la bibliothèque reste en mémoire tant 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 tant qu'ils ne seront pas arrêté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 qui ne sont plus requises par les nouvelles versions. Étant donné que ces packages sont marqués comme installés automatiquement et qu'aucun programme installé manuellement ne les concerne plus, ces packages peuvent être facilement localisés et supprimés. Vous pouvez même observer cela comme la dernière étape du processus de mise à jour (le programme de mise à jour dit "supprimer les packages obsolètes" ou quelque chose de similaire).

Certains packages seront installés, qui, lorsqu'ils n'étaient pas installés auparavant, ne sont que de nouvelles dépendances, qui sont marquées comme installées automatiquement et peuvent être supprimées si leur besoin disparaît à l'avenir.

Ce mécanisme permet même l'échange de programmes utilisateurs entiers. Comme par exemple passer de Gnome2 à Unity. Étant donné que les deux ne sont que des dépendances automatiques d'ubuntu-desktop, qui est l'un des rares packages, pour lesquels de nouvelles versions sont réellement demandées en premier lieu.

Les programmes ne dépendent normalement pas d'une version spécifique du noyau du système d'exploitation, ils fonctionneront 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 correctifs et des solutions de contournement spécifiques dans le mélange, pour contourner les situations où cette théorie rompt.

Comme vous pouvez le voir 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 pendant la mise à jour, vous vous retrouverez probablement avec un système défectueux. Souvent même celui qui ne peut pas être facilement réparé, car le programme de mise à niveau peut également être affecté. N'oubliez pas que les programmes avec des dépendances cassées peuvent continuer à fonctionner, mais ne peuvent pas être redémarrés, tant que les dépendances sont cassées, cela vaut également pour le programme de mise à jour.

Vous pouvez utiliser le programme de ligne de commande apt-markpour savoir quels packages sont marqués comme installés manuellement et lesquels ont été 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 demandera 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 tandis 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 les mettre à niveau. 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 des dépendances»).

Passons maintenant aux questions spécifiques:

  1. Lorsque l'infrastructure de bas niveau est modifiée (bas niveau comme dans le noyau, les pilotes, les bibliothèques, etc. tout ce avec quoi un utilisateur n'interagit pas directement), qu'advient-il des binaires obsolètes?
    • OK ... j'ai déjà couvert celui-ci
  2. Qu'arrive-t-il à une application complètement obsolète? Par exemple, Unity 2D (ou tout autre logiciel abandonné / aucun mainteneur dont le package n'est pas dans un nouveau référentiel).
    • Si l'application a été installée manuellement une fois, elle restera dans le système, provoquant souvent l'enfer de 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é dans le cadre des mises à niveau?
    • Tant qu'il s'agit du 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 qu'en dehors des dépendances strictes, le système de packages connaît également le concept de recommandations, où un logiciel sera normalement installé comme une dépendance, mais peut être désinstallé plus tard sans affecter autre chose que ses propres dépendances.
  4. De plus, que se passe-t-il si une seule application dépendait de package-x et ne le fait plus dans la nouvelle version; package-x sera-t-il mis à niveau avec le reste des packages malgré le fait qu'il soit orphelin?
    • Nan.

Demandez-moi simplement si vous avez encore des questions.

Paul Hänsch
la source
Pouvez-vous créer un lien vers d'autres documents liés à l'enfer des dépendances (me rappelle le terme enfer DLL)? J'utilise un minimum d'installations Ubuntu et je veux savoir comment la mise à niveau fonctionnera pour moi.
Oxwivi
Je pense que tout ce que vous trouverez sur Internet au sujet de l'enfer de la dépendance sont des plaintes. Lisez vos pages de manuel apt, comme man apt-get. Je trouve qu'il est souvent utile d'utiliser la syntaxe de commande spécifiant la version comme apt-get -t intrepid install foo/jaunty bar/oneiricetc ..., juste des exemples. En fait, cela a plus de sens avec Debian où vous mélangez parfois des versions, sous Ubuntu, c'est moins habituel. Les sujets intéressants pourraient également être l'épinglage d'apt et la mise en attente des packages.
Paul Hänsch
3
Vous remportez le prix de la réponse non code la plus longue que j'aie jamais vue sur le réseau Stack Exchange.
Patrick
3

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, de sorte que tous les programmes qui ont toujours le fichier ouvert peuvent toujours y accéder jusqu'à ce qu'ils ferment le fichier, et ce n'est qu'alors que les données sont libérées.

Ainsi, le processus de mise à niveau supprime 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 y a un ou deux composants qui ne peuvent pas être redémarrés sans redémarrer tout l'ordinateur, donc après les avoir mis à niveau, vous êtes invité à redémarrer pour utiliser la nouvelle version.

psusi
la source
2

Comment Linux peut-il se mettre à jour alors 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 package sur un système en cours d'exécution est un objectif pour la plupart des distributions basées sur Linux.

Avec Linux, rien n'empêche le processus du gestionnaire de packages d'écrire dans un fichier sur le disque, même si ce fichier est actuellement ouvert par une application ou s'il s'agit d'une bibliothèque de code exécutable ou partagée en cours d'exécution . À un niveau très bas, il existe des verrous qui protègent l'accès à un fichier pendant une seule opération d'écriture / lecture, mais ils ne sont jamais conçus pour être conservés plus d'une question de 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 qu'il est en cours d'exécution et il ne fera rien au processus en cours d'exécution, 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, la mise à niveau ne prendra effet qu'au redémarrage de l'application que vous avez mise à niveau. Dans le cas de la mise à niveau d'un processus d'arrière-plan tel qu'un service système, ce service devra être redémarré. Dans le cas où vous avez mis à jour le noyau, cela signifie un redémarrage.

Ne remplacera-t-il pas les fichiers d'un programme en cours d'exécution?

Certains packages d'une distribution Linux contiendront des instructions d'installation demandant au gestionnaire de packages d'arrêter certains services système pendant la mise à jour du package et de redémarrer ces services une fois la mise à jour terminée. Cela évite les situations dans lesquelles, par exemple, les fichiers de configuration d'un service particulier sont mis à jour et la version en cours d'exécution du service peut ne pas être en mesure de gérer la nouvelle version des fichiers de configuration.

En général, les applications utilisateur normales ne nécessitent aucun fichier de configuration à exécuter, à l'exception des fichiers qu'elles génèrent elles-mêmes et placent dans des emplacements tels que les répertoires personnels des utilisateurs. Ainsi, le gestionnaire de paquets ne les touchera pas lors de la mise à jour.

thomasrutter
la source
Je suis déjà au courant de tous ces détails, veuillez lire le commentaire que j'ai placé avec ma prime. Je veux savoir exactement comment Ubuntu, c'est-à-dire apt, gère certains packages et dépendances pendant le processus de mise à niveau.
Oxwivi
-2

Ceci est similaire à une autre fonctionnalité. J'espère que cela vous aidera à comprendre le processus de base.

Je fais référence à la capacité de "basculer root" lorsque le système d'exploitation démarre.

Lorsque le système d'exploitation démarre, le système de fichiers racine (lire: "/") n'est initialement disponible qu'en RAM. Pendant l'exécution de ce processus de démarrage, il bascule / de la RAM vers le système de fichiers / sur le disque dur.

gréé
la source
1
Non, le mécanisme chroot n'est pas utilisé lors de la mise à niveau du système. La mise à niveau est effectuée sur le système de fichiers en direct. Vous pouvez même regarder les menus de votre programme être reconstruits et les icônes de programme changer au fur et à mesure de leur remplacement. Mais le mécanisme de chroot est utilisé dans une installation de système d'origine, lorsqu'un nouveau système est "debootstrapped" dans un environnement racine de changement sur une partition de disque nouvellement créée.
Paul Hänsch