प्रोग्रामेटिक रूप से उच्चतम संस्करण कर्नेल 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

... मैं कैसे निर्धारित करूं कि कौन अधिक है? मुझे पता है कि एक साधारण स्ट्रिंग प्रकार विश्वसनीय नहीं है (यह इस उदाहरण के साथ पीछे होगा)। क्या आरपीएम के साथ एक शॉर्टकट है या क्या मुझे सब कुछ पार्स करना है और इसकी तुलना खुद करनी है?


आप उसके लिए /var/log/yum.log का उपयोग कर सकते हैं। या 'ls -lht / boot | grep vmlinuz 'अगर कर्नेल आप में रुचि रखते हैं।
schaiba

वे निर्धारित करने के लिए विश्वसनीय तरीके नहीं हैं जो एक उच्च संस्करण है। चेकिंग / बूट में कर्नेल शामिल हो सकते हैं जो पूरी तरह से अलग मल्टीबूट विभाजन के लिए हैं।
सोसिओक्मे

शायद मैं इसे पछाड़ रहा हूं। rpm -q कर्नेल हमेशा संस्करण क्रम में कर्नेल को सूचीबद्ध करता है। क्या यह विश्वसनीय है?
सोसिओक्मे

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

1
और sort -Vसही परिणाम नहीं देता है?
रनियम

जवाबों:


14

टी एल; डॉ

तीसरा प्रयास वास्तव में काम करता है! मैं पहले 2 प्रयासों को छोड़ रहा हूं ताकि भविष्य में इस प्रश्नोत्तर में आने वाले अन्य लोगों को उम्मीद है कि आरपीएम संस्करण की जानकारी को पार्स करना और पहले, दूसरे नंबर पर आने वाले वंश का निर्धारण करना गैर-तुच्छ समस्या है। आदि।

# 1 प्रयास किया (ओपी ने कहा कि काम नहीं किया)

यह कमांड आउटपुट को क्रमबद्ध करेगा और आपको उन्हें संस्करण क्रम में देगा:

$ 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इस कार्य को करने के लिए कमांड के कुछ प्रकार का उपयोग कर सकते हैं , लेकिन किसी दिए गए आरपीएफ के लिए वास्तविक संस्करण की जानकारी के प्रारूपण में पर्याप्त परिवर्तनशीलता और असंगति है कि यह सिर्फ isn है ' कार्य करने के लिए टी।

# 2 का प्रयास किया (ओपी ने कहा कि काम नहीं किया)

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

यह क्यों काम नहीं करता: मुझे उच्च उम्मीद थी कि यह दृष्टिकोण ओपी के लिए देख रहे परिणामों का परिणाम देगा, लेकिन @Joel के रूप में इस एक के साथ मुद्दा टिप्पणियों में बताया गया है, यह है कि --lastस्विच केवल परिणामों को हल कर रहा है आरपीएम स्थापित होने की तारीख।

# 3 प्रयास करें

यह काम जरूर करेगा। मुझे RPM डेवलपमेंट टूल्स नामक उपकरणों का एक सूट मिला। इस सूट में 2 उपकरण हैं जो आपको यह निर्धारित करने की क्षमता देंगे कि आरपीएम का एक संस्करण नया है या दूसरे की तुलना में पुराना है।

यदि 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 -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 के लिए एक विकल्प

एक विकल्प जो टिप्पणियों में उल्लिखित ओपी का उपयोग करना है sort -V। वह पूंजी है -V। मैंने इस स्विच के बारे में कभी नहीं सुना। से sortआदमी पेज:

-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

क्षमा करें, मुझे ऐसा नहीं लगता। एक साधारण स्ट्रिंग प्रकार कर्नेल-2.6.9 से पहले कर्नेल-2.6.10 लगाएगा। यह केवल उदाहरण के लिए नहीं, बल्कि उदारतापूर्वक काम करना है।
सोसिओक्मे

-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 सॉर्ट यहाँ बिल्कुल गलत उपकरण है, साथ ही साथ कुछ भी। संस्करण-रिलीज़ योजनाओं के बारे में कुछ भी नहीं पता है।
सोसिओक्मे

@ --lastपैकेज की स्थापना के समय के अनुसार, यह जरूरी नहीं कि नवीनतम कर्नेल हो (यदि उन्होंने एक कम आरपीएन संस्करण इंस्टाल किया हो, उदाहरण के लिए)।
ब्राचली

