RHEL8 условные автоматические обновления

Вопрос или проблема

Мне была поставлена задача настроить автоматические обновления на некоторых высокопроизводительных рабочих станциях и серверах RHEL8.

Мне это не нравится, так как с не контролируемыми обновлениями может произойти много проблем, но, похоже, провоцирование ошибок и потерь данных “безопаснее”, чем не обновлять компьютеры хотя бы раз в неделю…

Целевые компьютеры используют zfs и kmod-nvidia (из zfsonlinux.org и www.elrepo.org соответственно); оба RPM пакета требуют соответствующее “семейство” ядра, поэтому первой мерой безопасности, которую я хотел бы реализовать, является проверка совместимости установленных zfs и kmod-nvidia (или их обновлений) с новым ядром, когда оно доступно.

Например, сейчас доступно новое ядро:

$ sudo dnf update --assumeno
Обновление репозиториев управления подпиской.
Последняя проверка истечения срока действия метаданных: 0:57:59 назад, в Чт 28 Ноя 2024 12:08:30 AM CET.
Зависимости разрешены.
==========================================================================================================================================================
 Пакет                            Архитектура           Версия                                  Репозиторий                                        Размер
==========================================================================================================================================================
Установка:
 kernel                            x86_64                 4.18.0-553.30.1.el8_10                   rhel-8-for-x86_64-baseos-rpms                     10 M
Обновление:
 bpftool                           x86_64                 4.18.0-553.30.1.el8_10                   rhel-8-for-x86_64-baseos-rpms                     11 M
 kernel-headers                    x86_64                 4.18.0-553.30.1.el8_10                   rhel-8-for-x86_64-baseos-rpms                     12 M
 kernel-tools                      x86_64                 4.18.0-553.30.1.el8_10                   rhel-8-for-x86_64-baseos-rpms                     11 M
 kernel-tools-libs                 x86_64                 4.18.0-553.30.1.el8_10                   rhel-8-for-x86_64-baseos-rpms                     10 M
 pam                               x86_64                 1.3.1-36.el8_10                          rhel-8-for-x86_64-baseos-rpms                    748 k
 python3-perf                      x86_64                 4.18.0-553.30.1.el8_10                   rhel-8-for-x86_64-baseos-rpms                     11 M
 webkit2gtk3                       x86_64                 2.46.3-2.el8_10                          rhel-8-for-x86_64-appstream-rpms                  28 M
 webkit2gtk3-jsc                   x86_64                 2.46.3-2.el8_10                          rhel-8-for-x86_64-appstream-rpms                 4.5 M
Установка зависимостей:
 kernel-core                       x86_64                 4.18.0-553.30.1.el8_10                   rhel-8-for-x86_64-baseos-rpms                     43 M
 kernel-devel                      x86_64                 4.18.0-553.30.1.el8_10                   rhel-8-for-x86_64-baseos-rpms                     24 M
 kernel-modules                    x86_64                 4.18.0-553.30.1.el8_10                   rhel-8-for-x86_64-baseos-rpms                     36 M

Резюме транзакции
==========================================================================================================================================================
Установить  4 пакета
Обновить  8 пакетов

Общий размер загрузки: 202 М

Установленный kmod-vidia кажется совместимым:

$ sudo dnf repoquery --requires kmod-nvidia | awk '$1 == "kernel"'
kernel >= 4.18.0-553.el8_10

Но я не знаю, что сказать о zfs, так как в RPM пакете zfs нет упоминания о каком-либо требовании к kernel:

