去年底開始規劃升級維護學校的 Online Judge 伺服器,但學校的伺服器不像一般 VPS 有管理面板或是有遠端 Serial Console,只有提供 VPN 與 SSH,只好嘗試使用 SSH 遠端升級。

更新策略

重裝系統

重裝系統也有好幾種方式,都會需要準備一個會自動跑 SSH 服務的暫時系統:

第一種想法是把暫時系統塞進某個分割,修改 GRUB 指向暫時系統後重啟,聽起來很直覺也很簡單。

這種方法硬碟必須還有閒置空間,但這台早期伺服器安裝時沒有分割也沒有做 LVM,所以一個 / 分割幾乎就佔滿整個硬碟,只留下幾百 MB 的 /boot,用 archiso 做了一個帶 SSH 的 Arch Linux。

網路上查到第二種方法是 pivot_root,但實際開 Ubuntu 16.04 Server 來試卻無法成功。

最後我並沒有選擇重裝系統,主要是因為手動配置太容易出錯,不管是 GRUB 沒寫好或 Static IP 寫錯都會失去控制權,風險太高。

原地升級

Ubuntu 有 do-release-upgrade 工具,幫忙處理掉很多細節,還能開一個臨時的 SSH 在 2222 防止更新後 SSH 服務啟動失敗。之後在虛擬機以乾淨的 Ubuntu 16.04 Server 測試很順利,所以最後決定原地升級方案。

正式升級

雖然原地升級的測試很順利,但那是在剛安裝完很乾淨的環境下做的測試,實際目標系統已經裝了很多套件,也不知道會不會有服務設定被改過、檔案被砍掉之類的。 因為 downtime 沒有限制,所以我採取最保守的策略:備份後移除所有額外安裝的套件與工具,從乾淨的測試機複製部份設定檔,確定沒問題後再執行 do-release-upgrade。

一次只能也應該只升一個 LTS 版本,所以 16.04 到 22.04 要升級三次,每次下 reboot 後都心驚膽跳,三分鐘的等待變得極為漫長,怕回不來還要麻煩維運組 rollback,好在三次都平安順利完成。

小抱怨

每次 VPN 申請下來只有一個月,雖然我能理解是資安考量,但系統需要定期更新也是資安考量阿阿阿阿阿阿! 一直跑申請好麻煩,況且我不維護誰願意接手?維護這個又沒錢拿,頂多有 Super Admin 權限可以玩後台而已。