[ovs-dev] [PATCH v2] rhel: support kmod-openvswitch build against multiple kernels, rhel6

Flavio Leitner fbl at sysclose.org
Wed Jul 11 23:35:12 UTC 2018


On Wed, Jul 11, 2018 at 03:30:08PM -0700, Martin Xu wrote:
> 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.
> 
> Previouly the kernel_module_package macro is used to generate spec file
> template to build kmod-openvswitch RPM. This macro is now removed.
> Everything is built in the main package. To maintain consistent naming,
> the rhel6 kmod spec file is renamed to kmod-openvswitch-rhel6.spec to
> match the built package name kmod-openvswitch.
> 
> This patch also removes the openvswitch-kmod package.

This patch does few things at once. It renames the kmod, then do
significant changes at the file and add a new script.
I would suggest to have this split into at least two patches.
The first one renames the file and fix automake/gitignore and
related files as a preparation.
The second one fixes the issue and adds the kmod script.

> Signed-off-by: Martin Xu <martinxu9.ovs at gmail.com>
> Signed-off-by: Greg Rose <gvrose8192 at gmail.com>
> CC: Ben Pfaff <blp at ovn.org>
> CC: Flavio Leitner <fbl at redhat.com>
> CC: Aaron Conole <aconole at redhat.com>
> ---
>  Documentation/intro/install/rhel.rst               |   7 +-
>  poc/playbook-centos-builder.yml                    |   8 +-
>  rhel/.gitignore                                    |   1 +
>  rhel/automake.mk                                   |   8 +-
>  rhel/kmod-openvswitch-rhel6.spec.in                | 120 +++++++++++++++++++++
>  rhel/openvswitch-kmod-rhel6.spec.in                | 103 ------------------
>  rhel/openvswitch-kmod.files                        |   3 -
>  ...sr_share_openvswitch_scripts_ovs-kmod-manage.sh |  71 ++++++++++++
>  8 files changed, 203 insertions(+), 118 deletions(-)
>  create mode 100644 rhel/kmod-openvswitch-rhel6.spec.in
>  delete mode 100644 rhel/openvswitch-kmod-rhel6.spec.in
>  delete mode 100644 rhel/openvswitch-kmod.files
>  create mode 100644 rhel/usr_share_openvswitch_scripts_ovs-kmod-manage.sh
> 
> diff --git a/Documentation/intro/install/rhel.rst b/Documentation/intro/install/rhel.rst
> index f8b26069f..6f062e894 100644
> --- a/Documentation/intro/install/rhel.rst
> +++ b/Documentation/intro/install/rhel.rst
> @@ -197,17 +197,16 @@ the unit tests, run::
>  Kernel Module
>  ~~~~~~~~~~~~~
>  
> -On RHEL 6, to build the Open vSwitch kernel module, copy
> -rhel/openvswitch-kmod.files into the RPM sources directory and run::
> +On RHEL 6, to build the Open vSwitch kernel module run::
>  
> -    $ rpmbuild -bb rhel/openvswitch-kmod-rhel6.spec
> +    $ rpmbuild -bb rhel/kmod-openvswitch-rhel6.spec
>  
>  You might have to specify a kernel version and/or variants, e.g.:
>  
>      $ rpmbuild -bb \
>          -D "kversion 2.6.32-131.6.1.el6.x86_64" \
>          -D "kflavors default debug kdump" \
> -        rhel/openvswitch-kmod-rhel6.spec
> +        rhel/kmod-openvswitch-rhel6.spec
>  
>  This produces an "kmod-openvswitch" RPM for each kernel variant, in this
>  example: "kmod-openvswitch", "kmod-openvswitch-debug", and
> diff --git a/poc/playbook-centos-builder.yml b/poc/playbook-centos-builder.yml
> index 71f104010..e902db75d 100644
> --- a/poc/playbook-centos-builder.yml
> +++ b/poc/playbook-centos-builder.yml
> @@ -41,13 +41,13 @@
>          chdir: /git/ovs/rhel
>      with_items:
>        - openvswitch.spec
> -      - openvswitch-kmod-rhel6.spec
> +      - kmod-openvswitch-rhel6.spec
>  
>    - name: Install build dependencies specified from spec files
>      shell: echo "y" | yum-builddep /tmp/{{item}}
>      with_items:
>        - openvswitch.spec
> -      - openvswitch-kmod-rhel6.spec
> +      - kmod-openvswitch-rhel6.spec
>  
>    - name: Create rpm dev tree
>      command: rpmdev-setuptree
> @@ -81,7 +81,7 @@
>        line: "Release: {{ ansible_local.builder.release }}"
>      with_items:
>        - openvswitch.spec
> -      - openvswitch-kmod-rhel6.spec
> +      - kmod-openvswitch-rhel6.spec
>  
>    - name: Build Open vSwitch user space rpms
>      command: rpmbuild -bb --without check rhel/openvswitch.spec
> @@ -89,7 +89,7 @@
>          chdir: "{{SOURCE}}/openvswitch-{{version.stdout}}"
>  
>    - name: Build Open vSwitch kmod rpms (only for currently loaded kernel)
> -    command: rpmbuild -bb  --without check rhel/openvswitch-kmod-rhel6.spec
> +    command: rpmbuild -bb  --without check rhel/kmod-openvswitch-rhel6.spec
>      args:
>          chdir: "{{SOURCE}}/openvswitch-{{version.stdout}}"
>  
> diff --git a/rhel/.gitignore b/rhel/.gitignore
> index e584a1ed0..9b0ce1d38 100644
> --- a/rhel/.gitignore
> +++ b/rhel/.gitignore
> @@ -1,6 +1,7 @@
>  openvswitch-dkms.spec
>  openvswitch-kmod-rhel5.spec
>  openvswitch-kmod-rhel6.spec
> +kmod-openvswitch-rhel6.spec
>  openvswitch-kmod-fedora.spec
>  openvswitch.spec
>  openvswitch-fedora.spec
> diff --git a/rhel/automake.mk b/rhel/automake.mk
> index 137ff4a39..7b6c78fd7 100644
> --- a/rhel/automake.mk
> +++ b/rhel/automake.mk
> @@ -15,9 +15,8 @@ EXTRA_DIST += \
>  	rhel/etc_sysconfig_network-scripts_ifup-ovs \
>  	rhel/openvswitch-dkms.spec \
>  	rhel/openvswitch-dkms.spec.in \
> -	rhel/openvswitch-kmod-rhel6.spec \
> -	rhel/openvswitch-kmod-rhel6.spec.in \
> -	rhel/openvswitch-kmod.files \
> +	rhel/kmod-openvswitch-rhel6.spec \
> +	rhel/kmod-openvswitch-rhel6.spec.in \
>  	rhel/openvswitch-kmod-fedora.spec \
>  	rhel/openvswitch-kmod-fedora.spec.in \
>  	rhel/openvswitch.spec \
> @@ -27,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 \
> @@ -48,7 +48,7 @@ update_rhel_spec = \
>  $(srcdir)/rhel/openvswitch-dkms.spec: rhel/openvswitch-dkms.spec.in $(top_builddir)/config.status
>  	$(update_rhel_spec)
>  
> -$(srcdir)/rhel/openvswitch-kmod-rhel6.spec: rhel/openvswitch-kmod-rhel6.spec.in $(top_builddir)/config.status
> +$(srcdir)/rhel/kmod-openvswitch-rhel6.spec: rhel/kmod-openvswitch-rhel6.spec.in $(top_builddir)/config.status
>  	$(update_rhel_spec)
>  
>  $(srcdir)/rhel/openvswitch-kmod-fedora.spec: rhel/openvswitch-kmod-fedora.spec.in $(top_builddir)/config.status
> diff --git a/rhel/kmod-openvswitch-rhel6.spec.in b/rhel/kmod-openvswitch-rhel6.spec.in
> new file mode 100644
> index 000000000..b0e50a4f8
> --- /dev/null
> +++ b/rhel/kmod-openvswitch-rhel6.spec.in
> @@ -0,0 +1,120 @@
> +# Spec file for Open vSwitch kernel modules on Red Hat Enterprise
> +# Linux 6.
> +
> +# Copyright (C) 2011, 2012, 2018 Nicira, Inc.
> +#
> +# Copying and distribution of this file, with or without modification,
> +# are permitted in any medium without royalty provided the copyright
> +# notice and this notice are preserved.  This file is offered as-is,
> +# without warranty of any kind.
> +
> +%define oname openvswitch
> +
> +Name:           kmod-%{oname}
> +Version:        @VERSION@
> +Release:        1%{?dist}
> +Summary:        Open vSwitch kernel module
> +
> +Group:          System/Kernel
> +License:        GPLv2
> +URL:            http://openvswitch.org/
> +Source0:        %{oname}-%{version}.tar.gz
> +Source1:        %{oname}-kmod.files
> +BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
> +
> +# Without this we get an empty openvswitch-debuginfo package (whose name
> +# conflicts with the openvswitch-debuginfo package for OVS userspace).
> +%undefine _enable_debug_packages
> +
> +%define kernel_source_extended() /usr/src/kernels/%{2}$([ %{1} = default ] || echo ".%{1}")
> +
> +# By default, build against the latest installed kernel
> +%{!?kversion:%global kversion %(rpm -q --qf '%{VERSION}-%{RELEASE}.%{ARCH}' `rpm -qa | egrep "^kernel(-rt|-aarch64)?-devel" | /usr/lib/rpm/redhat/rpmsort -r | head -n 1` | head -n 1)}

