aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandru Avadanii <Alexandru.Avadanii@enea.com>2018-01-04 05:48:28 +0100
committerAlexandru Avadanii <Alexandru.Avadanii@enea.com>2018-01-04 21:36:15 +0100
commit1bea78cab1ace6ad071d949a2991c6fd85825167 (patch)
tree075ba0ac124eb265abc433593d276c5d11a8453e
parent7bfb0acaea518e1ca7a64228ac5098f1bc7a9bc9 (diff)
[centos jump] Add nbd build support
RHEL distros do not maintain nbd, so add a best-effort function to build it on the fly. Change-Id: Ie0419f0fed8a0b12f6b878b3093d6ca34f72d140 Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com> (cherry picked from commmit 924d481ac84e8fad9bf1132e1cff18967887017e)
-rw-r--r--mcp/scripts/lib.sh72
-rw-r--r--mcp/scripts/requirements_rpm.yaml4
2 files changed, 74 insertions, 2 deletions
diff --git a/mcp/scripts/lib.sh b/mcp/scripts/lib.sh
index 982cc37fd..73a313605 100644
--- a/mcp/scripts/lib.sh
+++ b/mcp/scripts/lib.sh
@@ -35,12 +35,79 @@ function get_base_image {
wget -P "${image_dir}" -N "${base_image}"
}
+function __kernel_modules {
+ # Load mandatory kernel modules: loop, nbd
+ local image_dir=$1
+ sudo modprobe -f loop
+ if sudo modprobe -f nbd max_part=8; then
+ return 0
+ fi
+ # CentOS (or RHEL family in general) do not provide 'nbd' out of the box
+ echo "[WARN] 'nbd' kernel module cannot be loaded!"
+ if [ ! -e /etc/redhat-release ]; then
+ echo "[ERROR] Non-RHEL system detected, aborting!"
+ echo "[ERROR] Try building 'nbd' manually or install it from a 3rd party."
+ exit 1
+ fi
+
+ # Best-effort attempt at building a non-maintaned kernel module
+ local __baseurl
+ local __subdir
+ local __uname_r=$(uname -r)
+ local __uname_m=$(uname -m)
+ if [ "${__uname_m}" = 'x86_64' ]; then
+ __baseurl='http://vault.centos.org/centos'
+ __subdir='Source/SPackages'
+ __srpm="kernel-${__uname_r%.${__uname_m}}.src.rpm"
+ else
+ __baseurl='http://vault.centos.org/altarch'
+ __subdir="Source/${__uname_m}/Source/SPackages"
+ # NOTE: fmt varies across releases (e.g. kernel-alt-4.11.0-44.el7a.src.rpm)
+ __srpm="kernel-alt-${__uname_r%.${__uname_m}}.src.rpm"
+ fi
+
+ local __found='n'
+ local __versions=$(curl -s "${__baseurl}/" | grep -Po 'href="\K7\.[\d\.]+')
+ for ver in ${__versions}; do
+ for comp in os updates; do
+ local url="${__baseurl}/${ver}/${comp}/${__subdir}/${__srpm}"
+ if wget "${url}" -O "${image_dir}/${__srpm}" > /dev/null 2>&1; then
+ __found='y'; break 2
+ fi
+ done
+ done
+
+ if [ "${__found}" = 'n' ]; then
+ echo "[ERROR] Can't find the linux kernel SRPM for: ${__uname_r}"
+ echo "[ERROR] 'nbd' module cannot be built, aborting!"
+ echo "[ERROR] Try 'yum upgrade' or building 'nbd' krn module manually ..."
+ exit 1
+ fi
+
+ rpm -ivh "${image_dir}/${__srpm}" 2> /dev/null
+ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
+ # shellcheck disable=SC2016
+ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
+ (
+ cd ~/rpmbuild/SPECS
+ rpmbuild -bp --nodeps --target="${__uname_m}" kernel*.spec
+ cd ~/rpmbuild/BUILD/"${__srpm%.src.rpm}/linux-${__uname_r/el7*./el7.centos.}"
+ sed -i 's/^.*\(CONFIG_BLK_DEV_NBD\).*$/\1=m/g' .config
+ gunzip -c "/boot/symvers-${__uname_r}.gz" > Module.symvers
+ make prepare modules_prepare
+ make M=drivers/block -j
+ modinfo drivers/block/nbd.ko
+ sudo mkdir -p "/lib/modules/${__uname_r}/extra/"
+ sudo cp drivers/block/nbd.ko "/lib/modules/${__uname_r}/extra/"
+ )
+ sudo depmod -a && sudo modprobe -f nbd max_part=8
+}
+
function mount_image {
local image=$1
local image_dir=$2
OPNFV_MNT_DIR="${image_dir}/ubuntu"
- sudo modprobe nbd loop
# Find free nbd, loop devices
for dev in '/sys/class/block/nbd'*; do
if [ "$(cat "${dev}/size")" = '0' ]; then
@@ -59,7 +126,7 @@ function mount_image {
# Hardcode partition index to 1, unlikely to change for Ubuntu UCA image
if sudo growpart "${OPNFV_NBD_DEV}" 1; then
sudo kpartx -u "${OPNFV_NBD_DEV}"
- sudo e2fsck -yf "${OPNFV_MAP_DEV}"
+ sudo e2fsck -pf "${OPNFV_MAP_DEV}"
sudo resize2fs "${OPNFV_MAP_DEV}"
fi
# grub-update does not like /dev/nbd*, so use a loop device to work around it
@@ -179,6 +246,7 @@ function prepare_vms {
local vnodes=("$@")
local image=base_image_opnfv_fuel.img
+ __kernel_modules "${image_dir}"
cleanup_uefi
cleanup_vms
get_base_image "${base_image}" "${image_dir}"
diff --git a/mcp/scripts/requirements_rpm.yaml b/mcp/scripts/requirements_rpm.yaml
index 7a6ec38b9..0ee95febb 100644
--- a/mcp/scripts/requirements_rpm.yaml
+++ b/mcp/scripts/requirements_rpm.yaml
@@ -9,6 +9,7 @@
requirements_pkg:
# Common pkgs required for all deploys, no matter the type, arch etc.
common:
+ - bc
- cloud-utils-growpart
- curl
- e2fsprogs
@@ -17,10 +18,13 @@ requirements_pkg:
- kpartx
- libvirt
- make
+ - openssl-devel
- qemu-kvm
+ - rpm-build
- rsync
- util-linux
- virt-install
+ - wget
# Optional, arch-specific requirements, matched by key name = $(uname -m)
aarch64:
# AArch64 VMs use AAVMF (guest UEFI)