This patch only affects rhel6 spec file. RHEL 7.4 introduced backward incompatible changes in the kernel. As a result, prebuilt PRM packages against kernels newer than 693.17.1 will cannot be used on systems with older kernels, vice versa.
This patch allows multiple kernel version numbers delimited by whitespace to be passed as variable "kversion". kmod-openvswitch RPM packages the kernel module .ko files from all specified kernel versions. This patch also includes a script to update the weak-update symlinks if the system kernel version is upgraded or downgraded after kmod-openvswitch is installed. Signed-off-by: Martin Xu <martinxu9....@gmail.com> Co-authored-by: Greg Rose <gvrose8...@gmail.com> CC: Ben Pfaff <b...@ovn.org> CC: Flavio Leitner <f...@redhat.com> CC: Aaron Conole <acon...@redhat.com> --- v1->v2: fix improperly generated patch v2->v3: split from one patch into three patches v3->v4: add paragraphs to explain the usage of new script ovs-kmod-manage.sh rhel/automake.mk | 1 + rhel/kmod-openvswitch-rhel6.spec.in | 84 ++++++++++++-------- ...sr_share_openvswitch_scripts_ovs-kmod-manage.sh | 91 ++++++++++++++++++++++ 3 files changed, 143 insertions(+), 33 deletions(-) create mode 100644 rhel/usr_share_openvswitch_scripts_ovs-kmod-manage.sh diff --git a/rhel/automake.mk b/rhel/automake.mk index 1804194..7b6c78f 100644 --- a/rhel/automake.mk +++ b/rhel/automake.mk @@ -26,6 +26,7 @@ EXTRA_DIST += \ rhel/usr_share_openvswitch_scripts_ovs-systemd-reload \ rhel/usr_share_openvswitch_scripts_sysconfig.template \ rhel/usr_share_openvswitch_scripts_systemd_sysconfig.template \ + rhel/usr_share_openvswitch_scripts_ovs-kmod-manage.sh \ rhel/usr_lib_udev_rules.d_91-vfio.rules \ rhel/usr_lib_systemd_system_openvswitch.service \ rhel/usr_lib_systemd_system_ovsdb-server.service \ diff --git a/rhel/kmod-openvswitch-rhel6.spec.in b/rhel/kmod-openvswitch-rhel6.spec.in index 4f6ed0d..4e67475 100644 --- a/rhel/kmod-openvswitch-rhel6.spec.in +++ b/rhel/kmod-openvswitch-rhel6.spec.in @@ -29,6 +29,9 @@ BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) # Use -D 'kversion 2.6.32-131.6.1.el6.x86_64' to build package # for specified kernel version. +# Use -D 'kversion 3.10.0-693.1.1.el7.x86_64 3.10.0-693.17.1.el7.x86_64' +# to build package for mulitple kernel versions in the same package +# This only works for kernel 3.10.0 major revision 693 # By default, build against the latest installed kernel-devel %{!?kversion:%global kversion %(rpm -qa | egrep "^kernel(-rt|-aarch64)?-devel" | /usr/lib/rpm/redhat/rpmsort -r | head -n 1| sed "s/^kernel.*-devel-//")} @@ -44,60 +47,75 @@ Open vSwitch Linux kernel module. %setup -n %{oname}-%{version} %build -for flavor in %{kflavors} ; do - mkdir _$flavor - (cd _$flavor && ../configure --with-linux="%{kernel_source_extended $flavor %{kversion}}") - %{__make} -C _$flavor/datapath/linux %{?_smp_mflags} +for kv in %{kversion}; do + for flavor in %{kflavors}; do + mkdir -p _$flavor/_$kv + (cd _$flavor/_$kv && ../../configure --with-linux="%{kernel_source_extended $flavor $kv}") + %{__make} -C _$flavor/_$kv/datapath/linux %{?_smp_mflags} + done done %install export INSTALL_MOD_PATH=$RPM_BUILD_ROOT export INSTALL_MOD_DIR=extra/%{oname} -for flavor in %{kflavors} ; do - make -C %{kernel_source_extended $flavor %{kversion}} modules_install \ - M="`pwd`"/_$flavor/datapath/linux - - # Cleanup unnecessary kernel-generated module dependency files. - find $INSTALL_MOD_PATH/lib/modules -iname 'modules.*' -exec rm {} \; +for kv in %{kversion}; do + for flavor in %{kflavors} ; do + make -C %{kernel_source_extended $flavor $kv} modules_install \ + M="`pwd`"/_$flavor/_$kv/datapath/linux + # Cleanup unnecessary kernel-generated module dependency files. + find $INSTALL_MOD_PATH/lib/modules -iname 'modules.*' -exec rm {} \; + done done install -d %{buildroot}%{_sysconfdir}/depmod.d/ -for module in %{buildroot}/lib/modules/%{kversion}/$INSTALL_MOD_DIR/*.ko; -do - modname="$(basename ${module})" - echo "override ${modname%.ko} * extra/%{oname}" >> %{oname}.conf - echo "override ${modname%.ko} * weak-updates/%{oname}" >> %{oname}.conf +for kv in %{kversion}; do + for module in %{buildroot}/lib/modules/$kv/$INSTALL_MOD_DIR/*.ko; + do + modname="$(basename ${module})" + grep -qsPo "^\s*override ${modname%.ko} \* extra\/%{oname}" %{oname}.conf || \ + echo "override ${modname%.ko} * extra/%{oname}" >> %{oname}.conf + grep -qsPo "^\s*override ${modname%.ko} \* weak-updates\/%{oname}" %{oname}.conf || \ + echo "override ${modname%.ko} * weak-updates/%{oname}" >> %{oname}.conf + done done install -m 644 %{oname}.conf %{buildroot}%{_sysconfdir}/depmod.d/ +install -d -m 0755 $RPM_BUILD_ROOT/usr/share/%{oname}/scripts +install -p -m 0755 rhel/usr_share_openvswitch_scripts_ovs-kmod-manage.sh \ + $RPM_BUILD_ROOT/usr/share/%{oname}/scripts/ovs-kmod-manage.sh %post -# Ensure that modprobe will find our modules. -for k in $(cd /lib/modules && /bin/ls); do - [ -d "/lib/modules/$k/kernel/" ] && depmod -a "$k" -done -if [ -x "/sbin/weak-modules" ]; then - for m in openvswitch vport-gre vport-stt vport-geneve \ - vport-lisp vport-vxlan; do - echo "/lib/modules/%{kversion}/extra/$m.ko" - done | /sbin/weak-modules --add-modules -fi - -%postun -for k in $(cd /lib/modules && /bin/ls); do - [ -d "/lib/modules/$k/kernel/" ] && depmod -a "$k" -done -if [ "$1" = 0 ]; then # Erase, not upgrade +current_kernel=$(uname -r) +IFS=. read installed_major installed_minor installed_micro installed_arch \ + installed_build <<<"${current_kernel##*-}" +if [ "$installed_major" = "693" ]; then + # Workaround for RHEL 7.4 + if [ -x "/usr/share/%{oname}/scripts/ovs-kmod-manage.sh" ]; then + /usr/share/%{oname}/scripts/ovs-kmod-manage.sh + fi +else + # Ensure that modprobe will find our modules. + for k in $(cd /lib/modules && /bin/ls); do + [ -d "/lib/modules/$k/kernel/" ] && depmod -a "$k" + done if [ -x "/sbin/weak-modules" ]; then for m in openvswitch vport-gre vport-stt vport-geneve \ vport-lisp vport-vxlan; do - echo "/lib/modules/%{kversion}/extra/$m.ko" - done | /sbin/weak-modules --remove-modules + echo "/lib/modules/%{kversion}/extra/%{oname}/$m.ko" + done | /sbin/weak-modules --add-modules fi fi +%postun +for kname in `ls -d /lib/modules/*` +do + rm -rf $kname/weak-updates/openvswitch +done +/sbin/depmod -a + %files %defattr(644,root,root,755) /etc/depmod.d/%{oname}.conf /lib/modules/ +%attr(755,root,root) /usr/share/%{oname}/scripts/ovs-kmod-manage.sh %clean rm -rf $RPM_BUILD_ROOT diff --git a/rhel/usr_share_openvswitch_scripts_ovs-kmod-manage.sh b/rhel/usr_share_openvswitch_scripts_ovs-kmod-manage.sh new file mode 100644 index 0000000..a6c738f --- /dev/null +++ b/rhel/usr_share_openvswitch_scripts_ovs-kmod-manage.sh @@ -0,0 +1,91 @@ +#!/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 version of the script is intended to be used on kernel version +# 3.10.0 major revision 693 only. It is packaged in the openvswitch kmod RPM +# built using the rhel6 spec file, and run in the post-install for minor +# revision 693 kernels. +# +# 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. +# +# 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 +# 1.1 and 17.1 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 +script_name=$(basename -- "$0") +current_kernel=$(uname -r) +echo current kernel is $current_kernel + +IFS=. read installed_major installed_minor installed_micro \ + installed_arch installed_build <<<"${current_kernel##*-}" +# echo installed_major=$installed_major installed_minor=$installed_minor \ +# installed_micro=$installed_micro installed_arch=$installed_arch \ +# installed_build=$installed_build + +expected_base_minor="el7" +expected_minor=11 + +found_match=false +for kname in `ls -d /lib/modules/*` +do + IFS=. read major minor micro arch build <<<"${kname##*-}" +# echo major=$major minor=$minor micro=$micro arch=$arch build=$build + if [ "$installed_minor" = "$expected_base_minor" ] || + [ "$installed_minor" -le "$expected_minor" ]; then + if [ "$minor" = "1" ]; then + requested_kernel=$kname + found_match="true" + echo "Installing Openvswitch KMOD from kernel $kname" + break + fi + else + if [ "$minor" = "17" ]; 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" != "/lib/modules/$current_kernel" ]; then + if [ -x "/sbin/weak-modules" ]; 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 $requested_kernel/extra/openvswitch/$m.ko \ + /lib/modules/$current_kernel/weak-updates/openvswitch/$m.ko + done + fi +else + echo Proper OVS kernel modules already configured +fi +# Always run depmod +/sbin/depmod -a -- 1.8.3.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev