Come funziona l'aggiornamento dei file binari dell'applicazione durante un aggiornamento?


23

Ho appena aggiornato il mio Ubuntu lucido a natty, durante l'aggiornamento ha sostituito la maggior parte delle applicazioni in esecuzione con una versione più recente.

Come funziona? (Le applicazioni non si arrestano in modo anomalo?) Cosa accadrà all'applicazione se un file lib viene aggiornato e un'applicazione in esecuzione che sta cercando una libreria più vecchia tenta di caricarla?


Bella domanda, ma probabilmente è meglio fare una domanda qui: unix.stackexchange.com (So ​​che l'URL dice Unix ma anche loro rispondono alle domande su Linux!)

Comprendere la funzionalità di sostituzione di Linux aperta sembra essere ancora in fase di programmazione (ma a malapena :)
bdonlan

2
@bdonlan: se stai caricando dinamicamente le librerie durante la vita del tuo processo, dovresti esserne molto consapevole, altrimenti potrebbe morderti. Questo è particolarmente importante se stai cercando di fare qualcosa di insolito, ad esempio un codice di modifica personale ecc. Ma sì, è borderline.
Piskvor,

1
Non è veramente rilevante per il codice auto-modificante, ma è certamente qualcosa che qualcuno che scrive librerie per Linux dovrebbe sapere, sì. :)
bdonlan,

1
@Piskvor, sembra un po 'come il processo di compilazione in più fasi per gcc :) Ma fondamentalmente solo i compilatori fanno qualcosa del genere, e in genere non aggiornerai il sistema mentre lo fai (anche se lo fai, purché tu non lo faccia esegui il downgrade di qualsiasi cosa mentre è in corso, stai bene, dal momento che utilizzerà le sue copie compilate privatamente di tutto ciò che conta)
bdonlan

Risposte:


31

Linux (e altri UNIX) traccia una distinzione tra il nome di un file (il collegamento ), il file stesso (spesso identificato con l' inode ) e gli handle aperti per il file. Quando vai a cancellare un file, chiami la unlink()chiamata - questo cancella il collegamento al file (puoi anche usarlo rename()per sovrascriverlo con un altro inode). Tuttavia, se rimangono handle aperti per il file (o altri collegamenti - i file possono avere più hardlink ), l' inode rimane e anche il contenuto del file, fino a quando tutti i link e handle non scompaiono.

Quindi, l'esecuzione di programmi utilizzando la libreria o altro mantiene un handle per la vecchia versione (spesso implicitamente attraverso una mappatura della memoria), quindi rimane sul disco. Semplicemente non ha più un nome file e verrà ripulito quando tutti i programmi che lo utilizzano vengono chiusi (o al successivo riavvio, durante il controllo del filesystem o il replay del journal).

Inoltre, si noti che i programmi che prevedono la "vecchia libreria" andranno bene con le versioni più recenti della libreria. Alle librerie Linux viene assegnato un nome file ('soname') che riflette la versione dell'ABI (Application Binary Interface) offerta dalla libreria. Ad esempio, la libreria C sul mio sistema è libc.so.6. Qualsiasi programma compilato con una versione precedente di libc, ma comunque una versione di libc che implementa la versione 6 ABI, funzionerà perfettamente con esso. Davvero vecchi programmi cercherà una libc.so.5o libc.so.4o qualcosa, invece; in questo caso, dovresti mantenere anche la vecchia versione, ma poiché il nome del file è diverso, questo non è un problema.


9

A differenza di Windows, è possibile eliminare o sostituire un file aperto; per fornire una spiegazione semplificata , nuove richieste per i file aprono il nuovo file, gli handle esistenti utilizzano il file esistente al momento della loro creazione. In altre parole, in Linux puoi avere file / versioni di file che esistono ancora, sebbene non ci sia più un puntatore ad esse nella struttura delle directory; quelli che cessano di esistere non hanno alcun indicatore (chiusi e tutti).

Di solito un'app in esecuzione carica le librerie necessarie in anticipo, quindi il problema che descrivi si verificherebbe solo in situazioni di temporizzazione molto specifiche durante l'installazione del pacchetto: le app in esecuzione utilizzano ancora la vecchia versione della libreria, le app appena avviate utilizzano la nuova uno.

Questo viene utilizzato non solo negli aggiornamenti di distro, ma si verifica ad ogni aggiornamento del pacchetto (l'aggiornamento di dist aggiunge solo un paio di passaggi automagici a quel processo).


0

Molti processi Linux continuano a funzionare dopo che i pacchetti da cui provengono sono stati aggiornati, ma alcuni non lo fanno. Nella mia esperienza, KDE non funziona mai correttamente se lo aggiorni mentre è in esecuzione. È probabile che si verifichino arresti anomali e / o errori durante il logout.

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.