RHEL系Linuxディストリビューションの自動アップデートを無効化する

# 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系）
:::note info
`yum-cron`はRHEL6系にもあるが、`systemctl`ではなく`service/chkconfig`を使用する。ここでは手順を説明しないが実施することは同じである。
:::



1. yum-cronがインストールされているか確認する。インストールされていないときは「3-3. Packagekitを無効にする」に進む。

```shell-session
# rpm -qa | grep yum-cron
★何も表示されなければインストールされていない。
```

2.インストールされているときは起動しているか確認する。次の例では、自動起動が有効で、サービスも起動している。

```shell-session
# 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が起動しているときは、サービスを停止して自動起動もオフにする。

```shell-session
# 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を無効にする」に進む。
```shell-session
# rpm -qa | grep dnf-automatic
★何も表示されなければインストールされていない。
```

2.インストールされているときはタイマーの設定を確認する。次の例では、自動ダウンロードが有効になっているが、自動インストールは無効になっている。

```shell-session
# 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になっているタイマーをすべて無効にする。

```shell-session
# systemctl disable dnf-automatic-download.timer --now
```

4.次のようにすべてdisabledになれば大丈夫だ。
```shell-session
# 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がデフォルトで有効化されているので注意が必要だ。

1. packagekitのステータスを確認する。サービス自体が存在しないときは何もしなくてよい。

```shell-session
# systemctl status packagekit
```

```shell-session:起動しているとき
● 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.
```

```shell-session:停止しているとき
● 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.
```

```shell-session:Packagekitのサービス自体がないとき
Unit packagekit.service could not be found.
```

2.packagekitが起動しているときは、サービスを停止して自動起動もオフにする。

```shell-session
# systemctl disable packagekit --now
```

# 4. 特定のパッケージをアップデートから除外する
次に特定のパッケージをアップデートから除外する方法を説明する。この方法では、自動アップデートだけでなく手動アップデートでも除外される。

設定方法は`/etc/yum.conf`の`exclude`パラメータにパッケージ名を指定する。8系以降では`/etc/dnf/dnf.conf`だが、次のようにシンボリックリンクになっているので、どちらで設定しても同じである。

```:/yum.confと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
```