12feb07f7SSascha Wildner#!/bin/sh 22feb07f7SSascha Wildner 32feb07f7SSascha Wildner# PROVIDE: vkernel 4*ce083385SAaron LI# REQUIRE: LOGIN 52feb07f7SSascha Wildner 62feb07f7SSascha Wildner. /etc/rc.subr 72feb07f7SSascha Wildner 82feb07f7SSascha Wildnername="vkernel" 92feb07f7SSascha Wildnerrcvar=`set_rcvar` 1032733d8dSAntonio Huete Jimenez 112feb07f7SSascha Wildnerstart_cmd="vkernel_start" 122feb07f7SSascha Wildnerstop_cmd="vkernel_stop" 132feb07f7SSascha Wildner 142feb07f7SSascha Wildnervkernel_start() 152feb07f7SSascha Wildner{ 162feb07f7SSascha Wildner echo -n 'Starting virtual kernels:' 172feb07f7SSascha Wildner for _vkernel in ${vkernel_list} 182feb07f7SSascha Wildner do 192b1d5679SAntonio Huete Jimenez # Start with a clean set of variables 204ade232dSAntonio Huete Jimenez unset pidfile bin memsize rootimgs ifaces logfile flags 214ade232dSAntonio Huete Jimenez unset vkuser vkgroup memimg 2232733d8dSAntonio Huete Jimenez 2332733d8dSAntonio Huete Jimenez # Configure user to run vkernel 2432733d8dSAntonio Huete Jimenez eval vkuser=\"\${vkernel_${_vkernel}_user}\" 2532733d8dSAntonio Huete Jimenez if [ -z "${vkuser}" ]; then 2632733d8dSAntonio Huete Jimenez vkuser="root" 2732733d8dSAntonio Huete Jimenez vkgroup="wheel" 2832733d8dSAntonio Huete Jimenez else 2932733d8dSAntonio Huete Jimenez vkgroup=$(id -ng ${vkuser}) 3032733d8dSAntonio Huete Jimenez fi 31e9597feaSAntonio Huete Jimenez 322feb07f7SSascha Wildner # Check if already running 332feb07f7SSascha Wildner eval pidfile="/var/run/vkernel.${_vkernel}.pid" 34db511d28SRumko if [ -f "${pidfile}" ]; then 35db511d28SRumko eval pid=`cat ${pidfile}` 36ef42da70SSascha Wildner if [ ! -z "${pid}" -a ! -z "`ps axwwp ${pid} | grep -wE "^[ ]*${pid}" | grep -v grep | awk '{print $1}'`" ]; then 372feb07f7SSascha Wildner echo 382b1d5679SAntonio Huete Jimenez warn "vkernel ${_vkernel} already running? (check ${pidfile})" 392feb07f7SSascha Wildner continue 402feb07f7SSascha Wildner fi 4132733d8dSAntonio Huete Jimenez else 4232733d8dSAntonio Huete Jimenez # Regular users do not have write access in /var/run 4332733d8dSAntonio Huete Jimenez install -c -o ${vkuser} -g ${vkgroup} /dev/null ${pidfile} 44db511d28SRumko fi 452feb07f7SSascha Wildner 462feb07f7SSascha Wildner # Configure vkernel binary 472feb07f7SSascha Wildner eval _bin=\"\${vkernel_${_vkernel}_bin}\" 482feb07f7SSascha Wildner if [ -z "${_bin}" -o ! -x "${_bin}" ]; then 492214b591SRumko eval _bin=\"\${vkernel_bin}\" 502214b591SRumko if [ -z "${_bin}" -o ! -x "${_bin}" ]; then 512feb07f7SSascha Wildner echo 522feb07f7SSascha Wildner warn "Missing or undefined binary for vkernel '${_vkernel}'. Skipping." 532feb07f7SSascha Wildner continue 542feb07f7SSascha Wildner fi 552214b591SRumko fi 562214b591SRumko bin=${_bin} 572feb07f7SSascha Wildner 582feb07f7SSascha Wildner # Configure vkernel memory 592feb07f7SSascha Wildner eval _memsize=\"\$vkernel_${_vkernel}_memsize\" 602feb07f7SSascha Wildner if [ -z "${_memsize}" ]; then 612feb07f7SSascha Wildner echo 622feb07f7SSascha Wildner warn "No memsize has been defined for vkernel '${_vkernel}'. Skipping." 632feb07f7SSascha Wildner continue 642feb07f7SSascha Wildner else 652feb07f7SSascha Wildner memsize="-m ${_memsize}" 662feb07f7SSascha Wildner fi 672feb07f7SSascha Wildner 684ade232dSAntonio Huete Jimenez # Configure vkernel memory image file 694ade232dSAntonio Huete Jimenez eval _memimg=\"\${vkernel_${_vkernel}_memimg}\" 704ade232dSAntonio Huete Jimenez if [ -z "${_memimg}" ]; then 714ade232dSAntonio Huete Jimenez mkdir -m 1777 -p /var/vkernel 724ade232dSAntonio Huete Jimenez 734ade232dSAntonio Huete Jimenez for n in $(seq 0 999999) 744ade232dSAntonio Huete Jimenez do 754ade232dSAntonio Huete Jimenez eval _memf=$(printf "/var/vkernel/memimg.%06s" ${n}) 764ade232dSAntonio Huete Jimenez if [ ! -f "${_memf}" ] 774ade232dSAntonio Huete Jimenez then 784ade232dSAntonio Huete Jimenez memimg=" -i ${_memf}" 794ade232dSAntonio Huete Jimenez break 804ade232dSAntonio Huete Jimenez else 814ade232dSAntonio Huete Jimenez if lockf -kst 0 ${_memf} echo >/dev/null 824ade232dSAntonio Huete Jimenez then 834ade232dSAntonio Huete Jimenez # Test if memimg is writable by vkuser 844ade232dSAntonio Huete Jimenez su - ${vkuser} -c "test -w ${_memf}" 854ade232dSAntonio Huete Jimenez if [ $? -eq 0 ] 864ade232dSAntonio Huete Jimenez then 874ade232dSAntonio Huete Jimenez memimg="-i ${_memf}" 884ade232dSAntonio Huete Jimenez break 894ade232dSAntonio Huete Jimenez fi 904ade232dSAntonio Huete Jimenez fi 914ade232dSAntonio Huete Jimenez fi 924ade232dSAntonio Huete Jimenez done 934ade232dSAntonio Huete Jimenez else 944ade232dSAntonio Huete Jimenez memimg="-i ${_memimg}" 954ade232dSAntonio Huete Jimenez fi 964ade232dSAntonio Huete Jimenez 972feb07f7SSascha Wildner # Configure vkernel root image(s) 982feb07f7SSascha Wildner eval _rootimgs=\"\${vkernel_${_vkernel}_rootimg_list}\" 992feb07f7SSascha Wildner if [ -z "${_rootimgs}" ]; then 1002feb07f7SSascha Wildner echo 1012214b591SRumko warn "No root image has been defined for vkernel '${_vkernel}'." 1022feb07f7SSascha Wildner else 1032feb07f7SSascha Wildner for _rootimg in ${_rootimgs} 1042feb07f7SSascha Wildner do 1052feb07f7SSascha Wildner eval rootimgs=\"${rootimgs} -r ${_rootimg}\" 1062feb07f7SSascha Wildner done 1072feb07f7SSascha Wildner fi 1082feb07f7SSascha Wildner 1092feb07f7SSascha Wildner # Configure optional vkernel network interface(s) 1102feb07f7SSascha Wildner eval _ifaces=\"\${vkernel_${_vkernel}_iface_list}\" 1112feb07f7SSascha Wildner if [ -n "${_ifaces}" ]; then 1122feb07f7SSascha Wildner for _iface in ${_ifaces} 1132feb07f7SSascha Wildner do 1142feb07f7SSascha Wildner eval ifaces=\"${ifaces} -I ${_iface}\" 1152feb07f7SSascha Wildner done 1162feb07f7SSascha Wildner fi 1172feb07f7SSascha Wildner 1182feb07f7SSascha Wildner # Configure optional console logfile 1192feb07f7SSascha Wildner eval logfile=\"\${vkernel_${_vkernel}_logfile}\" 1202feb07f7SSascha Wildner [ -z "${logfile}" ] && logfile="/dev/null" 1212feb07f7SSascha Wildner 1222feb07f7SSascha Wildner # Configure optional flags 1232feb07f7SSascha Wildner eval flags=\"\${vkernel_${_vkernel}_flags}\" 1242feb07f7SSascha Wildner 1254ade232dSAntonio Huete Jimenez eval "daemon -u ${vkuser} ${bin} ${memsize} ${rootimgs} " \ 1264ade232dSAntonio Huete Jimenez "${memimg} ${ifaces} ${flags} -p ${pidfile}" \ 1274ade232dSAntonio Huete Jimenez ">>${logfile} 2>&1 </dev/null" 1282feb07f7SSascha Wildner echo -n " ${_vkernel}" 1292feb07f7SSascha Wildner done 1302feb07f7SSascha Wildner echo '.' 1312feb07f7SSascha Wildner} 1322feb07f7SSascha Wildner 1332feb07f7SSascha Wildnervkernel_stop() 1342feb07f7SSascha Wildner{ 1352feb07f7SSascha Wildner for _vkernel in ${vkernel_list} 1362feb07f7SSascha Wildner do 1372feb07f7SSascha Wildner eval pidfile="/var/run/vkernel.${_vkernel}.pid" 1382feb07f7SSascha Wildner if [ -f "${pidfile}" ]; then 1392feb07f7SSascha Wildner eval pid=`cat ${pidfile}` 1402feb07f7SSascha Wildner fi 1412feb07f7SSascha Wildner if [ -z "${pid}" ]; then 1422feb07f7SSascha Wildner warn "vkernel '${_vkernel}' not running?" 1437c53feedSRumko continue 1447c53feedSRumko fi 1452feb07f7SSascha Wildner eval kill -TERM ${pid} 1467c53feedSRumko 1477c53feedSRumko eval _kill_timeout=\"\${vkernel_${_vkernel}_kill_timeout}\" 1487c53feedSRumko if [ -z "${_kill_timeout}" ]; then 1497c53feedSRumko eval _kill_timeout=\"\${vkernel_kill_timeout}\" 1507c53feedSRumko if [ -z "${_kill_timeout}" ]; then 1517c53feedSRumko _kill_timeout=60 1527c53feedSRumko fi 1537c53feedSRumko fi 1547c53feedSRumko 1557c53feedSRumko # Check that the vkernel ended properly 1567c53feedSRumko cnt=1 157ef42da70SSascha Wildner eval temp_pid=`ps axwwp ${pid} | grep -wE "^[ ]*${pid}" | grep -v grep | awk '{print $1}'` 1587c53feedSRumko while [ ! -z "${temp_pid}" -a "${cnt}" -lt "${_kill_timeout}" ]; do 159ef42da70SSascha Wildner eval temp_pid=`ps axwwp ${pid} | grep -wE "^[ ]*${pid}" | grep -v grep | awk '{print $1}'` 1607c53feedSRumko cnt=`expr $cnt + 1` 1617c53feedSRumko sleep 1 1627c53feedSRumko done 1637c53feedSRumko 1647c53feedSRumko if [ ! -z "${temp_pid}" ]; then 1657c53feedSRumko eval kill -KILL ${pid} 1667c53feedSRumko warn "'${_vkernel}' had to be forcefully killed." 1672feb07f7SSascha Wildner fi 1682feb07f7SSascha Wildner done 1692feb07f7SSascha Wildner} 1702feb07f7SSascha Wildner 1712feb07f7SSascha Wildnerload_rc_config $name 1722feb07f7SSascha Wildnerrun_rc_command "$1" 173