Bagaimana secara program menentukan RPM kernel versi tertinggi yang diinstal?

9

Yang ingin saya skrip adalah sesuatu di sepanjang baris:

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

Masalahnya adalah, jika outputnya rpm -q kernelseperti:

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

... bagaimana saya menentukan mana yang lebih tinggi? Saya tahu semacam string sederhana tidak dapat diandalkan (itu akan mundur dengan contoh ini). Apakah ada jalan pintas dengan rpm atau apakah saya harus menguraikan semuanya dan membandingkannya sendiri?

sosiouxme
sumber
Anda dapat menggunakan /var/log/yum.log untuk itu. Atau 'ls -lht / boot | grep vmlinuz 'jika kernel yang Anda minati.
schaiba
Itu bukan metode yang dapat diandalkan untuk menentukan yang merupakan versi yang lebih tinggi. Memeriksa / mem-boot mungkin menyertakan kernel yang untuk partisi multiboot yang sama sekali berbeda.
sosiouxme
Mungkin aku terlalu memikirkannya. rpm -q kernel selalu menampilkan kernel dalam urutan versi. Apakah itu dapat diandalkan?
sosiouxme
'ls -lht / boot | grep vmlinuz | grep el6 ':)
schaiba
1
Dan sort -Vtidak memberikan hasil yang benar?
Runium

Jawaban:

14

TL; DR

Upaya ke-3 benar-benar berhasil! Saya meninggalkan 2 upaya pertama sehingga orang lain yang mungkin menemukan T&J ini di masa depan mudah-mudahan akan mendapatkan beberapa wawasan tentang bagaimana non-sepele masalah itu untuk mengurai informasi versi RPM dan menentukan garis keturunan yang datang pertama, kedua, dll.

Percobaan # 1 (OP mengatakan tidak bekerja)

Perintah ini akan mengurutkan output dan memberi Anda urutan versi:

$ 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

MENGAPA TIDAK BEKERJA: Seseorang yang naif akan berpikir bahwa Anda dapat menggunakan beberapa varian dari sortperintah untuk melakukan tugas ini, tetapi ada cukup variabilitas dan ketidakkonsistenan dalam memformat informasi versi aktual untuk RPM tertentu yang hanya tidak dilakukan oleh RPM. t hingga tugas.

Percobaan # 2 (OP mengatakan tidak bekerja)

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

MENGAPA TIDAK BEKERJA: Saya memiliki harapan besar bahwa pendekatan ini akan menghasilkan hasil yang dicari OP, tetapi masalah dengan yang ini seperti yang ditunjukkan oleh @ Joel dalam komentar, adalah bahwa --lastperalihan hanya mengembalikan hasil yang diurutkan berdasarkan tanggal RPM dipasang.

Percobaan # 3

Yang ini pasti akan melakukan pekerjaannya. Saya menemukan serangkaian alat yang disebut RPM Development Tools. Ada 2 alat di suite ini yang akan memberi Anda kemampuan untuk menentukan apakah satu versi RPM lebih baru atau lebih tua dari yang lain.

Jika RPM belum diinstal, Anda dapat melakukannya sebagai berikut:

yum install rpmdevtools

Alat pertama yang berguna disebut rpmdev-vercmp. Alat ini dapat membandingkan 2 nama RPM dan memberi tahu Anda mana yang lebih baru. Sebagai contoh:

$ 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

Setelah menemukan ini, saya siap untuk membuat skrip shell tetapi kemudian menyadari, saya malas, jadi saya menusuk beberapa menit lagi dan menemukan alat lain di suite yang disebut rpmdev-sort.

Alat ini berbayar. Anda dapat menggunakannya sebagai berikut:

$ 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

Ada banyak alat di Alat Pengembangan RPM yang mungkin layak untuk dicari orang lain jadi saya daftar mereka di sini untuk referensi di masa mendatang.

$ 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

Alternatif untuk # 3

Alternatif yang disebutkan OP dalam komentar adalah menggunakan sort -V. Itu modal -V. Aku juga belum pernah mendengar saklar ini. Dari sorthalaman manual:

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

Ternyata sortmemang menyediakan fasilitas untuk mengurutkan nomor versi sehingga Anda juga bisa melakukan pengurutan seperti:

$ 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
sumber
Maaf, kurasa tidak. Semacam string sederhana akan menempatkan kernel-2.6.10 sebelum kernel-2.6.9. Ini harus bekerja secara umum, bukan hanya untuk contoh.
sosiouxme
-n tidak hanya membantu Anda dengan nomor pertama. Coba sortir ini: 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 benar-benar alat yang salah di sini, serta hal lain yang tidak tahu apa-apa tentang skema rilis versi.
sosiouxme
@slm --lastmengurutkan berdasarkan waktu instalasi paket, itu tidak harus menjadi kernel terbaru (jika mereka melakukan instalasi manual rpm dari versi kernel yang lebih rendah, misalnya).
Bratchley
1
semacam -V akan gagal dalam satu konteks. Katakanlah Anda ingin membandingkan 2 versi paket - 1.15-abc dan 1.15-2ab. Perintah sortir akan mengatakan bahwa 1.15-abc lebih tinggi dari 1.15-2ab. Tapi ternyata, untuk rpm, 2ab lebih tinggi dari abc.
crisron
1
sort -V jauh berbeda dengan rpmdev-sort. Saya tidak akan menggunakannya dengan rpms sama sekali. Tidak apa-apa untuk pandangan sekilas, tapi hanya itu.
Tommi Kyntola
1

Anda benar-benar perlu menggunakan perpustakaan RPM untuk mendapatkan hasil yang baik. Algoritma perbandingan versi ... jelas-jelas rumit. Ini tidak mudah untuk menerapkan kembali di shell, tetapi jika Anda dapat menggunakan Python untuk melakukan perbandingan yang sebenarnya, itu menjadi relatif mudah. Lihat /programming/3206319/how-do-i-compare-rpm-versions-in-python untuk contoh bagaimana melakukannya.

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

Saya pikir mengurutkan berdasarkan buildtime cenderung memiliki kasus sudut di mana ia gagal, tidak seperti installtime. Namun, --terakhir lebih rapi.

Ian
sumber
0

--lasttidak akan memberi tahu Anda nomor versi tertinggi tetapi akan memesan berdasarkan tanggal pemasangan. Jadi, Anda dapat melihat versi yang paling baru diinstal:

[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

Sebagian besar waktu (kecuali jika mereka melakukan instalasi kernel manual) keduanya harus sama.

Untuk mendapatkannya 100% benar 100% dari waktu, Anda harus mendapatkan dua versi kernel ke 2.6.*format kemudian hanya memecahnya mulai dari 2,6 (RHEL tidak akan rebase yang secara drastis dalam satu versi, RHEL5 akan selalu berupa kernel 2.6) dan hanya mengulangi setiap baris output rpm (mungkin diurutkan berdasarkan --lastkinerja) dan membandingkan setiap posisi dengan posisi analog dalam versi kernel yang Anda dapatkan uname -rjika salah satu angka lebih besar dalam string db rpm daripada string uname, segera keluar dengan pesan itu.

Untuk membantu Anda di luar sana, ada pertanyaan serupa yang diajukan di sini . Tetapi fungsi itu mengasumsikan notasi desimal murni bertitik, jadi Anda dapat membandingkan posisi angka sebelum tanda hubung (karena hanya ada satu) kemudian gunakan fungsi bash orang tersebut untuk menguji apakah versi tambalan lebih tinggi unamedaripada dalam string db rpm.

Bratchley
sumber