のーずいだんぷ

主に自分用メモですが、もしかしたら誰かの役に立つかもしれません

ubuntuで自動のapt updateを停止する方法

なぜこれが必要なのか

Ansibleやitamae等のプロビジョニングツール使った場合に遭遇しやすいエラーとして、起動直後にバックグラウンドでaptが実行されていることでapt関連のファイルがロックされていてaptが実行できないというものがある。 例えば以下がよく起こると思う。

$ sudo apt update
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

このエラーを初めてみた時、正直起こっている事象はわかっても解決策はわからなかった。 エラーログで検索すると、次のようなものが多く出てくる。

askubuntu.com

上記のURLではロックファイルの削除をすることで解決をしている。

これはおそらく途中でaptを止めてしまってロックが解除されない状態に対してだと思うのだが、 そうでなくでも先に上げたエラーは冒頭の理由でも発生する。 (個人的にAWS のEC2を起動して数分はしばらくこの状態が続く感じがする)

解決方法は?

これが正しいかは微妙であるが、解決方法の一つとしてタイトルの通り自動更新を止める。

どうすれば止まる?

サーバにログインし、以下のように設定ファイルを書き換えれば止まる。

sudo vi /etc/apt/apt.conf.d/20auto-upgrades  
# >> 以下のように値を0にする
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";

ただし、実はこれは不完全だ。 この編集しているファイル /etc/apt/apt.conf.d/20auto-upgrades自体がapt updateで更新される対象だからだ。 つまり何らかのタイミングで設定がまた有効化されてしまう場合がある。

それを防ぐには対応した形式で新しくファイルを作り直す。 例えば 77manually-auto-update-disable のようなファイルを新規作成し、内容は先程と同じように、

APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";

を記載して、/etc/apt/apt.conf.d/ へ保存する。

ちなみに、ファイル名の先頭の数字は優先度で、数字が大きいほど後に実行される。

個人的に実際のプロダクトでは個々の設定はどうすべきなのかわからないのでどうすべきなのか知りたい。