Linux – apt の自動アップデートと停止方法

概要

この記事では、Linux システムで apt の自動アップデートの仕組みについて解説し、自動アップデートを設定、またはすでに有効になっている自動アップデートを停止する方法について説明します。

手順

1. unattended-upgrades パッケージのインストール

まず、自動アップデートを管理するためのパッケージ unattended-upgrades をインストールします。

sudo apt update
sudo apt install unattended-upgrades
Bash

2. 自動アップデートを有効化

unattended-upgrades パッケージのインストールが完了したら、自動アップデートを有効にする必要があります。 dpkg-reconfigure コマンドを使用して設定を行います。

sudo dpkg-reconfigure unattended-upgrades
Bash

このコマンドを実行すると、対話形式の設定画面が表示されるので、「yes」を選択して自動アップデートを有効にします。

自動アップデートの対象パッケージを設定

自動アップデートの対象パッケージを設定するには、/etc/apt/apt.conf.d/50unattended-upgrades を編集します。

sudo vim /etc/apt/apt.conf.d/50unattended-upgrades
Bash

まず、レポジトリリストを確認します。

$ apt-cache policy
Package files:
 100 /var/lib/dpkg/status
     release a=now
 500 https://deb.nodesource.com/node_18.x focal/main amd64 Packages
     release o=Node Source,n=focal,l=Node Source,c=main,b=amd64
     origin deb.nodesource.com
 500 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64  Packages
     release o=NVIDIA,l=NVIDIA CUDA,c=
     origin developer.download.nvidia.com
 500 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages
     release v=20.04,o=Ubuntu,a=focal-security,n=focal,l=Ubuntu,c=multiverse,b=amd64
     origin security.ubuntu.com
Bash

Unattended-Upgrade::Origins-Pattern で指定する

Unattended-Upgrade::Origins-Pattern {
    # origin が Google, Inc.、suite が contrib のパッケージ
    "origin=Google\, Inc.,suite=contrib";
    # www.example.com から取得され、component が main のパッケージ
    "site=www.example.com,component=main";
};
Conf

Unattended-Upgrade::Allowed-Origins で指定する

Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}";
        "${distro_id}:${distro_codename}-security";
        "${distro_id}ESMApps:${distro_codename}-apps-security";
        "${distro_id}ESM:${distro_codename}-infra-security";
//      "${distro_id}:${distro_codename}-updates";
//      "${distro_id}:${distro_codename}-proposed";
//      "${distro_id}:${distro_codename}-backports";
};
Conf

distro_id および distro_codename はそれぞれ以下に置換されます。

$ lsb_release -i;lsb_release -c
Distributor ID: Ubuntu
Codename:       focal
Bash
  • distro_id: ディストリビューションの名前 (例: Ubuntu)
  • distro_codename: ディストリビューションのコードネーム (例: focal)

例えば、"${distro_id}:${distro_codename}-security" の場合、apt-cache policy で確認したリストのうち、 o=Ubuntu,a=facal-security のレポジトリのパッケージが更新対象となります。

Unattended-Upgrade::Package-Blacklist で指定する

特定のパッケージを対象外としたい場合、Unattended-Upgrade::Package-Blacklist で指定します。 Python の正規表現が使用できます。

Unattended-Upgrade::Package-Blacklist {
    // linux- から始まるすべてのパッケージ
    //  "linux-";

    // 末尾が "libc6" のすべてのパッケージ
    //  "libc6$";

    // 特殊文字はエスケープが必要です (例: libstdc++6)
    //  "libstdc\+\+6$";
};
Conf

実際に動作させる前に設定の挙動を確認したい場合は以下のコマンドを実行します。

sudo unattended-upgrade --debug --dry-run
Bash

自動アップデートのスケジュールを設定

自動アップデートのスケジュールを設定するには、/etc/apt/apt.conf.d/20auto-upgrades ファイルを編集します。

sudo vim /etc/apt/apt.conf.d/20auto-upgrades
Bash
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
Plain text
  • APT::Periodic::Update-Package-Lists: パッケージリストを更新する間隔 (日)
  • APT::Periodic::Unattended-Upgrade: パッケージを更新する間隔 (日)

