Як я можу повернути конфігураційний файл до початково встановленої версії після редагування?


24

Я хочу повернути файл у /etc/його первісно встановлену форму. Я редагував файл з моменту його встановлення. Як я можу відновити цей конфігураційний файл? Apt досить розумний, щоб не перезаписати відредаговані конфігураційні файли, тож як мені сказати, що я хочу це зробити?

Заради аргументу скажімо, що я хочу повернути файл /etc/foo.confз пакету foo.


2
Для всіх тих, хто пропонує очистити та перевстановити foo, що робити, якщо це barзалежить, fooі я не хочу видаляти його bar?
Райан К. Томпсон

Відповіді:


15

Відповідь, яку надав Райан Томсон, спрямовувалась у правильний шлях. Але це все-таки не зможе виконати роботу (детальна причина наведена нижче).

Правильно (і найпростіший) спосіб зробити це використовує -oз , aptщоб передати DPKG опції і змусити dpkgзапитати вас , чи хочете ви , щоб зберегти змінені конфігураційні файли або оригінальні з них. Команда буде такою -

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

Це ставить вам таке питання

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

Вам потрібно натиснути або Y, або I, щоб встановити оригінальний конфігураційний файл сервісного пакета. Ви навіть можете натиснути D, щоб побачити, що зміни, або запустити кореневу оболонку з параметром Z, щоб виправити себе.

Примітка. Після заміни ви знайдете змінений файл якat /etc/foo/foo.conf.dpkg-old


Чому інші варіанти не спрацюють?

Оскільки інші параметри в dpkg працюють не так добре. Параметри, які стосуються файлів конфігурації пакета, є

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

--force-confmissне працює, коли версія пакета не змінюється. З man-сторінки

Якщо conffile було змінено, а версія в пакеті змінилася, завжди встановлюйте нову версію без підказки, якщо не вказано також --force-confdef , і в цьому випадку краща дія за замовчуванням.

--force-confmissпрацює з відсутніми конфілерами. Це також не вдасться, коли версія не змінилася. Цитуючи man-сторінку

confmiss: Якщо conffile відсутній і версія в пакеті змінилася, завжди встановлюйте відсутній conffile, не вимагаючи. Це небезпечно, оскільки означає збереження змін (видалення), внесених у файл

--force-confoldзбереже модифіковану версію, лише якщо її змінено . Для цього ж пакету він також вийде з ладу. Цитуючи man-сторінку

confold: Якщо conffile було змінено і версія в пакеті змінилася, завжди зберігайте стару версію без підказки, якщо не вказано також --force-confdef , і в цьому випадку переважна дія за замовчуванням.

--force-confdefтакож не вдасться, оскільки дією за замовчуванням є збереження старшого файлу (вказується у повідомленні, показаному с --force-confask. У ньому є рядок, (Y/I/N/O/D/Z) [default=N]що означає, що збереження є за замовчуванням. Див. вище). І якщо --force-confnewвказано, але версія не змінюється, це теж не буде працювати. Цитуючи man-сторінку

confdef: Якщо conffile було змінено і версія в пакеті змінилася, завжди вибирайте дію за замовчуванням без підказки. Якщо дії за замовчуванням не буде, він перестане запитувати користувача, якщо не буде вказано також --force-confnew або --force-confold , і в такому випадку він буде використовувати це для вирішення остаточної дії.

Тільки --force-confaskбуде працювати, тому що явно поставить вам питання навіть тоді, коли версія однакова. Цитуючи man-сторінку

confask: Якщо conffile було змінено завжди пропонуйте замінити його на версію в пакеті, навіть якщо версія в пакеті не змінилася (оскільки dpkg 1.15.8). Якщо будь-яке з --force-confmiss , --force-confnew , --force-confold або --force-confdef також надане, воно буде використовуватися для вирішення остаточної дії.

Сподіваюся, що це допоможе.


Ваша відповідь була дуже вичерпною, дякую. Чи можливо також автоматично відповісти на питання "y", тобто ефективно --force-confnew? Я спробував apt-get […] -y, але це не вийшло. (Якщо це неможливо, будь-ласка, відредагуйте відповідь, щоб сказати так.)
Тім Ландшайдт

@TimLandscheidt ви питаєте , якщо це можна використовувати , --force-confnewне питаючи? Я думаю, що це випадок за замовчуванням, а це означає, що він збереже ваші зміни. завжди --force-confaskзмушує aptзадавати питання, інакше ви використовуєте інші варіанти, якщо вже знаєте відповідь.
Анвар

1
Так, я -o Dpkg::Options::=--force-confnewневдало намагався (як передбачала ваша відповідь) і не намагався прочитати повідомлення про помилку, коли я намагався -o Dpkg::Options::="--force-confask --force-confnew". Однак apt-get --reinstall -o Dpkg::Options::=--force-confask -o Dpkg::Options::=--force-confnew install $packageправильно перезаписати конфігураційні файли змін $package. Спасибі!
Тім Ландшайдт

12

