Debian etch

Preparing an existing installation for iSCSI

This howto is based on the following assumptions:

  • a base debian etch with all the security updates
  • the system is installed on a single partition “/” on /dev/sda1
  • there is an already done iscsi target on an iscsi server
  • there is a working dhcp server

Compile iscsistart and fwparam_ibft

Since two fundamental tools from open-iscsi are not included in the debian package, they have to be compiled from the sources with the following steps (i have used a different machine for all the compilation stuff).

Install the appropriate devel packages:

 apt-get build-dep open-iscsi
 apt-get install libdb4.3-dev

Download the sources and compile them:

 wget http://www.open-iscsi.org/bits/open-iscsi-2.0-865.13.tar.gz (this is the latest tarball at this time)
 tar xzf open-iscsi-2.0-865.13.tar.gz
 cd open-iscsi-2.0-865.13
 make -C usr
 make -C utils/fwparam_ibft

The two files needed are usr/iscsistart and utils/fwparam_ibft/fwparam_ibft so they have to be copied in /usr/sbin.

Install the needed packages

 apt-get install iproute

Disable networking scripts

The file /etc/network/interfaces must contain only the information needed to setup the loopback adapter or some additional network cards not used in the iSCSI boot process. If you have only one interface (in example eth0), be sure to have a stanza like this in /etc/network/interfaces

auto eth0
iface eth0 inet manual

So ifupdown will report the network card as “up”, otherwise some script will not work well (in exemple the nfs mount).

Create the initramfs scripts

Create two scripts shown below. These scripts have to be executable.

  • /etc/initramfs-tools/hooks/iscsi_tcp will copy the iscsi_tcp, ib_iser kernel modules followed by their dependancies, /usr/sbin/iscsistart and /usr/sbin/fwparam_ibft to the initial ramdisk.
  • /etc/initramfs-tools/scripts/local-top/iscsi_tcp is copied to the ram disk and run at boot-time, just before the root filesystem is mounted. If the root device string looks like a SCSI device it brings up the appropriate Ethernet device, sets up the ip address passed through dhcp and connects the root file system on the iSCSI target.

After you have made sure that /etc/initramfs-tools/initramfs.conf contains the line

 BUSYBOX=y

you can update the initial ramdisk:

 dpkg-reconfigure linux-image-$(uname -r)

If the modifications were applied to a physical disk on the client machine, you can now transfer the contents of your physical disk to the SAN target.

If the image you wish to export to client systems was modified directly,, you can now make the contents of that image available via iSCSI.

Hint

  • If the system hangs before the root device has been mounted, passing break=mount on the command line will spawn a shell before scripts/local-top/iscsi_tcp is run. This should allow for further debugging.

Scripts

/etc/initramfs-tools/hooks/iscsi_tcp

#!/bin/sh
 
set  -e
 
PREREQ=""
 
prereqs()
{
        echo "$PREREQ"
}
 
case $1 in
prereqs)
        prereqs
        exit 0
        ;;
esac
 
. /usr/share/initramfs-tools/hook-functions
 
[ -x /usr/sbin/iscsistart ] && copy_exec /usr/sbin/iscsistart /sbin
[ -x /usr/sbin/fwparam_ibft ] && copy_exec /usr/sbin/fwparam_ibft /sbin
[ -x /sbin/ip ] && copy_exec /sbin/ip /sbin
manual_add_modules iscsi_tcp
manual_add_modules ib_iser

/etc/initramfs-tools/scripts/local-top/iscsi_tcp

#!/bin/sh
 
set -e
 
PREREQ="udev"
 
prereqs()
{
        echo "$PREREQ"
}
 
case $1 in
prereqs)
        prereqs
        exit 0
        ;;
esac
 
case $ROOT in
/dev/sd*)
        # Evaluate IBFT parameters
        for i in $(fwparam_ibft -b); do export $i; done
 
        #Bring up the interface used to boot
        for i in $(ls /sys/class/net); do
                IFADDR=$(cat /sys/class/net/$i/address)
                if [ $IFADDR = $iSCSI_INITIATOR_HWADDR ]; then
                        echo "Using $i with MAC $IFADDR"
                        export iSCSI_INITIATOR_IF=$i
                fi
        done
 
        modprobe -q iscsi_tcp
        modprobe -q ib_iser
 
        echo "Bringing up $iSCSI_INITIATOR_IF for iSCSI..."
        ip link set $iSCSI_INITIATOR_IF up
        echo "Setting up networking on $iSCSI_INITIATOR_IF..."
        ip addr add $iSCSI_INITIATOR_IPADDR/$iSCSI_INITIATOR_MASK brd + dev $iSCSI_INITIATOR_IF
        ip route add default via $iSCSI_INITIATOR_GATEWAY
 
        echo "Connecting to iSCSI target $iSCSI_TARGET_NAME on $iSCSI_TARGET_IPADDR..."
        iscsistart -i $iSCSI_INITIATOR_NAME -t $iSCSI_TARGET_NAME -g 1 -a $iSCSI_TARGET_IPADDR
        sleep 5
        ;;
esac

Using gPXE to boot over iSCSI

Since my network cards don't support booting via iSCSI, I've used the great gPXE, loading it after a “standard” PXE request. This is called PXE Chainloading

A separate stanza containing the right root-path option should be created for each host in /etc/dhcp3/dhcpd.conf, like in the example.

host iscsi-test {
                hardware ethernet 00:0C:29:5C:53:C2;
                fixed-address 192.168.23.195;
                filename "";
                option root-path "iscsi:192.168.23.2::::iqn.2007-10.org.appliedgenomics:test.disk1";
}

QR Code
QR Code sanboot:debian_etch_iscsi (generated for current page)