Làm cách nào để xác định chương trình RPM kernel phiên bản cao nhất được cài đặt?


9

Những gì tôi muốn kịch bản là một cái gì đó dọc theo dòng:

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

Vấn đề là, nếu đầu ra của rpm -q kernelmột cái gì đó như:

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

Làm thế nào để tôi xác định cái nào cao hơn? Tôi biết một loại chuỗi đơn giản là không đáng tin cậy (nó sẽ ngược với ví dụ này). Có một phím tắt với vòng / phút hay tôi phải phân tích mọi thứ và tự so sánh nó?


Bạn có thể sử dụng /var/log/yum.log cho điều đó. Hoặc 'ls -lht / boot | grep vmlinuz 'nếu kernel là thứ bạn quan tâm.
schaiba

Đó không phải là phương pháp đáng tin cậy để xác định phiên bản nào cao hơn. Kiểm tra / khởi động có thể bao gồm các hạt nhân dành cho các phân vùng multiboot hoàn toàn khác nhau.
sosiouxme

Có lẽ tôi đang xem xét nó. kernel /q kernel dường như luôn liệt kê các kernel theo thứ tự phiên bản. Điều đó có đáng tin không?
sosiouxme

'ls -lht / khởi động | grep vmlinuz | grep el6 ':)
schaiba

1
sort -Vkhông cho kết quả chính xác?
Runium

Câu trả lời:


14

TL; DR

Nỗ lực thứ 3 thực sự hiệu quả! Tôi sẽ rời khỏi 2 lần thử đầu tiên để những người khác có thể gặp Q & A này trong tương lai hy vọng sẽ hiểu được một số vấn đề không quan trọng để phân tích thông tin phiên bản RPM và xác định dòng dõi đến trước, thứ hai, Vân vân.

Nỗ lực số 1 (OP cho biết không hoạt động)

Lệnh này sẽ sắp xếp đầu ra và cung cấp cho bạn theo thứ tự phiên bản:

$ 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

TẠI SAO NÓ KHÔNG LÀM VIỆC: Một người ngây thơ sẽ nghĩ rằng bạn có thể sử dụng một số biến thể của sortlệnh để thực hiện nhiệm vụ này, nhưng có đủ sự thay đổi và không nhất quán trong định dạng thông tin phiên bản thực tế cho một RPM nhất định mà nó không phải là ' t đến nhiệm vụ.

Nỗ lực số 2 (OP nói không hoạt động)

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

TẠI SAO NÓ KHÔNG LÀM VIỆC: Tôi rất hy vọng rằng cách tiếp cận này sẽ mang lại kết quả mà OP đang tìm kiếm, nhưng vấn đề với điều này như @Joel đã chỉ ra trong các ý kiến, là việc --lastchuyển đổi chỉ đơn thuần là trả về kết quả được sắp xếp theo ngày RPM được cài đặt.

Nỗ lực số 3

Điều này chắc chắn sẽ làm công việc. Tôi tìm thấy một bộ công cụ gọi là Công cụ phát triển RPM. Có 2 công cụ trong bộ công cụ này sẽ cung cấp cho bạn khả năng xác định xem một phiên bản RPM mới hơn hay cũ hơn phiên bản khác.

Nếu RPM chưa được cài đặt, bạn có thể làm như sau:

yum install rpmdevtools

Công cụ đầu tiên hữu ích được gọi là rpmdev-vercmp. Công cụ này có thể so sánh 2 tên của RPM và cho bạn biết cái nào mới hơn. Ví dụ:

$ 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

Sau khi tìm thấy điều này, tôi đã sẵn sàng kết hợp một tập lệnh shell nhưng rồi nhận ra, người đàn ông tôi lười biếng, vì vậy tôi đã chọc thêm vài phút nữa và tìm thấy một công cụ khác trong bộ công cụ được gọi rpmdev-sort.

Công cụ này là bụi bẩn. Bạn có thể sử dụng nó như sau:

$ 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

Có rất nhiều công cụ trong Công cụ phát triển RPM có thể đáng để người khác tìm kiếm vì vậy tôi sẽ liệt kê chúng ở đây để tham khảo trong tương lai.

