วิธีการตรวจสอบการติดตั้ง 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

... ฉันจะทราบได้อย่างไรว่าอันไหนที่สูงกว่า ฉันรู้ว่าการเรียงสตริงง่าย ๆ ไม่น่าเชื่อถือ (มันจะย้อนกลับมาพร้อมกับตัวอย่างนี้) มีทางลัดด้วย rpm หรือไม่ฉันต้องแยกวิเคราะห์ทุกอย่างแล้วเปรียบเทียบเอง


คุณสามารถใช้ /var/log/yum.log เพื่อสิ่งนั้นได้ หรือ 'ls -lht / boot | grep vmlinuz' ถ้าเคอร์เนลคือสิ่งที่คุณกำลังสนใจในการ.
schaiba

วิธีการเหล่านี้ไม่ใช่วิธีที่เชื่อถือได้สำหรับการพิจารณาว่าเป็นรุ่นใด การตรวจสอบ / การบูตอาจรวมถึงเมล็ดที่ใช้สำหรับพาร์ติชันมัลติบูตที่แตกต่างกันโดยสิ้นเชิง
sosiouxme

บางทีฉันอาจจะคิดมาก เคอร์เนล rpm -q มักจะแสดงรายการเมล็ดในลำดับเวอร์ชัน มันน่าเชื่อถือใช่ไหม
sosiouxme

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

1
และsort -Vไม่ให้ผลลัพธ์ที่ถูกต้อง?
Runium

คำตอบ:


14

TL; DR

ความพยายามครั้งที่ 3 ใช้งานได้จริง! ฉันออกจากความพยายาม 2 ครั้งแรกเพื่อให้คนอื่น ๆ ที่อาจเจอคำถาม & คำตอบนี้ในอนาคตหวังว่าจะได้รับข้อมูลเชิงลึกเกี่ยวกับปัญหาที่ไม่น่ารำคาญในการแยกวิเคราะห์ข้อมูลรุ่น RPM และกำหนดสายเลือดที่มาก่อนวินาที เป็นต้น

พยายาม # 1 (OP กล่าวว่าไม่ทำงาน)

คำสั่งนี้จะเรียงลำดับผลลัพธ์และให้ลำดับตามรุ่น:

$ 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คำสั่งบางอย่างในการทำงานนี้ แต่มีความแปรปรวนและความไม่สอดคล้องกันมากพอในการจัดรูปแบบของข้อมูลรุ่นจริงสำหรับ RPM ที่กำหนดซึ่งมันไม่ใช่ ' t ขึ้นอยู่กับงาน

พยายาม # 2 (OP กล่าวว่าไม่ทำงาน)

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

ทำไมมันไม่ทำงาน:ฉันมีความหวังสูงว่าวิธีการนี้จะให้ผลลัพธ์ที่ OP กำลังมองหา แต่ปัญหาของวิธีนี้เป็น @Joel ชี้ให้เห็นในความคิดเห็นว่า--lastสวิตช์เป็นเพียงการคืนผลลัพธ์เรียงตาม วันที่ติดตั้ง RPM

ลอง # 3

อันนี้จะทำงานแน่นอน ฉันพบชุดเครื่องมือที่เรียกว่า RPM Development Tools มี 2 ​​เครื่องมือในชุดนี้ที่จะให้ความสามารถในการตรวจสอบว่ารุ่นหนึ่งของ RPM เป็นรุ่นที่เก่ากว่าหรือใหม่กว่า

หาก 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 ที่อาจคุ้มค่ากับการมองหาผู้อื่นดังนั้นฉันจึงแสดงรายการไว้ที่นี่เพื่อใช้อ้างอิงในอนาคต

$ 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

ทางเลือกที่ OP 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

ขอโทษฉันไม่คิดอย่างนั้น การเรียงสตริงอย่างง่ายจะทำให้ kernel-2.6.10 ก่อน kernel-2.6.9 สิ่งนี้ต้องทำงานโดยทั่วไปไม่ใช่แค่ตัวอย่างเท่านั้น
sosiouxme

- เพียงช่วยคุณด้วยหมายเลขแรก ลองเรียงลำดับนี้: 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 การเรียงลำดับเป็นเครื่องมือที่ผิดอย่างแน่นอนที่นี่เช่นเดียวกับสิ่งอื่นที่ ไม่ทราบอะไรเกี่ยวกับแบบแผนรุ่น - รุ่น
sosiouxme

