mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-08 19:26:48 +00:00
The compute bootstrap found openEuler but had no install function for it, so it stopped. Now it installs qemu, libvirt, python3-libguestfs and cyrus-sasl (openEuler's names; it has no EPEL), applies the RHEL family's qemu.conf, SASL and gstfsd steps, and runs the monolithic libvirtd with its TCP socket: openEuler 24.03 ships modular daemons only for qemu and the proxy. Tested in an openEuler 24.03 container with /dev/kvm: the full live suite over TCP (SASL) ran 2145 tests. What failed is libvirt 9.10's (reverting a running VM's external snapshot, live clone needs 11.10), the test host's (no pool named default), and its SeaBIOS, which prints no banner on the serial port.
857 lines
33 KiB
Bash
857 lines
33 KiB
Bash
#!/bin/sh -
|
|
#===============================================================================
|
|
# vim: softtabstop=4 shiftwidth=4 expandtab fenc=utf-8 spell spelllang=en cc=81
|
|
#===============================================================================
|
|
#
|
|
# FILE: libvirt-bootstrap.sh
|
|
#
|
|
# DESCRIPTION: Bootstrap webvirtcloud installation for various distributions
|
|
#
|
|
# BUGS: https://github.com/retspen/webvirtcloud/issues
|
|
#
|
|
# COPYRIGHT: (c) 2015 by the WebVirtCloud Team
|
|
#
|
|
# LICENSE: Apache 2.0
|
|
# ORGANIZATION: WebVirtCloud (webvirtcloud.net)
|
|
# CREATED: 11/11/2013 11:00:00 EET
|
|
#===============================================================================
|
|
|
|
#--- FUNCTION ----------------------------------------------------------------
|
|
# NAME: echoerr
|
|
# DESCRIPTION: Echo errors to stderr.
|
|
#-------------------------------------------------------------------------------
|
|
echoerror() {
|
|
printf "${RC} * ERROR${EC}: %s\n" "$@" 1>&2;
|
|
}
|
|
|
|
#--- FUNCTION ----------------------------------------------------------------
|
|
# NAME: echoinfo
|
|
# DESCRIPTION: Echo information to stdout.
|
|
#-------------------------------------------------------------------------------
|
|
echoinfo() {
|
|
printf "${GC} * INFO${EC}: %s\n" "$@";
|
|
}
|
|
|
|
#--- FUNCTION ----------------------------------------------------------------
|
|
# NAME: echowarn
|
|
# DESCRIPTION: Echo warning informations to stdout.
|
|
#-------------------------------------------------------------------------------
|
|
echowarn() {
|
|
printf "${YC} * WARN${EC}: %s\n" "$@";
|
|
}
|
|
|
|
#--- FUNCTION ----------------------------------------------------------------
|
|
# NAME: echodebug
|
|
# DESCRIPTION: Echo debug information to stdout.
|
|
#-------------------------------------------------------------------------------
|
|
echodebug() {
|
|
if [ "${_ECHO_DEBUG:-0}" = 1 ]; then
|
|
printf "${BC} * DEBUG${EC}: %s\n" "$@";
|
|
fi
|
|
}
|
|
|
|
#--- FUNCTION ----------------------------------------------------------------
|
|
# NAME: __test_distro_arch
|
|
# DESCRIPTION: Echo errors to stderr.
|
|
#-------------------------------------------------------------------------------
|
|
__test_distro_arch() {
|
|
ARCH=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')
|
|
if [ "$ARCH" = 32 ]; then
|
|
echoerror "32-bit Arch kernel does not support"
|
|
exit 1
|
|
fi
|
|
}
|
|
__test_distro_arch
|
|
|
|
#--- FUNCTION ----------------------------------------------------------------
|
|
# NAME: __strip_duplicates
|
|
# DESCRIPTION: Strip duplicate strings
|
|
#-------------------------------------------------------------------------------
|
|
__strip_duplicates() {
|
|
echo "$@" | tr -s '[:space:]' '\n' | awk '!x[$0]++'
|
|
}
|
|
|
|
#--- FUNCTION ----------------------------------------------------------------
|
|
# NAME: __function_defined
|
|
# DESCRIPTION: Checks if a function is defined within this scripts scope
|
|
# PARAMETERS: function name
|
|
# RETURNS: 0 or 1 as in defined or not defined
|
|
#-------------------------------------------------------------------------------
|
|
__function_defined() {
|
|
FUNC_NAME=$1
|
|
if [ "$(command -v "$FUNC_NAME")x" != "x" ]; then
|
|
echoinfo "Found function $FUNC_NAME"
|
|
return 0
|
|
fi
|
|
echodebug "$FUNC_NAME not found...."
|
|
return 1
|
|
}
|
|
|
|
#--- FUNCTION ----------------------------------------------------------------
|
|
# NAME: __parse_version_string
|
|
# DESCRIPTION: Parse version strings ignoring the revision.
|
|
# MAJOR.MINOR.REVISION becomes MAJOR.MINOR
|
|
#-------------------------------------------------------------------------------
|
|
__parse_version_string() {
|
|
VERSION_STRING="$1"
|
|
PARSED_VERSION=$(
|
|
echo "$VERSION_STRING" |
|
|
sed -e 's/^/#/' \
|
|
-e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\)\(\.[0-9][0-9]*\).*$/\1/' \
|
|
-e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
|
|
-e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \
|
|
-e 's/^#.*$//'
|
|
)
|
|
echo "$PARSED_VERSION"
|
|
}
|
|
|
|
#--- FUNCTION ----------------------------------------------------------------
|
|
# NAME: __sort_release_files
|
|
# DESCRIPTION: Custom sort function. Alphabetical or numerical sort is not
|
|
# enough.
|
|
#-------------------------------------------------------------------------------
|
|
__sort_release_files() {
|
|
KNOWN_RELEASE_FILES=$(echo "(arch|centos|almalinux|rocky|debian|ubuntu|fedora|redhat|suse|\
|
|
mandrake|mandriva|gentoo|slackware|turbolinux|unitedlinux|lsb|system|\
|
|
os)(-|_)(release|version)" | sed -r 's:[[:space:]]::g')
|
|
primary_release_files=""
|
|
secondary_release_files=""
|
|
# Sort know VS un-known files first
|
|
for release_file in $(echo "$@" | sed -r 's:[[:space:]]:\n:g' | sort --unique --ignore-case); do
|
|
match=$(echo "$release_file" | grep -E -i "${KNOWN_RELEASE_FILES}")
|
|
if [ "x${match}" != "x" ]; then
|
|
primary_release_files="${primary_release_files} ${release_file}"
|
|
else
|
|
secondary_release_files="${secondary_release_files} ${release_file}"
|
|
fi
|
|
done
|
|
|
|
# Now let's sort by know files importance, max important goes last in the max_prio list
|
|
max_prio="redhat-release centos-release"
|
|
for entry in $max_prio; do
|
|
if [ "x$(echo "${primary_release_files}" | grep "$entry")" != "x" ]; then
|
|
primary_release_files=$(echo "${primary_release_files}" | sed -e "s:\(.*\)\($entry\)\(.*\):\2 \1 \3:g")
|
|
fi
|
|
done
|
|
# Now, least important goes last in the min_prio list
|
|
min_prio="lsb-release"
|
|
for entry in $min_prio; do
|
|
if [ "x$(echo "${primary_release_files}" | grep "$entry")" != "x" ]; then
|
|
primary_release_files=$(echo "${primary_release_files}" | sed -e "s:\(.*\)\($entry\)\(.*\):\1 \3 \2:g")
|
|
fi
|
|
done
|
|
|
|
# Echo the results collapsing multiple white-space into a single white-space
|
|
echo "${primary_release_files} ${secondary_release_files}" | sed -r 's:[[:space:]]:\n:g'
|
|
}
|
|
|
|
#--- FUNCTION ----------------------------------------------------------------
|
|
# NAME: __gather_linux_system_info
|
|
# DESCRIPTION: Discover Linux system information
|
|
#-------------------------------------------------------------------------------
|
|
__gather_linux_system_info() {
|
|
DISTRO_NAME=""
|
|
DISTRO_VERSION=""
|
|
|
|
# Let's test if the lsb_release binary is available
|
|
if lsb_release >/dev/null 2>&1; then
|
|
DISTRO_NAME=$(lsb_release -si)
|
|
if [ "x$(echo "$DISTRO_NAME" | grep RedHat)" != "x" ]; then
|
|
# Let's convert CamelCase to Camel Case
|
|
DISTRO_NAME=$(__camelcase_split "$DISTRO_NAME")
|
|
fi
|
|
if [ "${DISTRO_NAME}" = "openSUSE project" ] || [ "${DISTRO_NAME}" = "openSUSE" ] || [ "${DISTRO_NAME}" = "opensuse" ]; then
|
|
# lsb_release -si returns "openSUSE project" on openSUSE 12.3
|
|
DISTRO_NAME="opensuse"
|
|
fi
|
|
if [ "${DISTRO_NAME}" = "SUSE LINUX" ] || [ "${DISTRO_NAME}" = "SLES" ] || [ "${DISTRO_NAME}" = "sles" ]; then
|
|
# lsb_release -si returns "SUSE LINUX" on SLES 11 SP3
|
|
DISTRO_NAME="suse"
|
|
fi
|
|
rv=$(lsb_release -sr)
|
|
[ "${rv}x" != "x" ] && DISTRO_VERSION=$(__parse_version_string "$rv")
|
|
elif [ -f /etc/lsb-release ]; then
|
|
# We don't have the lsb_release binary, though, we do have the file it parses
|
|
DISTRO_NAME=$(grep DISTRIB_ID /etc/lsb-release | sed -e 's/.*=//')
|
|
rv=$(grep DISTRIB_RELEASE /etc/lsb-release | sed -e 's/.*=//')
|
|
[ "${rv}x" != "x" ] && DISTRO_VERSION=$(__parse_version_string "$rv")
|
|
fi
|
|
|
|
if [ "x$DISTRO_NAME" != "x" ] && [ "x$DISTRO_VERSION" != "x" ]; then
|
|
# We already have the distribution name and version
|
|
return
|
|
fi
|
|
|
|
for rsource in $(__sort_release_files "$(
|
|
cd /etc && find ./*[_-]release ./*[_-]version -printf "%f\n" 2>/dev/null | env -i sort | \
|
|
sed -e '/^redhat-release$/d' -e '/^lsb-release$/d'; \
|
|
echo redhat-release lsb-release
|
|
)"); do
|
|
|
|
# Don't follow symlinks, except os-release (a link to /usr/lib/os-release, openSUSE's only release file)
|
|
[ -L "/etc/${rsource}" ] && [ "${rsource}" != "os-release" ] && continue
|
|
[ ! -f "/etc/${rsource}" ] && continue # Does not exist
|
|
|
|
n=$(echo "${rsource}" | sed -e 's/[_-]release$//' -e 's/[_-]version$//')
|
|
rv=$( (grep VERSION /etc/"${rsource}"; cat /etc/"${rsource}") | grep '[0-9]' | sed -e 'q' )
|
|
[ "${rv}x" = "x" ] && continue # There's no version information. Continue to next rsource
|
|
v=$(__parse_version_string "$rv")
|
|
case $(echo "${n}" | tr '[:upper:]' '[:lower:]') in
|
|
redhat )
|
|
if [ ".$(grep -E 'CentOS' /etc/"${rsource}")" != . ]; then
|
|
n="CentOS"
|
|
elif [ ".$(grep -E 'Red Hat Enterprise Linux' /etc/"${rsource}")" != . ]; then
|
|
n="<R>ed <H>at <E>nterprise <L>inux"
|
|
else
|
|
n="<R>ed <H>at <L>inux"
|
|
fi
|
|
;;
|
|
arch ) n="Arch Linux" ;;
|
|
centos ) n="CentOS" ;;
|
|
almalinux ) n="AlmaLinux" ;;
|
|
debian ) n="Debian" ;;
|
|
ubuntu ) n="Ubuntu" ;;
|
|
fedora ) n="Fedora" ;;
|
|
suse ) n="SUSE" ;;
|
|
system )
|
|
while read -r line; do
|
|
[ "${n}x" != "systemx" ] && break
|
|
case "$line" in
|
|
*Amazon*Linux*AMI*)
|
|
n="Amazon Linux AMI"
|
|
break
|
|
esac
|
|
done < /etc/"${rsource}"
|
|
;;
|
|
os )
|
|
nn=$(grep '^ID=' /etc/os-release | sed -e 's/^ID=\(.*\)$/\1/g' | tr -d "\"'")
|
|
rv=$(grep '^VERSION_ID=' /etc/os-release | sed -e 's/^VERSION_ID=\(.*\)$/\1/g' | tr -d "\"'")
|
|
[ "${rv}x" != "x" ] && v=$(__parse_version_string "$rv") || v=""
|
|
case $(echo "${nn}" | tr '[:upper:]' '[:lower:]') in
|
|
arch )
|
|
n="Arch Linux"
|
|
v="" # Arch Linux does not provide a version.
|
|
;;
|
|
debian )
|
|
n="Debian"
|
|
if [ "${v}x" = "x" ]; then
|
|
if [ "$(cat /etc/debian_version)" = "wheezy/sid" ]; then
|
|
# I've found an EC2 wheezy image which did not tell its version
|
|
v=$(__parse_version_string "7.0")
|
|
fi
|
|
else
|
|
echowarn "Unable to parse the Debian Version"
|
|
fi
|
|
;;
|
|
opensuse* )
|
|
n="opensuse"
|
|
;;
|
|
sles*|sled*|suse* )
|
|
n="suse"
|
|
;;
|
|
* )
|
|
n=${nn}
|
|
;;
|
|
esac
|
|
;;
|
|
* ) ;;
|
|
esac
|
|
DISTRO_NAME=$n
|
|
DISTRO_VERSION=$v
|
|
break
|
|
done
|
|
}
|
|
__gather_linux_system_info
|
|
|
|
# Simplify distro name naming on functions
|
|
DISTRO_NAME_L=$(echo "$DISTRO_NAME" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-zA-Z0-9_ ]//g' | sed -re 's/([[:space:]])+/_/g')
|
|
# Rocky Linux and AlmaLinux use the CentOS install functions
|
|
case "${DISTRO_NAME_L}" in
|
|
rocky|almalinux) DISTRO_NAME_L="centos" ;;
|
|
esac
|
|
DISTRO_MAJOR_VERSION="$(echo "$DISTRO_VERSION" | sed 's/^\([0-9]*\).*/\1/g')"
|
|
DISTRO_MINOR_VERSION="$(echo "$DISTRO_VERSION" | sed 's/^\([0-9]*\).\([0-9]*\).*/\2/g')"
|
|
PREFIXED_DISTRO_MAJOR_VERSION="_${DISTRO_MAJOR_VERSION}"
|
|
if [ "${PREFIXED_DISTRO_MAJOR_VERSION}" = "_" ]; then
|
|
PREFIXED_DISTRO_MAJOR_VERSION=""
|
|
fi
|
|
PREFIXED_DISTRO_MINOR_VERSION="_${DISTRO_MINOR_VERSION}"
|
|
if [ "${PREFIXED_DISTRO_MINOR_VERSION}" = "_" ]; then
|
|
PREFIXED_DISTRO_MINOR_VERSION=""
|
|
fi
|
|
|
|
#--- FUNCTION ----------------------------------------------------------------
|
|
# NAME: __check_end_of_life_versions
|
|
# DESCRIPTION: Check for end of life distribution versions
|
|
#-------------------------------------------------------------------------------
|
|
__check_end_of_life_versions() {
|
|
|
|
case "${DISTRO_NAME_L}" in
|
|
debian)
|
|
# Debian versions bellow 6 are not supported
|
|
if [ "$DISTRO_MAJOR_VERSION" -lt 6 ]; then
|
|
echoerror "End of life distributions are not supported."
|
|
echoerror "Please consider upgrading to the next stable. See:"
|
|
echoerror " https://wiki.debian.org/DebianReleases"
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
ubuntu)
|
|
# Ubuntu versions not supported
|
|
#
|
|
# < 10
|
|
# = 10.10
|
|
# = 11.04
|
|
# = 11.10
|
|
if { [ "$DISTRO_MAJOR_VERSION" -eq 10 ] && [ "$DISTRO_MINOR_VERSION" -eq 10 ]; } || \
|
|
{ [ "$DISTRO_MAJOR_VERSION" -eq 11 ] && [ "$DISTRO_MINOR_VERSION" -eq 04 ]; } || \
|
|
{ [ "$DISTRO_MAJOR_VERSION" -eq 11 ] && [ "$DISTRO_MINOR_VERSION" -eq 10 ]; } || \
|
|
[ "$DISTRO_MAJOR_VERSION" -lt 10 ]; then
|
|
echoerror "End of life distributions are not supported."
|
|
echoerror "Please consider upgrading to the next stable. See:"
|
|
echoerror " https://wiki.ubuntu.com/Releases"
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
opensuse)
|
|
# openSUSE: allow Leap 15.x and Tumbleweed
|
|
if [ -n "$DISTRO_MAJOR_VERSION" ] && [ "$DISTRO_MAJOR_VERSION" -lt 12 ]; then
|
|
echoerror "End of life distributions are not supported."
|
|
echoerror "Please consider upgrading to the next stable. See:"
|
|
echoerror " http://en.opensuse.org/Lifetime"
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
suse)
|
|
# SLES / SLED
|
|
if [ -f /etc/SuSE-release ]; then
|
|
SUSE_PATCHLEVEL=$(awk '/PATCHLEVEL/ {print $3}' /etc/SuSE-release )
|
|
if [ "x${SUSE_PATCHLEVEL}" = "x" ]; then
|
|
SUSE_PATCHLEVEL="00"
|
|
fi
|
|
if { [ "$DISTRO_MAJOR_VERSION" -eq 11 ] && [ "$SUSE_PATCHLEVEL" -lt 02 ]; } || [ "$DISTRO_MAJOR_VERSION" -lt 11 ]; then
|
|
echoerror "Versions lower than SuSE 11 SP2 are not supported."
|
|
echoerror "Please consider upgrading to the next stable"
|
|
exit 1
|
|
fi
|
|
elif [ -n "$DISTRO_MAJOR_VERSION" ] && [ "$DISTRO_MAJOR_VERSION" -lt 12 ]; then
|
|
echoerror "Versions lower than SUSE 12 are not supported."
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
fedora)
|
|
# Fedora lower than 18 are no longer supported
|
|
if [ "$DISTRO_MAJOR_VERSION" -lt 18 ]; then
|
|
echoerror "End of life distributions are not supported."
|
|
echoerror "Please consider upgrading to the next stable. See:"
|
|
echoerror " https://fedoraproject.org/wiki/Releases"
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
centos)
|
|
# CentOS versions lower than 6 are no longer supported
|
|
if { [ "$DISTRO_MAJOR_VERSION" -eq 6 ] && [ "$DISTRO_MINOR_VERSION" -lt 3 ]; } || [ "$DISTRO_MAJOR_VERSION" -lt 5 ]; then
|
|
echoerror "End of life distributions are not supported."
|
|
echoerror "Please consider upgrading to the next stable. See:"
|
|
echoerror " http://wiki.centos.org/Download"
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
red_hat*linux)
|
|
# Red Hat (Enterprise) Linux versions lower than 5 are no longer supported
|
|
if { [ "$DISTRO_MAJOR_VERSION" -eq 6 ] && [ "$DISTRO_MINOR_VERSION" -lt 3 ]; } || [ "$DISTRO_MAJOR_VERSION" -lt 5 ]; then
|
|
echoerror "End of life distributions are not supported."
|
|
echoerror "Please consider upgrading to the next stable. See:"
|
|
echoerror " https://access.redhat.com/support/policy/updates/errata/"
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
*)
|
|
;;
|
|
esac
|
|
}
|
|
# Fail soon for end of life versions
|
|
__check_end_of_life_versions
|
|
|
|
|
|
##############################################################################
|
|
#
|
|
# CentOS Install Functions
|
|
#
|
|
# gstfsd and its systemd unit, enabled and (re)started: from the clone this
|
|
# script runs in, else from GitHub. Its key is made once and kept: the
|
|
# panel's copy of it (the host's gstfsd key) stays valid.
|
|
install_gstfsd() {
|
|
if [ ! -s /etc/default/webvirt-gstfsd ]; then
|
|
key="$(python3 -c 'import secrets; print(secrets.token_hex(32))')" || return 1
|
|
(umask 077 && printf 'GSTFSD_KEY=%s\n' "$key" > /etc/default/webvirt-gstfsd) || return 1
|
|
fi
|
|
# only root reads it, also when it was there already
|
|
chown root:root /etc/default/webvirt-gstfsd && chmod 600 /etc/default/webvirt-gstfsd || return 1
|
|
src="$(dirname "$0")/.."
|
|
if [ -f "$src/conf/daemon/gstfsd" ]; then
|
|
install -m 755 "$src/conf/daemon/gstfsd" /usr/local/bin/gstfsd &&
|
|
install -m 644 "$src/conf/systemd/webvirt-gstfsd.service" /etc/systemd/system/ || return 1
|
|
else
|
|
curl -fsSL https://raw.githubusercontent.com/retspen/webvirtcloud/master/conf/daemon/gstfsd -o /usr/local/bin/gstfsd &&
|
|
chmod +x /usr/local/bin/gstfsd &&
|
|
curl -fsSL https://raw.githubusercontent.com/retspen/webvirtcloud/master/conf/systemd/webvirt-gstfsd.service -o /etc/systemd/system/webvirt-gstfsd.service || return 1
|
|
fi
|
|
systemctl daemon-reload && systemctl enable webvirt-gstfsd && systemctl restart webvirt-gstfsd || return 1
|
|
}
|
|
|
|
# libvirtd started by systemd sockets ignores libvirtd_opts="-l"; TCP needs its socket
|
|
enable_libvirt_tcp() {
|
|
systemctl cat libvirtd-tcp.socket > /dev/null 2>&1 || return 0
|
|
systemctl stop libvirtd.service && systemctl enable --now libvirtd-tcp.socket && systemctl start libvirtd.service || return 1
|
|
}
|
|
|
|
install_centos() {
|
|
yum -y install epel-release || return 1
|
|
|
|
if [ "$DISTRO_MAJOR_VERSION" -lt 8 ]; then
|
|
yum -y install qemu-kvm libvirt bridge-utils python-libguestfs libguestfs-tools cyrus-sasl-md5 || return 1
|
|
else
|
|
yum -y install qemu-kvm libvirt python3-libguestfs libguestfs-tools cyrus-sasl-md5 || return 1
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
install_centos_post() {
|
|
if [ "$DISTRO_MAJOR_VERSION" -lt 8 ]; then
|
|
if [ -f /etc/sysconfig/libvirtd ]; then
|
|
sed -i 's/#LIBVIRTD_ARGS/LIBVIRTD_ARGS/g' /etc/sysconfig/libvirtd
|
|
else
|
|
echoerror "/etc/sysconfig/libvirtd not found. Exiting..."
|
|
exit 1
|
|
fi
|
|
if [ -f /etc/libvirt/libvirtd.conf ]; then
|
|
sed -i 's/#listen_tls/listen_tls/g' /etc/libvirt/libvirtd.conf
|
|
sed -i 's/#listen_tcp/listen_tcp/g' /etc/libvirt/libvirtd.conf
|
|
sed -i 's/#auth_tcp/auth_tcp/g' /etc/libvirt/libvirtd.conf
|
|
else
|
|
echoerror "/etc/libvirt/libvirtd.conf not found. Exiting..."
|
|
exit 1
|
|
fi
|
|
fi
|
|
if [ -f /etc/libvirt/qemu.conf ]; then
|
|
sed -i 's/#[ ]*vnc_listen.*/vnc_listen = "0.0.0.0"/g' /etc/libvirt/qemu.conf
|
|
else
|
|
echoerror "/etc/libvirt/qemu.conf not found. Exiting..."
|
|
exit 1
|
|
fi
|
|
if [ -f /etc/sasl2/libvirt.conf ]; then
|
|
sed -i 's/: gssapi/: digest-md5/g' /etc/sasl2/libvirt.conf
|
|
sed -i 's/#sasldb_path/sasldb_path/g' /etc/sasl2/libvirt.conf
|
|
else
|
|
echoerror "/etc/sasl2/libvirt.conf not found. Exiting..."
|
|
exit 1
|
|
fi
|
|
install_gstfsd || return 1
|
|
return 0
|
|
}
|
|
|
|
daemons_running_centos() {
|
|
if [ -f /etc/init.d/libvirtd ]; then
|
|
service libvirtd stop > /dev/null 2>&1
|
|
service libvirtd start
|
|
fi
|
|
if [ -f /etc/init.d/libvirt-guests ]; then
|
|
service libvirt-guests stop > /dev/null 2>&1
|
|
service libvirt-guests start
|
|
fi
|
|
|
|
if [ "$DISTRO_MAJOR_VERSION" -lt 8 ]; then
|
|
if [ -f /usr/lib/systemd/system/libvirtd.service ]; then
|
|
systemctl stop libvirtd.service > /dev/null 2>&1
|
|
systemctl start libvirtd.service
|
|
fi
|
|
elif [ "$DISTRO_MAJOR_VERSION" -ge 10 ]; then
|
|
# EL10 runs the modular daemons, one per driver; virtproxyd serves remote TCP (SASL).
|
|
for drv in qemu interface network nodedev nwfilter secret storage proxy; do
|
|
systemctl enable --now virt${drv}d.socket || return 1
|
|
done
|
|
systemctl enable --now virtproxyd-tcp.socket || return 1
|
|
# EL10's policy lets virtproxyd read but not map the SASL database, so TCP logins fail
|
|
if selinuxenabled 2>/dev/null; then
|
|
echo '(allow virtproxyd_t virt_etc_t (file (map)))' > /tmp/wvc-virtproxyd-sasl.cil &&
|
|
semodule -i /tmp/wvc-virtproxyd-sasl.cil || return 1
|
|
fi
|
|
else
|
|
if [ -f /usr/lib/systemd/system/libvirtd-tcp.socket ]; then
|
|
systemctl stop libvirtd-tcp.socket > /dev/null 2>&1
|
|
systemctl start libvirtd-tcp.socket
|
|
fi
|
|
fi
|
|
|
|
if [ -f /usr/lib/systemd/system/libvirt-guests.service ]; then
|
|
systemctl stop libvirt-guests.service > /dev/null 2>&1
|
|
systemctl start libvirt-guests.service
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
#
|
|
# Ended CentOS Install Functions
|
|
#
|
|
##############################################################################
|
|
|
|
##############################################################################
|
|
#
|
|
# openEuler Install Functions
|
|
#
|
|
# qemu is openEuler's qemu-kvm, cyrus-sasl holds the DIGEST-MD5 mechanism
|
|
install_openeuler() {
|
|
dnf -y install qemu libvirt python3-libguestfs cyrus-sasl || return 1
|
|
return 0
|
|
}
|
|
|
|
# the same files as the RHEL family: VNC listen address, SASL, gstfsd
|
|
install_openeuler_post() {
|
|
install_centos_post
|
|
}
|
|
|
|
# openEuler 24.03 ships modular daemons only for qemu and the proxy, so the
|
|
# monolithic libvirtd serves all drivers, with its TCP socket for SASL logins
|
|
daemons_running_openeuler() {
|
|
systemctl enable --now libvirtd.socket libvirtd-ro.socket libvirtd-admin.socket libvirtd-tcp.socket || return 1
|
|
systemctl restart libvirtd.service || return 1
|
|
if [ -f /usr/lib/systemd/system/libvirt-guests.service ]; then
|
|
systemctl enable --now libvirt-guests.service
|
|
fi
|
|
return 0
|
|
}
|
|
#
|
|
# Ended openEuler Install Functions
|
|
#
|
|
##############################################################################
|
|
|
|
##############################################################################
|
|
#
|
|
# Fedora Install Functions
|
|
#
|
|
install_fedora() {
|
|
yum -y install kvm libvirt bridge-utils python3-libguestfs || return 1
|
|
return 0
|
|
}
|
|
|
|
install_fedora_post() {
|
|
if [ -f /etc/sysconfig/libvirtd ]; then
|
|
sed -i 's/#LIBVIRTD_ARGS/LIBVIRTD_ARGS/g' /etc/sysconfig/libvirtd
|
|
else
|
|
echoerror "/etc/sysconfig/libvirtd not found. Exiting..."
|
|
exit 1
|
|
fi
|
|
if [ -f /etc/libvirt/libvirtd.conf ]; then
|
|
sed -i 's/#listen_tls/listen_tls/g' /etc/libvirt/libvirtd.conf
|
|
sed -i 's/#listen_tcp/listen_tcp/g' /etc/libvirt/libvirtd.conf
|
|
sed -i 's/#auth_tcp/auth_tcp/g' /etc/libvirt/libvirtd.conf
|
|
else
|
|
echoerror "/etc/libvirt/libvirtd.conf not found. Exiting..."
|
|
exit 1
|
|
fi
|
|
if [ -f /etc/libvirt/qemu.conf ]; then
|
|
sed -i 's/#[ ]*vnc_listen.*/vnc_listen = "0.0.0.0"/g' /etc/libvirt/qemu.conf
|
|
else
|
|
echoerror "/etc/libvirt/qemu.conf not found. Exiting..."
|
|
exit 1
|
|
fi
|
|
install_gstfsd || return 1
|
|
return 0
|
|
}
|
|
|
|
daemons_running_fedora() {
|
|
if [ -f /usr/lib/systemd/system/libvirtd.service ]; then
|
|
systemctl stop libvirtd.service > /dev/null 2>&1
|
|
systemctl start libvirtd.service
|
|
fi
|
|
if [ -f /usr/lib/systemd/system/libvirt-guests.service ]; then
|
|
systemctl stop libvirt-guests.service > /dev/null 2>&1
|
|
systemctl start libvirt-guests.service
|
|
fi
|
|
return 0
|
|
}
|
|
#
|
|
# Ended Fedora Install Functions
|
|
#
|
|
##############################################################################
|
|
|
|
##############################################################################
|
|
#
|
|
# Opensuse Install Functions
|
|
#
|
|
install_opensuse() {
|
|
zypper -n install -l qemu-kvm libvirt libvirt-daemon-qemu libvirt-client bridge-utils python3-libguestfs || \
|
|
zypper -n install -l kvm libvirt bridge-utils python3-libguestfs || return 1
|
|
return 0
|
|
}
|
|
|
|
install_opensuse_post() {
|
|
if [ -f /etc/sysconfig/libvirtd ]; then
|
|
sed -i 's/#LIBVIRTD_ARGS/LIBVIRTD_ARGS/g' /etc/sysconfig/libvirtd
|
|
fi
|
|
if [ -f /etc/libvirt/libvirtd.conf ]; then
|
|
sed -i 's/#listen_tls/listen_tls/g' /etc/libvirt/libvirtd.conf
|
|
sed -i 's/#listen_tcp/listen_tcp/g' /etc/libvirt/libvirtd.conf
|
|
sed -i 's/#auth_tcp/auth_tcp/g' /etc/libvirt/libvirtd.conf
|
|
sed -i 's/#unix_sock_group = "libvirt"/unix_sock_group = "libvirt"/g' /etc/libvirt/libvirtd.conf
|
|
sed -i 's/#unix_sock_rw_perms = "0770"/unix_sock_rw_perms = "0770"/g' /etc/libvirt/libvirtd.conf
|
|
sed -i 's/#auth_unix_rw = "polkit"/auth_unix_rw = "none"/g' /etc/libvirt/libvirtd.conf
|
|
fi
|
|
if [ -f /etc/libvirt/virtqemud.conf ]; then
|
|
sed -i 's/#listen_tls/listen_tls/g' /etc/libvirt/virtqemud.conf
|
|
sed -i 's/#listen_tcp/listen_tcp/g' /etc/libvirt/virtqemud.conf
|
|
sed -i 's/#auth_tcp/auth_tcp/g' /etc/libvirt/virtqemud.conf
|
|
sed -i 's/#unix_sock_group = "libvirt"/unix_sock_group = "libvirt"/g' /etc/libvirt/virtqemud.conf
|
|
sed -i 's/#unix_sock_rw_perms = "0770"/unix_sock_rw_perms = "0770"/g' /etc/libvirt/virtqemud.conf
|
|
sed -i 's/#auth_unix_rw = "polkit"/auth_unix_rw = "none"/g' /etc/libvirt/virtqemud.conf
|
|
fi
|
|
if [ -f /etc/libvirt/qemu.conf ]; then
|
|
sed -i 's/#[ ]*vnc_listen.*/vnc_listen = "0.0.0.0"/g' /etc/libvirt/qemu.conf
|
|
fi
|
|
install_gstfsd || return 1
|
|
return 0
|
|
}
|
|
|
|
daemons_running_opensuse() {
|
|
systemctl enable --now libvirtd.service 2>/dev/null || systemctl enable --now virtqemud.service 2>/dev/null || true
|
|
systemctl enable --now libvirt-guests.service 2>/dev/null || true
|
|
return 0
|
|
}
|
|
|
|
install_suse() {
|
|
install_opensuse "$@"
|
|
}
|
|
|
|
install_suse_post() {
|
|
install_opensuse_post "$@"
|
|
}
|
|
|
|
daemons_running_suse() {
|
|
daemons_running_opensuse "$@"
|
|
}
|
|
#
|
|
# Ended openSUSE Install Functions
|
|
#
|
|
##############################################################################
|
|
|
|
##############################################################################
|
|
#
|
|
# Ubuntu Install Functions
|
|
#
|
|
install_ubuntu() {
|
|
apt-get update || return 1
|
|
if [ "$DISTRO_MAJOR_VERSION" -lt 18 ]; then
|
|
apt-get -y install kvm libvirt-bin bridge-utils sasl2-bin python-guestfs || return 1
|
|
else
|
|
apt install -y qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virt-manager sasl2-bin python3-guestfs || return 1
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
install_ubuntu_post() {
|
|
if [ -f /etc/default/libvirt-bin ]; then
|
|
sed -i 's/libvirtd_opts="-d"/libvirtd_opts="-d -l"/g' /etc/default/libvirt-bin
|
|
elif [ -f /etc/default/libvirtd ]; then
|
|
sed -i 's/libvirtd_opts="-d"/libvirtd_opts="-d -l"/g' /etc/default/libvirtd
|
|
else
|
|
echoerror "/etc/default/libvirt-bin or /etc/default/libvirtd not found. Exiting..."
|
|
exit 1
|
|
fi
|
|
if [ -f /etc/libvirt/libvirtd.conf ]; then
|
|
sed -i 's/#listen_tls/listen_tls/g' /etc/libvirt/libvirtd.conf
|
|
sed -i 's/#listen_tcp/listen_tcp/g' /etc/libvirt/libvirtd.conf
|
|
sed -i 's/#auth_tcp/auth_tcp/g' /etc/libvirt/libvirtd.conf
|
|
sed -i 's/#auth_unix_rw = "polkit"/auth_unix_rw = "none"/g' /etc/libvirt/libvirtd.conf
|
|
else
|
|
echoerror "/etc/libvirt/libvirtd.conf not found. Exiting..."
|
|
exit 1
|
|
fi
|
|
if [ -f /etc/libvirt/qemu.conf ]; then
|
|
sed -i 's/#[ ]*vnc_listen.*/vnc_listen = "0.0.0.0"/g' /etc/libvirt/qemu.conf
|
|
|
|
else
|
|
echoerror "/etc/libvirt/qemu.conf not found. Exiting..."
|
|
exit 1
|
|
fi
|
|
if [ -f /etc/sasl2/libvirt.conf ]; then
|
|
sed -i 's/: gssapi/: digest-md5/g' /etc/sasl2/libvirt.conf
|
|
sed -i 's/#sasldb_path/sasldb_path/g' /etc/sasl2/libvirt.conf
|
|
fi
|
|
install_gstfsd || return 1
|
|
return 0
|
|
}
|
|
|
|
daemons_running_ubuntu() {
|
|
if [ -f /etc/init.d/libvirt-bin ]; then
|
|
# Still in SysV init!?
|
|
service libvirt-bin stop > /dev/null 2>&1
|
|
service libvirt-bin start
|
|
fi
|
|
enable_libvirt_tcp || return 1
|
|
return 0
|
|
}
|
|
#
|
|
# Ended Ubuntu Install Functions
|
|
#
|
|
##############################################################################
|
|
|
|
##############################################################################
|
|
#
|
|
# Debian Install Functions
|
|
#
|
|
install_debian() {
|
|
apt-get update || return 1
|
|
if [ "$DISTRO_MAJOR_VERSION" -lt 10 ]; then
|
|
apt-get -y install qemu-kvm libvirt-bin bridge-utils sasl2-bin python-guestfs || return 1
|
|
elif [ "$DISTRO_MAJOR_VERSION" -lt 12 ]; then
|
|
apt-get -y install qemu qemu-kvm qemu-system qemu-utils libvirt-clients libvirt-daemon-system sasl2-bin python3-guestfs virtinst || return 1
|
|
else
|
|
apt-get -y install qemu-system qemu-utils libvirt-clients libvirt-daemon-system sasl2-bin python3-guestfs virtinst || return 1
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
install_debian_post() {
|
|
if [ "$DISTRO_MAJOR_VERSION" -ge 8 ]; then
|
|
LIBVIRTSVC=libvirtd
|
|
else
|
|
LIBVIRTSVC=libvirt-bin
|
|
fi
|
|
if [ -f /etc/default/$LIBVIRTSVC ]; then
|
|
if [ "$( grep -c '^libvirtd_opts *=' /etc/default/$LIBVIRTSVC )" -gt 0 ]; then
|
|
if [ "$( grep -c '^libvirtd_opts *=.*-l' /etc/default/$LIBVIRTSVC )" -eq 0 ]; then
|
|
sed -i 's/^libvirtd_opts="\([^"]*\)"/libvirtd_opts="\1 -l"/g' /etc/default/$LIBVIRTSVC
|
|
fi
|
|
else
|
|
sed -i 's/^#libvirtd_opts=.*$/libvirtd_opts="-l"/g' /etc/default/$LIBVIRTSVC
|
|
fi
|
|
else
|
|
echoerror "/etc/default/$LIBVIRTSVC not found. Exiting..."
|
|
exit 1
|
|
fi
|
|
if [ -f /etc/libvirt/libvirtd.conf ]; then
|
|
sed -i 's/#listen_tls/listen_tls/g' /etc/libvirt/libvirtd.conf
|
|
sed -i 's/#listen_tcp/listen_tcp/g' /etc/libvirt/libvirtd.conf
|
|
sed -i 's/#auth_tcp/auth_tcp/g' /etc/libvirt/libvirtd.conf
|
|
sed -i 's/#auth_unix_rw = "polkit"/auth_unix_rw = "none"/g' /etc/libvirt/libvirtd.conf
|
|
else
|
|
echoerror "/etc/libvirt/libvirtd.conf not found. Exiting..."
|
|
exit 1
|
|
fi
|
|
if [ -f /etc/libvirt/qemu.conf ]; then
|
|
sed -i 's/#[ ]*vnc_listen.*/vnc_listen = "0.0.0.0"/g' /etc/libvirt/qemu.conf
|
|
else
|
|
echoerror "/etc/libvirt/qemu.conf not found. Exiting..."
|
|
exit 1
|
|
fi
|
|
if [ -f /etc/sasl2/libvirt.conf ]; then
|
|
sed -i 's/: gssapi/: digest-md5/g' /etc/sasl2/libvirt.conf
|
|
sed -i 's/#sasldb_path/sasldb_path/g' /etc/sasl2/libvirt.conf
|
|
else
|
|
echoerror "/etc/sasl2/libvirt.conf not found. Exiting..."
|
|
exit 1
|
|
fi
|
|
install_gstfsd || return 1
|
|
return 0
|
|
}
|
|
|
|
daemons_running_debian() {
|
|
if [ "$DISTRO_MAJOR_VERSION" -ge 8 ]; then
|
|
LIBVIRTSVC=libvirtd
|
|
else
|
|
LIBVIRTSVC=libvirt-bin
|
|
fi
|
|
if [ -f /etc/init.d/$LIBVIRTSVC ]; then
|
|
/etc/init.d/$LIBVIRTSVC stop > /dev/null 2>&1
|
|
/etc/init.d/$LIBVIRTSVC start
|
|
fi
|
|
enable_libvirt_tcp || return 1
|
|
return 0
|
|
}
|
|
#
|
|
# Ended Debian Install Functions
|
|
#
|
|
##############################################################################
|
|
|
|
#=============================================================================
|
|
# INSTALLATION
|
|
#=============================================================================
|
|
# Let's get the install function
|
|
INSTALL_FUNC_NAMES="install_${DISTRO_NAME_L}"
|
|
|
|
INSTALL_FUNC="null"
|
|
for FUNC_NAME in $(__strip_duplicates "$INSTALL_FUNC_NAMES"); do
|
|
if __function_defined "$FUNC_NAME"; then
|
|
INSTALL_FUNC=$FUNC_NAME
|
|
break
|
|
fi
|
|
done
|
|
echodebug "INSTALL_FUNC=${INSTALL_FUNC}"
|
|
|
|
if [ "$INSTALL_FUNC" = "null" ]; then
|
|
echoerror "No installation function found. Exiting..."
|
|
exit 1
|
|
else
|
|
echoinfo "Running ${INSTALL_FUNC}()"
|
|
if ! $INSTALL_FUNC; then
|
|
echoerror "Failed to run ${INSTALL_FUNC}()!!!"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Let's get the post install function
|
|
POST_FUNC_NAMES="install_${DISTRO_NAME_L}_post"
|
|
|
|
POST_INSTALL_FUNC="null"
|
|
for FUNC_NAME in $(__strip_duplicates "$POST_FUNC_NAMES"); do
|
|
if __function_defined "$FUNC_NAME"; then
|
|
POST_INSTALL_FUNC=$FUNC_NAME
|
|
break
|
|
fi
|
|
done
|
|
echodebug "POST_INSTALL_FUNC=${POST_INSTALL_FUNC}"
|
|
|
|
if [ "$POST_INSTALL_FUNC" = "null" ]; then
|
|
echoerror "No installation function found. Exiting..."
|
|
exit 1
|
|
else
|
|
echoinfo "Running ${POST_INSTALL_FUNC}()"
|
|
if ! $POST_INSTALL_FUNC; then
|
|
echoerror "Failed to run ${POST_INSTALL_FUNC}()!!!"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Let's get the daemons running check function.
|
|
DAEMONS_RUNNING_FUNC_NAMES="daemons_running_${DISTRO_NAME_L}"
|
|
|
|
DAEMONS_RUNNING_FUNC="null"
|
|
for FUNC_NAME in $(__strip_duplicates "$DAEMONS_RUNNING_FUNC_NAMES"); do
|
|
if __function_defined "$FUNC_NAME"; then
|
|
DAEMONS_RUNNING_FUNC=$FUNC_NAME
|
|
break
|
|
fi
|
|
done
|
|
echodebug "DAEMONS_RUNNING_FUNC=${DAEMONS_RUNNING_FUNC}"
|
|
|
|
if [ "$DAEMONS_RUNNING_FUNC" = "null" ]; then
|
|
echoerror "No installation function found. Exiting..."
|
|
exit 1
|
|
else
|
|
echoinfo "Running ${DAEMONS_RUNNING_FUNC}()"
|
|
if ! $DAEMONS_RUNNING_FUNC; then
|
|
echoerror "Failed to run ${DAEMONS_RUNNING_FUNC}()!!!"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
exit 0
|