blob: aaa837a685db4a3172dde39e750827a91dfe2e20 [file] [log] [blame]
#!/usr/bin/env bash
#
# Copyright (c) 2015 Google Inc.
# Kevin Klues <klueska@cs.berkeley.edu>
# See LICENSE for details.
init_script_default="\"Read from Akaross .config\""
function short_description() {
echo "Launch qemu with a running instance of Akaros"
}
function usage() {
echo "Usage:"
echo " ${cmd} -h | --help"
echo " ${cmd} [ --akaros-root=<ak> ]"
echo " ${cmd//?/ } [ --init-script=<script> ]"
echo " ${cmd//?/ } [ --qemu-cmd=<cmd> ]"
echo " ${cmd//?/ } [ --cpu-type=<cpu> ]"
echo " ${cmd//?/ } [ --num-cores=<nc> ]"
echo " ${cmd//?/ } [ --memory-size=<ms> ]"
echo " ${cmd//?/ } [ --network-card=<nc> ]"
echo " ${cmd//?/ } [ --host-tcp-port=<htp> ]"
echo " ${cmd//?/ } [ --akaros-tcp-port=<atp> ]"
echo " ${cmd//?/ } [ --host-udp-port=<hup> ]"
echo " ${cmd//?/ } [ --akaros-udp-port=<aup> ]"
echo " ${cmd//?/ } [ --disable-kvm ]"
echo ""
echo "Options:"
echo " -h --help Display this screen and exit"
echo " --akaros-root=<ak> The path to the root of the akaros tree"
echo " [default: \$AKAROS_ROOT]"
echo " --init-script=<script> The path to a custom init script to run after boot"
echo " [default: ${init_script_default} ]"
echo " --qemu-cmd=<cmd> The actual qemu command to use"
echo " [default: qemu-system-x86_64]"
echo " --cpu-type=<cpu> The type of cpu to launch qemu with"
echo " [default: kvm64,+vmx]"
echo " --num-cores=<nc> The number of cores to launch qemu with"
echo " [default: 8]"
echo " --memory-size=<ms> The amount of memory to launch qemu with (kB)"
echo " [default: 4096]"
echo " --network-card=<nc> The network card to launch qemu qith"
echo " [default: e1000]"
echo " --host-tcp-port=<htp> The host TCP port to forward network traffic"
echo " [default: 5555]"
echo " --akaros-tcp-port=<atp> The Akaros TCP port to receive network traffic"
echo " [default: 5555]"
echo " --host-udp-port=<hup> The host UDP port to forward network traffic"
echo " [default: 5555]"
echo " --akaros-udp-port=<aup> The Akaros UDP port to receive network traffic"
echo " [default: 5555]"
echo " --disable-kvm Disable kvm for qemu"
}
function main() {
# Set these command line arguments before invoking main
# Check the sanity of our environment variables
check_vars akaros_root qemu_cmd init_script cpu_type num_cores \
memory_size network_card host_tcp_port akaros_tcp_port \
host_udp_port akaros_udp_port
check_dirs akaros_root
check_execs qemu_cmd
if [ "\"${init_script}\"" != "${init_script_default}" ]; then
check_files init_script
local init_script_set="true"
fi
# Set some local variables
local akaros_bin=${akaros_root}/kern/kfs/bin
local akaros_kernel=${akaros_root}/obj/kern/akaros-kernel
local akaros_config=${akaros_root}/.config
local akaros_config_backup=${akaros_root}/.config.backup
local akinit_script="/bin/ak-init.sh"
local akinit_script_path=${akaros_root}/kern/kfs/${akinit_script}
local qemu_network="-net nic,model=${network_card} \
-net user,hostfwd=tcp::${host_tcp_port}-:${akaros_tcp_port},hostfwd=udp::${host_udp_port}-:${akaros_udp_port}"
# Launch the monitor if not launched yet and set the monitor tty
local monitor_tty="$(ak launch-qemu-monitor --print-tty-only)"
if [ "${monitor_tty}" != "" ]; then
local qemu_monitor="-monitor ${monitor_tty}"
fi
# Output a warning if we are trying to enable kvm for qemu, but we are not
# part of the kvm group
if [ "${disable_kvm}" == "false" ]; then
groups ${USER} | grep &>/dev/null '\bkvm\b'
if [ "${?}" != "0" ]; then
echo "You are not part of the kvm group!"
echo " This may cause problems with running qemu with kvm enabled."
echo " To disable kvm, rerun this script with --disable-kvm."
fi
local qemu_kvm="-enable-kvm"
fi
# Make a backup of ${akaros_config} and set the init script in it
if [ "${init_script_set}" == "true" ]; then
echo "Setting custom init script"
cp ${akaros_config} ${akaros_config_backup}
cp ${init_script} ${akinit_script_path}
if [ "$(grep 'CONFIG_RUN_INIT_SCRIPT=' ${akaros_config})" = "" ]; then
echo "CONFIG_RUN_INIT_SCRIPT=y" >> ${akaros_config}
echo "CONFIG_INIT_SCRIPT_PATH_AND_ARGS=\"${akinit_script}\"" >> ${akaros_config}
else
sed -ie 's#CONFIG_INIT_SCRIPT_PATH_AND_ARGS=.*#CONFIG_INIT_SCRIPT_PATH_AND_ARGS="'${akinit_script}'"#' ${akaros_config}
fi
fi
# Rebuild akaros
echo "Rebuilding akaros"
cd ${akaros_root}
touch ${akaros_config}
make -j
cd - > /dev/null
# Restore the original ${akaros_config} and delete the init script
if [ "${init_script_set}" == "true" ]; then
mv ${akaros_config_backup} ${akaros_config}
rm ${akinit_script_path}
fi
# Rebuild akaros test and libs
echo "Rebuilding tests and libs"
cd ${akaros_root}
make -j install-libs
make -j tests
make fill-kfs
cd - > /dev/null
# Launching qemu
echo "Launching qemu"
local stty_state=$(stty -g)
stty raw
${qemu_cmd} -s ${qemu_kvm} ${qemu_network} ${qemu_monitor} -cpu ${cpu_type} \
-smp ${num_cores} -m ${memory_size} -kernel ${akaros_kernel} \
-nographic
stty ${stty_state}
}