インストールされている最高バージョンのカーネルRPMをプログラムで決定する方法は?


9

スクリプト化したいのは、次のようなものです。

if [ uname -r is not == highest version of kernel RPM installed ]
then
  echo "You need to reboot to use the latest kernel"
fi

問題は、の出力rpm -q kernelが次のようなものである場合です。

kernel-2.6.32-358.10.2.el6.x86_64
kernel-2.6.32-358.6.1.el6.x86_64

…どちらが高いかをどのように判断しますか?単純な文字列ソートは信頼できないことを知っています(この例では逆になります)。rpmのショートカットはありますか、それともすべてを解析して自分で比較する必要がありますか?


/var/log/yum.logを使用できます。または 'ls -lht / boot | カーネルがあなたが興味を持っているものであれば、grep vmlinuz '
schaiba

これらは、どちらが上位バージョンであるかを判別するための信頼できる方法ではありません。/ bootを確認すると、まったく異なるマルチブートパーティション用のカーネルが含まれる場合があります。
sosiouxme 2013年

多分私はそれを考えすぎています。rpm -q kernelは常にカーネルをバージョン順にリストしているようです。信頼できますか?
sosiouxme 2013年

'ls -lht / boot | grep vmlinuz | grep el6 ':)
schaiba 2013年

1
そしてsort -V、正しい結果が得られませんか?
Runium 2013年

回答:


14

TL; DR

3回目の試行は実際に機能します。私は最初の2つの試みを残します。将来このQ&Aに遭遇する可能性のある他の人が、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

機能しない理由世間知らずの人は、sortコマンドの一部のバリアントを使用してこのタスクを実行できると考えていますが、特定のRPMの実際のバージョン情報のフォーマットには十分なばらつきがあり、一貫性がありません。タスクまで。

試行#2(OPは機能しなかったと述べた)

$ rpm -q --last kernel | head -n 1 | cut -d' ' -f1
kernel-2.6.35.14-106.fc14

うまくいかなかった理由このアプローチでOPが探している結果が得られることを期待していましたが、@ Joelがコメントで指摘したように、この方法の問題は、--lastスイッチが単にソートされた結果を返すことですRPMがインストールされた日付。

試行#3

これは間違いなく仕事をします。RPM開発ツールと呼ばれる一連のツールを見つけました。このスイートには2つのツールがあり、RPMのあるバージョンが別のバージョンよりも新しいか古いかを判別することができます。

RPMがまだインストールされていない場合は、次のようにしてインストールできます。

yum install rpmdevtools

便利な最初のツールはと呼ばれrpmdev-vercmpます。このツールは、RPMの2つの名前を比較して、どちらが新しいかを通知します。例えば:

$ 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

これを見つけた後、私はすべてシェルスクリプトを組み立てる準備が整いましたが、気がついたので私は怠惰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

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

#3の代替

コメントで言及されているOPの代替手段はを使用することsort -Vです。それは首都-Vです。このスイッチについても聞いたことがありません。sortmanページから:

-V, --version-sort
       natural sort of (version) numbers within text

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

すみません、そうは思いません。単純な文字列ソートでは、kernel-2.6.9よりもkernel-2.6.10が優先されます。これは、例だけでなく、一般的に機能する必要があります。
sosiouxme 2013年

-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 274.8.2.el5並べ替えは、ここでは絶対に間違ったツールですバージョンリリーススキームについて何も知りません。
sosiouxme 2013年

@slm --lastはパッケージのインストール時間でソートされ、必ずしも最新のカーネルになるとは限りません(たとえば、より低いバージョンのカーネルを手動でrpmインストールした場合)。
Bratchley 2013年

1
sort -Vは1つのコンテキストで失敗します。たとえば、パッケージの2つのバージョン(1.15-abcと1.15-2ab)を比較したいとします。sortコマンドは、1.15-abcが1.15-2abより高いと言います。しかし、実際には、rpmの場合、2abはabcよりも高くなっています。
crisron 2015

1
sort -Vは、rpmdev-sortとはかなり異なります。私はそれをrpmでまったく使用しません。一見すると大丈夫ですが、それだけです。
Tommi Kyntola 2017

1

良い結果を得るには、RPMライブラリを使用する必要があります。バージョン比較アルゴリズムは...明らかに複雑です。シェルで再実装するのは簡単ではありませんが、Pythonを使用して実際の比較を行うことができれば、比較的簡単になります。方法の例については、https: //stackoverflow.com/questions/3206319/how-do-i-compare-rpm-versions-in-pythonを参照してください


1
rpm -q kernel --queryformat="%{buildtime}\t%{name}-%{version}-%{release}.%{arch}\n" | sort -nr | head -1 | cut -f2

buildtimeによるソートは、installtimeとは異なり、失敗するというまれなケースがある可能性が低いと思います。ただし、-lastの方がきれいです。


0

--last最新のバージョン番号はわかりませんが、インストール日順に並べられます。したがって、最近インストールされたバージョンを確認できます。

[root@xms_apps ~]# rpm -qa kernel-xen --last
kernel-xen-2.6.18-348.1.1.el5                 Tue 29 Jan 2013 02:18:52 PM EST
kernel-xen-2.6.18-308.11.1.el5                Fri 20 Jul 2012 04:00:26 PM EDT
kernel-xen-2.6.18-308.8.2.el5                 Wed 20 Jun 2012 03:32:47 PM EDT

ほとんどの場合(手動でカーネルをインストールしない限り)、2つは同じであるはずです。

100%正確に100%の時間で取得するには、2つのカーネルバージョンを2.6.*フォーマットしてから、2.6以降で分解する必要があります(RHELは、単一バージョンのRHEL5で大幅にリベースしません)常に2.6カーネル)であり、rpm出力の各行を反復処理し(おそらく--lastパフォーマンスのためにソートされます)uname -r、rpm dbの文字列で数値が大きい場合は、各位置を、取得したカーネルバージョンの類似の位置と比較しますuname文字列よりもすぐに、そのメッセージで終了します。

あなたを助けるために、ここで同様の質問があります。しかし、その関数は純粋にドットで区切られた10進表記を想定しているため、ハイフンの前の数値位置を比較して(1つしかないため)、その人のbash関数を使用して、パッチバージョンがunamerpm db文字列よりも高いかどうかをテストします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.