]> git.proxmox.com Git - mirror_ovs.git/blob - rhel/usr_share_openvswitch_scripts_ovs-kmod-manage.sh
rhel: let *-ctl handle runtime directory
[mirror_ovs.git] / rhel / usr_share_openvswitch_scripts_ovs-kmod-manage.sh
1 #!/bin/sh
2
3 # Copyright (c) 2018 Nicira/VMware, Inc.
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at:
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16
17 # This script is intended to be used on the following kernels.
18 # - 3.10.0 major revision 327 (RHEL 7.2)
19 # - 3.10.0 major revision 693 (RHEL 7.4)
20 # - 3.10.0 major revision 957 (RHEL 7.6)
21 # - 4.4.x, x >= 73 (SLES 12 SP3)
22 # - 4.12.x, x >= 14 (SLES 12 SP4).
23 # It is packaged in the openvswitch kmod RPM and run in the post-install
24 # scripts.
25 #
26 # For kernel 3.10.0-957,
27 # due to some backward incompatible changes introduced in minor revision 12.1,
28 # kernel modules built against kernels newer than 12.1 cannot be loaded on
29 # system running kernels older than 12.1, vice versa.
30 #
31 # For kernel 3.10.0-693,
32 # due to some backward incompatible changes introduced in minor revision 17.1,
33 # kernel modules built against kernels newer than 17.1 cannot be loaded on
34 # system running kernels older than 17.1, vice versa.
35 #
36 # For kernel 3.10.0-327,
37 # due to some backward incompatible changes introduced in minor revision 41.3,
38 # kernel modules built against kernels newer than 41.3 cannot be loaded on
39 # system running kernels older than 41.3, vice versa.
40 #
41 # For kernel >= 4.4.73,
42 # kernel modules built with 4.4.73 can run on systems with kernel versions from
43 # 4.4.73 to 4.4.114; modules built against 4.4.120 can run on systems from
44 # 4.4.120 onwards.
45 #
46 # For kernel 4.12.x, x>=14,
47 # kernel modules built with the oldest compatible kernel 4.12.14-94.41.1 can
48 # run on all versions onwards.
49 #
50 # This script checks the current running kernel version, and update symlinks
51 # for the openvswitch kernel modules in the appropriate kernel directory,
52 # provided the kmod RPM has installed kernel modules files built from both
53 # minor revisions.
54 #
55 # In case of a kernel minor revision change after the openvswitch kmod package
56 # is installed, this script shall be run manually after system reboots and
57 # switches to a different kernel
58 if [ -n "$(rpm -qa kmod-openvswitch)" ]; then
59 rpmname="kmod-openvswitch"
60 elif [ -n "$(rpm -qa openvswitch-kmod)" ]; then
61 rpmname="openvswitch-kmod"
62 else
63 echo "openvswitch kmod package not installed, existing"
64 exit 1
65 fi
66 #echo $rpmname
67 script_name=$(basename -- "$0")
68 current_kernel=$(uname -r)
69 echo current kernel is $current_kernel
70
71 IFS='.\|-' read mainline_major mainline_minor mainline_patch major_rev \
72 minor_rev _extra <<<"${current_kernel}"
73 # echo mainline_major=$mainline_major mainline_minor=$mainline_minor \
74 # mainline_patch=$mainline_patch major_rev=$major_rev minor_rev=$minor_rev
75
76 expected_rhel_base_minor="el7"
77 if [ "$mainline_major" = "3" ] && [ "$mainline_minor" = "10" ]; then
78 if [ "$major_rev" = "327" ]; then
79 # echo "rhel72"
80 comp_ver=36
81 ver_offset=4
82 installed_ver="$minor_rev"
83 elif [ "$major_rev" = "693" ]; then
84 # echo "rhel74"
85 comp_ver=11
86 ver_offset=4
87 installed_ver="$minor_rev"
88 elif [ "$major_rev" = "957" ]; then
89 # echo "rhel76"
90 comp_ver=10
91 ver_offset=4
92 installed_ver="$minor_rev"
93 fi
94 elif [ "$mainline_major" = "4" ] && [ "$mainline_minor" = "4" ]; then
95 if [ "$mainline_patch" -ge "73" ]; then
96 # echo "sles12sp3"
97 comp_ver=114
98 ver_offset=2
99 installed_ver="$mainline_patch"
100 fi
101 elif [ "$mainline_major" = "4" ] && [ "$mainline_minor" = "12" ]; then
102 if [ "$mainline_patch" -ge "14" ]; then
103 # echo "sles12sp4"
104 comp_ver=14
105 ver_offset=2
106 installed_ver="$mainline_patch"
107 fi
108 fi
109
110 if [ X"$ver_offset" = X ]; then
111 echo "This script is not intended to run on kernel $(uname -r)"
112 exit 1
113 fi
114
115 #IFS='.\|-' read -r -a version_nums <<<"${current_kernel}"
116 #echo ver_offset=$ver_offset
117 #echo installed_ver="$installed_ver"
118 #echo installed_ver="${version_nums[$ver_offset]}"
119
120 kmod_versions=()
121 kversion=$(rpm -ql ${rpmname} | grep '\.ko$' | \
122 sed -n -e 's/^\/lib\/modules\/\(.*\)\/extra\/.*$/\1/p' | \
123 sort | uniq)
124 for kv in $kversion; do
125 IFS='.\|-' read -r -a kv_nums <<<"${kv}"
126 kmod_versions+=(${kv_nums[$ver_offset]})
127 done
128 sorted_kmod_vers=$(printf "%s\n" "${kmod_versions[@]}" | \
129 sort -n)
130 #echo "$sorted_kmod_vers"
131
132 if [ ! -n "$sorted_kmod_vers" ]; then
133 echo "No kernel modules found from package $rpmname, exiting"
134 exit 1
135 else
136 # first line for kmod_low_ver, last for kmod_high_ver
137 kmod_low_ver=$(echo "$sorted_kmod_vers" | head -1)
138 kmod_high_ver=$(echo "$sorted_kmod_vers" | tail -1)
139 fi
140 #echo "Installing KMOD with minor revisions $kmod_low_ver and \
141 #$kmod_high_ver"
142
143 found_match=false
144 for kname in `ls -d /lib/modules/*`
145 do
146 IFS='.\|-' read -r -a pkg_ver_nums <<<"${kname}"
147 pkg_ver=${pkg_ver_nums[$ver_offset]}
148 if [ "$installed_ver" = "$expected_rhel_base_minor" ] ||
149 [ "$installed_ver" -le "$comp_ver" ]; then
150 if [ "$pkg_ver" = "$kmod_low_ver" ]; then
151 requested_kernel=$kname
152 found_match="true"
153 echo "Installing Openvswitch KMOD from kernel $kname"
154 break
155 fi
156 else
157 if [ "$pkg_ver" = "$kmod_high_ver" ]; then
158 requested_kernel=$kname
159 found_match="true"
160 echo "Installing Openvswitch KMOD from kernel $kname"
161 break
162 fi
163 fi
164 done
165
166 if [ "$found_match" = "false" ]; then
167 echo $script_name: Failed
168 exit 1
169 fi
170
171 if [ "$requested_kernel" != "/lib/modules/$current_kernel" ]; then
172 if [ ! -d /lib/modules/$current_kernel/weak-updates/openvswitch ]; then
173 mkdir -p /lib/modules/$current_kernel/weak-updates
174 mkdir -p /lib/modules/$current_kernel/weak-updates/openvswitch
175 fi
176 for m in openvswitch vport-gre vport-stt vport-geneve \
177 vport-lisp vport-vxlan; do
178 ln -f -s $requested_kernel/extra/openvswitch/$m.ko \
179 /lib/modules/$current_kernel/weak-updates/openvswitch/$m.ko
180 done
181 else
182 echo Proper OVS kernel modules already configured
183 fi
184 # Always run depmod
185 /sbin/depmod -a