Kurulu en yüksek sürüm çekirdek RPM programlı olarak nasıl belirlenir?


9

Ne komut dosyası istiyorum satırlarında bir şeydir:

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

Sorun, çıktısı rpm -q kernelşuna benzerse:

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

… Hangisinin daha yüksek olduğunu nasıl belirlerim? Basit bir dize sıralama güvenilir olmadığını biliyorum (bu örnek ile geriye doğru olacak). RPM ile bir kısayol var mı veya her şeyi ayrıştırıp kendim karşılaştırmam gerekiyor mu?


Bunun için /var/log/yum.log kullanabilirsiniz. Veya 'ls -lht / boot | grep vmlinuz 'eğer ilgilendiğiniz çekirdekse.
schaiba

Bunlar, hangisinin daha yüksek bir sürüm olduğunu belirlemek için güvenilir yöntemler değildir. Kontrol / önyükleme, tamamen farklı çoklu önyükleme bölümleri için çekirdekler içerebilir.
sosiouxme

Belki de çok fazla düşünüyorum. rpm -q çekirdeği her zaman çekirdekleri sürüm sırasıyla listeler. Güvenilir mi?
sosiouxme

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

1
Ve sort -Vdoğru sonuç vermiyor mu?
Runium

Yanıtlar:


14

TL; DR

3. deneme gerçekten işe yarıyor! İlk 2 denemeden ayrılıyorum, böylece gelecekte bu soru-cevapla karşılaşabilecek diğerleri umarım RPM sürüm bilgilerini ayrıştırmanın ve birinci, ikinci gelen soyunu belirlemenin ne kadar önemsiz bir sorun olduğu konusunda fikir sahibi olacaklar, vb.

Deneme # 1 (OP dedi ki işe yaramadı)

Bu komut, çıktıyı sıralar ve size sürüm sırasıyla verir:

$ 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

NEDEN ÇALIŞMIYOR: Saf bir kişi, sortbu görevi gerçekleştirmek için komutun bazı varyantlarını kullanabileceğinizi düşünür , ancak belirli bir RPM için gerçek sürüm bilgilerinin biçimlendirilmesinde yeterli değişkenlik ve tutarsızlık vardır. t göreve kadar.

Deneme # 2 (OP dedi ki işe yaramadı)

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

NEDEN ÇALIŞMIYOR: Bu yaklaşımın OP'nin aradığı sonuçları vermesini umuyordum, ancak @Joel'in yorumlarda işaret ettiği gibi bu konu, --lastanahtarın yalnızca sonuçları sıralamasına döndürüyor olması. RPM'lerin kurulduğu tarih.

Deneme # 3

Bu kesinlikle işi yapacak. RPM Geliştirme Araçları adlı bir araç seti buldum. Bu pakette, bir RPM'nin bir sürümünün diğerinden daha yeni veya daha eski olup olmadığını belirleme olanağı sağlayacak 2 araç vardır.

RPM zaten yüklü değilse, aşağıdakileri yapabilirsiniz:

yum install rpmdevtools

Yararlı ilk araca denir rpmdev-vercmp. Bu araç, 2 RPM adını karşılaştırabilir ve hangisinin daha yeni olduğunu söyleyebilir. Örneğin:

$ 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

Bunu bulduktan sonra bir kabuk senaryosu bir araya getirmek için hazırlandım ama sonra tembel olduğumu fark ettim, bu yüzden birkaç dakika daha dürttüm ve denilen süitte başka bir araç buldum rpmdev-sort.

Bu araç ücretlidir. Aşağıdaki gibi kullanabilirsiniz:

$ 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 Geliştirme Araçları'nda başkaları için bir göz atmaya değer olabilecek birçok araç var, bu yüzden gelecekteki referans için burada listeliyorum.

$ 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'e bir alternatif

Yorumlarda bahsedilen OP'nin bir alternatifi kullanmaktır sort -V. Bu bir başkent -V. Bu anahtarı da hiç duymamıştım. Gönderen sortadam sayfası:

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

Anlaşıldığı gibi, sortsürüm numaralarını sıralamak için bir olanak sağlar, böylece sıralamayı şu şekilde de yapabilirsiniz:

$ 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