上記の設定では、毎日パッケージリストおよびパッケージを更新します。

apt の自動更新を無効にする

/etc/apt/apt.conf.d/20auto-upgrades の更新間隔を 0 に設定すると、自動更新が無効になります。

sudo vim /etc/apt/apt.conf.d/20auto-upgrades
Bash
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";
Plain text

その他の設定

/etc/apt/apt.conf.d/50unattended-upgrades で設定可能な上記以外の設定について記載します。

sudo vim /etc/apt/apt.conf.d/50unattended-upgrades
Bash
// このオプションは、Ubuntu の開発リリースが自動的にアップグレードされるかどうかを制御します。
// 有効な値は "true"、"false"、および "auto" です。
Unattended-Upgrade::DevRelease "auto";

// このオプションは、dpkgが不正終了した場合に自動的に
// `dpkg --force-confold --configure -a` を実行するかどうかを制御します。
// デフォルト: "true"
Unattended-Upgrade::AutoFixInterruptedDpkg "true";

// アップグレードを可能な限り小さなチャンクに分割することで、SIGTERM で中断できるようにします。
// これにより、アップデート中にシャットダウンが行えるようになります。
Unattended-Upgrade::MinimalSteps "true";

// マシンをシャットダウンする際にすべてのアップデートをインストールするかどうかを指定します。
// "false" に設定すると、マシンの動作中にインストールを実行します。
Unattended-Upgrade::InstallOnShutdown "false";

// 問題やパッケージのアップグレードに関してこのアドレスにメールを送信します。
// 空または未設定の場合、メールは送信されません。
// mailx パッケージがインストールされている必要があります。
Unattended-Upgrade::Mail "";

// メールを通知する条件を設定します。
//  "always": 常にメールを送信します。
//  "only-on-error": エラーが発生した場合のみメールを送信します。
//  "on-change": パッケージが変更された場合のみメールを送信します。
Unattended-Upgrade::MailReport "on-change";

// 自動的にインストールされたカーネル関連の不要なパッケージを削除します。
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";

// アップグレード後に不要になった依存関係を自動的に削除します。
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";

// アップグレード後に不要になったパッケージを自動的に削除します。(apt-get autoremoveと同等)
Unattended-Upgrade::Remove-Unused-Dependencies "false";

// アップグレード後に /var/run/reboot-required ファイルが見つかった場合、確認なしで自動的に再起動します。
Unattended-Upgrade::Automatic-Reboot "false";

// Unattended-Upgrade::Automatic-Reboot が true に設定されている場合、// ユーザーが現在ログインしている状態でも自動的に再起動します。
Unattended-Upgrade::Automatic-Reboot-WithUsers "true";

// 自動再起動が有効で必要な場合、特定の時間に再起動します。
//  デフォルト: "now"
Unattended-Upgrade::Automatic-Reboot-Time "02:00";

// apt の帯域制限機能を使用します。この例では、ダウンロード速度を 70kbps に制限します。
Acquire::http::Dl-Limit "70";

// syslog へのログ記録を有効にします。
// デフォルト: "false"
Unattended-Upgrade::SyslogEnable "false";

// syslog のファシリティを指定します。
// デフォルト: "daemon"
Unattended-Upgrade::SyslogFacility "daemon";

// AC 電源時のみアップグレードをダウンロードおよびインストールします。
// つまり、バッテリー使用時にはアップデートをスキップまたは停止します。
Unattended-Upgrade::OnlyOnACPower "true";

// 従量課金接続時にはアップグレードをダウンロードおよびインストールしません。Unattended-Upgrade::Skip-Updates-On-Metered-Connections "true";

// 詳細なログを記録します。
Unattended-Upgrade::Verbose "false";

// unattended-upgrades および unattended-upgrade-shutdown の両方でデバッグ情報を表示します。
Unattended-Upgrade::Debug "false";

// Pin-Priority が 1000 を超える場合、パッケージのダウングレードを許可します。
Unattended-Upgrade::Allow-downgrade "false";
Conf

ログの確認

自動アップデートの結果を確認するために、/var/log/unattended-upgrades/ ディレクトリのログを確認します。

sudo cat /var/log/unattended-upgrades/*.log
Shell

コメント

コメントする