Bagaimana saya bisa mengembalikan file konfigurasi ke versi yang diinstal sebelumnya setelah saya mengeditnya?

24

Saya ingin mengembalikan file /etc/ke bentuk semula yang diinstal. Saya telah mengedit file sejak diinstal. Bagaimana saya bisa mengembalikan file konfigurasi ini? Apt cukup pintar untuk tidak menimpa file konfigurasi yang diedit, jadi bagaimana saya mengatakannya bahwa saya ingin melakukannya?

Demi argumen, katakanlah saya ingin mengembalikan file /etc/foo.confdari paket foo.

Ryan C. Thompson
sumber
2
Untuk semua yang menyarankan pembersihan dan instal ulang foo, bagaimana jika bartergantung foodan saya tidak ingin menghapus bar?
Ryan C. Thompson

Jawaban:

15

Jawaban yang diberikan oleh Ryan Thomson mengarah ke jalan yang benar. Tetap tidak akan bisa melakukan pekerjaan (Alasan detail diberikan di bawah).

Cara yang benar (dan termudah) untuk melakukannya adalah -odengan menggunakan aptuntuk melewatkan opsi dpkg dan memaksa dpkguntuk bertanya kepada Anda apakah Anda ingin mempertahankan file konfigurasi yang diubah atau yang asli. Perintahnya akan seperti ini -

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

Ini akan mengajukan pertanyaan seperti

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] ? 

Anda harus menekan Y atau I untuk menginstal file konfigurasi asli pengelola paket. Anda bahkan dapat menekan D untuk melihat perubahan apa atau memulai shell root dengan opsi Z untuk memperbaiki diri Anda.

Catatan: Setelah penggantian, Anda akan menemukan file yang dimodifikasi sebagaiat /etc/foo/foo.conf.dpkg-old


Mengapa opsi lain tidak berfungsi?

Karena opsi lain dalam dpkg tidak berfungsi dengan baik. Opsi yang berhubungan dengan file konfigurasi paket adalah

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

--force-confmisstidak akan berfungsi ketika versi paket tidak berubah. Dari halaman manual

Jika sebuah conffile telah dimodifikasi dan versi dalam paket memang berubah, selalu instal versi baru tanpa diminta , kecuali --force-confdef juga ditentukan, dalam hal ini tindakan default lebih disukai.

--force-confmissbekerja dengan conffiles yang hilang. Itu juga akan gagal ketika versi tidak berubah. Mengutip halaman manual

confmiss: Jika sebuah conffile hilang dan versi dalam paket memang berubah, selalu instal conffile yang hilang tanpa diminta. Ini berbahaya, karena itu berarti tidak mempertahankan perubahan (menghapus) yang dilakukan pada file

--force-confoldakan mempertahankan versi yang dimodifikasi hanya jika versi tersebut diubah . Untuk paket yang sama, itu juga akan gagal. Mengutip halaman manual

confold: Jika sebuah conffile telah dimodifikasi dan versi dalam paket memang berubah, selalu pertahankan versi yang lama tanpa diminta , kecuali --force-confdef juga ditentukan, dalam hal ini tindakan default lebih disukai.

--force-confdefjuga akan gagal karena tindakan default adalah untuk mempertahankan file yang lebih lama (Diindikasikan dari pesan yang ditunjukkan dengan --force-confask. Ini memiliki garis (Y/I/N/O/D/Z) [default=N]yang berarti mempertahankan adalah default. Lihat di atas). Dan jika --force-confnewditentukan tetapi versi tidak berubah, itu juga tidak akan berfungsi. Mengutip halaman manual

confdef: Jika sebuah conffile telah dimodifikasi dan versi dalam paket memang berubah, selalu pilih aksi default tanpa diminta. Jika tidak ada tindakan standar, ia akan berhenti bertanya kepada pengguna kecuali --force-confnew atau --force-confold juga diberikan, dalam hal ini ia akan menggunakannya untuk memutuskan tindakan final.

Hanya --force-confaskakan berfungsi, karena itu akan secara eksplisit mengajukan pertanyaan kepada Anda bahkan ketika versinya sama. Mengutip halaman manual

confask: Jika sebuah conffile telah dimodifikasi selalu menawarkan untuk menggantinya dengan versi dalam paket, bahkan jika versi dalam paket tidak berubah (sejak dpkg 1.15.8). Jika salah satu dari - force-confmiss , --force-confnew , --force-confold , atau --force-confdef juga diberikan, itu akan digunakan untuk memutuskan tindakan akhir.

Semoga itu bisa membantu.

Anwar
sumber
Jawaban Anda sangat komprehensif, terima kasih. Apakah mungkin untuk menjawab pertanyaan dengan "y" secara otomatis, yaitu secara efektif --force-confnew? Saya mencoba apt-get […] -y, tetapi itu tidak berhasil. (Jika tidak memungkinkan, harap edit juga jawaban untuk mengatakannya.)
Tim Landscheidt
@TimLandscheidt Anda bertanya apakah mungkin untuk digunakan --force-confnewtanpa bertanya? Saya pikir itu adalah kasus default, yang berarti akan mempertahankan perubahan Anda. --force-confaskmembuat aptselalu mengajukan pertanyaan, jika tidak, Anda akan menggunakan opsi lain jika Anda sudah tahu jawabannya.
Anwar
1
Ha, saya telah mencoba -o Dpkg::Options::=--force-confnewtidak berhasil (seperti jawaban Anda diprediksi) dan tidak membaca pesan kesalahan ketika saya mencoba -o Dpkg::Options::="--force-confask --force-confnew". Namun, apt-get --reinstall -o Dpkg::Options::=--force-confask -o Dpkg::Options::=--force-confnew install $packagedengan benar menimpa perubahan file konfigurasi $package. Terima kasih!
Tim Landscheidt
12

