Come funziona il processo di aggiornamento di Ubuntu?


11

In che modo Ubuntu si aggiorna perfettamente a una nuova distribuzione, mentre il sistema operativo è ancora in esecuzione? Sto aggiornando dalla 10.10 alla 11.04, e l'ho aggiornato più volte in precedenza, ed è semplice come eseguire update-manager -d e scaricarli e installarli, quindi riavviare.

Ma come funziona esattamente? In che modo il gestore aggiornamenti è in grado di aggiornare il sistema operativo mentre è ancora in uso?


Va bene, aggiungere la mia domanda nel commento sulla taglia non è stata una buona idea. Non mi sembra di poterlo modificare neanche.
Oxwivi,

Risposte:


3

Dalla mia esperienza, suppongo che mentre i pacchetti e i moduli sono in esecuzione, vengono conservati in memoria e non fanno molto riferimento alla loro copia sul disco rigido. Puoi vederlo se esegui un programma in Ubuntu e poi rimuovi i relativi pacchetti mentre è in esecuzione. Continuerà a funzionare, ma se lo chiudi, non puoi riavviarlo.

Suppongo che lo stesso accada con un aggiornamento della distribuzione. Tutti i pacchetti relativi alla versione originale di Ubuntu sono ancora in esecuzione anche se sono stati rimossi e sostituiti con quelli nuovi, quindi quando vengono finalmente arrestati al riavvio del sistema, i nuovi pacchetti prendono il controllo.


Ciò spiegherebbe anche perché noto che nuove funzioni vengono aggiunte ad alcuni menu man mano che procede l'aggiornamento.
bbosak,

15

Ecco una descrizione più dettagliata del processo. Mi dispiace che il testo sia arrivato così a lungo.

La mia esperienza deriva da Debian, per la quale è stato originariamente inventato l'intero sistema di packaging e aggiornamento utilizzato in Ubuntu. Gli aggiornamenti di sicurezza giornalieri di Ubuntu corrispondono a quelli in esecuzione apt-get upgradeche normalmente non rimuovono alcun software. I grandi aggiornamenti di rilascio corrispondono a quelli apt-get dist-upgradedurante i quali i pacchetti software possono essere scambiati completamente.

In realtà i componenti di livello molto basso normalmente non vengono scambiati durante un aggiornamento di rilascio. Immediatamente dopo l'aggiornamento dovresti trovare due immagini kernel e initrd nella tua directory / boot. Questo perché a differenza dei programmi i componenti del kernel non sono intercambiabili così bene. Se è necessario caricare nuovi driver di dispositivo durante l'aggiornamento, questi devono essere compatibili con il kernel in esecuzione. Dopo l'avvio del sistema con il nuovo kernel, è possibile rimuovere quello vecchio. L'ultima volta che ho verificato che una cosa doveva essere eseguita manualmente, non so come gestisca l'attuale programma di aggiornamento. Questo è BTW. il motivo principale, per cui l'immagine del kernel porta il suo numero di versione nel nome del file, in modo da poter avere diverse versioni del kernel installate contemporaneamente. Lo stesso per il percorso del modulo (/ lib / modules / ...)

I pacchetti software vengono aggiornati uno alla volta, iniziando con i pacchetti più bassi nella gerarchia delle dipendenze. Normalmente si tratta di librerie di programmi come libc e altri. La sequenza in cui i pacchetti vengono aggiornati non è tuttavia codificata ma calcolata in modo dinamico quando le dipendenze dei pacchetti vengono risolte. Nella maggior parte dei casi i vecchi programmi possono funzionare con nuove librerie, quindi non è così problematico se tali librerie vengono sostituite per prime.

