Jak programowo określić najwyższą zainstalowaną wersję RPM jądra?

9

To, co chcę napisać, to coś w stylu:

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

Problem polega na tym, że jeśli wynik rpm -q kerneljest podobny do:

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

… Jak ustalić, która z nich jest wyższa? Wiem, że proste sortowanie łańcuchów nie jest niezawodne (w tym przykładzie będzie odwrotnie). Czy istnieje skrót do rpm, czy muszę samodzielnie wszystko przeanalizować i porównać?

Sosiouxme
źródło
Możesz do tego użyć /var/log/yum.log. Lub 'ls -lht / boot | grep vmlinuz 'jeśli jądro jest tym, czym jesteś zainteresowany.
schaiba
Nie są to niezawodne metody określania, która wersja jest wyższa. Sprawdzanie / bootowanie może obejmować jądra, które są przeznaczone dla zupełnie różnych partycji multiboot.
sosiouxme
Może zastanawiam się nad tym. jądro rpm -q zawsze wydaje się wyświetlać jądra w kolejności wersji. Czy to jest wiarygodne?
sosiouxme
'ls -lht / boot | grep vmlinuz | grep el6 ':)
schaiba
1
I sort -Vnie daje poprawnego wyniku?
Runium

Odpowiedzi:

14

TL; DR

Trzecia próba faktycznie działa! Opuszczam pierwsze 2 próby, aby inni, którzy mogą spotkać się z tymi pytaniami i odpowiedziami w przyszłości, mają nadzieję uzyskać pewien wgląd w to, jak nietrywialny problem to parsowanie informacji o wersji RPM i określenie pochodzenia, który był pierwszy, drugi, itp.

Próba nr 1 (OP powiedział, że nie działa)

To polecenie posortuje dane wyjściowe i wyświetli je w kolejności wersji:

$ 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

DLACZEGO TO NIE DZIAŁA: Naiwna osoba pomyślałaby, że możesz użyć jakiegoś wariantu sortpolecenia do wykonania tego zadania, ale istnieje wystarczająca zmienność i niespójność w formatowaniu informacji o aktualnej wersji dla danego RPM, że to po prostu nie jest ' t do zadania.

Próba # 2 (OP powiedział, że nie działa)

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

DLACZEGO TO NIE DZIAŁA: Miałem wielką nadzieję, że takie podejście przyniesie wyniki, których szukał PO, ale problemem z tym, jak zauważył @Joel w komentarzach, jest to, że --lastprzełącznik po prostu zwraca wyniki posortowane według data zainstalowania RPM.

Próba # 3

Ten z pewnością wykona zadanie. Znalazłem zestaw narzędzi o nazwie RPM Development Tools. W tym pakiecie znajdują się 2 narzędzia, które umożliwią określenie, czy jedna wersja RPM jest nowsza czy starsza od innej.

Jeśli RPM nie jest jeszcze zainstalowany, możesz to zrobić w następujący sposób:

yum install rpmdevtools

Pierwsze przydatne narzędzie nazywa się rpmdev-vercmp. To narzędzie może porównać 2 nazwy RPM i powiedzieć, która z nich jest nowsza. Na przykład:

$ 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

Po znalezieniu tego, wszystko było gotowe, aby napisać skrypt powłoki, ale potem zrozumiałem, człowieku, jestem leniwy, więc naciągnąłem jeszcze kilka minut i znalazłem inne narzędzie w pakiecie o nazwie rpmdev-sort.

To narzędzie jest brudne. Możesz użyć tego w następujący sposób:

$ 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

Istnieje wiele narzędzi w RPM Development Tools, które mogą być warte poszukiwania innych, dlatego wymieniam je tutaj w celu późniejszego wykorzystania.

$ 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

Alternatywa dla # 3

Alternatywą, z której korzysta OP wymieniona w komentarzach, jest skorzystanie sort -V. To stolica -V. Nigdy nie słyszałem o tym przełączniku. Ze strony podręcznika sort:

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

Jak się okazuje, sortzapewnia funkcję sortowania numerów wersji, dzięki czemu można również wykonać sortowanie w następujący sposób:

