web-dev-qa-db-ja.com

無人アップグレードが信頼できないインターネット接続で定期的に実行されるようにするにはどうすればよいですか?

APTには、インターネットに恒久的に接続されていないコンピューターのための永続的な盲点があるようです。最近では、確かにそれらの多くがあり、ほとんどがラップトップです。

一般的な解決策はunattended-upgradesです。これはデフォルトでインストールされ、毎日のcronジョブで実行されます。保護として、anacronもデフォルトでインストールおよび実行され、コンピューターの電源が切れたために失われたcronジョブを実行します。これまでのところ賢明です。

だが!

  1. デフォルトのunattended-upgrades config(/etc/apt/apt.conf.d/50unattended-upgradesまたは類似のもの)では、以下を設定する必要があります。そうしないと、アップグレードがスキップされるリスクがあります。

    Unattended-Upgrade::OnlyOnACPower "false";
    Unattended-Upgrade::Skip-Updates-On-Metered-Connections "false";
    
  2. さらに重要なことに、anacroncronと同様に、インターネット接続が利用可能かどうかに関係なくジョブを実行します。パーソナルコンピュータは常に恒久的に接続されているわけではないため、これは明らかに非サーバーUbuntuの主要な設計バグです。デフォルトの設定では、遊牧民のラップトップでは、unattended-upgradesはほとんどの場合失敗します。

(おそらく、実行するまでネットワーク接続を待機するcronジョブの個別のクラスが必要です。または、失敗したcron.dailyジョブは、正常に実行されるまでcron.hourlyに切り替えることができます。)

実用的な解決策の1つは、ネットワークがオンラインになった後にユーザースクリプトとしてunattended-upgradesを実行するsystemdユニットファイルです。ただし、起動ごとに1回だけ実行されます。

最適なソリューションは何ですか?新しいパッケージまたは構成の改善でこれを修正する計画があるかどうか誰かが知っていますか?

2
Sqerstet

Ubuntuの現在のデフォルトであるnetwork-managerを使用してインターネットに接続している場合、ネットワークに接続した後、unattended-upgradeunattended-upgradesはシンボリックリンクでも機能します)を起動するディスパッチャスクリプトを作成します。

Sudo touch /etc/NetworkManager/dispatcher.d/20-myconnectionscript
Sudo chmod +x /etc/NetworkManager/dispatcher.d/20-myconnectionscript

20-myconnectionscript

#!/bin/sh

if [ "$2" = "up" ];
  # only proceed if unattended-upgrades was last run more than a day ago
  ELAPSEDSINCEUU=$(($(date +%s) - $(date +%s -r /var/lib/apt/periodic/unattended-upgrades-stamp)))
  if [ $ELAPSEDSINCEUU -gt 86400 ]; then
    apt update --yes # replace, see below
    /usr/bin/unattended-upgrade # replace, see below
  fi
fi

編集。unattended-upgradesはパッケージリストの更新をトリガーしないことがわかります。したがって、unattended-upgradesが失敗した場合は、apt updateも失敗している可能性が高く、その場合、アップグレードは続行されません。そのため、スクリプトに手動更新を追加しました。セキュリティのアップグレードを確実にすることは非常に複雑でなければならないことに失望します。

編集2。これは、ラップトップが最新であることを確実にしたい場合に、非インタラクティブスクリプトで必要なものです。確実に動作することを確認できます。上記の2行をそれで置き換えます。

DEBIAN_FRONTEND=noninteractive apt-get --yes update
DEBIAN_FRONTEND=noninteractive apt-get --yes --allow-downgrades --allow-remove-essential --allow-change-held-packages -- option Dpkg::Options::=--force-confold --option Dpkg::Options::=--force-confdef dist-upgrade

これは完全なdist-upgradeであり、単なるセキュリティアップグレードではありません。セキュリティのみのバージョンの提案がある場合は、非対話型で実行すると常に機能し、リポジトリ設定であまりファッツを発生させないようにしてください。それを提案します。

もう一度:unattended-upgradesが断続的に接続されたコンピューターで機能するとは期待できません Ubuntuのセキュリティチームは本当にこの状況に対処する必要があります。

3
Sqerstet