#!/bin/bash # Copyright ©2007-2008 Hugo Mills # Licensed under GPLv2. See the file COPYING for full details. CONFDIR=/etc/vamos QEMU_COMMAND=qemu-system-x86_64 NETMASK=255.255.255.0 VIDEO=sdl function prepare_disk { VOLUME="$1" # Decide whether to use frankendisk to prepare the disk or not if [ ${VOLUME:0:12} == "frankendisk:" ]; then VOLUME=${VOLUME#*:} if frankendisk -L | grep ${VOLUME} | grep -q inactive; then frankendisk -A ${VOLUME} >/dev/null fi VOLUME=/dev/mapper/${VOLUME} fi echo ${VOLUME} } if [ -f ${CONFDIR}/vamos.conf ]; then . ${CONFDIR}/vamos.conf fi if [ -f ${USERCONFDIR}/vamos.conf ]; then . ${USERCONFDIR}/vamos.conf fi VMNAME=${1} if [ -z "${VMNAME}" ]; then echo No config file specified exit 1 fi #echo ${CONFDIR} #echo ${VMNAME} if [ -f ${CONFDIR}/${VMNAME} ]; then . ${CONFDIR}/${VMNAME} elif [ -f ${USERCONFDIR}/${VMNAME} ]; then . ${USERCONFDIR}/${VMNAME} else echo Config ${VMNAME} not found. exit 1 fi if [ -z "${ID}" ]; then echo No ID specified for ${VMNAME} exit 1 fi shift if [ ${UID} -eq 0 ]; then RUNDIR=/var/run/vamos else RUNDIR=${HOME}/.vamos/run fi NETDIR=${RUNDIR}/net PIDDIR=${RUNDIR}/pids mkdir -p ${PIDDIR} ${NETDIR} # Disks if [ "${HDA}" ]; then HDA=$(prepare_disk ${HDA}) DISKS="${DISKS} -hda ${HDA}" fi if [ "${HDB}" ]; then HDB=$(prepare_disk ${HDB}) DISKS="${DISKS} -hdb ${HDB}" fi if [ "${CDROM}" ]; then CDROM=$(prepare_disk ${CDROM}); DISKS="${DISKS} -cdrom ${CDROM}" else if [ "${HDC}" ]; then HDC=$(prepare_disk ${HDC}) DISKS="${DISKS} -hdc ${HDC}" fi fi if [ "${HDD}" ]; then HDD=$(prepare_disk ${HDD}) DISKS="${DISKS} -hdd ${HDD}" fi for VAR in ${!VIRTIO*}; do HD=$(prepare_disk ${!VAR}) DISKS="${DISKS} -drive file=${HD},if=virtio" done for VAR in ${!SCSI*}; do HD=$(prepare_disk ${!VAR}) DISKS="${DISKS} -drive file=${HD},if=scsi" done # Platform if [ "${RAM}" ]; then MEMORY="-m ${RAM}"; fi if [ "${CPUS}" ]; then CPU_CMD="-smp ${CPUS}"; fi # Network if [ "${GUEST_MAC}" ]; then MAC=",macaddr=${GUEST_MAC}"; fi if [ -z "${VLAN}" ]; then VLAN=${ID}; fi if [ "${GUEST_NIC}" ]; then NIC=",model=${GUEST_NIC}"; fi case "${NET_TYPE}" in routed) if [ $UID -ne 0 ]; then echo root permissions needed to run in routed mode exit 1 fi NETWORK="-net nic,vlan=${VLAN}${MAC}${NIC}" NETWORK="${NETWORK} -net tap,vlan=${VLAN},ifname=tap${VLAN},script=${CONFDIR}/scripts/ifup-routed" echo IP="${USE_IP}" >${NETDIR}/tap${USE_VLAN} echo MASK="${USE_MASK}" >>${NETDIR}/tap${USE_VLAN} echo BRIDGE="${USE_BRIDGE}" >>${NETDIR}/tap${USE_VLAN} ;; bridged) if [ $UID -ne 0 ]; then echo root permissions needed to run in bridged mode exit 1 fi NETWORK="-net nic,vlan=${VLAN}${MAC}${NIC}" NETWORK="${NETWORK} -net tap,vlan=${VLAN},ifname=tap${VLAN},script=${CONFDIR}/scripts/ifup-bridged" echo IP="${USE_IP}" >${NETDIR}/tap${USE_VLAN} echo MASK="${USE_MASK}" >>${NETDIR}/tap${USE_VLAN} echo BRIDGE="${USE_BRIDGE}" >>${NETDIR}/tap${USE_VLAN} ;; *) NETWORK="-net nic,vlan=${VLAN}${MAC}${NIC} -net user,vlan=${VLAN}" ;; esac # New network code for TYPE in ${!NET_TYPE_*}; do NID=${TYPE#NET_TYPE_} MAC=NET_MAC_${NID} NIC=NET_NIC_${NID} VLAN=NET_VLAN_${NID} IP=NET_IP_${NID} MASK=NET_MASK_${NID} BRIDGE=NET_BRIDGE_${NID} USE_VLAN=${ID} if [ "${!VLAN}" ]; then USE_VLAN="${!VLAN}"; fi USE_MAC= if [ "${!MAC}" ]; then USE_MAC=",macaddr=${!MAC}"; fi USE_NIC= if [ "${!NIC}" ]; then USE_NIC=",model=${!NIC}"; fi USE_IP= if [ "${!IP}" ]; then USE_IP="${!IP}"; fi USE_MASK=255.255.255.0 if [ "${!MASK}" ]; then USE_MASK="${!MASK}"; fi USE_BRIDGE= if [ "${!BRIDGE}" ]; then USE_BRIDGE="${!BRIDGE}"; fi if [ "${!TYPE}" = routed -o "${!TYPE}" = bridged ]; then if [ $UID -ne 0 ]; then echo root permissions needed to run in routed mode exit 1 fi fi NETWORK="${NETWORK} -net nic,vlan=${USE_VLAN}${USE_MAC}${USE_NIC}" NETWORK="${NETWORK} -net tap,vlan=${USE_VLAN},ifname=tap${USE_VLAN},script=${CONFDIR}/scripts/ifup-${!TYPE}" echo IP="${USE_IP}" >${NETDIR}/tap${USE_VLAN} echo MASK="${USE_MASK}" >>${NETDIR}/tap${USE_VLAN} echo BRIDGE="${USE_BRIDGE}" >>${NETDIR}/tap${USE_VLAN} done # Video if [ -z "${VNC_DISPLAY}" ]; then VNC_DISPLAY=${ID}; fi case ${VIDEO} in sdl) VIDEO_CMD= ;; vnc) VIDEO_CMD="-vnc :${VNC_DISPLAY}" ;; *) VIDEO_CMD="-nographic" TCP_PORT=$((7500 + ${VLAN})) if [ -z "${CONSOLE}" ]; then CONSOLE="-serial tcp::${TCP_PORT},server,nowait" fi ;; esac COMMAND="${QEMU_COMMAND} ${DISKS} ${VIDEO_CMD} ${MEMORY} ${CPU_CMD} " COMMAND="${COMMAND} ${NETWORK} ${CONSOLE} ${OPTIONS} $@" if [ "${NOEXEC}" ]; then echo "${COMMAND}" exit 0 else ${QEMU_COMMAND} ${DISKS} ${VIDEO_CMD} ${MEMORY} ${CPU_CMD} \ ${NETWORK} ${CONSOLE} ${OPTIONS} $@ & VM_PID=$! echo ${VM_PID} >${PIDDIR}/vm.${VMNAME}.${ID} fi sleep 1 #for TYPE in ${!NET_TYPE_*}; do # NID=${TYPE#NET_TYPE_} # VLAN=NET_VLAN_${NID} # # USE_VLAN=${ID} # if [ "${!VLAN}" ]; then USE_VLAN="${!VLAN}"; fi # # if [ "${USE_IP}" ]; then # ifconfig "tap${USE_VLAN}" "${USE_IP}" netmask "${USE_MASK}" up # fi #done