Qui devi capire che il sistema distingue tra i pacchetti installati manualmente (ovvero i pacchetti che l'installazione hai richiesto direttamente, cioè il cromo) e i pacchetti installati automaticamente, che dove installati solo per soddisfare le dipendenze dei pacchetti installati manualmente (e le dipendenze di tali dipendenze ).

Per ogni programma installato manualmente, il programma di aggiornamento cerca solo una versione più recente. Spesso quei programmi sono solo meta-pacchetti come "ubuntu-desktop", che non contiene dati e solo dipendenze. Verranno inserite nuove versioni di librerie dipendenti, in quanto sono richieste da programmi direttamente aggiornati (richiesti manualmente). Il programma di aggiornamento tenterà sempre di installare la versione utilizzabile più recente di qualsiasi pacchetto dipendente (durante qualsiasi upgrdade non solo rilasci di aggiornamenti).

I programmi che non possono funzionare con le nuove versioni della libreria non possono essere avviati durante il periodo successivo all'aggiornamento della libreria e anche prima dell'aggiornamento del programma stesso. Se tali programmi dovrebbero essere già in esecuzione prima dell'aggiornamento della libreria, continueranno comunque a essere eseguiti, poiché la vecchia versione della libreria rimane in memoria finché rimane in uso. Lo stesso vale per i programmi avviati prima che vengano aggiornati. Quelle non forniranno nuove funzionalità fino a quando non saranno terminate e riavviate.

Dopo l'aggiornamento alcune librerie (o dipendenze in generale) saranno rese orfane. Quelle sono le librerie richieste dalle vecchie versioni del programma, ma non sono più richieste dalle nuove versioni. Poiché questi pacchetti sono contrassegnati come installati automaticamente e poiché nessun programma installato manualmente si collega ad essi, questi pacchetti possono essere facilmente individuati e rimossi. Puoi persino osservare questo come l'ultimo passaggio del processo di aggiornamento (il programma di aggiornamento dice "rimuovere i pacchetti obsoleti" o qualcosa di simile).

Verranno installati alcuni pacchetti, che dove prima non erano installati, si tratta semplicemente di nuove dipendenze, che sono contrassegnate come installate automaticamente e che possono essere rimosse qualora il requisito per loro svanisca in futuro.

Questo meccanismo consente persino lo scambio di interi programmi utente. Come ad esempio il passaggio da Gnome2 a Unity. Poiché entrambi sono solo dipendenze automatiche di ubuntu-desktop, che è uno dei pochi pacchetti, per il quale sono richieste nuove versioni in primo luogo.

I programmi normalmente non dipendono da una versione specifica del kernel del sistema operativo, quindi normalmente funzioneranno bene con il kernel in esecuzione.

A parte tutto ciò, sospetto che il programma di aggiornamento di Ubuntu lancia alcune soluzioni specifiche e soluzioni alternative nel mix, per aggirare le situazioni in cui questa teoria si rompe.

Come puoi vedere durante l'aggiornamento, ci sono ottime condizioni in cui il sistema è utilizzabile solo per una parte limitata. Se qualcosa dovesse andare storto durante l'aggiornamento , molto probabilmente rimarrai con un sistema guasto. Spesso anche uno che non può essere facilmente riparato, poiché anche il programma di aggiornamento può essere interessato. Ricorda, i programmi con dipendenze interrotte possono continuare a funzionare, ma non possono essere riavviati, purché le dipendenze siano interrotte, questo vale anche per il programma di aggiornamento.

È possibile utilizzare il programma da riga di comando apt-markper scoprire quali pacchetti sono contrassegnati come installati manualmente e quali sono stati installati automaticamente. Puoi anche cambiare quei segni usando lo stesso programma. Ciò influirà direttamente sul processo di aggiornamento.

In una configurazione software più complessa, a volte l'Updater ti chiederà di risolvere manualmente una dipendenza. Vale a dire quando un programma installato manualmente viene aggiornato e richiede una nuova versione di una libreria mentre un altro programma installato manualmente dipende dalla vecchia versione della stessa libreria e non può funzionare con quella nuova. Dovrai quindi fare la tua scelta, o di abbandonare uno di quei programmi o di astenervi dal potenziarli entrambi. Poiché le dipendenze sono spesso complesse, questo può diventare molto disordinato molto velocemente (potresti aver sentito parlare del termine "inferno delle dipendenze").

Ora alle domande specifiche:

  1. Quando viene modificata l'infrastruttura di basso livello (di basso livello come nel kernel, nei driver, nelle librerie, ecc. Qualsiasi cosa con cui un utente non interagisce direttamente), cosa succede ai binari deprecati?
    • OK ... ho già coperto questo
  2. Cosa succede a un'app che è stata completamente deprecata? Ad esempio, Unity 2D (o qualsiasi altro software abbandonato / nessun manutentore il cui pacchetto non è in un nuovo repository).
    • Se l'app è stata installata una volta manualmente rimarrà nel sistema, causando spesso l'inferno di dipendenza che ho descritto.
  3. ubuntu-desktop è un metapacchetto che estrae le applicazioni Ubuntu predefinite come dipendenze. Se ho rimosso Firefox e installato Chrome, Firefox verrà comunque inserito come parte degli aggiornamenti?
    • Finché è il browser standard della nuova versione, sì. Chromium verrà anche aggiornato. Non sono sicuro di poter rimuovere Firefox senza rimuovere Ubuntu-Desktop. Si noti che a parte le dipendenze rigorose, il sistema di pacchetti conosce anche il concetto di raccomandazioni, in cui un software verrà normalmente installato come una dipendenza, ma può essere disinstallato in seguito senza influenzare nient'altro che le sue sole dipendenze.
  4. Inoltre, cosa succede se una singola app dipendeva dal pacchetto-x e non lo fa più nella nuova versione; package-x verrà aggiornato insieme al resto dei pacchetti nonostante sia orfano?
    • No.

Chiedimi se hai ancora altre domande.


Puoi collegarti a più documenti relativi all'inferno delle dipendenze (mi ricorda il termine inferno DLL)? Uso installazioni di Ubuntu minime e voglio capire come funzionerà l'aggiornamento per me.
Oxwivi,

Penso che tutto ciò che troverete su Internet sull'inferno delle dipendenze siano i reclami. Leggi le tue pagine man apt, come man apt-get. Trovo che sia spesso utile utilizzare la versione specificando la sintassi del comando come apt-get -t intrepid install foo/jaunty bar/oneiricetc ..., solo esempi. In realtà questo ha più senso con Debian in cui a volte mescoli le versioni, sotto Ubuntu questo è meno consueto. Argomenti interessanti potrebbero anche essere l'ap-pin e la messa in attesa di pacchetti.
Paul Hänsch,

3
Hai vinto il premio per la più lunga risposta senza codice che abbia mai visto nella rete Stack Exchange.
Patrick,

3

A livello di filesystem, a differenza di Windows, su un sistema Unix è possibile eliminare file aperti. La cancellazione rimuove semplicemente il nome del file, non il suo contenuto, quindi tutti i programmi che hanno ancora il file aperto possono ancora accedervi fino a quando non chiudono il file, e solo allora i dati vengono liberati.

Quindi il processo di aggiornamento rimuove semplicemente i vecchi file, li sostituisce con quelli nuovi e per alcuni servizi di sistema li riavvia in modo che la nuova versione sia in esecuzione.

Esistono uno o due componenti che non possono essere riavviati senza riavviare l'intero computer, quindi dopo aver aggiornato quelli, viene richiesto di riavviare in modo da utilizzare la nuova versione.


2

Come può Linux aggiornarsi mentre è ancora in uso?

Principalmente perché Linux (e con esso la maggior parte delle distribuzioni) è semplicemente progettato in questo modo. Essere in grado di aggiornare un pacchetto su un sistema in esecuzione è un obiettivo per la maggior parte delle distribuzioni basate su Linux.

Con Linux, non c'è nulla che possa impedire al processo del gestore pacchetti di scrivere su un file su disco, anche se quel file è attualmente aperto da un'applicazione o il file è una libreria eseguibile o condivisa di codice attualmente in esecuzione . A un livello molto basso, ci sono blocchi che proteggono l'accesso a un file durante una singola operazione di scrittura / lettura, ma questi non sono mai progettati per essere conservati per più di una questione di millisecondi e qualsiasi altra applicazione che tenta di scrivere nello stesso file aspetterò semplicemente quei millisecondi.

È possibile sostituire un file eseguibile mentre è in esecuzione e in realtà non farà nulla al processo in esecuzione, poiché il processo non ha più bisogno del file sul disco: tutto il suo codice è già stato caricato in memoria.

Questo è il motivo per cui su Linux, anche se è possibile aggiornare un'applicazione mentre è in esecuzione, l'aggiornamento non avrà effettivamente effetto fino al riavvio dell'applicazione aggiornata. Nel caso di aggiornamento di un processo in background come un servizio di sistema, tale servizio dovrebbe essere riavviato. Nel caso in cui hai aggiornato il kernel, questo significa un riavvio.

Non sostituirai i file di un programma mentre è in esecuzione interrompi alcuni programmi?

Alcuni pacchetti in una distribuzione Linux conterranno le istruzioni di installazione che indicano al gestore pacchetti di interrompere determinati servizi di sistema mentre gli aggiornamenti dei pacchetti e di riavviare tali servizi al termine dell'aggiornamento. Ciò impedisce situazioni in cui, ad esempio, i file di configurazione per un determinato servizio vengono aggiornati e la versione in esecuzione del servizio potrebbe non essere in grado di far fronte alla versione più recente dei file di configurazione.

In generale, le normali applicazioni utente non richiedono l'esecuzione di file di configurazione, ad eccezione dei file che genera e posizionano in posizioni come le home directory degli utenti. Quindi questi non verranno toccati dal gestore dei pacchetti durante l'aggiornamento.


Sono già a conoscenza di tutti questi dettagli, leggi il commento che ho inserito con la mia generosità. Voglio sapere come esattamente Ubuntu, cioè aptgestisce determinati pacchetti e dipendenze durante il processo di aggiornamento.
Oxwivi,

-2

Questo è simile a un'altra funzionalità. Spero che questo aiuti a comprendere il processo di base.

Mi riferisco alla capacità di "cambiare root" all'avvio del sistema operativo.

Quando il sistema operativo si avvia, il filesystem di root (leggi: "/") è inizialmente disponibile solo nella RAM. Mentre questo processo di avvio è in esecuzione, passa / dalla RAM al / filesystem sul disco rigido.


1
No, il meccanismo chroot non viene utilizzato durante l'aggiornamento del sistema. L'aggiornamento viene eseguito sul file system live. Puoi persino guardare i menu dei tuoi programmi essere ricostruiti e le icone dei programmi cambiano mentre vengono sostituite. Ma il meccanismo chroot viene utilizzato in un'installazione di sistema originale, quando un nuovo sistema viene "debootstrapped" in un ambiente root di modifica su un partiton del disco appena creato.
Paul Hänsch,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.