Як програмно визначити встановлену 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не дає правильного результату?
Руніум

Відповіді:


14

TL; DR

Третя спроба насправді працює! Я залишаю перші 2 спроби, щоб інші, які в майбутньому можуть зіткнутися з цим запитаннями, сподіваються, отримають деяке розуміння того, наскільки нетривіальною проблемою є розбір інформації про версії RPM та визначення рядків, які виникли першими, другими, тощо.

Спроба №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команди для виконання цього завдання, але є достатньо варіабельності та неузгодженості у форматуванні фактичної інформації про версію для заданого RPM, що це просто так " t до завдання.

Спроба №2 (ОП заявила, що не працює)

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

ЧОМУ НЕ РОБОТИ: Я покладав великі сподівання, що такий підхід дасть результати, яких шукав ОП, але проблема з цим, як в коментарях зазначив @Joel, полягає в тому, що --lastкомутатор просто повертає результати, відсортовані за дата встановлення RPM.

Спроба №3

Цей обов’язково зробить роботу. Я знайшов набір інструментів під назвою Інструменти розвитку RPM. У цьому наборі є два інструменти, які дозволять вам визначити, чи є одна версія RPM новішою чи старшою за іншу.

Якщо RPM ще не встановлений, ви можете зробити наступне:

yum install rpmdevtools

Перший корисний засіб називається rpmdev-vercmp. Цей інструмент може порівняти 2 назви 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

Альтернативу, яку використовує ОП, зазначена в коментарях, використовувати 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.10 перед ядром-2.6.9. Це має працювати загально, не лише для прикладу.
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 вручну нижчої версії ядра).
Братчлі

1
Сортувати -V річ вийде з ладу в одному контексті. Скажімо, ви хотіли порівняти 2 версії пакету - 1.15-abc та 1.15-2ab. Команда сортування скаже, що 1,15-abc вище 1,15-2ab. Але infact, для rpm, 2ab вище, ніж abc.
crisron

1
сортування -V багато чим відрізняється від rpmdev-сортування. Я б взагалі не використовував це з 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

Я думаю, що для сортування за часом нарощування менше шансів виникнути кутовий випадок, коли він не вдається, на відміну від часу встановлення. Однак - останнє охайніше.


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) і просто повторюйте кожен рядок виводу оборотів у хвилину (можливо, відсортовану за --lastпродуктивністю) та порівняйте кожну позицію з аналогічною позицією у версії ядра, яку ви отримали, uname -rякщо будь-яке з чисел більше в рядку dpm rpm ніж рядок unme, негайно вийдіть із цим повідомленням.

Щоб допомогти вам там, тут задається подібне запитання . Але ця функція передбачає чисто пунктирне десяткове позначення, тому ви можете порівняти позицію числа перед дефісом (оскільки є лише одне), а потім використовувати функцію bash цієї людини для перевірки, чи версія патча вище, 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

Ласкаво просимо на сайт і дякуємо за ваш внесок. На жаль, зовсім не ясно, як ваша відповідь стосується питання про версії ядра, заданого ОП. Відредагуйте свою публікацію, щоб уточнити.
AdminBee

1
Овене, ви вказали на програму з назвою grub2-rpm-sort та на який пакет її міститься, але не "як я можу сказати, чи uname -rне встановлений найвищий рівень RPM ядра". Програма звучить так, ніби вона могла вирішити проблему, тож якщо ви могли просто прописати це для ОП, це буде гарною відповіддю. Дякую!
Джефф Шаллер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.