Чтобы царю омолодиться, нужно прыгнуть в котел с молоком, затем в котел с кипяченой водой, затем в котел со студеной водой
Чтобы царю омолодиться, нужно прыгнуть в котел с молоком, затем в котел с кипяченой водой, затем в котел со студеной водой

Давно уже наступил срок End of Life у Enterprise Linux 7, но возможно на ваших серверах он еще есть в работе. Затягивание процесса переноса могло произойти по разным причинам: сложные процессы миграции, необходимость в дополнительных мощностях для маневра, длительность процесса переноса, зависимость от бизнес-процессов заказчиков.

Зачастую upgrade ОС на месте — самый удобный способ. В данной статье я описываю инструменты и трудности, с которыми вы можете столкнуться в процессе.

На исходных системах работал RedHat Enterprise Linux(RHEL) 7.9 и СУБД Oracle. В связи с тем, что обновления от RedHat получать затруднительно, было принято решение перейти на Oracle Enterprise Linux (OEL) 8.10. СУБД Oracle согласно compatibility list работает как c RHEL8, так и c OEL8, но не работает с AlmaLinux8 (а жаль, мы про него еще будем вспоминать в этой статье).

Схема перехода такая: RHEL7 > OEL7 > OEL8.

Предварительные работы

Начать апгрейд RHEL7.9 нужно с выключения СУБД Oracle и снятия дополнительного бэкапа системных дисков. Как сделать холодный бэкап дисков я описывал в своей предыдущей статье про fsarchiver.

После создания бэкапа необходимо отключить ненужные во время обновления файловые системы (включая сетевые), отключить их автомонтирование в /etc/fstab.

Теперь необходимо пройти подготовительные проверки.

  • Убедиться в том, что в файловых системах /, /boot, /var достаточно места. При необходимости удалить ненужные старые ядра, core‑dump, большие лог‑файлы и тому подобное.

  • Убедиться в том, что у вас работает доступ в консоль сервера через его системный контроллер. Именно там вы будете наблюдать за процессом upgrade и в консоли будете восстанавливать систему из бэкапа, если что‑то пойдет не так. SSH доступа не достаточно. Напоминаю, что узнать адрес системного контроллера сервера можно следующей командой:

 ipmitool lan print
  • Проверить, что вы не используете опцию загрузки ядра net.ifnames=0. Этот параметр включал режим совместимости именования сетевых карт как eth0, eth1 и так далее, как это было в RHEL6. Необходимо перейти на новую схему именования сетевых карт.

  • Желательно отказаться от конфигурации сетевых интерфейсов через network‑scripts и перейти на конфигурацию через NetworkManager.

  • Если вы используете антивирусное ПО, его необходимо остановить, например, такой командой для KESL:

systemctl disable --now klnagent64.service kesl.service

Если в вашей компании используется прокси для подключения к интернету, необходимо задать run‑time переменные окружения:

export https_proxy=http://proxy.example.com:8080
export http_proxy=http://proxy.example.com:8080

Следующий этап — это переход с RHEL 7.9 на OEL 7.9.

Переход на OEL7

Скачать пакеты Unbreakable Linux Network с сайта Oracle и распаковать их:

wget https://linux-update.oracle.com/rpms/uln_register_ol7.tgz
wget https://linux-update.oracle.com/rpms/uln_register-gnome_ol7.tgz
tar -xzf uln_register_ol7.tgz
tar -xzf uln_register-gnome_ol7.tgz
cd uln_migrate
rpm -Uvh *.rpm --force || \
  rm -f rhn-setup-gnome-2.0.2-24.0.7.el7.x86_64.rpm && rpm -Uvh *.rpm --force

Скачать и установить в систему Oracle Linux GPG Key:

wget https://yum.oracle.com/RPM-GPG-KEY-oracle-ol7 \
     -O /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpg --import /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
/bin/cp /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle /etc/pki/rpm-gpg/RPM-GPG-KEY

Отключить репозитории RHEL7:

mkdir /etc/yum.repos.d/off
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/off

Скачать необходимые yum репозитории от OEL7 и включить их:

wget http://yum.oracle.com/public-yum-ol7.repo \
    -O /etc/yum.repos.d/public-yum-ol7.repo
yum-config-manager --enable ol7_latest
yum-config-manager --enable ol7_developer_EPEL

Обновить систему последними пакетами для OEL7:

yum update -y

Yum update обновит не все пакеты. Некоторые системные пакеты придется переинсталлировать явно (reinstall). Это поможет избежать непонятных ошибок при дальнейшем апгрейде на EL8.
Какие именно пакеты следует переинсталлировать, покажет утилита предпроверки годности к апгрейду. Будем рассматривать это ниже. Ниже — список пакетов для нашего профиля инсталляции RHEL7:

