為站羣服務器打補丁是 Linux 系統管理員的一項重要任務,為的是讓系統更加穩定,效能更加優化。廠商經常會發布一些安全/高危的補丁包,相關站羣軟件需要升級以防範潛在的安全風險。
Yum(Yellowdog Update Modified)是 CentOS 和 RedHat 系統上用的 RPM 包管理工具,yum history 命令允許系統管理員將系統回滾到上一個狀態,但由於某些限制,回滾不是在所有情況下都能成功,有時 yum 命令可能什麼都不做,有時可能會刪掉一些其他的包。
我建議你在升級之前還是要做一個完整的系統備份,而 yum history 並不能用來替代系統備份的。系統備份能讓你將系統還原到任意時候的節點狀態。
某些情況下,安裝的應用程式在升級了補丁之後不能正常工作或者出現一些錯誤(可能是由於庫不相容或者站羣軟件包升級導致的),那該怎麼辦呢?
與應用開發團隊溝通,並找出導致庫和站羣軟件包的問題所在,然後使用 yum history 命令進行回滾。
注意:

它不支援回滾 selinux,selinux-policy-*,kernel,glibc(以及依賴 glibc 的包,比如 gcc)。
不建議將系統降級到更低的版本(比如 CentOS 6.9 降到 CentOS 6.8),這會導致系統處於不穩定的狀態

讓我們先來看看系統上有哪些包可以升級,然後挑選出一些包來做實驗。

#yum update
Loaded plugins: fastestmirror, security
Setting up UpdateProcess
Loading mirror speeds from cached hostfile
epel/metalink |12 kB 00:00
* epel: mirror.csclub.uwaterloo.ca
base |3.7 kB 00:00
dockerrepo |2.9 kB 00:00
draios |2.9 kB 00:00
draios/primary_db |13 kB 00:00
epel |4.3 kB 00:00
epel/primary_db |5.9 MB 00:00
extras |3.4 kB 00:00
updates |3.4 kB 00:00
updates/primary_db |2.5 MB 00:00
ResolvingDependencies
–>Running transaction check
—>Packagegit.x86_64 0:1.7.1-8.el6 will be updated
—>Packagegit.x86_64 0:1.7.1-9.el6_9 will be an update
—>Package httpd.x86_64 0:2.2.15-60.el6.centos.4 will be updated
—>Package httpd.x86_64 0:2.2.15-60.el6.centos.5 will be an update
—>Package httpd-tools.x86_64 0:2.2.15-60.el6.centos.4 will be updated
—>Package httpd-tools.x86_64 0:2.2.15-60.el6.centos.5 will be an update
—>Package perl-Git.noarch 0:1.7.1-8.el6 will be updated
—>Package perl-Git.noarch 0:1.7.1-9.el6_9 will be an update
–>FinishedDependencyResolution
DependenciesResolved
=================================================================================================
PackageArchVersionRepositorySize
=================================================================================================
Updating:
git x86_64 1.7.1-9.el6_9 updates 4.6 M
httpd x86_64 2.2.15-60.el6.centos.5 updates 836 k
httpd-tools x86_64 2.2.15-60.el6.centos.5 updates 80 k
perl-Git noarch 1.7.1-9.el6_9 updates 29 k
TransactionSummary
=================================================================================================
Upgrade4Package(s)
Total download size:5.5 M
Isthis ok [y/N]: n

你會發現 git 包可以被升級,那我們就用它來實驗吧。執行下面命令獲得站羣軟件包的版本資訊(當前安裝的版本和可以升級的版本)。

#yumlistgit
Loaded plugins: fastestmirror, security
Setting up UpdateProcess
Loading mirror speeds from cached hostfile
* epel: mirror.csclub.uwaterloo.ca
InstalledPackages
git.x86_64 1.7.1-8.el6@base
AvailablePackages
git.x86_64 1.7.1-9.el6_9 updates

執行下面命令來將 git 從 1.7.1-8 升級到 1.7.1-9 。

