[ 教学 ] 如何使用 zypper 找出某个更新的具体信息

这个教学的应用前景是为了消除我们论坛现在的一种很不负责任的说法:

更新解决!

因为 openSUSE 开发的哲学是 upstream fisrt,来看我们帖子的是整个互联网上的广大 Linux 众,有些人可能根据你的上下文基本可以断定你们遇到的就是同一个问题,然后翻了好几页,最后发现这样的字符串:更新解决!

他们可能很囧,「卧槽老子不是 openSUSE 啊怎么装你的更新啊!」

于是我们需要更细致的工作,因为即使我用的 openSUSE,我的软件和你装的软件也是不同的,而没装那个软件是不会收到那个软件的更新的,于是需要一个解决问题后的 afterwork:

告诉大家究竟是哪个更新的什么内容解决了问题。

===========================================================

先来点简单的开胃菜:

假如我们装了二十个最近的更新,而我们又忘了这些都是什么的更新,只能记住它们大概的安装时间,这很常见吧。

首先,openSUSE 的更新都是以 drpm 的形式分发的,目标是为了减少下载流量。而 drpm 其实是一种补丁(patch)。

于是,第一个命令叫做 zypper patches

$ su
$ zypper patches
软件名录                     | 名称              | Version | 类别        | 状态   
-----------------------------+-------------------+---------+-------------+--------
openSUSE-12.3-Update         | openSUSE-2013-163 | 1       | recommended | 已安装   
openSUSE-12.3-Update         | openSUSE-2013-673 | 1       | recommended | 需要
 openSUSE-12.3-Update         | openSUSE-2013-672 | 1       | recommended | 不适用

刷更新的时候,别的软件源可以不用开启,但 repo-oss repo-non-oss repo-update repo-update-non-oss 这四个一定要开启。具体可以用 zypper lr 查看你系统中的软件源,zypper mr -da 禁用全部,zypper mr -e 开启你需要的软件源。

我列出了三种不同的补丁状态,「已安装」、「需要」、「不适用」。

  • 不适用 很简单,这个更新补丁不会装到你电脑上去,也不会提示你它的存在。比如你没装 apache2,那所有的 apache2 更新补丁对你来说都是不适用,直到你装了 apache2,它们会像雨后春笋一样纷纷跳出来。
  • 需要 这是你的系统需要安装,但是还没有安装的补丁。如果是准备安装更新的话需要看这个状态。
  • 已安装 我们要看的是这个状态,因为更新解决了问题,那么解决问题的东西一定在已安装的更新里面。

于是我们来过滤下:

$ su
$ zypper patches | grep " 已安装"
openSUSE-12.3-Update         | openSUSE-2013-629 | 1       | recommended | 已安装 
openSUSE-12.3-Update         | openSUSE-2013-630 | 1       | recommended | 已安装 
openSUSE-12.3-Update         | openSUSE-2013-631 | 1       | recommended | 已安装 
openSUSE-12.3-Update         | openSUSE-2013-645 | 1       | security    | 已安装 
openSUSE-12.3-Update         | openSUSE-2013-649 | 1       | recommended | 已安装 
openSUSE-12.3-Update         | openSUSE-2013-650 | 1       | security    | 已安装 
openSUSE-12.3-Update         | openSUSE-2013-651 | 1       | security    | 已安装 
openSUSE-12.3-Update         | openSUSE-2013-652 | 1       | security    | 已安装 
openSUSE-12.3-Update         | openSUSE-2013-652 | 1       | security    | 已安装 
openSUSE-12.3-Update         | openSUSE-2013-675 | 1       | recommended | 已安装 

现在缺的是一个,更新时间!

但是这个完全不需要忧虑,因为 openSUSE-2013- 675 这个编号是根据时间排列的,距离你的时间越近,编号越大。

于是上面那个列表可以看作是按照时间先后排序的已安装更新列表了。

下面是第二个命令:zypper info -t patch

