Linux通用KVM自动安装Shell脚本(兼容所有Linux发行版/CentOS/Ubuntu)

Posted Jim

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux通用KVM自动安装Shell脚本(兼容所有Linux发行版/CentOS/Ubuntu)相关的知识,希望对你有一定的参考价值。

官网:

https://github.com/retspen/webvirtmgr/wiki/Setup-Host-Server

安装:

wget -O - https://retspen.github.io/libvirt-bootstrap.sh | sudo sh

脚本:

vim libvirt-bootstrap.sh
chmod 777 libvirt-bootstrap.sh
技术分享图片
#!/bin/sh -
#===============================================================================
# vim: softtabstop=4 shiftwidth=4 expandtab fenc=utf-8 spell spelllang=en cc=81
#===============================================================================
#
#          FILE: bootstrap-webvirtmgr.sh
#
#   DESCRIPTION: Bootstrap webvirtmgr installation for various distributions
#
#          BUGS: https://github.com/retspen/webvirtmgr-boostrap/issues
#
#     COPYRIGHT: (c) 2013 by the WebVirtMgr Team
#
#       LICENSE: Apache 2.0
#  ORGANIZATION: WebVirtMgr (webvirtmgr.net)
#       CREATED: 11/11/2013 11:00:00 EET
#===============================================================================

#---  FUNCTION  ----------------------------------------------------------------
#          NAME:  echoerr
#   DESCRIPTION:  Echo errors to stderr.
#-------------------------------------------------------------------------------
echoerror() {
    printf "${RC} * ERROR${EC}: [email protected]\n" 1>&2;
}

#---  FUNCTION  ----------------------------------------------------------------
#          NAME:  echoinfo
#   DESCRIPTION:  Echo information to stdout.
#-------------------------------------------------------------------------------
echoinfo() {
    printf "${GC} *  INFO${EC}: %s\n" "[email protected]";
}

#---  FUNCTION  ----------------------------------------------------------------
#          NAME:  echowarn
#   DESCRIPTION:  Echo warning informations to stdout.
#-------------------------------------------------------------------------------
echowarn() {
    printf "${YC} *  WARN${EC}: %s\n" "[email protected]";
}

#---  FUNCTION  ----------------------------------------------------------------
#          NAME:  echodebug
#   DESCRIPTION:  Echo debug information to stdout.
#-------------------------------------------------------------------------------
echodebug() {
    if [ $_ECHO_DEBUG -eq $BS_TRUE ]; then
        printf "${BC} * DEBUG${EC}: %s\n" "[email protected]";
    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 [email protected] | 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|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 [email protected] | sed -r s:[[:space:]]:\n:g | sort --unique --ignore-case); do
        match=$(echo $release_file | egrep -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 lets 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 $max_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=""

    # Lets test if the lsb_release binary is available
    rv=$(lsb_release >/dev/null 2>&1)
    if [ $? -eq 0 ]; then
        DISTRO_NAME=$(lsb_release -si)
        if [ "x$(echo "$DISTRO_NAME" | grep Scientific)" != "x" ]; then
            DISTRO_NAME="CentOS"
        fi
        if [ "x$(echo "$DISTRO_NAME" | grep RedHat)" != "x" ]; then
            # Lets convert CamelCase to Camel Case
            DISTRO_NAME=$(__camelcase_split "$DISTRO_NAME")
        fi
        if [ "${DISTRO_NAME}" = "openSUSE project" ]; then
            # lsb_release -si returns "openSUSE project" on openSUSE 12.3
            DISTRO_NAME="opensuse"
        fi
        if [ "${DISTRO_NAME}" = "SUSE LINUX" ]; 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 dont 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 && /bin/ls *[_-]release *[_-]version 2>/dev/null | env -i sort |             sed -e /^redhat-release$/d -e /^lsb-release$/d;             echo redhat-release lsb-release
            )); do

        [ -L "/etc/${rsource}" ] && continue        # Dont follow symlinks
        [ ! -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  # Theres no version information. Continue to next rsource
        v=$(__parse_version_string "$rv")
        case $(echo ${n} | tr [:upper:] [:lower:]) in
            redhat             )
                if [ ".$(egrep ‘CentOS‘ /etc/${rsource})" != . ]; then
                    n="CentOS"
                elif [ ".$(egrep ‘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"         ;;
            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)
                rv=$(grep ^VERSION_ID= /etc/os-release | sed -e s/^VERSION_ID=\(.*\)$/\1/g)
                [ "${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
                                # Ive 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
                        ;;
                    *           )
                        n=${nn}
                        ;;
                esac
                ;;
            *                  ) n="${n}"           ;
        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)
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 versions not supported
            #
            #  <= 12.1
            if ([ $DISTRO_MAJOR_VERSION -eq 12 ] && [ $DISTRO_MINOR_VERSION -eq 1 ]) || [ $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)
            # SuSE versions not supported
            #
            # < 11 SP2
            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
            ;;

        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 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 "    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
