Ubuntu 16.04: 特定パッケージをアップデート対象外にする

特定のパッケージに変更を加えた場合に、アップグレード対象から外したい場合があります(もちろんセキュリティの考慮も必要です)。

特定パッケージをアップデート対象外にする方法について記載します。

apt-mark holdを使う方法とdpkg –set-selectionsを使う方法があります。

 

1 apt-mark hold/unhold

apt-markを使うことで、パッケージのバージョンを固定することができます。現在のバージョンにholdするには以下を実行します。

$ sudo apt-mark hold <package>

holdを解除するには以下を実行します。

$ sudo apt-mark unhold <package>

holdしたパッケージの一覧を確認するには以下を実行します。

$ apt-mark showhold
llvm

2 dpkg –set-selections/–get-selections

dpkgを使うことでもapt-markと同様のことが実現できます。

現在のバージョンにholdするには以下を実行します。

$ echo "llvm hold" | sudo dpkg --set-selections

holdを解除するには以下を実行します。

$ echo "llvm install" | sudo dpkg --set-selections

holdしたパッケージの一覧を確認するには以下を実行します。

$ dpkg --get-selections | grep 'hold$'
llvm                                            hold

3 実行結果

llvmパッケージをholdした状態にします。

$ sudo apt-mark hold llvm
$ apt-mark showhold
llvm

アップグレードパッケージにllvmパッケージが含まれています。

$ apt list --upgradable
<snip>
linux-libc-dev/xenial-updates,xenial-security 4.4.0-28.47 amd64 [upgradable from: 4.4.0-24.43]
llvm/xenial-updates 1:3.8-33ubuntu3.1 amd64 [upgradable from:1:3.8-33ubuntu3]
llvm-dev/xenial-updates 1:3.8-33ubuntu3.1 amd64 [upgradable from:1:3.8-33ubuntu3]
llvm-runtime/xenial-updates 1:3.8-33ubuntu3.1 amd64 [upgradable from: 1:3.8-33ubuntu3]
lsb-base/xenial-updates,xenial-updates 9.20160110ubuntu0.1 all [upgradable from: 9.20160110]
<snip>

アップグレードを実行します。

$ sudo apt upgrade -y

アップグレードしたにもかかわらず、アップグレードパッケージにllvmパッケージが残った状態になりました。

$ apt list --upgradable
Listing... Done
llvm/xenial-updates 1:3.8-33ubuntu3.1 amd64 [upgradable from: 1:3.8-33ubuntu3]
llvm-dev/xenial-updates 1:3.8-33ubuntu3.1 amd64 [upgradable from: 1:3.8-33ubuntu3]
llvm-runtime/xenial-updates 1:3.8-33ubuntu3.1 amd64 [upgradable from: 1:3.8-33ubuntu3]
$