LoginSignup
6
2

More than 1 year has passed since last update.

CentOS 8でOSとカーネルのバージョンを固定する

Last updated at Posted at 2021-06-21

What's?

CentOS 8で、パッケージマネージャー(dnf)を使ってパッケージを更新する時に、OSとカーネルのバージョンを固定するには?ということで。

結論としては、

  • /etc/dnf/dnf.confexcludepkgsを書く
  • /etc/yum/vars/releaseverにバージョンを書いて、/etc/yum.repos.dディレクトリ配下の内容を調整する

といったところですね。

環境

確認環境。今回はCentOS 8.3を使います。

$ cat /etc/redhat-release
CentOS Linux release 8.3.2011


$ uname -srvmpio
Linux 4.18.0-240.22.1.el8_3.x86_64 #1 SMP Thu Apr 8 19:01:30 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

この時点でCentOS 8.4がリリースされているので、ふつうにdnf upgradeしようとすると、CentOS 8.4にアップグレードされるのでこれを止めてみます。

未設定での振る舞い

まずは、centos*パッケージおよびkernel*パッケージの更新確認をしてみましょう。

centos*

$ sudo dnf check-upgrade centos*
Last metadata expiration check: 0:04:39 ago on Mon Jun 21 13:24:20 2021.

centos-linux-release.noarch                                                               8.4-1.2105.el8                                                               baseos

kernel*

$ sudo dnf check-upgrade kernel*
Last metadata expiration check: 0:04:56 ago on Mon Jun 21 13:24:20 2021.

kernel.x86_64                                                                         4.18.0-305.3.1.el8                                                               baseos
kernel-core.x86_64                                                                    4.18.0-305.3.1.el8                                                               baseos
kernel-modules.x86_64                                                                 4.18.0-305.3.1.el8                                                               baseos
kernel-tools.x86_64                                                                   4.18.0-305.3.1.el8                                                               baseos
kernel-tools-libs.x86_64                                                              4.18.0-305.3.1.el8                                                               baseos

それぞれ、OS、カーネルのアップデート対象があります。

centos*パッケージおよびkernel*パッケージを更新対象外にする

では、これらを更新対象外にしてみましょう。/etc/dnf/dnf.confを変更します。

/etc/dnf/dnf.conf
[main]
gpgcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=True
skip_if_unavailable=False
excludepkgs=centos*,kernel*

変更したのは、excludepkgsの追加です。こちらに、,区切りで更新対象外にしたいパッケージを記述します。

excludepkgs=centos*,kernel*

確認してみましょう。

$ sudo dnf check-upgrade centos*
Last metadata expiration check: 0:07:18 ago on Mon Jun 21 13:24:20 2021.


$ sudo dnf check-upgrade kernel*
Last metadata expiration check: 0:07:26 ago on Mon Jun 21 13:24:20 2021.

どちらも、更新対象外になりましたね。OKです。

他のパッケージをインストールしようとすると?

ところがですね、たとえばpython3.8をインストールしようとしてみると

$ sudo dnf install python3.8
Last metadata expiration check: 0:01:07 ago on Mon Jun 21 13:31:48 2021.
Dependencies resolved.
=============================================================================================================================================================================
 Package                                        Architecture                Version                                                     Repository                      Size
=============================================================================================================================================================================
Installing:
 python38                                       x86_64                      3.8.6-3.module_el8.4.0+665+abc3a503                         appstream                       79 k
Installing dependencies:
 python38-libs                                  x86_64                      3.8.6-3.module_el8.4.0+665+abc3a503                         appstream                      8.3 M
 python38-pip-wheel                             noarch                      19.3.1-1.module_el8.4.0+647+0ba99ce8                        appstream                      1.2 M
 python38-setuptools-wheel                      noarch                      41.6.0-4.module_el8.4.0+647+0ba99ce8                        appstream                      304 k
Installing weak dependencies:
 python38-pip                                   noarch                      19.3.1-1.module_el8.4.0+647+0ba99ce8                        appstream                      1.9 M
 python38-setuptools                            noarch                      41.6.0-4.module_el8.4.0+647+0ba99ce8                        appstream                      667 k
Enabling module streams:
 python38                                                                   3.8                                                                                             

Transaction Summary
=============================================================================================================================================================================
Install  6 Packages

Total download size: 12 M
Installed size: 45 M
Is this ok [y/N]: 

表示されるのは、CentOS 8.4のパッケージです。最新のリポジトリの情報を見ているようですね。

これはちょっと微妙ですね。8.3を向いたままにできないのでしょうか?

先ほど設定したこちらの情報は、ちょっとコメントアウトしておきます。

/etc/dnf/dnf.conf
#excludepkgs=centos*,kernel*

/etc/yum/vars/releaseverにバージョンを指定。

$ sudo su -c 'echo '8.3.2011' > /etc/yum/vars/releasever'

これから、リポジトリの参照先を以下のどちらかに調整していきます。

たとえば/etc/yum.repos.d/CentOS-Linux-AppStream.repoであれば、以下の内容ですね。

/etc/yum.repos.d/CentOS-Linux-AppStream.repo
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/

