跳到主要內容
節省工具箱Jason Tools
經驗分享

Zimbra OSE 從 Ubuntu 20.04 升級至 22.04

Jason Cheng 發布 瀏覽 5 次
Zimbra OSE 從 Ubuntu 20.04 升級至 22.04
本文目錄
  1. 適用範圍
  2. 升級過程中會發生什麼事
  3. 升級前準備
  4. 步驟一:記錄現況與備份
  5. 步驟二:停止 Zimbra、建立快照、整理 apt 來源
  6. 步驟三:升級作業系統
  7. 步驟四:還原設定檔、準備 apt 來源
  8. 步驟五:執行 install.sh --force-upgrade
  9. 步驟六:安裝後修正
  10. 步驟七:驗證
  11. 步驟八:收尾
  12. 回復方式
  13. 結論
  14. 參考資料

本文的對象是 Zimbra OSE(Open Source Edition,開源版)主機。Ubuntu 20.04 的標準支援已在 2025 年 5 月底結束,跑在上面的 Zimbra OSE 主機遲早要升到 22.04。

Zimbra 的套件是綁 Ubuntu 版本的,20.04 用的是 UBUNTU20_64,22.04 要換成 UBUNTU22_64。所以這不只是作業系統升級,升完之後還要用 22.04 版的安裝檔,把同版本的 Zimbra 重新裝一次。

這條路聽起來簡單,實際做下去有好幾個很容易踩到的地方。照一般的方式直接執行 install.sh,Zimbra 會被當成全新安裝,原本的設定會被覆蓋掉。

本文是我在測試機演練、再實際升級正式主機之後,把遇到的問題都併進流程的版本。從上到下照順序做,每一步都有確認方式,看到結果不對就先停下來。

適用範圍

項目內容
ZimbraOSE 開源版 10.1.20(UBUNTU20_64)
作業系統Ubuntu 20.04 → 22.04
架構單台主機(所有元件裝在同一台)
安裝檔jasontools-zcs-10.1.20_GA_10120.UBUNTU22_64.20260826052937.tgz

安裝檔是我自行打包的 Zimbra 開源版(見文末參考資料),其他來源的 OSE 安裝檔流程相同,檔名換成自己的即可。多台主機的架構要逐台處理,順序也要另外規劃,不在本文範圍內。

升級過程中會發生什麼事

先了解這件事,後面的步驟才知道為什麼要這樣做。

do-release-upgrade 在計算升級內容時,會發現 Zimbra 的套件依賴 20.04 專屬的函式庫,於是把它們列入移除清單:

  • Zimbra 核心套件約 26 個
    zimbra-core、zimbra-ldap、zimbra-mta、zimbra-store、zimbra-proxy 等
  • zimbra-perl 系列約 60 個
    Zimbra 自帶的 Perl 模組

這些套件被移除時,連同設定檔一起清掉,所以升級完會發現:

  • /opt/zimbra/conf 少了一大半檔案,localconfig.xml 也不見了
  • /opt/zimbra/bin、libexec、zimlets 被刪除

不過資料都還在:

  • /opt/zimbra/db/data(MariaDB 資料)
  • /opt/zimbra/data/ldap(LDAP 資料)
  • /opt/zimbra/store(郵件本體)
  • /opt/zimbra/.saveconfig、/opt/zimbra/.install_history

另外,openssl、openjdk、postfix 這些 Zimbra 第三方元件不會被移除,會以 20.04 版的狀態留下來,這點後面會處理。

這時候如果直接執行 22.04 版的 install.sh,它看到 zimbra-core 沒有安裝,就會走全新安裝流程(會先問 Would you like to delete /opt/zimbra before installing?),把 localconfig.xml 重新產生一份,裡面的 LDAP 密碼、資料庫密碼都會和既有資料對不起來。

整個做法可以濃縮成六個重點,後面的步驟都會依序做到:

  1. 升級前備份 /opt/zimbra/conf,升級後還原
  2. install.sh 前暫時移走 /etc/apt/preferences.d/zimbra
  3. install.sh 加上 --force-upgrade
  4. Install zimbra-xxx 的預設值是 N,原本有的元件都要答 y
  5. 有用商用憑證的,安裝後重新部署憑證
  6. 把剩下的 Zimbra 第三方套件全部升級成 22.04 版