$ zypper info -t patch openSUSE-2013-675
补丁 openSUSE-2013-675 的信息:
-------------------------------
名称:openSUSE-2013-675
版本:1
架构:noarch
厂商:maint-coord@suse.de
状态: 已安装 
类别: recommended
创建于: 2013 年 09 月 02 日 星期一 22 时 44 分 04 秒
需要重启: 否
需要重启软件包管理器: 否
交互的:否
摘要:libQtWebKit4: Rebuild with debuginfo
描述:
This update fixes the following issue with libQtWebKit4:
- bnc#835317: Rebuild libQtWebKit4 with debuginfo
提供:
patch:openSUSE-2013-675 == 1

冲突:
libQtWebKit-devel.i586 < 4.8.4+2.2.0-3.5.1
libQtWebKit4-32bit.x86_64 < 4.8.4+2.2.0-3.5.1
libQtWebKit4.i586 < 4.8.4+2.2.0-3.5.1
srcpackage:libQtWebKit4 < 4.8.4+2.2.0-3.5.1
libQtWebKit4-debuginfo-32bit.x86_64 < 4.8.4+2.2.0-3.5.1
libQtWebKit4-debuginfo.i586 < 4.8.4+2.2.0-3.5.1
libQtWebKit4-debugsource.i586 < 4.8.4+2.2.0-3.5.1
libQtWebKit-devel.x86_64 < 4.8.4+2.2.0-3.5.1
libQtWebKit4.x86_64 < 4.8.4+2.2.0-3.5.1
libQtWebKit4-debuginfo.x86_64 < 4.8.4+2.2.0-3.5.1
libQtWebKit4-debugsource.x86_64 < 4.8.4+2.2.0-3.5.1

我们需要的是这个:

描述:
This update fixes the following issue with libQtWebKit4:

  • bnc#835317: Rebuild libQtWebKit4 with debuginfo

从下往上一个个看过来就行了。你只要能记住你上次大概做了几个更新就行:

  • 如果使用 Apper 的话,很简单,它全屏时候不滚动的话,一屏幕是 20 个更新
  • 如果使用 zypper up 的话,命令行一行大概是 6~7 个更新(不管全屏不全屏),如果你再对比如有几个软件包的名字是比较像的,比如 xxx 和 xxx-lang,有印象的话,那就更好了,因为:

openSUSE 的更新补丁是论「类」,而不是论「软件包个数」的,比如一个 kde 4.11 更新只有一个 openSUSE-2013-xxx 的补丁,但是可以升级 400 多个软件包。

再根据你的一些肉眼推断,比如我是 USB 的问题,那肯定不可能是这个 libQtWebKit4 的更新解决的,因为 webkit 是浏览器用的东西啊。这样范围就更小了。

最后你就能非常自信地给出断言:就是 bnc#835317 修复了我的问题。

然后更碉堡的话,你还可以贴个链接,格式是这样的:

bugzilla.novell.com/show_bug.cgi? id=<bugzilla_number>

就是那个 835317。

2赞

来点困难的:

假如我不是狭义上的更新,而是广义上的「更新」呢?比如我只是打开了软件管理手贱去升级了几个软件包就解决了呢?

这个问题描述起来其实反而比上一个要简单,因为问题出现在:

你忘了你升级了哪些软件包!

跟软件源啊什么的都没有关系。

别担心,我们有 /var/log/zypper.log 可以帮您。

su
vi /var/log/zypper.log

打开,然后按住 PgDn 一直滚动到最后,倒着往上看。

但 zypper.log 可能很大啊,怎么办呢?

可以使用

su
cat /var/log/zypper.log | tail -n 100

倒着看。tail 就是尾巴的意思,-n 就是行数,我们的意思是取倒数 100 行开始到最后的日志:

2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):105 Install summary:
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <install>   U_Ts_(44884)systemd-analyze-195-13.35.1.x86_64(repo-update)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <install>   U_Ts_(44891)systemd-sysvinit-195-13.35.1.x86_64(repo-update)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <install>   U_Ts_(44893)udev-195-13.35.1.x86_64(repo-update)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <install>   U_Ts_(44895)virtuoso-drivers-6.1.6-3.4.1.x86_64(repo-update)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <install>   U_Ts_(44896)virtuoso-server-6.1.6-3.4.1.x86_64(repo-update)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(45509)bind-libs-9.9.2P2-2.3.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(45510)bind-utils-9.9.2P2-2.3.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(46501)libgudev-1_0-0-195-13.29.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(46709)libopenssl-devel-1.0.1e-1.1.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(46710)libopenssl1_0_0-1.0.1e-1.1.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(46711)libopenssl1_0_0-32bit-1.0.1e-1.1.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(46934)libudev-devel-195-13.29.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(46935)libudev1-195-13.29.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(47208)nfs-client-1.2.7-2.10.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(47253)openssl-1.0.1e-1.1.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(47259)os-prober-1.49-7.7.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(47378)permissions-2013.01.29.1841-1.1.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(47398)pm-utils-1.4.1-26.13.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(47506)release-notes-openSUSE-12.3.10-1.22.1.noarch(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(47599)systemd-195-13.29.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(47600)systemd-32bit-195-13.29.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(47601)systemd-analyze-195-13.29.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(47603)systemd-sysvinit-195-13.29.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(47648)udev-195-13.29.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(47671)virtuoso-drivers-6.1.6-3.1.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper++] Summary.cc(readPool):134 <uninstall> I_TsU(47672)virtuoso-server-6.1.6-3.1.1.x86_64(@System)
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper] Summary.cc(readPool):300 package update candidates: 27
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper] Summary.cc(readPool):301 to be actually updated: 21
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper] Summary.cc(readPool):300 product update candidates: 0
2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper] Summary.cc(readPool):301 to be actually updated: 0

这就是一条比较完整的安装摘要,类似于你之前运行 zypper up 的时候命令行返回的那些消息。但注意,这些只是准备要做的工作,真正做了没有呢?to be actually updated: 0,没有做。如果这里不是 0,那就表示做了,你要关注的是做过了的信息,而不是没有做的信息。

所以我们可以更加方便一些:

su
cat /var/log/zypper.log | grep "Summary.cc" | tail -n 100

于是就都是这样的信息了。

甚至我们还可以排除我们已经读过的信息,比如:

su
cat zypper.log | grep "Summary.cc" | tail -n 500 | head -n 400

这样我们就是,先取倒数 500 行,然后从这倒数 500 行里取前面的 400 行,于是我们看过的最后 100 行就不显示了。

通过那个数字,你可以玩得很欢乐的!

注:

一条 zypper 日志的格式是这样:

2013-09-08 16:36:11 <1> hathaway.site(31511) [zypper] Summary.cc(readPool):301 to be actually updated: 0

时间 + 主机名 (进程号) 主程序 ] 主程序的模块 ](操作):提示消息

我们需要关注的是:时间,主程序,和主程序的模块。这样能够方便我们 grep。

主程序我简单翻了一下 libsolv libsolv++ zypp zypper 和 zypper++,但用处不大。

主程序的模块我简单翻了一下,常见的有:

当然具体的解释还是要去看 zypper 和其它那些主程序的源代码,比如 github.com/openSUSE/zypper

我这是根据日志里面的提示信息推断出来的,不是很准确。

主程序主要起到一个「命名空间」的作用,然后下面那堆 cc 有的属于 libresolv 有的属于 libresolv++ 这样,比较重要的是后面。

反正简单分析下,对于我们的看日志帮助回忆的用法,只看 Summary.cc 的内容就够了。

Enjoy!又填好一个坑了…

1赞

send from my openSUSE using Tapatalk

薇姐这是做到用户的极致了… 要不是你在国外真想邀请你加入中文开发啊。

为什么我觉得 libQtWebKit4 和 bnc#835317 是一个问题呢?

我觉得这个可以作为回帖指导之一了,当然是进阶版的,要求大部分用户做到这个程度不太现实,但放在这里做参考很不错的样子

bugzilla.novell.com/show_bug.cgi?id=835317
确实就是 libQtWebKit4 的问题……文章里面那一段好奇怪