yum updateなどのパッケージ管理コマンドで特定のパッケージを除外する方法のまとめ

Linuxの各種パッケージを管理する場合、yumやaptといったコマンドを利用しますよね。一般的に、パッケージをアップデートする場合、これらのコマンドを使って登録済みのリポジトリの内容を更新したのち、対象となるパッケージを、依存関係含め、まとめてアップデートできるのが特徴であるメリットとも言えます。

Linuxのパッケージは、システム関連や導入したアプリケーション含め。セキュリティ的な観点からも常に最新であることが望ましいのですが、特定の業務や現場によっては、特定のパッケージはバージョンを固定して利用したい、つまりアップデートのタイミングを調整したい場合が出てきます。

例えば、頻繁にアップデートが行われるKubernetesなどは、システムを構成するコントロールブレーンや複数ワーカーノードを含めたクラスタ全体がアップデートの対象になります。ここではKubernetesの詳細解説は省きますが、クラスタ全体を安全に更新するためには一般的なパッケージアップデートでは対応できないケースが出てきます。

ややこしい話になってしまいましたが、端的に言えば、運用しているシステムによって特定のパッケージを除いてアップデートしたいというケースが出てくるということです。

そうした状況などで利用するパッケージ管理コマンドのオプションをご紹介します。

yum updateコマンドの実行例

以下は、CentOS7の仮想マシンで、通常のyum updateを実行した例です。
ちなみに、KubernetesとDockerを導入済みでそれらのリポジトリが追加されています。

# yum update
読み込んだプラグイン:fastestmirror, langpacks
Determining fastest mirrors * base: mirrors.cat.net * extras: mirrors.cat.net * updates: mirrors.cat.net
base | 3.6 kB 00:00:00
docker-ce-stable | 3.5 kB 00:00:00
extras | 2.9 kB 00:00:00
kubernetes/signature | 844 B 00:00:00
kubernetes/signature | 1.4 kB 00:00:00 !!!
updates | 2.9 kB 00:00:00
(1/3): docker-ce-stable/7/x86_64/primary_db | 70 kB 00:00:00
(2/3): kubernetes/primary | 104 kB 00:00:01
(3/3): updates/7/x86_64/primary_db | 13 MB 00:00:02
kubernetes 766/766
依存性の解決をしています
--> トランザクションの確認を実行しています。
(中略)
依存性を解決しました
======================================================================================================================================== Package アーキテクチャー バージョン リポジトリー 容量
========================================================================================================================================
インストール中: kernel x86_64 3.10.0-1160.53.1.el7 updates 50 M
更新します: bash x86_64 4.2.46-35.el7_9 updates 1.0 M bind-export-libs x86_64 32:9.11.4-26.P2.el7_9.8 updates 1.1 M bind-libs x86_64 32:9.11.4-26.P2.el7_9.8 updates 157 k bind-libs-lite x86_64 32:9.11.4-26.P2.el7_9.8 updates 1.1 M bind-license noarch 32:9.11.4-26.P2.el7_9.8 updates 91 k bind-utils x86_64 32:9.11.4-26.P2.el7_9.8 updates 261 k bpftool x86_64 3.10.0-1160.53.1.el7 updates 8.5 M containerd.io x86_64 1.4.12-3.1.el7 docker-ce-stable 28 M cronie x86_64 1.4.11-24.el7_9 updates 92 k cronie-anacron x86_64 1.4.11-24.el7_9 updates 36 k docker-ce x86_64 3:20.10.12-3.el7 docker-ce-stable 23 M docker-ce-cli x86_64 1:20.10.12-3.el7 docker-ce-stable 30 M docker-ce-rootless-extras x86_64 20.10.12-3.el7 docker-ce-stable 8.0 M docker-scan-plugin x86_64 0.12.0-3.el7 docker-ce-stable 3.7 M iscsi-initiator-utils x86_64 6.2.0.874-22.el7_9 updates 423 k iscsi-initiator-utils-iscsiuio x86_64 6.2.0.874-22.el7_9 updates 94 k kbd x86_64 1.15.5-16.el7_9 updates 347 k kbd-legacy noarch 1.15.5-16.el7_9 updates 466 k kbd-misc noarch 1.15.5-16.el7_9 updates 1.4 M kernel-tools x86_64 3.10.0-1160.53.1.el7 updates 8.2 M kernel-tools-libs x86_64 3.10.0-1160.53.1.el7 updates 8.1 M krb5-libs x86_64 1.15.1-51.el7_9 updates 809 k kubeadm x86_64 1.23.3-0 kubernetes 9.0 M kubectl x86_64 1.23.3-0 kubernetes 9.5 M kubelet x86_64 1.23.3-0 kubernetes 21 M libsss_idmap x86_64 1.16.5-10.el7_9.11 updates 162 k libsss_nss_idmap x86_64 1.16.5-10.el7_9.11 updates 168 k mdadm x86_64 4.1-8.el7_9 updates 440 k nss x86_64 3.67.0-4.el7_9 updates 882 k nss-sysinit x86_64 3.67.0-4.el7_9 updates 66 k nss-tools x86_64 3.67.0-4.el7_9 updates 549 k openssh x86_64 7.4p1-22.el7_9 updates 510 k openssh-clients x86_64 7.4p1-22.el7_9 updates 655 k openssh-server x86_64 7.4p1-22.el7_9 updates 459 k openssl x86_64 1:1.0.2k-24.el7_9 updates 494 k openssl-libs x86_64 1:1.0.2k-24.el7_9 updates 1.2 M polkit x86_64 0.112-26.el7_9.1 updates 170 k python-perf x86_64 3.10.0-1160.53.1.el7 updates 8.1 M qemu-img x86_64 10:1.5.3-175.el7_9.5 updates 705 k qemu-kvm x86_64 10:1.5.3-175.el7_9.5 updates 1.9 M qemu-kvm-common x86_64 10:1.5.3-175.el7_9.5 updates 441 k rpm x86_64 4.11.3-48.el7_9 updates 1.2 M rpm-build-libs x86_64 4.11.3-48.el7_9 updates 108 k rpm-libs x86_64 4.11.3-48.el7_9 updates 279 k rpm-python x86_64 4.11.3-48.el7_9 updates 84 k sssd-client x86_64 1.16.5-10.el7_9.11 updates 229 k subscription-manager-rhsm x86_64 1.24.50-1.el7.centos updates 333 k subscription-manager-rhsm-certificates x86_64 1.24.50-1.el7.centos updates 237 k systemd x86_64 219-78.el7_9.5 updates 5.1 M systemd-libs x86_64 219-78.el7_9.5 updates 419 k systemd-python x86_64 219-78.el7_9.5 updates 146 k systemd-sysv x86_64 219-78.el7_9.5 updates 97 k unzip x86_64 6.0-24.el7_9 updates 172 k
トランザクションの要約
========================================================================================================================================
インストール 1 パッケージ
更新 53 パッケージ
総ダウンロード容量: 240 M
Is this ok [y/d/N]: 