升級前準備

安排維護時段

照本文流程,測試機從停止 Zimbra 到收尾完成約 45 分鐘;正式主機資料量較大,作業系統升級也比較久(我的正式主機光這一步就 41 分鐘),建議預留 2~2.5 小時。

升級期間 Webmail、收發信,以及郵件軟體的 IMAP/POP3 連線都會中斷,請事先通知使用者。

確認可以建立快照

這次升級牽涉作業系統跨版本,務必在停止 Zimbra 後建立 VM 快照,萬一中途出問題,這是唯一乾淨的回復方式。

注意:作業系統升級做到一半失敗時,不要嘗試在半升級的狀態下修 Zimbra,直接回復快照再重來。

檢查主機狀態

lsb_release -ds                 # Ubuntu 20.04.x LTS
df -h / /boot /opt              # / 建議 10 GB 以上可用,/boot 300 MB 以上
locale -a | grep -i en_us       # 要有 en_US.utf8
su - zimbra -c "zmcontrol -v"   # 10.1.20.GA.10120.UBUNTU20.64

如果沒有 en_US.utf8,先補上,否則後面安裝時會一直出現 Perl 的 locale 警告:

locale-gen en_US.UTF-8

下載 22.04 版安裝檔

先在 20.04 上把安裝檔準備好,升級後就不用再處理網路或下載的問題:

cd /root
wget https://github.com/jasoncheng7115/zimbra-ose-build/releases/download/10.1.20/jasontools-zcs-10.1.20_GA_10120.UBUNTU22_64.20260826052937.tgz
wget https://github.com/jasoncheng7115/zimbra-ose-build/releases/download/10.1.20/jasontools-zcs-10.1.20_GA_10120.UBUNTU22_64.20260826052937.tgz.sha256
sha256sum jasontools-zcs-10.1.20_GA_10120.UBUNTU22_64.20260826052937.tgz
cat jasontools-zcs-10.1.20_GA_10120.UBUNTU22_64.20260826052937.tgz.sha256
tar xzf jasontools-zcs-10.1.20_GA_10120.UBUNTU22_64.20260826052937.tgz

sha256sum 算出來的值要和 Release 頁面附的 .sha256 檔相同,不同就重新下載。

使用 tmux

do-release-upgrade 和 install.sh 都要跑很久,中間又有很多題目要回答,請在 tmux 裡執行,避免 SSH 斷線造成升級中斷:

apt install -y tmux
tmux new -s upgrade

步驟一:記錄現況與備份

Zimbra 還在執行時,先把現況記錄下來,升級完要拿來比對。

後面的步驟都會用到 BK 這個變數,如果中間重新登入或重新開機,記得再設定一次。這個目錄會存放含密碼的設定,權限設成只有 root 能讀:

BK=/root/pre-u22-backup
mkdir -p $BK && chmod 700 $BK
su - zimbra -c "zmcontrol -v; zmcontrol status" > $BK/pre-status.txt
su - zimbra -c "zmprov -l gaa" > $BK/pre-accounts.txt
su - zimbra -c "zmprov gad"    > $BK/pre-domains.txt
su - zimbra -c "zmprov gs \$(zmhostname) zimbraServiceEnabled zimbraReverseProxySSLProtocols" > $BK/pre-keysettings.txt
su - zimbra -c "zmlocalconfig -s" > $BK/localconfig.txt
dpkg -l > $BK/dpkg-l.txt
wc -l $BK/pre-accounts.txt $BK/pre-domains.txt

記下目前安裝了哪些 Zimbra 元件,步驟五回答問題時要對照:

for p in zimbra-ldap zimbra-logger zimbra-mta zimbra-dnscache zimbra-snmp zimbra-store zimbra-apache zimbra-spell zimbra-memcached zimbra-proxy; do
  printf "%-18s %s\n" $p "$(dpkg-query -W -f='${Status}' $p 2>/dev/null || echo not-installed)"