こちらのコメントアウトを入れ替え、$releaseverについては/etc/yum/vars/releaseverに書き込んだ値を使ってもらいます。
※この作業が必要な理由は、後で記載します

ちなみに、他にはcontentinfraという変数が/etc/yum/vars配下には格納されています。

$ cat /etc/yum/vars/contentdir
centos


$ cat /etc/yum/vars/infra
stock

ひとまず、現時点でのファイルをバックアップ。

$ find /etc/yum.repos.d -name '*.repo' | sed -r -e 's!(.+)!cp \1 \1.org!' | xargs -I {} sudo sh -c {}

一気に文字列置換します。

$ find /etc/yum.repos.d -name '*.repo' | \
  xargs sudo sed -r -i -e 's!^mirrorlist=http://mirrorlist.centos.org!#mirrorlist=http://mirrorlist.centos.org!; s!^#baseurl=http://mirror.centos.org!baseurl=http://mirror.centos.org!'

または、こちら。

$ find /etc/yum.repos.d -name '*.repo' | \
  xargs sudo sed -r -i -e 's!^mirrorlist=http://mirrorlist.centos.org!#mirrorlist=http://mirrorlist.centos.org!; s!^#baseurl=http://mirror.centos.org!baseurl=https://vault.centos.org!'

細かく見ると、mirrorlistをコメントアウトして

s!^mirrorlist=http://mirrorlist.centos.org!#mirrorlist=http://mirrorlist.centos.org!

baseurlのコメントアウトを解除します。

s!^#baseurl=http://mirror.centos.org!baseurl=http://mirror.centos.org!

もしくは、コメントアウトを解除しつつhttps://vault.centos.orgに置き換えます。

s!^#baseurl=http://mirror.centos.org!baseurl=https://vault.centos.org!

$releaseverを設定しても、http://mirrorlist.centos.orgを参照したままだと、404になってしまうからです…。

これで、1度dnfのキャッシュをクリア。

$ sudo dnf clean all

確認してみます。

$ sudo dnf install python3.8
CentOS Linux 8.3.2011 - AppStream                                                                                                            685 kB/s | 6.3 MB     00:09    
CentOS Linux 8.3.2011 - BaseOS                                                                                                               587 kB/s | 2.3 MB     00:03    
CentOS Linux 8.3.2011 - Extras                                                                                                                22 kB/s | 9.6 kB     00:00    
Dependencies resolved.
=============================================================================================================================================================================
 Package                                        Architecture                Version                                                     Repository                      Size
=============================================================================================================================================================================
Installing:
 python38                                       x86_64                      3.8.3-3.module_el8.3.0+468+0c52a667                         appstream                       78 k
Installing dependencies:
 python38-libs                                  x86_64                      3.8.3-3.module_el8.3.0+468+0c52a667                         appstream                      8.3 M
 python38-pip-wheel                             noarch                      19.3.1-1.module_el8.3.0+441+3b561464                        appstream                      1.2 M
 python38-setuptools-wheel                      noarch                      41.6.0-4.module_el8.3.0+441+3b561464                        appstream                      304 k
Installing weak dependencies:
 python38-pip                                   noarch                      19.3.1-1.module_el8.3.0+441+3b561464                        appstream                      1.9 M
 python38-setuptools                            noarch                      41.6.0-4.module_el8.3.0+441+3b561464                        appstream                      667 k
Enabling module streams:
 python38                                                                   3.8                                                                                             

Transaction Summary
=============================================================================================================================================================================
Install  6 Packages

Total download size: 12 M
Installed size: 45 M
Is this ok [y/N]: 

すると、CentOS 8.3のリポジトリの内容で表示されました。

ちなみに、現時点ではこの状態でもcentos*kernel*は更新されません。

$ sudo dnf check-upgrade centos*
Last metadata expiration check: 0:06:20 ago on Mon Jun 21 13:42:49 2021.


$ sudo dnf check-upgrade kernel*
Last metadata expiration check: 0:06:24 ago on Mon Jun 21 13:42:49 2021.

これは、単純に現時点でのCentOS 8.3の最新の内容だからですね。

カーネルのバージョンを完全に固定したい場合は、やはり/etc/dnf/dnf.confexcludepkgsを書いておくのが良いでしょう。

最後に、書き換えたリポジトリ定義の変更差分を載せておきます。