yum reinstall python-ipaddress python-backports \
    python-backports-ssl_match_hostname python-six pycairo python-idna \
    sysvinit-tools python-inotify yum-plugin-ulninfo \
    dyninst mariadb-libs sysvinit-tools  mariadb-libs mgetty postfix -y

Удалим пакеты, которые будут мешать следующим этапам по апгрейду. При необходимости установим их за завершающем этапе:

yum remove -y yum-plugin-ulninfo kernel-devel uname26 libblockdev

Перезапустить систему:

reboot

После перезагрузки ваша система превратится в OEL 7.9.

Leapp

В этом месте необходимо выбрать каким ПО делать апгрейд Linux дальше. Возможно вы читаете статью без планов использовать СУБД Oracle, поэтому у вас не будет жесткой привязки к переходу только на совместимый с СУБД Oracle дистрибутив.

Есть два разных проекта утилиты Leapp.

Leapp от AlmaLinux.

Дистрибутивы Leapp от AlmaLinux лежат в https://repo.almalinux.org/elevate/el8/x86_64/Packages/.

Этот Leapp работает со всеми EL, но у него есть некоторые важные ограничения.

Например, он не умеет делать upgrade, если ваши система загружена с UEK‑ядром (Unbreakable Enterprise Kernel). Перед тем, как делать upgrade, вам придется перезапустить вашу систему с ванильным ядром EL7. Обновление системы будет проходить с формированием загрузочного образа для ванильного ядра EL8.

На многих системах нет принципиально большой разницы. Но в ванильном ядре RHEL7 компания RedHat выкинула поддержку некоторого аппаратного обеспечения, и я наступил на эти грабли. На некоторых моих системах присутствует такая сетевая карта:

# lspci | grep -i ethernet
0c:00.0 Ethernet controller: Emulex Corporation OneConnect 10Gb NIC (be3) (rev 02)

и после апгрейда я увидел, что она больше не работает.

Чтобы спасти ситуацию, пришлось дополнительно скачать драйвер be2net в репозитория ELREPO и проинсталлировать его после апгрейда на EL8.

Такие же грабли подстерегают в ванильном ядре от OEL8 — там тоже исключено все, что исключил RedHat. Казалось бы, не беда, установим драйвера потом. Но на нескольких моих старых бездисковых лезвиях Huawei CH121v3 с конвергентными сетевыми картами MZ510 загрузка ОС идет через FCoE диски, расположенные на внешней системе хранения данных (СХД). И, к моей большой досаде, ванильное ядро OEL8 не увидело системных дисков. Пришлось откатываться.

Этой проблемы лишен AlmaLinux 8. Его сборщики не согласились с RedHat и не исключили важных драйверов из своего ванильного ядра. Если ванильное ядро RHEL8/OEL8 не работает с вашим железом, предоставляющим диски, то апгрейд с помощью этого Leapp на AlmaLinux8 — единственный вариант.

Как использовать Leapp от AlmaLinux?

Подключить репозиторий:

export https_proxy=http://proxy.example.com:8080
export http_proxy=http://proxy.example.com:8080
rpm -ivh http://repo.almalinux.org/elevate/elevate-release-latest-el7.noarch.rpm
grep proxy /etc/yum.conf || \
     echo "proxy=http://proxy.example.com:8080" >> /etc/yum.conf 
sed -i 's|$releasever|7|g; s|$basearch|x86_64|g' /etc/yum.repos.d/ELevate.repo 

Установить пакеты Leapp с данными для миграции на вашу ОС. В зависимости от того, на какую ОС вы хотите перейти, необходимо выбрать соответствующий data‑пакет:

  • OEL8 — пакет leapp‑data‑oraclelinux;

  • AlmaLinux8 — пакет leapp‑data‑almalinux;

  • CentOS Stream — пакет leapp‑data‑centos;

  • Rocky — пакет leapp‑data‑rocky.

    Я выбираю leapp‑data‑oraclelinux:

yum install -y leapp-upgrade leapp-data-oraclelinux

Возможно вы захотите включить переход на ядро UEK‑R7 (по умолчанию идет установка UEK‑R6), но важно помнить, что UEK‑R6 для старого железа лучше, так как из UEK‑R7 поддержка много оборудования исключена.