done | tee $BK/zimbra-components.txt

匯出 LDAP(-c 是 cn=config 設定資料庫):

L=/var/backups/zimbra-pre-u22
mkdir -p $L && chown zimbra:zimbra $L && chmod 700 $L
su - zimbra -c "/opt/zimbra/libexec/zmslapcat $L; /opt/zimbra/libexec/zmslapcat -c $L"
ls -la $L

要看到 ldap.bak 和 ldap-config.bak 兩個檔案。

注意:LDAP 匯出不要放在 /root 底下。/root 的權限是 700,zimbra 帳號寫不進去,指令會直接失敗。

用 Zimbra 目錄分析器檢視匯出內容

ldap.bak 是純文字的 LDIF,一萬多行很難直接看。我在 IT @ Jason Tools 做了一支「Zimbra 目錄分析器」,把這份匯出讀成網域、帳號、群組、別名的清單,順便做一次離線健檢,升級前先看一眼目錄有沒有本來就壞掉的地方。

把 ldap.bak 複製到自己的電腦(scp 即可),打開 Zimbra 目錄分析器,選擇檔案或直接拖進去。

檔案只在瀏覽器分頁裡處理,不會上傳;我用真實主機的匯出實測時也確認過,載入檔案後沒有任何對外連線。密碼雜湊與 token 這些欄位畫面上不顯示,也不會出現在匯出的報告裡。

總覽:網域、帳號、群組、別名、資源與 COS 的數量(示範資料,內容為虛構)
總覽:網域、帳號、群組、別名、資源與 COS 的數量(示範資料,內容為虛構)

「設定健檢」把發現分成錯誤、要注意、盤點、無法判定四種,每一筆都能跳回原文的行號。像群組成員指到已經不存在的帳號,就會列成錯誤。

設定健檢:每一筆發現都指得回原文的哪一行(示範資料,內容為虛構)
設定健檢:每一筆發現都指得回原文的哪一行(示範資料,內容為虛構)

注意,分析器只讀目錄內容,也就是 ldap.bak;zmslapcat -c 匯出的 ldap-config.bak 是 cn=config,不是它的讀取來源,不用拿去載入。

最重要的一步,備份 /opt/zimbra/conf:

tar czpf $BK/zimbra-conf.tgz -C /opt/zimbra conf
ls -la $BK/zimbra-conf.tgz

這份備份在步驟四會用到,沒有它就沒辦法還原 localconfig.xml。

再確認 .saveconfig 裡的 localconfig.xml 和目前使用中的一致。--force-upgrade 安裝完成時,會用這一份覆蓋回去:

cmp /opt/zimbra/.saveconfig/localconfig.xml /opt/zimbra/conf/localconfig.xml \
  && echo 一致 || { cp -p /opt/zimbra/conf/localconfig.xml /opt/zimbra/.saveconfig/; echo 已更新; }

最後看一下有沒有其他第三方套件來源,升級時它們會被停用,上面的套件也可能被移除:

grep -rhE '^deb ' /etc/apt/sources.list.d/ | grep -v zimbra

有的話先記下來,升級後再確認那些套件的狀態。

步驟二:停止 Zimbra、建立快照、整理 apt 來源

su - zimbra -c "zmcontrol stop"
ps -u zimbra -o pid,args --no-headers

確認沒有 Zimbra 的服務程序還在執行,如果還有,等一下再執行一次 zmcontrol stop。只剩 zimbra 帳號的登入 shell 不影響。

確認停止後,這時候建立 VM 快照。

接著停用 Zimbra 開機自動啟動,避免升級後重新開機時,用已經被刪掉一半的 20.04 程式啟動:

systemctl disable zimbra

把 Zimbra 的 apt 來源註解掉,deb-src 也要一起註解:

sed -i -E 's/^(deb|deb-src) /#\1 /' /etc/apt/sources.list.d/zimbra.list
grep -vE '^\s*#|^\s*$' /etc/apt/sources.list.d/zimbra.list || echo 已全部註解