$ find /etc/yum.repos.d -name '*.repo' | sed -r -e 's!(.+)!diff \1 \1.org!' | xargs -I {} sh -c {}
13,14c13,14
< #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
< baseurl=https://vault.centos.org/$contentdir/$releasever/AppStream/$basearch/os/
---
> mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
> #baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/
13,14c13,14
< #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra
< baseurl=https://vault.centos.org/$contentdir/$releasever/BaseOS/$basearch/os/
---
> mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra
> #baseurl=http://mirror.centos.org/$contentdir/$releasever/BaseOS/$basearch/os/
20,21c20,21
< #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=cr&infra=$infra
< baseurl=https://vault.centos.org/$contentdir/$releasever/cr/$basearch/os/
---
> mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=cr&infra=$infra
> #baseurl=http://mirror.centos.org/$contentdir/$releasever/cr/$basearch/os/
13,14c13,14
< #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=Devel&infra=$infra
< baseurl=https://vault.centos.org/$contentdir/$releasever/Devel/$basearch/os/
---
> mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=Devel&infra=$infra
> #baseurl=http://mirror.centos.org/$contentdir/$releasever/Devel/$basearch/os/
13,14c13,14
< #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
< baseurl=https://vault.centos.org/$contentdir/$releasever/extras/$basearch/os/
---
> mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
> #baseurl=http://mirror.centos.org/$contentdir/$releasever/extras/$basearch/os/
13,14c13,14
< #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=fasttrack&infra=$infra
< baseurl=https://vault.centos.org/$contentdir/$releasever/fasttrack/$basearch/os/
---
> mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=fasttrack&infra=$infra
> #baseurl=http://mirror.centos.org/$contentdir/$releasever/fasttrack/$basearch/os/
13,14c13,14
< #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=HighAvailability&infra=$infra
< baseurl=https://vault.centos.org/$contentdir/$releasever/HighAvailability/$basearch/os/
---
> mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=HighAvailability&infra=$infra
> #baseurl=http://mirror.centos.org/$contentdir/$releasever/HighAvailability/$basearch/os/
13,14c13,14
< #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
< baseurl=https://vault.centos.org/$contentdir/$releasever/centosplus/$basearch/os/
---
> mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
> #baseurl=http://mirror.centos.org/$contentdir/$releasever/centosplus/$basearch/os/
13,14c13,14
< #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=PowerTools&infra=$infra
< baseurl=https://vault.centos.org/$contentdir/$releasever/PowerTools/$basearch/os/
---
> mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=PowerTools&infra=$infra
> #baseurl=http://mirror.centos.org/$contentdir/$releasever/PowerTools/$basearch/os/

こうやってみると、やっぱりできる限りこういう設定はしたくないなぁ、とはちょっと思います。

現在のバージョンで固定する前提で、簡単に書くとすると?

現在のバージョン(/etc/redhat-releaseの値を使って)を対象に簡単に書くとしたら、こうでしょうか。

$ VER=`sed -r -e 's!^.+ ([.0-9]+)( .*)?$!\1!' /etc/redhat-release`
$ sudo su -c "echo '$VER' > /etc/yum/vars/releasever"

## http://mirror.centos.org を使う場合

$ find /etc/yum.repos.d -name '*.repo' | \
  xargs sudo sed -r -i -e 's!^mirrorlist=http://mirrorlist.centos.org!#mirrorlist=http://mirrorlist.centos.org!; s!^#baseurl=http://mirror.centos.org!baseurl=http://mirror.centos.org!'

## https://vault.centos.org を使う場合

$ find /etc/yum.repos.d -name '*.repo' | \
  xargs sudo sed -r -i -e 's!^mirrorlist=http://mirrorlist.centos.org!#mirrorlist=http://mirrorlist.centos.org!; s!^#baseurl=http://mirror.centos.org!baseurl=https://vault.centos.org!'

mirrorlistとbaseurlを書き換えたのは?

mirrorlistで指定されたURLは、リポジトリのミラーを返す仕組みです。

たとえばこちらのURL定義に対して

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra

具体的な値を入れて実際にアクセスすると、ミラーのリストが返ってきます。

$ curl 'http://mirrorlist.centos.org/?release=8&arch=x86_64&repo=AppStream&infra=stock'
http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/8.4.2105/AppStream/x86_64/os/
http://ftp.jaist.ac.jp/pub/Linux/CentOS/8.4.2105/AppStream/x86_64/os/
http://ftp.nara.wide.ad.jp/pub/Linux/centos/8.4.2105/AppStream/x86_64/os/
http://ftp.tsukuba.wide.ad.jp/Linux/centos/8.4.2105/AppStream/x86_64/os/
http://mirrors.cat.net/centos/8.4.2105/AppStream/x86_64/os/
http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/8.4.2105/AppStream/x86_64/os/
http://ty1.mirror.newmediaexpress.com/centos/8.4.2105/AppStream/x86_64/os/
http://ftp.riken.jp/Linux/centos/8.4.2105/AppStream/x86_64/os/
http://mirror.newmediaexpress.com/centos/8.4.2105/AppStream/x86_64/os/
http://mirror.vodien.com/centos/8.4.2105/AppStream/x86_64/os/

ですが、マイナーバージョン等を指定しても、ミラーは返ってこなくなります。

$ curl 'http://mirrorlist.centos.org/?release=8.3.2011&arch=x86_64&repo=AppStream&infra=stock'
Invalid release/repo/arch combination

このため、baseurlで以下を参照するようにしています。

baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/

もしくは、こちらですね。

baseurl=https://vault.centos.org/$contentdir/$releasever/AppStream/$basearch/os/

https://vault.centos.orgは、アーカイブ済みのバージョンの場合に参照します。

http://mirror.centos.org/centos/に説明が書いていますね。

For archived content, see Vault mirror.

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2