$ sudo dnf repoquery --requires zfs
Обновление репозиториев управления подпиской.
/bin/sh
/usr/bin/python3.6
libblkid.so.1()(64bit)
libblkid.so.1(BLKID_1.0)(64bit)
libc.so.6(GLIBC_2.28)(64bit)
libcrypto.so.1.1()(64bit)
libdl.so.2()(64bit)
libm.so.6()(64bit)
libm.so.6(GLIBC_2.2.5)(64bit)
libnvpair.so.3()(64bit)
libnvpair3(x86-64) = 2.1.15-1.el8
libnvpair3(x86-64) = 2.1.15-2.el8
libpthread.so.0()(64bit)
libpthread.so.0(GLIBC_2.12)(64bit)
libpthread.so.0(GLIBC_2.2.5)(64bit)
libpthread.so.0(GLIBC_2.3.2)(64bit)
librt.so.1()(64bit)
librt.so.1(GLIBC_2.3.3)(64bit)
libtirpc.so.3()(64bit)
libudev.so.1()(64bit)
libudev.so.1(LIBUDEV_183)(64bit)
libuuid.so.1()(64bit)
libuuid.so.1(UUID_1.0)(64bit)
libuutil.so.3()(64bit)
libuutil3(x86-64) = 2.1.15-1.el8
libuutil3(x86-64) = 2.1.15-2.el8
libz.so.1()(64bit)
libzfs.so.4()(64bit)
libzfs5(x86-64) = 2.1.15-1.el8
libzfs5(x86-64) = 2.1.15-2.el8
libzfs_core.so.3()(64bit)
libzpool.so.5()(64bit)
libzpool5(x86-64) = 2.1.15-1.el8
libzpool5(x86-64) = 2.1.15-2.el8
openssl
rtld(GNU_HASH)
sysstat
systemd
util-linux
zfs-kmod = 2.1.15

Как я могу проверить, что установленное или доступное обновление пакета zfs совместимо с новым ядром?

Зависимости ядра не указаны в основном пакете zfs, а в пакетах zfs-dkms или kmod-zfs соответственно, в зависимости от того, какой вариант репозитория вы используете.

Из документации OpenZFS на openzfs.github.io:

По умолчанию пакет zfs-release настроен на установку пакетов стиля DKMS, чтобы они работали с широким диапазоном ядер. Чтобы установить отслеживаемые по kABI модули ядра, необходимо переключить основной репозиторий с zfs на zfs-kmod. Имейте в виду, что отслеживаемые по kABI модули ядра проверены только для работы с предоставляемым дистрибутивом, не Stream ядром.

dnf config-manager --disable zfs
dnf config-manager --enable zfs-kmod
dnf install zfs

Поскольку в вашем списке зависимостей для zfs уже включен zfs-kmod, кажется, вы уже это делаете.

Однако, в отличие от kmod-nvidia, пакет kmod-zfs, доступный в этом варианте репозитория, отслеживает зависимости ядра на уровне символов ядра, а не на уровне версий пакета ядра:

rpm -q --requires kmod-zfs-2.1.15-2.el8.x86_64.rpm

kmod-zfs-2.1.15-2.el8.x86_64
/bin/sh
/bin/sh
/bin/sh
/usr/sbin/depmod
/usr/sbin/depmod
/usr/sbin/weak-modules
/usr/sbin/weak-modules
kernel(PDE_DATA) = 0xea2257cf
kernel(__alloc_disk_node) = 0x75d19f57
kernel(__alloc_pages_nodemask) = 0x8ab32967
kernel(__alloc_percpu) = 0x949f7342
kernel(__bitmap_weight) = 0x63c4d61f
kernel(__check_object_size) = 0x88db9f48

... <довольно много зависимостей на уровне символов ядра> ...

kernel(zlib_inflateEnd) = 0x107e5878
kernel(zlib_inflateInit2) = 0x35a88f28
kernel(zlib_inflate_workspacesize) = 0xce5ac24f
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1
zfs = 2.1.15

С другой стороны, пакет zfs-dkms указывает свои зависимости относительно пакета kernel-devel и может принимать более широкий диапазон версий ядра:

rpm -q --requires zfs-dkms*.rpm