sed -i 's/UEKR6/UEKR7/g' /etc/leapp/files/leapp_upgrade_repositories.repo
sed -i 's/UEKR6/UEKR7/g' /etc/leapp/files/repomap.json
sed -i 's/Latest Unbreakable Enterprise Kernel Release 6 for Oracle Linux/Latest Unbreakable Enterprise Kernel Release 7 for Oracle Linux/g' \
       /etc/leapp/files/leapp_upgrade_repositories.repo

Leapp от Oracle.

Дистрибутивы Leapp от Oracle лежат в https://yum.oracle.com/repo/OracleLinux/OL8/leapp/x86_64

По Leapp у Oracle есть нехитрая документация.

Главный его плюс для себя вижу в том, что он умеет делать апгрейд ОС, если вы используете ядро UEK. При таком апгрейде и он сам будет использовать ядро UEK‑R6, а UEK‑R6 поддерживает работу с FCoE с конвергентными сетевыми картами MZ510. Значит во время апгрейда не возникнет факапа с невидимыми системными дисками, и он пройдет успешно (UEK‑R6 — изящный обход граблей с FCoE, на которые я наступил, используя AlmaLinux Leapp).

Как использовать Leapp от Oracle?

Просто установим его из репозитория Oracle.

Важно! Если вы уже попробовали на вашей системе Leapp от AlmaLinux, то недостаточно просто удалить leapp‑upgrade и leapp‑data‑oraclelinux. Необходимо удалить и все зависимости, которые он подтянул (проще всего это сделать через yum history list / yum history undo ##).

cat > /etc/yum.repos.d/leapp.repo  <<!
[ol7_leapp]
name=ol7_leapp
baseurl=https://yum.oracle.com/repo/OracleLinux/OL7/leapp/x86_64
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
!
yum install -y leapp-upgrade

Как работать с Leapp?

Для двух вышеописанных Leapp-ов процедура похожа.

Есть четыре этапа: preupgrade, upgrade, модификация системного диска, операции после апгрейда.

Модификация системного диска происходит автоматически, без вашего участия.

Preupgrade.

Это подготовка к апгрейду. Система делает 100500 проверок вашей системы о пригодности к апгрейду. Если вы используете прокси, то первая проблема, которую она вам подсветит — не видно репозиториев для восьмерки. Необходимо добавить информацию о прокси в настройки dnf для Leapp.

sed -i '/enabled=/a proxy=http://proxy.example.com:8080' \
        /etc/leapp/files/leapp_upgrade_repositories.repo
cat > /etc/leapp/files/dnf.conf <<!
[main]
gpgcheck=True
installonly_limit=3
clean_requirements_on_remove=False
best=False
skip_if_unavailable=True
proxy=http://proxy.example.com:8080
!

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

modprobe -r pata_acpi
modprobe -r floppy
modprobe -r btrfs

И необходимо создать файл ответов, о том, что вы согласны исключить PAM модуль pkcs11 и желаете использовать UEK‑R6 (только для Leapp от Oracle). То же самое можно сделать и командой, которую вам предложат в отчете ниже:

mkdir -p /var/log/leapp
cat > /var/log/leapp/answerfile.userchoices <<!
[remove_pam_pkcs11_module_check]
confirm = True
!
cat > /var/log/leapp/answerfile <<!
[remove_pam_pkcs11_module_check]
confirm = True

[confirm_UEK_install_and_default_boot_kernel]
confirm=True
!

Запустить оценку возможности апгрейда:

leapp preupgrade					#leapp от AlmaLinux
leapp preupgrade --oraclelinux      #leapp от Oracle

Если будет ругаться на отсутствие ключей к GPG, это можно обойти с '‑nogpgcheck'.
Процесс проверки занимает длительное время (запаситесь кофе!); в конце увидите примерно такой отчет:

			============================================================
								  REPORT OVERVIEW                       
			============================================================

			Upgrade has been inhibited due to the following problems:
				1. Leapp detected loaded kernel drivers which have been removed in RHEL 8. Upgrade cannot proceed.
				2. Missing required answers in the answer file

			HIGH and MEDIUM severity reports:
				1. Detected customized configuration for dynamic linker.
				2. Difference in Python versions and support in RHEL 8
				3. Packages not signed by Red Hat found on the system
				4. Detected custom leapp actors or files.
				5. GRUB2 core will be automatically updated during the upgrade

			Reports summary:
				Errors:                      0
				Inhibitors:                  2
				HIGH severity reports:       5
				MEDIUM severity reports:     0
				LOW severity reports:        2
				INFO severity reports:       2

			Before continuing, review the full report below for details about discovered problems and possible remediation instructions:
				A report has been generated at /var/log/leapp/leapp-report.txt
				A report has been generated at /var/log/leapp/leapp-report.json

Важно, чтобы Errors и Inhibitors было по нулям.

В примере в��ше есть два замечания.

Первое — не выполнена команда modprobe -r btrfs,

второе — нет файла ответов о PAM модуле pkcs11.

Читаем подробный отчет в /var/log/leapp/leapp‑report.txt и устраняем все Errors и Inhibitors.

Замечания HIGH / MEDIUM / LOW / INFO просто принимаем к сведению, их исправлять не требуется.

После устранения проблем вновь повторяем команду leapp preupgrade --oraclelinux, пока не увидим заветных двух нулей и разрешение перейти к следующему этапу.

Upgrade.

На этом этапе начинается скачивание нужных пакетов, более глубокий анализ из зависимостей. Но без каких‑либо фатальных изменений системы. Иногда возникают непонятные ошибки, которых не было в preupgrade. Особенно если вы сначала поработали на системе с помощью AlmaLinux Leapp, а потом переключились на OracleLinux Leeap (не делайте так или пользуйтесь yum history undo).

Тут может возникнуть конфликт у пакета sysvinit‑tools, в этом случае просто удалите его (без зависимостей):

rpm -e --nodeps sysvinit-tools

В процессе работы leapp вы увидите сообщение о создании загрузочного образа initramfs‑upgrade.
Leeap сконфигурирует ваш Grub так, чтобы при перезагрузке был автоматически выбран именно этот образ. При этом в Grub останутся варианты загрузки с прежним ядром EL7 — на случай, если что‑то пойдет не так.

Когда все проверки будет пройдены, вам вновь сообщат:

			Reports summary:
				Errors:                      0
				Inhibitors:                  0

и предложат перезагрузиться. Набираемся храбрости, отправляем в перезагрузку:

reboot

Далее открываем консоль сервера и примерно 20 минут наблюдаем болтливый процесс обновления, после которого система сама перезапуститься уже в OEL8.

Операции после апгрейда.

Войти в систему и оценить как прошла миграция. Почитать её лог.

cat /etc/oracle-release
cat /etc/os-release
cat /var/log/leapp/leapp-upgrade.log

Проверить, что работает сеть, например с описанными проблемами Emulex OneConnect возможно вам нужно будет установить заранее скачанный пакет с модулем для ванильного ядра. Если вы его забыли скачать — можно временно перезагрузиться со старым ядром от EL7, пока оно еще рабочее и еще есть в Grub.

rpm -ivh kmod-be2net-12.0.0.0-14.el8_10.elrepo.x86_64.rpm 

Удалить старые пакеты от el7 (делаем это в интерактивном режиме, чтобы не удалилось что‑то лишнее):

dnf remove $(rpm -qa |grep el7|xargs)

rpm -e  leapp-upgrade-el7toel8 leapp \
        leapp-deps-el8 leapp-repository-deps-el8 \
        python2-leapp

Удалить все репозитории yum и сконфигурировать их заново:

mkdir /etc/yum.repos.d/off

mv /etc/yum.repos.d/leapp.repo \
   /etc/yum.repos.d/*.disabled \
   /etc/yum.repos.d/leapp-upgrade-repos-ol8.repo.save \
   /etc/yum.repos.d/public-yum-ol7.repo \
   /etc/yum.repos.d/ol7.epel.repo \
   /etc/yum.repos.d/off/

cd /etc/yum.repos.d
dnf install https://yum.oracle.com/repo/OracleLinux/OL8/baseos/latest/x86_64/getPackage/oraclelinux-release-el8-1.0-38.el8.x86_64.rpm

grep proxy /etc/dnf/dnf.conf \
    || echo "proxy=http://proxy.example.com:8080" >> /etc/dnf/dnf.conf 

При удалении rpm старых ядер EL7 выполняются скрипты, которые не рассчитаны на работу с новым GRUB, поэтому придется вручную удалить ядра версий 3.10 из entries:

egrep "3.10|el7uek" /boot/loader/entries/*|awk -F: '{print $1}'|sort -u
egrep "3.10|el7uek" /boot/loader/entries/*|awk -F: '{print $1}'|sort -u|xargs rm
grubby --info=ALL

Возможно вы захотите установить какие‑то дополнительные библиотеки, необходимые для работы вашего ПО, например, ncurses‑compat‑libs:

dnf install -y ncurses-compat-libs

Запускаем БД и проверяем по alert‑логу, что с ней всё в порядке.

Спасибо за внимание. Почему‑то уверен, что в мире еще достаточно много RHEL7, которые мечтают обновиться. Надеюсь, кому‑то пригодится этот материал.