diff options
| author | Brijesh Singh <brijesh.singh@amd.com> | 2017-08-07 16:35:51 -0400 |
|---|---|---|
| committer | Brijesh Singh <brijesh.singh@amd.com> | 2017-08-07 16:35:51 -0400 |
| commit | ab10f43176b9dcc59c905dbe4d2b587b7ec4555b (patch) | |
| tree | a419e4485161778bb13548f00717496113ff3b8d /launch-qemu.sh | |
| download | cachepc-amdsev-ab10f43176b9dcc59c905dbe4d2b587b7ec4555b.tar.gz cachepc-amdsev-ab10f43176b9dcc59c905dbe4d2b587b7ec4555b.zip | |
Initial commit
Diffstat (limited to 'launch-qemu.sh')
| -rwxr-xr-x | launch-qemu.sh | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/launch-qemu.sh b/launch-qemu.sh new file mode 100755 index 0000000..f9baad5 --- /dev/null +++ b/launch-qemu.sh @@ -0,0 +1,251 @@ +#!/bin/bash + +# +# user changeable parameters +# +HDA_FILE="${HOME}/ubuntu-16.04-desktop.qcow2" +GUEST_SIZE_IN_MB="2048" +SEV_GUEST="1" +SMP_NCPUS="4" +CONSOLE="serial" +QEMU_INSTALL_DIR=`pwd`/bin/ +UEFI_BIOS_CODE="`pwd`/share/qemu/OVMF_CODE.fd" +UEFI_BIOS_VARS="`pwd`/OVMF_VARS.fd" +#VNC_PORT="" +AUTOSTART="1" + +usage() { + echo "$0 [options]" + echo "Available <commands>:" + echo " -hda hard disk" + echo " -nosev disable sev support" + echo " -mem guest memory" + echo " -smp number of cpus" + echo " -console display console to use (serial or graphics)" + echo " -vnc VNC port to use" + echo " -bios bios to use (default $UEFI_BIOS_CODE)" + echo " -netconsole redirect console to tcp port" + echo " -kernel kernel to use" + echo " -initrd initrd to use" + echo " -noauto do not autostart the guest" + echo " -cdrom CDROM image" + echo " -hugetlb use hugetlbfs" + echo " -background background the launch" + exit 1 +} + +add_opts() { + echo -n "$* " >> ${QEMU_CMDLINE} +} + +stop_network() { + if [ "$GUEST_TAP_NAME" = "" ]; then + return + fi + run_cmd "ip tuntap del ${GUEST_TAP_NAME} mode tap" +} + +exit_from_int() { + stop_network + + rm -rf ${QEMU_CMDLINE} + # restore the mapping + stty intr ^c + exit 1 +} + +run_cmd () { + $* + if [ $? -ne 0 ]; then + echo "command $* failed" + exit 1 + fi +} + +setup_hugetlbfs() { + HUGETLBFS=`mount | grep hugetlbfs | awk {'print $3'}` + if [ "${HUGETLBFS}" = "" ]; then + HUGETLBFS="/hugetlbfs" + run_cmd "mkdir -p $HUGETLBFS" + echo "Mounting $HUGETLBFS..." + run_cmd "mount -t hugetlbfs nodev $HUGETLBFS" + fi + # calculate number of hugepage we need for the guest + HPAGES=$((($GUEST_SIZE_IN_MB / 2) + 50)) + echo -n "Setting hugepage count " + echo $HPAGES | sudo tee /proc/sys/vm/nr_hugepages + + add_opts "-mem-path ${HUGETLBFS}" +} + +setup_bridge_network() { + # Get last tap device on host + TAP_NUM=`ifconfig | grep tap | tail -1 | cut -c4- | cut -f1 -d ' '` + if [ "$TAP_NUM" = "" ]; then + TAP_NUM="1" + fi + TAP_NUM=`echo $(( TAP_NUM + 1 ))` + GUEST_TAP_NAME="tap${TAP_NUM}" + GUEST_MAC_ADDR=$(printf "00:16:3e:%02x:01:01" 0x${TAP_NUM}) + + echo "Starting network adapter '${GUEST_TAP_NAME}' MAC=$GUEST_MAC_ADDR" + run_cmd "ip tuntap add $GUEST_TAP_NAME mode tap user `whoami`" + run_cmd "ip link set $GUEST_TAP_NAME up" + run_cmd "ip link set $GUEST_TAP_NAME master br0" + + add_opts "-device e1000,mac=${GUEST_MAC_ADDR},netdev=net0" + add_opts "-netdev tap,id=net0,ifname=$GUEST_TAP_NAME,script=no,downscript=no" +} + +trap exit_from_int SIGINT + +if [ `id -u` -ne 0 ]; then + echo "Must be run as root!" + exit 1 +fi + +while [[ $1 != "" ]]; do + case "$1" in + -hda) HDA_FILE="${2}" + shift + ;; + -nosev) SEV_GUEST="" + ;; + -mem) GUEST_SIZE_IN_MB=${2} + shift + ;; + -console) CONSOLE=${2} + shift + ;; + -smp) SMP_NCPUS=$2 + shift + ;; + -vnc) VNC_PORT=$2 + shift + if [ "${VNC_PORT}" = "" ]; then + usage + fi + ;; + -bios) UEFI_BIOS_CODE="`readlink -f $2`" + shift + ;; + -netconsole) NETCONSOLE_PORT=$2 + shift + ;; + -initrd) INITRD_FILE=$2 + shift + ;; + -kernel) KERNEL_FILE=$2 + shift + ;; + -cdrom) CDROM_FILE=$2 + shift + ;; + -noauto) AUTOSTART="0" + ;; + -hugetlb) USE_HUGETLBFS="1" + ;; + *) usage;; + esac + shift +done + +# we add all the qemu command line options into a file +QEMU_CMDLINE=/tmp/cmdline.$$ +rm -rf ${QEMU_CMDLINE} + +add_opts "${QEMU_INSTALL_DIR}qemu-system-x86_64" + +# Basic virtual machine property +add_opts "-enable-kvm -cpu host" + +# add number of VCPUs +[ ! -z ${SMP_NCPUS} ] && add_opts "-smp ${SMP_NCPUS},maxcpus=64" + +# define guest memory +add_opts "-m ${GUEST_SIZE_IN_MB}M,slots=5,maxmem=30G" + +# The OVMF binary, including the non-volatile variable store, appears as a +# "normal" qemu drive on the host side, and it is exposed to the guest as a +# persistent flash device. +add_opts "-drive if=pflash,format=raw,unit=0,file=${UEFI_BIOS_CODE},readonly" +add_opts "-drive if=pflash,format=raw,unit=1,file=${UEFI_BIOS_VARS}" + +# add CDROM if specified +[ ! -z ${CDROM_FILE} ] && add_opts "-drive file=${CDROM_FILE},media=cdrom,index=0" + +# If harddisk file is specified then add the HDD drive +if [ ! -z ${HDA_FILE} ]; then + if [[ ${HDA_FILE} = *"qcow2" ]]; then + add_opts "-drive file=${HDA_FILE},format=qcow2" + else + add_opts "-drive file=${HDA_FILE},format=raw" + fi +fi + +# If this is SEV guest then add the encryption device objects to enable SEV +if [ ! -z ${SEV_GUEST} ]; then + add_opts "-object sev-guest,id=sev0" + add_opts "-machine memory-encryption=sev0" +fi + +# if we are asked to use hugetlbfs +[ ! -z ${USE_HUGETLBFS} ] && setup_hugetlbfs + +# If we are asked to redirect the serial console to network port +if [ "${NETCONSOLE_PORT}" != "" ]; then + HOST_ADDR="`ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'`" + add_opts "-chardev socket,host=$HOST_ADDR,port=$NETCONSOLE_PORT,id=gnc1,server,nowait" + add_opts "-device isa-serial,chardev=gnc1" + echo "Setting network console $HOST_ADDR:$NETCONSOLE_PORT" +fi + +# if console is serial then disable graphical interface +if [ "${CONSOLE}" = "serial" ]; then + add_opts "-nographic" +fi + +# if -kernel arg is specified then use the kernel provided in command line for boot +if [ "${KERNEL_FILE}" != "" ]; then + add_opts "-kernel $KERNEL_FILE" + add_opts "-append \"console=ttyS0 earlyprintk=serial root=/dev/sda2\"" + [ ! -z ${INITRD_FILE} ] && add_opts "-initrd ${INITRD_FILE}" +fi + +# start vnc server +[ ! -z ${VNC_PORT} ] && add_opts "-vnc :${VNC_PORT}" && echo "Starting VNC on port ${VNC_PORT}" + +# start monitor on pty and named socket 'monitor' +add_opts "-monitor pty -monitor unix:monitor,server,nowait" + +# do we do not need to autostart the guest +if [ "${AUTOSTART}" = "0" ]; then + echo "Disabling autostart" + add_opts "-S" +fi + +# check if host has bridge network +BR0_STATUS="`ifconfig | grep br0`" +if [ "$BR0_STATUS" != "" ]; then + setup_bridge_network +fi + +# log the console output in stdout.log +QEMU_CONSOLE_LOG=`pwd`/stdout.log + +# save the command line args into log file +cat $QEMU_CMDLINE | tee ${QEMU_CONSOLE_LOG} +echo | tee -a ${QEMU_CONSOLE_LOG} + +# map CTRL-C to CTRL ] +echo "Mapping CTRL-C to CTRL-]" +stty intr ^] + +echo "Launching VM ..." +bash ${QEMU_CMDLINE} 2>&1 | tee -a ${QEMU_CONSOLE_LOG} + +# restore the mapping +stty intr ^c + +rm -rf ${QEMU_CMDLINE} +stop_network |
