はじめに
個人で使っている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.confにexcludepkgs=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ではyumはdnfのエイリアスなので、dnf.confの設定が適用される。
以下コマンドで、yumを使ったときにアップグレード対象を確認できるので、vim-minimalがないことが分かる。
yum check-update
おわりに
今回、常に除外したいときは、excludepkgsを使ったが、DNF versionlock Pluginの方がいいかもしれない。使ったことがないので、また、今度調べてみようと思う。
パッケージを除外し続けると、セキュリティアップデートも適用されなくなる。また、除外したパッケージが依存している別のパッケージまで自動的に固定されるわけではないので、関連するパッケージだけがアップグレードされて互換性の問題が起きる可能性もある。
あくまで一時的な回避策として使い、最終的にはパッケージをアップグレードし、それに対して正常に動くように修正するべきだろう。