先把 20.04 的更新補齊,do-release-upgrade 要求系統是最新狀態:

apt update
apt upgrade -y

如果更新到核心(有 /var/run/reboot-required),請先重新開機一次再繼續。

步驟三:升級作業系統

do-release-upgrade

過程中會出現以下題目:

題目回答
Continue running under SSH?y
Starting additional sshd on port 1022(To continue please press [ENTER])Enter
Third party sources disabled(To continue please press [ENTER])Enter
Do you want to start the upgrade?(Continue [yN] Details [d])y
Restart services during package upgrades without asking?Yes
Services to restart for GNU libc library upgradeOk
設定檔衝突(*** xxx (Y/I/N/O/D/Z) [default=N] ?)N(保留現有版本)
設定檔衝突的對話框(例如 sshd_config)keep the local version currently installed
Remove obsolete packages?N
System upgrade is complete. Restart requiredy

幾個說明:

  • 如果 tmux 是在 SSH 連線之外啟動的,可能不會出現 SSH 和 1022 埠那兩題,屬正常
  • 步驟二已經把所有第三方來源註解掉的話,Third party sources disabled 這題也不會出現
  • Do you want to start the upgrade? 可以先按 d 看明細,Remove 底下會列一長串 zimbra 套件,這是正常的,看完按 q 再答 y
  • 設定檔衝突一律保留現有版本,常見的有 crontab、sudoers、resolved.conf、sysctl.conf、sshd_config,都是 Zimbra 或系統管理時改過的
  • Remove obsolete packages? 一定要答 N,答 Y 的話會再多移除一百多到三百個套件

重新開機後確認:

lsb_release -ds                                  # Ubuntu 22.04.x LTS
systemctl is-enabled zimbra                      # disabled
ls /opt/zimbra/conf/localconfig.xml              # 預期:No such file or directory
dpkg -l | awk '/^rc/{print $2}'                  # 被移除的套件(rc 狀態)

最後一個指令會列出升級時被移除的套件。除了 zimbra 開頭的之外,如果有其他自己裝的第三方套件(例如記錄轉送、監控 agent),記下來,收尾時再處理。

步驟四:還原設定檔、準備 apt 來源

重新登入的話,先把變數設回來:

BK=/root/pre-u22-backup

從步驟一的備份還原 /opt/zimbra/conf:

tar xzpf $BK/zimbra-conf.tgz -C /opt/zimbra
ls -la /opt/zimbra/conf/localconfig.xml          # 擁有者要是 zimbra zimbra

把 Zimbra 的 apt 來源改成 22.04(jammy):

cat > /etc/apt/sources.list.d/zimbra.list <<'EOF'
deb     [arch=amd64] https://repo.zimbra.com/apt/87 jammy zimbra
deb     [arch=amd64] https://repo.zimbra.com/apt/1000 jammy zimbra
deb     [arch=amd64] https://repo.zimbra.com/apt/1010 jammy zimbra
EOF

OSE 開源版的核心套件來自安裝檔本身,但第三方元件還是要從 Zimbra 的 repo 取得,所以這裡一定要打開。87、1000、1010 這三個來源與 Zimbra 安裝程式自己寫入的相同。

暫時移走 Zimbra 的 apt 優先權設定

很多 Zimbra 主機都有 /etc/apt/preferences.d/zimbra,把 repo 的優先權設成 50。

這個檔案在這裡會擋住升級:留下來的 20.04 第三方元件優先權是 100,repo 裡的 22.04 版只有 50,apt 會選擇保留舊版,install.sh 就會出現 Unable to download packages from repository. System is not modified.

先移開,收尾時再放回來:

[ -f /etc/apt/preferences.d/zimbra ] && mv /etc/apt/preferences.d/zimbra $BK/apt-preferences-zimbra
apt update
apt-cache policy zimbra-openssl | sed -n 2,3p

Candidate 要是 22.04 結尾的版本,這樣才能繼續。

步驟五:執行 install.sh --force-upgrade

