给 Solaris 打补丁

【给 Solaris 打补丁】
给系统打补丁是管理员的日常工作,可是能够完整地作好可也不容易 。下面这个帖子从日期上看,
应该是去年上半年写的,可对于近日的你,应该还是有所提示 。

给系统打补丁是管理员的日常工作,尤其是选择了SUN工作站和Solaris以后,在获得了易用性的同时,
也将自己和"补丁(patch)""补丁包(patch-cluster)"紧紧联系在了一起 。系统已经有半年多没有打
过新补丁了,然而期间报导的系统漏洞却一个接一个地不停,尤其是几个关键系统程序的安全漏洞,
像rpc.statd,automountd,rpc.ttdbserver,in.named等,并且我们的几个服务器在检查中连续出现
被攻击甚至入侵的征兆 。我感到越来越不安,决定下载一个最新的补丁包给系统们升升级,也安慰安慰
自己 。

事情决定以后,立刻就干了起来 。打开浏览器,访问SUN公司的系统补丁专门站点http://sunsolve.sun.com,
找到系统的相应版本Solaris2.5.1对应的补丁包,一看5月27日 。不错,够新,立即下载 。一个多小时以后,
补丁到了我的主机上 。在系统临时目录/tmp下开包,进入补丁包目录2.5.1_Recommended,敲入命令
./install-cluster,然后按照系统提示键入yes 。接下去就是等待了 。打补丁是一个漫长的过程 。需要耐心 。
然而,半个多小时以后,我发现苗头不对,补丁安装一个一个全部失败 。本来,有几个补丁安装失败是正常的,
但是现在,肯定是出了问题 。本来认为很顺利的事情现在有麻烦了 。

按照往常的经验,我决定重新读一下补丁包附带的安装指导文件,选择一个典型补丁103663-15(in.named),
阅读它的安装script文件installpatch,里面提到了错误返回码的意义 。我记得,安装失败时的返回信息大致
为checkinstall没有完成,返回代码为5 。现在它告诉我,"5"的意思是pkgadd命令失败 。这到底是什么原因呢?
再回想一下安装过程,我以超级用户身份,解开补丁包,然后以超级用户身份执行安装命令,系统有充足磁盘
空间,没有错误 。以前的补丁安装也是同样的过程,没有出现过这种现象啊 。

又认真读了一遍installpatch,发现它只是按照顺序讲解了安装补丁的次序和安装脚本,并没有介绍出错误的
原因 。同目录下还有一个文件Install.info,发现里面是安装过程在不同系统环境下的一步一步说明,并且,
对每一步可能出现的错误提示也作了讲解 。我注意到:

pkgadd: ERROR: checkinstall script did not complete successfully

对,错误提示就是这句话 。文件中接下来的提示是:

The permission for the checkinstall script should not be changed.

改变checkinstall脚本的权限属性 。有点儿费解 。怎么改呢?在它前面的一段英文:

The checkinstall script is executed with its ownership set to
user "install", if there is no user "install" then pkgadd executes
the checkinstall script as nobody.

原来中间还有这么一段过程,还要涉及到nobody用户的权限(我的系统中当然没有install用户),文件属性
还必须对nobody用户可读,这下全部明白了 。

安装脚本需要以nobody用户身份运行checkinstall收集系统信息 。我当前的umask(权限屏蔽位)为077,这意
味着超级用户创建的文件,在缺省情况下其它所有用户都无权读、写、执行,当然nobody也无权读 。root原来
的umask设置为022(超级用户的文件其它用户缺省不可写),后来为了使系统文件管理更加严格,我将超级用
户的umask改为了077 。这才导致了两次运行补丁包安装程序执行结果的不一致 。
问题的症结找到了,处理起来就简单了 。回到/tmp,将解包后的文件目录全部删除 。改变超级用户的umask回

推荐阅读