ファイルを/etc/
元のインストール形式に戻したい。ファイルがインストールされてから編集しました。この構成ファイルを元に戻すにはどうすればよいですか?Aptは、編集された構成ファイルを上書きしないほど賢いので、上書きしたいことをどのように伝えるのですか?
引数のために/etc/foo.conf
、パッケージからファイルを元に戻したいとしましょうfoo
。
ファイルを/etc/
元のインストール形式に戻したい。ファイルがインストールされてから編集しました。この構成ファイルを元に戻すにはどうすればよいですか?Aptは、編集された構成ファイルを上書きしないほど賢いので、上書きしたいことをどのように伝えるのですか?
引数のために/etc/foo.conf
、パッケージからファイルを元に戻したいとしましょうfoo
。
回答:
ライアン・トムソンによって提供された答えは、正しい方法に向かっていた。それでも、それは仕事をすることができません(詳細な理由は以下に与えられます)。
正しい(かつ最も簡単な)方法は、-o
with 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
パッケージのバージョンが変更されない場合は機能しません。マンページから
conffileが変更され、パッケージ内のバージョンが変更された場合、-force-confdefも指定されていない限り、プロンプトなしで常に新しいバージョンをインストール します。この場合、デフォルトのアクションが優先されます。
--force-confmiss
欠落しているconffilesで動作します。バージョンが変更されなかった場合も失敗します。引用のマンページ
confmiss:conffileが欠落しており、パッケージ内のバージョンが変更された場合、プロンプトなしで常に欠落しているconffileをインストールします。これは、ファイルに加えられた変更(削除)を保持しないことを意味するため、危険です。
--force-confold
バージョンが変更された場合にのみ、変更されたバージョンを保持します。同じパッケージの場合、それも失敗します。引用のマンページ
confold:conffileが変更され、パッケージのバージョンが変更 された場合、-force-confdefも指定されていない限り、プロンプトなしで常に古いバージョンを保持 します。この場合、デフォルトのアクションが優先されます。
--force-confdef
また、デフォルトのアクションは古いファイルを保持することであるため失敗します(で示されているメッセージから示され--force-confask
ます(Y/I/N/O/D/Z) [default=N]
。--force-confnew
が指定されていてもバージョンが変わらない場合、それも機能しません。引用のマンページ
confdef:conffileが変更され、パッケージ内のバージョンが変更された場合、プロンプトなしで常にデフォルトのアクションを選択します。デフォルトのアクションがない場合は、-force-confnew または --force-confold も指定されていない限り、ユーザーへの問い合わせを停止します。 この場合、最終アクションを決定するためにそれを使用します。
唯一の--force-confask
バージョンが同じであっても、それは明示的に質問してますので、動作します。引用のマンページ
confask:conffileが変更されている場合、パッケージ内のバージョンが変更されていなくても(dpkg 1.15.8以降)、常にパッケージ内のバージョンに置き換えるように提案します。いずれかの場合は--force-confmiss、--force-confnew、--force-confold、または--force-confdefを も与えられ、最終的に行動を決定するために使用されます。
それが役立つことを願っています。
--force-confnew
ますか?試しましたapt-get […] -y
が、うまくいきませんでした。(それが不可能な場合は、回答を編集してそのように言ってください。)
--force-confnew
なく使用できるかどうかを尋ねていますか?これはデフォルトのケースだと思います。つまり、変更が保持されます。--force-confask
なりapt
、常にあなたはすでに答えを知っていればそうでない場合、あなたは他のオプションを使用すると思い、質問をします。
-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
。ありがとう!
既に問題が発生している場合は、構成ファイルの公式バージョンを取得するコマンドラインの方法を次に示します。まず、パッケージファイルをダウンロードし(apt-get --download-only
次のように、またはpackages.ubuntu.comのパッケージページから)、その内容を一時的な場所に抽出します。その後、ファイルをにコピーできます/etc
。必ず元のアクセス権を尊重してください(ほとんどのファイルは/etc
ルートとモード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の 使用をお勧めします。パッケージをインストールして実行しsudo etckeeper init
ます。これにより、のすべてのファイルのバージョン管理が設定されます/etc
。etckeeperを管理するために他に何もする必要はありません。古いファイルの参照など、バージョン管理操作を行う場合にのみ操作する必要があります。ファイルは、aptの各実行の前後に毎晩自動的にコミットされます(これは構成可能です)。
デフォルトでは、Ubuntuでは、etckeeperはBazaarを使用します。Darcs、Git、またはMercuryを使用/etc/etckeeper/etckeeper.conf
するetckeeper init
場合は、実行する前に設定を変更してください。
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
が元に戻すリビジョンでと。
packages.ubuntu.comからパッケージを手動でダウンロードできます。、ファイルを抽出してバージョンを置き換える。
または次のことができます:
sudo rm /etc/foo.conf # just for good measure
sudo apt-get --purge --reinstall install foo
2番目の方がずっと野bruに感じます。複数のファイルを使用する場合、他の設定も消去される可能性があります。1つ目はより多くのクリックと労力ですが、はるかに安全なようです。
2つ目は、ファイルを削除するだけで--reinstallで置き換えられる場合があります。もしそうなら、それはより安全でしょう。
apt-get --reinstall purge package
依存者を傷つけることはありません。
Synapticを使用し(Ubuntuの調整はさらに便利ですが、synapticはより簡単です)、[パッケージを完全に削除]を選択します。これにより、すべての構成ファイルが削除されます(これらのファイルをバックアップすることをお勧めします!)。
次に再インストールします。できました。
Ubuntu Tweakを使用すると、クリーンアップ、リロール、および構成バックアップのためのさらに多くのオプションを利用できます。たぶん、あなたはそれを見てみたい。それはソフトウェアセンターにあります。
ps:Synapticは、「パージ」オプションも使用します(上記のOliで述べたように...)-より快適な処理のためにGUIを使用しています。
数年前から漠然と覚えていた答えをようやく見つけました。
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
これにより、debファイルを自分で見つける必要がなくなります。
明らかに、これらのオプションは危険であり、誤用されると重要なシステム構成ファイルを吹き飛ばす可能性があります。
--force-confnew
は、バージョンが変更された場合にのみ新しい構成ファイルをインストールすることです。同じバージョンを再インストールする場合、明示的にテストしたため、新しい構成ファイルはインストールされません
--force-confmiss
バージョンが変更され、設定が欠落している場合のみ、新しい設定ファイルをインストールします。manページで説明されているように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.
foo
、もしbar
依存しfoo
、削除したくない場合はどうなりbar
ますか?