#! /bin/sh # # This collection of scripts aims to install a NOVIT cluster easily, with help of QEMU # # # QEMU local bridge name. If you specificy a custom name, you may have to configure qemu bridge helper to allow it QEMU_BR_NAME=virbr0 # # QEMU VM default disk size QEMU_DISK_SIZE=30G # Allocated CPUs to QEMU VMs QEMU_VM_CPU=4 # Allocated Memory to QEMU VMs QEMU_VM_MEM=8096 ################ ## QEMU functions # prereqs_qemu() { for com in qemu-system-x86_64 truncate docker iptables ; do command -v $com 1>/dev/null || error Command $com not found, please install it. Aborting... done } setup_network_qemu() { if ! ip li show $QEMU_BR_NAME ; then ip li add name $QEMU_BR_NAME type bridge ip li set $QEMU_BR_NAME up fi QEMU_BR_IP=$(extract_var clusters gateway) QEMU_BR_MASK=$(extract_var clusters netmask) if [ $(echo $QEMU_BR_IP | wc -w) -gt 1 ]; then perror "More than one cluster is configured, not compatible with our quick-start setup, exiting" fi pinfo "Using detected gateway IP $QEMU_BR_IP for bridge $QEMU_BR_NAME" if ! ip a show dev $QEMU_BR_NAME | grep $QEMU_BR_IP ; then ip a add $QEMU_BR_IP/$QEMU_BR_MASK dev $QEMU_BR_NAME sudo iptables -t nat -I POSTROUTING -j MASQUERADE -s $QEMU_BR_IP/$QEMU_BR_MASK \! -o $QEMU_BR_NAME sudo iptables -I FORWARD -o $QEMU_BR_NAME -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT sudo iptables -I FORWARD -j ACCEPT -i $QEMU_BR_NAME fi } run_qemu() { id=1 for host in ${!hosts[*]}; do ip route show |grep "${hosts[$host]} dev $QEMU_BR_NAME" ||\ ip route add ${hosts[$host]} dev $QEMU_BR_NAME if test -f $ctxdir/data/$host/pid ; then pinfo "Detected a pid file, killing process in case VM was already started" kill $(cat $ctxdir/data/$host/pid) && sleep 1 fi pinfo "Starting host $host with ip ${hosts[$host]}" qemu-system-x86_64 -enable-kvm -smp $QEMU_VM_CPU -m $QEMU_VM_MEM \ -nic bridge,br=$QEMU_BR_NAME,mac=42:42:42:42:42:0${id} \ -kernel $ctxdir/data/$host/kernel -initrd $ctxdir/data/$host/initrd-v2 -vga qxl \ -drive format=raw,file=$ctxdir/data/$host/disk & echo $! >$ctxdir/data/$host/pid ((++id)) done pinfo "$(ls $ctxdir/data/*/pid|wc -w) host(s) have been started" } # # # # # # # # source $(dirname $0)/.common check_root prereqs check_conf #fresh_start trap clean SIGINT SIGTERM SIGKILL declare -A hosts setup_network_qemu get_hosts get_parts run_qemu #clean