$ 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

Một thay thế cho # 3

Một thay thế mà OP đề cập trong các ý kiến ​​là sử dụng sort -V. Đó là một thủ đô -V. Tôi cũng chưa bao giờ nghe về công tắc này. Từ sorttrang người đàn ông:

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

Hóa ra, sortnó cung cấp một phương tiện để sắp xếp số phiên bản để bạn cũng có thể thực hiện việc sắp xếp như vậy:

$ 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

Xin lỗi, tôi không nghĩ vậy. Một kiểu sắp xếp chuỗi đơn giản sẽ đặt kernel-2.6.10 trước kernel-2.6.9. Điều này phải làm việc chung chung, không chỉ cho ví dụ.
sosiouxme

-n chỉ giúp bạn với số đầu tiên. Hãy thử sắp xếp cái này: 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 sort hoàn toàn là công cụ sai ở đây, cũng như mọi thứ khác không biết gì về các chương trình phát hành phiên bản.
sosiouxme

@slm --lastsắp xếp theo thời gian cài đặt gói, chẳng hạn, đây không nhất thiết phải là kernel mới nhất (ví dụ: nếu họ đã cài đặt vòng quay thủ công của phiên bản kernel thấp hơn).
Bratchley

1
sắp xếp thứ -V sẽ thất bại trong một bối cảnh. Giả sử bạn muốn so sánh 2 phiên bản của gói - 1.15-abc và 1.15-2ab. Lệnh sort sẽ nói rằng 1.15-abc cao hơn 1.15-2ab. Nhưng nguyên vẹn, đối với vòng / phút, 2ab cao hơn abc.
crisron

1
sort -V khác rất nhiều so với rpmdev-sort. Tôi sẽ không sử dụng nó với rpms cả. Nhìn thoáng qua, nhưng không sao.
Tommi Kyntola

1

Bạn thực sự cần sử dụng thư viện RPM để có kết quả tốt. Thuật toán so sánh phiên bản là ... phức tạp quyết định. Việc thực hiện lại trong shell là không tầm thường, nhưng nếu bạn có thể sử dụng Python để so sánh thực tế, nó trở nên tương đối đơn giản. Xem /programming/3206319/how-do-i-compare-rpm-versions-in-python để biết sơ đồ về cách thực hiện.


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

Tôi nghĩ rằng sắp xếp theo thời gian xây dựng ít có khả năng xảy ra trường hợp góc khi nó bị lỗi, không giống như thời gian cài đặt. Tuy nhiên, - nhanh hơn.


0

--lastsẽ không cho bạn biết số phiên bản cao nhất nhưng nó sẽ đặt hàng theo ngày cài đặt. Vì vậy, bạn có thể thấy phiên bản được cài đặt gần đây nhất:

[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

Hầu hết thời gian (trừ khi họ đã cài đặt kernel thủ công), hai cái này phải giống nhau.

Để có được 100% đúng 100% thời gian, bạn sẽ phải đưa hai phiên bản kernel xuống 2.6.*định dạng, sau đó tách nó ra bắt đầu sau 2.6 (RHEL sẽ không phản đối mạnh mẽ trong một phiên bản duy nhất, RHEL5 sẽ luôn là hạt nhân 2.6) và chỉ lặp qua từng dòng đầu ra vòng / phút (có thể được sắp xếp theo --lasthiệu suất) và so sánh từng vị trí với vị trí tương tự trong phiên bản kernel mà bạn nhận được uname -rnếu có bất kỳ số nào lớn hơn trong chuỗi db của vòng / phút hơn chuỗi uname, ngay lập tức thoát với thông báo đó.

Để giúp bạn có một câu hỏi tương tự được hỏi ở đây . Nhưng hàm đó giả sử ký hiệu thập phân rải rác hoàn toàn, do đó bạn có thể so sánh vị trí số trước dấu gạch nối (vì chỉ có một) sau đó sử dụng hàm bash của người đó để kiểm tra xem phiên bản vá có cao unamehơn trong chuỗi db vòng / phút không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.