1#!/bin/sh 2 3# PROVIDE: vkernel 4# REQUIRE: LOGIN 5 6. /etc/rc.subr 7 8name="vkernel" 9rcvar=`set_rcvar` 10 11start_cmd="vkernel_start" 12stop_cmd="vkernel_stop" 13 14vkernel_start() 15{ 16 echo -n 'Starting virtual kernels:' 17 for _vkernel in ${vkernel_list} 18 do 19 # Start with a clean set of variables 20 unset pidfile bin memsize rootimgs ifaces logfile flags 21 unset vkuser vkgroup memimg 22 23 # Configure user to run vkernel 24 eval vkuser=\"\${vkernel_${_vkernel}_user}\" 25 if [ -z "${vkuser}" ]; then 26 vkuser="root" 27 vkgroup="wheel" 28 else 29 vkgroup=$(id -ng ${vkuser}) 30 fi 31 32 # Check if already running 33 eval pidfile="/var/run/vkernel.${_vkernel}.pid" 34 if [ -f "${pidfile}" ]; then 35 eval pid=`cat ${pidfile}` 36 if [ ! -z "${pid}" -a ! -z "`ps axwwp ${pid} | grep -wE "^[ ]*${pid}" | grep -v grep | awk '{print $1}'`" ]; then 37 echo 38 warn "vkernel ${_vkernel} already running? (check ${pidfile})" 39 continue 40 fi 41 else 42 # Regular users do not have write access in /var/run 43 install -c -o ${vkuser} -g ${vkgroup} /dev/null ${pidfile} 44 fi 45 46 # Configure vkernel binary 47 eval _bin=\"\${vkernel_${_vkernel}_bin}\" 48 if [ -z "${_bin}" -o ! -x "${_bin}" ]; then 49 eval _bin=\"\${vkernel_bin}\" 50 if [ -z "${_bin}" -o ! -x "${_bin}" ]; then 51 echo 52 warn "Missing or undefined binary for vkernel '${_vkernel}'. Skipping." 53 continue 54 fi 55 fi 56 bin=${_bin} 57 58 # Configure vkernel memory 59 eval _memsize=\"\$vkernel_${_vkernel}_memsize\" 60 if [ -z "${_memsize}" ]; then 61 echo 62 warn "No memsize has been defined for vkernel '${_vkernel}'. Skipping." 63 continue 64 else 65 memsize="-m ${_memsize}" 66 fi 67 68 # Configure vkernel memory image file 69 eval _memimg=\"\${vkernel_${_vkernel}_memimg}\" 70 if [ -z "${_memimg}" ]; then 71 mkdir -m 1777 -p /var/vkernel 72 73 for n in $(seq 0 999999) 74 do 75 eval _memf=$(printf "/var/vkernel/memimg.%06s" ${n}) 76 if [ ! -f "${_memf}" ] 77 then 78 memimg=" -i ${_memf}" 79 break 80 else 81 if lockf -kst 0 ${_memf} echo >/dev/null 82 then 83 # Test if memimg is writable by vkuser 84 su - ${vkuser} -c "test -w ${_memf}" 85 if [ $? -eq 0 ] 86 then 87 memimg="-i ${_memf}" 88 break 89 fi 90 fi 91 fi 92 done 93 else 94 memimg="-i ${_memimg}" 95 fi 96 97 # Configure vkernel root image(s) 98 eval _rootimgs=\"\${vkernel_${_vkernel}_rootimg_list}\" 99 if [ -z "${_rootimgs}" ]; then 100 echo 101 warn "No root image has been defined for vkernel '${_vkernel}'." 102 else 103 for _rootimg in ${_rootimgs} 104 do 105 eval rootimgs=\"${rootimgs} -r ${_rootimg}\" 106 done 107 fi 108 109 # Configure optional vkernel network interface(s) 110 eval _ifaces=\"\${vkernel_${_vkernel}_iface_list}\" 111 if [ -n "${_ifaces}" ]; then 112 for _iface in ${_ifaces} 113 do 114 eval ifaces=\"${ifaces} -I ${_iface}\" 115 done 116 fi 117 118 # Configure optional console logfile 119 eval logfile=\"\${vkernel_${_vkernel}_logfile}\" 120 [ -z "${logfile}" ] && logfile="/dev/null" 121 122 # Configure optional flags 123 eval flags=\"\${vkernel_${_vkernel}_flags}\" 124 125 eval "daemon -u ${vkuser} ${bin} ${memsize} ${rootimgs} " \ 126 "${memimg} ${ifaces} ${flags} -p ${pidfile}" \ 127 ">>${logfile} 2>&1 </dev/null" 128 echo -n " ${_vkernel}" 129 done 130 echo '.' 131} 132 133vkernel_stop() 134{ 135 for _vkernel in ${vkernel_list} 136 do 137 eval pidfile="/var/run/vkernel.${_vkernel}.pid" 138 if [ -f "${pidfile}" ]; then 139 eval pid=`cat ${pidfile}` 140 fi 141 if [ -z "${pid}" ]; then 142 warn "vkernel '${_vkernel}' not running?" 143 continue 144 fi 145 eval kill -TERM ${pid} 146 147 eval _kill_timeout=\"\${vkernel_${_vkernel}_kill_timeout}\" 148 if [ -z "${_kill_timeout}" ]; then 149 eval _kill_timeout=\"\${vkernel_kill_timeout}\" 150 if [ -z "${_kill_timeout}" ]; then 151 _kill_timeout=60 152 fi 153 fi 154 155 # Check that the vkernel ended properly 156 cnt=1 157 eval temp_pid=`ps axwwp ${pid} | grep -wE "^[ ]*${pid}" | grep -v grep | awk '{print $1}'` 158 while [ ! -z "${temp_pid}" -a "${cnt}" -lt "${_kill_timeout}" ]; do 159 eval temp_pid=`ps axwwp ${pid} | grep -wE "^[ ]*${pid}" | grep -v grep | awk '{print $1}'` 160 cnt=`expr $cnt + 1` 161 sleep 1 162 done 163 164 if [ ! -z "${temp_pid}" ]; then 165 eval kill -KILL ${pid} 166 warn "'${_vkernel}' had to be forcefully killed." 167 fi 168 done 169} 170 171load_rc_config $name 172run_rc_command "$1" 173