ログが少々長いですが、DockerとKubernetesのパッケージも更新対象になっているのが確認できます。

このDockerとKubernetes関連のパッケージ以外をアップデートした場合ですが方法はいくつかあります。

特定のパッケージを除いてアップデートしたい場合

まずは特定のパッケージを除いてアップデートしたい場合は、excludeオプションを使用し、除外したいパッケージを指定します。

yum update --exclude=<パッケージ名>

パッケージの指定に正規表現も使用可能です。
今回はdockerとkubeで始まるパッケージを指定します。

# yum --exclude==docker*,kube* update
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile * base: mirrors.cat.net * extras: mirrors.cat.net * updates: mirrors.cat.net
依存性の解決をしています
--> トランザクションの確認を実行しています。
(中略)
依存性を解決しました
======================================================================================================================================== Package アーキテクチャー バージョン リポジトリー 容量
========================================================================================================================================
インストール中: kernel x86_64 3.10.0-1160.53.1.el7 updates 50 M
更新します: bash x86_64 4.2.46-35.el7_9 updates 1.0 M bind-export-libs x86_64 32:9.11.4-26.P2.el7_9.8 updates 1.1 M bind-libs x86_64 32:9.11.4-26.P2.el7_9.8 updates 157 k bind-libs-lite x86_64 32:9.11.4-26.P2.el7_9.8 updates 1.1 M bind-license noarch 32:9.11.4-26.P2.el7_9.8 updates 91 k bind-utils x86_64 32:9.11.4-26.P2.el7_9.8 updates 261 k bpftool x86_64 3.10.0-1160.53.1.el7 updates 8.5 M containerd.io x86_64 1.4.12-3.1.el7 docker-ce-stable 28 M cronie x86_64 1.4.11-24.el7_9 updates 92 k cronie-anacron x86_64 1.4.11-24.el7_9 updates 36 k docker-scan-plugin x86_64 0.12.0-3.el7 docker-ce-stable 3.7 M iscsi-initiator-utils x86_64 6.2.0.874-22.el7_9 updates 423 k iscsi-initiator-utils-iscsiuio x86_64 6.2.0.874-22.el7_9 updates 94 k kbd x86_64 1.15.5-16.el7_9 updates 347 k kbd-legacy noarch 1.15.5-16.el7_9 updates 466 k kbd-misc noarch 1.15.5-16.el7_9 updates 1.4 M kernel-tools x86_64 3.10.0-1160.53.1.el7 updates 8.2 M kernel-tools-libs x86_64 3.10.0-1160.53.1.el7 updates 8.1 M krb5-libs x86_64 1.15.1-51.el7_9 updates 809 k libsss_idmap x86_64 1.16.5-10.el7_9.11 updates 162 k libsss_nss_idmap x86_64 1.16.5-10.el7_9.11 updates 168 k mdadm x86_64 4.1-8.el7_9 updates 440 k nss x86_64 3.67.0-4.el7_9 updates 882 k nss-sysinit x86_64 3.67.0-4.el7_9 updates 66 k nss-tools x86_64 3.67.0-4.el7_9 updates 549 k openssh x86_64 7.4p1-22.el7_9 updates 510 k openssh-clients x86_64 7.4p1-22.el7_9 updates 655 k openssh-server x86_64 7.4p1-22.el7_9 updates 459 k openssl x86_64 1:1.0.2k-24.el7_9 updates 494 k openssl-libs x86_64 1:1.0.2k-24.el7_9 updates 1.2 M polkit x86_64 0.112-26.el7_9.1 updates 170 k python-perf x86_64 3.10.0-1160.53.1.el7 updates 8.1 M qemu-img x86_64 10:1.5.3-175.el7_9.5 updates 705 k qemu-kvm x86_64 10:1.5.3-175.el7_9.5 updates 1.9 M qemu-kvm-common x86_64 10:1.5.3-175.el7_9.5 updates 441 k rpm x86_64 4.11.3-48.el7_9 updates 1.2 M rpm-build-libs x86_64 4.11.3-48.el7_9 updates 108 k rpm-libs x86_64 4.11.3-48.el7_9 updates 279 k rpm-python x86_64 4.11.3-48.el7_9 updates 84 k sssd-client x86_64 1.16.5-10.el7_9.11 updates 229 k subscription-manager-rhsm x86_64 1.24.50-1.el7.centos updates 333 k subscription-manager-rhsm-certificates x86_64 1.24.50-1.el7.centos updates 237 k systemd x86_64 219-78.el7_9.5 updates 5.1 M systemd-libs x86_64 219-78.el7_9.5 updates 419 k systemd-python x86_64 219-78.el7_9.5 updates 146 k systemd-sysv x86_64 219-78.el7_9.5 updates 97 k unzip x86_64 6.0-24.el7_9 updates 172 k
トランザクションの要約
========================================================================================================================================
インストール 1 パッケージ
更新 47 パッケージ
総ダウンロード容量: 140 M
Is this ok [y/d/N]:

ログでを確認するとdockerとkubeで始まるパッケージが除外されているのが確認できます。

ただ、docker-ce-stableリポジトリに含まれるcontainerd.ioが除外されていません。

このような場合は、特定のリポジトリに含まれるパッケージ一式を除外対象にする方が確実です。

特定のリポジトリに含まれるパッケージ一式を除外したい場合

特定のリポジトリをアップデート対象外にするには、disablerepoオプションを使用し、除外するリポジトリを指定します。

yum update --disablerepo=<リポジトリ名>

dockerとkubernetes関連のパッケージをまとめて除外したい場合は以下のようにリポジトリを指定します。

# yum --disablerepo=docker-ce-stable,kubernetes update
(正規表現を使う場合は、docker*,kube*のように省略可能)
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile * base: mirrors.cat.net * extras: mirrors.cat.net * updates: mirrors.cat.net
依存性の解決をしています
--> トランザクションの確認を実行しています。
(中略)
依存性を解決しました
======================================================================================================================================== Package アーキテクチャー バージョン リポジトリー 容量
========================================================================================================================================
インストール中: kernel x86_64 3.10.0-1160.53.1.el7 updates 50 M
更新します: bash x86_64 4.2.46-35.el7_9 updates 1.0 M bind-export-libs x86_64 32:9.11.4-26.P2.el7_9.8 updates 1.1 M bind-libs x86_64 32:9.11.4-26.P2.el7_9.8 updates 157 k bind-libs-lite x86_64 32:9.11.4-26.P2.el7_9.8 updates 1.1 M bind-license noarch 32:9.11.4-26.P2.el7_9.8 updates 91 k bind-utils x86_64 32:9.11.4-26.P2.el7_9.8 updates 261 k bpftool x86_64 3.10.0-1160.53.1.el7 updates 8.5 M cronie x86_64 1.4.11-24.el7_9 updates 92 k cronie-anacron x86_64 1.4.11-24.el7_9 updates 36 k iscsi-initiator-utils x86_64 6.2.0.874-22.el7_9 updates 423 k iscsi-initiator-utils-iscsiuio x86_64 6.2.0.874-22.el7_9 updates 94 k kbd x86_64 1.15.5-16.el7_9 updates 347 k kbd-legacy noarch 1.15.5-16.el7_9 updates 466 k kbd-misc noarch 1.15.5-16.el7_9 updates 1.4 M kernel-tools x86_64 3.10.0-1160.53.1.el7 updates 8.2 M kernel-tools-libs x86_64 3.10.0-1160.53.1.el7 updates 8.1 M krb5-libs x86_64 1.15.1-51.el7_9 updates 809 k libsss_idmap x86_64 1.16.5-10.el7_9.11 updates 162 k libsss_nss_idmap x86_64 1.16.5-10.el7_9.11 updates 168 k mdadm x86_64 4.1-8.el7_9 updates 440 k nss x86_64 3.67.0-4.el7_9 updates 882 k nss-sysinit x86_64 3.67.0-4.el7_9 updates 66 k nss-tools x86_64 3.67.0-4.el7_9 updates 549 k openssh x86_64 7.4p1-22.el7_9 updates 510 k openssh-clients x86_64 7.4p1-22.el7_9 updates 655 k openssh-server x86_64 7.4p1-22.el7_9 updates 459 k openssl x86_64 1:1.0.2k-24.el7_9 updates 494 k openssl-libs x86_64 1:1.0.2k-24.el7_9 updates 1.2 M polkit x86_64 0.112-26.el7_9.1 updates 170 k python-perf x86_64 3.10.0-1160.53.1.el7 updates 8.1 M qemu-img x86_64 10:1.5.3-175.el7_9.5 updates 705 k qemu-kvm x86_64 10:1.5.3-175.el7_9.5 updates 1.9 M qemu-kvm-common x86_64 10:1.5.3-175.el7_9.5 updates 441 k rpm x86_64 4.11.3-48.el7_9 updates 1.2 M rpm-build-libs x86_64 4.11.3-48.el7_9 updates 108 k rpm-libs x86_64 4.11.3-48.el7_9 updates 279 k rpm-python x86_64 4.11.3-48.el7_9 updates 84 k sssd-client x86_64 1.16.5-10.el7_9.11 updates 229 k subscription-manager-rhsm x86_64 1.24.50-1.el7.centos updates 333 k subscription-manager-rhsm-certificates x86_64 1.24.50-1.el7.centos updates 237 k systemd x86_64 219-78.el7_9.5 updates 5.1 M systemd-libs x86_64 219-78.el7_9.5 updates 419 k systemd-python x86_64 219-78.el7_9.5 updates 146 k systemd-sysv x86_64 219-78.el7_9.5 updates 97 k unzip x86_64 6.0-24.el7_9 updates 172 k
トランザクションの要約
========================================================================================================================================
インストール 1 パッケージ
更新 45 パッケージ
総ダウンロード容量: 107 M
Is this ok [y/d/N]:

リポジトリを指定したので、パッケージ指定の時に残っていたcontainerd.ioも除外対象になりました。

対象のパッケージが除外されていることが確認できたらアップデートを実施します。

その他のケース

追加したリポジトリの情報は/etc/yum.repos.d/に追加されますが、当該ディレクトリ内ファイルのenableの項目を0に設定することで無効化つまりアップデート対象から外す方法もあります。

# cat /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/stable
enabled=1 →ここを0にする
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/g
(以下省略)

無効化したリポジトリを追加してアップデートしたい場合には、enablerepoオプションを使用します。

yum update --enablerepo=<リポジトリ名>

参考:Debian系のaptコマンドの場合

Debian系のaptコマンドでも同様のことが可能です。

パッケージを無効化

sudo apt-mark hold <パッケージ名>
(sudo attitude hold <パッケージ名>でも可)

無効化したパッケージの確認

apt-mark showhold

無効化したパッケージの有効化

sudo apt-mark unhold <パッケージ名>
(sudo attitude unhold <パッケージ名>でも可)

ひとこと

エスパくん

LinuCの資格取得に必須の内容ではありませんが、101試験「主題1.04:リポジトリとパッケージ管理」の理解を深める意味でも知っておいて損はないと思います。