Well, that assumption is very often wrong because the latest kernel
installed might not be the running kernel nor the one that will run
in the next boot, but I see that you just want to have a default.


> +# Use -D 'kversion 2.6.32-131.6.1.el6.x86_64' to build package
> +# for specified kernel version.
> +
> +# Use -D 'kflavors default debug kdump' to build packages for
> +# specified kernel variants.
> +%{!?kflavors:%global kflavors default}
> +
> +%description
> +Open vSwitch Linux kernel module.
> +
> +%prep
> +
> +%setup -n %{oname}-%{version}
> +
> +%build
> +
> +for kv in %{kversion}; do

Isn't that a single version only?
I didn't spot anything else in this light review :-)
fbl


> +    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 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 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
> +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/%{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/openvswitch-kmod-rhel6.spec.in b/rhel/openvswitch-kmod-rhel6.spec.in
> deleted file mode 100644
> index daa3dade1..000000000
> --- a/rhel/openvswitch-kmod-rhel6.spec.in
> +++ /dev/null
> @@ -1,103 +0,0 @@
> -# Spec file for Open vSwitch kernel modules on Red Hat Enterprise
> -# Linux 6.
> -
> -# Copyright (C) 2011, 2012 Nicira, Inc.
> -#
> -# Copying and distribution of this file, with or without modification,
> -# are permitted in any medium without royalty provided the copyright
> -# notice and this notice are preserved.  This file is offered as-is,
> -# without warranty of any kind.
> -
> -%define oname openvswitch
> -
> -Name:           %{oname}-kmod
> -Version:        @VERSION@
> -Release:        1%{?dist}
> -Summary:        Open vSwitch kernel module
> -
> -Group:          System/Kernel
> -License:        GPLv2
> -URL:            http://openvswitch.org/
> -Source0:        %{oname}-%{version}.tar.gz
> -Source1:        %{oname}-kmod.files
> -BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
> -BuildRequires:  %kernel_module_package_buildreqs
> -
> -# Without this we get an empty openvswitch-debuginfo package (whose name
> -# conflicts with the openvswitch-debuginfo package for OVS userspace).
> -%undefine _enable_debug_packages
> -
> -# Use -D 'kversion 2.6.32-131.6.1.el6.x86_64' to build package
> -# for specified kernel version.
> -%{?kversion:%define kernel_version %kversion}
> -
> -# Use -D 'kflavors default debug kdump' to build packages for
> -# specified kernel variants.
> -%{!?kflavors:%define kflavors default}
> -
> -%kernel_module_package -n %{oname} -f %{SOURCE1} %kflavors
> -
> -%description
> -Open vSwitch Linux kernel module.
> -
> -%prep
> -
> -%setup -n %{oname}-%{version}
> -
> -%build
> -for flavor in %flavors_to_build; do
> -        mkdir _$flavor
> -        (cd _$flavor && ../configure --with-linux="%{kernel_source $flavor}")
> -        %{__make} -C _$flavor/datapath/linux %{?_smp_mflags}
> -done
> -
> -%install
> -export INSTALL_MOD_PATH=$RPM_BUILD_ROOT
> -export INSTALL_MOD_DIR=extra/%{oname}
> -for flavor in %flavors_to_build ; do
> -         make -C %{kernel_source $flavor} modules_install \
> -                 M="`pwd`"/_$flavor/datapath/linux
> -
> -         # Cleanup unnecessary kernel-generated module dependency files.
> -         find $INSTALL_MOD_PATH/lib/modules -iname 'modules.*' -exec rm {} \;
> -done
> -install -d %{buildroot}%{_sysconfdir}/depmod.d/
> -for module in %{buildroot}/lib/modules/%{kernel_version}/$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
> -done
> -install -m 644 %{oname}.conf %{buildroot}%{_sysconfdir}/depmod.d/
> -
> -%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/%{kernel}/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
> -    if [ -x "/sbin/weak-modules" ]; then
> -        for m in openvswitch vport-gre vport-stt vport-geneve \
> -                 vport-lisp vport-vxlan; do
> -        echo "/lib/modules/%{kernel}/extra/$m.ko"
> -    done | /sbin/weak-modules --remove-modules
> -    fi
> -fi
> -
> -%files
> -%defattr(644,root,root)
> -/etc/depmod.d/%{oname}.conf
> -
> -%clean
> -rm -rf $RPM_BUILD_ROOT
> diff --git a/rhel/openvswitch-kmod.files b/rhel/openvswitch-kmod.files
> deleted file mode 100644
> index 357c2e8b7..000000000
> --- a/rhel/openvswitch-kmod.files
> +++ /dev/null
> @@ -1,3 +0,0 @@
> -%defattr(644,root,root,755)
> -/lib/modules/%2-%1
> -/etc/depmod.d/openvswitch.conf
> 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 000000000..e89ad86dd
> --- /dev/null
> +++ b/rhel/usr_share_openvswitch_scripts_ovs-kmod-manage.sh
> @@ -0,0 +1,71 @@
> +#!/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.
> +
> +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
> -- 
> 2.15.2 (Apple Git-101.1)
> 
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev

-- 
Flavio



More information about the dev mailing list