如何以编程方式确定安装的最高版本内核 RPM?

sos*_*xme 9 rpm version

我想要编写的脚本是这样的:

if [ uname -r is not == highest version of kernel RPM installed ]
then
  echo "You need to reboot to use the latest kernel"
fi
Run Code Online (Sandbox Code Playgroud)

问题是,如果输出rpm -q kernel类似于:

kernel-2.6.32-358.10.2.el6.x86_64
kernel-2.6.32-358.6.1.el6.x86_64
Run Code Online (Sandbox Code Playgroud)

……我如何确定哪个更高?我知道一个简单的字符串排序是不可靠的(在这个例子中它会倒退)。rpm 是否有快捷方式,还是我必须解析所有内容并自己进行比较?

slm*_*slm 16

TL; 博士

第三次尝试确实有效!我将放弃前 2 次尝试,以便将来可能遇到此问答的其他人希望能够深入了解解析 RPM 版本信息并确定其世系首先出现的问题是多么重要,第二,等等。

尝试 #1(OP 说没有用)

此命令将对输出进行排序并按版本顺序提供它们:

$ rpm -q kernel --queryformat "%{VERSION} %{RELEASE}\n"|sort -n
2.6.18 238.12.1.el5
2.6.18 238.19.1.el5
2.6.18 274.12.1.el5
2.6.18 308.8.2.el5
Run Code Online (Sandbox Code Playgroud)

为什么它不起作用:天真的人会认为您可以使用sort命令的某些变体来执行此任务,但是对于给定的 RPM,实际版本信息的格式存在足够多的可变性和不一致的情况t 来完成任务。

尝试 #2(OP 说没有用)

$ rpm -q --last kernel | head -n 1 | cut -d' ' -f1
kernel-2.6.35.14-106.fc14
Run Code Online (Sandbox Code Playgroud)

为什么它不起作用:我寄希望于这种方法会产生 OP 正在寻找的结果,但是正如@Joel 在评论中指出的那样,这个方法的问题是--last开关仅返回按以下顺序排序的结果安装 RPM 的日期。

尝试 #3

这个肯定会完成这项工作。我找到了一套名为 RPM 开发工具的工具。该套件中有 2 个工具可以让您确定一个 RPM 版本是比另一个版本新还是旧。

如果尚未安装 RPM,您可以按如下方式安装:

yum install rpmdevtools
Run Code Online (Sandbox Code Playgroud)

第一个有用的工具称为rpmdev-vercmp. 该工具可以比较 2 个 RPM 名称,并告诉您哪个是较新的。例如:

$ rpmdev-vercmp kernel-2.6.35.14-100.fc14.x86_64 kernel-2.6.35.14-103.fc14.x86_64
0:kernel-2.6.35.14-103.fc14.x86_64 is newer
Run Code Online (Sandbox Code Playgroud)

找到这个之后,我准备把一个 shell 脚本放在一起,但后来意识到,伙计,我很懒,所以我又戳了几分钟,在套件中找到了另一个名为rpmdev-sort.

这个工具是付费的。您可以按如下方式使用它:

$ rpm -q kernel | rpmdev-sort 
kernel-2.6.35.14-100.fc14.x86_64
kernel-2.6.35.14-103.fc14.x86_64
kernel-2.6.35.14-106.fc14.x86_64
Run Code Online (Sandbox Code Playgroud)

RPM 开发工具中有很多工具可能值得其他人查看,因此我将它们列在这里以供将来参考。

$ rpm -q --queryformat '[%{NAME} %{FILEMODES:perms} %{FILENAMES}\n]' rpmdevtools \
    | grep -E "^.* -..x..x..x " \
    | awk '{print $3}'          \
    | sed 's#/usr/bin/##'       \
    | paste - - -               \
    | column -t

annotate-output   checkbashisms    licensecheck
manpage-alert     rpmargs          rpmdev-bumpspec
rpmdev-checksig   rpmdev-cksum     rpmdev-diff
rpmdev-extract    rpmdev-md5       rpmdev-newinit
rpmdev-newspec    rpmdev-packager  rpmdev-rmdevelrpms
rpmdev-setuptree  rpmdev-sha1      rpmdev-sha224
rpmdev-sha256     rpmdev-sha384    rpmdev-sha512
rpmdev-sort       rpmdev-sum       rpmdev-vercmp
rpmdev-wipetree   rpmelfsym        rpmfile
rpminfo           rpmls            rpmpeek
rpmsodiff         rpmsoname        spectool
Run Code Online (Sandbox Code Playgroud)

#3 的替代方案

评论中提到的 OP 的另一种选择是使用sort -V. 那是一个资本-V。我也从来没有听说过这个开关。从sort手册页:

-V, --version-sort
       natural sort of (version) numbers within text
Run Code Online (Sandbox Code Playgroud)

事实证明,sort它确实提供了一种对版本号进行排序的工具,因此您也可以像这样执行排序:

$ rpm -q kernel | sort -V
kernel-2.6.35.14-100.fc14.x86_64
kernel-2.6.35.14-103.fc14.x86_64
kernel-2.6.35.14-106.fc14.x86_64
Run Code Online (Sandbox Code Playgroud)