cd /root/zcs-10.1.20_GA_10120.UBUNTU22_64.20260826052937
./install.sh --force-upgrade

注意,--force-upgrade 不能漏掉。

套件已經被移除了,install.sh 自己判斷不出這是升級。從 Zimbra 安裝程式的原始碼(utilfunc.sh)可以看到,加上這個參數才會:

  • 走升級流程,問 Do you wish to upgrade?,不會問要不要刪除 /opt/zimbra
  • 在安裝記錄中寫入 UPGRADED,zmsetup 才會讀取既有的設定與 LDAP
  • 安裝完成時,用 .saveconfig 裡的 localconfig.xml 還原,連同憑證一起

題目與回答:

題目回答
Do you agree with the terms of the software license agreement?y
Use Zimbra's package repositoryN
Do you wish to upgrade?Y
Install zimbra-xxx [N](逐一詢問)對照 zimbra-components.txt,有安裝的全部答 y
確認 Installing: 清單和 zimbra-components.txt 比對,不能少
The system will be modified. Continue?y
Port conflicts detected! - Press Enter/Return key to continueEnter(port 53 被 systemd-resolved 佔用,升級前就是這樣;沒有衝突就不會出現)
Notify Zimbra of your installation?No
Configuration complete - press return to exitEnter

幾個要特別說明的地方:

Use Zimbra's package repository 一定要答 N

OSE 開源版的套件都在安裝檔的 packages/ 裡,Zimbra 官方的 repo 已經不再提供 OSE 開源版的核心套件,答 Y 會去抓不存在或不相符的套件。答 N 之後會看到 Found zimbra-core (local) 這類訊息。

Install zimbra-xxx 預設值是 N

這是最容易出錯的地方。套件都被移除了,install.sh 會逐一詢問要安裝哪些元件,而在升級模式下每一題的預設值都是 N,習慣性一路按 Enter 就會漏裝元件。

以單台主機的完整安裝為例,會依序問:

Install zimbra-ldap [N] y
Install zimbra-logger [N] y
Install zimbra-mta [N] y
Install zimbra-dnscache [N] y
Install zimbra-snmp [N] y
Install zimbra-store [N] y
Install zimbra-apache [N] y
Install zimbra-spell [N] y
Install zimbra-proxy [N] y

zimbra-memcached 會隨著 zimbra-proxy 自動加入,不會另外詢問。即使之前停用了 snmp 或 spell 服務,套件本身還是要裝回去,服務是否啟用是另一個設定。

出現 Would you like to delete /opt/zimbra before installing?

代表 --force-upgrade 沒有生效。這題答 N,然後按 Ctrl+C 中止,回頭確認指令。

確認是升級模式

安裝套件結束、開始執行 zmsetup 之後,可以另開一個視窗確認:

tail -3 /opt/zimbra/.install_history
grep -c Newinstall /tmp/zmsetup.*.log
grep "Setting defaults from" /tmp/zmsetup.*.log
  • .install_history 最後幾行要是 UPGRADED,不是 INSTALLED
  • Newinstall 出現次數要是 0
  • 要看到 Setting defaults from existing config

快結束時也會看到 Skipping creation of default domain GAL sync account - existing install detected.

步驟六:安裝後修正

install.sh 跑完之後,還有憑證與第三方元件兩件事要處理,做完才算升級完成。兩件一起做,只需要重新啟動一次 Zimbra。

有使用商用憑證的主機:重新部署憑證

--force-upgrade 安裝完成時,也會從 .saveconfig 還原 LDAP、nginx、postfix 用的憑證與 mailboxd 的 keystore。

.saveconfig 是上一次執行 install.sh 時留下的,如果之後換過憑證,這裡還原回來的就是舊憑證。我在正式主機上就遇到還原回來的是已經過期的憑證,zmcontrol status 直接出現 certificate verify failed when connecting to ldap master。

比對現行的商用憑證和實際使用中的憑證:

