yumパッケージアップデートがyum-cron設定ファイルを置き換えるのはなぜですか?

yumパッケージアップデートがyum-cron設定ファイルを置き換えるのはなぜですか?

通常、アプリケーションパッケージを介して更新するとき、yum updaterpmは「賢い」私に対する尊敬は十分です/etc

(それオリジナルmtimeを表示して比較したら、結果に応じてファイルを新しいバージョンに置き換えるか、新しいバージョンを横に配置します。 )

しかし、Centos 7の最後のyum / yum-cronアップデートの1つとして、私のカスタムyum-cron設定ファイルが置き換えられました。

/etc/yum/yum-cron.conf
/etc/yum/yum-cron-hourly.conf

今、なぜこれが起こるのか知りたいです。

私の言葉は、答えはソースパッケージになければなりませんが、そこには見つからないという意味です。

$ rpm -qi yum-cron | grep src
Source RPM  : yum-3.4.3-132.el7.centos.0.1.src.rpm
$ yumdownloader --source yum-3.4.3-132.el7.centos.0.1
$ grep '%.*yum-cron.*\.conf' yum.spec
%config(noreplace) %{_sysconfdir}/yum/yum-cron.conf
%config(noreplace) %{_sysconfdir}/yum/yum-cron-hourly.conf

仕様ファイルを見ると、yum-cronセクションの設定ディレクティブにnoreplace指定されました。

一方、設定ファイルの所有権はバイナリパッケージ間でyum共有されているようですyum-cron

$ rpm -ql yum-cron | grep 'yum-cron.*\.conf'
/etc/yum/yum-cron-hourly.conf
/etc/yum/yum-cron.conf
$ rpm -ql yum | grep 'yum-cron.*\.conf' 
/etc/yum/yum-cron-hourly.conf
/etc/yum/yum-cron.conf

どうですか?

つまり、仕様ファイルのcron固有のファイルセクションに記載されているyum-cron設定ファイルのみが表示されます。

また見てくださいCentOSの問題そしてRHELの問題この点について。

答え1

これはRed Hatがパッケージを作成する方法に問題があります。ファイルはyum-cron.conf構成ファイルとして表示される必要があります(出力結果とは対照的に)、そうではありません(インストールされたパッケージの構成ファイルを照会しても文書はリストされませんyum-cron.conf)。実際の答え、おそらくより便利な答えは、RHに問題を解決させることですchattr +i。また見なさい:https://serverfault.com/questions/744531/secure-yum-cron-conf-configuration-and-prevent-them-from-getting-auto-updated/744535#744535

答え2

%filesこれは、ファイルの基本セクションの次の行によるものですyum.spec

%(dirname %{compdir})

これは、rpmが最初に置換を実行し%{compdir}てから、dirname結果をシェルの引数として実行することを意味します。これにより、出力がファイルリストに追加されます。

compdir 変数は次のように定義されます。

%define compdir %(pkg-config --variable=completionsdir bash-completion)
%if "%{compdir}" == ""
%define compdir "/etc/bash_completion.d"
%endif

bash-completionビルド時に(ビルドシステムで)インストールを想定すると、次のpkg-configものが返されることがあります。

/usr/share/bash-completion/completions

したがって、追加

dirname /usr/share/bash-completion/completions
-> /usr/share/bash-completion

ファイルリストに移動します(yumパッケージがヘルパープログラム、つまり以下もインストールする場合は意味があります/usr/share/bash-completion/helpers)。

問題となる状況は、bash-completionビルド時にパッケージがインストールされていない場合です。その理由は、pkg-config空の文字列が返されるからです。つまり:

 compdir := /etc/bash_completion.d
 => dirname /etc/bash_completion.d
 -> /etc

/etcしたがって、パッケージのビルドルートにあるディレクトリ全体がファイルリストに繰り返し追加されます。

明らかに、CentOS yumバイナリパッケージをビルドしたボックスにはbash-completionこのパッケージがインストールされていませんでした。実際、RHEL(したがってCentOS)はパッケージも提供しませんbash-completion

これは、これらのファイルがなぜなのかを説明します。

/etc/yum/yum-cron.conf
/etc/yum/yum-cron-hourly.conf

すべてHebaoが所有していyumますyum-cron

(そして包装に正しくラベルを付けるだけですyum-cron。)

付録

条件文の動機は、複数のrpmベースのデプロイメント(Fedora、RHELなどの他のバージョンなど)のyum仕様ファイルを提供することです。したがって、仕様ファイルは条件に基づいてビルドに依存し、bash-completionsRHEL以外のシステムにのみ適用されます。

%if ! 0%{?rhel}
# we don't have this in rhel yet...
BuildRequires: bash-completion
%endif

dirnameに導入された変更は次のとおりです。yumメーリングリストについて話し合う:

パッケージは $(compdir) の親項目でもあります (もし備えて理由は不明)。

はじめに条件付き論理も議論される。:

ああ、完成したディレクトリをハードコードするよりも、「pkg-config --variable=completionsdir bash-completion」からインポートする方が良いでしょう。

仕様変更

dirname1つの回避策は、呼び出しを正しい条件付き分岐に移動することです。たとえば、次のようになります。

--- a/SPECS/yum.spec
+++ b/SPECS/yum.spec
@@ -28,7 +28,7 @@ BuildRequires: bash-completion

 # disable broken /usr/lib/rpm/brp-python-bytecompile
 %define __os_install_post %{nil}
-%define compdir %(pkg-config --variable=completionsdir bash-completion)
+%define compdir %(pkg-config --variable=completionsdir bash-completion | xargs -r dirname)
 %if "%{compdir}" == ""
 %define compdir "/etc/bash_completion.d"
 %endif
@@ -451,7 +451,7 @@ exit 0
 %dir %{_sysconfdir}/yum/fssnap.d
 %dir %{_sysconfdir}/yum/vars
 %config(noreplace) %{_sysconfdir}/logrotate.d/%{name}
-%(dirname %{compdir})
+%{compdir}
 %dir %{_datadir}/yum-cli
 %{_datadir}/yum-cli/*
 %exclude %{_datadir}/yum-cli/completion-helper.py?

答え3

詳細な説明ありがとうマックスシュレプチガーしかし、あなたが提案した修正は正しくありません。これにより、/usr/share/bash-completionbash-completion のインストール時に comdir が設定されます。そこにあるファイルはロードされず、場所を見つける必要があります。これにより、マクロの中核である完了/usr/share/bash-completion/completionsファイルのインストールパスとして常に使用される機能が中断されます。%{compdir}

この問題を解決する最も安全な方法は、明示的に次のことを行うことです。

%if 0%{?fedora} >= 19 || 0%{?rhel} >= 7
%global compdir %{_datadir}/bash-completion/completions
%else
%global compdir %{_sysconfdir}/bash_completion.d
%endif

次に、%filesセクションで次の操作を行います。

%if 0%{?fedora} >= 19 || 0%{?rhel} >= 7
%(dirname %{compdir})
%else
%{compdir}
%endif

関連情報