프로그래밍 된 최고 버전의 커널 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.