Perché l'aggiornamento di un sistema Linux in esecuzione non è problematico?


25

Sono anni che uso i sistemi Linux su base giornaliera e non ho mai avuto grossi problemi aggiornando un sistema mentre era in esecuzione, ma mi chiedo ancora perché questo sia possibile.

Lasciami fare un esempio.

Supponiamo che un programma "A" di un determinato pacchetto sia in esecuzione su un sistema. Questo programma, ad un certo punto, deve aprire un altro file ("B") dallo stesso pacchetto. Successivamente, il programma "A" chiude "B" perché non ne ha più bisogno. Supponiamo che ora aggiorni i pacchetti "A" e "B" a cui appartengono. "A" non è direttamente interessato da queste operazioni, almeno per il momento, poiché è in esecuzione nella RAM e l'aggiornamento ha appena sostituito "A" sul disco rigido. Supponiamo che "B" sia stata sostituita anche sul filesystem. Ora "A" deve leggere di nuovo "B" per qualche motivo. La domanda è: è possibile che "A" possa trovare una versione incompatibile di "B" e crash o malfunzionamento in qualche altro modo?

Perché nessuno aggiorna i propri sistemi riavviando con un CD live o una procedura simile?


Tendo a preferire evitare tali aggiornamenti, non a causa della meccanica dell'aggiornamento (questo può essere fatto bene), ma piuttosto perché preferisco testare prima le mie applicazioni e la mia configurazione rispetto alle modifiche. Quindi avrei un sistema separato ora aggiornato per passare a. Ma a parte questo, l'aggiornamento in userland non è generalmente un problema, e per piccole correzioni di sicurezza, lo farei semplicemente.
Skaperen,

Risposte:


23

L'aggiornamento di Userland è raramente un problema

Spesso puoi aggiornare i pacchetti su un sistema live perché:

  1. Le librerie condivise sono archiviate in memoria, non lette dal disco ad ogni chiamata, quindi le vecchie versioni rimarranno in uso fino al riavvio dell'applicazione.
  2. I file aperti vengono effettivamente letti dai descrittori di file , non dai nomi dei file, quindi i contenuti dei file rimangono disponibili per le applicazioni in esecuzione anche quando vengono spostati / rinominati / eliminati fino a quando i settori non vengono sovrascritti o i descrittori di file vengono chiusi.
  3. I pacchetti che richiedono il ricaricamento o il riavvio sono generalmente gestiti correttamente dal gestore dei pacchetti se il pacchetto è stato ben progettato. Ad esempio, Debian riavvierà alcuni servizi ogni volta che libc6 viene aggiornato.

Generalmente, a meno che non stiate aggiornando il kernel e non stiate usando ksplice, potrebbe essere necessario riavviare programmi o servizi per sfruttare un aggiornamento. Tuttavia, raramente è necessario riavviare un sistema per aggiornare qualsiasi cosa in userland, sebbene sui desktop sia occasionalmente più facile che riavviare i singoli servizi.

Guarda anche

http://en.wikipedia.org/wiki/Ring_%28computer_security%29#Supervisor_mode


Ma cosa succederà se hai bisogno di tutta la memoria cache? In tal caso, le librerie di condivisione dovranno essere nuovamente caricate dal disco ...
Nils,

3
In realtà la descrizione di # 1 non era così chiara. Il vecchio contenuto del file della libreria rimane sotto un inode (originale) separato, anche se tutti i nomi che lo collegano sono spariti, finché un processo ha il file aperto o il suo contenuto è mappato, i dati sono mantenuti distinti (e il filesystem non può essere rimontato r / o fino al completamento dell'annullamento del collegamento del file). Il processo che ha mappato il file originale ha ancora mappature di memoria sul contenuto originale.
Skaperen,

@Nils Non sono un esperto, ma se esaurisci la cache, non verrebbe scritto per scambiare e rileggere da lì? Se quello fosse pieno, probabilmente un processo verrebbe bloccato prima che potesse togliere la memoria da un altro processo che lo sta già utilizzando.
Joe,

@Joe no - anche lo swap è ariete. Skaperen descrive cosa succede: l'handle del file viene mantenuto intatto. Quindi, in sostanza, il programma ha una sola particella nella vecchia libreria (scomparsa), che non verrà eliminata fino a quando quell'handle non sarà di nuovo libero - questo è tutto a livello di filesystem - non a livello di RAM.
Nils,

4

