私はyumリポジトリーをセットアップしており、yum.confファイル内のいくつかのURLをデバッグする必要があります。 Scientific Linuxが別のURLを取得することを期待していたときに、なぜこのURLを取得しようとしているのかを知る必要があります。
# yum install package
http://192.168.1.100/pub/scientific/6.1/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404"
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: sl. Please verify its path and try again
yum.conf(5) マンページには、これらの変数に関するいくつかの情報が記載されています。
変数
Yumの設定ファイルのメンテナンスを容易にするために使用できる変数がいくつかあります。これらは、name、baseurl、およびコマンドを含むいくつかのオプションの値で使用できます。
$ releaseverこれは、distroverpkgにリストされているパッケージのバージョンの値に置き換えられます。これはデフォルトで「redhat-release」パッケージのバージョンになります。
$ Archこれは、Pythonのos.uname()[4]でリストされているアーキテクチャに置き換えられます。
$ basearchこれは、yumのベースアーキテクチャに置き換えられます。たとえば、$ Archがi686の場合、$ basearchはi386になります。
$ YUM0- $ YUM9これらは、同じ名前のシェル環境変数の値に置き換えられます。シェル環境変数が存在しない場合、構成ファイル変数は置き換えられません。
yum
コマンドラインユーティリティを使用してこれらの変数を表示する方法はありますか? 「redhat-release」パッケージのバージョンを探し出さないようにするか、Pythonで手動でos.uname()[4]の値を取得します。
_yum-utils
_をインストールすると、これらの変数とより多くのデバッグ情報をファイルに書き込む_yum-debug-dump
_が得られます。 stdoutに書き込むオプションはありません。常に役立つファイルではないファイルに常に書き込みます。
これは明らかに優れたソリューションではないので、ここにpythonコピーして貼り付けることができる1行のコードを使用して、これらの変数をstdoutに出力します。
python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'
これはCentOS 5および6で機能しますが、4では機能しません。yumはpythonで記述されているため、yum pythonモジュールはすでにサーバー上にあるため、exraをインストールする必要はありません。
CentOS 5では次のようになります。
_[root@somebox]# python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'
{'Arch': 'ia32e',
'basearch': 'x86_64',
'releasever': '5',
'yum0': '200',
'yum5': 'foo'}
[root@somebox]#
_
私と同じように誰かがここで終わる場合に備えて、Fedoraでdnfの同等の答えを探して、次のpython one-liner:
python3 -c 'import dnf, pprint; db = dnf.dnf.Base(); pprint.pprint(db.conf.substitutions,width=1)'
Fedora 24では、次のようになります。
{'Arch': 'x86_64',
'basearch': 'x86_64',
'releasever': '24'}
それらすべてを取得するには、 mmckinst掲載 のようなコードを使用する必要がありますが、$releasever
実行できますyum version nogroups
RHEL-6の場合。
RHEL-6で行うもう1つのことは、/etc/yum/vars
。
そして$ releaseverがどのように割り当てられているかをドリルダウンします:
function _getsysver は、rpmデータベースを次のようにクエリします。
rpm -q --provides $(rpm -q --whatprovides "system-release(releasever)") | grep "system-release(releasever)" | cut -d ' ' -f 3
「system-release(releasever)」の値が定義されている ここ であり、yum.confのdistroverpkgで上書きできる
クエリが値を返さなかった場合、releaseverは '$ releasever'に設定されます(たとえば、distroverpkg = centos-releaseを設定したが、 rpm redhat-release-server)
$Arch
の値の取得は、実際にはArch="$(Arch)"
またはArch="$(uname --machine)"
のように単純である必要がありますが、$Arch
のyum
の値を本当に知りたい場合は、以下を試してください。
bash-4.2# Arch="$(python -c 'from rpmUtils import Arch; print(Arch.getCanonArch());')";
bash-4.2# declare -p Arch
declare -- Arch="ia32e"
Pythonを使用する必要なく、他の変数の値を取得する方が少し簡単です。
オプション1:
bash-4.2# distroverpkg="$(awk --field-separator \= '/distroverpkg/{print$2}' /etc/yum.conf)";
bash-4.2# releasever="$(rpm --query --queryformat '%{VERSION}\n' "${distroverpkg:-redhat-release}")";
bash-4.2# basearch="${HOSTTYPE:-$(uname --machine)}";
bash-4.2# declare -p distroverpkg releasever basearch
declare -- distroverpkg="centos-release"
declare -- releasever="7"
declare -- basearch="x86_64"
オプション2:
bash-4.2# releasever="$(rpm --query --file --queryformat '%{VERSION}\n' /etc/system-release)";
bash-4.2# basearch="$(rpm --query --queryformat '%{Arch}\n' "kernel-$(uname --kernel-release)")";
bash-4.2# declare -p releasever basearch
declare -- releasever="7"
declare -- basearch="x86_64"
注:わかりやすくするために、コマンドは
long-opts
(使用可能な場合)を使用して示されています。
変数置換の結果を確認する別の方法は、次のようなことです。
yum-config-manager -c /etc/reposyncb.conf | grep -i spacewalk
ローカルリポジトリを構築するためにどのspacewalkクライアントが選択されるかを制御するために、yum変数をいじくり回していて、変数がどのように解釈されているかを確認するのにこれが役立つことがわかりました。