#yum update git
Loaded plugins: fastestmirror, presto
Setting up UpdateProcess
Loading mirror speeds from cached hostfile
* base: repos.lax.quadranet.com
* epel: Fedora.mirrors.pair.com
* extras: mirrors.seas.harvard.edu
* updates: mirror.sesp.northwestern.edu
ResolvingDependencies
–>Running transaction check
—>Packagegit.x86_64 0:1.7.1-8.el6 will be updated
–>ProcessingDependency:git=1.7.1-8.el6forpackage: perl-Git-1.7.1-8.el6.noarch
—>Packagegit.x86_64 0:1.7.1-9.el6_9 will be an update
–>Running transaction check
—>Package perl-Git.noarch 0:1.7.1-8.el6 will be updated
—>Package perl-Git.noarch 0:1.7.1-9.el6_9 will be an update
–>FinishedDependencyResolution
DependenciesResolved
=================================================================================================
PackageArchVersionRepositorySize
=================================================================================================
Updating:
git x86_64 1.7.1-9.el6_9 updates 4.6 M
Updatingfor dependencies:
perl-Git noarch 1.7.1-9.el6_9 updates 29 k
TransactionSummary
=================================================================================================
Upgrade2Package(s)
Total download size:4.6 M
Isthis ok [y/N]: y
DownloadingPackages:
Setting up and reading Presto delta metadata
Processing delta metadata
Package(s) data still to download:4.6 M
(1/2):git-1.7.1-9.el6_9.x86_64.rpm |4.6 MB 00:00
(2/2): perl-Git-1.7.1-9.el6_9.noarch.rpm |29 kB 00:00
————————————————————————————————-
Total5.8 MB/s |4.6 MB 00:00
Running rpm_check_debug
RunningTransactionTest
TransactionTestSucceeded
RunningTransaction
Updating: perl-Git-1.7.1-9.el6_9.noarch1/4
Updating:git-1.7.1-9.el6_9.x86_64 2/4
Cleanup: perl-Git-1.7.1-8.el6.noarch3/4
Cleanup:git-1.7.1-8.el6.x86_64 4/4
Verifying:git-1.7.1-9.el6_9.x86_64 1/4
Verifying: perl-Git-1.7.1-9.el6_9.noarch2/4
Verifying:git-1.7.1-8.el6.x86_64 3/4
Verifying: perl-Git-1.7.1-8.el6.noarch4/4
Updated:
git.x86_64 0:1.7.1-9.el6_9
DependencyUpdated:
perl-Git.noarch 0:1.7.1-9.el6_9
Complete!

驗證升級後的 git 版本.

#yumlistgit
InstalledPackages
git.x86_64 1.7.1-9.el6_9@updates

# rpm -q git
git-1.7.1-9.el6_9.x86_64

現在我們成功升級這個站羣軟件包,可以對它進行回滾了。步驟如下。
 
使用 YUM history 命令回滾升級操作
首先,使用下面命令獲取 yum 操作的 id 。下面的輸出很清晰地列出了所有需要的資訊,例如操作 id 、誰做的這個操作(使用者名稱)、操作日期和時間、操作的動作(安裝還是升級)、操作影響的包數量。

#yum history

#yum history list all
Loaded plugins: fastestmirror, presto
ID |Login user |Dateandtime|Action(s)|Altered
——————————————————————————-
13| root |2017-08-1813:30|Update|2
12| root |2017-08-1007:46|Install|1
11| root |2017-07-2817:10| E, I, U |28 EE
10| root |2017-04-2109:16| E, I, U |162 EE
9| root |2017-02-0917:09| E, I, U |20 EE
8| root |2017-02-0210:45|Install|1
7| root |2016-12-1506:48|Update|1
6| root |2016-12-1506:43|Install|1
5| root |2016-12-0210:28| E, I, U |23 EE
4| root |2016-10-2805:37| E, I, U |13 EE
3| root |2016-10-1812:53|Install|1
2| root |2016-09-3010:28| E, I, U |31 EE
1| root |2016-07-2611:40| E, I, U |160 EE

上面命令顯示有兩個包受到了影響,因為 git 還升級了它的依賴包 perl-Git 。 執行下面命令來檢視關於操作的詳細資訊。

#yum history info13
Loaded plugins: fastestmirror, presto
Transaction ID :13
Begintime:FriAug1813:30:522017
Begin rpmdb :420:f5c5f9184f44cf317de64d3a35199e894ad71188
Endtime:13:30:542017(2 seconds)
End rpmdb :420:d04a95c25d4526ef87598f0dcaec66d3f99b98d4
User: root
Return-Code:Success
CommandLine: update git
Transaction performed with:
Installed rpm-4.8.0-55.el6.x86_64 @base
Installedyum-3.2.29-81.el6.centos.noarch @base
Installedyum-plugin-fastestmirror-1.1.30-40.el6.noarch@base
Installedyum-presto-0.6.2-1.el6.noarch@anaconda-CentOS-201207061011.x86_64/6.3
PackagesAltered:
Updatedgit-1.7.1-8.el6.x86_64 @base
Update1.7.1-9.el6_9.x86_64 @updates
Updated perl-Git-1.7.1-8.el6.noarch@base
Update1.7.1-9.el6_9.noarch@updates
history info

執行下面命令來回滾 git 包到上一個版本。

