13 交易更新 #
SUSE Linux Enterprise Desktop 中提供了交易更新,用於在根檔案系統為唯讀時更新 SLES。交易更新是不可分割的 (僅當所有更新都成功時,才會套用所有更新),且支援復原。它不影響正在執行的系統,因為只有在將系統重新開機後,才會啟用變更。由於重新開機是中斷性操作,管理員必須判斷重新開機的開銷是否高於中斷執行中服務的開銷。如果重新開機的開銷過高,則不要使用交易更新。
交易更新由 transactional-update
指令碼每天執行。該指令碼將檢查可用的更新。如果存在任何更新,則它會在背景中建立根檔案系統的新快照,然後從發行通道擷取更新。更新新快照後,該快照會標示為作用中快照,並會在系統下次重新開機後成為新的預設根檔案系統。當 transactional-update
設定為自動執行 (預設行為) 時,該指令碼還會將系統重新開機。更新執行時間以及重新開機維護時間均為可設定組態。
只能更新屬於根檔案系統快照的套件。如果套件中包含不屬於該快照的檔案,更新可能會失敗或中斷系統。
無法更新需要接受授權的 RPM。
13.1 限制 #
目前,交易更新的功能存在某些限制。以下套件不適用於 transactional-update
指令:
nginx 的預設
index.html
頁面可能不可用tomcat-webapps 和 tomcat-admin-webapps
phpMyAdmin
sca-appliance-*
mpi-selector
emacs 可正常運作 (Emacs 遊戲除外)
bind 和 bind-chrootenv
docbook*
sblim-sfcb*
texlive*
iso_ent
openjade
opensp
pcp
plymouth
postgresql-server-10
pulseaudio-gdm-hooks
smartmontools
系統安裝程式的更新程式元件不適用於唯讀檔案系統,因為此類檔案系統不支援交易更新。
其他注意事項:
最好在更新系統之後儘早將機器重新開機。
每次只能套用一項更新。在套用一項更新之後直至套用下一項更新之前,請務必重新開機。
在交易更新之後直至將機器重新開機,都不應執行
update-alternatives
。在交易更新之後直至重新開機,都不要建立新的系統使用者或系統群組。允許建立一般使用者和群組 (UID > 1000,GID > 1000)。
YaST 尚不能識別交易更新。如果某個 YaST 模組需要安裝額外的套件,則無法執行此操作。修改
/etc
中組態檔案的一般系統操作可以執行。對於 php7-fastcgi,必須手動建立指向
/usr/bin/php-cgi
的符號連結/srv/www/cgi-bin/php
。ntp 是要從較舊 SLES 版本移轉的 Legacy Module 的一部分。它在新的 SUSE Linux Enterprise Desktop 安裝中不再受支援,已由 chrony 取代。如果您繼續使用 ntp,需要進行全新安裝才能正常使用交易更新。
sblim-sfcb:整個 sblim 生態系統都與交易更新不相容。
btrfsmaintenance 套件中的
btrfs-defrag
無法與唯讀根檔案系統配合使用。對於
btrfs-balance
,/etc/sysconfig/btrfsmaintenance
中的變數BTRFS_BALANCE_MOUNTPOINTS
必須從/
變更為/.snapshots
。對於
btrfs-scrub
,/etc/sysconfig/btrfsmaintenance
中的變數BTRFS_SCRUB_MOUNTPOINTS
必須從/
變更為/.snapshots
。
13.2 啟用 transactional-update #
必須在系統安裝期間啟用 Transactional Server 模組,然後選取 Transactional Server 系統角色。不支援稍後再於正在執行的系統中從 Transactional Server 模組安裝任何套件,此操作可能會使系統中斷。
不支援變更根分割區的子磁碟區配置,或者將根分割區的子目錄或子磁碟區置於各自的分割區 (/home
、/var
、/srv
和 /opt
除外) 中,此類操作可能會損毀系統。
13.3 管理自動更新 #
自動更新由每天執行一次的 systemd.timer
控制。此操作會套用所有更新,並告知 rebootmgrd
應將機器重新開機。您可以調整更新的執行時間,具體請參閱「systemd.timer(5)」。若要調整維護時間 (即 rebootmgrd
將系統重新開機的時間),請參閱「rebootmgrd(8)」。
您可以使用以下指令停用自動交易更新:
#
systemctl --now disable transactional-update.timer
13.4 transactional-update
指令 #
使用 transactional-update
指令可以不可拆分地方式安裝或移除更新。如果所有更新都能成功安裝,則會套用更新。在套用更新之前,transactional-update
會建立系統的快照,您可以還原此快照。重新開機後,所有變更才會生效。
--continue
使用
--continue
選項可在不重新開機的情況下,對現有快照進行多次變更。預設的
transactional-update
行為是從目前根檔案系統建立新快照。如果您忘記執行某個操作,例如,忘記安裝某個新套件,則必須重新開機以套用先前的變更,然後再次執行transactional-update
以安裝忘記安裝的套件,並再次重新開機。不能在未進行重新開機的情況下多次執行transactional-update
指令來向快照新增更多變更,因為這樣做只會建立多個獨立的快照,這些快照並不會包含先前快照中的變更。您可使用
--continue
選項在不重新開機的情況下,進行任意次數的變更。每次會建立一個獨立的快照,且每個快照都包含您在先前快照中進行的所有變更以及新的變更。視需要重複此程序任意次數,當最終快照包含所需的全部變更時,再將系統重新開機,然後最終快照便會成為新的根檔案系統。--continue
選項的另一個有用功能是,可讓您選取任一現有快照做為新快照的基礎快照。以下範例說明如何執行transactional-update
以在基於快照 13 的某個快照中安裝新套件,然後再次執行該指令來安裝另一個套件:#
transactional-update pkg install package_1
#
transactional-update --continue 13 pkg install package_2
--continue [num]
選項會呼叫snapper create --from
,請參閱第 10.6.2 節 「建立快照」。cleanup
如果目前的根檔案系統與作用中的根檔案系統相同 (在重新開機之後,
transactional-update
建立包含更新的新快照之前),將為沒有清理演算法的所有舊快照設定一個清理演算法。如此可確保 Snapper 會刪除舊快照。(請參閱「snapper(8)」中有關清理演算法的章節。)此操作還會移除/var/lib/overlay
中所有未參考 (因此也未使用) 的/etc
覆蓋目錄:#
transactional-update cleanup
pkg in/install
使用
zypper install
指令從可用通道安裝個別套件。此指令還可用於安裝程式暫時修復 (PTF) RPM 檔案。#
transactional-update pkg install package_name
或
#
transactional-update pkg install rpm1 rpm2
pkg rm/remove
使用
zypper remove
指令從作用中快照移除個別套件。此指令還可用於移除 PTF RPM 檔案。#
transactional-update pkg remove package_name
pkg up/update
使用
zypper update
指令更新作用中快照中的個別套件。只能更新屬於基礎檔案系統快照一部份的套件。#
transactional-update pkg update package_name
up/update
如果有新的可用更新,將會建立一個新快照,並使用
zypper up/update
更新該快照。#
transactional-update up
dup
如果有新的可用更新,將會建立一個新快照,並使用
zypper dup –no-allow-vendor-change
更新該快照。然後,該快照將會啟用,並在重新開機後成為新的根檔案系統。#
transactional-update dup
patch
如果有新的可用更新,將會建立一個新快照,並使用
zypper patch
更新該快照。#
transactional-update patch
rollback
此選項會設定預設子磁碟區。在使用讀取/寫入檔案系統的系統上可呼叫
snapper rollback
。在唯讀檔案系統上,如果未提供任何引數,目前系統將設定為新的預設根檔案系統。如果您指定了編號,則該快照將用做預設的根檔案系統。在唯讀檔案系統上,不會建立任何額外快照。#
transactional-update rollback snapshot_number
grub.cfg
此選項會建立新的 GRUB2 組態。有時需要調整開機組態,例如,新增額外的核心參數。編輯 /etc/default/grub,執行
transactional-update grub.cfg
,然後重新開機以使變更生效。您必須立即重新開機,否則,下一次transactional-update
執行時會使用預設值覆寫新的 GRUB2 組態。#
transactional-update grub.cfg
reboot
此參數在完成動作後會觸發重新開機。
#
transactional-update dup reboot
--help
此時會輸出包含選項和子指令的說明螢幕。
#
transactional-update --help
13.5 疑難排解 #
如果升級失敗,請執行 supportconfig
來收集記錄資料。將產生的檔案 (包括 /var/log/transactional-update.log
) 提供給 SUSE 支援人員。