Wie kann programmgesteuert die höchste installierte Kernel-RPM-Version ermittelt werden?


9

Was ich schreiben möchte, ist etwas in der Art von:

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

Das Problem ist, wenn die Ausgabe von rpm -q kernelso etwas wie:

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

… Wie bestimme ich, welche höher ist? Ich weiß, dass eine einfache Zeichenfolgensortierung nicht zuverlässig ist (in diesem Beispiel ist sie rückwärts). Gibt es eine Verknüpfung mit U / min oder muss ich alles analysieren und selbst vergleichen?


Sie können dafür /var/log/yum.log verwenden. Oder 'ls -lht / boot | grep vmlinuz 'wenn der Kernel das ist, woran Sie interessiert sind.
schaiba

Dies sind keine zuverlässigen Methoden, um festzustellen, welche Version höher ist. Das Überprüfen / Booten kann Kernel enthalten, die für völlig unterschiedliche Multiboot-Partitionen bestimmt sind.
Sosiouxme

Vielleicht überdenke ich es. Der Kernel rpm -q scheint die Kernel immer in der Versionsreihenfolge aufzulisten. Ist das zuverlässig?
Sosiouxme

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

1
Und sort -Vgibt nicht das richtige Ergebnis?
Runium

Antworten:


14

TL; DR

Der 3. Versuch funktioniert tatsächlich! Ich lasse die ersten beiden Versuche, damit andere, die in Zukunft auf diese Fragen und Antworten stoßen, hoffentlich einen Einblick in das nicht triviale Problem erhalten, RPM-Versionsinformationen zu analysieren und die Herkunft zu bestimmen, die zuerst, zweitens, usw.

Versuch Nr. 1 (OP sagte, hat nicht funktioniert)

Dieser Befehl sortiert die Ausgabe und gibt sie in der Versionsreihenfolge aus:

$ 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

WARUM ES NICHT FUNKTIONIERTE: Eine naive Person würde denken, dass Sie eine Variante des sortBefehls verwenden können, um diese Aufgabe auszuführen, aber die Formatierung der tatsächlichen Versionsinformationen für eine bestimmte Drehzahl ist so variabel und inkonsistent, dass es einfach nicht so ist. t bis zur Aufgabe.

Versuch Nr. 2 (OP sagte, hat nicht funktioniert)

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

WARUM ES NICHT FUNKTIONIERTE: Ich hatte große Hoffnungen, dass dieser Ansatz die Ergebnisse liefern würde, nach denen das OP gesucht hatte, aber das Problem bei diesem Ansatz, wie @Joel in den Kommentaren hervorhob, ist, dass der --lastSchalter lediglich die Ergebnisse sortiert nach zurückgibt das Datum, an dem die RPMs installiert wurden.

Versuch Nr. 3

Dieser wird definitiv den Job machen. Ich habe eine Reihe von Tools namens RPM Development Tools gefunden. Diese Suite enthält zwei Tools, mit denen Sie feststellen können, ob eine Version eines RPM neuer oder älter als eine andere ist.

Wenn das RPM noch nicht installiert ist, können Sie dies wie folgt tun:

yum install rpmdevtools

Das erste nützliche Tool heißt rpmdev-vercmp. Dieses Tool kann 2 Namen von RPMs vergleichen und Ihnen sagen, welcher neuer ist. Zum Beispiel:

$ 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

Nachdem ich das gefunden hatte, war ich bereit, ein Shell-Skript zusammenzustellen, aber dann wurde mir klar, Mann, ich bin faul, also stocherte ich noch ein paar Minuten und fand ein anderes Tool in der Suite namens rpmdev-sort.

Dieses Tool ist Pay-Dirt. Sie können es wie folgt verwenden:

$ 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

Es gibt viele Tools in RPM-Entwicklungstools, die für andere einen Blick wert sein könnten, daher liste ich sie hier als zukünftige Referenz auf.

$ 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

Eine Alternative zu # 3