zfs-dkms-2.1.15-2.el8.noarch
/bin/sh
/bin/sh
diffutils
diffutils
dkms >= 2.2.0.3
dkms >= 2.2.0.3
dkms >= 2.2.0.3
dkms >= 2.2.0.3
gcc
gcc
kernel-devel >= 3.10
kernel-devel >= 3.10
kernel-devel <= 6.7.999
kernel-devel <= 6.7.999
make
make
perl
perl
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1

С DKMS (пост) построение модуля ядра инициируется на этапе пост-установки пакета ядра перед шагом обновления загрузчика, и если оно завершается неудачно, это следует рассматривать как неудачу установки пакета ядра. Другими словами, если DKMS не может предоставить совместимый модуль ядра для нового ядра, установка нового ядра не будет завершена.

С kmod-zfs зависимости на уровне символов ядра должны заблокировать установку несовместимого ядра RPM до тех пор, пока ZFS также не может быть обновлен, чтобы соответствовать новому ядру.

Другими словами, у вас уже есть эквивалент запланированной меры безопасности.

Ответ или решение

Условные автоматические обновления в RHEL8: Как гарантировать совместимость пакетов

На сегодняшний день, обеспечивая автоматические обновления на рабочих станциях и серверах RHEL8, необходимо уделять особое внимание совместимости устанавливаемых пакетов, особенно если в системе используются специализированные модули, такие как zfs и kmod-nvidia. Автоматизированное обновление программного обеспечения может привести к множеству проблем, однако регулярные обновления критически важны для безопасности и производительности системы.

Проверка совместимости пакетов с новым ядром

Как правило, в RHEL8 пакеты могут зависеть друг от друга, и в данном случае важным является контроль за совместимостью между новым ядром и установленными модулями. Особенно это касается двух важных пакетов:

  1. kmod-nvidia – модуль драйвера NVIDIA.
  2. zfs – подсистема файловой системы ZFS.
Пакет kmod-nvidia

Для проверки совместимости пакета kmod-nvidia с новым ядром, можно использовать следующую команду для получения его зависимостей:

sudo dnf repoquery --requires kmod-nvidia | awk '$1 == "kernel"'

В результате выполнения команды мы получаем минимальную версию ядра, необходимую для совместимости. Ваша команда уже проверила, что установленный kmod-nvidia совместим с новым ядром, что является необходимой проверкой.

Пакет zfs

Отсутствие явных зависимостей в самом pakket zfs может вызывать вопросы. Однако важно понимать:

  • В зависимости от способа установки ZFS, пакет zfs может быть построен для работы с разными версиями ядра.
  • В случае использования пакета kmod-zfs совместимость обеспечивается на уровне символов ядра, в то время как пакет zfs-dkms позволяет автоматически пересобирать модули при установке новой версии ядра.
Варианты установки ZFS

Для установки необходимого драйвера ZFS следует отключить основной репозиторий ZFS и включить репозиторий zfs-kmod, что позволит использовать модули, отслеживающие совместимость с текущими версиями ядра. Выполните следующие команды:

dnf config-manager --disable zfs
dnf config-manager --enable zfs-kmod
dnf install zfs

Использование DKMS для управления модулями

Использование DKMS (Dynamic Kernel Module Support) – этоRecommendation allows for kernel modules to automatically rebuild whenever a new kernel is installed. The process ensures:

  • Если DKMS не может обеспечить совместимый модуль для нового ядра, установка нового ядра не завершится успешно.
  • Для пакета zfs-dkms необходимо убедиться, что зависимости настраиваются правильно и что у вас установлены все необходимые зависимости для их работы.

Заключение

Таким образом, система уже имеет встроенные механизмы поддержки безопасности при обновлении, и для вашего конкретного случая, где используются zfs и kmod-nvidia, условия для успешного обновления уже существуют. Настройка соответствующих репозиториев и использование DKMS предоставляют необходимую защиту, и вы можете смело настроить автоматические обновления. Тем не менее, рекомендуется периодически проверять логи обновлений и проводить тестовые перезагрузки, чтобы гарантировать, что обновления не нарушают функциональность системных компонентов.

Оцените материал
Добавить комментарий

Капча загружается...