Jika kerusakan sudah terjadi, berikut adalah cara baris perintah untuk mendapatkan kembali versi resmi file konfigurasi. Pertama, unduh file paket (baik dengan apt-get --download-onlyseperti di bawah ini, atau dari halaman paket di packages.ubuntu.com ), kemudian ekstrak isinya di lokasi sementara. Anda kemudian dapat menyalin file ke /etc. Pastikan untuk menghormati izin asli (sebagian besar file /etcdimiliki oleh root dan mode 644 (yaitu kata-readable dan root-dapat ditulis), tetapi setiap pengecualian ada karena alasan penting).

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

Perhatikan bahwa ini tidak berlaku untuk file konfigurasi yang bukan dari paket, seperti /etc/fstabatau /etc/passwd. Jika Anda kehilangan ini, Anda sendirian. (Lagipula sebagian besar sangat bergantung pada sistem.)


Untuk masa depan, saya sarankan menggunakan etckeeper Instal dllkeeper . Instal paket dan jalankan sudo etckeeper init. Ini mengatur kontrol versi untuk semua file di /etc. Anda tidak perlu melakukan hal lain untuk mengelola dllkeeper; Anda hanya perlu berinteraksi dengannya ketika ingin melakukan operasi kontrol versi, seperti merujuk ke file yang lebih lama. File secara otomatis dilakukan sebelum dan setelah setiap menjalankan apt dan setiap malam (ini dapat dikonfigurasi).

Secara default, di Ubuntu, dllkeeper menggunakan Bazaar . Ubah pengaturan /etc/etckeeper/etckeeper.confsebelum menjalankan etckeeper initjika Anda lebih suka Darcs, Git atau Mercury.

Dengan Bazaar, untuk kembali /etc/foo.confke versi terakhir yang berkomitmen:

cd /etc
sudo bzr revert foo.conf

Jika Anda ingin kembali lebih jauh dalam waktu, gunakan sudo bzr log foo.confuntuk melihat riwayat file, dan sudo bzr revert -r 42 foo.confjika Anda telah menentukan bahwa itu revno: 42adalah revisi yang ingin Anda kembalikan.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
7

Anda dapat mengunduh paket secara manual dari paket.ubuntu.com , mengekstrak file dan mengganti versinya dengan itu.

Atau Anda bisa:

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

Yang kedua terasa jauh lebih brutal. Mungkin menghapus konfigurasi lain juga jika menggunakan lebih dari satu file. Yang pertama lebih banyak mengklik dan usaha tetapi tampaknya jauh lebih aman.

Untuk yang kedua, Anda mungkin bisa menghapus file dan --reinstall mungkin menggantinya. Jika demikian, itu akan lebih aman.

Oli
sumber
2
Tidak, menghapus file konfigurasi dianggap sebagai modifikasi yang valid, dan disimpan oleh apt.
Ryan C. Thompson
Apakah mungkin untuk membersihkan dan menginstal ulang paket jika paket lain yang diinstal bergantung padanya?
Ryan C. Thompson
@RyanThompson Ya, apt-get --reinstall purge packagetidak akan melukai tanggungan.
Oli
Sayangnya itu tidak berhasil.
Anwar
1

Bergantung pada paketnya, Anda mungkin menemukan file konfigurasi default di /usr/share/doc/foo/examples.

misterben
sumber
0

Gunakan Synaptic (tweak Ubuntu bahkan lebih mudah tetapi synaptic lebih lurus ke depan) dan pilih "sepenuhnya hapus paket". Ini akan menghapus semua file konfigurasi (Anda mungkin ingin membuat cadangan file-file ini!).

Kemudian pasang kembali. Kamu sudah selesai.

Dengan Ubuntu Tweak Anda mendapatkan lebih banyak opsi untuk pembersihan, rerolling, dan cadangan konfigurasi. Mungkin Anda ingin melihatnya. Ada di softwarecenter.

ps: Synaptic juga menggunakan opsi "pembersihan" (seperti disebutkan oleh Oli di atas ...) - hanya dengan GUI untuk penanganan yang lebih nyaman.

piedro
sumber
Paket apa yang menghapus file di direktori home Anda ketika Anda menghapusnya? Saya akan menganggap ini bug besar!
Gilles 'SO- stop being evil'
@Gilles: Anda benar. Pengaturan pribadi dalam direktori home Anda tidak akan disentuh dengan pembersihan. Saya mengedit dan memperbaiki hal di atas. sry
piedro
Membersihkan paket mungkin bukan opsi jika orang lain bergantung padanya.
Ryan C. Thompson
0

Saya akhirnya menemukan jawaban yang saya ingat samar-samar dari tahun lalu:

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

Argumen "confnew" memaksa dpkg untuk mengganti file config yang dimodifikasi dengan yang disediakan oleh paket, dan "confmiss" juga melakukan hal yang sama dengan file config yang telah dihapus.

Menurut chatlog ini , Anda juga dapat menggunakan opsi ini melalui apt-get dengan cara berikut:

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

yang menyelamatkan Anda dari kebutuhan untuk menemukan file deb sendiri.

Jelas, opsi-opsi ini berbahaya dan berpotensi melenyapkan file konfigurasi sistem yang penting jika disalahgunakan.

Ryan C. Thompson
sumber
Masalahnya --force-confnewadalah ia hanya akan menginstal file konfigurasi baru jika versinya berubah. Jika Anda menginstal ulang versi yang sama, itu tidak akan menginstal file konfigurasi baru karena saya telah mengujinya secara eksplisit
Anwar
Dan --force-confmisshanya akan menginstal file konfigurasi baru jika versi diubah dan konfigurasi hilang. Seperti yang dijelaskan dalam halaman manualconfmiss: 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