Ubuntu 16.04:無人值守升級隨機運行

Ubuntu 16.04:無人值守升級隨機運行

我已配置無人值守升級來安裝安全包,並在安裝時透過郵件通知。

我注意到安裝是在非常隨機的時間發生的。我知道最新版本添加了從 cron.daily 執行時間開始最多 30 分鐘的隨機延遲。

然而,我遇到的延誤比這要大得多。我看到無人值守升級在上午 9 點、下午 3 點、中午 12 點執行...日誌顯示相同,因此不僅僅是電子郵件傳送需要更長的時間。

無人值守升級任務是 cron.daily 中的第一個任務,這意味著之前沒有執行時間較長的任務。

有人也經歷過類似的事情嗎?

答案1

經過調試後我找到了解決方案。

此問題的根本原因在於,在 Ubuntu 16.04 及更高版本下,無人值守升級使用 systemd(而不是 cron)來安排具有巨大隨機延遲的更新:

/lib/systemd/system/apt-daily.timer配置有

OnCalendar=*-*-* 6,18:00
RandomizedDelaySec=12h

這意味著它將每天運行兩次,分別在 6:00 和 18:00,隨機延遲最多 12 小時。由於這對於生產環境來說並不總是可以接受的,因此我必須覆蓋這些設定。

為了保持套件配置不變,我在中定義了我的覆蓋/etc/systemd/system/apt-daily.timer.d/override.conf更新:請閱讀此答案底部的編輯,以獲取有關文件名和位置的更多信息,因為它似乎可能會略有變化)。

我在那裡設置

[Timer]
OnCalendar=
OnCalendar=06:00
RandomizedDelaySec=1h

在 6:00 運行無人值守升級,並隨機延遲一個小時。

然後我只是重新啟動計時器systemctl restart apt-daily.timer(最終需要重新載入守護進程)。

無人值守更新現在再次按可預測的時間運行!

編輯:對於 Ubuntu 18.04 來說,情況似乎發生了一些變化。覆蓋現在應該存儲在/etc/systemd/system/apt-daily-upgrade.timer.d/override.conf看起來像這樣:

[Timer]
OnCalendar=*-*-* 6:00
RandomizedDelaySec=1h

@PerlDuck 在下面的評論中提到了一種使用正確的名稱和位置建立覆蓋檔案的方法。請考慮運行,而不是手動建立文件sudo systemctl edit apt-daily.timer

答案2

當我從各種來源編譯它並在我們的系統上進行測試時,更新無人值守升級時間的最佳方法是專門使用systemctl命令並避免嘗試找到正確的文件進行編輯。

您唯一需要確定的是服務名稱,在我們的例子中是apt-daily-upgrade(如果不確定,請透過搜尋$ systemctl | grep apt)。當 systemd 服務定義了計時器時,它被引用為#{service_name}.timer,因此它是apt-daily-upgrade.timer為我們服務的。

由於系統配置不應被編輯,我們必須覆蓋預設計時器配置在 systemd 中。為此,您需要複製編輯原始配置的某些部分,所以讓我們先展示它:

$ systemctl cat apt-daily-upgrade.timer 
# /lib/systemd/system/apt-daily-upgrade.timer
[Unit]
Description=Daily apt upgrade and clean activities
After=apt-daily.timer

[Timer]
OnCalendar=*-*-* 6:00
RandomizedDelaySec=12h
Persistent=true

[Install]
WantedBy=timers.target

我們需要更新該部分中的OnCalendar和值。讓我們透過以下命令建立覆蓋設定檔:RandomizedDelaySec[Timer]

$ systemctl edit apt-daily-upgrade.timer

這應該會打開一個帶有空白文件的編輯器,我們需要將修改後的[Timer]部分放在那裡,至少:

[Timer]
# Reset the system calendar config first
OnCalendar=
# Set a new calendar timer with a 60 minute threshold
OnCalendar=*-*-* 21:00
RandomizedDelaySec=60m

如您所見,我們更新了該OnCalendar值以在晚上(而不是早上)觸發自動更新。其上方的空行OnCalendar必須顯示為這個配置值是添加劑,即它可以被指定多次,並且僅將其設為空白值會重置所有先前的OnCalendar值(來自系統配置的值)。

儲存檔案後,我們可以透過如上所述再次運行來驗證 systemd 是否知道它(無需運行systemctl daemon-reload,該edit命令在離開編輯器時為我們執行此操作) :systemctl

$ systemctl cat apt-daily-upgrade.timer

# /lib/systemd/system/apt-daily-upgrade.timer
[Unit]
Description=Daily apt upgrade and clean activities
After=apt-daily.timer

[Timer]
OnCalendar=*-*-* 6:00
RandomizedDelaySec=12h
Persistent=true

[Install]
WantedBy=timers.target

# /etc/systemd/system/apt-daily-upgrade.timer.d/override.conf
[Timer]
# Reset the system calendar config first
OnCalendar=
OnCalendar=*-*-* 21:00
RandomizedDelaySec=60m

現在它顯示兩種配置,我們的自訂配置會覆蓋預設配置。好的!

最後檢查一切是否如預期工作可以透過list-timers以下命令完成systemctl

$ systemctl list-timers
NEXT                        LEFT          LAST                        PASSED       UNIT                         ACTIVATES                     
...
Thu 2020-08-06 21:51:36 UTC 12h left      Thu 2020-08-06 07:10:20 UTC 2h 20min ago apt-daily-upgrade.timer      apt-daily-upgrade.service               
...             

在輸出中找到正確的行並查看該NEXT列 - 其中的值應反映新配置的無人值守升級的時間。

答案3

Debian 官方文檔https://wiki.debian.org/UnattendedUpgrades目前有一個錯誤,誤導了很多人。它聲稱您可以透過建立一個名為的檔案來覆蓋升級時間

/etc/systemd/system/apt-daily-upgrade.d/override.conf

然而正確的路徑是

/etc/systemd/system/apt-daily-upgrade.timer.d/override.conf

答案4

apt-daily.timer設定為每天運行兩次,並且不會中斷生產環境,因為它只是更新和下載需要更新的軟體包。你應該只需要覆蓋apt-daily-upgrade.timer到不太可能影響您的生產環境的時間,因為這是實際安裝更新的時間。此外,在 50 次無人值守升級中,有一個重新啟動的設置,您應該考慮設置該設置,以便它們實際得到應用,並且還有一個計時器。此外,從 22.04 開始,升級計時器已更改為預設的上午 6 點 + 1 小時,因此大多數人不需要更改此設定。

相關內容