#
install_centos() {
    if [ $DISTRO_MAJOR_VERSION -ge 6 ]; then
        yum -y install qemu-kvm libvirt bridge-utils || return 1
    fi
    return 0
}

install_centos_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/g /etc/libvirt/qemu.conf
    else
        echoerror "/etc/libvirt/qemu.conf not found. Exiting..."
        exit 1
    fi
    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 [ -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 CentOS Install Functions
#
##############################################################################

##############################################################################
#
#   Fedora Install Functions
#
install_fedora() {
    yum -y install kvm libvirt bridge-utils || 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/g /etc/libvirt/qemu.conf
    else
        echoerror "/etc/libvirt/qemu.conf not found. Exiting..."
        exit 1
    fi
    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 kvm libvirt bridge-utils || return 1
    return 0
}

install_opensuse_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/g /etc/libvirt/qemu.conf
    else
        echoerror "/etc/libvirt/qemu.conf not found. Exiting..."
        exit 1
    fi
    return 0
}

daemons_running_opensuse() {
    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 openSUSE Install Functions
#
##############################################################################

##############################################################################
#
#   Ubuntu Install Functions
#
install_ubuntu() {
    apt-get update || return 1
    apt-get -y install kvm libvirt-bin bridge-utils sasl2-bin || return 1
    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
    else
        echoerror "/etc/default/libvirt-bin 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
        if ([ $DISTRO_MAJOR_VERSION -eq 12 ] && [ $DISTRO_MINOR_VERSION -eq 04 ]); then
            sed -i s/# vnc_listen/vnc_listen/g /etc/libvirt/qemu.conf
        else
            sed -i s/#vnc_listen/vnc_listen/g /etc/libvirt/qemu.conf
        fi
    else
        echoerror "/etc/libvirt/qemu.conf not found. Exiting..."
        exit 1
    fi
    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
    return 0
} 
#
#   Ended Ubuntu Install Functions
#
##############################################################################

##############################################################################
#
#   Debian Install Functions
#
install_debian() {
    apt-get update || return 1
    if [ $DISTRO_MAJOR_VERSION -ge 8 ]; then
        apt-get -y install kvm libvirt-daemon-system bridge-utils sasl2-bin || return 1
    else
        apt-get -y install kvm libvirt-bin bridge-utils sasl2-bin || 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
    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/g /etc/libvirt/qemu.conf
    else
        echoerror "/etc/libvirt/qemu.conf not found. Exiting..."
        exit 1
    fi
    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
    return 0
} 
#
#   Ended Debian Install Functions
#
##############################################################################

#=============================================================================
# INSTALLATION
#=============================================================================
# Lets 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}()"
    $INSTALL_FUNC
    if [ $? -ne 0 ]; then
        echoerror "Failed to run ${INSTALL_FUNC}()!!!"
        exit 1
    fi
fi

# Lets 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}()"
    $POST_INSTALL_FUNC
    if [ $? -ne 0 ]; then
        echoerror "Failed to run ${POST_INSTALL_FUNC}()!!!"
        exit 1
    fi
fi

# Lets 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}()"
    $DAEMONS_RUNNING_FUNC
    if [ $? -ne 0 ]; then
        echoerror "Failed to run ${DAEMONS_RUNNING_FUNC}()!!!"
        exit 1
    fi
fi

exit 0
View Code

 

以上是关于Linux通用KVM自动安装Shell脚本(兼容所有Linux发行版/CentOS/Ubuntu)的主要内容,如果未能解决你的问题,请参考以下文章

kvm一键shell自动生成 windows 虚拟机,无人值守操作方案(step1)

KVM之初体验——手动及自动化安装KVM脚本

shell脚本编程《linux下kvm虚拟机的创建开启显示停止重置》

linux下编写一个shell脚本,实现自动安装软件

kvm部署安装

Linux环境一键自动化安装oracle软件的构想(附shell脚本)