说起Solaris系统的补丁管理,很多运维老手都有一套自己的心得。但如果你刚接手这类工作,可能会被补丁的命名规则、下载方式以及安装流程绕晕。别急,我们把这事从头到尾捋一遍——从补丁分类到安装卸载,再到常见问题的排查,争取一步到位。
一、Solaris补丁介绍
1.1 补丁的种类及文件名
Solaris的补丁其实就两大类:一类是Point补丁,另一类是Cluster补丁。
a) Point补丁程序:
这类补丁是针对某个具体问题或漏洞发布的单个补丁。Solaris 7、8、9的Patch通常是.zip文件,Solaris 2.6则是.tar.Z或.tar.gz。编号规则像这样:
patch base code - revision num,例如 110668-04。
前半段是主版本号(base code),后半段是修订号。两者合起来就是Patch-ID。打个比方,110668-04是在110668-03基础上做了新修复——而且Sun一旦发布-04,就不再提供-03及之前的版本了。
b) Cluster补丁程序:
Cluster补丁说白了就是把一堆Point补丁打包成一个集合,附带自动安装脚本。命名方式很直观:
版本_Recommended,比如9_x86_Recommended.zip对应Solaris 9 for x86,8_Recommended.zip对应Solaris 8 for Sparc。
每个Cluster补丁都会附带一个CLUSTER_README文件,里面详细列出了包含哪些补丁以及安装注意事项——安装前请一定先看它。
1.2 关于补丁的其他信息
Sun为每个Solaris版本维护了一份Patch Reports,里面按版本列出了所有补丁的描述,每月更新两次。获取地址:
https://sunsolve.sun.com/pub-cgi/show.pl?target=patches/patch-access&na v=patchpage
另外还有一份Sun Alert Patch Report,按产品分类实时更新,可以查到所有Sun产品的更新文档和对应的补丁ID、简要说明等。Solaris部分的直接链接:
https://sunsolve.sun.com/pub-cgi/show.pl?target=sunalert_patches#Solaris
表格按时间排序,从Category列就能看出来这个问题是安全修复还是性能优化——一目了然。
二、补丁的下载
Cluster补丁可以从上面的SunSolve页面下载,也可以用FTP直接连到 sunsolve.sun.com,在 /patchroot/clusters 目录下能找到所有Cluster补丁。下载后是一个*_Recommended.zip文件,里面包含一份CLUSTER_README——强烈建议先读它。
Point补丁比较散,不容易手动下载和管理。两种方法:一是通过Sun Alert Patch Report或Patch Reports找到Patch ID和下载链接;二是用Sun网站自带的Patch Finder功能,输入Patch ID就能定位到对应补丁。同样,FTP方式也可以:在sunsolve.sun.com的/patchroot/all_unsigned目录下能找到指定的Patch。
Sun官方建议所有下载的补丁都放到/var/tmp目录下——这也是大多数运维人员的习惯做法。这样做能避免安装时出现权限或所有权问题。
三、Solaris补丁的安装和删除
3.1 /var/sadm/patch目录
已安装的补丁信息都记录在/var/sadm/patch目录下。比如执行ls /var/sadm/patch,会看到类似这样的输出:
107558-05 107594-04 107630-01 107663-01 107683-01 107696-01 107817-01 107582-01 107612-06 107640-03
这个目录千万别乱动——一旦损坏,后续你将无法安装或删除任何补丁。
3.2 管理Solaris补丁
从Solaris 2.6开始,系统提供了两个命令来管理补丁:patchadd(安装)和patchrm(卸载)。在2.6之前的老版本,每个补丁包里自带installpatch和backoutpatch程序。
patchadd:用来安装解压后的补丁。它底层调用pkgadd完成安装。标准做法是先把补丁解压到/var/tmp,然后:
# cd /var/tmp # patchadd 110668-04 Checking installed patches... Verifying sufficient filesystem capacity (dry run method) Installing patch packages...
如果当前目录下有110668-04目录,patchadd就会安装它。注意,默认安装会备份原文件,以便后续卸载。如果用了patchadd -d选项,则不备份源文件——这意味着你以后将无法删除这个补丁。
使用patchadd -p可以查看已安装的补丁信息:
# patchadd -p Patch: 106793-01 Obsoletes: Requires: Incompatibles: Packages: SUNWhea ...
另一个常用命令是showrev -p,也能列出已安装的补丁。
patchrm:用于卸载补丁。它通过pkgadd恢复安装前备份的文件来移除补丁。用法很简单:
# patchrm 106793-01 Checking installed packages and patches... Backing out patch 106793-01... Patch 106793-01 has been backed out.
但需要注意:在以下三种情况下,补丁无法卸载:
- 安装时使用了
patchadd -d(不备份文件) - 有其他补丁依赖这个补丁(存在依赖关系),必须先卸载依赖它的那个补丁
- 要卸载的补丁已被更新的补丁废弃(比如安装了
110668-04后,110668-03就被废弃了,无法单独卸载)
3.3 Cluster补丁的安装
Cluster补丁是补丁集合,下载解压后,直接执行./install_Cluster脚本即可。脚本会先检查当前目录下的patch_order文件——这个文件标明了补丁的安装顺序,脚本会按照这个顺序逐一安装。如果没有patch_order文件,脚本会假定当前目录下所有以数字开头的目录名就是需要安装的补丁,并按目录名的字母顺序来安装。所以,如果你想跳过某个补丁或者调整顺序,可以手动修改patch_order文件。
3.4 安装Patch时的注意事项
安装补丁时需要更新系统文件,因此Sun官方推荐在单用户模式下进行。如果服务器不允许重启进入单用户模式,那么至少要在多用户模式下停止相关服务进程后再安装——这是完全可以的。
另外,不是每一个Patch都必须安装。安装前仔细阅读README文件,确认该补丁是否适用于你的环境,以及是否存在依赖关系。有些补丁需要先装另一个补丁才能成功安装,这些信息都会在README里写清楚。一句话:README是个宝,安装之前好好瞧。
3.5 安装PATCH过程中间出现的问题
安装补丁时经常会看到类似这样的错误提示:
Installation of 123456-11 failed. Return code 2
根据Return code就能判断问题所在。需要特别注意的是:Return code 2 表示补丁已被安装过,Return code 8 表示要修复的软件包根本没有安装——这两种情况完全可以忽略。下面列出完整的退出码含义对照表:
| Exit code | Meaning |
|---|---|
| 0 | No error |
| 1 | Usage error |
| 2 | Attempt to apply a patch that's already been applied |
| 3 | Effective UID is not root |
| 4 | Attempt to sa ve original files failed |
| 5 | pkgadd failed |
| 6 | Patch is obsoleted |
| 7 | Invalid package directory |
| 8 | Attempting to patch a package that is not installed |
| 9 | Cannot access /usr/sbin/pkgadd (client problem) |
| 10 | Package validation errors |
| 11 | Error adding patch to root template |
| 12 | Patch script terminated due to signal |
| 13 | Symbolic link included in patch |
| 14 | NOT USED |
| 15 | The prepatch script had a return code other than 0 |
| 16 | NOT USED |
| 17 | Mismatch of the -d option between a previous patch install and the current one |
| 18 | Not enough space in the file systems that are targets of the patch |
| 19 | $SOFTINFO/INST_RELEASE file not found |
| 20 | A direct instance patch was required but not found |
| 21 | The required patches ha ve not been installed on the manager |
| 22 | A progressive instance patch was required but not found |
| 23 | A restricted patch is already applied to the package |
| 24 | An incompatible patch is applied |
| 25 | A required patch is not applied |
| 26 | The user specified backout data can't be found |
| 27 | The relative directory supplied can't be found |
| 28 | A pkginfo file is corrupt or missing |
| 29 | Bad patch ID format |
| 30 | Dryrun failure(s) |
| 31 | Path given for -C option is invalid |
| 32 | Must be running Solaris 2.6 or greater |
| 33 | Bad formatted patch file or patch file not found |
| 34 | The appropriate kernel jumbo patch needs to be installed |
| 35 | Later revision already installed |
这张表建议收藏一下,遇到报错直接查返回值,比瞎猜效率高得多。