Sì, ciò che hai descritto è possibile, ma la maggior parte delle volte se il file è incluso nel pacchetto, sarà una libreria o un altro file che verrà letto una volta e una sola volta (poiché non cambia, non c'è motivo di leggilo più volte). Inoltre, se il file è necessario a lungo termine, l'applicazione probabilmente lascerà aperto l'handle del file, in cui anche se verrà sostituito sul file system effettivo, l'handle del file aperto manterrà aperta la vecchia versione.

Nella maggior parte dei casi, tutti i dati letti più volte durante la vita del processo sono dati utente / variabili e ciò non cambierebbe durante l'aggiornamento del pacchetto. Inoltre, poiché i dati sono variabili, qualsiasi programmatore nella loro mente corretta si assicurerebbe che il programma sia in grado di gestirlo cambiando da una lettura all'altra.


Il file può ancora essere riletto come "archivio di backup" se la mappatura di esso non ha apportato modifiche alla memoria (che altrimenti sposterebbe l'archivio di backup in caso di scambio se disponibile) e la copia in memoria viene scartata a causa di altre pressioni richieste da utilizzare memoria. Ma questo non è un problema perché il file originale è ancora aperto o mappato. La libreria sostitutiva è un file nuovo e diverso che il vecchio processo non ha aperto.
Skaperen,

1
@Skaperen Suppongo che tu stia parlando di file mappati in memoria. Questi non sono problemi durante l'aggiornamento dei pacchetti. Tutti i gestori di pacchetti creano nuovi file per sostituire quelli vecchi invece di sovrascriverli. In realtà questo è l'unico modo per farlo poiché un eseguibile in esecuzione non può essere modificato, può solo essere scollegato.
Patrick,

4

Supponiamo che "B" sia stata sostituita anche sul filesystem. Ora "A" deve leggere di nuovo "B" per qualche motivo. La domanda è: è possibile che "A" possa trovare una versione incompatibile di "B" e crash o malfunzionamento in qualche altro modo?

Questo è possibile, ma è improbabile nella maggior parte dei casi. Se "B" è una libreria di codici, la versione originale non verrebbe normalmente chiusa. "A" continuerà a utilizzare la versione originale di "B". Se si esegue "A" dopo l'aggiornamento, verrà utilizzata la nuova versione di "B". Durante l'aggiornamento, esiste il rischio che vengano caricate versioni incompatibili. Tuttavia, a causa del modo in cui vengono caricate le librerie di codici, questo dovrebbe essere un problema solo se "A" necessita di funzionalità non presenti nelle versioni di "B" caricate.

Le buone pratiche di codifica mantengono l'interfaccia allo stesso modo. Di conseguenza, non importa molto quale versione è caricata, a parte se ci fossero bug corretti nella versione più recente.

I file di configurazione sono leggermente diversi, ma di solito vengono letti all'avvio. In questo caso, "A" non legge "B" a meno che non venga modificato un ricaricamento della configurazione. Ancora una volta, sarebbe una cattiva pratica di codifica cambiare il formato o il significato del file di configurazione. Una versione incompatibile del file di configurazione dovrebbe avere un nome diverso, quindi non causerebbe un problema.

Perché nessuno aggiorna i propri sistemi riavviando con un CD live o una procedura simile?

L'arresto e il riavvio da una versione diversa porterebbe a un'interruzione del servizio. Per i server, questo non è generalmente desiderato. In ogni caso, il gestore pacchetti sul sistema in esecuzione è a conoscenza del software e delle versioni installate. I CD live hanno un proprio elenco di software installati, possibilmente con versioni diverse. Ciò rende difficile aggiornare in modo affidabile il sistema in esecuzione dal CD live.

I CD live vengono talvolta utilizzati quando viene installata una nuova versione dell'O / S. In questo caso, di solito viene eseguita un'installazione pulita dell'O / S. Ciò può limitare la quantità di file non utilizzati dalla versione precedente mantenuta. Può essere più impegnativo che aggiornare il sistema live. Tuttavia, se si utilizzano partizioni di root diverse, è possibile limitare il rischio di rimanere bloccati con un sistema parzialmente aggiornabile non avviabile.


0

Ci sono alcuni casi in cui questo è un problema:

  • Aggiornamento di JDK mentre una java-VM è in esecuzione: ho posto a myselv la stessa domanda che hai fatto: avevo un tomcat in esecuzione che utilizza java. Ora, dopo un aggiornamento di patch del JDK, continuava a funzionare senza problemi, quindi sembrava.

Ora la spiegazione è cache-memory. OK - Ho avviato un programma di memoria per utilizzare tutta la RAM disponibile - e quindi Tomcat si è arrestato in modo anomalo (dopo aver eseguito l'accesso all'application).

  • Aggiornamento del kernel su sistemi SuSE: Su SuSE il vecchio kernel e i suoi moduli vengono cancellati subito dopo l'aggiornamento della patch del kernel. Se poi vuoi usare qualcosa di nuovo, che richiede un modulo kernel, che non è stato caricato fino ad ora, il servizio fallirà.

2
Sembra che alcuni pezzi di Tomcat siano stati riavviati o che siano state utilizzate librerie dinamiche al di sotto del livello Java (ad esempio dlopen () e simili) che potrebbero finire con un mix di API live.
Skaperen,

@Skaperen anche quando si usano librerie condivise - se si chiudono dopo l'uso qualsiasi programma dovrebbe avere problemi se la cache si sta esaurendo ...
Nils

1
Un descrittore di file aperto ha lo stesso potere di conservare i dati sul disco come un nome per il file in una directory. L'inode originale non verrà cancellato fintanto che esiste un hard-link sul disco o un descrittore di file aperto. La cache non ha nulla a che fare con esso. Ora, alcuni programmi chiudono i loro descrittori di file quando non li usano e questo può lasciare andare i dati.
dmckee,

@dmckee Right. Ci stiamo avvicinando al nocciolo. Quindi cosa è normale per un programma "normale": aprire la libreria e tenerla aperta, oppure caricare la libreria e chiuderla in seguito?
Nils,
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.