C=/opt/zimbra/ssl/zimbra/commercial
[ -f $C/commercial.crt ] && /opt/zimbra/common/bin/openssl x509 -in $C/commercial.crt -noout -enddate
/opt/zimbra/common/bin/openssl x509 -in /opt/zimbra/conf/slapd.crt -noout -enddate
  • 沒有 commercial.crt(使用 Zimbra 自簽憑證)
    跳過這一項
  • 兩個日期相同
    跳過這一項
  • 兩個日期不同
    重新部署現行的商用憑證
su - zimbra -c "/opt/zimbra/bin/zmcertmgr deploycrt comm $C/commercial.crt $C/commercial_ca.crt"
/opt/zimbra/common/bin/openssl x509 -in /opt/zimbra/conf/slapd.crt -noout -enddate   # 要和 commercial.crt 相同

把剩下的第三方元件升級成 22.04 版

install.sh 只會升級它直接需要的元件,還會有一批 Zimbra 第三方套件停在 20.04 的建置版本,我的正式主機剩了 73 個:

dpkg-query -W -f='${Package} ${Version}\n' 'zimbra*' | grep -c '20\.04'

這些套件版本號一樣,只是為 22.04 重新編譯,但舊版裡面的 Perl 模組是給 20.04 的 Perl 用的。例如 logger 會因此起不來(RRDs.c: loadable library and perl binaries are mismatched)。

先用 -s 模擬,確認只有升級、沒有移除任何套件:

apt list --upgradable 2>/dev/null | grep '^zimbra' | cut -d/ -f1 > $BK/zimbra-u20-leftover.txt
wc -l < $BK/zimbra-u20-leftover.txt
apt-get install -s --only-upgrade $(cat $BK/zimbra-u20-leftover.txt) | grep 'upgraded,'

要看到 N upgraded, 0 newly installed, 0 to remove。接著照 Zimbra 的程序升級,同時讓上一項的憑證生效:

su - zimbra -c "zmcontrol stop"
apt-get install -y --only-upgrade $(cat $BK/zimbra-u20-leftover.txt)
/opt/zimbra/libexec/zmfixperms
su - zimbra -c "zmcontrol start"
dpkg-query -W -f='${Version}\n' 'zimbra*' | grep -c '20\.04'      # 要是 0

步驟七:驗證

版本與服務

su - zimbra -c "zmcontrol -v"
su - zimbra -c "zmcontrol status"

版本要是 Release 10.1.20.GA.10120.UBUNTU22.64 UBUNTU22_64 FOSS edition.,服務清單和 $BK/pre-status.txt 相同、全部 Running。

步驟六的第三方元件升級完之後,logger 應該會正常啟動。如果還是顯示 Stopped,先確認 20.04 套件為 0,再手動啟動:

su - zimbra -c "zmlogswatchctl start"

帳號、網域、設定

和步驟一的記錄比對。網域清單的順序可能不同,所以排序後再比:

su - zimbra -c "zmprov -l gaa" | diff - $BK/pre-accounts.txt && echo 帳號一致
su - zimbra -c "zmprov gad" | sort | diff - <(sort $BK/pre-domains.txt) && echo 網域一致
su - zimbra -c "zmlocalconfig -s" | diff - $BK/localconfig.txt && echo 設定一致
su - zimbra -c "zmprov gs \$(zmhostname) zimbraServiceEnabled zimbraReverseProxySSLProtocols" | sort | diff - <(sort $BK/pre-keysettings.txt) && echo 服務設定一致

zmlocalconfig -s 會顯示密碼,這一項一致,代表 LDAP 與資料庫的密碼都正確延續下來。

最後一項如果有差異,通常是之前停用的服務(例如 snmp、spell)被安裝程式加回去了,用 zmprov ms $(zmhostname) -zimbraServiceEnabled 服務名稱 再停用即可。

比較升級前後的 LDAP

前面的 diff 只比到帳號、網域清單與幾項設定。要確認整份目錄都沒變,可以升級後再匯出一份,用 Zimbra 目錄分析器的「快照比較」逐筆比對:

L2=/var/backups/zimbra-post-u22
mkdir -p $L2 && chown zimbra:zimbra $L2 && chmod 700 $L2
su - zimbra -c "/opt/zimbra/libexec/zmslapcat $L2"

