Как программно определить установленного об/мин ядра последней версии?

Пример:

Докажите, что я отправляю байт NUL, сопровождаемый новой строкой:

$ echo -e \\0 | hexdump -C
00000000  00 0a                                             |..|
00000002

Теперь я изменяю байт NUL на ! восклицательный знак:

$ echo -e \\0 | sed 's/\x00/!/' | hexdump -C
00000000  21 0a                                             |!.|

Таким образом, прием использует \x00 как NUL-байт.

9
21.05.2013, 22:33
5 ответов

TL; DR

3-я попытка на самом деле работает! Я оставляю первые 2 попытки так, чтобы другие, которые могут столкнуться с этим Вопросы и ответы в будущем, надо надеяться, получили некоторое понимание, как нетривиальный проблема это должно проанализировать информацию о версии об/мин и определить происхождение, которого был на первом месте, во-вторых, и т.д.

Попытка № 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 команда для выполнения этой задачи но существует достаточно изменчивости и несоответствия в форматировании фактической информации о версии для данного об/мин, что это просто не до задачи.

Попытка № 2 (OP заявила, не работала),

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

ПОЧЕМУ ЭТО не РАБОТАЛО: у Меня были большие надежды, что этот подход приведет к результатам, которые искал OP, но проблема с этим как @Joel указанный в комментариях, то, что --last переключатель просто возвращает результаты, отсортированные по дате, RPMs были установлены.

Попытка № 3

Этот определенно сделает задание. Я нашел комплект инструментов под названием Средства разработки об/мин. Существует 2 инструмента в этом комплекте, который даст Вам возможность определить, является ли одна версия об/мин более новой или более старой, чем другой.

Если об/мин уже не установлен, можно сделать так следующим образом:

yum install rpmdevtools

Первый инструмент это полезно, называют rpmdev-vercmp. Этот инструмент может сравнить 2 названия RPMs и сказать Вам, какой является более новым. Например:

$ 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 -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
14
27.01.2020, 20:05
  • 1
    Извините, я не думаю так. Вид простой строки поместил бы ядро 2.6.10 перед ядром 2.6.9. Это должно работать в общем, не только для примера. –  sosiouxme 21.05.2013, 19:22
  • 2
    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 21.05.2013, 20:17
  • 3
    @slm --last виды ко времени установки пакета, это не обязательно будет последним ядром (если они сделали ручную установку об/мин более низкой версии ядра, например). –  Bratchley 21.05.2013, 22:39
  • 4
    V вещь перестанет работать в одном контексте. Скажите, что Вы хотели сравнить 2 версии пакета - с 1.15 abc и 1.15-2ab. Команда вида сказала бы, что с 1.15 abc выше, чем 1.15-2ab. Но заразите для об/мин, 2ab выше, чем abc. –  crisron 20.08.2015, 12:32
  • 5
    V существенно иной от rpmdev-вида. Я не использовал бы это с rpms вообще. Это хорошо для быстрого взгляда, но вот именно. –  Tommi Kyntola 14.02.2017, 11:42

Действительно необходимо пользоваться библиотекой RPM для получения хорошего результата. Алгоритм сравнения версий... решительно сложен. Это нетривиально для перереализации в оболочке, но если можно использовать Python, чтобы сделать фактическое сравнение, это становится относительно простым. См. https://stackoverflow.com/questions/3206319/how-do-i-compare-rpm-versions-in-python для экс-клена того, как сделать так.

1
27.01.2020, 20:05

--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 если какое-либо из чисел больше в строке дб об/мин, чем строка uname, сразу выходит с тем сообщением.

Для помощи Вам там существует подобный вопрос, который задают здесь. Но та функция принимает чисто десятичное представление с разделением точками, таким образом, можно сравнить положение числа перед дефисом (так как существует только один), затем используют функцию удара того человека, чтобы протестировать, если версия патча выше в uname чем в строке дб об/мин.

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

Я думаю, что при сортировке по времени сборки меньше вероятность того, что произойдет сбой, в отличие от времени установки. Однако --last лучше.

1
27.01.2020, 20:05
[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
0
12.05.2020, 00:08

Теги

Похожие вопросы