Вопрос или проблема
Мне была поставлена задача настроить автоматические обновления на некоторых высокопроизводительных рабочих станциях и серверах 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 пакеты могут зависеть друг от друга, и в данном случае важным является контроль за совместимостью между новым ядром и установленными модулями. Особенно это касается двух важных пакетов:
- kmod-nvidia – модуль драйвера NVIDIA.
- 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 предоставляют необходимую защиту, и вы можете смело настроить автоматические обновления. Тем не менее, рекомендуется периодически проверять логи обновлений и проводить тестовые перезагрузки, чтобы гарантировать, что обновления не нарушают функциональность системных компонентов.