@slm --lastเรียงลำดับตามเวลาการติดตั้งแพ็กเกจไม่จำเป็นต้องเป็นเคอร์เนลล่าสุด (หากพวกเขาทำการติดตั้ง rpm ด้วยตนเองของเคอร์เนลเวอร์ชันต่ำกว่าเป็นต้น)
Bratchley

1
สิ่งเรียงลำดับ -V จะล้มเหลวในบริบทเดียว สมมติว่าคุณต้องการเปรียบเทียบแพ็คเกจ 2 เวอร์ชัน - 1.15-abc และ 1.15-2ab คำสั่ง sort บอกว่า 1.15-abc สูงกว่า 1.15-2ab แต่ infact สำหรับรอบต่อนาที 2ab จะสูงกว่า abc
crisron

1
เรียงลำดับ -V แตกต่างจาก rpmdev-sort มาก ฉันจะไม่ใช้กับ rpms เลย มันโอเคสำหรับภาพรวมที่รวดเร็ว แต่ก็ใช่
Tommi Kyntola

1

คุณจำเป็นต้องใช้ไลบรารี RPM เพื่อให้ได้ผลลัพธ์ที่ดี อัลกอริทึมการเปรียบเทียบรุ่นคือ ... ซับซ้อนอย่างแน่นอน มันไม่ง่ายเลยที่จะนำเชลล์มาใช้ใหม่ แต่ถ้าคุณสามารถใช้ Python ทำการเปรียบเทียบจริงมันจะค่อนข้างตรงไปตรงมา ดู/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

ฉันคิดว่าการเรียงลำดับโดย buildtime มีโอกาสน้อยกว่าที่จะมีมุมตัวเรือนที่มันล้มเหลวซึ่งแตกต่างจากเวลาติดตั้ง อย่างไรก็ตาม - สุดท้ายคือผู้ชนะ


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 (RHEL จะไม่รีบูตอย่างมากภายในรุ่นเดียว RHEL5 จะเป็นเคอร์เนล 2.6 เสมอและแค่วนซ้ำในแต่ละบรรทัดของเอาต์พุต rpm (อาจเรียงลำดับตาม--lastประสิทธิภาพ) และเปรียบเทียบแต่ละตำแหน่งเทียบกับตำแหน่งแบบอะนาล็อกในเวอร์ชันเคอร์เนลที่คุณได้รับจากuname -rตัวเลขใด ๆ ที่ใหญ่กว่าในสตริงของ rpm db กว่าสตริง uname ออกทันทีด้วยข้อความนั้น

เพื่อช่วยให้คุณออกมีมีคำถามที่คล้ายกันถามที่นี่ แต่ฟังก์ชั่นนั้นถือว่าเป็นเลขทศนิยมที่มีจุดเดียวดังนั้นคุณอาจเปรียบเทียบตำแหน่งตัวเลขก่อนหน้ายัติภังค์ (เนื่องจากมีเพียงอันเดียว) จากนั้นใช้ฟังก์ชันทุบตีของบุคคลนั้นเพื่อทดสอบว่าเวอร์ชันของแพตช์สูงunameกว่าในสตริง rpm 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

ยินดีต้อนรับสู่เว็บไซต์และขอขอบคุณสำหรับการสนับสนุนของคุณ น่าเสียดายที่มันไม่ชัดเจนว่าคำตอบของคุณเกี่ยวข้องกับคำถามของเคอร์เนลรุ่นที่ถามโดย OP อย่างไร โปรดแก้ไขโพสต์ของคุณเพื่อชี้แจง
AdminBee

สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม เมื่อคุณมีเพียงพอชื่อเสียงคุณจะสามารถที่จะแสดงความคิดเห็นในโพสต์ใด ๆ ; แทนที่จะให้คำตอบที่ไม่จำเป็นต้องชี้แจงจากผู้ถาม - จากการตรวจสอบ
กีวี่

1
โอเว่นคุณได้ชี้ไปที่โปรแกรมที่ชื่อ grub2-rpm-sort และแพคเกจที่บรรจุอยู่ แต่ไม่ใช่ "ฉันจะบอกได้อย่างไรว่าuname -rไม่ใช่ระดับ RPM เคอร์เนลที่สูงที่สุด" โปรแกรมดูเหมือนว่าจะสามารถแก้ปัญหาได้ดังนั้นหากคุณสามารถสะกดคำว่าสำหรับ OP นี่เป็นคำตอบที่ดี ขอบคุณ!
Jeff Schaller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.