通常、アプリケーションパッケージを介して更新するとき、yum update
rpmは「賢い」私に対する尊敬は十分です/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設定ファイルのみが表示されます。
答え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-completions
RHEL以外のシステムにのみ適用されます。
%if ! 0%{?rhel}
# we don't have this in rhel yet...
BuildRequires: bash-completion
%endif
dirnameに導入された変更は次のとおりです。yumメーリングリストについて話し合う:
パッケージは $(compdir) の親項目でもあります (もし備えて理由は不明)。
はじめに条件付き論理も議論される。:
ああ、完成したディレクトリをハードコードするよりも、「pkg-config --variable=completionsdir bash-completion」からインポートする方が良いでしょう。
仕様変更
dirname
1つの回避策は、呼び出しを正しい条件付き分岐に移動することです。たとえば、次のようになります。
--- 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-completion
bash-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