當前位置: 首頁>>技術教程>>正文


configuration – 編輯完配置文件後,如何將其恢複為最初安裝的版本?

,

問題描述

我想將 /etc/ 中的文件恢複為其 originally-installed 形式。自安裝以來,我已經編輯了該文件。我怎樣才能恢複這個配置文件? Apt 足夠聰明,不會覆蓋編輯過的配置文件,那麽我如何告訴它我希望它這樣做呢?

為了論證,假設我想從 foo 包中恢複文件 /etc/foo.conf

最佳思路

由 Ryan Thomson 提供的 The answer 正朝著正確的方向前進。它仍然無法完成這項工作(詳細原因如下)。

正確(也是最簡單)的方法是使用 -oapt 來傳遞 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 選項啟動 root shell 來修複自己。

注意:替換後,您會發現修改後的文件為 at /etc/foo/foo.conf.dpkg-old


為什麽其他選項不起作用?

因為 dpkg 中的其他選項效果不佳。處理包的配置文件的選項是

  • --force-confmiss

  • --force-confnew

  • --force-confold

  • --force-confdef

--force-confmiss 在包版本不變時不起作用。從 man-page

If a conffile has been modified and the version in the package did change, always install the new version without prompting, unless the –force-confdef is also specified, in which case the default action is preferred.

--force-confmiss 適用於缺少的配置文件。當版本沒有改變時,它也會失敗。引用 man-page

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

--force-confold 隻有在版本發生變化時才會保留修改後的版本。對於同一個包,它也會失敗。引用 man-page

confold: If a conffile has been modified and the version in the package did change, always keep the old version without prompting, unless the –force-confdef is also specified, in which case the default action is preferred.

--force-confdef 也將失敗,因為默認操作是保留舊文件(從 --force-confask 顯示的消息中指示。它有 (Y/I/N/O/D/Z) [default=N] 行,這意味著保留是默認值。見上文)。如果指定了 --force-confnew 但版本沒有改變,那也不起作用。引用 man-page

confdef: If a conffile has been modified and the version in the package did change, always choose the default action without prompting. If there is no default action it will stop to ask the user unless –force-confnew or –force-confold is also been given, in which case it will use that to decide the final action.

隻有 --force-confask 可以工作,因為即使版本相同,它也會明確地問你這個問題。引用 man-page

confask: If a conffile has been modified always offer to replace it with the version in the package, even if the version in the package did not change (since dpkg 1.15.8). If any of –force-confmiss, –force-confnew, –force-confold, or –force-confdef is also given, it will be used to decide the final action.

希望這會有所幫助。

次佳思路

如果危害已經造成,這裏有一個命令行方式獲取配置文件的正式版本。首先,下載包文件(使用 apt-get --download-only 如下,或從 packages.ubuntu.com 上的包頁麵),然後在臨時位置提取其內容。然後,您可以將該文件複製到 /etc 中。確保尊重原始權限(/etc 中的大多數文件由 root 和模式 644(即 word-readable 和 root-writable)擁有,但每個例外都有一個重要原因)。

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 。如果你失去了這些,你就靠自己了。 (無論如何,大多數都是非常 system-dependent。)


對於未來,我建議使用 etckeeper 。安裝包並運行 sudo etckeeper init 。這將為 /etc 中的所有文件設置版本控製。你不需要做任何其他事情來管理 etckeeper;你隻需要在你想做版本控製操作時才需要和它交互,比如引用舊文件。每次運行 apt 之前和之後,每晚都會自動提交文件(這是可配置的)。

默認情況下,在 Ubuntu 上,etckeeper 使用 Bazaar 。如果您更喜歡 Darcs、Git 或 Mercury,請在運行 etckeeper init 之前更改 /etc/etckeeper/etckeeper.conf 中的設置。

使用 Bazaar,將 /etc/foo.conf 恢複到最後提交的版本:

cd /etc
sudo bzr revert foo.conf

如果您想回到更遠的時間,請使用 sudo bzr log foo.conf 查看文件的曆史記錄,如果您確定 revno: 42 是您要恢複到的修訂,請使用 sudo bzr revert -r 42 foo.conf

第三種思路

您可以從 packages.ubuntu.com 手動下載軟件包,解壓縮文件並用它替換您的版本。

或者你可以:

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

第二個感覺更野蠻。如果它使用多個文件,它也可能會清除其他配置。第一個是更多的點擊和努力,但它似乎更安全。

第二,您可以刪除該文件,而 –reinstall 可能會替換它。如果是這樣,那就更安全了。

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/12147.html,未經允許,請勿轉載。