Come posso ripristinare un file di configurazione alla versione installata originariamente dopo averlo modificato?


24

Voglio ripristinare un file nella /etc/sua forma originariamente installata. Ho modificato il file da quando è stato installato. Come posso ripristinare questo file di configurazione? Apt è abbastanza intelligente da non sovrascrivere i file di configurazione modificati, quindi come posso dirlo che voglio che lo faccia?

Per l'argomento, diciamo che voglio ripristinare il file /etc/foo.confdal pacchetto foo.


2
Per tutti coloro che suggeriscono di eliminare e reinstallare foo, cosa succede se bardipende fooe non desidero rimuovere bar?
Ryan C. Thompson,

Risposte:


15

La risposta fornita da Ryan Thomson stava andando nella direzione giusta. Tuttavia non sarebbe in grado di svolgere il lavoro (il motivo dettagliato è riportato di seguito).

Il modo corretto (e più semplice) per farlo è usare -owith aptper passare l'opzione dpkg e forzare dpkga chiederti se vuoi conservare i file di configurazione modificati o quelli originali. Il comando sarà così:

sudo apt-get --reinstall -o Dpkg::Options::="--force-confask" install foo

Questo ti farebbe una domanda del genere

Configuration file '/etc/foo/foo.conf'
 ==> Modified (by you or by a script) since installation.
     Version in package is the same as at last installation.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** foo.conf (Y/I/N/O/D/Z) [default=N] ? 

Devi premere Y o I per installare il file di configurazione originale del manutentore del pacchetto. Puoi anche premere D per vedere quali sono le modifiche o avviare una shell di root con l'opzione Z per sistemarti.

Nota: dopo la sostituzione, troverai il tuo file modificato comeat /etc/foo/foo.conf.dpkg-old


Perché altre opzioni non funzionerebbero?

Perché le altre opzioni in dpkg non funzionano bene. Le opzioni che si occupano dei file di configurazione di un pacchetto sono

  • --force-confmiss
  • --force-confnew
  • --force-confold
  • --force-confdef

--force-confmissnon funzionerebbe quando la versione del pacchetto non cambia. Dalla pagina man

Se un conffile è stato modificato e la versione nel pacchetto è cambiata, installare sempre la nuova versione senza chiedere conferma , a meno che non venga specificato anche --force-confdef , nel qual caso si preferisce l'azione predefinita.

--force-confmissfunziona con i conffile mancanti. Anche fallirà quando la versione non è cambiata. Citando la pagina di manuale

confmiss: se manca un conffile e la versione nel pacchetto è cambiata, installare sempre il conffile mancante senza chiedere conferma. Questo è pericoloso, poiché significa non conservare una modifica (rimozione) apportata al file

--force-confoldmanterrà la versione modificata solo se la versione è cambiata . Anche per lo stesso pacchetto fallirà. Citando la pagina di manuale

confold: se un conffile è stato modificato e la versione nel pacchetto è cambiata, mantenere sempre la versione precedente senza chiedere conferma , a meno che non venga specificato anche --force-confdef , nel qual caso si preferisce l'azione predefinita.

--force-confdeffallirà anche perché l'azione predefinita è quella di conservare il file più vecchio (indicato dal messaggio mostrato con --force-confask. Ha una riga (Y/I/N/O/D/Z) [default=N]che significa che il mantenimento è predefinito. Vedi sopra). E se --force-confnewviene specificato ma la versione non cambia, anche quella non funzionerà. Citando la pagina di manuale

confdef: se un conffile è stato modificato e la versione nel pacchetto è cambiata, scegliere sempre l'azione predefinita senza richiedere conferma. Se non vi è alcuna azione predefinita, si interromperà a chiedere all'utente a meno che non sia stato fornito anche --force-confnew o --force-confold , nel qual caso lo utilizzerà per decidere l'azione finale.

Funzionerà solo --force-confask, perché ti farà esplicitamente la domanda anche quando la versione è la stessa. Citando la pagina di manuale

confask: se un conffile è stato modificato, offri sempre di sostituirlo con la versione nel pacchetto, anche se la versione nel pacchetto non è cambiata (da dpkg 1.15.8). Se viene fornito anche uno di --force-confmiss , --force-confnew , --force-confold o --force-confdef , verrà utilizzato per decidere l'azione finale.

Spero che possa aiutare.


La tua risposta è stata molto completa, grazie. È anche possibile rispondere automaticamente alla domanda con "y", ovvero efficacemente --force-confnew? Ci ho provato apt-get […] -y, ma non ha funzionato. (Se non è possibile, modifica anche la risposta per dirlo.)
Tim Landscheidt,

@TimLandscheidt stai chiedendo se è possibile utilizzare --force-confnewsenza chiedere? Penso che sia il caso predefinito, il che significa che manterrà le tue modifiche. --force-confaskfa aptsempre porre la domanda, altrimenti, useresti altre opzioni se conosci già la risposta.
Anwar,

1
Ah, ho provato -o Dpkg::Options::=--force-confnewsenza successo (come previsto dalla tua risposta) e non ho letto il messaggio di errore quando ho provato -o Dpkg::Options::="--force-confask --force-confnew". Tuttavia, apt-get --reinstall -o Dpkg::Options::=--force-confask -o Dpkg::Options::=--force-confnew install $packagesovrascrivere correttamente i file di configurazione della modifica di $package. Grazie!
Tim Landscheidt, il

12