$ 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
slm
źródło
Przepraszam, nie sądzę. Proste sortowanie łańcuchów umieściłoby jądro-2.6.10 przed jądrem-2.6.9. To musi działać ogólnie, nie tylko dla przykładu.
sosiouxme
-n pomaga tylko z pierwszym numerem. Spróbuj posortować to: 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 sortowanie jest tutaj absolutnie niewłaściwym narzędziem, a także cokolwiek innego, co nie wie nic o schematach wersji.
sosiouxme
@slm --lastsortuje według czasu instalacji pakietu, niekoniecznie będzie to najnowsze jądro (na przykład, jeśli wykonali ręczną instalację rpm niższej wersji jądra).
Bratchley,
1
sort -V rzecz nie powiedzie się w jednym kontekście. Powiedzmy, że chcesz porównać 2 wersje pakietu - 1.15-abc i 1.15-2ab. Polecenie sort powiedziałoby, że 1,15-abc jest wyższe niż 1,15-2ab. Ale tak naprawdę, dla rpm, 2ab jest wyższy niż abc.
crisron,
1
sort -V bardzo różni się od rpmdev-sort. W ogóle nie używałbym tego z rpms. Jest ok na szybki rzut oka, ale to wszystko.
Tommi Kyntola
1

Naprawdę musisz użyć biblioteki RPM, aby uzyskać dobry wynik. Algorytm porównywania wersji jest ... zdecydowanie złożony. Ponowna implementacja w powłoce nie jest trywialna, ale jeśli możesz użyć Pythona do wykonania rzeczywistego porównania, staje się to stosunkowo proste. Zobacz /programming/3206319/how-do-i-compare-rpm-versions-in-python, aby dowiedzieć się, jak to zrobić.

Jan
źródło
1
rpm -q kernel --queryformat="%{buildtime}\t%{name}-%{version}-%{release}.%{arch}\n" | sort -nr | head -1 | cut -f2

Sądzę, że sortowanie według czasu kompilacji rzadziej ma przypadek narożny, w którym kończy się niepowodzeniem, w przeciwieństwie do czasu instalacji. Jednak --last jest fajniejszy.

Ian
źródło
0

--lastnie powie Ci najwyższego numeru wersji, ale uporządkuje według daty instalacji. Abyś mógł zobaczyć najnowszą wersję:

[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

Przez większość czasu (chyba że zrobili ręczną instalację jądra) oba powinny być takie same.

Aby uzyskać 100% poprawność w 100% przypadków, będziesz musiał sprowadzić dwie wersje jądra do 2.6.*formatu, a następnie po prostu rozdzielić go, zaczynając od wersji 2.6 (RHEL nie zmieni tak drastycznie w ramach jednej wersji, RHEL5 zawsze będzie jądrem 2.6) i po prostu iteruje każdą linię wyjścia rpm (ewentualnie posortowane według --lastwydajności) i porównuje każdą pozycję z analogiczną pozycją w wersji jądra, z której otrzymałeś, uname -rjeśli którakolwiek liczba jest większa w ciągu db rpm db niż ciąg uname, natychmiast zakończ z tą wiadomością.

Aby pomóc tam istnieje podobne pytanie zadawane tutaj . Ale ta funkcja zakłada czysto kropkowany zapis dziesiętny, więc możesz porównać pozycję liczb przed myślnikiem (ponieważ jest tylko jeden), a następnie użyć funkcji bash tej osoby, aby sprawdzić, czy wersja łatki jest wyższa unameniż w ciągu db rpm db.

Bratchley
źródło
0
[root@ip-172-31-36-134 ~]# whatis grub2-rpm-sort
grub2-rpm-sort (8)   - Sort input according to RPM version compare.
[root@ip-172-31-36-134 ~]# rpm -qf `which grub2-rpm-sort`
grub2-tools
Owen Mann
źródło
Witamy na stronie i dziękuję za Twój wkład. Niestety, nie jest wcale jasne, jak twoja odpowiedź odnosi się do pytania o wersje jądra zadane przez OP. Edytuj post, aby wyjaśnić.
AdminBee
To nie daje odpowiedzi na pytanie. Gdy zdobędziesz wystarczającą reputację , będziesz mógł komentować dowolny post ; zamiast tego podaj odpowiedzi, które nie wymagają wyjaśnienia od pytającego . - Z recenzji
Kiwy
1
Owen, wskazałeś program o nazwie grub2-rpm-sort i który pakiet go zawiera, ale nie „skąd mam wiedzieć, czy uname -rnie jest zainstalowany najwyższy poziom RPM jądra”. Program brzmi, jakby mógł rozwiązać problem, więc jeśli mógłbyś przeliterować to dla PO, byłaby to dobra odpowiedź. Dziękuję Ci!
Jeff Schaller