1
सॉर्ट -V बात एक संदर्भ में विफल हो जाएगी। कहते हैं कि आप पैकेज के 2 संस्करणों की तुलना करना चाहते थे - 1.15-abc और 1.15-2ab। सॉर्ट कमांड कहेगी कि 1.15-abc 1.15-2ab से अधिक है। लेकिन infact, rpm के लिए, 2ab abc से अधिक है।
क्रिस्‍ट्रॉन

1
सॉर्ट -V rpmdev- सॉर्ट से बहुत अलग है। मैं rpms के साथ कि सभी का उपयोग नहीं होगा। यह त्वरित नज़र के लिए ठीक है, लेकिन यह बात है।
टॉमी कीनटोला

1

अच्छा परिणाम पाने के लिए आपको वास्तव में RPM लाइब्रेरी का उपयोग करने की आवश्यकता है। संस्करण तुलना एल्गोरिथ्म है ... निश्चित रूप से जटिल। शेल में पुन: लागू करना गैर-तुच्छ है, लेकिन यदि आप वास्तविक तुलना करने के लिए पायथन का उपयोग कर सकते हैं, तो यह अपेक्षाकृत सीधा हो जाता है। ऐसा करने के तरीके के बारे में जानने के लिए /programming/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

मुझे लगता है कि बिल्डटाइम के आधार पर छांटना एक कोने के मामले में कम होता है जहां यह विफल होता है, किस्त के विपरीत। हालाँकि, - मील का पत्थर है।


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

अधिकांश समय (जब तक कि उन्होंने मैन्युअल कर्नेल इंस्टॉल नहीं किया था) दोनों समान होना चाहिए।

इसे 100% सही 100% समय प्राप्त करने के लिए, आपको दो कर्नेल संस्करण को नीचे 2.6.*प्रारूप में लाने के लिए जाना होगा, फिर 2.6 (आरएचईएल को एक ही संस्करण में बहुत तेजी से वापस नहीं लेना होगा, आरएचईएल 5 के बाद इसे अलग करना होगा। हमेशा एक 2.6 कर्नेल होगा) और आरपीएम आउटपुट की प्रत्येक पंक्ति (संभवत: --lastप्रदर्शन के लिए क्रमबद्ध ) पर इटर्सेट करें और कर्नेल संस्करण में एनालॉग स्थिति के विरुद्ध प्रत्येक स्थिति की तुलना करें uname -rयदि आरएमबी डीबी के स्ट्रिंग में कोई भी संख्या बड़ी हो। अनाम स्ट्रिंग से, तुरंत उस संदेश के साथ बाहर निकलें।

आपकी मदद करने के लिए यहां एक समान प्रश्न पूछा गया है । लेकिन यह फ़ंक्शन विशुद्ध रूप से बिंदीदार दशमलव संकेतन मानता है, इसलिए आप हाइफ़न से पहले संख्या की स्थिति की तुलना कर सकते हैं (क्योंकि केवल एक ही है) फिर उस व्यक्ति के बैश फ़ंक्शन का उपयोग करके परीक्षण करें कि यदि पैच संस्करण unamerpm db स्ट्रिंग की तुलना में अधिक है।


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

साइट में आपका स्वागत है, और आपके योगदान के लिए धन्यवाद। दुर्भाग्य से यह बिल्कुल स्पष्ट नहीं है कि आपका उत्तर ओपी द्वारा पूछे गए कर्नेल संस्करणों के प्रश्न से कैसे संबंधित है। कृपया अपनी पोस्ट को स्पष्ट करने के लिए संपादित करें।
एडमिनबी

1
ओवेन, आपने ग्रब 2-आरपीएम-सॉर्ट नामक एक कार्यक्रम की ओर इशारा किया है और किस पैकेज में इसे शामिल किया गया है, लेकिन "मैं कैसे बताऊं कि क्या uname -rउच्चतम कर्नेल आरपीएम स्तर स्थापित नहीं है"। कार्यक्रम की तरह लगता है कि यह समस्या को हल कर सकता है, इसलिए यदि आप ओपी के लिए केवल यह बता सकते हैं कि यह एक अच्छा जवाब होगा। धन्यवाद!
जेफ स्कालर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.