On Sat, May 23, 2009 at 21:00:16 -0400, David Dillow wrote:
> Warren, Andreas, and I were discussing possible mechanisms for
> configuring NFS, NBD, iSCSI, etc going forward, and it was suggested
> that we try to document the current ways it is done, and how we may want
> to go forward.
>
For what it's worth, the attached initramfs scripts are included in the
nbd-client and open-iscsi Debian packages.
Cheers,
Julien
#!/bin/sh
# We don't have any prerequisites
case $1 in
prereqs)
exit 0
;;
esac
. /scripts/functions
log_begin_msg "Setting up nbd-client"
for x in $(cat /proc/cmdline); do
# We don't need to redo what all of what /init already did...
case $x in
nbdroot=*,*,*)
nbdroot="${x#nbdroot=}"
nbdsrv=$(echo "$nbdroot" | sed -e "s/,.*$//")
nbdport=$(echo "$nbdroot" | sed -e "s/,([^,]*),.*$/\1/")
nbdbasedev=$(echo "$nbdroot" | sed -e "s/^.*,//")
nbdrootdev=/dev/$nbdbasedev
;;
nbdroot=*,*)
nbdroot="${x#nbdroot=}"
nbdsrv=$(echo "$nbdroot" | sed -e "s/,[^,]*$//")
nbdport=$(echo "$nbdroot" | sed -e "s/^[^,]*,//")
;;
ip=*)
IPOPTS="${x#ip=}"
;;
root=/dev/nbd*)
nbdrootdev="${x#root=}"
nbdbasedev="${x#root=/dev/}"
;;
esac
done
nbdrootdev=${nbdrootdev%p*}
nbdbasedev=${nbdbasedev%p*}
if [ -z "$nbdport" -o -z "$nbdrootdev" ]
then
log_failure_msg "Insufficient information to set up nbd, quitting
(nbdsrv=$nbdsrv nbdport=$nbdport nbdroot=$nbdroot root=$nbdrootdev)"
exit 0
fi
DEVICE=eth0
configure_networking
if [ -z "$nbdsrv" ]
then
nbdsrv=${ROOTSERVER}
fi
if [ -z "$nbdsrv" ]
then
log_failure_msg "Insufficient information to set up nbd, quitting
(nbdsrv=$nbdsrv nbdport=$nbdport nbdroot=$nbdroot root=$nbdrootdev)"
exit 0
fi
/sbin/nbd-client $nbdsrv $nbdport $nbdrootdev -persist
# This should be removed once the cfq scheduler no longer deadlocks nbd
# devices
if grep '\[cfq\]' /sys/block/$nbdbasedev/queue/scheduler >/dev/null
then
echo deadline > /sys/block/$nbdbasedev/queue/scheduler
fi
#!/bin/sh
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case $1 in
# get pre-requisites
prereqs)
prereqs
exit 0
;;
esac
do_iscsi_login ()
{
# Bring in the main config
. /conf/initramfs.conf
for conf in conf/conf.d/*; do
[ -f ${conf} ] && . ${conf}
done
. /scripts/functions
configure_networking
modprobe iscsi_tcp
modprobe crc32c
if [ -z $ISCSI_INITIATOR ]; then
. /etc/initiatorname.iscsi
ISCSI_INITIATOR=$InitiatorName
fi
if [ -z $ISCSI_TARGET_PORT ]; then
ISCSI_TARGET_PORT=3260
fi
if [ -z $ISCSI_TARGET_GROUP ]; then
ISCSI_TARGET_GROUP=1
fi
iscsistart -i $ISCSI_INITIATOR -t $ISCSI_TARGET_NAME \
-g $ISCSI_TARGET_GROUP -a $ISCSI_TARGET_IP \
-p $ISCSI_TARGET_PORT $ISCSI_USERNAME \
$ISCSI_PASSWORD $ISCSI_IN_USERNAME $ISCSI_IN_PASSWORD
}
parse_iscsi_ops ()
{
. /etc/iscsi.initramfs
for x in $(cat /proc/cmdline); do
case ${x} in
iscsi_initiator=*)
ISCSI_INITIATOR="${x#iscsi_initiator=}"
;;
iscsi_target_name=*)
ISCSI_TARGET_NAME="${x#iscsi_target_name=}"
;;
iscsi_target_ip=*)
ISCSI_TARGET_IP="${x#iscsi_target_ip=}"
;;
iscsi_target_port=*)
ISCSI_TARGET_PORT="${x#iscsi_target_port=}"
;;
iscsi_target_group=*)
ISCSI_TARGET_GROUP="${x#iscsi_target_group=}"
;;
iscsi_username=*)
ISCSI_USERNAME="-u ${x#iscsi_username=}"
;;
iscsi_password=*)
ISCSI_PASSWORD="-w ${x#iscsi_password=}"
;;
iscsi_in_username=*)
ISCSI_IN_USERNAME="-U ${x#iscsi_in_username=}"
;;
iscsi_in_password=*)
ISCSI_IN_PASSWORD="-W ${x#iscsi_in_password=}"
;;
esac
done
}
if [ ! -x /sbin/iscsistart ]; then
exit 0
fi
parse_iscsi_ops
if [ -z $ISCSI_TARGET_NAME ] || [ -z $ISCSI_TARGET_IP ]; then
exit 0
fi
do_iscsi_login
exit 0