Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 2 Nov 2013 04:48:57 +0100
From:      Michael Gmelin <freebsd@grem.de>
To:        freebsd-virtualization@freebsd.org <freebsd-virtualization@freebsd.org>
Subject:   rc.d script for running bhyve in tmux
Message-ID:  <20131102044857.3d5a2c85@bsd64.grem.de>

next in thread | raw e-mail | index | archive | help
--MP_/NuWMa/AbkZYBbIFVOW/+MvI
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Hi,

I hacked together a small rc.d script for starting bhyve(4) in tmux,
maybe it's useful to others too. Place it in /usr/local/etc/rc.d and
install sysutils/tmux. Might need some love to fit your needs.

Minimal configuration example:
pkg install tmux

echo "net.link.tap.up_on_open=1" >> /etc/sysctl.conf

cat >> /boot/loader.conf << EOF
if_tap_load="YES"
if_bridge_load="YES"
vmm_load="YES"
EOF

kldload tap; kldload bridge; kldload vmm

cat >> /etc/rc.conf << EOF
cloned_interfaces="tap0 bridge0"
bhyve_enable="YES"
bhyve_diskdev="/dev/zvol/tank/bhyve/virt"
EOF

ifconfig tap0 create
ifconfig bridge0 create

service bhyve start
tmux list-sessions
tmux attach -t bhyve
service bhyve status
service bhyve stop

Multi profile configuration example:
cat >> /etc/rc.conf << EOF
cloned_interfaces="tap0 tap1 bridge0"
bhyve_enable="YES"
bhyve_profiles="virt1 virt2"
bhyve_virt1_diskdev="/dev/zvol/tank/bhyve/virt1"

bhyve_virt2_tapdev="tap1"
bhyve_virt2_diskdev="/dev/zvol/tank/bhyve/virt2"
bhyve_virt2_memsize="8192"
bhyve_virt2_ncpu="4"
EOF

ifconfig tap0 create
ifconfig tap1 create
ifconfig bridge0 create

service bhyve start # start all
service bhyve start virt2 # start individual
tmux attach -t bhyve_virt1
tmux attach -t bhyve_virt1
service bhyve stop virt2 # stop individual
service bhyve stop # stop all

(by default ctrl-b d detaches from tmux).

Cheers,
Michael

-- 
Michael Gmelin

--MP_/NuWMa/AbkZYBbIFVOW/+MvI
Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename=bhyve

#!/bin/sh
#
# $FreeBSD: mgmelin
#

# PROVIDE: bhyve
# REQUIRE: LOGIN
# KEYWORD: nojail
#

#
# Add the following lines to /etc/rc.conf to enable bhyve:
# bhyve_enable (bool):  Set to "NO" by default.
#                       Set it to "YES" to enable bhyve
# bhyve_profiles (str): Set to "" by default.
#                       Define your profiles here.
# bhyve_tapdev (str):   Set to "tap0" by default.
#                       Set to the tap(4) device to use.
# bhyve_diskdev (str):  Must be set, no default.
#                       Set to the disk device to use.
# bhyve_ncpu (int):     Set to 1 by default.
#                       Set to the number of CPUs for the VM.
# bhyve_memsize (int):  Set to 512 by default.
#                       Set to the number of MB of memory for the VM.

. /etc/rc.subr

name=3D"bhyve"
rcvar=3Dbhyve_enable

start_precmd=3D"bhyve_prestart"
status_cmd=3D"bhyve_status"
poll_cmd=3D"bhyve_poll"
stop_cmd=3D"bhyve_stop"
_session=3D$name
command=3D"/usr/local/bin/tmux"
procname=3D"-sh"

[ -z "$bhyve_enable" ]  && bhyve_enable=3D"NO"
[ -z "$bhyve_tapdev" ]  && bhyve_tapdev=3D"tap0"
[ -z "$bhyve_diskdev" ] && bhyve_diskdev=3D"none"
[ -z "$bhyve_ncpu" ]    && bhyve_ncpu=3D"1"
[ -z "$bhyve_memsize" ] && bhyve_memsize=3D"512"

