running iscontrol at boot time
Daniel Braniss
danny at cs.huji.ac.il
Tue May 7 07:55:32 UTC 2013
> How to configure FreeBSD so that iscontrol runs at boot time, so that an
> iSCSI initiator will mount a filesystem on an iSCSI target?
>
> In this case the FreeBSD system is an iSCSI initiator. The
> /boot/loader.conf file has 'iscsi_initiator_load="YES"' but iscontrol
> does not run at boot time.
>
> I believe iscontrol needs to run after the kernel module is loaded but
> before a filesystem in /etc/fstab is mounted.
>
> This works fine manually, but a reboot fails because the FreeBSD box
> doesn't run iscontrol at boot time, and thus can't mount the filesystem
> on the iSCSI target.
>
> Pardon me if this has been asked before, as it seems like a standard
> problem, but I couldn't find anything in recent archives or in the man
> pages.
>
> The initiator runs a generic FreeBSD 8.3-RELEASE/amd64 kernel.
>
> Thanks!
>
> dn
This is a script that was lst tested in 2009, but should work :-)
also, should be renamed iscsi_initiator.
#!/bin/sh
# PROVIDE: iscsi
# REQUIRE: NETWORKING
# BEFORE: DAEMON
# KEYWORD: nojail shutdown
#
# Add the following lines to /etc/rc.conf to enable iscsi:
#
# iscsi_enable="YES"
# iscsi_fstab="/etc/fstab.iscsi"
. /etc/rc.subr
. /cs/share/etc/rc.subr
name=iscsi
rcvar=`set_rcvar`
command=/sbin/iscontrol
iscsi_enable=${iscsi_enable:-"NO"}
iscsi_fstab=${iscsi_fstab:-"/etc/fstab.iscsi"}
iscsi_exports=${iscsi_exports:-"/etc/exports.iscsi"}
iscsi_debug=${iscsi_debug:-0}
start_cmd="iscsi_start"
faststop_cmp="iscsi_stop"
stop_cmd="iscsi_stop"
start_precmd="iscontrol_precmd"
iscontrol_prog=${iscontrol_prog:-"iscontrol"}
iscontrol_log=${iscontrol_log:-"/var/log/$iscontrol_prog"}
iscontrol_syslog=${iscontrol_syslog:-"644 3 100 * JC"}
iscontrol_precmd()
{
setup_syslog "$iscontrol_prog" "$iscontrol_log" "$iscontrol_syslog"
}
iscsi_wait()
{
dev=$1
trap "echo 'wait loop cancelled'; exit 1" 2
count=0
while true; do
if [ -c $dev ]; then
break;
fi
if [ $count -eq 0 ]; then
echo -n Waiting for ${dev}': '
fi
count=$((${count} + 1))
if [ $count -eq 6 ]; then
echo " Failed for dev=$dev"
return 0
break
fi
echo -n '.'
sleep 5;
done
echo "$dev ok."
return 1
}
iscsi_start()
{
local file type opt t1 t2
#
# load needed modules
for m in iscsi_initiator geom_label; do
kldstat -qm $m || kldload $m
done
sysctl debug.iscsi_initiator=$iscsi_debug
#
# start iscontrol for each target
if [ -n "${iscsi_targets}" ]; then
for target in ${iscsi_targets}; do
${command} ${rc_flags} -n ${target}
done
fi
if [ -f "${iscsi_fstab}" ]; then
while read spec file type opt t1 t2
do
case ${spec} in
\#*|'')
;;
*)
if iscsi_wait ${spec}; then
break;
fi
echo type=$type spec=$spec file=$file
fsck -p ${spec} && mkdir -p ${file} && mount ${spec} ${file}
chmod 755 ${file}
;;
esac
done < ${iscsi_fstab}
fi
if [ -f "${iscsi_exports}" ]; then
cat ${iscsi_exports} >> /etc/exports
#/etc/rc.d/mountd reload
kill -1 `cat /var/run/mountd.pid`
fi
if checkyesno zfs_enable; then
if checkyesno iscsi_zfs; then
sleep 4
zpool import -d /dev/label -a
# presumably we can ignore zfs mount -a share -a and swapon
# some zfs dataset may be exported "legacy", so hup mountd
kill -1 `cat /var/run/mountd.pid`
fi
fi
}
iscsi_stop()
{
echo 'iscsi stopping'
while read spec file type opt t1 t2
do
case ${spec} in
\#*|'')
;;
*)
echo iscsi: umount $spec
umount -fv $spec
;;
esac
done < ${iscsi_fstab}
}
load_rc_config $name
run_rc_command "$1"
More information about the freebsd-scsi
mailing list