はじめに

個人で使っているLinuxサーバなら、適当なタイミングで、パッケージをアップグレードしていると思う。

ただ、実際の業務では、アップグレードしてしまうと困るパッケージもある。

自分の体験で言うと、サーバ移行したときに、dnf upgradeしたら、PHPがバージョンアップしてしまって、古い記法では動かなくなってしまった。

一番いいのは、バージョンを上げながら、コードも変えることだと思うが、時間が足らず、暫定対応として、PHPのバージョンを下げた。

今回、dnfで特定パッケージだけ、アップグレードしない方法を検証し、まとめる。

検証環境

AlmaLinux 9.2

一時的に特定のパッケージを除外

dnf upgrade--excludeオプションを追加することで、そのコマンドでは対象パッケージのアップグレードを避けることができる。

vim-minimalを今回除外する。まず、--assumenoを付けて、dnfのアップグレード対象を確認する。

sudo dnf upgrade --assumeno

出力例:

アップグレード:
……略
 vim-minimal                     x86_64  2:8.2.2637-26.el9_8.13         baseos     673 k
……略

vim-minimalがアップグレード対象であることが分かった。

除外するときは、以下のようなコマンドにする。

sudo dnf upgrade --exclude='vim-minimal' --assumeno 

除外されているか、grepで試してみる。

# 除外しない版。vim-minimalが表示される。
sudo dnf upgrade --assumeno | grep 'vim-minimal'
# 除外する版。vim-minimalが表示されない。
sudo dnf upgrade --exclude='vim-minimal' --assumeno | grep 'vim-minimal'

--assumenoを外し、実際にdnf upgradeしてみる。まず、アップグレード前にvim-minimalのバージョンを確認する。

rpm -q vim-minimal

出力例:

vim-minimal-8.2.2637-20.el9_1.x86_64

--exclude='vim-minimal'を付けた上で、dnf upgradeする。

sudo dnf upgrade --exclude='vim-minimal'

アップグレード完了後に、もう一度バージョンを確認する。

rpm -q vim-minimal

出力例:

vim-minimal-8.2.2637-20.el9_1.x86_64

バージョンが一緒なので、--excludeしたパッケージがバージョンアップしないことが分かった。

最後に、--excludeせずに、dnf upgradeして、vim-minimalのバージョンが上がったことも確認してみた。

sudo dnf upgrade
rpm -q vim-minimal

出力例:

vim-minimal-8.2.2637-26.el9_8.13.x86_64

ちなみに、--excludeの指定はワイルドカードも使用できる。

例えば、--exclude='php*'とすれば、phpから始まるパッケージを除外することができる。

常に特定のパッケージを除外

毎回、特定パッケージを--excludeで指定するのは、面倒だし、そのうち、ミスが起きるだろう。

/etc/dnf/dnf.conf[main]セクションにexcludepkgsを追加することで、常に対象パッケージを除外することができる。

先ほど同様、まず、/etc/dnf/dnf.confを何も設定していない状態で、vim-minimalがバージョンアップ対象かどうかを確認する。

sudo dnf upgrade --assumeno | grep 'vim-minimal'

出力例:

 vim-minimal                     x86_64  2:8.2.2637-26.el9_8.13         baseos     673 k

/etc/dnf/dnf.confexcludepkgs=vim-minimalを追加する。

例:

[main]
gpgcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=True
skip_if_unavailable=False
excludepkgs=vim-minimal

その後、以下コマンドを再度実行し、vim-minimalについて、何も出力されなくなったことを確認する。

sudo dnf upgrade --assumeno | grep 'vim-minimal'

これで、対象パッケージは常に除外対象にすることができる。

ちなみに、今回の検証環境ではyumでも除外してくれた。AlmaLinux 9ではyumdnfのエイリアスなので、dnf.confの設定が適用される。

以下コマンドで、yumを使ったときにアップグレード対象を確認できるので、vim-minimalがないことが分かる。

yum check-update

おわりに

今回、常に除外したいときは、excludepkgsを使ったが、DNF versionlock Pluginの方がいいかもしれない。使ったことがないので、また、今度調べてみようと思う。

パッケージを除外し続けると、セキュリティアップデートも適用されなくなる。また、除外したパッケージが依存している別のパッケージまで自動的に固定されるわけではないので、関連するパッケージだけがアップグレードされて互換性の問題が起きる可能性もある。

あくまで一時的な回避策として使い、最終的にはパッケージをアップグレードし、それに対して正常に動くように修正するべきだろう。