load_rc_config $name

if [ -n "$2" ]; then
	profile=3D"$2"
	_session=3D"${_session}_${profile}"
	if [ "x${bhyve_profiles}" !=3D "x" ]; then
		eval bhyve_enable=3D"\${${_session}_enable:-${bhyve_enable}}"
		eval bhyve_tapdev=3D"\${${_session}_tapdev:-${bhyve_tapdev}}"
		eval bhyve_diskdev=3D"\${${_session}_diskdev:-${bhyve_diskdev}}"
		eval bhyve_ncpu=3D"\${${_session}_ncpu:-${bhyve_ncpu}}"
		eval bhyve_memsize=3D"\${${_session}_memsize:-${bhyve_memsize}}"
	else
		echo "$0: extra argument ignored"
	fi
else
	if [ "x${bhyve_profiles}" !=3D "x" -a "x$1" !=3D "x" ]; then
		for profile in ${bhyve_profiles}; do
			eval _enable=3D"\${bhyve_${profile}_enable}"
			case "x${_enable:-${bhyve_enable}}" in
			x|x[Nn][Oo]|x[Nn][Oo][Nn][Ee])
				continue
				;;
			x[Yy][Ee][Ss])
				;;
			*)
				if test -z "$_enable"; then
					_var=3Dbhyve_enable
				else
					_var=3Dbhyve_"${profile}"_enable
				fi
				echo "Bad value" \
				    "'${_enable:-${bhyve_enable}}'" \
				    "for ${_var}. " \
				    "Profile ${profile} skipped."
				continue
				;;
			esac
			echo "=3D=3D=3D> bhyve profile: ${profile}"
			/usr/local/etc/rc.d/bhyve $1 ${profile}
			retcode=3D"$?"
			if [ "0${retcode}" -ne 0 ]; then
				failed=3D"${profile} (${retcode}) ${failed:-}"
			else
				success=3D"${profile} ${success:-}"
			fi
		done
		exit 0
	fi
	profile=3D$name
fi

pidfile=3D"/var/run/${_session}.pid"


bhyve_prestart()
{
	case ${bhyve_diskdev} in
	[Nn][Oo][Nn][Ee] | '')
		echo "No ${_session}_diskdev set. Quitting." 1>&2
		return 1;
		;;
	esac
	if [ ! -c "${bhyve_diskdev}" -a ! -f "${bhyve_diskdev}" ]; then
		echo "${bhyve_diskdev} doesn't exist or is not suitable as a diskdev" 1>&2
		return 1;
	fi
}

bhyve_status()
{
	if ${command} has-session -t ${_session} 2>/dev/null; then
		echo "${_session} is running."
	else
		echo "${_session} is not running."
		return 1
	fi
}

bhyve_poll()
{
	echo -n "Waiting for session: ${_session}"
	while ${command} has-session -t ${_session} 2>dev/null; do
		sleep 1
	done
	echo
}

bhyve_stop()
{
	if ${command} has-session -t ${_session} 2>/dev/null; then
		echo "Stopping ${_session}."
		${command} kill-session -t ${_session}
		while ${command} has-session -t ${_session} 2>dev/null; do
			sleep 1
		done
	fi
	rm -f ${pidfile}
}

command_args=3D"new-session -ds ${_session} \"sh -c 'echo \\\$PPID >${pidfi=
le}; while true; do /usr/sbin/bhyvectl --vm=3D${_session} --destroy; /usr/s=
bin/bhyveload -m ${bhyve_memsize} -d ${bhyve_diskdev} ${_session} && /usr/s=
bin/bhyve -c ${bhyve_ncpu} -m ${bhyve_memsize} -AI -H -P -g 0 -s 0:0,hostbr=
idge -s 1:0,virtio-net,${bhyve_tapdev} -s 2:0,virtio-blk,${bhyve_diskdev} -=
S 31,uart,stdio ${_session} || break; done'\""

run_rc_command "$1"

--MP_/NuWMa/AbkZYBbIFVOW/+MvI--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20131102044857.3d5a2c85>