Якщо шкода вже заподіяна, ось спосіб командного рядка повернути офіційну версію файлу конфігурації. Спочатку скачайте файл пакету (або apt-get --download-onlyяк зазначено нижче, або зі сторінки пакета на пакунках.ubuntu.com ), після чого витягніть його вміст у тимчасове місце. Потім ви можете скопіювати файл у /etc. Не забудьте дотримуватись оригінальних дозволів (більшість файлів у /etcвласність має root та режим 644 (тобто слова, які читаються на словах та користуються кореневими записами), але кожен виняток є важливою причиною).

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

Зауважте, що це не стосується файлів конфігурації, які не є пакетом, наприклад, /etc/fstabабо /etc/passwd. Якщо ви втратите ці, ви самостійно. (Більшість із них дуже залежать від системи.)


Надалі я рекомендую використовувати etckeeper Встановіть etckeeper . Встановіть пакет і запустіть sudo etckeeper init. Це налаштовує контроль версій для всіх файлів у /etc. Вам не потрібно робити нічого іншого для управління тощо вам потрібно взаємодіяти з ним лише тоді, коли ви хочете зробити операцію контролю версій, наприклад, посилання на більш старі файли. Файли автоматично вводяться до і після кожного запуску влучного і щовечора (це можна настроїти).

За замовчуванням в Ubuntu etckeeper використовує Bazaar . Змініть налаштування /etc/etckeeper/etckeeper.confперед запуском, etckeeper initякщо ви віддаєте перевагу Darcs, Git або Mercury.

З Bazaar, щоб повернутися /etc/foo.confдо останньої версії:

cd /etc
sudo bzr revert foo.conf

Якщо ви хочете повернутися далі у часі, скористайтеся sudo bzr log foo.confдля перегляду історії файлу, і sudo bzr revert -r 42 foo.confякщо ви визначили, що revno: 42це версія, до якої потрібно повернутись.


7

Ви можете завантажити пакет вручну з пакунків.ubuntu.com , витягнути файл і замінити ним свою версію.

Або ви могли:

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

Другий відчуває набагато більше брутальності. Він також може видалити інші конфігурації, якщо він використовує більше одного файлу. Перший - це більше натискання та зусиль, але здається набагато безпечнішим.

По-друге, ви можете просто видалити файл, і --reinstall може замінити його. Якщо так, то це було б безпечніше.


2
Ні, видалення файла конфігурації вважається дійсною модифікацією і зберігається за допомогою apt.
Райан К. Томпсон

Чи можливо очистити та перевстановити пакет, якщо від нього залежать інші встановлені пакети?
Райан К. Томпсон,

@RyanThompson Так, apt-get --reinstall purge packageне зашкодить утриманцям.
Олі

На жаль, це не працює.
Анвар

1

Залежно від пакета, ви можете знайти конфігураційний файл за замовчуванням у /usr/share/doc/foo/examples.


0

Використовуйте Synaptic (налаштування Ubuntu ще зручніше, але синаптик є більш прямим вперед) і виберіть "повністю видалити пакет". Це видалить усі конфігураційні файли (можливо, ви захочете створити резервну копію цих файлів!).

Потім перевстановіть. Ви закінчили.

За допомогою Ubuntu Tweak ви отримуєте ще більше варіантів очищення, перепродажу та налаштування резервних копій. Можливо, ви хочете, щоб це подивилося. Це в програмному центрі.

ps: Synaptic також використовує параметр "очищення" (як, наприклад, згадував Oli вище ...) - просто з графічним інтерфейсом для зручнішого керування.


Який пакет видаляє файли з домашнього каталогу, коли ви видаляєте його? Я вважав би це серйозною помилкою!
Жил 'SO- перестань бути злим'

@Gilles: Ти маєш рацію. Чистка не торкнеться особистих налаштувань у вашому домашньому каталозі. Я відредагував і виправив вищесказане. СРЮ
Piedro

Очищення пакета може не бути варіантом, якщо від нього залежать інші.
Райан К. Томпсон,

0

Нарешті я знайшов відповідь, яку я туманно пам’ятав з років тому:

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

Аргумент "confnew" змушує dpkg замінювати модифіковані конфігураційні файли наданими пакетом, а "confmiss" також аналогічно з файлами конфігурації, які були видалені.

Відповідно до цього чату , ви також можете використовувати ці параметри через apt-get таким чином:

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

що рятує вас від необхідності самостійно знаходити файл деб.

Очевидно, що ці параметри є небезпечними та можуть призвести до того, що при неправильному використанні можуть підірвати важливі файли конфігурації системи.


Проблема --force-confnewполягає в тому, що він буде встановлювати нові конфігураційні файли лише у випадку зміни версії. Якщо ви перевстановлюєте ту саму версію, вона не встановить новий конфігураційний файл, як я його явно перевірив
Anwar

І --force-confmissвстановить новий конфігураційний файл лише в тому випадку, якщо версія змінена і конфігурація відсутня. Як описано на сторінці чоловікаconfmiss: 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.