|  | #!/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} | 
|  | } | 
|  |  |