Ubuntu や Debian には Phased Updates という仕組みがあって、デフォルトでは jammy-updates などのパッケージは最初は 10% だけで徐々に対象が増えていく、ということをしてレグレッションの問題を軽減しているようです。

動作確認環境

  • Ubuntu 22.04 LTS (jammy)

気付いた動作

base-files が環境によって更新されたりされなかったりしました。 /etc/apt/preferences.d などでの apt pinning や hold なども設定されていませんでした。

$ sudo apt full-upgrade -qq
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
$ apt-cache policy base-files
base-files:
  Installed: 12ubuntu4
  Candidate: 12ubuntu4
  Version table:
     12ubuntu4.1 1 (phased 10%)
        500 http://ca.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
 *** 12ubuntu4 500
        500 http://ca.archive.ubuntu.com/ubuntu jammy/main amd64 Packages
        100 /var/lib/dpkg/status

調べてみると PhasedUpdates - Ubuntu Wiki という機能の影響だったようで、それを気にせず更新する設定を探してみました。

設定例

積極的に更新

Phased updates in APT in 21.04 - Foundations - Ubuntu Community Hub を参考にして全部許可すると以下のようになりました。

$ echo 'APT::Get::Always-Include-Phased-Updates "true";' | sudo tee /etc/apt/apt.conf.d/99-Phased-Updates
$ apt-cache policy base-files
base-files:
  Installed: 12ubuntu4
  Candidate: 12ubuntu4.1
  Version table:
     12ubuntu4.1 500 (phased 10%)
        500 http://ca.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
 *** 12ubuntu4 500
        500 http://ca.archive.ubuntu.com/ubuntu jammy/main amd64 Packages
        100 /var/lib/dpkg/status

APT::Get::Always-Include-Phased-Updates true; でも "true" と同じでしたが、 APT::Get::Always-Include-Phased-Updates; は何も書かないのと同じ結果でした。

一時的に全部更新するだけなら、 sudo apt -o APT::Get::Always-Include-Phased-Updates=true full-upgrade のように -o で指定できます。

全部待つ

Phased Update 中のものは更新しないように設定すると以下のようになりました。

$ echo 'APT::Get::Never-Include-Phased-Updates "true";' | sudo tee /etc/apt/apt.conf.d/99-Phased-Updates
$ apt-cache policy base-files
base-files:
  Installed: 12ubuntu4
  Candidate: 12ubuntu4
  Version table:
     12ubuntu4.1 1 (phased 10%)
        500 http://ca.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
 *** 12ubuntu4 500
        500 http://ca.archive.ubuntu.com/ubuntu jammy/main amd64 Packages
        100 /var/lib/dpkg/status

その他の設定

GUI あり環境の設定

以前は apt コマンドが Phased Updates に対応していなくて、 Update Manager などが対応していただけだったらしく、 Update-Manager::Never-Include-Phased-Updates などの Update Manager 向けもあるようですが、 GUI あり環境は試していないので、 Ubuntu 22.04 でどういう関係になっているのかは調べていません。

タイミングを合わせる

ランダムなタイミングのままで良くて、複数のマシンごとのタイミングを合わせたい場合は、 apt_preferencesのPhased Updates によると、 Phased Updates のタイミングの計算に使われる APT::Machine-ID を同じ UUID に設定すれば良いそうです。

関連情報

レポジトリ側

レポジトリ側のファイルの関連部分は DebianRepository/Format - Debian Wiki の Phased-Update-Percentage でした。

ここは自分の側の設定でどうにかなる部分ではないので、値の確認だけしてみました。

$ grep -r Phased-Update-Percentage /var/lib/apt/lists/ | sort | uniq -c
grep: /var/lib/apt/lists/lock: Permission denied
grep: /var/lib/apt/lists/partial: Permission denied
      3 /var/lib/apt/lists/ca.archive.ubuntu.com_ubuntu_dists_jammy-updates_main_binary-amd64_Packages:Phased-Update-Percentage: 10
      1 /var/lib/apt/lists/ca.archive.ubuntu.com_ubuntu_dists_jammy-updates_main_binary-amd64_Packages:Phased-Update-Percentage: 50
      1 /var/lib/apt/lists/ca.archive.ubuntu.com_ubuntu_dists_jammy-updates_main_binary-amd64_Packages:Phased-Update-Percentage: 70
      4 /var/lib/apt/lists/ca.archive.ubuntu.com_ubuntu_dists_jammy-updates_main_binary-amd64_Packages:Phased-Update-Percentage: 90
      3 /var/lib/apt/lists/ca.archive.ubuntu.com_ubuntu_dists_jammy-updates_main_binary-i386_Packages:Phased-Update-Percentage: 10
      1 /var/lib/apt/lists/ca.archive.ubuntu.com_ubuntu_dists_jammy-updates_main_binary-i386_Packages:Phased-Update-Percentage: 50
      8 /var/lib/apt/lists/ca.archive.ubuntu.com_ubuntu_dists_jammy-updates_universe_binary-amd64_Packages:Phased-Update-Percentage: 70
      5 /var/lib/apt/lists/ca.archive.ubuntu.com_ubuntu_dists_jammy-updates_universe_binary-i386_Packages:Phased-Update-Percentage: 70

対象パッケージ

Ubuntu は Phasing Ubuntu Stable Release Updates に Phased Update 中のパッケージの一覧があるようです。

まとめ

検証用環境では APT::Get::Always-Include-Phased-Updates "true"; にして、 本番環境では APT::Get::Never-Include-Phased-Updates "true"; にするなど、 Phased Update の対応を変えたいときに参考にしてみてください。

Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published