2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-22 09:58:01 +00:00
ovs/rhel/usr_share_openvswitch_scripts_ovs-kmod-manage.sh
Greg Rose 5c1cc74da6 rhel: Fix dual kernel rpm install for RHEL 8.4
RHEL 8.4 is the first of the RHEL 8.x kernels that has broken ABI so
it requires the same sort of fix as we did for several RHEL 7.x kernel
that needed two kernel rpms to work for all minor revisions of the
baseline kernel module.

Signed-off-by: Greg Rose <gvrose8192@gmail.com>
2021-09-03 15:58:41 -07:00

238 lines
8.0 KiB
Bash

#!/bin/sh
# Copyright (c) 2018 Nicira/VMware, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# This script is intended to be used on the following kernels.
# - 3.10.0 major revision 327 (RHEL 7.2)
# - 3.10.0 major revision 693 (RHEL 7.4)
# - 3.10.0 major revision 957 (RHEL 7.6)
# - 3.10.0 major revision 1062 (RHEL 7.7)
# - 3.10.0 major revision 1101 (RHEL 7.8 Beta)
# - 3.10.0 major revision 1127 (RHEL 7.8 GA)
# - 3.10.0 major revision 1160 (RHEL 7.9)
# - 4.4.x, x >= 73 (SLES 12 SP3)
# - 4.12.x, x >= 14 (SLES 12 SP4).
# - 4.18.x major revision 305 (RHEL 8.4)
# It is packaged in the openvswitch kmod RPM and run in the post-install
# scripts.
#
# For kernel 3.10.0-957,
# due to some backward incompatible changes introduced in minor revision 12.1,
# kernel modules built against kernels newer than 12.1 cannot be loaded on
# system running kernels older than 12.1, vice versa.
#
# For kernel 3.10.0-693,
# due to some backward incompatible changes introduced in minor revision 17.1,
# kernel modules built against kernels newer than 17.1 cannot be loaded on
# system running kernels older than 17.1, vice versa.
#
# For kernel 3.10.0-327,
# due to some backward incompatible changes introduced in minor revision 41.3,
# kernel modules built against kernels newer than 41.3 cannot be loaded on
# system running kernels older than 41.3, vice versa.
#
# For kernel >= 4.4.73,
# kernel modules built with 4.4.73 can run on systems with kernel versions from
# 4.4.73 to 4.4.114; modules built against 4.4.120 can run on systems from
# 4.4.120 onwards.
#
# For kernel 4.12.x, x>=14,
# kernel modules built with the oldest compatible kernel 4.12.14-94.41.1 can
# run on all versions onwards.
#
# This script checks the current running kernel version, and update symlinks
# for the openvswitch kernel modules in the appropriate kernel directory,
# provided the kmod RPM has installed kernel modules files built from both
# minor revisions.
#
# In case of a kernel minor revision change after the openvswitch kmod package
# is installed, this script shall be run manually after system reboots and
# switches to a different kernel
if [ -n "$(rpm -qa kmod-openvswitch)" ]; then
rpmname="kmod-openvswitch"
elif [ -n "$(rpm -qa openvswitch-kmod)" ]; then
rpmname="openvswitch-kmod"
else
echo "openvswitch kmod package not installed, existing"
exit 1
fi
#echo $rpmname
script_name=$(basename -- "$0")
current_kernel=$(uname -r)
echo current kernel is $current_kernel
IFS='.\|-' read mainline_major mainline_minor mainline_patch major_rev \
minor_rev _extra <<<"${current_kernel}"
# echo mainline_major=$mainline_major mainline_minor=$mainline_minor \
# mainline_patch=$mainline_patch major_rev=$major_rev minor_rev=$minor_rev
expected_rhel_base_minor="el7"
if [ "$mainline_major" = "3" ] && [ "$mainline_minor" = "10" ]; then
if [ "$major_rev" = "327" ]; then
# echo "rhel72"
comp_ver=36
ver_offset=4
installed_ver="$minor_rev"
elif [ "$major_rev" = "514" ]; then
# echo "rhel73"
comp_ver=26
ver_offset=4
installed_ver="$minor_rev"
elif [ "$major_rev" = "693" ]; then
# echo "rhel74"
comp_ver=11
ver_offset=4
installed_ver="$minor_rev"
elif [ "$major_rev" = "862" ]; then
# echo "rhel75"
comp_ver=20
ver_offset=4
installed_ver="$minor_rev"
elif [ "$major_rev" = "957" ]; then
# echo "rhel76"
comp_ver=10
ver_offset=4
installed_ver="$minor_rev"
elif [ "$major_rev" = "1062" ]; then
# echo "rhel77"
comp_ver=10
ver_offset=4
installed_ver="$minor_rev"
elif [ "$major_rev" = "1101" ]; then
# echo "rhel78"
comp_ver=10
ver_offset=4
installed_ver="$minor_rev"
elif [ "$major_rev" = "1127" ]; then
# echo "rhel78"
comp_ver=10
ver_offset=4
installed_ver="$minor_rev"
elif [ "$major_rev" = "1160" ]; then
# echo "rhel79"
comp_ver=10
ver_offset=4
installed_ver="$minor_rev"
fi
elif [ "$mainline_major" = "4" ] && [ "$mainline_minor" = "4" ]; then
if [ "$mainline_patch" -ge "73" ]; then
# echo "sles12sp3"
comp_ver=114
ver_offset=2
installed_ver="$mainline_patch"
fi
elif [ "$mainline_major" = "4" ] && [ "$mainline_minor" = "12" ]; then
if [ "$mainline_patch" -ge "14" ]; then
# echo "sles12sp4"
comp_ver=1
ver_offset=2
installed_ver="$mainline_patch"
fi
elif [ "$mainline_major" = "4" ] && [ "$mainline_minor" = "18" ]; then
if [ "$major_rev" = "305" ]; then
echo "rhel84"
comp_ver=9
ver_offset=4
installed_ver="$minor_rev"
fi
fi
if [ X"$ver_offset" = X ]; then
# echo "This script is not intended to run on kernel $(uname -r)"
exit 0
fi
#IFS='.\|-' read -r -a version_nums <<<"${current_kernel}"
#echo ver_offset=$ver_offset
#echo installed_ver="$installed_ver"
#echo installed_ver="${version_nums[$ver_offset]}"
kmod_versions=()
kversion=$(rpm -ql ${rpmname} | grep '\.ko$' | \
sed -n -e 's/^\/lib\/modules\/\(.*\)\/extra\/.*$/\1/p' | \
sort | uniq)
IFS='.\|-' read installed_major installed_minor installed_patch \
installed_major_rev installed_minor_rev installed_extra <<<"${kversion}"
if [ "$installed_major_rev" -lt "$major_rev" ]; then
echo "Not installing RPM with major revision $installed_major_rev" \
"to kernel with greater major revision $major_rev. Exiting"
exit 1
fi
for kv in $kversion; do
IFS='.\|-' read -r -a kv_nums <<<"${kv}"
kmod_versions+=(${kv_nums[$ver_offset]})
done
sorted_kmod_vers=$(printf "%s\n" "${kmod_versions[@]}" | \
sort -n)
#echo "$sorted_kmod_vers"
if [ ! -n "$sorted_kmod_vers" ]; then
echo "No kernel modules found from package $rpmname, exiting"
exit 1
else
# first line for kmod_low_ver, last for kmod_high_ver
kmod_low_ver=$(echo "$sorted_kmod_vers" | head -1)
kmod_high_ver=$(echo "$sorted_kmod_vers" | tail -1)
fi
#echo "Installing KMOD with minor revisions $kmod_low_ver and \
#$kmod_high_ver"
found_match=false
for kname in $kversion;
do
IFS='.\|-' read -r -a pkg_ver_nums <<<"${kname}"
pkg_ver=${pkg_ver_nums[$ver_offset]}
if [ "$installed_ver" = "$expected_rhel_base_minor" ] ||
[ "$installed_ver" -le "$comp_ver" ]; then
if [ "$pkg_ver" = "$kmod_low_ver" ]; then
requested_kernel=$kname
found_match="true"
echo "Installing Openvswitch KMOD from kernel $kname"
break
fi
else
if [ "$pkg_ver" = "$kmod_high_ver" ]; then
requested_kernel=$kname
found_match="true"
echo "Installing Openvswitch KMOD from kernel $kname"
break
fi
fi
done
if [ "$found_match" = "false" ]; then
echo $script_name: Failed
exit 1
fi
if [ "$requested_kernel" != "$current_kernel" ]; then
if [ ! -d /lib/modules/$current_kernel/weak-updates/openvswitch ]; then
mkdir -p /lib/modules/$current_kernel/weak-updates
mkdir -p /lib/modules/$current_kernel/weak-updates/openvswitch
fi
for m in openvswitch vport-gre vport-stt vport-geneve \
vport-lisp vport-vxlan; do
ln -f -s /lib/modules/$requested_kernel/extra/openvswitch/$m.ko \
/lib/modules/$current_kernel/weak-updates/openvswitch/$m.ko
done
else
echo Proper OVS kernel modules already configured
fi
# Always run depmod
/sbin/depmod -a