ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

利用するCentOS 7のバージョンを固定するには

CentOS 7でLinux Kernelと同じバージョンのkernel-headersをインストールしたい時、

# uname -r
3.10.0-327.36.3.el7.x86_64

次のように実行することができます。

# yum install "kernel-headers-$(uname -r)"

…そのはずでした。

ところが、実際に実行すると「パッケージは利用できません。エラー:何もしません」 と言われてしまいます。しろよ。

# yum install "kernel-headers-$(uname -r)"
読み込んだプラグイン:fastestmirror
base                                                               | 3.6 kB  00:00:00
extras                                                             | 3.4 kB  00:00:00
updates                                                            | 3.4 kB  00:00:00
(1/4): base/7/x86_64/group_gz                                      | 155 kB  00:00:00
(2/4): extras/7/x86_64/primary_db                                  | 183 kB  00:00:00
(3/4): updates/7/x86_64/primary_db                                 | 1.2 MB  00:00:00
(4/4): base/7/x86_64/primary_db                                    | 5.6 MB  00:00:02
Determining fastest mirrors
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
パッケージ kernel-headers-3.10.0-327.36.3.el7.x86_64 は利用できません。
エラー: 何もしません

なぜか。実は上の出力にあるように、CentOSはバージョン7の最新版(つまり現在だと7.3.1611と同等)の下にあるパッケージを参照してその中からインストール候補を探します。

普段、最新版しか使わないならこれでも問題ないですが、何かの検証でバージョンを固定したい場合にこれだと困りますよね。

これまではyumリポジトリーファイルの$releaseverを手動で変えていたのですが、これをやるとたまにパッケージバージョンの依存関係を解決できないとかで、エラーになったりしていました。

# vi /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
...

この問題を解決するヒントが次のドキュメントに書かれていました。

つまり、releaseverを固定するには次のようにコマンドを実行します。

# $SHELL -c "echo 7.2.1511 > /etc/yum/vars/releasever"
# yum clean all

そのあと、各yumリポジトリーファイルのmirrorlist行をコメントアウトして、baseurlのコメントを外す必要があります。

ちなみにIPv6をオフにする設定も一緒に行っておくといいと思います。

# echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf

もう一度実行すると、今度は目的のパッケージを見つけることができるようになったはずです。

# yum install "kernel-headers-$(uname -r)"
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ kernel-headers.x86_64 0:3.10.0-327.36.3.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

==========================================================================================
 Package                アーキテクチャー
                                       バージョン                   リポジトリー     容量
==========================================================================================
インストール中:
 kernel-headers         x86_64         3.10.0-327.36.3.el7          updates         3.2 M

トランザクションの要約
==========================================================================================
インストール  1 パッケージ

総ダウンロード容量: 3.2 M
インストール容量: 3.2 M
Is this ok [y/d/N]:

よかったですね。

ただし、この方法が可能なのは最新版の一つ前のバージョンまでです。例えば7.1.1503のディレクトリーを開いてみましょう。ポツンとreadmeファイルが一つあるだけになっています。

なぜなら古いバージョンは http://vault.centos.org にお引越ししてしまうためです。 どうしても古いバージョンのCentOSが必要なら独自ミラーを作るべきでしょう。

まあ、こうやって対処したりCentOS-Vault.repoを使ってもいいですね。

baseurl=http://mirror.centos.org/centos/7.1.1503/(以下略)
↓
baseurl=http://vault.centos.org/centos/7.1.1503/(以下略)

さらにCentOSの場合、新しいマイナーバージョンがリリースされると新しいバージョンのパッケージは古いマイナーバージョンのリポジトリーには提供されなくなるので、バージョン固定するとセキュリティパッチすら充てられなくなります。

そういったサポートが必要なら、RHELサブスクリプション契約を行なってRHELを利用するか、そういったサポートをしているベンダーと契約するか、自分で頑張る必要があります。

ディストリビューションのリリースバージョンを更新するには

簡単です。バージョンを上書きするだけです。

# $SHELL -c "echo 7.3.1611 > /etc/yum/vars/releasever"
# yum clean all

最新のバージョンのリポジトリーを参照するように設定を戻すには、/etc/yum/vars/releaseverを削除してCentOS-Base.repoの設定を元に戻す必要があります。

このブログサイトはJavaScriptを使っていますが、読み込んでいるJavaScriptは全てはてなが提供しているものであり、筆者が設置しているものではありません。