把這份 ldap.bak 也複製回電腦。分析器先載入升級前的 ldap.bak(A),再到「快照比較」選升級後的那份當 B,「匯出範圍」兩個都勾成完整匯出。

「改過」「更名」「只在 A」「只在 B」都是 0,就代表升級前後的目錄內容一致。

快照比較:升級前後兩份匯出逐筆配對,沒有任何差異(示範資料,內容為虛構)
快照比較:升級前後兩份匯出逐筆配對,沒有任何差異(示範資料,內容為虛構)

密碼、token 這類欄位分析器不顯示也不比對,所以這裡沒有列出差異,不代表那些欄位沒變;密碼是否延續下來,要看前面 zmlocalconfig -s 的比對,以及實際登入測試。

開機自動啟動

systemctl is-enabled zimbra

install.sh 會自動改回 enabled,如果不是,手動執行 systemctl enable zimbra。

實際使用

  • 登入 Webmail,確認信件、行事曆、聯絡人都在
  • 內外部收發信各測試一封
  • 有搭配 Z-Push 提供 ActiveSync 的話,測試手機同步(OSE 開源版本身沒有 Zimbra Mobile,ActiveSync 要靠 Z-Push)
  • 檢查郵件佇列:su - zimbra -c "postqueue -p"

步驟八:收尾

apt 來源註解回去、優先權設定放回來

sed -i -E 's/^(deb|deb-src) /#\1 /' /etc/apt/sources.list.d/zimbra.list
[ -f $BK/apt-preferences-zimbra ] && cp -p $BK/apt-preferences-zimbra /etc/apt/preferences.d/zimbra
apt update

平常建議保持註解,只在升級 Zimbra 或更新元件時打開。Zimbra 的元件不應該在服務執行中直接用 apt upgrade 更新。

處理被移除的第三方套件

步驟三最後列出的 rc 套件,需要的就安裝 22.04 的版本,或改用其他工具取代;不需要的就清掉殘留設定:

dpkg -l | awk '/^rc/{print $2}' | grep -v '^zimbra'

注意:清除前先看一下該套件的移除腳本(/var/lib/dpkg/info/套件名稱.postrm)會刪掉哪些檔案,有些舊套件和新的替代品共用同一個目錄。

清理過時套件(可選)

確認 Zimbra 一切正常、觀察幾天之後,再視需要處理:

apt autoremove --dry-run

先用 --dry-run 看清單,清單中如果有任何 zimbra 開頭的套件,就不要執行。

刪除快照與備份

確認沒問題後,再刪除步驟二建立的 VM 快照。

$BK(/root/pre-u22-backup)裡的 localconfig.txt 有明碼密碼,/var/backups/zimbra-pre-u22、/var/backups/zimbra-post-u22 是完整的 LDAP 資料(含密碼雜湊),觀察期過後一併刪除,或移到受控的備份位置。複製到自己電腦上分析的 ldap.bak 也要記得刪掉。

回復方式

升級失敗時,最快的方式是回復步驟二建立的 VM 快照。

回復之後請開機確認確實回到原本的狀態:

lsb_release -ds
su - zimbra -c "zmcontrol -v"

要看到 Ubuntu 20.04 與 UBUNTU20_64。不要只看回復指令有沒有回傳成功,我在測試時就遇過快照回復指令回報失敗、主機卻還停在升級後狀態的情況。

快照是在停用開機自動啟動之前建立的,回復後 Zimbra 會照常啟動。

結論

這次升級的關鍵,是要知道 do-release-upgrade 會把 Zimbra 的核心套件與設定檔一起清掉、第三方元件卻留在 20.04 版,而 install.sh 預設會把這種狀況當成全新安裝。

照本文的順序做,帳號、網域、設定都能完整延續下來。整個流程我先在測試機演練,再升級正式主機,正式主機上遇到的問題併進流程後,又用測試機從頭照本文跑過一次。

每台主機的狀況不同,正式升級前,還是建議先用快照或複製一台測試機跑過一次,維護時段也抓寬一點。

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