프로그래밍 된 최고 버전의 커널 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 '커널이 관심있는
— 것이라면

어떤 버전이 더 높은 버전인지 결정하기위한 신뢰할 수있는 방법이 아닙니다. / boot를 검사하면 완전히 다른 멀티 부트 파티션을위한 커널이 포함될 수 있습니다.
— sosiouxme

어쩌면 나는 그것을 너무 생각하고 있습니다. rpm -q kernel은 항상 커널을 버전 순서대로 나열하는 것 같습니다. 신뢰할 수 있습니까?
— sosiouxme

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

1
그리고 sort -V올바른 결과를 제공하지 않습니까?
— Runium

답변:


14

TL; DR

세 번째 시도는 실제로 작동합니다! 앞으로이 Q & A를 겪을 수있는 다른 사람들이 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에 대한 실제 버전 정보의 형식화에는 충분한 가변성과 불일치가 있습니다. 작업까지.

시도 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라는 도구 모음을 찾았습니다. 이 제품군에는 한 버전의 RPM이 다른 버전보다 최신 버전인지 또는 이전 버전인지 확인할 수있는 2 가지 도구가 있습니다.

RPM이 아직 설치되지 않은 경우 다음과 같이 수행 할 수 있습니다.

yum install rpmdevtools

유용한 첫 번째 도구는 rpmdev-vercmp입니다. 이 도구는 두 가지 이름의 RPM을 비교하여 최신 이름을 알려줍니다. 예를 들면 다음과 같습니다.

$ 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.9 이전에 kernel-2.6.10을 넣습니다. 이것은 단지 예를 위해서가 아니라 일반적으로 작동해야합니다.
— sosiouxme

-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 정렬은 여기의 다른 도구뿐만 아니라 절대적으로 잘못된 도구입니다. 버전 릴리스 체계에 대해서는 아무것도 모릅니다.
— sosiouxme

@slm --last은 패키지 설치 시간을 기준으로 정렬하므로 반드시 최신 커널 일 필요는 없습니다 (예 : 하위 커널 버전의 수동 rpm 설치를 수행 한 경우).
— Bratchley

1
하나의 컨텍스트에서 sort -V 일이 실패합니다. 1.15-abc와 1.15-2ab의 두 가지 버전의 패키지를 비교하고 싶다고 가정 해보십시오. sort 명령은 1.15-abc가 1.15-2ab보다 높다고 말합니다. 그러나 실제로 rpm의 경우 2ab가 abc보다 높습니다.
— crisron

1
rpmdev-sort와 많이 다른 -V를 정렬합니다. 나는 rpm으로 전혀 사용하지 않을 것입니다. 한 눈에 확인해도되지만, 그게 다입니다.
— Tommi Kyntola 2012


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

설치 시간과 달리 빌드 타임을 기준으로 정렬하면 실패하는 경우가 거의 없습니다. 그러나 --last가 더 깔끔합니다.


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 -rrpm db 문자열에서 숫자가 더 큰 경우 커널 버전의 유사한 위치와 각 위치를 비교하십시오. uname 문자열보다 즉시 해당 메시지로 종료하십시오.

당신을 돕기 위해 여기 비슷한 질문 이 있습니다 . 그러나이 함수는 점으로 구분 된 십진수 표기법을 가정하므로 하이픈 앞의 숫자 위치 (하나만 있기 때문에)를 비교 한 다음 해당 사람의 bash 함수를 사용하여 패치 버전이 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

사이트에 오신 것을 환영합니다. 기여해 주셔서 감사합니다. 불행히도 귀하의 답변이 OP가 요청한 커널 버전의 문제와 어떤 관련이 있는지는 분명하지 않습니다. 명확히하려면 게시물을 수정하십시오.
— AdminBee

이것은 질문에 대한 답변을 제공하지 않습니다. 평판 이 충분 하면 모든 게시물 에 댓글 을 달 수 있습니다 . 대신 asker의 설명이 필요없는 답변을 제공하십시오 . - 리뷰에서
— Kiwy

Owen, grub2-rpm-sort라는 프로그램과 어떤 패키지를 포함하고 있지만 " uname -r최고의 커널 RPM 레벨이 설치되어 있지 않은지 어떻게 알 수 있습니까? " 이 프로그램 은 문제를 해결할 수있는 것처럼 들리 므로 OP에 대해 간단히 설명하면 좋은 대답입니다. 감사합니다!
— Jeff Schaller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.