Eine Alternative, die das OP in den Kommentaren erwähnt, ist die Verwendung sort -V. Das ist eine Hauptstadt -V. Ich hatte auch noch nie von diesem Schalter gehört. Von der sortManpage:

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

Wie sich herausstellt, sortbietet es eine Möglichkeit, Versionsnummern zu sortieren, sodass Sie die Sortierung auch folgendermaßen durchführen können:

$ 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

Entschuldigung, das glaube ich nicht. Eine einfache Zeichenfolgensortierung würde Kernel-2.6.10 vor Kernel-2.6.9 setzen. Dies muss generisch funktionieren, nicht nur für das Beispiel.
Sosiouxme

-n hilft dir nur bei der ersten Nummer. Versuchen Sie Folgendes zu sortieren: 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 Die Sortierung ist hier absolut falsch, ebenso wie alles andere weiß nichts über Versionsfreigabeschemata.
Sosiouxme

@slm --lastsortiert nach Paketinstallationszeit , es wird nicht unbedingt der neueste Kernel sein (wenn sie beispielsweise eine manuelle RPM-Installation einer niedrigeren Kernelversion durchgeführt haben).
Bratchley

1
sort -V Ding wird in einem Kontext fehlschlagen. Angenommen, Sie möchten zwei Versionen eines Pakets vergleichen - 1.15-abc und 1.15-2ab. Der Sortierbefehl würde sagen, dass 1.15-abc höher als 1.15-2ab ist. Tatsächlich ist 2ab für U / min höher als abc.
Crisron

1
sort -V unterscheidet sich stark von rpmdev-sort. Ich würde das mit RPMs überhaupt nicht verwenden. Es ist in Ordnung für einen kurzen Blick, aber das war's.
Tommi Kyntola

1

Sie müssen wirklich die RPM-Bibliothek verwenden, um ein gutes Ergebnis zu erzielen. Der Versionsvergleichsalgorithmus ist ... ausgesprochen komplex. Die Neuimplementierung in der Shell ist nicht trivial, aber wenn Sie Python für den eigentlichen Vergleich verwenden können, wird dies relativ einfach. Unter /programming/3206319/how-do-i-compare-rpm-versions-in-python finden Sie ein Beispiel dafür.


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

Ich denke, dass das Sortieren nach Buildtime im Gegensatz zur Installationszeit weniger wahrscheinlich einen Eckfall hat, in dem es fehlschlägt. Allerdings ist --last ordentlicher.


0

--lastDie höchste Versionsnummer wird nicht angegeben, aber nach Installationsdatum sortiert. So können Sie die zuletzt installierte Version sehen:

[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

Die meiste Zeit (es sei denn, sie haben eine manuelle Kernelinstallation durchgeführt) sollten die beiden gleich sein.

Um 100% der Zeit 100% richtig zu machen, müssen Sie die beiden Kernel-Versionen auf das 2.6.*Format reduzieren und sie dann ab Version 2.6 auseinander brechen (RHEL wird dies in einer einzelnen Version, RHEL5, nicht drastisch zurücksetzen wird immer ein 2.6-Kernel sein) und einfach über jede Zeile der Drehzahlausgabe iterieren (möglicherweise nach --lastLeistung sortiert ) und jede Position mit der analogen Position in der Kernel-Version vergleichen, von der Sie erhalten haben, uname -rwenn eine der Zahlen in der Zeichenfolge der Drehzahl-Datenbank größer ist Beenden Sie die Meldung sofort mit dieser Nachricht.

Damit Sie da draußen gibt es eine ähnliche Frage hier gefragt . Diese Funktion setzt jedoch eine rein gepunktete Dezimalschreibweise voraus. Sie können also die Zahlenposition vor dem Bindestrich vergleichen (da es nur einen gibt) und dann mit der Bash-Funktion dieser Person testen, ob die Patch-Version höher ist unameals in der RPM-DB-Zeichenfolge.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.