#yum history undo 13
Loaded plugins: fastestmirror, presto
Undoing transaction 53,fromFriAug1813:30:522017
Updatedgit-1.7.1-8.el6.x86_64 @base
Update1.7.1-9.el6_9.x86_64 @updates
Updated perl-Git-1.7.1-8.el6.noarch@base
Update1.7.1-9.el6_9.noarch@updates
Loading mirror speeds from cached hostfile
* base: repos.lax.quadranet.com
* epel: fedora.mirrors.pair.com
* extras: repo1.dal.innoscale.net
* updates: mirror.vtti.vt.edu
ResolvingDependencies
–>Running transaction check
—>Packagegit.x86_64 0:1.7.1-8.el6 will be a downgrade
—>Packagegit.x86_64 0:1.7.1-9.el6_9 will be erased
—>Package perl-Git.noarch 0:1.7.1-8.el6 will be a downgrade
—>Package perl-Git.noarch 0:1.7.1-9.el6_9 will be erased
–>FinishedDependencyResolution
DependenciesResolved
=================================================================================================
PackageArchVersionRepositorySize
=================================================================================================
Downgrading:
git x86_64 1.7.1-8.el6 base 4.6 M
perl-Git noarch 1.7.1-8.el6 base 29 k
TransactionSummary
=================================================================================================
Downgrade2Package(s)
Total download size:4.6 M
Isthis ok [y/N]: y
DownloadingPackages:
Setting up and reading Presto delta metadata
Processing delta metadata
Package(s) data still to download:4.6 M
(1/2):git-1.7.1-8.el6.x86_64.rpm |4.6 MB 00:00
(2/2): perl-Git-1.7.1-8.el6.noarch.rpm |29 kB 00:00
————————————————————————————————-
Total3.4 MB/s |4.6 MB 00:01
Running rpm_check_debug
RunningTransactionTest
TransactionTestSucceeded
RunningTransaction
Installing: perl-Git-1.7.1-8.el6.noarch1/4
Installing:git-1.7.1-8.el6.x86_64 2/4
Cleanup: perl-Git-1.7.1-9.el6_9.noarch3/4
Cleanup:git-1.7.1-9.el6_9.x86_64 4/4
Verifying:git-1.7.1-8.el6.x86_64 1/4
Verifying: perl-Git-1.7.1-8.el6.noarch2/4
Verifying:git-1.7.1-9.el6_9.x86_64 3/4
Verifying: perl-Git-1.7.1-9.el6_9.noarch4/4
Removed:
git.x86_64 0:1.7.1-9.el6_9 perl-Git.noarch 0:1.7.1-9.el6_9
Installed:
git.x86_64 0:1.7.1-8.el6 perl-Git.noarch 0:1.7.1-8.el6
Complete!

回滾後,使用下面命令來檢查降級包的版本。

#yumlistgit

# rpm -q git
git-1.7.1-8.el6.x86_64

 
使用 YUM downgrade 命令回滾升級
此外,我們也可以使用 YUM downgrade 命令回滾升級。

#yum downgrade git-1.7.1-8.el6 perl-Git-1.7.1-8.el6
Loaded plugins: search-disabled-repos, security, ulninfo
Setting up DowngradeProcess
ResolvingDependencies
–>Running transaction check
—>Packagegit.x86_64 0:1.7.1-8.el6 will be a downgrade
—>Packagegit.x86_64 0:1.7.1-9.el6_9 will be erased
—>Package perl-Git.noarch 0:1.7.1-8.el6 will be a downgrade
—>Package perl-Git.noarch 0:1.7.1-9.el6_9 will be erased
–>FinishedDependencyResolution
DependenciesResolved
=================================================================================================
PackageArchVersionRepositorySize
=================================================================================================
Downgrading:
git x86_64 1.7.1-8.el6 base 4.6 M
perl-Git noarch 1.7.1-8.el6 base 29 k
TransactionSummary
=================================================================================================
Downgrade2Package(s)
Total download size:4.6 M
Isthis ok [y/N]: y
DownloadingPackages:
(1/2):git-1.7.1-8.el6.x86_64.rpm |4.6 MB 00:00
(2/2): perl-Git-1.7.1-8.el6.noarch.rpm |28 kB 00:00
————————————————————————————————-
Total3.7 MB/s |4.6 MB 00:01
Running rpm_check_debug
RunningTransactionTest
TransactionTestSucceeded
RunningTransaction
Installing: perl-Git-1.7.1-8.el6.noarch1/4
Installing:git-1.7.1-8.el6.x86_64 2/4
Cleanup: perl-Git-1.7.1-9.el6_9.noarch3/4
Cleanup:git-1.7.1-9.el6_9.x86_64 4/4
Verifying:git-1.7.1-8.el6.x86_64 1/4
Verifying: perl-Git-1.7.1-8.el6.noarch2/4
Verifying:git-1.7.1-9.el6_9.x86_64 3/4
Verifying: perl-Git-1.7.1-9.el6_9.noarch4/4
Removed:
git.x86_64 0:1.7.1-9.el6_9 perl-Git.noarch 0:1.7.1-9.el6_9
Installed:
git.x86_64 0:1.7.1-8.el6 perl-Git.noarch 0:1.7.1-8.el6
Complete!

注意: 你也需要降級依賴包,否則它會刪掉當前版本的依賴包而不是對依賴包做降級,因為 downgrade 命令無法處理依賴關係。
 
至於 Fedora 使用者
命令是一樣的,只需要將包管理器名稱從 yum 改成 dnf 就行了。

# dnf listgit
# dnf history
# dnf history info
# dnf history undo
# dnf listgit
# dnf downgrade git-1.7.1-8.el6 perl-Git-1.7.1-8.el6