1. はじめに
Red Hat Enterprise LinuxをはじめとするRHEL系ディストリビューションには、パッケージの自動アップデート機能がある。特にGUI環境をインストールしたときには、デフォルトで有効になっているので注意が必要だ。
自動アップデートはクライアント用途では歓迎される機能だが、サーバー用途では自動アップデートしたくないことが多い。また、自動アップデートするとしても、カーネルなどの一部パッケージを除外したいこともあるだろう。
検索すると、いろいろなネタは転がっているのだが、Linuxのバージョンによって設定方法は異なる。また、GUI環境では別の設定方法が必要になるという落とし穴もある。そこで、自動アップデートを停止する方法を紹介する。あわせて、一部のパッケージを除外する方法も説明する。
1-1. 対象環境
- RHEL7/8/9のRHEL互換ディストリビューション(CentOS StreamやAlmaLinux、Rocky Linux、Oracle Linuxなど)
- Amazon LinuxなどのFedora互換ディストリビューション
2. 自動アップデートの方法
自動アップデートは、おもに次の二つの方法がある。
- yum-cronやdnf-automaticなど
- デスクトップ環境に組み込まれたPackagekit
GUIデスクトップをインストールしていないときは前者だけを気にすればよい。しかし、GUIデスクトップをインストールしているときは両方を意識する必要がある。次の表はLinuxのバージョンを
RHEL7系 | RHEL8/9系 | |
---|---|---|
CUI/GUI環境のどちらにも存在 | yum-cron | dnf-automatic |
GUI環境だけに存在 | Packagekit | Packagekit |
3. 自動アップデートを停止する
それぞれの停止方法を説明する。使用しているLinuxのバージョンに合わせて選択してほしい。
- yum-cron
- dnf-automatic
- Packagekit
3-1. yum-cronを無効にする(RHEL7系)
yum-cron
はRHEL6系にもあるが、systemctl
ではなくservice/chkconfig
を使用する。ここでは手順を説明しないが実施することは同じである。
- yum-cronがインストールされているか確認する。インストールされていないときは「3-3. Packagekitを無効にする」に進む。
# rpm -qa | grep yum-cron
★何も表示されなければインストールされていない。
2.インストールされているときは起動しているか確認する。次の例では、自動起動が有効で、サービスも起動している。
# systemctl is-enabled yum-cron
enabled ★自動起動有効
# systemctl status yum-cron
● yum-cron.service - Run automatic yum updates as a cron job
Loaded: loaded (/usr/lib/systemd/system/yum-cron.service; enabled; vendor preset: disabled)
Active: ★active (exited) since Tue 2020-12-15 08:38:03 GMT; 5min ago
Process: 18679 ExecStart=/bin/touch /var/lock/subsys/yum-cron (code=exited, status=0/SUCCESS)
Main PID: 18679 (code=exited, status=0/SUCCESS)
Dec 15 08:38:03 centos7 systemd[1]: Starting Run automatic yum updates as a.....
Dec 15 08:38:03 centos7 systemd[1]: Started Run automatic yum updates as a ...b.
Hint: Some lines were ellipsized, use -l to show in full.
3.yum-cronが起動しているときは、サービスを停止して自動起動もオフにする。
# systemctl disable yum-cron --now
4.次のようにdisabledになれば大丈夫だ。
# systemctl list-unit-files | grep yum-cron
yum-cron.service disabled
3-2. dnf-automaticを無効にする(RHEL8/9系)
1.dnf-automaticのインストールの有無を確認する。インストールされていないときは「3-3. Packagekitを無効にする」に進む。
# rpm -qa | grep dnf-automatic
★何も表示されなければインストールされていない。
2.インストールされているときはタイマーの設定を確認する。次の例では、自動ダウンロードが有効になっているが、自動インストールは無効になっている。
# systemctl list-unit-files --type=timer | grep dnf-auto
dnf-automatic-download.timer enabled ★ダウンロードのみ自動
dnf-automatic-install.timer disabled ★インストール自動
dnf-automatic-notifyonly.timer disabled ★通知自動
dnf-automatic.timer disabled
3.enabledになっているタイマーをすべて無効にする。
# systemctl disable dnf-automatic-download.timer --now
4.次のようにすべてdisabledになれば大丈夫だ。
# systemctl list-unit-files --type=timer | grep dnf-auto
dnf-automatic-download.timer disabled
dnf-automatic-install.timer disabled
dnf-automatic-notifyonly.timer disabled
dnf-automatic.timer disabled
3-3. Packagekitを無効にする(共通)
GUIデスクトップ環境をインストールしているときは、Packagekitによるアップデートを無効化する。yum-cronやdnf-automaticによる自動アップデートが無効でも、Packagekitが有効だと自動アップデートされてしまう。
特にデスクトップ環境でインストールしたときは、Packagekitがデフォルトで有効化されているので注意が必要だ。
- packagekitのステータスを確認する。サービス自体が存在しないときは何もしなくてよい。
# systemctl status packagekit
● packagekit.service - PackageKit Daemon
Loaded: loaded (/usr/lib/systemd/system/packagekit.service; static; vendor preset: disabled)
Active: active (running) ★起動 since Tue 2020-12-15 09:31:27 GMT; 59s ago
Main PID: 21960 (packagekitd)
Tasks: 3
CGroup: /system.slice/packagekit.service
└─21960 /usr/libexec/packagekitd
Dec 15 09:31:26 centos7 systemd[1]: Starting PackageKit Daemon...
Dec 15 09:31:27 centos7 PackageKit[21960]: daemon start
Dec 15 09:31:27 centos7 systemd[1]: Started PackageKit Daemon.
● packagekit.service - PackageKit Daemon
Loaded: loaded (/usr/lib/systemd/system/packagekit.service; static; vendor preset: disabled)
Active: inactive (dead) ★停止
Dec 15 09:31:26 centos7 systemd[1]: Starting PackageKit Daemon...
Dec 15 09:31:27 centos7 PackageKit[21960]: daemon start
Dec 15 09:31:27 centos7 systemd[1]: Started PackageKit Daemon.
Dec 15 09:33:36 centos7 systemd[1]: Stopping PackageKit Daemon...
Dec 15 09:33:36 centos7 systemd[1]: Stopped PackageKit Daemon.
Unit packagekit.service could not be found.
2.packagekitが起動しているときは、サービスを停止して自動起動もオフにする。
# systemctl disable packagekit --now
4. 特定のパッケージをアップデートから除外する
次に特定のパッケージをアップデートから除外する方法を説明する。この方法では、自動アップデートだけでなく手動アップデートでも除外される。
設定方法は/etc/yum.conf
のexclude
パラメータにパッケージ名を指定する。8系以降では/etc/dnf/dnf.conf
だが、次のようにシンボリックリンクになっているので、どちらで設定しても同じである。
$ ls -l /etc/yum.conf
lrwxrwxrwx. 1 root root 12 Jun 9 2023 /etc/yum.conf -> dnf/dnf.conf
設定方法は、次のようにパッケージ名を指定する。複数指定するときは半角スペースを空けて指定し、ワイルドカードも指定できる。
exclude=パッケージ名 [...]
たとえば、kernelとglibcをアップデートから除外するには次のように指定する。
exclude=kernel* glibc*
また、exclude
で特定のパッケージを除外していても、--disableexcludes
を利用すればexclude
の設定を無視してアップデートできる。
yum --disableexcludes=all update