Üzgünüm, sanmıyorum. Basit bir dize sıralaması çekirdek-2.6.10'u çekirdek-2.6.9'dan önce koyacaktır. Bunun sadece örnek için değil, genel olarak çalışması gerekir.
sosiouxme

-n sadece ilk numaraya yardımcı olur. Bunu sıralamayı deneyin: 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 sıralaması burada kesinlikle yanlış bir araç ve başka bir şey sürüm sürümü şemaları hakkında hiçbir şey bilmiyor.
sosiouxme

@slm --last, paket kurulum süresine göre sıralar, en son çekirdek olmayabilir (örneğin, daha düşük bir çekirdek sürümünün manuel rpm yüklemesini yapmışlarsa).
Bratchley

1
sort -V şey bir bağlamda başarısız olur. Bir paketin 2 sürümünü karşılaştırmak istediğinizi varsayalım: 1.15-abc ve 1.15-2ab. Sıralama komutu, 1.15-abc'nin 1.15-2ab'dan daha yüksek olduğunu söyler. Ancak infeksiyon, rpm için, 2ab abc'den daha yüksektir.
crisron

1
sort -V rpmdev-sort'den çok farklı. Ben hiç rpms ile kullanmak olmaz. Hızlı bir bakış için sorun değil, hepsi bu.
Tommi Kyntola

1

İyi bir sonuç almak için RPM kütüphanesini kullanmanız gerekir. Sürüm karşılaştırma algoritması ... kesinlikle karmaşık. Kabukta yeniden uygulama yapmak önemsizdir, ancak gerçek karşılaştırmayı yapmak için Python'u kullanabiliyorsanız, nispeten basit hale gelir. Bunun nasıl yapılacağına dair bir örnek için /programming/3206319/how-do-i-compare-rpm-versions-in-python adresine bakın .


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

Buildtime'a göre sıralama işleminin, yükleme süresinin aksine başarısız olduğu bir köşe durumuna sahip olma olasılığının daha düşük olduğunu düşünüyorum. Ancak, --last daha temizdir.


0

--lastsize en yüksek sürüm numarasını söylemez ancak kurulum tarihine göre sipariş verir. Böylece en son yüklenen sürümü görebilirsiniz:

[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

Çoğu zaman (manuel bir çekirdek yüklemesi yapmadıkları sürece) ikisi aynı olmalıdır.

Zamanın% 100 doğru olmasını sağlamak için, iki çekirdek sürümünü 2.6.*biçimlendirmek için aşağı indirmeniz ve 2.6'dan sonra ayırmanız gerekir (RHEL, tek bir sürümde RHEL5'i büyük ölçüde yeniden oluşturmaz. her zaman 2.6 çekirdek olacaktır) ve sadece rpm çıkışının her satırında yinelenir (muhtemelen --lastperformansa göre sıralanır ) ve her bir konumu uname -rrpm db'nin dizesindeki sayılardan daha büyükse, aldığınız çekirdek sürümündeki analog konumla karşılaştırın uname dizesinden daha sonra bu mesajla hemen çıkın.

Orada size yardımcı olmak için benzer bir soru var . Ancak bu işlev tamamen noktalı ondalık gösterimi varsayar, bu nedenle tire işaretinden önceki sayı konumunu karşılaştırabilirsiniz (yalnızca bir tane olduğundan), yama sürümünün unamerpm db dizesinden daha yüksek olup olmadığını test etmek için o kişinin bash işlevini kullanabilirsiniz .


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

Siteye hoş geldiniz ve katkınız için teşekkür ederiz. Ne yazık ki cevabınızın OP tarafından sorulan çekirdek sürümleri sorusuyla nasıl ilişkili olduğu açık değildir. Lütfen açıklığa kavuşturmak için yayınınızı düzenleyin.
AdminBee

1
Owen, grub2-rpm-sort adlı bir programa ve hangi paketin içerdiğine işaret ettiniz, ancak " uname -ryüklü en yüksek çekirdek RPM düzeyi olup olmadığını nasıl anlarım ". Program sorunu çözebilir gibi geliyor , bu yüzden eğer OP için bunu heceleyebilirseniz, bu iyi bir cevap olacaktır. Teşekkür ederim!
Jeff Schaller
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.