Se il danno è già stato fatto, ecco un modo da riga di comando per recuperare la versione ufficiale del file di configurazione. Innanzitutto, scarica il file del pacchetto (con apt-get --download-onlycome sotto, o dalla pagina del pacchetto su pacchetti.ubuntu.com ), quindi estrai il suo contenuto in una posizione temporanea. È quindi possibile copiare il file in /etc. Assicurati di rispettare le autorizzazioni originali (la maggior parte dei file /etcsono di proprietà di root e mode 644 (ovvero leggibili da una parola e scrivibili da root), ma ogni eccezione è presente per un motivo importante).

sudo apt-get --download-only --reinstall install foo
mkdir /tmp/foo
dpkg-deb -x /var/cache/apt/archives/foo_VERSION_ARCH.deb /tmp/foo

Si noti che ciò non si applica ai file di configurazione che non provengono da un pacchetto, come /etc/fstabo /etc/passwd. Se li perdi, sei da solo. (La maggior parte dipende comunque dal sistema.)


Per il futuro, ti consiglio di usare etckeeper Installa etckeeper . Installa il pacchetto ed esegui sudo etckeeper init. Questo imposta il controllo versione per tutti i file in /etc. Non è necessario fare nient'altro per gestire etckeeper; devi solo interagire con esso quando desideri eseguire un'operazione di controllo della versione, ad esempio facendo riferimento a file più vecchi. I file vengono automaticamente salvati prima e dopo ogni esecuzione di apt e ogni notte (questo è configurabile).

Di default, su Ubuntu, etckeeper usa Bazaar . Cambia l'impostazione /etc/etckeeper/etckeeper.confprima di correre etckeeper initse preferisci Darcs, Git o Mercury.

Con Bazaar, per tornare /etc/foo.confall'ultima versione impegnata:

cd /etc
sudo bzr revert foo.conf

Se si desidera tornare indietro nel tempo, utilizzare sudo bzr log foo.confper visualizzare la cronologia del file e sudo bzr revert -r 42 foo.confse si è determinato che revno: 42è la revisione che si desidera ripristinare.


7

È possibile scaricare il pacchetto manualmente da packages.ubuntu.com , estrarre il file e sostituire la versione con esso.

Oppure potresti:

sudo rm /etc/foo.conf # just for good measure
sudo apt-get --purge --reinstall install foo

Il secondo sembra molto più brutale. Potrebbe cancellare anche altre configurazioni se utilizza più di un file. Il primo è più clic e sforzo, ma sembra molto più sicuro.

Per il secondo, potresti essere in grado di eliminare il file e --reinstall potrebbe sostituirlo. In tal caso, sarebbe più sicuro.


2
No, l'eliminazione di un file di configurazione è considerata una modifica valida ed è conservata da apt.
Ryan C. Thompson,

È possibile eliminare e reinstallare un pacchetto se altri pacchetti installati dipendono da esso?
Ryan C. Thompson,

@RyanThompson Sì, apt-get --reinstall purge packagenon farà male ai dipendenti.
Oli

Sfortunatamente non funziona.
Anwar,

1

A seconda del pacchetto, è possibile trovare un file di configurazione predefinito in /usr/share/doc/foo/examples.


0

Usa Synaptic (Ubuntu tweak è ancora più conveniente ma synaptic è più semplice) e scegli "rimuovi completamente il pacchetto". Questo eliminerà tutti i file di configurazione (potresti voler eseguire il backup di questi file!).

Quindi reinstallare. Hai finito.

Con Ubuntu Tweak hai ancora più opzioni per la pulizia, il rilancio e i backup di configurazione. Forse vuoi dargli un'occhiata. È nel centro software.

ps: Synaptic utilizza anche l'opzione "elimina" (come menzionato da Oli sopra ...) - solo con una GUI per una gestione più confortevole.


Quale pacchetto rimuove i file nella tua home directory quando lo rimuovi? Lo considererei un grave errore!
Gilles 'SO- smetti di essere malvagio' l'

@Gilles: hai ragione. Le impostazioni personali nella home directory non verranno toccate dall'eliminazione. Ho modificato e corretto quanto sopra. sry
piedro,

L'eliminazione del pacchetto potrebbe non essere un'opzione se altri dipendono da esso.
Ryan C. Thompson,

0

Alla fine ho trovato la risposta che ricordavo vagamente da anni fa:

dpkg --force-confnew --force-confmiss -i PACKAGE.deb

L'argomento "confnew" impone a dpkg di sostituire i file di configurazione modificati con quelli forniti dal pacchetto e "confmiss" fa altrettanto con i file di configurazione che sono stati eliminati.

Secondo questo chatlog , puoi anche usare queste opzioni tramite apt-get nel modo seguente:

apt-get -o DPkg::Options::="--force-confnew --force-confmiss" --reinstall install PACKAGE

che ti salva dalla necessità di trovare tu stesso il file deb.

Ovviamente, queste opzioni sono pericolose e hanno il potenziale di eliminare importanti file di configurazione del sistema se utilizzate in modo improprio.


Il problema --force-confnewè che installerà nuovi file di configurazione solo se la versione è cambiata. Se stai reinstallando la stessa versione, non installerà il nuovo file di configurazione poiché l'ho testato esplicitamente
Anwar,

E --force-confmissinstallerà il nuovo file di configurazione solo se la versione è cambiata e manca la configurazione. Come descritto nella pagina manconfmiss: If a conffile is missing and the version in the package did change, always install the missing conffile without prompting. This is dangerous, since it means not preserving a change (removing) made to the file.
Anwar,
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.